@sunbird-cb/toc 0.0.8 → 0.0.9
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.
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -120
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -92
- package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
- package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
- package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
- package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
- package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
- package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -941
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
- package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +248 -225
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1148 -1030
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
- package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
- package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
- package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
- package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
- package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
- package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -847
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -219
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -209
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
- package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
- package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
- package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
- package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
- package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
- package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
- package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
- package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -112
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
- package/esm2022/lib/_collection-api.mjs +57 -57
- package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
- package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
- package/esm2022/lib/_models/common.model.mjs +2 -2
- package/esm2022/lib/_models/error.model.mjs +2 -2
- package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
- package/esm2022/lib/_services/rating.service.mjs +89 -89
- package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
- package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
- package/esm2022/lib/_services/widget-content.model.mjs +247 -247
- package/esm2022/lib/_services/widget-content.service.mjs +594 -594
- package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
- package/esm2022/lib/app-toc-lib.module.mjs +499 -499
- package/esm2022/lib/collection.config.mjs +161 -161
- package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
- package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -475
- package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
- package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
- package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
- package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -2229
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2907 -2905
- package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
- package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
- package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
- package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
- package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
- package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
- package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
- package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -1838
- package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
- package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
- package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
- package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -256
- package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
- package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
- package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
- package/esm2022/lib/models/app-toc.model.mjs +38 -38
- package/esm2022/lib/models/auto-complete.model.mjs +2 -2
- package/esm2022/lib/models/card-content.model.mjs +13 -13
- package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
- package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
- package/esm2022/lib/models/goal.model.mjs +2 -2
- package/esm2022/lib/models/meta-tag.model.mjs +8 -8
- package/esm2022/lib/models/playlist.model.mjs +2 -2
- package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
- package/esm2022/lib/models/rating.model.mjs +2 -2
- package/esm2022/lib/models/user-profile.model.mjs +21 -21
- package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
- package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
- package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
- package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
- package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
- package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
- package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
- package/esm2022/lib/services/access-control.service.mjs +56 -56
- package/esm2022/lib/services/action.service.mjs +23 -23
- package/esm2022/lib/services/app-toc-v2.service.mjs +313 -243
- package/esm2022/lib/services/app-toc.service.mjs +1613 -1387
- package/esm2022/lib/services/certificate.service.mjs +69 -69
- package/esm2022/lib/services/discuss-utils.service.mjs +58 -58
- package/esm2022/lib/services/editor.service.mjs +34 -34
- package/esm2022/lib/services/load-check.service.mjs +21 -21
- package/esm2022/lib/services/loader.service.mjs +33 -33
- package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
- package/esm2022/lib/services/netcore.service.mjs +56 -56
- package/esm2022/lib/services/nps-grid.service.mjs +31 -31
- package/esm2022/lib/services/otp.service.mjs +43 -43
- package/esm2022/lib/services/profile-v2.service.mjs +43 -43
- package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
- package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
- package/esm2022/lib/services/timer.service.mjs +23 -23
- package/esm2022/lib/services/title-tag.service.mjs +71 -71
- package/esm2022/lib/services/user-profile.service.mjs +55 -55
- package/esm2022/lib/services/viewer-data.service.mjs +64 -64
- package/esm2022/lib/services/viewer-util.service.mjs +590 -590
- package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
- package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
- package/esm2022/public-api.mjs +71 -71
- package/esm2022/sunbird-cb-toc.mjs +4 -4
- package/fesm2022/sunbird-cb-toc.mjs +24776 -24339
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +5 -6
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -17
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -32
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -16
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -21
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -23
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -16
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +22 -23
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +22 -23
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -10
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -12
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -13
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -19
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -15
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -12
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -18
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -15
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -200
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -17
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -11
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -39
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -20
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -12
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +183 -184
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -42
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -55
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -48
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -49
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +171 -155
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -9
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -17
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -41
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -22
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -46
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -11
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -11
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +128 -129
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +51 -52
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -30
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -10
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -8
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -8
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -29
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -25
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -15
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -10
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -13
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -11
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -23
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -9
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -19
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -9
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -16
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -36
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -20
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -15
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -14
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -12
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -12
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -16
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -11
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -17
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -12
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -35
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -18
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -16
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -16
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -22
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -13
- package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -22
- package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -10
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -48
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -15
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -23
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -20
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -16
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -26
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -22
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -19
- package/lib/_collection-api.d.ts +34 -35
- package/lib/_constants/widget-content.constants.d.ts +7 -8
- package/lib/_directives/tooltip.directive.d.ts +17 -18
- package/lib/_models/common.model.d.ts +3 -4
- package/lib/_models/error.model.d.ts +5 -6
- package/lib/_pipes/highlight.pipe.d.ts +10 -11
- package/lib/_services/rating.service.d.ts +18 -19
- package/lib/_services/samuhik-charcha.service.d.ts +13 -14
- package/lib/_services/viewer-route-util.d.ts +8 -9
- package/lib/_services/widget-content.model.d.ts +515 -516
- package/lib/_services/widget-content.service.d.ts +101 -102
- package/lib/_shared/translate-loader.factory.d.ts +7 -8
- package/lib/app-toc-lib.module.d.ts +88 -89
- package/lib/collection.config.d.ts +159 -160
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -18
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -226
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +78 -79
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -23
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -32
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -48
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -15
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -22
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +314 -315
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +408 -409
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -48
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -23
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -15
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -150
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -43
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -28
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -16
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -196
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -45
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -55
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -19
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +43 -44
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -21
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -14
- package/lib/models/app-toc-analytics.model.d.ts +152 -153
- package/lib/models/app-toc.model.d.ts +84 -85
- package/lib/models/auto-complete.model.d.ts +27 -28
- package/lib/models/card-content.model.d.ts +19 -20
- package/lib/models/content-strip-with-tabs.model.d.ts +44 -45
- package/lib/models/discussion-forum.model.d.ts +40 -41
- package/lib/models/goal.model.d.ts +22 -23
- package/lib/models/meta-tag.model.d.ts +6 -7
- package/lib/models/playlist.model.d.ts +23 -24
- package/lib/models/profile-revamp.model.d.ts +14 -15
- package/lib/models/rating.model.d.ts +17 -18
- package/lib/models/user-profile.model.d.ts +37 -38
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -13
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -13
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -17
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -13
- package/lib/resolvers/app-toc-resolver.service.d.ts +16 -17
- package/lib/resolvers/config-resolver.service.d.ts +11 -12
- package/lib/resolvers/profile-resolver.service.d.ts +11 -12
- package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -12
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -20
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -9
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -9
- package/lib/services/access-control.service.d.ts +29 -30
- package/lib/services/action.service.d.ts +9 -10
- package/lib/services/app-toc-v2.service.d.ts +16 -15
- package/lib/services/app-toc.service.d.ts +235 -178
- package/lib/services/certificate.service.d.ts +42 -43
- package/lib/services/discuss-utils.service.d.ts +33 -34
- package/lib/services/editor.service.d.ts +17 -18
- package/lib/services/load-check.service.d.ts +8 -9
- package/lib/services/loader.service.d.ts +16 -17
- package/lib/services/mobile-apps.service.d.ts +38 -39
- package/lib/services/netcore.service.d.ts +33 -34
- package/lib/services/nps-grid.service.d.ts +15 -16
- package/lib/services/otp.service.d.ts +20 -21
- package/lib/services/profile-v2.service.d.ts +20 -21
- package/lib/services/reset-ratings.service.d.ts +8 -9
- package/lib/services/resource-download-helper.service.d.ts +29 -30
- package/lib/services/timer.service.d.ts +9 -10
- package/lib/services/title-tag.service.d.ts +21 -22
- package/lib/services/user-profile.service.d.ts +24 -25
- package/lib/services/viewer-data.service.d.ts +58 -59
- package/lib/services/viewer-util.service.d.ts +76 -77
- package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -57
- package/lib/share-toc/share-toc.module.d.ts +32 -33
- package/package.json +1 -1
- package/public-api.d.ts +56 -57
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +0 -1
- package/lib/_collection-api.d.ts.map +0 -1
- package/lib/_constants/widget-content.constants.d.ts.map +0 -1
- package/lib/_directives/tooltip.directive.d.ts.map +0 -1
- package/lib/_models/common.model.d.ts.map +0 -1
- package/lib/_models/error.model.d.ts.map +0 -1
- package/lib/_pipes/highlight.pipe.d.ts.map +0 -1
- package/lib/_services/rating.service.d.ts.map +0 -1
- package/lib/_services/samuhik-charcha.service.d.ts.map +0 -1
- package/lib/_services/viewer-route-util.d.ts.map +0 -1
- package/lib/_services/widget-content.model.d.ts.map +0 -1
- package/lib/_services/widget-content.service.d.ts.map +0 -1
- package/lib/_shared/translate-loader.factory.d.ts.map +0 -1
- package/lib/app-toc-lib.module.d.ts.map +0 -1
- package/lib/collection.config.d.ts.map +0 -1
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +0 -1
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +0 -1
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +0 -1
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +0 -1
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +0 -1
- package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +0 -1
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +0 -1
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +0 -1
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +0 -1
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +0 -1
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +0 -1
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +0 -1
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +0 -1
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +0 -1
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +0 -1
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +0 -1
- package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +0 -1
- package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +0 -1
- package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +0 -1
- package/lib/models/app-toc-analytics.model.d.ts.map +0 -1
- package/lib/models/app-toc.model.d.ts.map +0 -1
- package/lib/models/auto-complete.model.d.ts.map +0 -1
- package/lib/models/card-content.model.d.ts.map +0 -1
- package/lib/models/content-strip-with-tabs.model.d.ts.map +0 -1
- package/lib/models/discussion-forum.model.d.ts.map +0 -1
- package/lib/models/goal.model.d.ts.map +0 -1
- package/lib/models/meta-tag.model.d.ts.map +0 -1
- package/lib/models/playlist.model.d.ts.map +0 -1
- package/lib/models/profile-revamp.model.d.ts.map +0 -1
- package/lib/models/rating.model.d.ts.map +0 -1
- package/lib/models/user-profile.model.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/config-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/profile-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/restricted-features-resolver.service.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +0 -1
- package/lib/services/access-control.service.d.ts.map +0 -1
- package/lib/services/action.service.d.ts.map +0 -1
- package/lib/services/app-toc-v2.service.d.ts.map +0 -1
- package/lib/services/app-toc.service.d.ts.map +0 -1
- package/lib/services/certificate.service.d.ts.map +0 -1
- package/lib/services/discuss-utils.service.d.ts.map +0 -1
- package/lib/services/editor.service.d.ts.map +0 -1
- package/lib/services/load-check.service.d.ts.map +0 -1
- package/lib/services/loader.service.d.ts.map +0 -1
- package/lib/services/mobile-apps.service.d.ts.map +0 -1
- package/lib/services/netcore.service.d.ts.map +0 -1
- package/lib/services/nps-grid.service.d.ts.map +0 -1
- package/lib/services/otp.service.d.ts.map +0 -1
- package/lib/services/profile-v2.service.d.ts.map +0 -1
- package/lib/services/reset-ratings.service.d.ts.map +0 -1
- package/lib/services/resource-download-helper.service.d.ts.map +0 -1
- package/lib/services/timer.service.d.ts.map +0 -1
- package/lib/services/title-tag.service.d.ts.map +0 -1
- package/lib/services/user-profile.service.d.ts.map +0 -1
- package/lib/services/viewer-data.service.d.ts.map +0 -1
- package/lib/services/viewer-util.service.d.ts.map +0 -1
- package/lib/share-toc/share-toc/share-toc.component.d.ts.map +0 -1
- package/lib/share-toc/share-toc.module.d.ts.map +0 -1
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-toc.d.ts.map +0 -1
package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs
CHANGED
|
@@ -1,941 +1,941 @@
|
|
|
1
|
-
import { Component, Input, ViewChild, Output, EventEmitter, Inject } from '@angular/core';
|
|
2
|
-
import { Subject } from 'rxjs';
|
|
3
|
-
import { takeUntil } from 'rxjs/operators';
|
|
4
|
-
// tslint:disable-next-line
|
|
5
|
-
import * as _ from 'lodash';
|
|
6
|
-
import dayjs from 'dayjs';
|
|
7
|
-
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
|
|
8
|
-
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
|
|
9
|
-
import { NsContent } from '../../../../_services/widget-content.model';
|
|
10
|
-
import { ReviewsContentComponent } from '../reviews-content/reviews-content.component';
|
|
11
|
-
import { CertificateDialogComponent } from '../../certificate-dialog/certificate-dialog.component';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "../../../../_services/rating.service";
|
|
14
|
-
import * as i2 from "@sunbird-cb/utils-v2";
|
|
15
|
-
import * as i3 from "@angular/material/legacy-dialog";
|
|
16
|
-
import * as i4 from "@angular/material/legacy-snack-bar";
|
|
17
|
-
import * as i5 from "../../../../services/load-check.service";
|
|
18
|
-
import * as i6 from "../../../../services/timer.service";
|
|
19
|
-
import * as i7 from "../../../../services/app-toc.service";
|
|
20
|
-
import * as i8 from "../../../../services/discuss-utils.service";
|
|
21
|
-
import * as i9 from "@angular/router";
|
|
22
|
-
import * as i10 from "../content-services/review-component-data.service";
|
|
23
|
-
import * as i11 from "../content-services/handle-claim.service";
|
|
24
|
-
import * as i12 from "../../../../services/reset-ratings.service";
|
|
25
|
-
import * as i13 from "@angular/common";
|
|
26
|
-
import * as i14 from "@angular/material/icon";
|
|
27
|
-
import * as i15 from "@angular/material/progress-spinner";
|
|
28
|
-
import * as i16 from "../../skeleton-loader/skeleton-loader.component";
|
|
29
|
-
import * as i17 from "../../avatar-photo/avatar-photo.component";
|
|
30
|
-
import * as i18 from "../../rating-summary/rating-summary.component";
|
|
31
|
-
import * as i19 from "@angular/material/legacy-tooltip";
|
|
32
|
-
import * as i20 from "../../toc-kpi-values/toc-kpi-values.component";
|
|
33
|
-
import * as i21 from "../karma-points/karma-points.component";
|
|
34
|
-
import * as i22 from "@ngx-translate/core";
|
|
35
|
-
import * as i23 from "../pipes/replace-nbsp.pipe";
|
|
36
|
-
dayjs.extend(isSameOrBefore);
|
|
37
|
-
dayjs.extend(isSameOrAfter);
|
|
38
|
-
export class AppTocAboutComponent {
|
|
39
|
-
constructor(ratingService, loggerService, dialog, matSnackBar, loadCheckService, timerService, tocSvc, configService, discussUtilitySvc, router, reviewDataService, handleClaimService, resetRatingsService, contentSvc, activatedRoute, environment) {
|
|
40
|
-
this.ratingService = ratingService;
|
|
41
|
-
this.loggerService = loggerService;
|
|
42
|
-
this.dialog = dialog;
|
|
43
|
-
this.matSnackBar = matSnackBar;
|
|
44
|
-
this.loadCheckService = loadCheckService;
|
|
45
|
-
this.timerService = timerService;
|
|
46
|
-
this.tocSvc = tocSvc;
|
|
47
|
-
this.configService = configService;
|
|
48
|
-
this.discussUtilitySvc = discussUtilitySvc;
|
|
49
|
-
this.router = router;
|
|
50
|
-
this.reviewDataService = reviewDataService;
|
|
51
|
-
this.handleClaimService = handleClaimService;
|
|
52
|
-
this.resetRatingsService = resetRatingsService;
|
|
53
|
-
this.contentSvc = contentSvc;
|
|
54
|
-
this.activatedRoute = activatedRoute;
|
|
55
|
-
this.content = null;
|
|
56
|
-
this.contentReadData = null;
|
|
57
|
-
this.baseContentReadData = null;
|
|
58
|
-
this.skeletonLoader = false;
|
|
59
|
-
this.sticky = false;
|
|
60
|
-
this.forPreview = false;
|
|
61
|
-
this.showReviews = false;
|
|
62
|
-
this.fromViewer = false;
|
|
63
|
-
this.selectedTabValue = 0;
|
|
64
|
-
this.fromMarketPlace = false;
|
|
65
|
-
this.showMarketPlaceCertificate = false;
|
|
66
|
-
this.languageList = [];
|
|
67
|
-
this.lockCertificate = false;
|
|
68
|
-
this.trigerCompletionSurveyForm = new EventEmitter();
|
|
69
|
-
this.disableCertificate = false;
|
|
70
|
-
this.primaryCategory = NsContent.EPrimaryCategory;
|
|
71
|
-
this.summary = {
|
|
72
|
-
ellipsis: false,
|
|
73
|
-
viewLess: false,
|
|
74
|
-
};
|
|
75
|
-
this.description = {
|
|
76
|
-
ellipsis: false,
|
|
77
|
-
viewLess: false,
|
|
78
|
-
};
|
|
79
|
-
this.objectives = {
|
|
80
|
-
ellipsis: false,
|
|
81
|
-
viewLess: false,
|
|
82
|
-
};
|
|
83
|
-
this.tagsEllipsis = false;
|
|
84
|
-
this.searchTagsEllipsis = false;
|
|
85
|
-
this.competencySelected = '';
|
|
86
|
-
this.topRatingReviews = [];
|
|
87
|
-
this.ratingReviews = [];
|
|
88
|
-
this.latestReviews = [];
|
|
89
|
-
this.displayLoader = false;
|
|
90
|
-
this.disableLoadMore = false;
|
|
91
|
-
this.lookupLoading = true;
|
|
92
|
-
this.reviewPage = 1;
|
|
93
|
-
this.reviewDefaultLimit = 2;
|
|
94
|
-
this.lookupLimit = 3;
|
|
95
|
-
this.ratingViewCount = 3;
|
|
96
|
-
this.ratingViewCountDefault = 3;
|
|
97
|
-
this.competenciesObject = [];
|
|
98
|
-
this.destroySubject$ = new Subject();
|
|
99
|
-
this.viewMoreTags = false;
|
|
100
|
-
this.downloadCertificateBool = false;
|
|
101
|
-
this.strip = {
|
|
102
|
-
key: 'blendedPrograms',
|
|
103
|
-
logo: '',
|
|
104
|
-
title: 'Blended Program',
|
|
105
|
-
stripTitleLink: {
|
|
106
|
-
link: '',
|
|
107
|
-
icon: '',
|
|
108
|
-
},
|
|
109
|
-
sliderConfig: {
|
|
110
|
-
showNavs: true,
|
|
111
|
-
showDots: false,
|
|
112
|
-
},
|
|
113
|
-
loader: true,
|
|
114
|
-
stripBackground: '',
|
|
115
|
-
titleDescription: 'Blended Program',
|
|
116
|
-
stripConfig: {
|
|
117
|
-
cardSubType: 'standard',
|
|
118
|
-
},
|
|
119
|
-
viewMoreUrl: {
|
|
120
|
-
path: '',
|
|
121
|
-
viewMoreText: 'Show all',
|
|
122
|
-
queryParams: '',
|
|
123
|
-
},
|
|
124
|
-
tabs: [],
|
|
125
|
-
filters: []
|
|
126
|
-
};
|
|
127
|
-
this.timer = {};
|
|
128
|
-
this.isMobile = false;
|
|
129
|
-
this.sectorsList = [];
|
|
130
|
-
this.subSectorsList = [];
|
|
131
|
-
this.userProfile = null;
|
|
132
|
-
this.subSectorDetailArr = [];
|
|
133
|
-
this.selectedSector = '';
|
|
134
|
-
this.selectedSectorId = '';
|
|
135
|
-
this.environment = environment;
|
|
136
|
-
this.refreshratingSub = this.resetRatingsService.resetRatings$.subscribe((_res) => {
|
|
137
|
-
this.fetchRatingSummary();
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
ngOnInit() {
|
|
141
|
-
this.pageConfigData = this.activatedRoute?.snapshot?.data?.pageData?.data;
|
|
142
|
-
this.compentencyKey = this.configService.compentency[this.environment.compentencyVersionKey];
|
|
143
|
-
this.userProfile = this.configService.userProfile;
|
|
144
|
-
if (window.innerWidth <= 1200) {
|
|
145
|
-
this.isMobile = true;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
this.isMobile = false;
|
|
149
|
-
}
|
|
150
|
-
if (this.content && this.content.identifier) {
|
|
151
|
-
this.fetchRatingSummary();
|
|
152
|
-
// this.loadCompetencies()
|
|
153
|
-
}
|
|
154
|
-
if (this.content && this.content.contentId && this.content.contentId.includes('ext_')) {
|
|
155
|
-
// this.loadCompetencies()
|
|
156
|
-
}
|
|
157
|
-
if (this.content) {
|
|
158
|
-
this.content['subTheme'] = this.getSubThemes();
|
|
159
|
-
}
|
|
160
|
-
if (this.content && this.content.courseCategory === NsContent.ECourseCategory.CASE_STUDY) {
|
|
161
|
-
this.disableCertificate = true;
|
|
162
|
-
}
|
|
163
|
-
if (this.baseContentReadData?.sectorDetails_v1) {
|
|
164
|
-
// Parse string to array if needed
|
|
165
|
-
let sectorDetailsArray = this.baseContentReadData.sectorDetails_v1;
|
|
166
|
-
// If it's a string, try to parse it into an array
|
|
167
|
-
if (typeof sectorDetailsArray === 'string') {
|
|
168
|
-
try {
|
|
169
|
-
sectorDetailsArray = JSON.parse(sectorDetailsArray);
|
|
170
|
-
this.baseContentReadData.sectorDetails_v1 = sectorDetailsArray;
|
|
171
|
-
}
|
|
172
|
-
catch (e) {
|
|
173
|
-
console.error('Error parsing sectorDetails_v1:', e);
|
|
174
|
-
sectorDetailsArray = [];
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
// Process only if we have a valid array with items
|
|
178
|
-
if (Array.isArray(sectorDetailsArray) && sectorDetailsArray.length > 0) {
|
|
179
|
-
this.sectorsList = _.uniqBy(sectorDetailsArray
|
|
180
|
-
.filter((item) => item?.sectorName && item?.sectorId)
|
|
181
|
-
.map((item) => ({
|
|
182
|
-
sectorId: item.sectorId,
|
|
183
|
-
sectorName: item.sectorName
|
|
184
|
-
})), 'sectorName');
|
|
185
|
-
this.subSectorsList = _.uniqBy(sectorDetailsArray
|
|
186
|
-
.filter((item) => item?.subSectorName && item?.subSectorId)
|
|
187
|
-
.map((item) => ({
|
|
188
|
-
subSectorId: item.subSectorId,
|
|
189
|
-
subSectorName: item.subSectorName
|
|
190
|
-
})), 'subSectorName');
|
|
191
|
-
if (this.sectorsList && this.sectorsList.length && this.sectorsList[0]) {
|
|
192
|
-
if (!this.isMobile) {
|
|
193
|
-
this.handleSubsector(this.sectorsList[0]);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (this.content?.contentId &&
|
|
199
|
-
this.content?.certificateObj?.data &&
|
|
200
|
-
Object.keys(this.content.certificateObj.data).length === 0 &&
|
|
201
|
-
this.content.completionStatus === 2) {
|
|
202
|
-
this.handleOpenCertificateDialog();
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
ngAfterViewInit() {
|
|
206
|
-
this.timerUnsubscribe = this.timerService.getTimerData()
|
|
207
|
-
.pipe(takeUntil(this.destroySubject$))
|
|
208
|
-
.subscribe((_timer) => {
|
|
209
|
-
this.timer = _timer;
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
ngOnChanges(changes) {
|
|
213
|
-
this.compentencyKey = this.configService.compentency[this.environment.compentencyVersionKey];
|
|
214
|
-
if (changes.selectedTabValue && changes.selectedTabValue.currentValue === 0) {
|
|
215
|
-
setTimeout(() => {
|
|
216
|
-
if (!this.isMobile) {
|
|
217
|
-
if (this.summaryElem && this.summaryElem.nativeElement.offsetHeight > 72) {
|
|
218
|
-
this.summary.ellipsis = true;
|
|
219
|
-
}
|
|
220
|
-
if (this.descElem && this.descElem.nativeElement.offsetHeight > 72) {
|
|
221
|
-
this.description.ellipsis = true;
|
|
222
|
-
}
|
|
223
|
-
if (this.objectivesElem && this.objectivesElem.nativeElement.offsetHeight > 72) {
|
|
224
|
-
this.objectives.ellipsis = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
if (this.summaryElem && this.summaryElem.nativeElement.offsetHeight > 48) {
|
|
229
|
-
this.summary.ellipsis = true;
|
|
230
|
-
}
|
|
231
|
-
if (this.descElem && this.descElem.nativeElement.offsetHeight > 48) {
|
|
232
|
-
this.description.ellipsis = true;
|
|
233
|
-
}
|
|
234
|
-
if (this.objectivesElem && this.objectivesElem.nativeElement.offsetHeight > 48) {
|
|
235
|
-
this.objectives.ellipsis = true;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (this.tagsElem && this.tagsElem.nativeElement.offsetHeight > 64) {
|
|
239
|
-
this.tagsEllipsis = true;
|
|
240
|
-
}
|
|
241
|
-
if (this.searchTagElem && this.searchTagElem.nativeElement.offsetHeight > 64) {
|
|
242
|
-
this.searchTagsEllipsis = true;
|
|
243
|
-
}
|
|
244
|
-
}, 500);
|
|
245
|
-
}
|
|
246
|
-
if (changes.skeletonLoader && !changes.skeletonLoader.currentValue) {
|
|
247
|
-
setTimeout(() => {
|
|
248
|
-
this.loadCheckService.componentLoaded(true);
|
|
249
|
-
}, 500);
|
|
250
|
-
}
|
|
251
|
-
if (this.content) {
|
|
252
|
-
this.tocStructure = {
|
|
253
|
-
assessment: 0,
|
|
254
|
-
course: 0,
|
|
255
|
-
handsOn: 0,
|
|
256
|
-
interactiveVideo: 0,
|
|
257
|
-
learningModule: 0,
|
|
258
|
-
other: 0,
|
|
259
|
-
pdf: 0,
|
|
260
|
-
survey: 0,
|
|
261
|
-
podcast: 0,
|
|
262
|
-
practiceTest: 0,
|
|
263
|
-
finalTest: 0,
|
|
264
|
-
quiz: 0,
|
|
265
|
-
video: 0,
|
|
266
|
-
webModule: 0,
|
|
267
|
-
webPage: 0,
|
|
268
|
-
youtube: 0,
|
|
269
|
-
interactivecontent: 0,
|
|
270
|
-
offlineSession: 0,
|
|
271
|
-
};
|
|
272
|
-
this.tocStructure.learningModule = this.content.primaryCategory === 'Course Unit' ? -1 : 0;
|
|
273
|
-
this.tocStructure.course = this.content.primaryCategory === 'Course' ? -1 : 0;
|
|
274
|
-
this.tocStructure = this.tocSvc.getTocStructure(this.content, this.tocStructure);
|
|
275
|
-
for (const progType in this.tocStructure) {
|
|
276
|
-
if (this.tocStructure[progType] > 0) {
|
|
277
|
-
break;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
if (this.content && this.content.identifier) {
|
|
281
|
-
if (this.ratingSummary && Object.keys(this.ratingSummary).length === 0) {
|
|
282
|
-
this.fetchRatingSummary();
|
|
283
|
-
}
|
|
284
|
-
if (this.competenciesObject.length === 0) {
|
|
285
|
-
this.loadCompetencies();
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
if (this.content && this.content.contentId && this.content.contentId.includes('ext_')) {
|
|
289
|
-
if (this.competenciesObject.length === 0) {
|
|
290
|
-
this.loadCompetencies();
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (this.contentReadData) {
|
|
294
|
-
this.contentReadData['subTheme'] = this.getSubThemes();
|
|
295
|
-
}
|
|
296
|
-
if (this.content && this.content.courseCategory === NsContent.ECourseCategory.CASE_STUDY) {
|
|
297
|
-
this.disableCertificate = true;
|
|
298
|
-
}
|
|
299
|
-
if (this.contentReadData?.sectorDetails_v1) {
|
|
300
|
-
// Parse string to array if needed
|
|
301
|
-
let sectorDetailsArray = this.contentReadData.sectorDetails_v1;
|
|
302
|
-
// If it's a string, try to parse it into an array
|
|
303
|
-
if (typeof sectorDetailsArray === 'string') {
|
|
304
|
-
try {
|
|
305
|
-
sectorDetailsArray = JSON.parse(sectorDetailsArray);
|
|
306
|
-
this.contentReadData.sectorDetails_v1 = sectorDetailsArray;
|
|
307
|
-
}
|
|
308
|
-
catch (e) {
|
|
309
|
-
console.error('Error parsing sectorDetails_v1:', e);
|
|
310
|
-
sectorDetailsArray = [];
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// Process only if we have a valid array with items
|
|
314
|
-
if (Array.isArray(sectorDetailsArray) && sectorDetailsArray.length > 0) {
|
|
315
|
-
// Extract unique sectors using lodash
|
|
316
|
-
this.sectorsList = _.uniqBy(sectorDetailsArray
|
|
317
|
-
.filter((item) => item?.sectorName && item?.sectorId)
|
|
318
|
-
.map((item) => ({
|
|
319
|
-
sectorId: item.sectorId,
|
|
320
|
-
sectorName: item.sectorName
|
|
321
|
-
})), 'sectorName');
|
|
322
|
-
// Extract unique subsectors using lodash
|
|
323
|
-
this.subSectorsList = _.uniqBy(sectorDetailsArray
|
|
324
|
-
.filter((item) => item?.subSectorName && item?.subSectorId)
|
|
325
|
-
.map((item) => ({
|
|
326
|
-
subSectorId: item.subSectorId,
|
|
327
|
-
subSectorName: item.subSectorName
|
|
328
|
-
})), 'subSectorName');
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
333
|
-
}
|
|
334
|
-
getSubThemes() {
|
|
335
|
-
const subThemeArr = [];
|
|
336
|
-
if (this.contentReadData && this.compentencyKey && this.contentReadData[this.compentencyKey.vKey] && this.contentReadData[this.compentencyKey.vKey].length) {
|
|
337
|
-
if (typeof this.contentReadData[this.compentencyKey.vKey] === 'string' && this.checkValidJSON(this.contentReadData[this.compentencyKey.vKey])) {
|
|
338
|
-
this.contentReadData[this.compentencyKey.vKey] = JSON.parse(this.contentReadData[this.compentencyKey.vKey]);
|
|
339
|
-
}
|
|
340
|
-
this.contentReadData[this.compentencyKey.vKey].forEach((_competencyObj) => {
|
|
341
|
-
if (subThemeArr.indexOf(_competencyObj[this.compentencyKey.vCompetencySubTheme]) === -1) {
|
|
342
|
-
subThemeArr.push(_competencyObj[this.compentencyKey.vCompetencySubTheme]);
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
return subThemeArr;
|
|
347
|
-
}
|
|
348
|
-
loadCompetencies() {
|
|
349
|
-
if (this.baseContentReadData && this.baseContentReadData[this.compentencyKey.vKey] && this.baseContentReadData[this.compentencyKey.vKey].length) {
|
|
350
|
-
const competenciesObject = {};
|
|
351
|
-
if (typeof this.baseContentReadData[this.compentencyKey.vKey] === 'string'
|
|
352
|
-
&& this.checkValidJSON(this.baseContentReadData[this.compentencyKey.vKey])) {
|
|
353
|
-
this.baseContentReadData[this.compentencyKey.vKey] = JSON.parse(this.baseContentReadData[this.compentencyKey.vKey]);
|
|
354
|
-
}
|
|
355
|
-
this.baseContentReadData[this.compentencyKey.vKey].forEach((_obj) => {
|
|
356
|
-
if (competenciesObject[_obj[this.compentencyKey.vCompetencyArea]]) {
|
|
357
|
-
if (competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]) {
|
|
358
|
-
const competencyTheme = competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]];
|
|
359
|
-
if (competencyTheme.indexOf(_obj[this.compentencyKey.vCompetencySubTheme]) === -1) {
|
|
360
|
-
competencyTheme.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
else {
|
|
364
|
-
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]] = [];
|
|
365
|
-
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]
|
|
366
|
-
.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]] = {};
|
|
371
|
-
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]] = [];
|
|
372
|
-
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]
|
|
373
|
-
.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
374
|
-
}
|
|
375
|
-
});
|
|
376
|
-
for (const key in competenciesObject) {
|
|
377
|
-
if (competenciesObject.hasOwnProperty(key)) {
|
|
378
|
-
const _temp = {};
|
|
379
|
-
_temp['key'] = key;
|
|
380
|
-
_temp['value'] = competenciesObject[key];
|
|
381
|
-
this.competenciesObject.push(_temp);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
this.handleShowCompetencies(this.competenciesObject[0]);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
handleShowCompetencies(item) {
|
|
388
|
-
this.competencySelected = item.key;
|
|
389
|
-
const valueObj = item.value;
|
|
390
|
-
const competencyArray = [];
|
|
391
|
-
for (const key in valueObj) {
|
|
392
|
-
if (valueObj.hasOwnProperty(key)) {
|
|
393
|
-
const _tempObj = {};
|
|
394
|
-
_tempObj['key'] = key;
|
|
395
|
-
_tempObj['value'] = valueObj[key];
|
|
396
|
-
competencyArray.push(_tempObj);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
this.strip['loaderWidgets'] = [];
|
|
400
|
-
this.strip['loaderWidgets'] = this.transformCompetenciesToWidget(this.competencySelected, competencyArray, this.strip);
|
|
401
|
-
}
|
|
402
|
-
transformCompetenciesToWidget(competencyArea, competencyArrObject, strip) {
|
|
403
|
-
return (competencyArrObject || []).map((content, idx) => (content ? {
|
|
404
|
-
widgetType: 'card',
|
|
405
|
-
widgetSubType: 'competencyCard',
|
|
406
|
-
widgetHostClass: 'mr-4',
|
|
407
|
-
widgetData: {
|
|
408
|
-
content,
|
|
409
|
-
competencyArea,
|
|
410
|
-
cardCustomeClass: strip.customeClass ? strip.customeClass : '',
|
|
411
|
-
context: { pageSection: strip.key, position: idx },
|
|
412
|
-
},
|
|
413
|
-
} : {
|
|
414
|
-
widgetType: 'card',
|
|
415
|
-
widgetSubType: 'competencyCard',
|
|
416
|
-
widgetHostClass: 'mr-4',
|
|
417
|
-
widgetData: {},
|
|
418
|
-
}));
|
|
419
|
-
}
|
|
420
|
-
handleParseJsonData(s) {
|
|
421
|
-
try {
|
|
422
|
-
const parsedString = JSON.parse(s);
|
|
423
|
-
return parsedString;
|
|
424
|
-
}
|
|
425
|
-
catch {
|
|
426
|
-
return [];
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
fetchRatingSummary() {
|
|
430
|
-
if (this.content && this.content.identifier && this.content.primaryCategory) {
|
|
431
|
-
this.ratingService.getRatingSummary(this.content.identifier, this.content.primaryCategory).subscribe((res) => {
|
|
432
|
-
if (res && res.result && res.result.response) {
|
|
433
|
-
this.ratingSummary = res.result.response;
|
|
434
|
-
}
|
|
435
|
-
else {
|
|
436
|
-
this.ratingSummary = undefined;
|
|
437
|
-
}
|
|
438
|
-
// Hide loader for MatDialog...
|
|
439
|
-
if (this.dialogRef) {
|
|
440
|
-
this.dialogRef.componentInstance.displayLoader = false;
|
|
441
|
-
}
|
|
442
|
-
this.ratingSummaryProcessed = this.processRatingSummary();
|
|
443
|
-
// this.fetchRatingLookup()
|
|
444
|
-
}, (err) => {
|
|
445
|
-
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
446
|
-
this.matSnackBar.open('Unable to fetch rating summary, due to some error!');
|
|
447
|
-
});
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
fetchRatingLookup() {
|
|
451
|
-
this.displayLoader = true;
|
|
452
|
-
if (this.content && this.content.identifier && this.content.primaryCategory) {
|
|
453
|
-
const req = {
|
|
454
|
-
activityId: this.content.identifier,
|
|
455
|
-
activityType: this.content.primaryCategory,
|
|
456
|
-
limit: this.lookupLimit,
|
|
457
|
-
...((this.lastLookUp && this.lastLookUp.updatedOnUUID) ? { updateOn: (this.lastLookUp && this.lastLookUp.updatedOnUUID) } : null),
|
|
458
|
-
};
|
|
459
|
-
this.ratingService.getRatingLookup(req).subscribe((res) => {
|
|
460
|
-
// To disable the loader in the modal.
|
|
461
|
-
if (this.dialogRef) {
|
|
462
|
-
this.dialogRef.componentInstance.displayLoader = false;
|
|
463
|
-
}
|
|
464
|
-
if (res && res.result && res.result.response) {
|
|
465
|
-
if (this.reviewPage > 1) {
|
|
466
|
-
res.result.response.map((item) => {
|
|
467
|
-
if (!this.ratingLookup.find((o) => o.updatedOnUUID === item.updatedOnUUID)) {
|
|
468
|
-
this.ratingLookup.push(item);
|
|
469
|
-
}
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
this.ratingLookup = res.result.response;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
this.processRatingLookup(res.result.response);
|
|
477
|
-
}, (err) => {
|
|
478
|
-
if (this.dialogRef) { // To disable the loader in the modal.
|
|
479
|
-
this.dialogRef.componentInstance.displayLoader = false;
|
|
480
|
-
}
|
|
481
|
-
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
482
|
-
this.matSnackBar.open('Unable to load reviews, due to some error!');
|
|
483
|
-
});
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
processRatingLookup(response) {
|
|
487
|
-
if (response) {
|
|
488
|
-
if (response && response.length < this.lookupLimit) {
|
|
489
|
-
this.disableLoadMore = true;
|
|
490
|
-
}
|
|
491
|
-
else {
|
|
492
|
-
this.disableLoadMore = false;
|
|
493
|
-
}
|
|
494
|
-
this.lastLookUp = response[response.length - 1];
|
|
495
|
-
this.ratingReviews = this.ratingLookup;
|
|
496
|
-
this.authReplies = [];
|
|
497
|
-
this.authReplies = _.keyBy(this.latestReviews, 'userId');
|
|
498
|
-
const userIds = _.map(this.latestReviews, 'userId');
|
|
499
|
-
if (this.content && userIds) {
|
|
500
|
-
this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
|
|
501
|
-
}
|
|
502
|
-
if (this.ratingReviews) {
|
|
503
|
-
this.ratingReviews = this.ratingReviews.slice();
|
|
504
|
-
this.reviewDataService.setReviewData(this.ratingReviews);
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
getAuthorReply(identifier, primaryCategory, userIds) {
|
|
509
|
-
const request = {
|
|
510
|
-
request: {
|
|
511
|
-
activityId: identifier,
|
|
512
|
-
activityType: primaryCategory,
|
|
513
|
-
userId: userIds,
|
|
514
|
-
},
|
|
515
|
-
};
|
|
516
|
-
return this.ratingService.getRatingReply(request).subscribe((res) => {
|
|
517
|
-
if (res && res.result && res.result.content) {
|
|
518
|
-
const ratingAuthReplay = res.result.content;
|
|
519
|
-
_.forEach(ratingAuthReplay, value => {
|
|
520
|
-
if (this.authReplies[value.userId]) {
|
|
521
|
-
this.authReplies[value.userId]['comment'] = value.comment;
|
|
522
|
-
this.authReplies[value.userId]['userId'] = value.userId;
|
|
523
|
-
}
|
|
524
|
-
});
|
|
525
|
-
}
|
|
526
|
-
this.latestReviews = Object.values(this.authReplies);
|
|
527
|
-
return this.authReplies;
|
|
528
|
-
}, (err) => {
|
|
529
|
-
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
530
|
-
this.matSnackBar.open('Unable to fetch author replies, due to some error!');
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
countStarsPercentage(value, key, total) {
|
|
534
|
-
if (value && total) {
|
|
535
|
-
return (((value * key) / total) * 100).toFixed(2);
|
|
536
|
-
}
|
|
537
|
-
return 0;
|
|
538
|
-
}
|
|
539
|
-
processRatingSummary() {
|
|
540
|
-
const breakDownArray = [];
|
|
541
|
-
const ratingSummaryPr = {
|
|
542
|
-
breakDown: breakDownArray,
|
|
543
|
-
latest50Reviews: breakDownArray,
|
|
544
|
-
ratingsNumber: breakDownArray,
|
|
545
|
-
total_number_of_ratings: _.get(this.ratingSummary, 'total_number_of_ratings') || 0,
|
|
546
|
-
avgRating: 0,
|
|
547
|
-
};
|
|
548
|
-
const totRatings = _.get(this.ratingSummary, 'sum_of_total_ratings') || 0;
|
|
549
|
-
ratingSummaryPr.breakDown.push({
|
|
550
|
-
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount1stars'), 1, totRatings),
|
|
551
|
-
key: 1,
|
|
552
|
-
value: _.get(this.ratingSummary, 'totalcount1stars'),
|
|
553
|
-
});
|
|
554
|
-
ratingSummaryPr.breakDown.push({
|
|
555
|
-
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount2stars'), 2, totRatings),
|
|
556
|
-
key: 2,
|
|
557
|
-
value: _.get(this.ratingSummary, 'totalcount2stars'),
|
|
558
|
-
});
|
|
559
|
-
ratingSummaryPr.breakDown.push({
|
|
560
|
-
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount3stars'), 3, totRatings),
|
|
561
|
-
key: 3,
|
|
562
|
-
value: _.get(this.ratingSummary, 'totalcount3stars'),
|
|
563
|
-
});
|
|
564
|
-
ratingSummaryPr.breakDown.push({
|
|
565
|
-
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount4stars'), 4, totRatings),
|
|
566
|
-
key: 4,
|
|
567
|
-
value: _.get(this.ratingSummary, 'totalcount4stars'),
|
|
568
|
-
});
|
|
569
|
-
ratingSummaryPr.breakDown.push({
|
|
570
|
-
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount5stars'), 5, totRatings),
|
|
571
|
-
key: 5,
|
|
572
|
-
value: _.get(this.ratingSummary, 'totalcount5stars'),
|
|
573
|
-
});
|
|
574
|
-
if (this.ratingSummary && this.ratingSummary.latest50Reviews) {
|
|
575
|
-
const latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews);
|
|
576
|
-
const modifiedReviews = _.map(latest50Reviews, rating => {
|
|
577
|
-
rating['userId'] = rating.user_id;
|
|
578
|
-
return rating;
|
|
579
|
-
});
|
|
580
|
-
this.authReplies = [];
|
|
581
|
-
this.authReplies = _.keyBy(latest50Reviews, 'user_id');
|
|
582
|
-
const userIds = _.map(latest50Reviews, 'user_id');
|
|
583
|
-
if (this.content) {
|
|
584
|
-
this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
|
|
585
|
-
}
|
|
586
|
-
ratingSummaryPr.latest50Reviews = modifiedReviews;
|
|
587
|
-
this.ratingReviews = modifiedReviews;
|
|
588
|
-
this.topRatingReviews = modifiedReviews;
|
|
589
|
-
}
|
|
590
|
-
// To pass data to the review content
|
|
591
|
-
this.reviewDataService.setReviewData(this.ratingReviews);
|
|
592
|
-
if (this.ratingSummary && this.ratingSummary.total_number_of_ratings) {
|
|
593
|
-
ratingSummaryPr.avgRating =
|
|
594
|
-
parseFloat((this.ratingSummary.sum_of_total_ratings / this.ratingSummary.total_number_of_ratings).toFixed(1));
|
|
595
|
-
}
|
|
596
|
-
if (this.content) {
|
|
597
|
-
this.content.averageRating = ratingSummaryPr.avgRating;
|
|
598
|
-
this.content.totalRating = ratingSummaryPr.total_number_of_ratings;
|
|
599
|
-
}
|
|
600
|
-
return ratingSummaryPr;
|
|
601
|
-
}
|
|
602
|
-
handleCapitalize(str, type) {
|
|
603
|
-
let tempStr = str;
|
|
604
|
-
if (tempStr) {
|
|
605
|
-
tempStr = tempStr.split('_x000D_,').join('');
|
|
606
|
-
}
|
|
607
|
-
let returnValue = '';
|
|
608
|
-
if (tempStr && type === 'name') {
|
|
609
|
-
returnValue = tempStr.split(' ').map(_str => {
|
|
610
|
-
return _str.charAt(0).toUpperCase() + _str.slice(1);
|
|
611
|
-
}).join(' ');
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
returnValue = tempStr && (tempStr.charAt(0).toUpperCase() + tempStr.slice(1));
|
|
615
|
-
}
|
|
616
|
-
return returnValue;
|
|
617
|
-
}
|
|
618
|
-
handleOpenReviewModal() {
|
|
619
|
-
this.dialogRef = this.dialog.open(ReviewsContentComponent, {
|
|
620
|
-
width: '400px',
|
|
621
|
-
data: { ratings: this.ratingSummaryProcessed, reviews: this.authReplies, latestReviews: this.ratingLookup },
|
|
622
|
-
panelClass: 'ratings-modal-box',
|
|
623
|
-
disableClose: true,
|
|
624
|
-
});
|
|
625
|
-
this.dialogRef.afterClosed().subscribe((_result) => {
|
|
626
|
-
});
|
|
627
|
-
this.dialogRef.componentInstance.initiateLoadMore.subscribe((_value) => {
|
|
628
|
-
this.loadMore(_value);
|
|
629
|
-
});
|
|
630
|
-
this.dialogRef.componentInstance.loadLatestReviews.subscribe((_value) => {
|
|
631
|
-
this.dialogRef.componentInstance.displayLoader = true;
|
|
632
|
-
this.ratingViewCount = this.ratingViewCountDefault;
|
|
633
|
-
this.lastLookUp = '';
|
|
634
|
-
this.ratingReviews = [];
|
|
635
|
-
this.reviewPage = 1;
|
|
636
|
-
this.disableLoadMore = false;
|
|
637
|
-
this.ratingLookup = [];
|
|
638
|
-
if (!this.forPreview) {
|
|
639
|
-
if (_value === 'Latest') {
|
|
640
|
-
this.fetchRatingLookup();
|
|
641
|
-
}
|
|
642
|
-
else {
|
|
643
|
-
this.fetchRatingSummary();
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
loadMore(selectedReview) {
|
|
649
|
-
if (!this.disableLoadMore) {
|
|
650
|
-
this.lookupLoading = true;
|
|
651
|
-
this.reviewPage = this.reviewPage + 1;
|
|
652
|
-
this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
|
|
653
|
-
if (selectedReview === 'Latest') {
|
|
654
|
-
this.reviewPage = this.reviewPage + 1;
|
|
655
|
-
this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
|
|
656
|
-
this.fetchRatingLookup();
|
|
657
|
-
}
|
|
658
|
-
else {
|
|
659
|
-
if ((this.reviewPage * this.ratingViewCount) > this.ratingReviews.length) {
|
|
660
|
-
this.disableLoadMore = true;
|
|
661
|
-
this.dialogRef.componentInstance.displayLoader = false;
|
|
662
|
-
}
|
|
663
|
-
this.reviewPage = this.reviewPage + 1;
|
|
664
|
-
this.ratingViewCount = this.reviewPage * this.ratingViewCount;
|
|
665
|
-
}
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
navigateToDiscussionHub() {
|
|
669
|
-
const config = {
|
|
670
|
-
menuOptions: [
|
|
671
|
-
{
|
|
672
|
-
route: 'all-discussions',
|
|
673
|
-
label: 'All discussions',
|
|
674
|
-
enable: true,
|
|
675
|
-
},
|
|
676
|
-
{
|
|
677
|
-
route: 'categories',
|
|
678
|
-
label: 'Categories',
|
|
679
|
-
enable: true,
|
|
680
|
-
},
|
|
681
|
-
{
|
|
682
|
-
route: 'tags',
|
|
683
|
-
label: 'Tags',
|
|
684
|
-
enable: true,
|
|
685
|
-
},
|
|
686
|
-
{
|
|
687
|
-
route: 'my-discussion',
|
|
688
|
-
label: 'Your discussion',
|
|
689
|
-
enable: true,
|
|
690
|
-
},
|
|
691
|
-
// {
|
|
692
|
-
// route: 'leaderboard',
|
|
693
|
-
// label: 'Leader Board',
|
|
694
|
-
// enable: true,
|
|
695
|
-
// },
|
|
696
|
-
],
|
|
697
|
-
userName: (this.configService.nodebbUserProfile && this.configService.nodebbUserProfile.username) || '',
|
|
698
|
-
context: {
|
|
699
|
-
id: 1,
|
|
700
|
-
},
|
|
701
|
-
categories: { result: [] },
|
|
702
|
-
routerSlug: '/app',
|
|
703
|
-
headerOptions: false,
|
|
704
|
-
bannerOption: true,
|
|
705
|
-
};
|
|
706
|
-
this.discussUtilitySvc.setDiscussionConfig(config);
|
|
707
|
-
localStorage.setItem('home', JSON.stringify(config));
|
|
708
|
-
this.router.navigate(['/app/discussion-forum'], { queryParams: { page: 'home' }, queryParamsHandling: 'merge' });
|
|
709
|
-
}
|
|
710
|
-
handleClickOfClaim(event) {
|
|
711
|
-
this.handleClaimService.setClaimData(event);
|
|
712
|
-
}
|
|
713
|
-
getCourseIdForCertificate() {
|
|
714
|
-
const paramId = this.activatedRoute.snapshot.paramMap.get('id');
|
|
715
|
-
if (this.content?.contentId?.includes('ext_')) {
|
|
716
|
-
return this.content.contentId;
|
|
717
|
-
}
|
|
718
|
-
return paramId || '';
|
|
719
|
-
}
|
|
720
|
-
// handleOpenCertificateDialog() {
|
|
721
|
-
// this.downloadCertificateBool = true;
|
|
722
|
-
// const certId = this.content && this.content?.certificateObj?.certId;
|
|
723
|
-
// if (this.content && this.pageConfigData) {
|
|
724
|
-
// const allowedPrimaryCategory =
|
|
725
|
-
// this.pageConfigData?.dynamicCertificateGeneration?.allows &&
|
|
726
|
-
// this.pageConfigData?.dynamicCertificateGeneration?.allows?.map(
|
|
727
|
-
// (cat: string) => cat?.toLowerCase()
|
|
728
|
-
// );
|
|
729
|
-
// if (
|
|
730
|
-
// allowedPrimaryCategory &&
|
|
731
|
-
// ( allowedPrimaryCategory.includes(this.content?.primaryCategory?.toLowerCase()) ||
|
|
732
|
-
// allowedPrimaryCategory.includes(this.content?.courseCategory?.toLowerCase()))
|
|
733
|
-
// ) {
|
|
734
|
-
// const payload = {
|
|
735
|
-
// request: {
|
|
736
|
-
// courseId: this.content.identifier,
|
|
737
|
-
// batchId: this.batchData?.content[0]?.batchId || '',
|
|
738
|
-
// userId: this.userProfile.userId,
|
|
739
|
-
// },
|
|
740
|
-
// };
|
|
741
|
-
// this.contentSvc.downloadCertV2(payload).subscribe(
|
|
742
|
-
// (response) => {
|
|
743
|
-
// if (response) {
|
|
744
|
-
// this.downloadCertificateBool = false;
|
|
745
|
-
// this.dialog.open(CertificateDialogComponent, {
|
|
746
|
-
// width: '1200px',
|
|
747
|
-
// data: {
|
|
748
|
-
// cet: response.result.printUri,
|
|
749
|
-
// certId:
|
|
750
|
-
// (this.content && this.content.certificateObj.certId) || '',
|
|
751
|
-
// },
|
|
752
|
-
// });
|
|
753
|
-
// }
|
|
754
|
-
// },
|
|
755
|
-
// (error: any) => {
|
|
756
|
-
// this.downloadCertificateBool = false;
|
|
757
|
-
// this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
758
|
-
// this.matSnackBar.open(
|
|
759
|
-
// 'Unable to View Certificate, due to some error!'
|
|
760
|
-
// );
|
|
761
|
-
// }
|
|
762
|
-
// );
|
|
763
|
-
// } else {debugger
|
|
764
|
-
// this.contentSvc.downloadCert(certId).subscribe(
|
|
765
|
-
// (response) => {
|
|
766
|
-
// if (this.content) {
|
|
767
|
-
// this.downloadCertificateBool = false;
|
|
768
|
-
// this.content['certificateObj']['certData'] =
|
|
769
|
-
// response.result.printUri;
|
|
770
|
-
// this.dialog.open(CertificateDialogComponent, {
|
|
771
|
-
// width: '1200px',
|
|
772
|
-
// data: {
|
|
773
|
-
// cet: response.result.printUri,
|
|
774
|
-
// certId: this.content && this.content.certificateObj.certId,
|
|
775
|
-
// },
|
|
776
|
-
// });
|
|
777
|
-
// }
|
|
778
|
-
// },
|
|
779
|
-
// (error: any) => {
|
|
780
|
-
// this.downloadCertificateBool = false;
|
|
781
|
-
// this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
782
|
-
// this.matSnackBar.open(
|
|
783
|
-
// 'Unable to View Certificate, please check again later!'
|
|
784
|
-
// );
|
|
785
|
-
// }
|
|
786
|
-
// );
|
|
787
|
-
// }
|
|
788
|
-
// }
|
|
789
|
-
// }
|
|
790
|
-
handleOpenCertificateDialog() {
|
|
791
|
-
this.downloadCertificateBool = true;
|
|
792
|
-
const certId = this.content && this.content.certificateObj.certId;
|
|
793
|
-
if (this.content && this.content.certificateObj && !this.content.certificateObj.certData) {
|
|
794
|
-
if (certId) {
|
|
795
|
-
this.contentSvc.downloadCert(certId).subscribe(response => {
|
|
796
|
-
if (this.content) {
|
|
797
|
-
this.downloadCertificateBool = false;
|
|
798
|
-
this.content['certificateObj']['certData'] = response.result.printUri;
|
|
799
|
-
this.dialog.open(CertificateDialogComponent, {
|
|
800
|
-
width: '1200px',
|
|
801
|
-
data: { cet: response.result.printUri, certId: this.content && this.content.certificateObj.certId },
|
|
802
|
-
});
|
|
803
|
-
}
|
|
804
|
-
}, (error) => {
|
|
805
|
-
this.downloadCertificateBool = false;
|
|
806
|
-
this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
807
|
-
this.matSnackBar.open('Unable to View Certificate, due to some error!');
|
|
808
|
-
});
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
else {
|
|
812
|
-
this.downloadCertificateBool = false;
|
|
813
|
-
this.dialog.open(CertificateDialogComponent, {
|
|
814
|
-
width: '1200px',
|
|
815
|
-
data: { cet: this.content && this.content.certificateObj.certData, certId: this.content && this.content.certificateObj.certId },
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
openSurveyFormPopup() {
|
|
820
|
-
this.trigerCompletionSurveyForm.emit(true);
|
|
821
|
-
}
|
|
822
|
-
checkValidJSON(str) {
|
|
823
|
-
try {
|
|
824
|
-
JSON.parse(str);
|
|
825
|
-
return true;
|
|
826
|
-
}
|
|
827
|
-
catch (e) {
|
|
828
|
-
return false;
|
|
829
|
-
}
|
|
830
|
-
}
|
|
831
|
-
handleSubsector(item) {
|
|
832
|
-
this.subSectorDetailArr = [];
|
|
833
|
-
this.selectedSector = '';
|
|
834
|
-
this.selectedSectorId = '';
|
|
835
|
-
if (this.baseContentReadData) {
|
|
836
|
-
for (let i = 0; i < this.baseContentReadData.sectorDetails_v1.length; i++) {
|
|
837
|
-
if (this.baseContentReadData.sectorDetails_v1[i]['sectorId'] === item.sectorId) {
|
|
838
|
-
if (this.baseContentReadData.sectorDetails_v1[i]['subSectorName']) {
|
|
839
|
-
let obj = {};
|
|
840
|
-
obj = {
|
|
841
|
-
'sectorId': this.baseContentReadData.sectorDetails_v1[i]['sectorId'],
|
|
842
|
-
'sectorName': this.baseContentReadData.sectorDetails_v1[i]['sectorName'],
|
|
843
|
-
'key': this.baseContentReadData.sectorDetails_v1[i]['subSectorName'],
|
|
844
|
-
'value': [this.baseContentReadData.sectorDetails_v1[i]['subSectorName']]
|
|
845
|
-
};
|
|
846
|
-
this.subSectorDetailArr.push(obj);
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
}
|
|
850
|
-
this.selectedSector = item.sectorName;
|
|
851
|
-
this.selectedSectorId = item.sectorId;
|
|
852
|
-
const valueObj = item;
|
|
853
|
-
const subSectorArray = [];
|
|
854
|
-
for (const key in valueObj) {
|
|
855
|
-
if (valueObj.hasOwnProperty(key)) {
|
|
856
|
-
const _tempObj = {};
|
|
857
|
-
_tempObj['key'] = key;
|
|
858
|
-
_tempObj['value'] = valueObj[key];
|
|
859
|
-
subSectorArray.push(_tempObj);
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
this.strip['sectorWidgets'] = this.transformCompetenciesToWidget('Behavioural', this.subSectorDetailArr, this.strip);
|
|
863
|
-
}
|
|
864
|
-
}
|
|
865
|
-
ngOnDestroy() {
|
|
866
|
-
this.destroySubject$.unsubscribe();
|
|
867
|
-
this.timerUnsubscribe.unsubscribe();
|
|
868
|
-
if (this.refreshratingSub) {
|
|
869
|
-
this.refreshratingSub.unsubscribe();
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, deps: [{ token: i1.RatingService }, { token: i2.LoggerService }, { token: i3.MatLegacyDialog }, { token: i4.MatLegacySnackBar }, { token: i5.LoadCheckService }, { token: i6.TimerService }, { token: i7.AppTocService }, { token: i2.ConfigurationsService }, { token: i8.DiscussUtilsService }, { token: i9.Router }, { token: i10.ReviewComponentDataService }, { token: i11.HandleClaimService }, { token: i12.ResetRatingsService }, { token: i2.WidgetContentService }, { token: i9.ActivatedRoute }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
873
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: { condition: "condition", kparray: "kparray", content: "content", contentReadData: "contentReadData", baseContentReadData: "baseContentReadData", skeletonLoader: "skeletonLoader", sticky: "sticky", tocStructure: "tocStructure", pathSet: "pathSet", config: "config", resumeData: "resumeData", forPreview: "forPreview", showReviews: "showReviews", batchData: "batchData", fromViewer: "fromViewer", selectedBatchData: "selectedBatchData", selectedTabValue: "selectedTabValue", fromMarketPlace: "fromMarketPlace", showMarketPlaceCertificate: "showMarketPlaceCertificate", languageList: "languageList", lockCertificate: "lockCertificate" }, outputs: { trigerCompletionSurveyForm: "trigerCompletionSurveyForm" }, viewQueries: [{ propertyName: "summaryElem", first: true, predicate: ["summaryElem"], descendants: true }, { propertyName: "objectivesElem", first: true, predicate: ["objectivesElem"], descendants: true }, { propertyName: "descElem", first: true, predicate: ["descElem"], descendants: true }, { propertyName: "tagsElem", first: true, predicate: ["tagsElem"], descendants: true }, { propertyName: "searchTagElem", first: true, predicate: ["searchTagElem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}</div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.objectives' | translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\" flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i17.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i18.RatingSummaryComponent, selector: "ws-widget-rating-summary", inputs: ["ratingSummary"] }, { kind: "component", type: i2.HorizontalScrollerV2Component, selector: "ws-utils-horizontal-scroller-v2", inputs: ["loadStatus", "onHover", "sliderConfig", "widgetsLength", "defaultMaxWidgets", "stripConfig", "stripsResultDataMap", "subtype"], outputs: ["loadNext"] }, { kind: "directive", type: i19.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i20.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i21.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "pipe", type: i13.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.DatePipe, name: "date" }, { kind: "pipe", type: i2.PipeRelativeTimePipe, name: "pipeRelativeTime" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.ReplaceNbspPipe, name: "replaceNbsp" }] }); }
|
|
874
|
-
}
|
|
875
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, decorators: [{
|
|
876
|
-
type: Component,
|
|
877
|
-
args: [{ selector: 'ws-widget-app-toc-about', template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}</div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.objectives' | translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\" flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"] }]
|
|
878
|
-
}], ctorParameters: function () { return [{ type: i1.RatingService }, { type: i2.LoggerService }, { type: i3.MatLegacyDialog }, { type: i4.MatLegacySnackBar }, { type: i5.LoadCheckService }, { type: i6.TimerService }, { type: i7.AppTocService }, { type: i2.ConfigurationsService }, { type: i8.DiscussUtilsService }, { type: i9.Router }, { type: i10.ReviewComponentDataService }, { type: i11.HandleClaimService }, { type: i12.ResetRatingsService }, { type: i2.WidgetContentService }, { type: i9.ActivatedRoute }, { type: undefined, decorators: [{
|
|
879
|
-
type: Inject,
|
|
880
|
-
args: ['environment']
|
|
881
|
-
}] }]; }, propDecorators: { condition: [{
|
|
882
|
-
type: Input
|
|
883
|
-
}], kparray: [{
|
|
884
|
-
type: Input
|
|
885
|
-
}], content: [{
|
|
886
|
-
type: Input
|
|
887
|
-
}], contentReadData: [{
|
|
888
|
-
type: Input
|
|
889
|
-
}], baseContentReadData: [{
|
|
890
|
-
type: Input
|
|
891
|
-
}], skeletonLoader: [{
|
|
892
|
-
type: Input
|
|
893
|
-
}], sticky: [{
|
|
894
|
-
type: Input
|
|
895
|
-
}], tocStructure: [{
|
|
896
|
-
type: Input
|
|
897
|
-
}], pathSet: [{
|
|
898
|
-
type: Input
|
|
899
|
-
}], config: [{
|
|
900
|
-
type: Input
|
|
901
|
-
}], resumeData: [{
|
|
902
|
-
type: Input
|
|
903
|
-
}], forPreview: [{
|
|
904
|
-
type: Input
|
|
905
|
-
}], showReviews: [{
|
|
906
|
-
type: Input
|
|
907
|
-
}], batchData: [{
|
|
908
|
-
type: Input
|
|
909
|
-
}], fromViewer: [{
|
|
910
|
-
type: Input
|
|
911
|
-
}], selectedBatchData: [{
|
|
912
|
-
type: Input
|
|
913
|
-
}], selectedTabValue: [{
|
|
914
|
-
type: Input
|
|
915
|
-
}], fromMarketPlace: [{
|
|
916
|
-
type: Input
|
|
917
|
-
}], showMarketPlaceCertificate: [{
|
|
918
|
-
type: Input
|
|
919
|
-
}], languageList: [{
|
|
920
|
-
type: Input
|
|
921
|
-
}], lockCertificate: [{
|
|
922
|
-
type: Input
|
|
923
|
-
}], trigerCompletionSurveyForm: [{
|
|
924
|
-
type: Output
|
|
925
|
-
}], summaryElem: [{
|
|
926
|
-
type: ViewChild,
|
|
927
|
-
args: ['summaryElem']
|
|
928
|
-
}], objectivesElem: [{
|
|
929
|
-
type: ViewChild,
|
|
930
|
-
args: ['objectivesElem']
|
|
931
|
-
}], descElem: [{
|
|
932
|
-
type: ViewChild,
|
|
933
|
-
args: ['descElem']
|
|
934
|
-
}], tagsElem: [{
|
|
935
|
-
type: ViewChild,
|
|
936
|
-
args: ['tagsElem']
|
|
937
|
-
}], searchTagElem: [{
|
|
938
|
-
type: ViewChild,
|
|
939
|
-
args: ['searchTagElem']
|
|
940
|
-
}] } });
|
|
941
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1hYm91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWFib3V0L2FwcC10b2MtYWJvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1hYm91dC9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFzRCxTQUFTLEVBQWMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFJakssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFMUMsMkJBQTJCO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUd6QixPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUd0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFZdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUE7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFuQmxHLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDNUIsS0FBSyxD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QUFTO3VCQUFDLGdCQUFnQjtnQkFDSixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNPLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnXG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuZGF5anMuZXh0ZW5kKGlzU2FtZU9yQmVmb3JlKVxuZGF5anMuZXh0ZW5kKGlzU2FtZU9yQWZ0ZXIpXG5pbXBvcnQgaXNTYW1lT3JCZWZvcmUgZnJvbSAnZGF5anMvcGx1Z2luL2lzU2FtZU9yQmVmb3JlJ1xuaW1wb3J0IGlzU2FtZU9yQWZ0ZXIgZnJvbSAnZGF5anMvcGx1Z2luL2lzU2FtZU9yQWZ0ZXInXG5cbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uLy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFJhdGluZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9fc2VydmljZXMvcmF0aW5nLnNlcnZpY2UnXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlLCBDb25maWd1cmF0aW9uc1NlcnZpY2UsIFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IEhhbmRsZUNsYWltU2VydmljZSB9IGZyb20gJy4uL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXG5pbXBvcnQgeyBMb2FkQ2hlY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvbG9hZC1jaGVjay5zZXJ2aWNlJ1xuaW1wb3J0IHsgUmV2aWV3Q29tcG9uZW50RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9jb250ZW50LXNlcnZpY2VzL3Jldmlldy1jb21wb25lbnQtZGF0YS5zZXJ2aWNlJ1xuaW1wb3J0IHsgUmVzZXRSYXRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3Jlc2V0LXJhdGluZ3Muc2VydmljZSdcbmltcG9ydCB7IE5zQ29udGVudFN0cmlwV2l0aFRhYnMgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvY29udGVudC1zdHJpcC13aXRoLXRhYnMubW9kZWwnXG5pbXBvcnQgeyBEaXNjdXNzVXRpbHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZGlzY3Vzcy11dGlscy5zZXJ2aWNlJ1xuXG5pbXBvcnQgeyBSZXZpZXdzQ29udGVudENvbXBvbmVudCB9IGZyb20gJy4uL3Jldmlld3MtY29udGVudC9yZXZpZXdzLWNvbnRlbnQuY29tcG9uZW50J1xuaW1wb3J0IHsgQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jZXJ0aWZpY2F0ZS1kaWFsb2cvY2VydGlmaWNhdGUtZGlhbG9nLmNvbXBvbmVudCdcblxuaW50ZXJmYWNlIElTdHJpcFVuaXRDb250ZW50RGF0YSB7XG4gIGtleTogc3RyaW5nXG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhblxuICBtb2RlPzogc3RyaW5nXG4gIHNob3dTdHJpcDogYm9vbGVhblxuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXVxuICBzdHJpcFRpdGxlOiBzdHJpbmdcbiAgc3RyaXBUaXRsZUxpbms/OiB7XG4gICAgbGluazogc3RyaW5nLFxuICAgIGljb246IHN0cmluZ1xuICB9LFxuICBzbGlkZXJDb25maWc/OiB7XG4gICAgc2hvd05hdnM6IGJvb2xlYW4sXG4gICAgc2hvd0RvdHM6IGJvb2xlYW4sXG4gICAgbWF4V2lkZ2V0cz86IG51bWJlclxuICB9LFxuICB0YWJzPzogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVGFiW10gfCB1bmRlZmluZWQsXG4gIHN0cmlwTmFtZT86IHN0cmluZ1xuICBzdHJpcExvZ28/OiBzdHJpbmdcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgc3RyaXBJbmZvPzogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JU3RyaXBJbmZvXG4gIG5vRGF0YVdpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhXG4gIGVycm9yV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFcbiAgc2hvd09uTm9EYXRhOiBib29sZWFuXG4gIHNob3dPbkxvYWRlcjogYm9vbGVhblxuICBzaG93T25FcnJvcjogYm9vbGVhblxuICBsb2FkZXJXaWRnZXRzPzogYW55XG4gIHN0cmlwQmFja2dyb3VuZD86IHN0cmluZ1xuICBzZWNvbmRhcnlIZWFkaW5nPzogYW55XG4gIHZpZXdNb3JlVXJsOiBhbnksXG4gIHNlY3RvcldpZGdldHM/OiBhbnlcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3Mtd2lkZ2V0LWFwcC10b2MtYWJvdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1hYm91dC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtYWJvdXQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NBYm91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIFxuICBASW5wdXQoKSBjb25kaXRpb246IGFueVxuICBASW5wdXQoKSBrcGFycmF5OiBhbnlcbiAgQElucHV0KCkgY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBiYXNlQ29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBASW5wdXQoKSBza2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIEBJbnB1dCgpIHN0aWNreSA9IGZhbHNlXG4gIEBJbnB1dCgpIHRvY1N0cnVjdHVyZTogYW55XG4gIEBJbnB1dCgpIHBhdGhTZXQ6IGFueVxuICBASW5wdXQoKSBjb25maWc6IGFueVxuICBASW5wdXQoKSByZXN1bWVEYXRhOiBhbnlcbiAgQElucHV0KCkgZm9yUHJldmlldyA9IGZhbHNlXG4gIEBJbnB1dCgpIHNob3dSZXZpZXdzID0gZmFsc2VcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiBhbnlcbiAgQElucHV0KCkgZnJvbVZpZXdlciA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcbiAgQElucHV0KCkgc2VsZWN0ZWRUYWJWYWx1ZSA9IDBcbiAgQElucHV0KCkgZnJvbU1hcmtldFBsYWNlPyA9IGZhbHNlXG4gIEBJbnB1dCgpIHNob3dNYXJrZXRQbGFjZUNlcnRpZmljYXRlID0gZmFsc2VcbiAgQElucHV0KCkgbGFuZ3VhZ2VMaXN0ID0gW11cbiAgQElucHV0KCkgbG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgQE91dHB1dCgpIHRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpXG4gIEBWaWV3Q2hpbGQoJ3N1bW1hcnlFbGVtJykgc3VtbWFyeUVsZW0gITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdvYmplY3RpdmVzRWxlbScpIG9iamVjdGl2ZXNFbGVtICE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnZGVzY0VsZW0nKSBkZXNjRWxlbSAhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ3RhZ3NFbGVtJykgdGFnc0VsZW0gITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdzZWFyY2hUYWdFbGVtJykgc2VhcmNoVGFnRWxlbSAhOiBFbGVtZW50UmVmXG4gIGRpc2FibGVDZXJ0aWZpY2F0ZSA9IGZhbHNlXG5cbiAgcHJpbWFyeUNhdGVnb3J5ID0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnlcbiAgc3RyaXBzUmVzdWx0RGF0YU1hcCE6IHsgW2tleTogc3RyaW5nXTogSVN0cmlwVW5pdENvbnRlbnREYXRhIH1cbiAgc3VtbWFyeSA9IHtcbiAgICBlbGxpcHNpczogZmFsc2UsXG4gICAgdmlld0xlc3M6IGZhbHNlLFxuICB9XG4gIGRlc2NyaXB0aW9uID0ge1xuICAgIGVsbGlwc2lzOiBmYWxzZSxcbiAgICB2aWV3TGVzczogZmFsc2UsXG4gIH1cbiAgb2JqZWN0aXZlcyA9IHtcbiAgICBlbGxpcHNpczogZmFsc2UsXG4gICAgdmlld0xlc3M6IGZhbHNlLFxuICB9XG4gIHRhZ3NFbGxpcHNpcyA9IGZhbHNlXG4gIHNlYXJjaFRhZ3NFbGxpcHNpcyA9IGZhbHNlXG4gIGNvbXBldGVuY3lTZWxlY3RlZCA9ICcnXG4gIHJhdGluZ1N1bW1hcnk6IGFueVxuICBhdXRoUmVwbGllczogYW55XG4gIHJhdGluZ1N1bW1hcnlQcm9jZXNzZWQ6IGFueVxuICB0b3BSYXRpbmdSZXZpZXdzOiBhbnlbXSA9IFtdXG4gIHJhdGluZ1Jldmlld3M6IGFueVtdID0gW11cbiAgbGF0ZXN0UmV2aWV3czogYW55W10gPSBbXVxuICBkaWFsb2dSZWY6IGFueVxuICBkaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgbG9va3VwTG9hZGluZzogQm9vbGVhbiA9IHRydWVcbiAgbGFzdExvb2tVcDogYW55XG4gIHJhdGluZ0xvb2t1cDogYW55XG4gIHJldmlld1BhZ2UgPSAxXG4gIHJldmlld0RlZmF1bHRMaW1pdCA9IDJcbiAgbG9va3VwTGltaXQgPSAzXG4gIHJhdGluZ1ZpZXdDb3VudCA9IDNcbiAgcmF0aW5nVmlld0NvdW50RGVmYXVsdCA9IDNcbiAgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSBbXVxuICBwcml2YXRlIGRlc3Ryb3lTdWJqZWN0JCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICB2aWV3TW9yZVRhZ3MgPSBmYWxzZVxuICB0aW1lclVuc3Vic2NyaWJlOiBhbnlcbiAgZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuXG4gIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0ID0ge1xuICAgIGtleTogJ2JsZW5kZWRQcm9ncmFtcycsXG4gICAgbG9nbzogJycsXG4gICAgdGl0bGU6ICdCbGVuZGVkIFByb2dyYW0nLFxuICAgIHN0cmlwVGl0bGVMaW5rOiB7XG4gICAgICBsaW5rOiAnJyxcbiAgICAgIGljb246ICcnLFxuICAgIH0sXG4gICAgc2xpZGVyQ29uZmlnOiB7XG4gICAgICBzaG93TmF2czogdHJ1ZSxcbiAgICAgIHNob3dEb3RzOiBmYWxzZSxcbiAgICB9LFxuICAgIGxvYWRlcjogdHJ1ZSxcbiAgICBzdHJpcEJhY2tncm91bmQ6ICcnLFxuICAgIHRpdGxlRGVzY3JpcHRpb246ICdCbGVuZGVkIFByb2dyYW0nLFxuICAgIHN0cmlwQ29uZmlnOiB7XG4gICAgICBjYXJkU3ViVHlwZTogJ3N0YW5kYXJkJyxcbiAgICB9LFxuICAgIHZpZXdNb3JlVXJsOiB7XG4gICAgICBwYXRoOiAnJyxcbiAgICAgIHZpZXdNb3JlVGV4dDogJ1Nob3cgYWxsJyxcbiAgICAgIHF1ZXJ5UGFyYW1zOiAnJyxcbiAgICB9LFxuICAgIHRhYnM6IFtdLFxuICAgIGZpbHRlcnM6IFtdXG4gIH1cblxuICB0aW1lcjogYW55ID0ge31cbiAgaXNNb2JpbGUgPSBmYWxzZVxuICBjb21wZW50ZW5jeUtleSE6IE5zQ29udGVudC5JQ29tcGVudGVuY3lLZXlzXG4gIHNlY3RvcnNMaXN0OiBhbnlbXSA9IFtdXG4gIHN1YlNlY3RvcnNMaXN0OiBhbnlbXSA9IFtdXG4gIHVzZXJQcm9maWxlOiBhbnkgPSBudWxsXG4gIHN1YlNlY3RvckRldGFpbEFycjogYW55ID0gW11cbiAgc2VsZWN0ZWRTZWN0b3IgPSAnJ1xuICBzZWxlY3RlZFNlY3RvcklkID0gJydcbiAgcmVmcmVzaHJhdGluZ1N1YlxuICBwYWdlQ29uZmlnRGF0YTogYW55XG4gIGVudmlyb25tZW50ITogYW55XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmF0aW5nU2VydmljZTogUmF0aW5nU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlclNlcnZpY2U6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGxvYWRDaGVja1NlcnZpY2U6IExvYWRDaGVja1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcbiAgICBwcml2YXRlIHRvY1N2YzogQXBwVG9jU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRpc2N1c3NVdGlsaXR5U3ZjOiBEaXNjdXNzVXRpbHNTZXJ2aWNlLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJldmlld0RhdGFTZXJ2aWNlOiBSZXZpZXdDb21wb25lbnREYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzZXRSYXRpbmdzU2VydmljZTogUmVzZXRSYXRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRcbiAgICB0aGlzLnJlZnJlc2hyYXRpbmdTdWIgPSB0aGlzLnJlc2V0UmF0aW5nc1NlcnZpY2UucmVzZXRSYXRpbmdzJC5zdWJzY3JpYmUoKF9yZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgIH0pXG4gIH1cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wYWdlQ29uZmlnRGF0YSA9IHRoaXMuYWN0aXZhdGVkUm91dGU/LnNuYXBzaG90Py5kYXRhPy5wYWdlRGF0YT8uZGF0YVxuICAgIHRoaXMuY29tcGVudGVuY3lLZXkgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29tcGVudGVuY3lbdGhpcy5lbnZpcm9ubWVudC5jb21wZW50ZW5jeVZlcnNpb25LZXldXG4gICAgdGhpcy51c2VyUHJvZmlsZSA9IHRoaXMuY29uZmlnU2VydmljZS51c2VyUHJvZmlsZVxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMjAwKSB7XG4gICAgICB0aGlzLmlzTW9iaWxlID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzTW9iaWxlID0gZmFsc2VcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgLy8gdGhpcy5sb2FkQ29tcGV0ZW5jaWVzKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb250ZW50SWQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRJZC5pbmNsdWRlcygnZXh0XycpKSB7XG4gICAgICAvLyB0aGlzLmxvYWRDb21wZXRlbmNpZXMoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudFsnc3ViVGhlbWUnXSA9IHRoaXMuZ2V0U3ViVGhlbWVzKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DQVNFX1NUVURZKSB7XG4gICAgICB0aGlzLmRpc2FibGVDZXJ0aWZpY2F0ZSA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5zZWN0b3JEZXRhaWxzX3YxKSB7XG4gICAgICAvLyBQYXJzZSBzdHJpbmcgdG8gYXJyYXkgaWYgbmVlZGVkXG4gICAgICBsZXQgc2VjdG9yRGV0YWlsc0FycmF5ID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFcblxuICAgICAgLy8gSWYgaXQncyBhIHN0cmluZywgdHJ5IHRvIHBhcnNlIGl0IGludG8gYW4gYXJyYXlcbiAgICAgIGlmICh0eXBlb2Ygc2VjdG9yRGV0YWlsc0FycmF5ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheSA9IEpTT04ucGFyc2Uoc2VjdG9yRGV0YWlsc0FycmF5KVxuICAgICAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxID0gc2VjdG9yRGV0YWlsc0FycmF5XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHNlY3RvckRldGFpbHNfdjE6JywgZSlcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBbXVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3Mgb25seSBpZiB3ZSBoYXZlIGEgdmFsaWQgYXJyYXkgd2l0aCBpdGVtc1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VjdG9yRGV0YWlsc0FycmF5KSAmJiBzZWN0b3JEZXRhaWxzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnNlY3Rvck5hbWUgJiYgaXRlbT8uc2VjdG9ySWQpXG4gICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHNlY3RvcklkOiBpdGVtLnNlY3RvcklkLFxuICAgICAgICAgICAgICBzZWN0b3JOYW1lOiBpdGVtLnNlY3Rvck5hbWVcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAnc2VjdG9yTmFtZSdcbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuc3ViU2VjdG9yc0xpc3QgPSBfLnVuaXFCeShcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXlcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbT8uc3ViU2VjdG9yTmFtZSAmJiBpdGVtPy5zdWJTZWN0b3JJZClcbiAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgc3ViU2VjdG9ySWQ6IGl0ZW0uc3ViU2VjdG9ySWQsXG4gICAgICAgICAgICAgIHN1YlNlY3Rvck5hbWU6IGl0ZW0uc3ViU2VjdG9yTmFtZVxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICdzdWJTZWN0b3JOYW1lJ1xuICAgICAgICApXG5cbiAgICAgICAgaWYgKHRoaXMuc2VjdG9yc0xpc3QgJiYgdGhpcy5zZWN0b3JzTGlzdC5sZW5ndGggJiYgdGhpcy5zZWN0b3JzTGlzdFswXSkge1xuICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJzZWN0b3IodGhpcy5zZWN0b3JzTGlzdFswXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgIGlmIChcbiAgICAgIHRoaXMuY29udGVudD8uY29udGVudElkICYmXG4gICAgICB0aGlzLmNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5kYXRhICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouZGF0YSkubGVuZ3RoID09PSAwICYmXG4gICAgICB0aGlzLmNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9PT0gMlxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKTtcbiAgICB9XG5cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyU2VydmljZS5nZXRUaW1lckRhdGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGltZXIgPSBfdGltZXJcbiAgICAgIH0pXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5jb21wZW50ZW5jeUtleSA9IHRoaXMuY29uZmlnU2VydmljZS5jb21wZW50ZW5jeVt0aGlzLmVudmlyb25tZW50LmNvbXBlbnRlbmN5VmVyc2lvbktleV1cbiAgICBpZiAoY2hhbmdlcy5zZWxlY3RlZFRhYlZhbHVlICYmIGNoYW5nZXMuc2VsZWN0ZWRUYWJWYWx1ZS5jdXJyZW50VmFsdWUgPT09IDApIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdW1tYXJ5RWxlbSAmJiB0aGlzLnN1bW1hcnlFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNzIpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeS5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5kZXNjRWxlbSAmJiB0aGlzLmRlc2NFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNzIpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24uZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm9iamVjdGl2ZXNFbGVtICYmIHRoaXMub2JqZWN0aXZlc0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA3Mikge1xuICAgICAgICAgICAgdGhpcy5vYmplY3RpdmVzLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5zdW1tYXJ5RWxlbSAmJiB0aGlzLnN1bW1hcnlFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDgpIHtcbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeS5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5kZXNjRWxlbSAmJiB0aGlzLmRlc2NFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDgpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24uZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm9iamVjdGl2ZXNFbGVtICYmIHRoaXMub2JqZWN0aXZlc0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA0OCkge1xuICAgICAgICAgICAgdGhpcy5vYmplY3RpdmVzLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnRhZ3NFbGVtICYmIHRoaXMudGFnc0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA2NCkge1xuICAgICAgICAgIHRoaXMudGFnc0VsbGlwc2lzID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoVGFnRWxlbSAmJiB0aGlzLnNlYXJjaFRhZ0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA2NCkge1xuICAgICAgICAgIHRoaXMuc2VhcmNoVGFnc0VsbGlwc2lzID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LCA1MDApXG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuc2tlbGV0b25Mb2FkZXIgJiYgIWNoYW5nZXMuc2tlbGV0b25Mb2FkZXIuY3VycmVudFZhbHVlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNvbXBvbmVudExvYWRlZCh0cnVlKVxuICAgICAgfSwgNTAwKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0ge1xuICAgICAgICBhc3Nlc3NtZW50OiAwLFxuICAgICAgICBjb3Vyc2U6IDAsXG4gICAgICAgIGhhbmRzT246IDAsXG4gICAgICAgIGludGVyYWN0aXZlVmlkZW86IDAsXG4gICAgICAgIGxlYXJuaW5nTW9kdWxlOiAwLFxuICAgICAgICBvdGhlcjogMCxcbiAgICAgICAgcGRmOiAwLFxuICAgICAgICBzdXJ2ZXk6IDAsXG4gICAgICAgIHBvZGNhc3Q6IDAsXG4gICAgICAgIHByYWN0aWNlVGVzdDogMCxcbiAgICAgICAgZmluYWxUZXN0OiAwLFxuICAgICAgICBxdWl6OiAwLFxuICAgICAgICB2aWRlbzogMCxcbiAgICAgICAgd2ViTW9kdWxlOiAwLFxuICAgICAgICB3ZWJQYWdlOiAwLFxuICAgICAgICB5b3V0dWJlOiAwLFxuICAgICAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgICAgIG9mZmxpbmVTZXNzaW9uOiAwLFxuICAgICAgfVxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUubGVhcm5pbmdNb2R1bGUgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIFVuaXQnID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5jb3Vyc2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJyA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB0aGlzLnRvY1N2Yy5nZXRUb2NTdHJ1Y3R1cmUodGhpcy5jb250ZW50LCB0aGlzLnRvY1N0cnVjdHVyZSlcbiAgICAgIGZvciAoY29uc3QgcHJvZ1R5cGUgaW4gdGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9jU3RydWN0dXJlW3Byb2dUeXBlXSA+IDApIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgIGlmICh0aGlzLnJhdGluZ1N1bW1hcnkgJiYgT2JqZWN0LmtleXModGhpcy5yYXRpbmdTdW1tYXJ5KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmZldGNoUmF0aW5nU3VtbWFyeSgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcGV0ZW5jaWVzT2JqZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubG9hZENvbXBldGVuY2llcygpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkICYmIHRoaXMuY29udGVudC5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKSkge1xuICAgICAgICBpZiAodGhpcy5jb21wZXRlbmNpZXNPYmplY3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5sb2FkQ29tcGV0ZW5jaWVzKClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGFbJ3N1YlRoZW1lJ10gPSB0aGlzLmdldFN1YlRoZW1lcygpXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNBU0VfU1RVRFkpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlQ2VydGlmaWNhdGUgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YT8uc2VjdG9yRGV0YWlsc192MSkge1xuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgdG8gYXJyYXkgaWYgbmVlZGVkXG4gICAgICAgIGxldCBzZWN0b3JEZXRhaWxzQXJyYXkgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIHN0cmluZywgdHJ5IHRvIHBhcnNlIGl0IGludG8gYW4gYXJyYXlcbiAgICAgICAgaWYgKHR5cGVvZiBzZWN0b3JEZXRhaWxzQXJyYXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheSA9IEpTT04ucGFyc2Uoc2VjdG9yRGV0YWlsc0FycmF5KVxuICAgICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MSA9IHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc2VjdG9yRGV0YWlsc192MTonLCBlKVxuICAgICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5ID0gW11cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIG9ubHkgaWYgd2UgaGF2ZSBhIHZhbGlkIGFycmF5IHdpdGggaXRlbXNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VjdG9yRGV0YWlsc0FycmF5KSAmJiBzZWN0b3JEZXRhaWxzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIC8vIEV4dHJhY3QgdW5pcXVlIHNlY3RvcnMgdXNpbmcgbG9kYXNoXG4gICAgICAgICAgdGhpcy5zZWN0b3JzTGlzdCA9IF8udW5pcUJ5KFxuICAgICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XG4gICAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbT8uc2VjdG9yTmFtZSAmJiBpdGVtPy5zZWN0b3JJZClcbiAgICAgICAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgIHNlY3RvcklkOiBpdGVtLnNlY3RvcklkLFxuICAgICAgICAgICAgICAgIHNlY3Rvck5hbWU6IGl0ZW0uc2VjdG9yTmFtZVxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAnc2VjdG9yTmFtZSdcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzdWJzZWN0b3JzIHVzaW5nIGxvZGFzaFxuICAgICAgICAgIHRoaXMuc3ViU2VjdG9yc0xpc3QgPSBfLnVuaXFCeShcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnN1YlNlY3Rvck5hbWUgJiYgaXRlbT8uc3ViU2VjdG9ySWQpXG4gICAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzdWJTZWN0b3JJZDogaXRlbS5zdWJTZWN0b3JJZCxcbiAgICAgICAgICAgICAgICBzdWJTZWN0b3JOYW1lOiBpdGVtLnN1YlNlY3Rvck5hbWVcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgJ3N1YlNlY3Rvck5hbWUnXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgfVxuXG4gIGdldFN1YlRoZW1lcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3ViVGhlbWVBcnI6IGFueVtdID0gW11cbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb21wZW50ZW5jeUtleSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0ubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPT09ICdzdHJpbmcnICYmIHRoaXMuY2hlY2tWYWxpZEpTT04odGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9IEpTT04ucGFyc2UodGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSlcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX2NvbXBldGVuY3lPYmo6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc3ViVGhlbWVBcnIuaW5kZXhPZihfY29tcGV0ZW5jeU9ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKSA9PT0gLTEpIHtcbiAgICAgICAgICBzdWJUaGVtZUFyci5wdXNoKF9jb21wZXRlbmN5T2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBzdWJUaGVtZUFyclxuICB9XG5cbiAgbG9hZENvbXBldGVuY2llcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldLmxlbmd0aCkge1xuICAgICAgY29uc3QgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSB7fVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9PT0gJ3N0cmluZydcbiAgICAgICAgJiYgdGhpcy5jaGVja1ZhbGlkSlNPTih0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPSBKU09OLnBhcnNlKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldKVxuICAgICAgfVxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX29iajogYW55KSA9PiB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dKSB7XG4gICAgICAgICAgaWYgKGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICBbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5VGhlbWVdXSkge1xuICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVRoZW1lID0gY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVxuICAgICAgICAgICAgW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIGlmIChjb21wZXRlbmN5VGhlbWUuaW5kZXhPZihfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pID09PSAtMSkge1xuICAgICAgICAgICAgICBjb21wZXRlbmN5VGhlbWUucHVzaChfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dXG4gICAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXSA9IHt9XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcGV0ZW5jaWVzT2JqZWN0KSB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wWyd2YWx1ZSddID0gY29tcGV0ZW5jaWVzT2JqZWN0W2tleV1cbiAgICAgICAgICB0aGlzLmNvbXBldGVuY2llc09iamVjdC5wdXNoKF90ZW1wKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZVNob3dDb21wZXRlbmNpZXModGhpcy5jb21wZXRlbmNpZXNPYmplY3RbMF0pXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU2hvd0NvbXBldGVuY2llcyhpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCA9IGl0ZW0ua2V5XG4gICAgY29uc3QgdmFsdWVPYmogPSBpdGVtLnZhbHVlXG4gICAgY29uc3QgY29tcGV0ZW5jeUFycmF5ID0gW11cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgaWYgKHZhbHVlT2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3QgX3RlbXBPYmo6IGFueSA9IHt9XG4gICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICBfdGVtcE9ialsndmFsdWUnXSA9IHZhbHVlT2JqW2tleV1cbiAgICAgICAgY29tcGV0ZW5jeUFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RyaXBbJ2xvYWRlcldpZGdldHMnXSA9IFtdXG4gICAgdGhpcy5zdHJpcFsnbG9hZGVyV2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldCh0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCwgY29tcGV0ZW5jeUFycmF5LCB0aGlzLnN0cmlwKVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldChcbiAgICBjb21wZXRlbmN5QXJlYTogc3RyaW5nLFxuICAgIGNvbXBldGVuY3lBcnJPYmplY3Q6IGFueSxcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIHJldHVybiAoY29tcGV0ZW5jeUFyck9iamVjdCB8fCBbXSkubWFwKChjb250ZW50OiBhbnksIGlkeDogbnVtYmVyKSA9PiAoXG4gICAgICBjb250ZW50ID8ge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjb21wZXRlbmN5Q2FyZCcsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21yLTQnLFxuICAgICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBjb21wZXRlbmN5QXJlYSxcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHdpZGdldFR5cGU6ICdjYXJkJyxcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NvbXBldGVuY3lDYXJkJyxcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbXItNCcsXG4gICAgICAgIHdpZGdldERhdGE6IHt9LFxuICAgICAgfVxuICAgICkpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hSYXRpbmdTdW1tYXJ5KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgdGhpcy5yYXRpbmdTZXJ2aWNlLmdldFJhdGluZ1N1bW1hcnkodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpLnN1YnNjcmliZShcbiAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeSA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYXRpbmdTdW1tYXJ5ID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGlkZSBsb2FkZXIgZm9yIE1hdERpYWxvZy4uLlxuICAgICAgICAgIGlmICh0aGlzLmRpYWxvZ1JlZikgeyB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2UgfVxuICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCA9IHRoaXMucHJvY2Vzc1JhdGluZ1N1bW1hcnkoKVxuICAgICAgICAgIC8vIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggcmF0aW5nIHN1bW1hcnksIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBmZXRjaFJhdGluZ0xvb2t1cCgpIHtcbiAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSB0cnVlXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBhY3Rpdml0eVR5cGU6IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGxpbWl0OiB0aGlzLmxvb2t1cExpbWl0LFxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF0aW5nU2VydmljZS5nZXRSYXRpbmdMb29rdXAocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFRvIGRpc2FibGUgdGhlIGxvYWRlciBpbiB0aGUgbW9kYWwuXG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV2aWV3UGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgcmVzLnJlc3VsdC5yZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYXRpbmdMb29rdXAuZmluZCgobzogYW55KSA9PiBvLnVwZGF0ZWRPblVVSUQgPT09IGl0ZW0udXBkYXRlZE9uVVVJRCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucmF0aW5nTG9va3VwLnB1c2goaXRlbSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByb2Nlc3NSYXRpbmdMb29rdXAocmVzLnJlc3VsdC5yZXNwb25zZSlcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7ICAgLy8gVG8gZGlzYWJsZSB0aGUgbG9hZGVyIGluIHRoZSBtb2RhbC5cbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBsb2FkIHJldmlld3MsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzUmF0aW5nTG9va3VwKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPCB0aGlzLmxvb2t1cExpbWl0KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gcmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nTG9va3VwXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KHRoaXMubGF0ZXN0UmV2aWV3cywgJ3VzZXJJZCcpXG4gICAgICBjb25zdCB1c2VySWRzID0gXy5tYXAodGhpcy5sYXRlc3RSZXZpZXdzLCAndXNlcklkJylcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdXNlcklkcykge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yYXRpbmdSZXZpZXdzKSB7XG4gICAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nUmV2aWV3cy5zbGljZSgpXG4gICAgICAgIHRoaXMucmV2aWV3RGF0YVNlcnZpY2Uuc2V0UmV2aWV3RGF0YSh0aGlzLnJhdGluZ1Jldmlld3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXV0aG9yUmVwbHkoaWRlbnRpZmllcjogc3RyaW5nLCBwcmltYXJ5Q2F0ZWdvcnk6IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2aXR5VHlwZTogcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICB1c2VySWQ6IHVzZXJJZHMsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJhdGluZ1NlcnZpY2UuZ2V0UmF0aW5nUmVwbHkocmVxdWVzdCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICBjb25zdCByYXRpbmdBdXRoUmVwbGF5ID0gcmVzLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgXy5mb3JFYWNoKHJhdGluZ0F1dGhSZXBsYXksIHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF0pIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoUmVwbGllc1t2YWx1ZS51c2VySWRdWydjb21tZW50J10gPSB2YWx1ZS5jb21tZW50XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsndXNlcklkJ10gPSB2YWx1ZS51c2VySWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXRlc3RSZXZpZXdzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmF1dGhSZXBsaWVzKVxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoUmVwbGllc1xuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIGF1dGhvciByZXBsaWVzLCBkdWUgdG8gc29tZSBlcnJvciEnKVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIGNvdW50U3RhcnNQZXJjZW50YWdlKHZhbHVlOiBhbnksIGtleTogYW55LCB0b3RhbDogYW55KSB7XG4gICAgaWYgKHZhbHVlICYmIHRvdGFsKSB7XG4gICAgICByZXR1cm4gKCgodmFsdWUgKiBrZXkpIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDIpXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuICBwcm9jZXNzUmF0aW5nU3VtbWFyeSgpIHtcbiAgICBjb25zdCBicmVha0Rvd25BcnJheTogYW55W10gPSBbXVxuICAgIGNvbnN0IHJhdGluZ1N1bW1hcnlQciA9IHtcbiAgICAgIGJyZWFrRG93bjogYnJlYWtEb3duQXJyYXksXG4gICAgICBsYXRlc3Q1MFJldmlld3M6IGJyZWFrRG93bkFycmF5LFxuICAgICAgcmF0aW5nc051bWJlcjogYnJlYWtEb3duQXJyYXksXG4gICAgICB0b3RhbF9udW1iZXJfb2ZfcmF0aW5nczogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxfbnVtYmVyX29mX3JhdGluZ3MnKSB8fCAwLFxuICAgICAgYXZnUmF0aW5nOiAwLFxuICAgIH1cblxuICAgIGNvbnN0IHRvdFJhdGluZ3MgPSBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICdzdW1fb2ZfdG90YWxfcmF0aW5ncycpIHx8IDBcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50MXN0YXJzJyksIDEsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiAxLFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSwgMiwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDIsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLFxuICAgIH0pXG4gICAgcmF0aW5nU3VtbWFyeVByLmJyZWFrRG93bi5wdXNoKHtcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLCAzLCB0b3RSYXRpbmdzKSxcbiAgICAgIGtleTogMyxcbiAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50M3N0YXJzJyksXG4gICAgfSlcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50NHN0YXJzJyksIDQsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiA0LFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSwgNSwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDUsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLFxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpIHtcbiAgICAgIGNvbnN0IGxhdGVzdDUwUmV2aWV3cyA9IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cylcbiAgICAgIGNvbnN0IG1vZGlmaWVkUmV2aWV3cyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgcmF0aW5nID0+IHtcbiAgICAgICAgcmF0aW5nWyd1c2VySWQnXSA9IHJhdGluZy51c2VyX2lkXG4gICAgICAgIHJldHVybiByYXRpbmdcbiAgICAgIH0pXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgY29uc3QgdXNlcklkcyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICByYXRpbmdTdW1tYXJ5UHIubGF0ZXN0NTBSZXZpZXdzID0gbW9kaWZpZWRSZXZpZXdzXG4gICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSBtb2RpZmllZFJldmlld3NcbiAgICAgIHRoaXMudG9wUmF0aW5nUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xuICAgIH1cbiAgICAvLyBUbyBwYXNzIGRhdGEgdG8gdGhlIHJldmlldyBjb250ZW50XG4gICAgdGhpcy5yZXZpZXdEYXRhU2VydmljZS5zZXRSZXZpZXdEYXRhKHRoaXMucmF0aW5nUmV2aWV3cylcblxuICAgIGlmICh0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKSB7XG4gICAgICByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID1cbiAgICAgICAgcGFyc2VGbG9hdCgodGhpcy5yYXRpbmdTdW1tYXJ5LnN1bV9vZl90b3RhbF9yYXRpbmdzIC8gdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKS50b0ZpeGVkKDEpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZ1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLnRvdGFsX251bWJlcl9vZl9yYXRpbmdzXG4gICAgfVxuICAgIHJldHVybiByYXRpbmdTdW1tYXJ5UHJcbiAgfVxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0ZW1wU3RyID0gc3RyXG4gICAgaWYgKHRlbXBTdHIpIHtcbiAgICAgIHRlbXBTdHIgPSB0ZW1wU3RyLnNwbGl0KCdfeDAwMERfLCcpLmpvaW4oJycpXG4gICAgfVxuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHRlbXBTdHIgJiYgdHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRlbXBTdHIuc3BsaXQoJyAnKS5tYXAoX3N0ciA9PiB7XG4gICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgfSkuam9pbignICcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGVtcFN0ciAmJiAodGVtcFN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRlbXBTdHIuc2xpY2UoMSkpXG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgaGFuZGxlT3BlblJldmlld01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihSZXZpZXdzQ29udGVudENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7IHJhdGluZ3M6IHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCwgcmV2aWV3czogdGhpcy5hdXRoUmVwbGllcywgbGF0ZXN0UmV2aWV3czogdGhpcy5yYXRpbmdMb29rdXAgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICdyYXRpbmdzLW1vZGFsLWJveCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChfcmVzdWx0OiBhbnkpID0+IHtcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhdGVMb2FkTW9yZS5zdWJzY3JpYmUoKF92YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmxvYWRNb3JlKF92YWx1ZSlcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UubG9hZExhdGVzdFJldmlld3Muc3Vic2NyaWJlKChfdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUxvYWRlciA9IHRydWVcbiAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yYXRpbmdWaWV3Q291bnREZWZhdWx0XG4gICAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cbiAgICAgIHRoaXMucmV2aWV3UGFnZSA9IDFcbiAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGlmIChfdmFsdWUgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxvYWRNb3JlKHNlbGVjdGVkUmV2aWV3OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZUxvYWRNb3JlKSB7XG4gICAgICB0aGlzLmxvb2t1cExvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXG4gICAgICB0aGlzLnJhdGluZ1ZpZXdDb3VudCA9IHRoaXMucmV2aWV3UGFnZSAqIHRoaXMucmV2aWV3RGVmYXVsdExpbWl0XG4gICAgICBpZiAoc2VsZWN0ZWRSZXZpZXcgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxuICAgICAgICB0aGlzLmZldGNoUmF0aW5nTG9va3VwKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgodGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnQpID4gdGhpcy5yYXRpbmdSZXZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJhdGluZ1ZpZXdDb3VudFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlVG9EaXNjdXNzaW9uSHViKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIG1lbnVPcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ2FsbC1kaXNjdXNzaW9ucycsXG4gICAgICAgICAgbGFiZWw6ICdBbGwgZGlzY3Vzc2lvbnMnLFxuICAgICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJvdXRlOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzJyxcbiAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ3RhZ3MnLFxuICAgICAgICAgIGxhYmVsOiAnVGFncycsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGU6ICdteS1kaXNjdXNzaW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1lvdXIgZGlzY3Vzc2lvbicsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgcm91dGU6ICdsZWFkZXJib2FyZCcsXG4gICAgICAgIC8vICAgbGFiZWw6ICdMZWFkZXIgQm9hcmQnLFxuICAgICAgICAvLyAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgLy8gfSxcbiAgICAgIF0sXG4gICAgICB1c2VyTmFtZTogKHRoaXMuY29uZmlnU2VydmljZS5ub2RlYmJVc2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1NlcnZpY2Uubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBpZDogMSxcbiAgICAgIH0sXG4gICAgICBjYXRlZ29yaWVzOiB7IHJlc3VsdDogW10gfSxcbiAgICAgIHJvdXRlclNsdWc6ICcvYXBwJyxcbiAgICAgIGhlYWRlck9wdGlvbnM6IGZhbHNlLFxuICAgICAgYmFubmVyT3B0aW9uOiB0cnVlLFxuICAgIH1cbiAgICB0aGlzLmRpc2N1c3NVdGlsaXR5U3ZjLnNldERpc2N1c3Npb25Db25maWcoY29uZmlnKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdob21lJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSlcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHAvZGlzY3Vzc2lvbi1mb3J1bSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHBhZ2U6ICdob21lJyB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnIH0pXG4gIH1cblxuICBoYW5kbGVDbGlja09mQ2xhaW0oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlQ2xhaW1TZXJ2aWNlLnNldENsYWltRGF0YShldmVudClcbiAgfVxuICBcbiAgZ2V0Q291cnNlSWRGb3JDZXJ0aWZpY2F0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcbiAgICBpZiAodGhpcy5jb250ZW50Py5jb250ZW50SWQ/LmluY2x1ZGVzKCdleHRfJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudElkO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFyYW1JZCB8fCAnJztcbiAgfVxuXG4gIC8vICBoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKSB7XG4gIC8vICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IHRydWU7XG4gIC8vICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZDtcblxuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5wYWdlQ29uZmlnRGF0YSkge1xuICAvLyAgICAgY29uc3QgYWxsb3dlZFByaW1hcnlDYXRlZ29yeSA9XG4gIC8vICAgICAgIHRoaXMucGFnZUNvbmZpZ0RhdGE/LmR5bmFtaWNDZXJ0aWZpY2F0ZUdlbmVyYXRpb24/LmFsbG93cyAmJlxuICAvLyAgICAgICB0aGlzLnBhZ2VDb25maWdEYXRhPy5keW5hbWljQ2VydGlmaWNhdGVHZW5lcmF0aW9uPy5hbGxvd3M/Lm1hcChcbiAgLy8gICAgICAgICAoY2F0OiBzdHJpbmcpID0+IGNhdD8udG9Mb3dlckNhc2UoKVxuICAvLyAgICAgICApO1xuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkgJiZcbiAgLy8gICAgICAoIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkuaW5jbHVkZXModGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpIHx8IFxuICAvLyAgICAgICBhbGxvd2VkUHJpbWFyeUNhdGVnb3J5LmluY2x1ZGVzKHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpKVxuICAvLyAgICAgKSB7XG4gIC8vICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAvLyAgICAgICAgICAgY291cnNlSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAvLyAgICAgICAgICAgYmF0Y2hJZDogdGhpcy5iYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoSWQgfHwgJycsXG4gIC8vICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlclByb2ZpbGUudXNlcklkLFxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgIH07XG4gIC8vICAgICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnRWMihwYXlsb2FkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gIC8vICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgIFxuICAvLyAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XG4gIC8vICAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgLy8gICAgICAgICAgICAgICAgIGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxuICAvLyAgICAgICAgICAgICAgICAgY2VydElkOlxuICAvLyAgICAgICAgICAgICAgICAgICAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWQpIHx8ICcnLFxuICAvLyAgICAgICAgICAgICAgIH0sXG4gIC8vICAgICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKTtcbiAgLy8gICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICAgJ1VuYWJsZSB0byBWaWV3IENlcnRpZmljYXRlLCBkdWUgdG8gc29tZSBlcnJvciEnXG4gIC8vICAgICAgICAgICApO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgKTtcbiAgLy8gICAgIH0gZWxzZSB7ZGVidWdnZXJcbiAgLy8gICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnQoY2VydElkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAvLyAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXVsnY2VydERhdGEnXSA9XG4gIC8vICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VsdC5wcmludFVyaTtcbiAgLy8gICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgLy8gICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICBkYXRhOiB7XG4gIC8vICAgICAgICAgICAgICAgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmksXG4gIC8vICAgICAgICAgICAgICAgY2VydElkOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZCxcbiAgLy8gICAgICAgICAgICAgfSxcbiAgLy8gICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdDRVJUSUZJQ0FURSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpO1xuICAvLyAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICdVbmFibGUgdG8gVmlldyBDZXJ0aWZpY2F0ZSwgcGxlYXNlIGNoZWNrIGFnYWluIGxhdGVyISdcbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICApO1xuICAvLyAgIH1cbiAgLy8gICB9IFxuICAvLyB9XG5cbiAgaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKCkge1xuICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSB0cnVlXG4gICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iaiAmJiAhdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhKSB7XG4gICAgIGlmIChjZXJ0SWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmRvd25sb2FkQ2VydChjZXJ0SWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ11bJ2NlcnREYXRhJ10gPSByZXNwb25zZS5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAgICAgICAgICAgICBkYXRhOiB7IGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIFZpZXcgQ2VydGlmaWNhdGUsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgIGRhdGE6IHsgY2V0OiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoKSB7XG4gICAgdGhpcy50cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2hlY2tWYWxpZEpTT04oc3RyOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZShzdHIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVN1YnNlY3RvcihpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN1YlNlY3RvckRldGFpbEFyciA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvciA9ICcnXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvcklkID0gJydcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc2VjdG9ySWQnXSA9PT0gaXRlbS5zZWN0b3JJZCkge1xuICAgICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgICAgJ3NlY3RvcklkJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3RvcklkJ10sXG4gICAgICAgICAgICAgICdzZWN0b3JOYW1lJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3Rvck5hbWUnXSxcbiAgICAgICAgICAgICAgJ2tleSc6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxW2ldWydzdWJTZWN0b3JOYW1lJ10sXG4gICAgICAgICAgICAgICd2YWx1ZSc6IFt0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIucHVzaChvYmopXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9yID0gaXRlbS5zZWN0b3JOYW1lXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9ySWQgPSBpdGVtLnNlY3RvcklkXG5cblxuICAgICAgY29uc3QgdmFsdWVPYmogPSBpdGVtXG4gICAgICBjb25zdCBzdWJTZWN0b3JBcnJheSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgICBpZiAodmFsdWVPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wT2JqOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wT2JqWyd2YWx1ZSddID0gdmFsdWVPYmpba2V5XVxuICAgICAgICAgIHN1YlNlY3RvckFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RyaXBbJ3NlY3RvcldpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29tcGV0ZW5jaWVzVG9XaWRnZXQoJ0JlaGF2aW91cmFsJywgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIsIHRoaXMuc3RyaXApXG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0JC51bnN1YnNjcmliZSgpXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcbiAgICBpZih0aGlzLnJlZnJlc2hyYXRpbmdTdWIpe1xuICAgICAgdGhpcy5yZWZyZXNocmF0aW5nU3ViLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlICNjZXJ0aWZpY2F0ZUNhcmQ+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2NrQ2VydGlmaWNhdGU7IGVsc2UgY2VydGlmaWNhdGVMb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtb3V0ZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgY2VydGlmaWNhdGUtaW5mbyBwLTQgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzIwMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMjRweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBmb250LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIHRydW5jYXRlLTNcIj57eyBjb250ZW50Py5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1saWdodFwiICpuZ0lmPVwiY29udGVudD8uY29tcGxldGVkT25cIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wbGV0ZWRDb3Vyc2UnIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnQ/LmNvbXBsZXRlZE9uID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWxpZ2h0XCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0ZWRPblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdTdGFuZGFsb25lIEFzc2Vzc21lbnQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZEFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlIH19IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LmNvbXBsZXRlZE9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LmNvbXBsZXRlZE9uIHwgZGF0ZTogJ2QgTU1NLCB5JykgOiAnTkEnIH19PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSAnUHJvZ3JhbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGxldGVkUHJvZ3JhbScgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY29tcGxldGVkT24gP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZENvdXJzZScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uY29tcGxldGVkT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGRvd25sb2FkLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbYmluZGluZ0NsYXNzXT1cIidmbGV4IHJvdW5kZWQnXCIgW3dpZHRoXT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMjRweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBjdXJzb3ItcG9pbnRlciBcIiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlQm9vbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpXCI+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIiBzdHJva2VXaWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzI4MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIicxNDhweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGVfYm94XCIgKm5nSWY9XCIhY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiFmcm9tTWFya2V0UGxhY2VcIiBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIk5vIGNlcnRpZmljYXRlIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmcm9tTWFya2V0UGxhY2VcIiBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS1tYXJrZXQtcGxhY2Uuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJObyBjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY2VydGlmaWNhdGVfb3ZlcmxheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHRleHQtY2VudGVyIGdhcC0xIHAtNCB0ZXh0LXdoaXRlIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eydhcHB0b2Nob21lLmNlcnRpZmljYXRpb25UYWtlc1RpbWUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj57eydhcHB0b2Nob21lLmlzc3VlUGVyc2lzdHNNYWlsdXMnIHwgdHJhbnNsYXRlIH19IG1pc3Npb24ua2FybWF5b2dpQGdvdi5pbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eydhcHB0b2Nob21lLmlzc3VlUGVyc2lzdHNNYWlsdXMnIHwgdHJhbnNsYXRlIH19IDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIm1haWx0bzptaXNzaW9uLmthcm1heW9naUBnb3YuaW5cIiBjbGFzcz1cImVtYWlsRGVmYXVsdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb24ua2FybWF5b2dpQGdvdi5pbjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uY2VydElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjZWxlYnJhdGlvbi1hbmltYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuaW1hdGlvbi9sZWFkZXJib2FyZF9hbmltYXRpb24uZ2lmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZyb21NYXJrZXRQbGFjZVwiIGNsYXNzPVwiY2VyaXRpZmljYXRlLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUuc3ZnJ1wiIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZnJvbU1hcmtldFBsYWNlXCIgY2xhc3M9XCJjZXJpdGlmaWNhdGUtaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cIicvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS1tYXJrZXQtcGxhY2Uuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd2aWV3LWNlcnRpZmljYXRlJzogZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wsICd2aWV3LWNlcnQnOiAhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2x9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2Njb250ZW50Y2FyZC52aWV3Q2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVCb29sXCIgY2xhc3M9XCJ1cGxvYWRlci1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnREYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY2VsZWJyYXRpb24tYW5pbWF0aW9uXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmltYXRpb24vbGVhZGVyYm9hcmRfYW5pbWF0aW9uLmdpZlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjZXJpdGlmaWNhdGUtaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnREYXRhIHwgcGlwZVNhZmVTYW5pdGl6ZXI6ICd1cmwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgY2hpcHMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJUaGVtZSBvZiBjb250ZW50UmVhZERhdGE/LnN1YlRoZW1lOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcCByb3VuZGVkLWZ1bGwgcC0yIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZGVuJzogKGogPiAxICYmICFjb250ZW50Py52aWV3TW9yZSksICdjaGlwLWVsbGlwc2lzJzogIWNvbnRlbnQ/LnZpZXdNb3JlICYmIGNvbnRlbnQ/LnN1YlRoZW1lPy5sZW5ndGggPiAxIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJzdWJUaGVtZVwiPnt7IHN1YlRoZW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1wcmltYXJ5IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uc3ViVGhlbWU/Lmxlbmd0aCA+IDIgJiYgIWNvbnRlbnQ/LnZpZXdNb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdNb3JlID0gIWNvbnRlbnQudmlld01vcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2NvbXBldGVuY3lDYXJkRGV0YWlscy52aWV3TW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtcHJpbWFyeSB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnZpZXdNb3JlXCIgKGNsaWNrKT1cImNvbnRlbnQudmlld01vcmUgPSAhY29udGVudC52aWV3TW9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snY29tcGV0ZW5jeUNhcmREZXRhaWxzLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NlcnRpZmljYXRlTG9jaz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1vdXRlci1kaXYgbG9ja2VkLWNlcnRpZmljYXRlLW91dGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1sb2NrIHAtNCBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBjZXJ0aWZpY2F0ZS1sb2NrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2MuY2VydGlmaWNhdGVMb2NrZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgZmxleC1jb2wgcC00IGdhcC0yIGxvY2tpbmctc2NyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvbG9ja193aHQuc3ZnXCIgYWx0PVwibG9jayBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGVMb2NrZWRUZXh0IHBiLTJcIj57eydhcHB0b2MuY2VydGlmaWNhdGVMb2NrZWRNZXNzYWdlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2tpbmctc2NyZWVuLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYXBwdG9jLnVubG9ja0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5Rm9ybWVUZXh0XCI+e3snYXBwdG9jLnN1cnZleUZvcm0nIHwgdHJhbnNsYXRlfX08L3NwYW4+IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcHRvYy51bmxvY2tDZXJ0aWZpY2F0ZTInIHwgdHJhbnNsYXRlIDogeyBjb3Vyc2VDYXRlZ29yeTogY29udGVudD8uY291cnNlQ2F0ZWdvcnkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IDogY29udGVudD8ucHJpbWFyeUNhdGVnb3J5IH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdXJ2ZXlGb3JtZUJ1dHRvbiBweC03XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblN1cnZleUZvcm1Qb3B1cCgpXCI+e3snYXBwdG9jLmNvbXBsZXRlU3VydmV5Tm93JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbXBldGVuY3lMYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicHQtbXdlYi00IG1hdC1zdWJoZWFkaW5nLTEgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgd3MtbWF0LWJsYWNrNjAtdGV4dCBpbmZvLWljb24gbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3JcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgI3Rvb2x0aXA9XCJtYXRUb29sdGlwXCIgKGNsaWNrKT1cInRvb2x0aXAudG9nZ2xlKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBldGVuY2llc1Rvb2x0aXAnIHwgdHJhbnNsYXRlIH19XCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG15LTQgcHgtNFwiIFtjbGFzcy5tdDYwXT1cInN0aWNreVwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJycgOiAnZ2FwLTEwJ1wiPlxuXG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIihjb250ZW50Py5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0SWQpICYmICFmcm9tTWFya2V0UGxhY2UgJiYgIWRpc2FibGVDZXJ0aWZpY2F0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGVhcm5lZC1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWJib25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01hcmtldFBsYWNlQ2VydGlmaWNhdGUgJiYgZnJvbU1hcmtldFBsYWNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZGlzYWJsZUNlcnRpZmljYXRlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBlYXJuZWQtY2VydGlmaWNhdGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1iYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1iYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VydGlmaWNhdGVDYXJkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkJ1wiIFtoZWlnaHRdPVwiJzE0OHB4J1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmcm9tVmlld2VyIHx8IHJvdXRlci51cmwuaW5jbHVkZXMoJy92aWV3ZXIvcGRmL2RvXycpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIG10LTJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZvbnQtc2VtaWJvbGQgdGV4dC1iYXNlXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5uYW1lKSB9fSA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2ItdGV4dCBicmVhay13b3JkcyB0ZXh0LXNtIG5vZHRyYW5zbGF0ZVwiPnt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fSB7e1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ/LnNvdXJjZSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50ICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBqdXN0aWZ5LWFyb3VuZCBoaWRlQWJvdmUxMjAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkXCI+e3sgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uY3VycmVudEJhdGNoU2l6ZSB8fFxuICAgICAgICAgICAgICAgICAgICAnMCcgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLmJhdGNoU2l6ZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LnRvdGFsQXBwbGllZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LmVucm9sbGVkIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxFbnJvbGxlZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aW1lci5kYXlzID49IDAgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02IG15LTUgYmF0Y2gtdGltZXIgaGlkZUFib3ZlMTIwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIuZGF5cyB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuZGF5cycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY291bnRlci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5taW4gPT09IDYwID8gdGltZXIuaG91cnMgKyAxIDogdGltZXIuaG91cnMgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuaG91cnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IDAwIDogdGltZXIubWluIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJmcm9tVmlld2VyIHx8IGlzTW9iaWxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzYwcHgnXCIgW2hlaWdodF09XCInNjBweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzYwcHgnXCIgW2hlaWdodF09XCInNjBweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzYwcHgnXCIgW2hlaWdodF09XCInNjBweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZnJvbU1hcmtldFBsYWNlXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzIFtjb250ZW50XT1cImNvbnRlbnRcIiBbdG9jU3RydWN0dXJlXT1cInRvY1N0cnVjdHVyZVwiIFtpc01vYmlsZV09XCJpc01vYmlsZVwiXG4gICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCJcbiAgICAgICAgICAgICAgICBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiPjwvd3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnN1bW1hcnkgJiYgY29udGVudFJlYWREYXRhPy5jb250ZW50SWQgJiYgY29udGVudFJlYWREYXRhPy5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzk1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnN1bW1hcnknIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtb2ItZGVzYy1lbGxpcHNpcyc6IGRlc2NyaXB0aW9uLmVsbGlwc2lzICYmIGlzTW9iaWxlLCAnZGVzYy1lbGxpcHNpcyc6IGRlc2NyaXB0aW9uLmVsbGlwc2lzICYmICFpc01vYmlsZX1cIlxuICAgICAgICAgICAgICAgICNkZXNjRWxlbT5cblxuICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJjb250ZW50UmVhZERhdGE/LnN1bW1hcnkgfCByZXBsYWNlTmJzcFwiIGNsYXNzPVwibW9iLXRleHQgYnJlYWstd29yZHMgbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cImRlc2NyaXB0aW9uLnZpZXdMZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2NyaXB0aW9uLmVsbGlwc2lzID0gIWRlc2NyaXB0aW9uLmVsbGlwc2lzOyBkZXNjcmlwdGlvbi52aWV3TGVzcyA9ICFkZXNjcmlwdGlvbi52aWV3TGVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cImRlc2NyaXB0aW9uLmVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj57e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzk1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5jb250ZW50SWQgJiYgY29udGVudD8uY29udGVudElkLmluY2x1ZGVzKCdleHRfJylcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIShjb250ZW50Py5jb250ZW50SWQgJiYgY29udGVudD8uY29udGVudElkLmluY2x1ZGVzKCdleHRfJykpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnN1bW1hcnknIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBzdW1tYXJ5LmVsbGlwc2lzICYmIGlzTW9iaWxlLCAnZGVzYy1lbGxpcHNpcyc6IHN1bW1hcnkuZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXG4gICAgICAgICAgICAgICAgI3N1bW1hcnlFbGVtPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2ItdGV4dCBub2R0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5kZXNjcmlwdGlvbiB8IHJlcGxhY2VOYnNwKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCBjdXJzb3ItcG9pbnRlciB0ZXh0LXNtXCIgKm5nSWY9XCJzdW1tYXJ5LnZpZXdMZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1bW1hcnkuZWxsaXBzaXMgPSAhc3VtbWFyeS5lbGxpcHNpczsgc3VtbWFyeS52aWV3TGVzcyA9ICFzdW1tYXJ5LnZpZXdMZXNzXCI+Jm5ic3A7e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCB0ZXh0LXNtXCIgKm5nSWY9XCJzdW1tYXJ5LmVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdW1tYXJ5LmVsbGlwc2lzID0gIXN1bW1hcnkuZWxsaXBzaXM7IHN1bW1hcnkudmlld0xlc3MgPSAhc3VtbWFyeS52aWV3TGVzc1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/Lmluc3RydWN0aW9ucyB8fCBjb250ZW50UmVhZERhdGE/LnB1cnBvc2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzY1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5sZWFybmluZ091dGNvbWUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydtb2ItZGVzYy1lbGxpcHNpcyc6IGRlc2NyaXB0aW9uLmVsbGlwc2lzICYmIGlzTW9iaWxlLCAnZGVzYy1lbGxpcHNpcyc6IGRlc2NyaXB0aW9uLmVsbGlwc2lzICYmICFpc01vYmlsZX1cIlxuICAgICAgICAgICAgICAgICNkZXNjRWxlbT5cblxuICAgICAgICAgICAgICAgIDxkaXYgW2lubmVySFRNTF09XCJjb250ZW50UmVhZERhdGE/Lmluc3RydWN0aW9ucyB8fCBjb250ZW50UmVhZERhdGE/LnB1cnBvc2UgfCByZXBsYWNlTmJzcFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9iLXRleHQgYnJlYWstd29yZHMgbm9kdHJhbnNsYXRlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cImRlc2NyaXB0aW9uLnZpZXdMZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2NyaXB0aW9uLmVsbGlwc2lzID0gIWRlc2NyaXB0aW9uLmVsbGlwc2lzOyBkZXNjcmlwdGlvbi52aWV3TGVzcyA9ICFkZXNjcmlwdGlvbi52aWV3TGVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cImRlc2NyaXB0aW9uLmVsbGlwc2lzXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj57e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiY29udGVudD8ub2JqZWN0aXZlc1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzk1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBwdC1td2ViLTggbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uub2JqZWN0aXZlcycgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogb2JqZWN0aXZlcy5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBvYmplY3RpdmVzLmVsbGlwc2lzICYmICFpc01vYmlsZX1cIlxuICAgICAgICAgICAgICAgICNvYmplY3RpdmVzRWxlbT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYi10ZXh0IG5vZHRyYW5zbGF0ZVwiIFtpbm5lckh0bWxdPVwiaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5vYmplY3RpdmVzKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwib2JqZWN0aXZlcy52aWV3TGVzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvYmplY3RpdmVzLmVsbGlwc2lzID0gIW9iamVjdGl2ZXMuZWxsaXBzaXM7IG9iamVjdGl2ZXMudmlld0xlc3MgPSAhb2JqZWN0aXZlcy52aWV3TGVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cIm9iamVjdGl2ZXMuZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9iamVjdGl2ZXMuZWxsaXBzaXMgPSAhb2JqZWN0aXZlcy5lbGxpcHNpczsgb2JqZWN0aXZlcy52aWV3TGVzcyA9ICFvYmplY3RpdmVzLnZpZXdMZXNzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyMHB4J1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMl1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzI1MHB4J1wiIFtoZWlnaHRdPVwiJzgwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyNTBweCdcIiBbaGVpZ2h0XT1cIic4MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN0cmlwPy5sb2FkZXJXaWRnZXRzPy5sZW5ndGggfHwgIWNvbXBldGVuY2llc09iamVjdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBldGVuY3lMYWJlbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLm5vQ29tcGV0ZW5jeUZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RyaXA/LmxvYWRlcldpZGdldHM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wZXRlbmN5TGFiZWxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBzbTpnYXAtNCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jaWVzT2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWVzLWJ1dHRvblwiIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogY29tcGV0ZW5jeVNlbGVjdGVkID09PSBpdGVtLmtleX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTaG93Q29tcGV0ZW5jaWVzKGl0ZW0sICdzZWxlY3RlZCcpXCI+e3sgaXRlbS5rZXkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmNpZXNPYmplY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmtleSA9PT0gY29tcGV0ZW5jeVNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12MiBbbG9hZFN0YXR1c109XCInZG9uZSdcIiBbc3RyaXBDb25maWddPVwic3RyaXAuc3RyaXBDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygc3RyaXA/LmxvYWRlcldpZGdldHM7IHRyYWNrQnk6IHRyYWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbd3NSZXNvbHZlcldpZGdldF09XCJ3aWRnZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12Mj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPCEtLSB7e2NvbnRlbnR8anNvbn19IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5rZXl3b3Jkcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhZ3NMaXN0XCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB0YWdEYXRhOiBjb250ZW50UmVhZERhdGE/LmtleXdvcmRzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncz8ubGVuZ3RoXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFnc0xpc3RcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRhZ0RhdGE6IGNvbnRlbnQ/LnNlYXJjaFRhZ3M/LnNsaWNlKDEsY29udGVudD8uc2VhcmNoVGFncz8ubGVuZ3RoKSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighc2tlbGV0b25Mb2FkZXIgJiYgc2VjdG9yc0xpc3Q/Lmxlbmd0aCkgJiYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeT8udG9Mb3dlckNhc2UoKSA9PT0gJ2xlYXJuaW5nIHJlc291cmNlJyB8fFxuICAgIGNvbnRlbnQ/LnJlc291cmNlQ2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdjYXNlIHN0dWR5JylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIiBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnZ3lhYW5LYXJtYXlvZ2kuc2VjdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0b3JzTGlzdD8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIHNtOmdhcC00IG1iLTMgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0b3Igb2Ygc2VjdG9yc0xpc3Q7IGxldCBpID0gaW5kZXg7IGxldCBpc0xhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJ7J3RoZW1lLWFjdGl2YXRlZCc6IGNvbXBldGVuY3lTZWxlY3RlZCA9PT0gaXRlbS5rZXl9XCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWVzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogc2VsZWN0ZWRTZWN0b3JJZCA9PT0gc2VjdG9yPy5zZWN0b3JJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU3Vic2VjdG9yKHNlY3RvciwgJ3NlbGVjdGVkJylcIj57eyBzZWN0b3I/LnNlY3Rvck5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwPy5zZWN0b3JXaWRnZXRzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXV0aWxzLWhvcml6b250YWwtc2Nyb2xsZXItdjIgW2xvYWRTdGF0dXNdPVwiJ2RvbmUnXCIgW3N0cmlwQ29uZmlnXT1cInN0cmlwLnN0cmlwQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZGdldCBvZiBzdHJpcD8uc2VjdG9yV2lkZ2V0czsgdHJhY2tCeTogdHJhY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbd3NSZXNvbHZlcldpZGdldF09XCJ3aWRnZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy11dGlscy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RyaXA/LnNlY3RvcldpZGdldHM/Lmxlbmd0aCA9PT0gMCAmJiBzZWxlY3RlZFNlY3RvcklkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vIFN1YnNlY3RvciBBdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdG9yIG9mIHNlY3RvcnNMaXN0OyBsZXQgaSA9IGluZGV4OyBsZXQgaXNMYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiID57eyBzZWN0b3I/LnNlY3Rvck5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCIhaXNMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIHN1YlNlY3RvcnNMaXN0Py5sZW5ndGhcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICdneWFhbkthcm1heW9naS5zdWJTZWN0b3JzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3RvciBvZiBzdWJTZWN0b3JzTGlzdDsgbGV0IGkgPSBpbmRleDsgbGV0IGlzTGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbW9iLXRleHRcIiA+e3sgc2VjdG9yPy5zdWJTZWN0b3JOYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiIWlzTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cblxuICAgIDxuZy10ZW1wbGF0ZSAjdGFnc0xpc3QgbGV0LXRhZ0RhdGE9XCJ0YWdEYXRhXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJ0YWdEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICd1c2VyUHJvZmlsZS50YWdzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhZ0RhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiIFtuZ0NsYXNzXT1cInsndGFncy1lbGxpcHNpcyc6IHRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzfVwiXG4gICAgICAgICAgICAgICAgICAgICN0YWdzRWxlbT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFnIG9mIHRhZ0RhdGE7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZSh0YWcpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cInRhZ0RhdGE/Lmxlbmd0aCA+IChpICsgMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgd3MtbWF0LWRlZmF1bHQtdGV4dCB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidGFnc0VsbGlwc2lzICYmICF2aWV3TW9yZVRhZ3NcIiAoY2xpY2spPVwidmlld01vcmVUYWdzID0gIXZpZXdNb3JlVGFnc1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzIG10LTFcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZpZXdNb3JlVGFnc1wiIChjbGljayk9XCJ2aWV3TW9yZVRhZ3MgPSAhdmlld01vcmVUYWdzXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiICpuZ0lmPVwiIXRhZ0RhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIHt7ICd1c2VyUHJvZmlsZS5ub1RhZ3MnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50Py5zZWFyY2hUYWdzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzLmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTFcIj57eyAndXNlclByb2ZpbGUudGFncycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiIFtuZ0NsYXNzXT1cInsndGFncy1lbGxpcHNpcyc6IHNlYXJjaFRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzfVwiICNzZWFyY2hUYWdFbGVtPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWcgb2YgY29udGVudD8uc2VhcmNoVGFnczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbW9iLXRleHRcIiA+e3sgaGFuZGxlQ2FwaXRhbGl6ZSh0YWcpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3MubGVuZ3RoID4gKGkgKyAxKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzXCIgKm5nSWY9XCJzZWFyY2hUYWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc1wiIChjbGljayk9XCJ2aWV3TW9yZVRhZ3MgPSAhdmlld01vcmVUYWdzXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHdzLW1hdC1kZWZhdWx0LXRleHQgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHMgbXQtMVwiICpuZ0lmPVwidmlld01vcmVUYWdzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld01vcmVUYWdzID0gIXZpZXdNb3JlVGFnc1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiAqbmdJZj1cIiFjb250ZW50Py5zZWFyY2hUYWdzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIHt7ICd1c2VyUHJvZmlsZS5ub1RhZ3MnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1rYXJtYS1wb2ludHNcIj5cbiAgICAgICAgPHdzLXdpZGdldC1rYXJtYS1wb2ludHMgW2NvbnRlbnRdPVwiY29udGVudFwiIFtidG5DYXRlZ29yeV09XCJcIiBbY29uZGl0aW9uXT1cImNvbmRpdGlvblwiXG4gICAgICAgICAgICAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cImhhbmRsZUNsaWNrT2ZDbGFpbSgkZXZlbnQpXCIgW2RhdGFdPVwia3BhcnJheVwiPlxuICAgICAgICA8L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzcycHgnXCJcbiAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZvclByZXZpZXdcIj5cbiAgICAgICAgPCEtLSBjb21tZW50ZWQgYmVjYXVzZSBvZiBuZXcgZGlzY3Vzc2lvbiB2MiBjb21tZW50cyBpbXBsbWVudGF0aW9uIC0tPlxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGl0ZW1zLWNlbnRlciBkaXNjdXNzaW9uLWRpdlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmb3J1bS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cgZ2FwLTUgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5mb3J1bTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uLXRleHQgc206cHItNFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmFueVN1Z2dlc3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ub25lIHAtM1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhY3Rpb24tYnV0dG9uXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9EaXNjdXNzaW9uSHViKClcIj57eyAnZGlzY3Vzcy5zdGFydERpc2N1c3MnIHwgdHJhbnNsYXRlIH19PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+IC0tPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzJweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzZweCdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkLWZ1bGwnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjRweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFmcm9tTWFya2V0UGxhY2VcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIiBbbmdDbGFzc109XCJ7J2hpZGVBYm92ZTEyMDAnOiAhcm91dGVyLnVybC5pbmNsdWRlcygnL3ZpZXdlci8nKX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yc0FuZEN1cmF0b3JzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYXV0aG9yIG9mIGhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudFJlYWREYXRhPy5jcmVhdG9yRGV0YWlscylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwaG90b1VybF09XCJhdXRob3IucGhvdG8gfHwgJydcIiBbbmFtZV09XCJhdXRob3IubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGRcIj57eyBoYW5kbGVDYXBpdGFsaXplKGF1dGhvcj8ubmFtZS50b0xvd2VyQ2FzZSgpLCAnbmFtZScpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTMgbW9iLXRleHRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hdXRob3InIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIlxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckNvbnRhY3RzKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImNyZWF0b3IucGhvdG8gfHwgJydcIiBbbmFtZV09XCJjcmVhdG9yLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjcmVhdG9yPy5uYW1lLnRvTG93ZXJDYXNlKCksICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctMyBtb2ItdGV4dFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmN1cmF0b3InIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0zXCIgW25nQ2xhc3NdPVwieydoaWRlQWJvdmUxMjAwJzogIXJvdXRlci51cmwuaW5jbHVkZXMoJy92aWV3ZXIvJyl9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWxvZ28tZGl2XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjb250ZW50Py5jcmVhdG9yTG9nb1wiIFtzcmNdPVwiY29udGVudD8uY3JlYXRvckxvZ29cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2UucHJvdmlkZXInIHwgdHJhbnNsYXRlIH19XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiFjb250ZW50Py5jcmVhdG9yTG9nb1wiIHNyYz1cIi9hc3NldHMvaW5zdGFuY2VzL2VhZ2xlL2FwcF9sb2dvcy9LYXJtYXlvZ2lCaGFyYXRfTG9nby5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2UucHJvdmlkZXInIHwgdHJhbnNsYXRlIH19XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBicmVhay1hbGxcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/LnNvdXJjZSwgJ3NvdXJjZScpIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzQwMHB4J1wiXG4gICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFmb3JQcmV2aWV3XCI+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj4gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IGdhcC0xMFwiIGlkPVwicmF0aW5nc0RpdlwiICpuZ0lmPVwic2hvd1Jldmlld3NcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtcmF0aW5nLXN1bW1hcnkgW3JhdGluZ1N1bW1hcnldPVwicmF0aW5nU3VtbWFyeVByb2Nlc3NlZFwiPjwvd3Mtd2lkZ2V0LXJhdGluZy1zdW1tYXJ5PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgbWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIiBpZD1cInJldmlld0NvbnRhaW5lclwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS50b3BSZXZpZXdzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmF0aW5nU3VtbWFyeVByb2Nlc3NlZD8uYXZnUmF0aW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJoYW5kbGVPcGVuUmV2aWV3TW9kYWwoKVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21zZy5zaG93QWxsJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9wUmF0aW5nUmV2aWV3cyAmJiB0b3BSYXRpbmdSZXZpZXdzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTVcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICdob3Jpem9udGFsLXN0cmlwJyA6ICdmbGV4LXdyYXAnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tbWVudC1kaXZcIiAqbmdGb3I9XCJsZXQgZWFjaFJldmlldyBvZiB0b3BSYXRpbmdSZXZpZXdzIHwgc2xpY2U6MDo0OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNCBmbGV4IGZsZXgtY29sIGdhcC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGVmdCBkZXNjLWVsbGlwc2lzXCIgdGl0bGU9XCJ7eyBlYWNoUmV2aWV3Py5yZXZpZXcgfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDYXBpdGFsaXplKGVhY2hSZXZpZXc/LnJldmlldykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgcmF0aW5nLXN0YXJ0LXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnN0YXI8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgZWFjaFJldmlldz8ucmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIGl0ZW1zLWNlbnRlciB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwaG90b1VybF09XCJlYWNoUmV2aWV3Py5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiZWFjaFJldmlldz8uZmlyc3ROYW1lXCI+PC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBoYW5kbGVDYXBpdGFsaXplKGVhY2hSZXZpZXc/LmZpcnN0TmFtZS50b0xvd2VyQ2FzZSgpLCAnbmFtZScpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBlYWNoUmV2aWV3Py5kYXRlIHwgcGlwZVJlbGF0aXZlVGltZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhdG9wUmF0aW5nUmV2aWV3cyB8fCAhdG9wUmF0aW5nUmV2aWV3cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHRleHQtY2VudGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBiZy13aGl0ZSBwLTQgcm91bmRlZC1tZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uubm9SZXZpZXdzRm91bmQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uYXZlcmFnZVJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTMganVzdGlmeS1jZW50ZXIgcmF0aW5ncy1kaXZcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvdG9jL25vLWNlcnRpZmljYXRlLnN2Z1wiIGFsdD1cIm5vIHJhdGluZ3MgaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtYm9sXCI+QmUgdGhlIGZpcnN0IG9uZSB0byByYXRlIHRoaXMgY291cnNlIGFuZCB5b3VyIDxici8+IGxlYXJuaW5nIGV4cGVyaWVuY2U8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=
|
|
1
|
+
import { Component, Input, ViewChild, Output, EventEmitter, Inject } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { takeUntil } from 'rxjs/operators';
|
|
4
|
+
// tslint:disable-next-line
|
|
5
|
+
import * as _ from 'lodash';
|
|
6
|
+
import dayjs from 'dayjs';
|
|
7
|
+
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
|
|
8
|
+
import isSameOrAfter from 'dayjs/plugin/isSameOrAfter';
|
|
9
|
+
import { NsContent } from '../../../../_services/widget-content.model';
|
|
10
|
+
import { ReviewsContentComponent } from '../reviews-content/reviews-content.component';
|
|
11
|
+
import { CertificateDialogComponent } from '../../certificate-dialog/certificate-dialog.component';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "../../../../_services/rating.service";
|
|
14
|
+
import * as i2 from "@sunbird-cb/utils-v2";
|
|
15
|
+
import * as i3 from "@angular/material/legacy-dialog";
|
|
16
|
+
import * as i4 from "@angular/material/legacy-snack-bar";
|
|
17
|
+
import * as i5 from "../../../../services/load-check.service";
|
|
18
|
+
import * as i6 from "../../../../services/timer.service";
|
|
19
|
+
import * as i7 from "../../../../services/app-toc.service";
|
|
20
|
+
import * as i8 from "../../../../services/discuss-utils.service";
|
|
21
|
+
import * as i9 from "@angular/router";
|
|
22
|
+
import * as i10 from "../content-services/review-component-data.service";
|
|
23
|
+
import * as i11 from "../content-services/handle-claim.service";
|
|
24
|
+
import * as i12 from "../../../../services/reset-ratings.service";
|
|
25
|
+
import * as i13 from "@angular/common";
|
|
26
|
+
import * as i14 from "@angular/material/icon";
|
|
27
|
+
import * as i15 from "@angular/material/progress-spinner";
|
|
28
|
+
import * as i16 from "../../skeleton-loader/skeleton-loader.component";
|
|
29
|
+
import * as i17 from "../../avatar-photo/avatar-photo.component";
|
|
30
|
+
import * as i18 from "../../rating-summary/rating-summary.component";
|
|
31
|
+
import * as i19 from "@angular/material/legacy-tooltip";
|
|
32
|
+
import * as i20 from "../../toc-kpi-values/toc-kpi-values.component";
|
|
33
|
+
import * as i21 from "../karma-points/karma-points.component";
|
|
34
|
+
import * as i22 from "@ngx-translate/core";
|
|
35
|
+
import * as i23 from "../pipes/replace-nbsp.pipe";
|
|
36
|
+
dayjs.extend(isSameOrBefore);
|
|
37
|
+
dayjs.extend(isSameOrAfter);
|
|
38
|
+
export class AppTocAboutComponent {
|
|
39
|
+
constructor(ratingService, loggerService, dialog, matSnackBar, loadCheckService, timerService, tocSvc, configService, discussUtilitySvc, router, reviewDataService, handleClaimService, resetRatingsService, contentSvc, activatedRoute, environment) {
|
|
40
|
+
this.ratingService = ratingService;
|
|
41
|
+
this.loggerService = loggerService;
|
|
42
|
+
this.dialog = dialog;
|
|
43
|
+
this.matSnackBar = matSnackBar;
|
|
44
|
+
this.loadCheckService = loadCheckService;
|
|
45
|
+
this.timerService = timerService;
|
|
46
|
+
this.tocSvc = tocSvc;
|
|
47
|
+
this.configService = configService;
|
|
48
|
+
this.discussUtilitySvc = discussUtilitySvc;
|
|
49
|
+
this.router = router;
|
|
50
|
+
this.reviewDataService = reviewDataService;
|
|
51
|
+
this.handleClaimService = handleClaimService;
|
|
52
|
+
this.resetRatingsService = resetRatingsService;
|
|
53
|
+
this.contentSvc = contentSvc;
|
|
54
|
+
this.activatedRoute = activatedRoute;
|
|
55
|
+
this.content = null;
|
|
56
|
+
this.contentReadData = null;
|
|
57
|
+
this.baseContentReadData = null;
|
|
58
|
+
this.skeletonLoader = false;
|
|
59
|
+
this.sticky = false;
|
|
60
|
+
this.forPreview = false;
|
|
61
|
+
this.showReviews = false;
|
|
62
|
+
this.fromViewer = false;
|
|
63
|
+
this.selectedTabValue = 0;
|
|
64
|
+
this.fromMarketPlace = false;
|
|
65
|
+
this.showMarketPlaceCertificate = false;
|
|
66
|
+
this.languageList = [];
|
|
67
|
+
this.lockCertificate = false;
|
|
68
|
+
this.trigerCompletionSurveyForm = new EventEmitter();
|
|
69
|
+
this.disableCertificate = false;
|
|
70
|
+
this.primaryCategory = NsContent.EPrimaryCategory;
|
|
71
|
+
this.summary = {
|
|
72
|
+
ellipsis: false,
|
|
73
|
+
viewLess: false,
|
|
74
|
+
};
|
|
75
|
+
this.description = {
|
|
76
|
+
ellipsis: false,
|
|
77
|
+
viewLess: false,
|
|
78
|
+
};
|
|
79
|
+
this.objectives = {
|
|
80
|
+
ellipsis: false,
|
|
81
|
+
viewLess: false,
|
|
82
|
+
};
|
|
83
|
+
this.tagsEllipsis = false;
|
|
84
|
+
this.searchTagsEllipsis = false;
|
|
85
|
+
this.competencySelected = '';
|
|
86
|
+
this.topRatingReviews = [];
|
|
87
|
+
this.ratingReviews = [];
|
|
88
|
+
this.latestReviews = [];
|
|
89
|
+
this.displayLoader = false;
|
|
90
|
+
this.disableLoadMore = false;
|
|
91
|
+
this.lookupLoading = true;
|
|
92
|
+
this.reviewPage = 1;
|
|
93
|
+
this.reviewDefaultLimit = 2;
|
|
94
|
+
this.lookupLimit = 3;
|
|
95
|
+
this.ratingViewCount = 3;
|
|
96
|
+
this.ratingViewCountDefault = 3;
|
|
97
|
+
this.competenciesObject = [];
|
|
98
|
+
this.destroySubject$ = new Subject();
|
|
99
|
+
this.viewMoreTags = false;
|
|
100
|
+
this.downloadCertificateBool = false;
|
|
101
|
+
this.strip = {
|
|
102
|
+
key: 'blendedPrograms',
|
|
103
|
+
logo: '',
|
|
104
|
+
title: 'Blended Program',
|
|
105
|
+
stripTitleLink: {
|
|
106
|
+
link: '',
|
|
107
|
+
icon: '',
|
|
108
|
+
},
|
|
109
|
+
sliderConfig: {
|
|
110
|
+
showNavs: true,
|
|
111
|
+
showDots: false,
|
|
112
|
+
},
|
|
113
|
+
loader: true,
|
|
114
|
+
stripBackground: '',
|
|
115
|
+
titleDescription: 'Blended Program',
|
|
116
|
+
stripConfig: {
|
|
117
|
+
cardSubType: 'standard',
|
|
118
|
+
},
|
|
119
|
+
viewMoreUrl: {
|
|
120
|
+
path: '',
|
|
121
|
+
viewMoreText: 'Show all',
|
|
122
|
+
queryParams: '',
|
|
123
|
+
},
|
|
124
|
+
tabs: [],
|
|
125
|
+
filters: []
|
|
126
|
+
};
|
|
127
|
+
this.timer = {};
|
|
128
|
+
this.isMobile = false;
|
|
129
|
+
this.sectorsList = [];
|
|
130
|
+
this.subSectorsList = [];
|
|
131
|
+
this.userProfile = null;
|
|
132
|
+
this.subSectorDetailArr = [];
|
|
133
|
+
this.selectedSector = '';
|
|
134
|
+
this.selectedSectorId = '';
|
|
135
|
+
this.environment = environment;
|
|
136
|
+
this.refreshratingSub = this.resetRatingsService.resetRatings$.subscribe((_res) => {
|
|
137
|
+
this.fetchRatingSummary();
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
ngOnInit() {
|
|
141
|
+
this.pageConfigData = this.activatedRoute?.snapshot?.data?.pageData?.data;
|
|
142
|
+
this.compentencyKey = this.configService.compentency[this.environment.compentencyVersionKey];
|
|
143
|
+
this.userProfile = this.configService.userProfile;
|
|
144
|
+
if (window.innerWidth <= 1200) {
|
|
145
|
+
this.isMobile = true;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
this.isMobile = false;
|
|
149
|
+
}
|
|
150
|
+
if (this.content && this.content.identifier) {
|
|
151
|
+
this.fetchRatingSummary();
|
|
152
|
+
// this.loadCompetencies()
|
|
153
|
+
}
|
|
154
|
+
if (this.content && this.content.contentId && this.content.contentId.includes('ext_')) {
|
|
155
|
+
// this.loadCompetencies()
|
|
156
|
+
}
|
|
157
|
+
if (this.content) {
|
|
158
|
+
this.content['subTheme'] = this.getSubThemes();
|
|
159
|
+
}
|
|
160
|
+
if (this.content && this.content.courseCategory === NsContent.ECourseCategory.CASE_STUDY) {
|
|
161
|
+
this.disableCertificate = true;
|
|
162
|
+
}
|
|
163
|
+
if (this.baseContentReadData?.sectorDetails_v1) {
|
|
164
|
+
// Parse string to array if needed
|
|
165
|
+
let sectorDetailsArray = this.baseContentReadData.sectorDetails_v1;
|
|
166
|
+
// If it's a string, try to parse it into an array
|
|
167
|
+
if (typeof sectorDetailsArray === 'string') {
|
|
168
|
+
try {
|
|
169
|
+
sectorDetailsArray = JSON.parse(sectorDetailsArray);
|
|
170
|
+
this.baseContentReadData.sectorDetails_v1 = sectorDetailsArray;
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
console.error('Error parsing sectorDetails_v1:', e);
|
|
174
|
+
sectorDetailsArray = [];
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Process only if we have a valid array with items
|
|
178
|
+
if (Array.isArray(sectorDetailsArray) && sectorDetailsArray.length > 0) {
|
|
179
|
+
this.sectorsList = _.uniqBy(sectorDetailsArray
|
|
180
|
+
.filter((item) => item?.sectorName && item?.sectorId)
|
|
181
|
+
.map((item) => ({
|
|
182
|
+
sectorId: item.sectorId,
|
|
183
|
+
sectorName: item.sectorName
|
|
184
|
+
})), 'sectorName');
|
|
185
|
+
this.subSectorsList = _.uniqBy(sectorDetailsArray
|
|
186
|
+
.filter((item) => item?.subSectorName && item?.subSectorId)
|
|
187
|
+
.map((item) => ({
|
|
188
|
+
subSectorId: item.subSectorId,
|
|
189
|
+
subSectorName: item.subSectorName
|
|
190
|
+
})), 'subSectorName');
|
|
191
|
+
if (this.sectorsList && this.sectorsList.length && this.sectorsList[0]) {
|
|
192
|
+
if (!this.isMobile) {
|
|
193
|
+
this.handleSubsector(this.sectorsList[0]);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (this.content?.contentId &&
|
|
199
|
+
this.content?.certificateObj?.data &&
|
|
200
|
+
Object.keys(this.content.certificateObj.data).length === 0 &&
|
|
201
|
+
this.content.completionStatus === 2) {
|
|
202
|
+
this.handleOpenCertificateDialog();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
ngAfterViewInit() {
|
|
206
|
+
this.timerUnsubscribe = this.timerService.getTimerData()
|
|
207
|
+
.pipe(takeUntil(this.destroySubject$))
|
|
208
|
+
.subscribe((_timer) => {
|
|
209
|
+
this.timer = _timer;
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
ngOnChanges(changes) {
|
|
213
|
+
this.compentencyKey = this.configService.compentency[this.environment.compentencyVersionKey];
|
|
214
|
+
if (changes.selectedTabValue && changes.selectedTabValue.currentValue === 0) {
|
|
215
|
+
setTimeout(() => {
|
|
216
|
+
if (!this.isMobile) {
|
|
217
|
+
if (this.summaryElem && this.summaryElem.nativeElement.offsetHeight > 72) {
|
|
218
|
+
this.summary.ellipsis = true;
|
|
219
|
+
}
|
|
220
|
+
if (this.descElem && this.descElem.nativeElement.offsetHeight > 72) {
|
|
221
|
+
this.description.ellipsis = true;
|
|
222
|
+
}
|
|
223
|
+
if (this.objectivesElem && this.objectivesElem.nativeElement.offsetHeight > 72) {
|
|
224
|
+
this.objectives.ellipsis = true;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
if (this.summaryElem && this.summaryElem.nativeElement.offsetHeight > 48) {
|
|
229
|
+
this.summary.ellipsis = true;
|
|
230
|
+
}
|
|
231
|
+
if (this.descElem && this.descElem.nativeElement.offsetHeight > 48) {
|
|
232
|
+
this.description.ellipsis = true;
|
|
233
|
+
}
|
|
234
|
+
if (this.objectivesElem && this.objectivesElem.nativeElement.offsetHeight > 48) {
|
|
235
|
+
this.objectives.ellipsis = true;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (this.tagsElem && this.tagsElem.nativeElement.offsetHeight > 64) {
|
|
239
|
+
this.tagsEllipsis = true;
|
|
240
|
+
}
|
|
241
|
+
if (this.searchTagElem && this.searchTagElem.nativeElement.offsetHeight > 64) {
|
|
242
|
+
this.searchTagsEllipsis = true;
|
|
243
|
+
}
|
|
244
|
+
}, 500);
|
|
245
|
+
}
|
|
246
|
+
if (changes.skeletonLoader && !changes.skeletonLoader.currentValue) {
|
|
247
|
+
setTimeout(() => {
|
|
248
|
+
this.loadCheckService.componentLoaded(true);
|
|
249
|
+
}, 500);
|
|
250
|
+
}
|
|
251
|
+
if (this.content) {
|
|
252
|
+
this.tocStructure = {
|
|
253
|
+
assessment: 0,
|
|
254
|
+
course: 0,
|
|
255
|
+
handsOn: 0,
|
|
256
|
+
interactiveVideo: 0,
|
|
257
|
+
learningModule: 0,
|
|
258
|
+
other: 0,
|
|
259
|
+
pdf: 0,
|
|
260
|
+
survey: 0,
|
|
261
|
+
podcast: 0,
|
|
262
|
+
practiceTest: 0,
|
|
263
|
+
finalTest: 0,
|
|
264
|
+
quiz: 0,
|
|
265
|
+
video: 0,
|
|
266
|
+
webModule: 0,
|
|
267
|
+
webPage: 0,
|
|
268
|
+
youtube: 0,
|
|
269
|
+
interactivecontent: 0,
|
|
270
|
+
offlineSession: 0,
|
|
271
|
+
};
|
|
272
|
+
this.tocStructure.learningModule = this.content.primaryCategory === 'Course Unit' ? -1 : 0;
|
|
273
|
+
this.tocStructure.course = this.content.primaryCategory === 'Course' ? -1 : 0;
|
|
274
|
+
this.tocStructure = this.tocSvc.getTocStructure(this.content, this.tocStructure);
|
|
275
|
+
for (const progType in this.tocStructure) {
|
|
276
|
+
if (this.tocStructure[progType] > 0) {
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
if (this.content && this.content.identifier) {
|
|
281
|
+
if (this.ratingSummary && Object.keys(this.ratingSummary).length === 0) {
|
|
282
|
+
this.fetchRatingSummary();
|
|
283
|
+
}
|
|
284
|
+
if (this.competenciesObject.length === 0) {
|
|
285
|
+
this.loadCompetencies();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
if (this.content && this.content.contentId && this.content.contentId.includes('ext_')) {
|
|
289
|
+
if (this.competenciesObject.length === 0) {
|
|
290
|
+
this.loadCompetencies();
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (this.contentReadData) {
|
|
294
|
+
this.contentReadData['subTheme'] = this.getSubThemes();
|
|
295
|
+
}
|
|
296
|
+
if (this.content && this.content.courseCategory === NsContent.ECourseCategory.CASE_STUDY) {
|
|
297
|
+
this.disableCertificate = true;
|
|
298
|
+
}
|
|
299
|
+
if (this.contentReadData?.sectorDetails_v1) {
|
|
300
|
+
// Parse string to array if needed
|
|
301
|
+
let sectorDetailsArray = this.contentReadData.sectorDetails_v1;
|
|
302
|
+
// If it's a string, try to parse it into an array
|
|
303
|
+
if (typeof sectorDetailsArray === 'string') {
|
|
304
|
+
try {
|
|
305
|
+
sectorDetailsArray = JSON.parse(sectorDetailsArray);
|
|
306
|
+
this.contentReadData.sectorDetails_v1 = sectorDetailsArray;
|
|
307
|
+
}
|
|
308
|
+
catch (e) {
|
|
309
|
+
console.error('Error parsing sectorDetails_v1:', e);
|
|
310
|
+
sectorDetailsArray = [];
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Process only if we have a valid array with items
|
|
314
|
+
if (Array.isArray(sectorDetailsArray) && sectorDetailsArray.length > 0) {
|
|
315
|
+
// Extract unique sectors using lodash
|
|
316
|
+
this.sectorsList = _.uniqBy(sectorDetailsArray
|
|
317
|
+
.filter((item) => item?.sectorName && item?.sectorId)
|
|
318
|
+
.map((item) => ({
|
|
319
|
+
sectorId: item.sectorId,
|
|
320
|
+
sectorName: item.sectorName
|
|
321
|
+
})), 'sectorName');
|
|
322
|
+
// Extract unique subsectors using lodash
|
|
323
|
+
this.subSectorsList = _.uniqBy(sectorDetailsArray
|
|
324
|
+
.filter((item) => item?.subSectorName && item?.subSectorId)
|
|
325
|
+
.map((item) => ({
|
|
326
|
+
subSectorId: item.subSectorId,
|
|
327
|
+
subSectorName: item.subSectorName
|
|
328
|
+
})), 'subSectorName');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
333
|
+
}
|
|
334
|
+
getSubThemes() {
|
|
335
|
+
const subThemeArr = [];
|
|
336
|
+
if (this.contentReadData && this.compentencyKey && this.contentReadData[this.compentencyKey.vKey] && this.contentReadData[this.compentencyKey.vKey].length) {
|
|
337
|
+
if (typeof this.contentReadData[this.compentencyKey.vKey] === 'string' && this.checkValidJSON(this.contentReadData[this.compentencyKey.vKey])) {
|
|
338
|
+
this.contentReadData[this.compentencyKey.vKey] = JSON.parse(this.contentReadData[this.compentencyKey.vKey]);
|
|
339
|
+
}
|
|
340
|
+
this.contentReadData[this.compentencyKey.vKey].forEach((_competencyObj) => {
|
|
341
|
+
if (subThemeArr.indexOf(_competencyObj[this.compentencyKey.vCompetencySubTheme]) === -1) {
|
|
342
|
+
subThemeArr.push(_competencyObj[this.compentencyKey.vCompetencySubTheme]);
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
return subThemeArr;
|
|
347
|
+
}
|
|
348
|
+
loadCompetencies() {
|
|
349
|
+
if (this.baseContentReadData && this.baseContentReadData[this.compentencyKey.vKey] && this.baseContentReadData[this.compentencyKey.vKey].length) {
|
|
350
|
+
const competenciesObject = {};
|
|
351
|
+
if (typeof this.baseContentReadData[this.compentencyKey.vKey] === 'string'
|
|
352
|
+
&& this.checkValidJSON(this.baseContentReadData[this.compentencyKey.vKey])) {
|
|
353
|
+
this.baseContentReadData[this.compentencyKey.vKey] = JSON.parse(this.baseContentReadData[this.compentencyKey.vKey]);
|
|
354
|
+
}
|
|
355
|
+
this.baseContentReadData[this.compentencyKey.vKey].forEach((_obj) => {
|
|
356
|
+
if (competenciesObject[_obj[this.compentencyKey.vCompetencyArea]]) {
|
|
357
|
+
if (competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]) {
|
|
358
|
+
const competencyTheme = competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]];
|
|
359
|
+
if (competencyTheme.indexOf(_obj[this.compentencyKey.vCompetencySubTheme]) === -1) {
|
|
360
|
+
competencyTheme.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]] = [];
|
|
365
|
+
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]
|
|
366
|
+
.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]] = {};
|
|
371
|
+
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]] = [];
|
|
372
|
+
competenciesObject[_obj[this.compentencyKey.vCompetencyArea]][_obj[this.compentencyKey.vCompetencyTheme]]
|
|
373
|
+
.push(_obj[this.compentencyKey.vCompetencySubTheme]);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
for (const key in competenciesObject) {
|
|
377
|
+
if (competenciesObject.hasOwnProperty(key)) {
|
|
378
|
+
const _temp = {};
|
|
379
|
+
_temp['key'] = key;
|
|
380
|
+
_temp['value'] = competenciesObject[key];
|
|
381
|
+
this.competenciesObject.push(_temp);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
this.handleShowCompetencies(this.competenciesObject[0]);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
handleShowCompetencies(item) {
|
|
388
|
+
this.competencySelected = item.key;
|
|
389
|
+
const valueObj = item.value;
|
|
390
|
+
const competencyArray = [];
|
|
391
|
+
for (const key in valueObj) {
|
|
392
|
+
if (valueObj.hasOwnProperty(key)) {
|
|
393
|
+
const _tempObj = {};
|
|
394
|
+
_tempObj['key'] = key;
|
|
395
|
+
_tempObj['value'] = valueObj[key];
|
|
396
|
+
competencyArray.push(_tempObj);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
this.strip['loaderWidgets'] = [];
|
|
400
|
+
this.strip['loaderWidgets'] = this.transformCompetenciesToWidget(this.competencySelected, competencyArray, this.strip);
|
|
401
|
+
}
|
|
402
|
+
transformCompetenciesToWidget(competencyArea, competencyArrObject, strip) {
|
|
403
|
+
return (competencyArrObject || []).map((content, idx) => (content ? {
|
|
404
|
+
widgetType: 'card',
|
|
405
|
+
widgetSubType: 'competencyCard',
|
|
406
|
+
widgetHostClass: 'mr-4',
|
|
407
|
+
widgetData: {
|
|
408
|
+
content,
|
|
409
|
+
competencyArea,
|
|
410
|
+
cardCustomeClass: strip.customeClass ? strip.customeClass : '',
|
|
411
|
+
context: { pageSection: strip.key, position: idx },
|
|
412
|
+
},
|
|
413
|
+
} : {
|
|
414
|
+
widgetType: 'card',
|
|
415
|
+
widgetSubType: 'competencyCard',
|
|
416
|
+
widgetHostClass: 'mr-4',
|
|
417
|
+
widgetData: {},
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
420
|
+
handleParseJsonData(s) {
|
|
421
|
+
try {
|
|
422
|
+
const parsedString = JSON.parse(s);
|
|
423
|
+
return parsedString;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return [];
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
fetchRatingSummary() {
|
|
430
|
+
if (this.content && this.content.identifier && this.content.primaryCategory) {
|
|
431
|
+
this.ratingService.getRatingSummary(this.content.identifier, this.content.primaryCategory).subscribe((res) => {
|
|
432
|
+
if (res && res.result && res.result.response) {
|
|
433
|
+
this.ratingSummary = res.result.response;
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
this.ratingSummary = undefined;
|
|
437
|
+
}
|
|
438
|
+
// Hide loader for MatDialog...
|
|
439
|
+
if (this.dialogRef) {
|
|
440
|
+
this.dialogRef.componentInstance.displayLoader = false;
|
|
441
|
+
}
|
|
442
|
+
this.ratingSummaryProcessed = this.processRatingSummary();
|
|
443
|
+
// this.fetchRatingLookup()
|
|
444
|
+
}, (err) => {
|
|
445
|
+
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
446
|
+
this.matSnackBar.open('Unable to fetch rating summary, due to some error!');
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
fetchRatingLookup() {
|
|
451
|
+
this.displayLoader = true;
|
|
452
|
+
if (this.content && this.content.identifier && this.content.primaryCategory) {
|
|
453
|
+
const req = {
|
|
454
|
+
activityId: this.content.identifier,
|
|
455
|
+
activityType: this.content.primaryCategory,
|
|
456
|
+
limit: this.lookupLimit,
|
|
457
|
+
...((this.lastLookUp && this.lastLookUp.updatedOnUUID) ? { updateOn: (this.lastLookUp && this.lastLookUp.updatedOnUUID) } : null),
|
|
458
|
+
};
|
|
459
|
+
this.ratingService.getRatingLookup(req).subscribe((res) => {
|
|
460
|
+
// To disable the loader in the modal.
|
|
461
|
+
if (this.dialogRef) {
|
|
462
|
+
this.dialogRef.componentInstance.displayLoader = false;
|
|
463
|
+
}
|
|
464
|
+
if (res && res.result && res.result.response) {
|
|
465
|
+
if (this.reviewPage > 1) {
|
|
466
|
+
res.result.response.map((item) => {
|
|
467
|
+
if (!this.ratingLookup.find((o) => o.updatedOnUUID === item.updatedOnUUID)) {
|
|
468
|
+
this.ratingLookup.push(item);
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
this.ratingLookup = res.result.response;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
this.processRatingLookup(res.result.response);
|
|
477
|
+
}, (err) => {
|
|
478
|
+
if (this.dialogRef) { // To disable the loader in the modal.
|
|
479
|
+
this.dialogRef.componentInstance.displayLoader = false;
|
|
480
|
+
}
|
|
481
|
+
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
482
|
+
this.matSnackBar.open('Unable to load reviews, due to some error!');
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
processRatingLookup(response) {
|
|
487
|
+
if (response) {
|
|
488
|
+
if (response && response.length < this.lookupLimit) {
|
|
489
|
+
this.disableLoadMore = true;
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
this.disableLoadMore = false;
|
|
493
|
+
}
|
|
494
|
+
this.lastLookUp = response[response.length - 1];
|
|
495
|
+
this.ratingReviews = this.ratingLookup;
|
|
496
|
+
this.authReplies = [];
|
|
497
|
+
this.authReplies = _.keyBy(this.latestReviews, 'userId');
|
|
498
|
+
const userIds = _.map(this.latestReviews, 'userId');
|
|
499
|
+
if (this.content && userIds) {
|
|
500
|
+
this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
|
|
501
|
+
}
|
|
502
|
+
if (this.ratingReviews) {
|
|
503
|
+
this.ratingReviews = this.ratingReviews.slice();
|
|
504
|
+
this.reviewDataService.setReviewData(this.ratingReviews);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
getAuthorReply(identifier, primaryCategory, userIds) {
|
|
509
|
+
const request = {
|
|
510
|
+
request: {
|
|
511
|
+
activityId: identifier,
|
|
512
|
+
activityType: primaryCategory,
|
|
513
|
+
userId: userIds,
|
|
514
|
+
},
|
|
515
|
+
};
|
|
516
|
+
return this.ratingService.getRatingReply(request).subscribe((res) => {
|
|
517
|
+
if (res && res.result && res.result.content) {
|
|
518
|
+
const ratingAuthReplay = res.result.content;
|
|
519
|
+
_.forEach(ratingAuthReplay, value => {
|
|
520
|
+
if (this.authReplies[value.userId]) {
|
|
521
|
+
this.authReplies[value.userId]['comment'] = value.comment;
|
|
522
|
+
this.authReplies[value.userId]['userId'] = value.userId;
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
this.latestReviews = Object.values(this.authReplies);
|
|
527
|
+
return this.authReplies;
|
|
528
|
+
}, (err) => {
|
|
529
|
+
this.loggerService.error('USER RATING FETCH ERROR >', err);
|
|
530
|
+
this.matSnackBar.open('Unable to fetch author replies, due to some error!');
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
countStarsPercentage(value, key, total) {
|
|
534
|
+
if (value && total) {
|
|
535
|
+
return (((value * key) / total) * 100).toFixed(2);
|
|
536
|
+
}
|
|
537
|
+
return 0;
|
|
538
|
+
}
|
|
539
|
+
processRatingSummary() {
|
|
540
|
+
const breakDownArray = [];
|
|
541
|
+
const ratingSummaryPr = {
|
|
542
|
+
breakDown: breakDownArray,
|
|
543
|
+
latest50Reviews: breakDownArray,
|
|
544
|
+
ratingsNumber: breakDownArray,
|
|
545
|
+
total_number_of_ratings: _.get(this.ratingSummary, 'total_number_of_ratings') || 0,
|
|
546
|
+
avgRating: 0,
|
|
547
|
+
};
|
|
548
|
+
const totRatings = _.get(this.ratingSummary, 'sum_of_total_ratings') || 0;
|
|
549
|
+
ratingSummaryPr.breakDown.push({
|
|
550
|
+
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount1stars'), 1, totRatings),
|
|
551
|
+
key: 1,
|
|
552
|
+
value: _.get(this.ratingSummary, 'totalcount1stars'),
|
|
553
|
+
});
|
|
554
|
+
ratingSummaryPr.breakDown.push({
|
|
555
|
+
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount2stars'), 2, totRatings),
|
|
556
|
+
key: 2,
|
|
557
|
+
value: _.get(this.ratingSummary, 'totalcount2stars'),
|
|
558
|
+
});
|
|
559
|
+
ratingSummaryPr.breakDown.push({
|
|
560
|
+
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount3stars'), 3, totRatings),
|
|
561
|
+
key: 3,
|
|
562
|
+
value: _.get(this.ratingSummary, 'totalcount3stars'),
|
|
563
|
+
});
|
|
564
|
+
ratingSummaryPr.breakDown.push({
|
|
565
|
+
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount4stars'), 4, totRatings),
|
|
566
|
+
key: 4,
|
|
567
|
+
value: _.get(this.ratingSummary, 'totalcount4stars'),
|
|
568
|
+
});
|
|
569
|
+
ratingSummaryPr.breakDown.push({
|
|
570
|
+
percent: this.countStarsPercentage(_.get(this.ratingSummary, 'totalcount5stars'), 5, totRatings),
|
|
571
|
+
key: 5,
|
|
572
|
+
value: _.get(this.ratingSummary, 'totalcount5stars'),
|
|
573
|
+
});
|
|
574
|
+
if (this.ratingSummary && this.ratingSummary.latest50Reviews) {
|
|
575
|
+
const latest50Reviews = JSON.parse(this.ratingSummary.latest50Reviews);
|
|
576
|
+
const modifiedReviews = _.map(latest50Reviews, rating => {
|
|
577
|
+
rating['userId'] = rating.user_id;
|
|
578
|
+
return rating;
|
|
579
|
+
});
|
|
580
|
+
this.authReplies = [];
|
|
581
|
+
this.authReplies = _.keyBy(latest50Reviews, 'user_id');
|
|
582
|
+
const userIds = _.map(latest50Reviews, 'user_id');
|
|
583
|
+
if (this.content) {
|
|
584
|
+
this.getAuthorReply(this.content.identifier, this.content.primaryCategory, userIds);
|
|
585
|
+
}
|
|
586
|
+
ratingSummaryPr.latest50Reviews = modifiedReviews;
|
|
587
|
+
this.ratingReviews = modifiedReviews;
|
|
588
|
+
this.topRatingReviews = modifiedReviews;
|
|
589
|
+
}
|
|
590
|
+
// To pass data to the review content
|
|
591
|
+
this.reviewDataService.setReviewData(this.ratingReviews);
|
|
592
|
+
if (this.ratingSummary && this.ratingSummary.total_number_of_ratings) {
|
|
593
|
+
ratingSummaryPr.avgRating =
|
|
594
|
+
parseFloat((this.ratingSummary.sum_of_total_ratings / this.ratingSummary.total_number_of_ratings).toFixed(1));
|
|
595
|
+
}
|
|
596
|
+
if (this.content) {
|
|
597
|
+
this.content.averageRating = ratingSummaryPr.avgRating;
|
|
598
|
+
this.content.totalRating = ratingSummaryPr.total_number_of_ratings;
|
|
599
|
+
}
|
|
600
|
+
return ratingSummaryPr;
|
|
601
|
+
}
|
|
602
|
+
handleCapitalize(str, type) {
|
|
603
|
+
let tempStr = str;
|
|
604
|
+
if (tempStr) {
|
|
605
|
+
tempStr = tempStr.split('_x000D_,').join('');
|
|
606
|
+
}
|
|
607
|
+
let returnValue = '';
|
|
608
|
+
if (tempStr && type === 'name') {
|
|
609
|
+
returnValue = tempStr.split(' ').map(_str => {
|
|
610
|
+
return _str.charAt(0).toUpperCase() + _str.slice(1);
|
|
611
|
+
}).join(' ');
|
|
612
|
+
}
|
|
613
|
+
else {
|
|
614
|
+
returnValue = tempStr && (tempStr.charAt(0).toUpperCase() + tempStr.slice(1));
|
|
615
|
+
}
|
|
616
|
+
return returnValue;
|
|
617
|
+
}
|
|
618
|
+
handleOpenReviewModal() {
|
|
619
|
+
this.dialogRef = this.dialog.open(ReviewsContentComponent, {
|
|
620
|
+
width: '400px',
|
|
621
|
+
data: { ratings: this.ratingSummaryProcessed, reviews: this.authReplies, latestReviews: this.ratingLookup },
|
|
622
|
+
panelClass: 'ratings-modal-box',
|
|
623
|
+
disableClose: true,
|
|
624
|
+
});
|
|
625
|
+
this.dialogRef.afterClosed().subscribe((_result) => {
|
|
626
|
+
});
|
|
627
|
+
this.dialogRef.componentInstance.initiateLoadMore.subscribe((_value) => {
|
|
628
|
+
this.loadMore(_value);
|
|
629
|
+
});
|
|
630
|
+
this.dialogRef.componentInstance.loadLatestReviews.subscribe((_value) => {
|
|
631
|
+
this.dialogRef.componentInstance.displayLoader = true;
|
|
632
|
+
this.ratingViewCount = this.ratingViewCountDefault;
|
|
633
|
+
this.lastLookUp = '';
|
|
634
|
+
this.ratingReviews = [];
|
|
635
|
+
this.reviewPage = 1;
|
|
636
|
+
this.disableLoadMore = false;
|
|
637
|
+
this.ratingLookup = [];
|
|
638
|
+
if (!this.forPreview) {
|
|
639
|
+
if (_value === 'Latest') {
|
|
640
|
+
this.fetchRatingLookup();
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
this.fetchRatingSummary();
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
});
|
|
647
|
+
}
|
|
648
|
+
loadMore(selectedReview) {
|
|
649
|
+
if (!this.disableLoadMore) {
|
|
650
|
+
this.lookupLoading = true;
|
|
651
|
+
this.reviewPage = this.reviewPage + 1;
|
|
652
|
+
this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
|
|
653
|
+
if (selectedReview === 'Latest') {
|
|
654
|
+
this.reviewPage = this.reviewPage + 1;
|
|
655
|
+
this.ratingViewCount = this.reviewPage * this.reviewDefaultLimit;
|
|
656
|
+
this.fetchRatingLookup();
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
if ((this.reviewPage * this.ratingViewCount) > this.ratingReviews.length) {
|
|
660
|
+
this.disableLoadMore = true;
|
|
661
|
+
this.dialogRef.componentInstance.displayLoader = false;
|
|
662
|
+
}
|
|
663
|
+
this.reviewPage = this.reviewPage + 1;
|
|
664
|
+
this.ratingViewCount = this.reviewPage * this.ratingViewCount;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
navigateToDiscussionHub() {
|
|
669
|
+
const config = {
|
|
670
|
+
menuOptions: [
|
|
671
|
+
{
|
|
672
|
+
route: 'all-discussions',
|
|
673
|
+
label: 'All discussions',
|
|
674
|
+
enable: true,
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
route: 'categories',
|
|
678
|
+
label: 'Categories',
|
|
679
|
+
enable: true,
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
route: 'tags',
|
|
683
|
+
label: 'Tags',
|
|
684
|
+
enable: true,
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
route: 'my-discussion',
|
|
688
|
+
label: 'Your discussion',
|
|
689
|
+
enable: true,
|
|
690
|
+
},
|
|
691
|
+
// {
|
|
692
|
+
// route: 'leaderboard',
|
|
693
|
+
// label: 'Leader Board',
|
|
694
|
+
// enable: true,
|
|
695
|
+
// },
|
|
696
|
+
],
|
|
697
|
+
userName: (this.configService.nodebbUserProfile && this.configService.nodebbUserProfile.username) || '',
|
|
698
|
+
context: {
|
|
699
|
+
id: 1,
|
|
700
|
+
},
|
|
701
|
+
categories: { result: [] },
|
|
702
|
+
routerSlug: '/app',
|
|
703
|
+
headerOptions: false,
|
|
704
|
+
bannerOption: true,
|
|
705
|
+
};
|
|
706
|
+
this.discussUtilitySvc.setDiscussionConfig(config);
|
|
707
|
+
localStorage.setItem('home', JSON.stringify(config));
|
|
708
|
+
this.router.navigate(['/app/discussion-forum'], { queryParams: { page: 'home' }, queryParamsHandling: 'merge' });
|
|
709
|
+
}
|
|
710
|
+
handleClickOfClaim(event) {
|
|
711
|
+
this.handleClaimService.setClaimData(event);
|
|
712
|
+
}
|
|
713
|
+
getCourseIdForCertificate() {
|
|
714
|
+
const paramId = this.activatedRoute.snapshot.paramMap.get('id');
|
|
715
|
+
if (this.content?.contentId?.includes('ext_')) {
|
|
716
|
+
return this.content.contentId;
|
|
717
|
+
}
|
|
718
|
+
return paramId || '';
|
|
719
|
+
}
|
|
720
|
+
// handleOpenCertificateDialog() {
|
|
721
|
+
// this.downloadCertificateBool = true;
|
|
722
|
+
// const certId = this.content && this.content?.certificateObj?.certId;
|
|
723
|
+
// if (this.content && this.pageConfigData) {
|
|
724
|
+
// const allowedPrimaryCategory =
|
|
725
|
+
// this.pageConfigData?.dynamicCertificateGeneration?.allows &&
|
|
726
|
+
// this.pageConfigData?.dynamicCertificateGeneration?.allows?.map(
|
|
727
|
+
// (cat: string) => cat?.toLowerCase()
|
|
728
|
+
// );
|
|
729
|
+
// if (
|
|
730
|
+
// allowedPrimaryCategory &&
|
|
731
|
+
// ( allowedPrimaryCategory.includes(this.content?.primaryCategory?.toLowerCase()) ||
|
|
732
|
+
// allowedPrimaryCategory.includes(this.content?.courseCategory?.toLowerCase()))
|
|
733
|
+
// ) {
|
|
734
|
+
// const payload = {
|
|
735
|
+
// request: {
|
|
736
|
+
// courseId: this.content.identifier,
|
|
737
|
+
// batchId: this.batchData?.content[0]?.batchId || '',
|
|
738
|
+
// userId: this.userProfile.userId,
|
|
739
|
+
// },
|
|
740
|
+
// };
|
|
741
|
+
// this.contentSvc.downloadCertV2(payload).subscribe(
|
|
742
|
+
// (response) => {
|
|
743
|
+
// if (response) {
|
|
744
|
+
// this.downloadCertificateBool = false;
|
|
745
|
+
// this.dialog.open(CertificateDialogComponent, {
|
|
746
|
+
// width: '1200px',
|
|
747
|
+
// data: {
|
|
748
|
+
// cet: response.result.printUri,
|
|
749
|
+
// certId:
|
|
750
|
+
// (this.content && this.content.certificateObj.certId) || '',
|
|
751
|
+
// },
|
|
752
|
+
// });
|
|
753
|
+
// }
|
|
754
|
+
// },
|
|
755
|
+
// (error: any) => {
|
|
756
|
+
// this.downloadCertificateBool = false;
|
|
757
|
+
// this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
758
|
+
// this.matSnackBar.open(
|
|
759
|
+
// 'Unable to View Certificate, due to some error!'
|
|
760
|
+
// );
|
|
761
|
+
// }
|
|
762
|
+
// );
|
|
763
|
+
// } else {debugger
|
|
764
|
+
// this.contentSvc.downloadCert(certId).subscribe(
|
|
765
|
+
// (response) => {
|
|
766
|
+
// if (this.content) {
|
|
767
|
+
// this.downloadCertificateBool = false;
|
|
768
|
+
// this.content['certificateObj']['certData'] =
|
|
769
|
+
// response.result.printUri;
|
|
770
|
+
// this.dialog.open(CertificateDialogComponent, {
|
|
771
|
+
// width: '1200px',
|
|
772
|
+
// data: {
|
|
773
|
+
// cet: response.result.printUri,
|
|
774
|
+
// certId: this.content && this.content.certificateObj.certId,
|
|
775
|
+
// },
|
|
776
|
+
// });
|
|
777
|
+
// }
|
|
778
|
+
// },
|
|
779
|
+
// (error: any) => {
|
|
780
|
+
// this.downloadCertificateBool = false;
|
|
781
|
+
// this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
782
|
+
// this.matSnackBar.open(
|
|
783
|
+
// 'Unable to View Certificate, please check again later!'
|
|
784
|
+
// );
|
|
785
|
+
// }
|
|
786
|
+
// );
|
|
787
|
+
// }
|
|
788
|
+
// }
|
|
789
|
+
// }
|
|
790
|
+
handleOpenCertificateDialog() {
|
|
791
|
+
this.downloadCertificateBool = true;
|
|
792
|
+
const certId = this.content && this.content.certificateObj.certId;
|
|
793
|
+
if (this.content && this.content.certificateObj && !this.content.certificateObj.certData) {
|
|
794
|
+
if (certId) {
|
|
795
|
+
this.contentSvc.downloadCert(certId).subscribe(response => {
|
|
796
|
+
if (this.content) {
|
|
797
|
+
this.downloadCertificateBool = false;
|
|
798
|
+
this.content['certificateObj']['certData'] = response.result.printUri;
|
|
799
|
+
this.dialog.open(CertificateDialogComponent, {
|
|
800
|
+
width: '1200px',
|
|
801
|
+
data: { cet: response.result.printUri, certId: this.content && this.content.certificateObj.certId },
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
}, (error) => {
|
|
805
|
+
this.downloadCertificateBool = false;
|
|
806
|
+
this.loggerService.error('CERTIFICATE FETCH ERROR >', error);
|
|
807
|
+
this.matSnackBar.open('Unable to View Certificate, due to some error!');
|
|
808
|
+
});
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
else {
|
|
812
|
+
this.downloadCertificateBool = false;
|
|
813
|
+
this.dialog.open(CertificateDialogComponent, {
|
|
814
|
+
width: '1200px',
|
|
815
|
+
data: { cet: this.content && this.content.certificateObj.certData, certId: this.content && this.content.certificateObj.certId },
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
openSurveyFormPopup() {
|
|
820
|
+
this.trigerCompletionSurveyForm.emit(true);
|
|
821
|
+
}
|
|
822
|
+
checkValidJSON(str) {
|
|
823
|
+
try {
|
|
824
|
+
JSON.parse(str);
|
|
825
|
+
return true;
|
|
826
|
+
}
|
|
827
|
+
catch (e) {
|
|
828
|
+
return false;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
handleSubsector(item) {
|
|
832
|
+
this.subSectorDetailArr = [];
|
|
833
|
+
this.selectedSector = '';
|
|
834
|
+
this.selectedSectorId = '';
|
|
835
|
+
if (this.baseContentReadData) {
|
|
836
|
+
for (let i = 0; i < this.baseContentReadData.sectorDetails_v1.length; i++) {
|
|
837
|
+
if (this.baseContentReadData.sectorDetails_v1[i]['sectorId'] === item.sectorId) {
|
|
838
|
+
if (this.baseContentReadData.sectorDetails_v1[i]['subSectorName']) {
|
|
839
|
+
let obj = {};
|
|
840
|
+
obj = {
|
|
841
|
+
'sectorId': this.baseContentReadData.sectorDetails_v1[i]['sectorId'],
|
|
842
|
+
'sectorName': this.baseContentReadData.sectorDetails_v1[i]['sectorName'],
|
|
843
|
+
'key': this.baseContentReadData.sectorDetails_v1[i]['subSectorName'],
|
|
844
|
+
'value': [this.baseContentReadData.sectorDetails_v1[i]['subSectorName']]
|
|
845
|
+
};
|
|
846
|
+
this.subSectorDetailArr.push(obj);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
this.selectedSector = item.sectorName;
|
|
851
|
+
this.selectedSectorId = item.sectorId;
|
|
852
|
+
const valueObj = item;
|
|
853
|
+
const subSectorArray = [];
|
|
854
|
+
for (const key in valueObj) {
|
|
855
|
+
if (valueObj.hasOwnProperty(key)) {
|
|
856
|
+
const _tempObj = {};
|
|
857
|
+
_tempObj['key'] = key;
|
|
858
|
+
_tempObj['value'] = valueObj[key];
|
|
859
|
+
subSectorArray.push(_tempObj);
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
this.strip['sectorWidgets'] = this.transformCompetenciesToWidget('Behavioural', this.subSectorDetailArr, this.strip);
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
ngOnDestroy() {
|
|
866
|
+
this.destroySubject$.unsubscribe();
|
|
867
|
+
this.timerUnsubscribe.unsubscribe();
|
|
868
|
+
if (this.refreshratingSub) {
|
|
869
|
+
this.refreshratingSub.unsubscribe();
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, deps: [{ token: i1.RatingService }, { token: i2.LoggerService }, { token: i3.MatLegacyDialog }, { token: i4.MatLegacySnackBar }, { token: i5.LoadCheckService }, { token: i6.TimerService }, { token: i7.AppTocService }, { token: i2.ConfigurationsService }, { token: i8.DiscussUtilsService }, { token: i9.Router }, { token: i10.ReviewComponentDataService }, { token: i11.HandleClaimService }, { token: i12.ResetRatingsService }, { token: i2.WidgetContentService }, { token: i9.ActivatedRoute }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
873
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: { condition: "condition", kparray: "kparray", content: "content", contentReadData: "contentReadData", baseContentReadData: "baseContentReadData", skeletonLoader: "skeletonLoader", sticky: "sticky", tocStructure: "tocStructure", pathSet: "pathSet", config: "config", resumeData: "resumeData", forPreview: "forPreview", showReviews: "showReviews", batchData: "batchData", fromViewer: "fromViewer", selectedBatchData: "selectedBatchData", selectedTabValue: "selectedTabValue", fromMarketPlace: "fromMarketPlace", showMarketPlaceCertificate: "showMarketPlaceCertificate", languageList: "languageList", lockCertificate: "lockCertificate" }, outputs: { trigerCompletionSurveyForm: "trigerCompletionSurveyForm" }, viewQueries: [{ propertyName: "summaryElem", first: true, predicate: ["summaryElem"], descendants: true }, { propertyName: "objectivesElem", first: true, predicate: ["objectivesElem"], descendants: true }, { propertyName: "descElem", first: true, predicate: ["descElem"], descendants: true }, { propertyName: "tagsElem", first: true, predicate: ["tagsElem"], descendants: true }, { propertyName: "searchTagElem", first: true, predicate: ["searchTagElem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #certificateCard>\r\n <ng-container *ngIf=\"!disableCertificate\">\r\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\r\n <div class=\"certificate-outer-div\">\r\n <div class=\"certificate-card\">\r\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-1\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\r\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\r\n </div>\r\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\r\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\r\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\r\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\r\n content?.completedOn\r\n ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n\r\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\r\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\r\n content?.completedOn ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n\r\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\r\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\r\n ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n <div class=\"flex justify-center download-section\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\r\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container>\r\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\r\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\r\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\r\n [diameter]=\"20\"></mat-spinner>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"flex-1\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\r\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\r\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\r\n alt=\"No certificate image\" />\r\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\r\n alt=\"No certificate image\" />\r\n <div class=\"flex items-center certificate_overlay\">\r\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\r\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\r\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\r\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\r\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\r\n mission.karmayogi@gov.in</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\r\n <div class=\"img-container\">\r\n <img class=\"celebration-animation\"\r\n src=\"assets/images/animation/leaderboard_animation.gif\" />\r\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\r\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\r\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\r\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\r\n alt=\"certificate image\" />\r\n\r\n <div\r\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\r\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\r\n <span *ngIf=\"!downloadCertificateBool\">{{\r\n 'apptoccontentcard.viewCertificate' | translate }}</span>\r\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\r\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\r\n <img class=\"ceritificate-image\"\r\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\r\n alt=\"certificate image\" />\r\n </ng-container> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-wrap gap-3 chips-card\">\r\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\r\n <div class=\"chip rounded-full p-2 text-xs\"\r\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\r\n [title]=\"subTheme\">{{ subTheme }}</div>\r\n </ng-container>\r\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\r\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\r\n (click)=\"content.viewMore = !content.viewMore\">\r\n {{'competencyCardDetails.viewMore' | translate}}\r\n </div>\r\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\r\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\r\n {{'competencyCardDetails.viewLess' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #certificateLock>\r\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\r\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\r\n <div class=\"flex justify-center items-center certificate-lock-text\">\r\n {{ 'apptoc.certificateLocked' | translate }}\r\n </div>\r\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\r\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\r\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\r\n <div class=\"locking-screen-description\">\r\n {{'apptoc.unlockCertificate' | translate}} <span\r\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\r\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\r\n content?.courseCategory : content?.primaryCategory } }}\r\n </div>\r\n\r\n <button mat-button class=\"surveyFormeButton px-7\"\r\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #competencyLabel>\r\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\r\n {{ 'apptocsinglepage.competencies' | translate }}\r\n <mat-icon\r\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\r\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\r\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\r\n\r\n <ng-container\r\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\r\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"flex flex-row earned-certificate-container\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"certificate-background\">\r\n <div class=\"p-4\">\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n <div class=\"flex flex-col items-end\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"earned-certificate-container\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n\r\n <div class=\"certificate-background\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\r\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\r\n <div class=\"flex flex-row earned-certificate-container\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"certificate-background\">\r\n <div class=\"p-4\">\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n <div class=\"flex flex-col items-end\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"earned-certificate-container\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n\r\n <div class=\"certificate-background\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\r\n <div class=\"flex flex-col gap-1 mt-2\">\r\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\r\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\r\n content?.source }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\r\n '0' }}\r\n </div>\r\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\r\n </div>\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\r\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\r\n </div>\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\r\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-1\">\r\n <div class=\"flex underline\"></div>\r\n </div>\r\n <div class=\"flex\">\r\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\r\n </div>\r\n <div class=\"flex-1\">\r\n <div class=\"flex underline\"></div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row gap-4 justify-center\">\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\r\n </div>\r\n <div class=\"flex items-center counter-label\">\r\n :\r\n </div>\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\r\n </div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\r\n </div>\r\n <div class=\"flex items-center counter-label\">\r\n :\r\n </div>\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-row gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\r\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\r\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\r\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\"\r\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\r\n <div class=\"desc\"\r\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\r\n #descElem>\r\n\r\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\r\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}</div>\r\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\r\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\r\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\r\n #summaryElem>\r\n <div class=\"mob-text nodtranslate\"\r\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\r\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\r\n 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\r\n <div class=\"desc\"\r\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\r\n #descElem>\r\n\r\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\r\n class=\"mob-text break-words nodtranslate\"></div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.objectives' | translate\r\n }}</div>\r\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\r\n #objectivesElem>\r\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\r\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-col gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-row gap-3\">\r\n <ng-container *ngFor=\"let i of [1, 2]\">\r\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex flex-row gap-4\">\r\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\r\n <div class=\"flex flex-col\">\r\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\r\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\r\n <div class=\"flex flex-col gap-3\">\r\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\r\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\r\n <ng-container *ngFor=\"let item of competenciesObject\">\r\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\r\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let item of competenciesObject\">\r\n <div *ngIf=\"item?.key === competencySelected\">\r\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\r\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\r\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\r\n </ng-container>\r\n </ws-utils-horizontal-scroller-v2>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <!-- {{content|json}} -->\r\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\r\n <ng-container [ngTemplateOutlet]=\"tagsList\"\r\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\r\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\r\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\r\n content?.resourceCategory?.toLowerCase() === 'case study')\">\r\n <div class=\" flex flex-col\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\r\n <ng-container *ngIf=\"sectorsList?.length > 0\">\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\r\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\r\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\r\n <div class=\"themes-button\"\r\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\r\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\r\n <div>\r\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\r\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\r\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\r\n </ng-container>\r\n </ws-utils-horizontal-scroller-v2>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\r\n <div class=\"mb-2\">\r\n No Subsector Available\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"flex flex-wrap gap-2\" >\r\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\r\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\r\n <div class=\"flex flex-col\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\r\n <div class=\"flex flex-wrap gap-2\" >\r\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\r\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <ng-template #tagsList let-tagData=\"tagData\">\r\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\r\n <ng-container *ngIf=\"tagData?.length\">\r\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\r\n #tagsElem>\r\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\r\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\r\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\r\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\r\n translate }}</div>\r\n </ng-container>\r\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\r\n {{ 'userProfile.noTags' | translate }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\r\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\r\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\r\n <ng-container *ngIf=\"content?.searchTags.length\">\r\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\r\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\r\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\r\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </ng-container>\r\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\r\n {{ 'userProfile.noTags' | translate }}\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <div class=\"mobile-karma-points\">\r\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\r\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\r\n </ws-widget-karma-points>\r\n </div>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\r\n <!-- commented because of new discussion v2 comments implmentation -->\r\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\r\n <div class=\"flex-1 forum-content\">\r\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\r\n <mat-icon>forum</mat-icon>\r\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\r\n </div>\r\n </div>\r\n <div class=\"flex-none p-3\">\r\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-col gap-6\">\r\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\r\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n\r\n <div class=\"flex flex-row items-center gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\r\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2\">\r\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\r\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\r\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-row gap-4 items-center\"\r\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\r\n <div class=\"flex items-center justify-center\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\r\n </ws-widget-avatar-photo>\r\n </div>\r\n <div class=\"flex flex-col gap-1 justify-center\">\r\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\r\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row gap-4\"\r\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\r\n <div class=\"flex items-center justify-center\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\r\n </ws-widget-avatar-photo>\r\n </div>\r\n <div class=\"flex flex-col gap-1 justify-center\">\r\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\r\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\r\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\r\n <div class=\"flex flex-row gap-4 items-center\">\r\n <div class=\"provider-logo-div\">\r\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\r\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\r\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\r\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\r\n </div>\r\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\r\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\r\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\r\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"flex flex-row gap-4\">\r\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\r\n 'apptocsinglepage.topReviews' | translate }}</div>\r\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\r\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\r\n 'msg.showAll' | translate }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\r\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\r\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\r\n <div class=\"p-4 flex flex-col gap-6\">\r\n <div class=\"flex flex-row gap-4\">\r\n <div class=\"flex-1\">\r\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\r\n handleCapitalize(eachReview?.review) }}</div>\r\n </div>\r\n <div class=\"flex flex-row gap-2 rating-start-value\">\r\n <mat-icon>star</mat-icon>\r\n <div>{{ eachReview?.rating }}</div>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-row gap-2 items-center text-sm\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"eachReview?.photo || ''\"\r\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\r\n <div class=\"flex flex-wrap\">\r\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\r\n <div class=\"flex items-center mx-2\">\r\n <span class=\"period\"></span>\r\n </div>\r\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\r\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\r\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\r\n }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- </ng-container> -->\r\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\r\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\r\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\r\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\r\n </div>\r\n </ng-container> -->\r\n </ng-container>\r\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i17.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i18.RatingSummaryComponent, selector: "ws-widget-rating-summary", inputs: ["ratingSummary"] }, { kind: "component", type: i2.HorizontalScrollerV2Component, selector: "ws-utils-horizontal-scroller-v2", inputs: ["loadStatus", "onHover", "sliderConfig", "widgetsLength", "defaultMaxWidgets", "stripConfig", "stripsResultDataMap", "subtype"], outputs: ["loadNext"] }, { kind: "directive", type: i19.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i20.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i21.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "pipe", type: i13.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.DatePipe, name: "date" }, { kind: "pipe", type: i2.PipeRelativeTimePipe, name: "pipeRelativeTime" }, { kind: "pipe", type: i22.TranslatePipe, name: "translate" }, { kind: "pipe", type: i23.ReplaceNbspPipe, name: "replaceNbsp" }] }); }
|
|
874
|
+
}
|
|
875
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, decorators: [{
|
|
876
|
+
type: Component,
|
|
877
|
+
args: [{ selector: 'ws-widget-app-toc-about', template: "<ng-template #certificateCard>\r\n <ng-container *ngIf=\"!disableCertificate\">\r\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\r\n <div class=\"certificate-outer-div\">\r\n <div class=\"certificate-card\">\r\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-1\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\r\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\r\n </div>\r\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\r\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\r\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\r\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\r\n content?.completedOn\r\n ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n\r\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\r\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\r\n content?.completedOn ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n\r\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\r\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\r\n ?\r\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n <div class=\"flex justify-center download-section\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\r\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container>\r\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\r\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\r\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\r\n [diameter]=\"20\"></mat-spinner>\r\n </ng-container>\r\n </div>\r\n </div>\r\n <div class=\"flex-1\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\r\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\r\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\r\n alt=\"No certificate image\" />\r\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\r\n alt=\"No certificate image\" />\r\n <div class=\"flex items-center certificate_overlay\">\r\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\r\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\r\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\r\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\r\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\r\n mission.karmayogi@gov.in</a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\r\n <div class=\"img-container\">\r\n <img class=\"celebration-animation\"\r\n src=\"assets/images/animation/leaderboard_animation.gif\" />\r\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\r\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\r\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\r\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\r\n alt=\"certificate image\" />\r\n\r\n <div\r\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\r\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\r\n <span *ngIf=\"!downloadCertificateBool\">{{\r\n 'apptoccontentcard.viewCertificate' | translate }}</span>\r\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\r\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\r\n <img class=\"ceritificate-image\"\r\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\r\n alt=\"certificate image\" />\r\n </ng-container> -->\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-wrap gap-3 chips-card\">\r\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\r\n <div class=\"chip rounded-full p-2 text-xs\"\r\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\r\n [title]=\"subTheme\">{{ subTheme }}</div>\r\n </ng-container>\r\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\r\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\r\n (click)=\"content.viewMore = !content.viewMore\">\r\n {{'competencyCardDetails.viewMore' | translate}}\r\n </div>\r\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\r\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\r\n {{'competencyCardDetails.viewLess' | translate}}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-template #certificateLock>\r\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\r\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\r\n <div class=\"flex justify-center items-center certificate-lock-text\">\r\n {{ 'apptoc.certificateLocked' | translate }}\r\n </div>\r\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\r\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\r\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\r\n <div class=\"locking-screen-description\">\r\n {{'apptoc.unlockCertificate' | translate}} <span\r\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\r\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\r\n content?.courseCategory : content?.primaryCategory } }}\r\n </div>\r\n\r\n <button mat-button class=\"surveyFormeButton px-7\"\r\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #competencyLabel>\r\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\r\n {{ 'apptocsinglepage.competencies' | translate }}\r\n <mat-icon\r\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\r\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\r\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\r\n </div>\r\n</ng-template>\r\n\r\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\r\n\r\n <ng-container\r\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\r\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"flex flex-row earned-certificate-container\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"certificate-background\">\r\n <div class=\"p-4\">\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n <div class=\"flex flex-col items-end\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"earned-certificate-container\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n\r\n <div class=\"certificate-background\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\r\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\r\n <div class=\"flex flex-row earned-certificate-container\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"certificate-background\">\r\n <div class=\"p-4\">\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n <div class=\"flex flex-col items-end\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\r\n <div class=\"earned-certificate-container\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"ribbon\"></div>\r\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\r\n </div>\r\n\r\n <div class=\"certificate-background\">\r\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\r\n <div class=\"flex flex-col gap-1 mt-2\">\r\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\r\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\r\n content?.source }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\r\n '0' }}\r\n </div>\r\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\r\n </div>\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\r\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\r\n </div>\r\n <div class=\"batch-info\">\r\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\r\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\r\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\r\n <div class=\"flex flex-row\">\r\n <div class=\"flex-1\">\r\n <div class=\"flex underline\"></div>\r\n </div>\r\n <div class=\"flex\">\r\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\r\n </div>\r\n <div class=\"flex-1\">\r\n <div class=\"flex underline\"></div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row gap-4 justify-center\">\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\r\n </div>\r\n <div class=\"flex items-center counter-label\">\r\n :\r\n </div>\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\r\n </div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\r\n </div>\r\n <div class=\"flex items-center counter-label\">\r\n :\r\n </div>\r\n <div class=\"flex flex-row gap-1 items-center\">\r\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\r\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-row gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\r\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\r\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\r\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\"\r\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\r\n <div class=\"desc\"\r\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\r\n #descElem>\r\n\r\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\r\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}</div>\r\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\r\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\r\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\r\n #summaryElem>\r\n <div class=\"mob-text nodtranslate\"\r\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\r\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\r\n 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\r\n <div class=\"desc\"\r\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\r\n #descElem>\r\n\r\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\r\n class=\"mob-text break-words nodtranslate\"></div>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.objectives' | translate\r\n }}</div>\r\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\r\n #objectivesElem>\r\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\r\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\r\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\r\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </div>\r\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\r\n <span class=\"cursor-pointer\"\r\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-col gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-row gap-3\">\r\n <ng-container *ngFor=\"let i of [1, 2]\">\r\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex flex-row gap-4\">\r\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\r\n <div class=\"flex flex-col\">\r\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\r\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\r\n <div class=\"flex flex-col gap-3\">\r\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\r\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\r\n <ng-container *ngFor=\"let item of competenciesObject\">\r\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\r\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let item of competenciesObject\">\r\n <div *ngIf=\"item?.key === competencySelected\">\r\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\r\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\r\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\r\n </ng-container>\r\n </ws-utils-horizontal-scroller-v2>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2 mt-4\">\r\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <!-- {{content|json}} -->\r\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\r\n <ng-container [ngTemplateOutlet]=\"tagsList\"\r\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\r\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\r\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\r\n content?.resourceCategory?.toLowerCase() === 'case study')\">\r\n <div class=\" flex flex-col\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\r\n <ng-container *ngIf=\"sectorsList?.length > 0\">\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\r\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\r\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\r\n <div class=\"themes-button\"\r\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\r\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\r\n <div>\r\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\r\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\r\n <ng-container [wsResolverWidget]=\"widget\"></ng-container>\r\n </ng-container>\r\n </ws-utils-horizontal-scroller-v2>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\r\n <div class=\"mb-2\">\r\n No Subsector Available\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"flex flex-wrap gap-2\" >\r\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\r\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div> -->\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\r\n <div class=\"flex flex-col\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\r\n <div class=\"flex flex-wrap gap-2\" >\r\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\r\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <ng-template #tagsList let-tagData=\"tagData\">\r\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\r\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\r\n <ng-container *ngIf=\"tagData?.length\">\r\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\r\n #tagsElem>\r\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\r\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\r\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\r\n 'apptocsinglepage.viewMore' | translate }}</div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\r\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\r\n translate }}</div>\r\n </ng-container>\r\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\r\n {{ 'userProfile.noTags' | translate }}\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\r\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\r\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\r\n <ng-container *ngIf=\"content?.searchTags.length\">\r\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\r\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\r\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\r\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\r\n <span class=\"period\"></span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\r\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\r\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\r\n </ng-container>\r\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\r\n {{ 'userProfile.noTags' | translate }}\r\n </div>\r\n </div>\r\n </ng-container> -->\r\n\r\n <div class=\"mobile-karma-points\">\r\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\r\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\r\n </ws-widget-karma-points>\r\n </div>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\r\n <!-- commented because of new discussion v2 comments implmentation -->\r\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\r\n <div class=\"flex-1 forum-content\">\r\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\r\n <mat-icon>forum</mat-icon>\r\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\r\n </div>\r\n </div>\r\n <div class=\"flex-none p-3\">\r\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\r\n </div>\r\n </div> -->\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <div class=\"flex flex-col gap-6\">\r\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\r\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n\r\n <div class=\"flex flex-row items-center gap-3\">\r\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\r\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\r\n <div class=\"flex flex-col gap-2\">\r\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\r\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\r\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-row gap-4 items-center\"\r\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\r\n <div class=\"flex items-center justify-center\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\r\n </ws-widget-avatar-photo>\r\n </div>\r\n <div class=\"flex flex-col gap-1 justify-center\">\r\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\r\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-row gap-4\"\r\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\r\n <div class=\"flex items-center justify-center\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\r\n </ws-widget-avatar-photo>\r\n </div>\r\n <div class=\"flex flex-col gap-1 justify-center\">\r\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\r\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\r\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\r\n <div class=\"flex flex-row gap-4 items-center\">\r\n <div class=\"provider-logo-div\">\r\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\r\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\r\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\r\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\r\n </div>\r\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"skeletonLoader\">\r\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\r\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\r\n </ng-container>\r\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\r\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\r\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\r\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\r\n\r\n <div class=\"flex flex-col gap-3\">\r\n <div class=\"flex flex-row gap-4\">\r\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\r\n 'apptocsinglepage.topReviews' | translate }}</div>\r\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\r\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\r\n 'msg.showAll' | translate }}</div>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\r\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\r\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\r\n <div class=\"p-4 flex flex-col gap-6\">\r\n <div class=\"flex flex-row gap-4\">\r\n <div class=\"flex-1\">\r\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\r\n handleCapitalize(eachReview?.review) }}</div>\r\n </div>\r\n <div class=\"flex flex-row gap-2 rating-start-value\">\r\n <mat-icon>star</mat-icon>\r\n <div>{{ eachReview?.rating }}</div>\r\n </div>\r\n </div>\r\n <div class=\"flex flex-row gap-2 items-center text-sm\">\r\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\r\n [photoUrl]=\"eachReview?.photo || ''\"\r\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\r\n <div class=\"flex flex-wrap\">\r\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\r\n <div class=\"flex items-center mx-2\">\r\n <span class=\"period\"></span>\r\n </div>\r\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\r\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\r\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\r\n }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- </ng-container> -->\r\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\r\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\r\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\r\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\r\n </div>\r\n </ng-container> -->\r\n </ng-container>\r\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"] }]
|
|
878
|
+
}], ctorParameters: function () { return [{ type: i1.RatingService }, { type: i2.LoggerService }, { type: i3.MatLegacyDialog }, { type: i4.MatLegacySnackBar }, { type: i5.LoadCheckService }, { type: i6.TimerService }, { type: i7.AppTocService }, { type: i2.ConfigurationsService }, { type: i8.DiscussUtilsService }, { type: i9.Router }, { type: i10.ReviewComponentDataService }, { type: i11.HandleClaimService }, { type: i12.ResetRatingsService }, { type: i2.WidgetContentService }, { type: i9.ActivatedRoute }, { type: undefined, decorators: [{
|
|
879
|
+
type: Inject,
|
|
880
|
+
args: ['environment']
|
|
881
|
+
}] }]; }, propDecorators: { condition: [{
|
|
882
|
+
type: Input
|
|
883
|
+
}], kparray: [{
|
|
884
|
+
type: Input
|
|
885
|
+
}], content: [{
|
|
886
|
+
type: Input
|
|
887
|
+
}], contentReadData: [{
|
|
888
|
+
type: Input
|
|
889
|
+
}], baseContentReadData: [{
|
|
890
|
+
type: Input
|
|
891
|
+
}], skeletonLoader: [{
|
|
892
|
+
type: Input
|
|
893
|
+
}], sticky: [{
|
|
894
|
+
type: Input
|
|
895
|
+
}], tocStructure: [{
|
|
896
|
+
type: Input
|
|
897
|
+
}], pathSet: [{
|
|
898
|
+
type: Input
|
|
899
|
+
}], config: [{
|
|
900
|
+
type: Input
|
|
901
|
+
}], resumeData: [{
|
|
902
|
+
type: Input
|
|
903
|
+
}], forPreview: [{
|
|
904
|
+
type: Input
|
|
905
|
+
}], showReviews: [{
|
|
906
|
+
type: Input
|
|
907
|
+
}], batchData: [{
|
|
908
|
+
type: Input
|
|
909
|
+
}], fromViewer: [{
|
|
910
|
+
type: Input
|
|
911
|
+
}], selectedBatchData: [{
|
|
912
|
+
type: Input
|
|
913
|
+
}], selectedTabValue: [{
|
|
914
|
+
type: Input
|
|
915
|
+
}], fromMarketPlace: [{
|
|
916
|
+
type: Input
|
|
917
|
+
}], showMarketPlaceCertificate: [{
|
|
918
|
+
type: Input
|
|
919
|
+
}], languageList: [{
|
|
920
|
+
type: Input
|
|
921
|
+
}], lockCertificate: [{
|
|
922
|
+
type: Input
|
|
923
|
+
}], trigerCompletionSurveyForm: [{
|
|
924
|
+
type: Output
|
|
925
|
+
}], summaryElem: [{
|
|
926
|
+
type: ViewChild,
|
|
927
|
+
args: ['summaryElem']
|
|
928
|
+
}], objectivesElem: [{
|
|
929
|
+
type: ViewChild,
|
|
930
|
+
args: ['objectivesElem']
|
|
931
|
+
}], descElem: [{
|
|
932
|
+
type: ViewChild,
|
|
933
|
+
args: ['descElem']
|
|
934
|
+
}], tagsElem: [{
|
|
935
|
+
type: ViewChild,
|
|
936
|
+
args: ['tagsElem']
|
|
937
|
+
}], searchTagElem: [{
|
|
938
|
+
type: ViewChild,
|
|
939
|
+
args: ['searchTagElem']
|
|
940
|
+
}] } });
|
|
941
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1hYm91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWFib3V0L2FwcC10b2MtYWJvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1hYm91dC9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFzRCxTQUFTLEVBQWMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFJakssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFMUMsMkJBQTJCO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUd6QixPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUd0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFZdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUE7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFuQmxHLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7QUFDNUIsS0FBSyxD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QUFTO3VCQUFDLGdCQUFnQjtnQkFDSixRQUFRO3NCQUE5QixTQUFTO3VCQUFDLFVBQVU7Z0JBQ0UsUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNPLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXHJcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInXHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXHJcbmRheWpzLmV4dGVuZChpc1NhbWVPckFmdGVyKVxyXG5pbXBvcnQgaXNTYW1lT3JCZWZvcmUgZnJvbSAnZGF5anMvcGx1Z2luL2lzU2FtZU9yQmVmb3JlJ1xyXG5pbXBvcnQgaXNTYW1lT3JBZnRlciBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JBZnRlcidcclxuXHJcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcclxuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xyXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xyXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlLCBDb25maWd1cmF0aW9uc1NlcnZpY2UsIFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXHJcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXHJcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3RpbWVyLnNlcnZpY2UnXHJcbmltcG9ydCB7IEhhbmRsZUNsYWltU2VydmljZSB9IGZyb20gJy4uL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXHJcbmltcG9ydCB7IExvYWRDaGVja1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9sb2FkLWNoZWNrLnNlcnZpY2UnXHJcbmltcG9ydCB7IFJldmlld0NvbXBvbmVudERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vY29udGVudC1zZXJ2aWNlcy9yZXZpZXctY29tcG9uZW50LWRhdGEuc2VydmljZSdcclxuaW1wb3J0IHsgUmVzZXRSYXRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3Jlc2V0LXJhdGluZ3Muc2VydmljZSdcclxuaW1wb3J0IHsgTnNDb250ZW50U3RyaXBXaXRoVGFicyB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9jb250ZW50LXN0cmlwLXdpdGgtdGFicy5tb2RlbCdcclxuaW1wb3J0IHsgRGlzY3Vzc1V0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2Rpc2N1c3MtdXRpbHMuc2VydmljZSdcclxuXHJcbmltcG9ydCB7IFJldmlld3NDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vcmV2aWV3cy1jb250ZW50L3Jldmlld3MtY29udGVudC5jb21wb25lbnQnXHJcbmltcG9ydCB7IENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2VydGlmaWNhdGUtZGlhbG9nL2NlcnRpZmljYXRlLWRpYWxvZy5jb21wb25lbnQnXHJcblxyXG5pbnRlcmZhY2UgSVN0cmlwVW5pdENvbnRlbnREYXRhIHtcclxuICBrZXk6IHN0cmluZ1xyXG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhblxyXG4gIG1vZGU/OiBzdHJpbmdcclxuICBzaG93U3RyaXA6IGJvb2xlYW5cclxuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXVxyXG4gIHN0cmlwVGl0bGU6IHN0cmluZ1xyXG4gIHN0cmlwVGl0bGVMaW5rPzoge1xyXG4gICAgbGluazogc3RyaW5nLFxyXG4gICAgaWNvbjogc3RyaW5nXHJcbiAgfSxcclxuICBzbGlkZXJDb25maWc/OiB7XHJcbiAgICBzaG93TmF2czogYm9vbGVhbixcclxuICAgIHNob3dEb3RzOiBib29sZWFuLFxyXG4gICAgbWF4V2lkZ2V0cz86IG51bWJlclxyXG4gIH0sXHJcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYltdIHwgdW5kZWZpbmVkLFxyXG4gIHN0cmlwTmFtZT86IHN0cmluZ1xyXG4gIHN0cmlwTG9nbz86IHN0cmluZ1xyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXHJcbiAgc3RyaXBJbmZvPzogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JU3RyaXBJbmZvXHJcbiAgbm9EYXRhV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFcclxuICBlcnJvcldpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhXHJcbiAgc2hvd09uTm9EYXRhOiBib29sZWFuXHJcbiAgc2hvd09uTG9hZGVyOiBib29sZWFuXHJcbiAgc2hvd09uRXJyb3I6IGJvb2xlYW5cclxuICBsb2FkZXJXaWRnZXRzPzogYW55XHJcbiAgc3RyaXBCYWNrZ3JvdW5kPzogc3RyaW5nXHJcbiAgc2Vjb25kYXJ5SGVhZGluZz86IGFueVxyXG4gIHZpZXdNb3JlVXJsOiBhbnksXHJcbiAgc2VjdG9yV2lkZ2V0cz86IGFueVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtdG9jLWFib3V0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1hYm91dC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1hYm91dC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFwcFRvY0Fib3V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBcclxuICBASW5wdXQoKSBjb25kaXRpb246IGFueVxyXG4gIEBJbnB1dCgpIGtwYXJyYXk6IGFueVxyXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxyXG4gIEBJbnB1dCgpIGJhc2VDb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXHJcbiAgQElucHV0KCkgc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxyXG4gIEBJbnB1dCgpIHN0aWNreSA9IGZhbHNlXHJcbiAgQElucHV0KCkgdG9jU3RydWN0dXJlOiBhbnlcclxuICBASW5wdXQoKSBwYXRoU2V0OiBhbnlcclxuICBASW5wdXQoKSBjb25maWc6IGFueVxyXG4gIEBJbnB1dCgpIHJlc3VtZURhdGE6IGFueVxyXG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxyXG4gIEBJbnB1dCgpIHNob3dSZXZpZXdzID0gZmFsc2VcclxuICBASW5wdXQoKSBiYXRjaERhdGE6IGFueVxyXG4gIEBJbnB1dCgpIGZyb21WaWV3ZXIgPSBmYWxzZVxyXG4gIEBJbnB1dCgpIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcclxuICBASW5wdXQoKSBzZWxlY3RlZFRhYlZhbHVlID0gMFxyXG4gIEBJbnB1dCgpIGZyb21NYXJrZXRQbGFjZT8gPSBmYWxzZVxyXG4gIEBJbnB1dCgpIHNob3dNYXJrZXRQbGFjZUNlcnRpZmljYXRlID0gZmFsc2VcclxuICBASW5wdXQoKSBsYW5ndWFnZUxpc3QgPSBbXVxyXG4gIEBJbnB1dCgpIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXHJcbiAgQE91dHB1dCgpIHRyaWdlckNvbXBsZXRpb25TdXJ2ZXlGb3JtID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpXHJcbiAgQFZpZXdDaGlsZCgnc3VtbWFyeUVsZW0nKSBzdW1tYXJ5RWxlbSAhOiBFbGVtZW50UmVmXHJcbiAgQFZpZXdDaGlsZCgnb2JqZWN0aXZlc0VsZW0nKSBvYmplY3RpdmVzRWxlbSAhOiBFbGVtZW50UmVmXHJcbiAgQFZpZXdDaGlsZCgnZGVzY0VsZW0nKSBkZXNjRWxlbSAhOiBFbGVtZW50UmVmXHJcbiAgQFZpZXdDaGlsZCgndGFnc0VsZW0nKSB0YWdzRWxlbSAhOiBFbGVtZW50UmVmXHJcbiAgQFZpZXdDaGlsZCgnc2VhcmNoVGFnRWxlbScpIHNlYXJjaFRhZ0VsZW0gITogRWxlbWVudFJlZlxyXG4gIGRpc2FibGVDZXJ0aWZpY2F0ZSA9IGZhbHNlXHJcblxyXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XHJcbiAgc3RyaXBzUmVzdWx0RGF0YU1hcCE6IHsgW2tleTogc3RyaW5nXTogSVN0cmlwVW5pdENvbnRlbnREYXRhIH1cclxuICBzdW1tYXJ5ID0ge1xyXG4gICAgZWxsaXBzaXM6IGZhbHNlLFxyXG4gICAgdmlld0xlc3M6IGZhbHNlLFxyXG4gIH1cclxuICBkZXNjcmlwdGlvbiA9IHtcclxuICAgIGVsbGlwc2lzOiBmYWxzZSxcclxuICAgIHZpZXdMZXNzOiBmYWxzZSxcclxuICB9XHJcbiAgb2JqZWN0aXZlcyA9IHtcclxuICAgIGVsbGlwc2lzOiBmYWxzZSxcclxuICAgIHZpZXdMZXNzOiBmYWxzZSxcclxuICB9XHJcbiAgdGFnc0VsbGlwc2lzID0gZmFsc2VcclxuICBzZWFyY2hUYWdzRWxsaXBzaXMgPSBmYWxzZVxyXG4gIGNvbXBldGVuY3lTZWxlY3RlZCA9ICcnXHJcbiAgcmF0aW5nU3VtbWFyeTogYW55XHJcbiAgYXV0aFJlcGxpZXM6IGFueVxyXG4gIHJhdGluZ1N1bW1hcnlQcm9jZXNzZWQ6IGFueVxyXG4gIHRvcFJhdGluZ1Jldmlld3M6IGFueVtdID0gW11cclxuICByYXRpbmdSZXZpZXdzOiBhbnlbXSA9IFtdXHJcbiAgbGF0ZXN0UmV2aWV3czogYW55W10gPSBbXVxyXG4gIGRpYWxvZ1JlZjogYW55XHJcbiAgZGlzcGxheUxvYWRlciA9IGZhbHNlXHJcbiAgZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcclxuICBsb29rdXBMb2FkaW5nOiBCb29sZWFuID0gdHJ1ZVxyXG4gIGxhc3RMb29rVXA6IGFueVxyXG4gIHJhdGluZ0xvb2t1cDogYW55XHJcbiAgcmV2aWV3UGFnZSA9IDFcclxuICByZXZpZXdEZWZhdWx0TGltaXQgPSAyXHJcbiAgbG9va3VwTGltaXQgPSAzXHJcbiAgcmF0aW5nVmlld0NvdW50ID0gM1xyXG4gIHJhdGluZ1ZpZXdDb3VudERlZmF1bHQgPSAzXHJcbiAgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSBbXVxyXG4gIHByaXZhdGUgZGVzdHJveVN1YmplY3QkID0gbmV3IFN1YmplY3Q8YW55PigpXHJcbiAgdmlld01vcmVUYWdzID0gZmFsc2VcclxuICB0aW1lclVuc3Vic2NyaWJlOiBhbnlcclxuICBkb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlXHJcblxyXG4gIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0ID0ge1xyXG4gICAga2V5OiAnYmxlbmRlZFByb2dyYW1zJyxcclxuICAgIGxvZ286ICcnLFxyXG4gICAgdGl0bGU6ICdCbGVuZGVkIFByb2dyYW0nLFxyXG4gICAgc3RyaXBUaXRsZUxpbms6IHtcclxuICAgICAgbGluazogJycsXHJcbiAgICAgIGljb246ICcnLFxyXG4gICAgfSxcclxuICAgIHNsaWRlckNvbmZpZzoge1xyXG4gICAgICBzaG93TmF2czogdHJ1ZSxcclxuICAgICAgc2hvd0RvdHM6IGZhbHNlLFxyXG4gICAgfSxcclxuICAgIGxvYWRlcjogdHJ1ZSxcclxuICAgIHN0cmlwQmFja2dyb3VuZDogJycsXHJcbiAgICB0aXRsZURlc2NyaXB0aW9uOiAnQmxlbmRlZCBQcm9ncmFtJyxcclxuICAgIHN0cmlwQ29uZmlnOiB7XHJcbiAgICAgIGNhcmRTdWJUeXBlOiAnc3RhbmRhcmQnLFxyXG4gICAgfSxcclxuICAgIHZpZXdNb3JlVXJsOiB7XHJcbiAgICAgIHBhdGg6ICcnLFxyXG4gICAgICB2aWV3TW9yZVRleHQ6ICdTaG93IGFsbCcsXHJcbiAgICAgIHF1ZXJ5UGFyYW1zOiAnJyxcclxuICAgIH0sXHJcbiAgICB0YWJzOiBbXSxcclxuICAgIGZpbHRlcnM6IFtdXHJcbiAgfVxyXG5cclxuICB0aW1lcjogYW55ID0ge31cclxuICBpc01vYmlsZSA9IGZhbHNlXHJcbiAgY29tcGVudGVuY3lLZXkhOiBOc0NvbnRlbnQuSUNvbXBlbnRlbmN5S2V5c1xyXG4gIHNlY3RvcnNMaXN0OiBhbnlbXSA9IFtdXHJcbiAgc3ViU2VjdG9yc0xpc3Q6IGFueVtdID0gW11cclxuICB1c2VyUHJvZmlsZTogYW55ID0gbnVsbFxyXG4gIHN1YlNlY3RvckRldGFpbEFycjogYW55ID0gW11cclxuICBzZWxlY3RlZFNlY3RvciA9ICcnXHJcbiAgc2VsZWN0ZWRTZWN0b3JJZCA9ICcnXHJcbiAgcmVmcmVzaHJhdGluZ1N1YlxyXG4gIHBhZ2VDb25maWdEYXRhOiBhbnlcclxuICBlbnZpcm9ubWVudCE6IGFueVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByYXRpbmdTZXJ2aWNlOiBSYXRpbmdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxyXG4gICAgcHJpdmF0ZSBsb2FkQ2hlY2tTZXJ2aWNlOiBMb2FkQ2hlY2tTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpc2N1c3NVdGlsaXR5U3ZjOiBEaXNjdXNzVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSByZXZpZXdEYXRhU2VydmljZTogUmV2aWV3Q29tcG9uZW50RGF0YVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNldFJhdGluZ3NTZXJ2aWNlOiBSZXNldFJhdGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55XHJcbiAgKSB7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRcclxuICAgIHRoaXMucmVmcmVzaHJhdGluZ1N1YiA9IHRoaXMucmVzZXRSYXRpbmdzU2VydmljZS5yZXNldFJhdGluZ3MkLnN1YnNjcmliZSgoX3JlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcclxuICAgIH0pXHJcbiAgfVxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5wYWdlQ29uZmlnRGF0YSA9IHRoaXMuYWN0aXZhdGVkUm91dGU/LnNuYXBzaG90Py5kYXRhPy5wYWdlRGF0YT8uZGF0YVxyXG4gICAgdGhpcy5jb21wZW50ZW5jeUtleSA9IHRoaXMuY29uZmlnU2VydmljZS5jb21wZW50ZW5jeVt0aGlzLmVudmlyb25tZW50LmNvbXBlbnRlbmN5VmVyc2lvbktleV1cclxuICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UudXNlclByb2ZpbGVcclxuICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMjAwKSB7XHJcbiAgICAgIHRoaXMuaXNNb2JpbGUgPSB0cnVlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlzTW9iaWxlID0gZmFsc2VcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcclxuICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxyXG4gICAgICAvLyB0aGlzLmxvYWRDb21wZXRlbmNpZXMoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRJZCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkLmluY2x1ZGVzKCdleHRfJykpIHtcclxuICAgICAgLy8gdGhpcy5sb2FkQ29tcGV0ZW5jaWVzKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XHJcbiAgICAgIHRoaXMuY29udGVudFsnc3ViVGhlbWUnXSA9IHRoaXMuZ2V0U3ViVGhlbWVzKClcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DQVNFX1NUVURZKSB7XHJcbiAgICAgIHRoaXMuZGlzYWJsZUNlcnRpZmljYXRlID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LnNlY3RvckRldGFpbHNfdjEpIHtcclxuICAgICAgLy8gUGFyc2Ugc3RyaW5nIHRvIGFycmF5IGlmIG5lZWRlZFxyXG4gICAgICBsZXQgc2VjdG9yRGV0YWlsc0FycmF5ID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFcclxuXHJcbiAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRyeSB0byBwYXJzZSBpdCBpbnRvIGFuIGFycmF5XHJcbiAgICAgIGlmICh0eXBlb2Ygc2VjdG9yRGV0YWlsc0FycmF5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3RvckRldGFpbHNBcnJheSlcclxuICAgICAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxID0gc2VjdG9yRGV0YWlsc0FycmF5XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzZWN0b3JEZXRhaWxzX3YxOicsIGUpXHJcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBbXVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUHJvY2VzcyBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCBhcnJheSB3aXRoIGl0ZW1zXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlY3RvckRldGFpbHNBcnJheSkgJiYgc2VjdG9yRGV0YWlsc0FycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXHJcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXlcclxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zZWN0b3JOYW1lICYmIGl0ZW0/LnNlY3RvcklkKVxyXG4gICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgICAgc2VjdG9ySWQ6IGl0ZW0uc2VjdG9ySWQsXHJcbiAgICAgICAgICAgICAgc2VjdG9yTmFtZTogaXRlbS5zZWN0b3JOYW1lXHJcbiAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICdzZWN0b3JOYW1lJ1xyXG4gICAgICAgIClcclxuXHJcbiAgICAgICAgdGhpcy5zdWJTZWN0b3JzTGlzdCA9IF8udW5pcUJ5KFxyXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbT8uc3ViU2VjdG9yTmFtZSAmJiBpdGVtPy5zdWJTZWN0b3JJZClcclxuICAgICAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgIHN1YlNlY3RvcklkOiBpdGVtLnN1YlNlY3RvcklkLFxyXG4gICAgICAgICAgICAgIHN1YlNlY3Rvck5hbWU6IGl0ZW0uc3ViU2VjdG9yTmFtZVxyXG4gICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAnc3ViU2VjdG9yTmFtZSdcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlY3RvcnNMaXN0ICYmIHRoaXMuc2VjdG9yc0xpc3QubGVuZ3RoICYmIHRoaXMuc2VjdG9yc0xpc3RbMF0pIHtcclxuICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN1YnNlY3Rvcih0aGlzLnNlY3RvcnNMaXN0WzBdKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgaWYgKFxyXG4gICAgICB0aGlzLmNvbnRlbnQ/LmNvbnRlbnRJZCAmJlxyXG4gICAgICB0aGlzLmNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5kYXRhICYmXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5kYXRhKS5sZW5ndGggPT09IDAgJiZcclxuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPT09IDJcclxuICAgICkge1xyXG4gICAgICB0aGlzLmhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudGltZXJVbnN1YnNjcmliZSA9IHRoaXMudGltZXJTZXJ2aWNlLmdldFRpbWVyRGF0YSgpXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50aW1lciA9IF90aW1lclxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wZW50ZW5jeUtleSA9IHRoaXMuY29uZmlnU2VydmljZS5jb21wZW50ZW5jeVt0aGlzLmVudmlyb25tZW50LmNvbXBlbnRlbmN5VmVyc2lvbktleV1cclxuICAgIGlmIChjaGFuZ2VzLnNlbGVjdGVkVGFiVmFsdWUgJiYgY2hhbmdlcy5zZWxlY3RlZFRhYlZhbHVlLmN1cnJlbnRWYWx1ZSA9PT0gMCkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnN1bW1hcnlFbGVtICYmIHRoaXMuc3VtbWFyeUVsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA3Mikge1xyXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnkuZWxsaXBzaXMgPSB0cnVlXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZGVzY0VsZW0gJiYgdGhpcy5kZXNjRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDcyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24uZWxsaXBzaXMgPSB0cnVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy5vYmplY3RpdmVzRWxlbSAmJiB0aGlzLm9iamVjdGl2ZXNFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNzIpIHtcclxuICAgICAgICAgICAgdGhpcy5vYmplY3RpdmVzLmVsbGlwc2lzID0gdHJ1ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5zdW1tYXJ5RWxlbSAmJiB0aGlzLnN1bW1hcnlFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDgpIHtcclxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5LmVsbGlwc2lzID0gdHJ1ZVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmRlc2NFbGVtICYmIHRoaXMuZGVzY0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA0OCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVsbGlwc2lzID0gdHJ1ZVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMub2JqZWN0aXZlc0VsZW0gJiYgdGhpcy5vYmplY3RpdmVzRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ4KSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0aXZlcy5lbGxpcHNpcyA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRhZ3NFbGVtICYmIHRoaXMudGFnc0VsZW0ubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiA2NCkge1xyXG4gICAgICAgICAgdGhpcy50YWdzRWxsaXBzaXMgPSB0cnVlXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hUYWdFbGVtICYmIHRoaXMuc2VhcmNoVGFnRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDY0KSB7XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFRhZ3NFbGxpcHNpcyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDUwMClcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy5za2VsZXRvbkxvYWRlciAmJiAhY2hhbmdlcy5za2VsZXRvbkxvYWRlci5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkQ2hlY2tTZXJ2aWNlLmNvbXBvbmVudExvYWRlZCh0cnVlKVxyXG4gICAgICB9LCA1MDApXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcclxuICAgICAgICBhc3Nlc3NtZW50OiAwLFxyXG4gICAgICAgIGNvdXJzZTogMCxcclxuICAgICAgICBoYW5kc09uOiAwLFxyXG4gICAgICAgIGludGVyYWN0aXZlVmlkZW86IDAsXHJcbiAgICAgICAgbGVhcm5pbmdNb2R1bGU6IDAsXHJcbiAgICAgICAgb3RoZXI6IDAsXHJcbiAgICAgICAgcGRmOiAwLFxyXG4gICAgICAgIHN1cnZleTogMCxcclxuICAgICAgICBwb2RjYXN0OiAwLFxyXG4gICAgICAgIHByYWN0aWNlVGVzdDogMCxcclxuICAgICAgICBmaW5hbFRlc3Q6IDAsXHJcbiAgICAgICAgcXVpejogMCxcclxuICAgICAgICB2aWRlbzogMCxcclxuICAgICAgICB3ZWJNb2R1bGU6IDAsXHJcbiAgICAgICAgd2ViUGFnZTogMCxcclxuICAgICAgICB5b3V0dWJlOiAwLFxyXG4gICAgICAgIGludGVyYWN0aXZlY29udGVudDogMCxcclxuICAgICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgVW5pdCcgPyAtMSA6IDBcclxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScgPyAtMSA6IDBcclxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB0aGlzLnRvY1N2Yy5nZXRUb2NTdHJ1Y3R1cmUodGhpcy5jb250ZW50LCB0aGlzLnRvY1N0cnVjdHVyZSlcclxuICAgICAgZm9yIChjb25zdCBwcm9nVHlwZSBpbiB0aGlzLnRvY1N0cnVjdHVyZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZVtwcm9nVHlwZV0gPiAwKSB7XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucmF0aW5nU3VtbWFyeSAmJiBPYmplY3Qua2V5cyh0aGlzLnJhdGluZ1N1bW1hcnkpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb21wZXRlbmNpZXNPYmplY3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWRDb21wZXRlbmNpZXMoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkICYmIHRoaXMuY29udGVudC5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKSkge1xyXG4gICAgICAgIGlmICh0aGlzLmNvbXBldGVuY2llc09iamVjdC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHRoaXMubG9hZENvbXBldGVuY2llcygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YVsnc3ViVGhlbWUnXSA9IHRoaXMuZ2V0U3ViVGhlbWVzKClcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWSkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUNlcnRpZmljYXRlID0gdHJ1ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnNlY3RvckRldGFpbHNfdjEpIHtcclxuICAgICAgICAvLyBQYXJzZSBzdHJpbmcgdG8gYXJyYXkgaWYgbmVlZGVkXHJcbiAgICAgICAgbGV0IHNlY3RvckRldGFpbHNBcnJheSA9IHRoaXMuY29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFcclxuXHJcbiAgICAgICAgLy8gSWYgaXQncyBhIHN0cmluZywgdHJ5IHRvIHBhcnNlIGl0IGludG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAodHlwZW9mIHNlY3RvckRldGFpbHNBcnJheSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheSA9IEpTT04ucGFyc2Uoc2VjdG9yRGV0YWlsc0FycmF5KVxyXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxID0gc2VjdG9yRGV0YWlsc0FycmF5XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc2VjdG9yRGV0YWlsc192MTonLCBlKVxyXG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBbXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUHJvY2VzcyBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCBhcnJheSB3aXRoIGl0ZW1zXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VjdG9yRGV0YWlsc0FycmF5KSAmJiBzZWN0b3JEZXRhaWxzQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gRXh0cmFjdCB1bmlxdWUgc2VjdG9ycyB1c2luZyBsb2Rhc2hcclxuICAgICAgICAgIHRoaXMuc2VjdG9yc0xpc3QgPSBfLnVuaXFCeShcclxuICAgICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XHJcbiAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zZWN0b3JOYW1lICYmIGl0ZW0/LnNlY3RvcklkKVxyXG4gICAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcclxuICAgICAgICAgICAgICAgIHNlY3RvcklkOiBpdGVtLnNlY3RvcklkLFxyXG4gICAgICAgICAgICAgICAgc2VjdG9yTmFtZTogaXRlbS5zZWN0b3JOYW1lXHJcbiAgICAgICAgICAgICAgfSkpLFxyXG4gICAgICAgICAgICAnc2VjdG9yTmFtZSdcclxuICAgICAgICAgIClcclxuXHJcbiAgICAgICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzdWJzZWN0b3JzIHVzaW5nIGxvZGFzaFxyXG4gICAgICAgICAgdGhpcy5zdWJTZWN0b3JzTGlzdCA9IF8udW5pcUJ5KFxyXG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXlcclxuICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnN1YlNlY3Rvck5hbWUgJiYgaXRlbT8uc3ViU2VjdG9ySWQpXHJcbiAgICAgICAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgc3ViU2VjdG9ySWQ6IGl0ZW0uc3ViU2VjdG9ySWQsXHJcbiAgICAgICAgICAgICAgICBzdWJTZWN0b3JOYW1lOiBpdGVtLnN1YlNlY3Rvck5hbWVcclxuICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICdzdWJTZWN0b3JOYW1lJ1xyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIH1cclxuXHJcbiAgZ2V0U3ViVGhlbWVzKCk6IGFueVtdIHtcclxuICAgIGNvbnN0IHN1YlRoZW1lQXJyOiBhbnlbXSA9IFtdXHJcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb21wZW50ZW5jeUtleSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0ubGVuZ3RoKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9PT0gJ3N0cmluZycgJiYgdGhpcy5jaGVja1ZhbGlkSlNPTih0aGlzLmNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldKSkge1xyXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPSBKU09OLnBhcnNlKHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0pXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XS5mb3JFYWNoKChfY29tcGV0ZW5jeU9iajogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHN1YlRoZW1lQXJyLmluZGV4T2YoX2NvbXBldGVuY3lPYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSkgPT09IC0xKSB7XHJcbiAgICAgICAgICBzdWJUaGVtZUFyci5wdXNoKF9jb21wZXRlbmN5T2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1YlRoZW1lQXJyXHJcbiAgfVxyXG5cclxuICBsb2FkQ29tcGV0ZW5jaWVzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XS5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSB7fVxyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldID09PSAnc3RyaW5nJ1xyXG4gICAgICAgICYmIHRoaXMuY2hlY2tWYWxpZEpTT04odGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0pKSB7XHJcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPSBKU09OLnBhcnNlKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldLmZvckVhY2goKF9vYmo6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dKSB7XHJcbiAgICAgICAgICBpZiAoY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVxyXG4gICAgICAgICAgW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV0pIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVRoZW1lID0gY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVxyXG4gICAgICAgICAgICBbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5VGhlbWVdXVxyXG4gICAgICAgICAgICBpZiAoY29tcGV0ZW5jeVRoZW1lLmluZGV4T2YoX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICBjb21wZXRlbmN5VGhlbWUucHVzaChfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cclxuICAgICAgICAgICAgW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV0gPSBbXVxyXG4gICAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dXHJcbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dXHJcbiAgICAgICAgICAgICAgLnB1c2goX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dID0ge31cclxuICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1bX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5VGhlbWVdXSA9IFtdXHJcbiAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cclxuICAgICAgICAgICAgLnB1c2goX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuXHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbXBldGVuY2llc09iamVjdCkge1xyXG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgY29uc3QgX3RlbXA6IGFueSA9IHt9XHJcbiAgICAgICAgICBfdGVtcFsna2V5J10gPSBrZXlcclxuICAgICAgICAgIF90ZW1wWyd2YWx1ZSddID0gY29tcGV0ZW5jaWVzT2JqZWN0W2tleV1cclxuICAgICAgICAgIHRoaXMuY29tcGV0ZW5jaWVzT2JqZWN0LnB1c2goX3RlbXApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaGFuZGxlU2hvd0NvbXBldGVuY2llcyh0aGlzLmNvbXBldGVuY2llc09iamVjdFswXSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVNob3dDb21wZXRlbmNpZXMoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCA9IGl0ZW0ua2V5XHJcbiAgICBjb25zdCB2YWx1ZU9iaiA9IGl0ZW0udmFsdWVcclxuICAgIGNvbnN0IGNvbXBldGVuY3lBcnJheSA9IFtdXHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xyXG4gICAgICBpZiAodmFsdWVPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIGNvbnN0IF90ZW1wT2JqOiBhbnkgPSB7fVxyXG4gICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxyXG4gICAgICAgIF90ZW1wT2JqWyd2YWx1ZSddID0gdmFsdWVPYmpba2V5XVxyXG4gICAgICAgIGNvbXBldGVuY3lBcnJheS5wdXNoKF90ZW1wT2JqKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0cmlwWydsb2FkZXJXaWRnZXRzJ10gPSBbXVxyXG4gICAgdGhpcy5zdHJpcFsnbG9hZGVyV2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldCh0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCwgY29tcGV0ZW5jeUFycmF5LCB0aGlzLnN0cmlwKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldChcclxuICAgIGNvbXBldGVuY3lBcmVhOiBzdHJpbmcsXHJcbiAgICBjb21wZXRlbmN5QXJyT2JqZWN0OiBhbnksXHJcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xyXG4gICAgcmV0dXJuIChjb21wZXRlbmN5QXJyT2JqZWN0IHx8IFtdKS5tYXAoKGNvbnRlbnQ6IGFueSwgaWR4OiBudW1iZXIpID0+IChcclxuICAgICAgY29udGVudCA/IHtcclxuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXHJcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NvbXBldGVuY3lDYXJkJyxcclxuICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtci00JyxcclxuICAgICAgICB3aWRnZXREYXRhOiB7XHJcbiAgICAgICAgICBjb250ZW50LFxyXG4gICAgICAgICAgY29tcGV0ZW5jeUFyZWEsXHJcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcclxuICAgICAgICAgIGNvbnRleHQ6IHsgcGFnZVNlY3Rpb246IHN0cmlwLmtleSwgcG9zaXRpb246IGlkeCB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0gOiB7XHJcbiAgICAgICAgd2lkZ2V0VHlwZTogJ2NhcmQnLFxyXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjb21wZXRlbmN5Q2FyZCcsXHJcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbXItNCcsXHJcbiAgICAgICAgd2lkZ2V0RGF0YToge30sXHJcbiAgICAgIH1cclxuICAgICkpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZFN0cmluZyA9IEpTT04ucGFyc2UocylcclxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBbXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hSYXRpbmdTdW1tYXJ5KCkge1xyXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XHJcbiAgICAgIHRoaXMucmF0aW5nU2VydmljZS5nZXRSYXRpbmdTdW1tYXJ5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJhdGluZ1N1bW1hcnkgPSByZXMucmVzdWx0LnJlc3BvbnNlXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnJhdGluZ1N1bW1hcnkgPSB1bmRlZmluZWRcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBIaWRlIGxvYWRlciBmb3IgTWF0RGlhbG9nLi4uXHJcbiAgICAgICAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHsgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUxvYWRlciA9IGZhbHNlIH1cclxuICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCA9IHRoaXMucHJvY2Vzc1JhdGluZ1N1bW1hcnkoKVxyXG4gICAgICAgICAgLy8gdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcclxuICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIHJhdGluZyBzdW1tYXJ5LCBkdWUgdG8gc29tZSBlcnJvciEnKVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmV0Y2hSYXRpbmdMb29rdXAoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSB0cnVlXHJcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpIHtcclxuICAgICAgY29uc3QgcmVxID0ge1xyXG4gICAgICAgIGFjdGl2aXR5SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgIGFjdGl2aXR5VHlwZTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcclxuICAgICAgICBsaW1pdDogdGhpcy5sb29rdXBMaW1pdCxcclxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMucmF0aW5nU2VydmljZS5nZXRSYXRpbmdMb29rdXAocmVxKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyBUbyBkaXNhYmxlIHRoZSBsb2FkZXIgaW4gdGhlIG1vZGFsLlxyXG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJldmlld1BhZ2UgPiAxKSB7XHJcbiAgICAgICAgICAgICAgcmVzLnJlc3VsdC5yZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJhdGluZ0xvb2t1cC5maW5kKChvOiBhbnkpID0+IG8udXBkYXRlZE9uVVVJRCA9PT0gaXRlbS51cGRhdGVkT25VVUlEKSkge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cC5wdXNoKGl0ZW0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IHJlcy5yZXN1bHQucmVzcG9uc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMucHJvY2Vzc1JhdGluZ0xvb2t1cChyZXMucmVzdWx0LnJlc3BvbnNlKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kaWFsb2dSZWYpIHsgICAvLyBUbyBkaXNhYmxlIHRoZSBsb2FkZXIgaW4gdGhlIG1vZGFsLlxyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXHJcbiAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBsb2FkIHJldmlld3MsIGR1ZSB0byBzb21lIGVycm9yIScpXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzUmF0aW5nTG9va3VwKHJlc3BvbnNlOiBhbnkpIHtcclxuICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UubGVuZ3RoIDwgdGhpcy5sb29rdXBMaW1pdCkge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhc3RMb29rVXAgPSByZXNwb25zZVtyZXNwb25zZS5sZW5ndGggLSAxXVxyXG4gICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSB0aGlzLnJhdGluZ0xvb2t1cFxyXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cclxuICAgICAgdGhpcy5hdXRoUmVwbGllcyA9IF8ua2V5QnkodGhpcy5sYXRlc3RSZXZpZXdzLCAndXNlcklkJylcclxuICAgICAgY29uc3QgdXNlcklkcyA9IF8ubWFwKHRoaXMubGF0ZXN0UmV2aWV3cywgJ3VzZXJJZCcpXHJcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdXNlcklkcykge1xyXG4gICAgICAgIHRoaXMuZ2V0QXV0aG9yUmVwbHkodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHVzZXJJZHMpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJhdGluZ1Jldmlld3MpIHtcclxuICAgICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSB0aGlzLnJhdGluZ1Jldmlld3Muc2xpY2UoKVxyXG4gICAgICAgIHRoaXMucmV2aWV3RGF0YVNlcnZpY2Uuc2V0UmV2aWV3RGF0YSh0aGlzLnJhdGluZ1Jldmlld3MpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEF1dGhvclJlcGx5KGlkZW50aWZpZXI6IHN0cmluZywgcHJpbWFyeUNhdGVnb3J5OiBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeSwgdXNlcklkczogYW55W10pIHtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XHJcbiAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICBhY3Rpdml0eUlkOiBpZGVudGlmaWVyLFxyXG4gICAgICAgIGFjdGl2aXR5VHlwZTogcHJpbWFyeUNhdGVnb3J5LFxyXG4gICAgICAgIHVzZXJJZDogdXNlcklkcyxcclxuICAgICAgfSxcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yYXRpbmdTZXJ2aWNlLmdldFJhdGluZ1JlcGx5KHJlcXVlc3QpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQuY29udGVudCkge1xyXG4gICAgICAgICAgY29uc3QgcmF0aW5nQXV0aFJlcGxheSA9IHJlcy5yZXN1bHQuY29udGVudFxyXG4gICAgICAgICAgXy5mb3JFYWNoKHJhdGluZ0F1dGhSZXBsYXksIHZhbHVlID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsnY29tbWVudCddID0gdmFsdWUuY29tbWVudFxyXG4gICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsndXNlcklkJ10gPSB2YWx1ZS51c2VySWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubGF0ZXN0UmV2aWV3cyA9IE9iamVjdC52YWx1ZXModGhpcy5hdXRoUmVwbGllcylcclxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoUmVwbGllc1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXHJcbiAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggYXV0aG9yIHJlcGxpZXMsIGR1ZSB0byBzb21lIGVycm9yIScpXHJcbiAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIGNvdW50U3RhcnNQZXJjZW50YWdlKHZhbHVlOiBhbnksIGtleTogYW55LCB0b3RhbDogYW55KSB7XHJcbiAgICBpZiAodmFsdWUgJiYgdG90YWwpIHtcclxuICAgICAgcmV0dXJuICgoKHZhbHVlICoga2V5KSAvIHRvdGFsKSAqIDEwMCkudG9GaXhlZCgyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDBcclxuICB9XHJcblxyXG4gIHByb2Nlc3NSYXRpbmdTdW1tYXJ5KCkge1xyXG4gICAgY29uc3QgYnJlYWtEb3duQXJyYXk6IGFueVtdID0gW11cclxuICAgIGNvbnN0IHJhdGluZ1N1bW1hcnlQciA9IHtcclxuICAgICAgYnJlYWtEb3duOiBicmVha0Rvd25BcnJheSxcclxuICAgICAgbGF0ZXN0NTBSZXZpZXdzOiBicmVha0Rvd25BcnJheSxcclxuICAgICAgcmF0aW5nc051bWJlcjogYnJlYWtEb3duQXJyYXksXHJcbiAgICAgIHRvdGFsX251bWJlcl9vZl9yYXRpbmdzOiBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbF9udW1iZXJfb2ZfcmF0aW5ncycpIHx8IDAsXHJcbiAgICAgIGF2Z1JhdGluZzogMCxcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0b3RSYXRpbmdzID0gXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAnc3VtX29mX3RvdGFsX3JhdGluZ3MnKSB8fCAwXHJcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xyXG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSwgMSwgdG90UmF0aW5ncyksXHJcbiAgICAgIGtleTogMSxcclxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSxcclxuICAgIH0pXHJcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xyXG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSwgMiwgdG90UmF0aW5ncyksXHJcbiAgICAgIGtleTogMixcclxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSxcclxuICAgIH0pXHJcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xyXG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQzc3RhcnMnKSwgMywgdG90UmF0aW5ncyksXHJcbiAgICAgIGtleTogMyxcclxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQzc3RhcnMnKSxcclxuICAgIH0pXHJcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xyXG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSwgNCwgdG90UmF0aW5ncyksXHJcbiAgICAgIGtleTogNCxcclxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSxcclxuICAgIH0pXHJcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xyXG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSwgNSwgdG90UmF0aW5ncyksXHJcbiAgICAgIGtleTogNSxcclxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSxcclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHRoaXMucmF0aW5nU3VtbWFyeSAmJiB0aGlzLnJhdGluZ1N1bW1hcnkubGF0ZXN0NTBSZXZpZXdzKSB7XHJcbiAgICAgIGNvbnN0IGxhdGVzdDUwUmV2aWV3cyA9IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cylcclxuICAgICAgY29uc3QgbW9kaWZpZWRSZXZpZXdzID0gXy5tYXAobGF0ZXN0NTBSZXZpZXdzLCByYXRpbmcgPT4ge1xyXG4gICAgICAgIHJhdGluZ1sndXNlcklkJ10gPSByYXRpbmcudXNlcl9pZFxyXG4gICAgICAgIHJldHVybiByYXRpbmdcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5hdXRoUmVwbGllcyA9IFtdXHJcbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxyXG4gICAgICBjb25zdCB1c2VySWRzID0gXy5tYXAobGF0ZXN0NTBSZXZpZXdzLCAndXNlcl9pZCcpXHJcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxyXG4gICAgICB9XHJcblxyXG4gICAgICByYXRpbmdTdW1tYXJ5UHIubGF0ZXN0NTBSZXZpZXdzID0gbW9kaWZpZWRSZXZpZXdzXHJcbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xyXG4gICAgICB0aGlzLnRvcFJhdGluZ1Jldmlld3MgPSBtb2RpZmllZFJldmlld3NcclxuICAgIH1cclxuICAgIC8vIFRvIHBhc3MgZGF0YSB0byB0aGUgcmV2aWV3IGNvbnRlbnRcclxuICAgIHRoaXMucmV2aWV3RGF0YVNlcnZpY2Uuc2V0UmV2aWV3RGF0YSh0aGlzLnJhdGluZ1Jldmlld3MpXHJcblxyXG4gICAgaWYgKHRoaXMucmF0aW5nU3VtbWFyeSAmJiB0aGlzLnJhdGluZ1N1bW1hcnkudG90YWxfbnVtYmVyX29mX3JhdGluZ3MpIHtcclxuICAgICAgcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZyA9XHJcbiAgICAgICAgcGFyc2VGbG9hdCgodGhpcy5yYXRpbmdTdW1tYXJ5LnN1bV9vZl90b3RhbF9yYXRpbmdzIC8gdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKS50b0ZpeGVkKDEpKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nXHJcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9IHJhdGluZ1N1bW1hcnlQci50b3RhbF9udW1iZXJfb2ZfcmF0aW5nc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJhdGluZ1N1bW1hcnlQclxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2FwaXRhbGl6ZShzdHI6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdGVtcFN0ciA9IHN0clxyXG4gICAgaWYgKHRlbXBTdHIpIHtcclxuICAgICAgdGVtcFN0ciA9IHRlbXBTdHIuc3BsaXQoJ194MDAwRF8sJykuam9pbignJylcclxuICAgIH1cclxuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXHJcbiAgICBpZiAodGVtcFN0ciAmJiB0eXBlID09PSAnbmFtZScpIHtcclxuICAgICAgcmV0dXJuVmFsdWUgPSB0ZW1wU3RyLnNwbGl0KCcgJykubWFwKF9zdHIgPT4ge1xyXG4gICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxyXG4gICAgICB9KS5qb2luKCcgJylcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVyblZhbHVlID0gdGVtcFN0ciAmJiAodGVtcFN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRlbXBTdHIuc2xpY2UoMSkpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICB9XHJcblxyXG4gIGhhbmRsZU9wZW5SZXZpZXdNb2RhbCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihSZXZpZXdzQ29udGVudENvbXBvbmVudCwge1xyXG4gICAgICB3aWR0aDogJzQwMHB4JyxcclxuICAgICAgZGF0YTogeyByYXRpbmdzOiB0aGlzLnJhdGluZ1N1bW1hcnlQcm9jZXNzZWQsIHJldmlld3M6IHRoaXMuYXV0aFJlcGxpZXMsIGxhdGVzdFJldmlld3M6IHRoaXMucmF0aW5nTG9va3VwIH0sXHJcbiAgICAgIHBhbmVsQ2xhc3M6ICdyYXRpbmdzLW1vZGFsLWJveCcsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5kaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKF9yZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5pbml0aWF0ZUxvYWRNb3JlLnN1YnNjcmliZSgoX3ZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5sb2FkTW9yZShfdmFsdWUpXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmxvYWRMYXRlc3RSZXZpZXdzLnN1YnNjcmliZSgoX3ZhbHVlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUxvYWRlciA9IHRydWVcclxuICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJhdGluZ1ZpZXdDb3VudERlZmF1bHRcclxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gJydcclxuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cclxuICAgICAgdGhpcy5yZXZpZXdQYWdlID0gMVxyXG4gICAgICB0aGlzLmRpc2FibGVMb2FkTW9yZSA9IGZhbHNlXHJcbiAgICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cclxuICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcclxuICAgICAgICBpZiAoX3ZhbHVlID09PSAnTGF0ZXN0Jykge1xyXG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBsb2FkTW9yZShzZWxlY3RlZFJldmlldzogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZUxvYWRNb3JlKSB7XHJcbiAgICAgIHRoaXMubG9va3VwTG9hZGluZyA9IHRydWVcclxuICAgICAgdGhpcy5yZXZpZXdQYWdlID0gdGhpcy5yZXZpZXdQYWdlICsgMVxyXG4gICAgICB0aGlzLnJhdGluZ1ZpZXdDb3VudCA9IHRoaXMucmV2aWV3UGFnZSAqIHRoaXMucmV2aWV3RGVmYXVsdExpbWl0XHJcbiAgICAgIGlmIChzZWxlY3RlZFJldmlldyA9PT0gJ0xhdGVzdCcpIHtcclxuICAgICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXHJcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxyXG4gICAgICAgIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICgodGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnQpID4gdGhpcy5yYXRpbmdSZXZpZXdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSB0cnVlXHJcbiAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZXZpZXdQYWdlID0gdGhpcy5yZXZpZXdQYWdlICsgMVxyXG4gICAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnRcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb0Rpc2N1c3Npb25IdWIoKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIG1lbnVPcHRpb25zOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcm91dGU6ICdhbGwtZGlzY3Vzc2lvbnMnLFxyXG4gICAgICAgICAgbGFiZWw6ICdBbGwgZGlzY3Vzc2lvbnMnLFxyXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcm91dGU6ICdjYXRlZ29yaWVzJyxcclxuICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllcycsXHJcbiAgICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICByb3V0ZTogJ3RhZ3MnLFxyXG4gICAgICAgICAgbGFiZWw6ICdUYWdzJyxcclxuICAgICAgICAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJvdXRlOiAnbXktZGlzY3Vzc2lvbicsXHJcbiAgICAgICAgICBsYWJlbDogJ1lvdXIgZGlzY3Vzc2lvbicsXHJcbiAgICAgICAgICBlbmFibGU6IHRydWUsXHJcbiAgICAgICAgfSxcclxuICAgICAgICAvLyB7XHJcbiAgICAgICAgLy8gICByb3V0ZTogJ2xlYWRlcmJvYXJkJyxcclxuICAgICAgICAvLyAgIGxhYmVsOiAnTGVhZGVyIEJvYXJkJyxcclxuICAgICAgICAvLyAgIGVuYWJsZTogdHJ1ZSxcclxuICAgICAgICAvLyB9LFxyXG4gICAgICBdLFxyXG4gICAgICB1c2VyTmFtZTogKHRoaXMuY29uZmlnU2VydmljZS5ub2RlYmJVc2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1NlcnZpY2Uubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxyXG4gICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgaWQ6IDEsXHJcbiAgICAgIH0sXHJcbiAgICAgIGNhdGVnb3JpZXM6IHsgcmVzdWx0OiBbXSB9LFxyXG4gICAgICByb3V0ZXJTbHVnOiAnL2FwcCcsXHJcbiAgICAgIGhlYWRlck9wdGlvbnM6IGZhbHNlLFxyXG4gICAgICBiYW5uZXJPcHRpb246IHRydWUsXHJcbiAgICB9XHJcbiAgICB0aGlzLmRpc2N1c3NVdGlsaXR5U3ZjLnNldERpc2N1c3Npb25Db25maWcoY29uZmlnKVxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hvbWUnLCBKU09OLnN0cmluZ2lmeShjb25maWcpKVxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYXBwL2Rpc2N1c3Npb24tZm9ydW0nXSwgeyBxdWVyeVBhcmFtczogeyBwYWdlOiAnaG9tZScgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyB9KVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2tPZkNsYWltKGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlQ2xhaW1TZXJ2aWNlLnNldENsYWltRGF0YShldmVudClcclxuICB9XHJcbiAgXHJcbiAgZ2V0Q291cnNlSWRGb3JDZXJ0aWZpY2F0ZSgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFyYW1JZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpO1xyXG4gICAgaWYgKHRoaXMuY29udGVudD8uY29udGVudElkPy5pbmNsdWRlcygnZXh0XycpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudElkO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gcGFyYW1JZCB8fCAnJztcclxuICB9XHJcblxyXG4gIC8vICBoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKSB7XHJcbiAgLy8gICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gdHJ1ZTtcclxuICAvLyAgIGNvbnN0IGNlcnRJZCA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0SWQ7XHJcblxyXG4gIC8vICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLnBhZ2VDb25maWdEYXRhKSB7XHJcbiAgLy8gICAgIGNvbnN0IGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkgPVxyXG4gIC8vICAgICAgIHRoaXMucGFnZUNvbmZpZ0RhdGE/LmR5bmFtaWNDZXJ0aWZpY2F0ZUdlbmVyYXRpb24/LmFsbG93cyAmJlxyXG4gIC8vICAgICAgIHRoaXMucGFnZUNvbmZpZ0RhdGE/LmR5bmFtaWNDZXJ0aWZpY2F0ZUdlbmVyYXRpb24/LmFsbG93cz8ubWFwKFxyXG4gIC8vICAgICAgICAgKGNhdDogc3RyaW5nKSA9PiBjYXQ/LnRvTG93ZXJDYXNlKClcclxuICAvLyAgICAgICApO1xyXG5cclxuICAvLyAgICAgaWYgKFxyXG4gIC8vICAgICAgIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkgJiZcclxuICAvLyAgICAgICggYWxsb3dlZFByaW1hcnlDYXRlZ29yeS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeT8udG9Mb3dlckNhc2UoKSkgfHwgXHJcbiAgLy8gICAgICAgYWxsb3dlZFByaW1hcnlDYXRlZ29yeS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5Py50b0xvd2VyQ2FzZSgpKSlcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgY29uc3QgcGF5bG9hZCA9IHtcclxuICAvLyAgICAgICAgIHJlcXVlc3Q6IHtcclxuICAvLyAgICAgICAgICAgY291cnNlSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gIC8vICAgICAgICAgICBiYXRjaElkOiB0aGlzLmJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hJZCB8fCAnJyxcclxuICAvLyAgICAgICAgICAgdXNlcklkOiB0aGlzLnVzZXJQcm9maWxlLnVzZXJJZCxcclxuICAvLyAgICAgICAgIH0sXHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgICB0aGlzLmNvbnRlbnRTdmMuZG93bmxvYWRDZXJ0VjIocGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gIC8vICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcclxuICAgICAgICAgICAgIFxyXG4gIC8vICAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcclxuICAvLyAgICAgICAgICAgICAgIHdpZHRoOiAnMTIwMHB4JyxcclxuICAvLyAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAvLyAgICAgICAgICAgICAgICAgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmksXHJcbiAgLy8gICAgICAgICAgICAgICAgIGNlcnRJZDpcclxuICAvLyAgICAgICAgICAgICAgICAgICAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWQpIHx8ICcnLFxyXG4gIC8vICAgICAgICAgICAgICAgfSxcclxuICAvLyAgICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSxcclxuICAvLyAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcclxuICAvLyAgICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdDRVJUSUZJQ0FURSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpO1xyXG4gIC8vICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oXHJcbiAgLy8gICAgICAgICAgICAgJ1VuYWJsZSB0byBWaWV3IENlcnRpZmljYXRlLCBkdWUgdG8gc29tZSBlcnJvciEnXHJcbiAgLy8gICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgKTtcclxuICAvLyAgICAgfSBlbHNlIHtkZWJ1Z2dlclxyXG4gIC8vICAgICB0aGlzLmNvbnRlbnRTdmMuZG93bmxvYWRDZXJ0KGNlcnRJZCkuc3Vic2NyaWJlKFxyXG4gIC8vICAgICAgIChyZXNwb25zZSkgPT4ge1xyXG4gIC8vICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xyXG4gIC8vICAgICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXVsnY2VydERhdGEnXSA9XHJcbiAgLy8gICAgICAgICAgICAgcmVzcG9uc2UucmVzdWx0LnByaW50VXJpO1xyXG4gIC8vICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgLy8gICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxyXG4gIC8vICAgICAgICAgICAgIGRhdGE6IHtcclxuICAvLyAgICAgICAgICAgICAgIGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxyXG4gIC8vICAgICAgICAgICAgICAgY2VydElkOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZCxcclxuICAvLyAgICAgICAgICAgICB9LFxyXG4gIC8vICAgICAgICAgICB9KTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9LFxyXG4gIC8vICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgLy8gICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ0NFUlRJRklDQVRFIEZFVENIIEVSUk9SID4nLCBlcnJvcik7XHJcbiAgLy8gICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oXHJcbiAgLy8gICAgICAgICAgICdVbmFibGUgdG8gVmlldyBDZXJ0aWZpY2F0ZSwgcGxlYXNlIGNoZWNrIGFnYWluIGxhdGVyISdcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICApO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgfSBcclxuICAvLyB9XHJcblxyXG4gIGhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpIHtcclxuICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSB0cnVlXHJcbiAgICBjb25zdCBjZXJ0SWQgPSB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZFxyXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmogJiYgIXRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0RGF0YSkge1xyXG4gICAgIGlmIChjZXJ0SWQpIHtcclxuICAgICAgICB0aGlzLmNvbnRlbnRTdmMuZG93bmxvYWRDZXJ0KGNlcnRJZCkuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXVsnY2VydERhdGEnXSA9IHJlc3BvbnNlLnJlc3VsdC5wcmludFVyaVxyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxyXG4gICAgICAgICAgICAgIGRhdGE6IHsgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmksIGNlcnRJZDogdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWQgfSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxyXG4gICAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gVmlldyBDZXJ0aWZpY2F0ZSwgZHVlIHRvIHNvbWUgZXJyb3IhJylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2VcclxuICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgIHdpZHRoOiAnMTIwMHB4JyxcclxuICAgICAgICBkYXRhOiB7IGNldDogdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0RGF0YSwgY2VydElkOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZCB9LFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblN1cnZleUZvcm1Qb3B1cCgpIHtcclxuICAgIHRoaXMudHJpZ2VyQ29tcGxldGlvblN1cnZleUZvcm0uZW1pdCh0cnVlKTtcclxuICB9XHJcblxyXG4gIGNoZWNrVmFsaWRKU09OKHN0cjogYW55KSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBKU09OLnBhcnNlKHN0cilcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWJzZWN0b3IoaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YlNlY3RvckRldGFpbEFyciA9IFtdXHJcbiAgICB0aGlzLnNlbGVjdGVkU2VjdG9yID0gJydcclxuICAgIHRoaXMuc2VsZWN0ZWRTZWN0b3JJZCA9ICcnXHJcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3RvcklkJ10gPT09IGl0ZW0uc2VjdG9ySWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB7fVxyXG4gICAgICAgICAgICBvYmogPSB7XHJcbiAgICAgICAgICAgICAgJ3NlY3RvcklkJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3RvcklkJ10sXHJcbiAgICAgICAgICAgICAgJ3NlY3Rvck5hbWUnOiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc2VjdG9yTmFtZSddLFxyXG4gICAgICAgICAgICAgICdrZXknOiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddLFxyXG4gICAgICAgICAgICAgICd2YWx1ZSc6IFt0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3ViU2VjdG9yRGV0YWlsQXJyLnB1c2gob2JqKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9yID0gaXRlbS5zZWN0b3JOYW1lXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZWN0b3JJZCA9IGl0ZW0uc2VjdG9ySWRcclxuXHJcblxyXG4gICAgICBjb25zdCB2YWx1ZU9iaiA9IGl0ZW1cclxuICAgICAgY29uc3Qgc3ViU2VjdG9yQXJyYXkgPSBbXVxyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xyXG4gICAgICAgIGlmICh2YWx1ZU9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICBjb25zdCBfdGVtcE9iajogYW55ID0ge31cclxuICAgICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxyXG4gICAgICAgICAgX3RlbXBPYmpbJ3ZhbHVlJ10gPSB2YWx1ZU9ialtrZXldXHJcbiAgICAgICAgICBzdWJTZWN0b3JBcnJheS5wdXNoKF90ZW1wT2JqKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnN0cmlwWydzZWN0b3JXaWRnZXRzJ10gPSB0aGlzLnRyYW5zZm9ybUNvbXBldGVuY2llc1RvV2lkZ2V0KCdCZWhhdmlvdXJhbCcsIHRoaXMuc3ViU2VjdG9yRGV0YWlsQXJyLCB0aGlzLnN0cmlwKVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95U3ViamVjdCQudW5zdWJzY3JpYmUoKVxyXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcclxuICAgIGlmKHRoaXMucmVmcmVzaHJhdGluZ1N1Yil7XHJcbiAgICAgIHRoaXMucmVmcmVzaHJhdGluZ1N1Yi51bnN1YnNjcmliZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8bmctdGVtcGxhdGUgI2NlcnRpZmljYXRlQ2FyZD5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGlzYWJsZUNlcnRpZmljYXRlXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2NrQ2VydGlmaWNhdGU7IGVsc2UgY2VydGlmaWNhdGVMb2NrXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1vdXRlci1kaXZcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgY2VydGlmaWNhdGUtaW5mbyBwLTQgZ2FwLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkJ1wiIFt3aWR0aF09XCInMjAwcHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzI0cHgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gZm9udC1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlciB0cnVuY2F0ZS0zXCI+e3sgY29udGVudD8ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWxpZ2h0XCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0ZWRPblwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZENvdXJzZScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uY29tcGxldGVkT24gP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LmNvbXBsZXRlZE9uIHwgZGF0ZTogJ2QgTU1NLCB5JykgOiAnTkEnIH19PC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWxpZ2h0XCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0ZWRPblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gJ1N0YW5kYWxvbmUgQXNzZXNzbWVudCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wbGV0ZWRBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fSB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LmNvbXBsZXRlZE9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5jb21wbGV0ZWRPbiB8IGRhdGU6ICdkIE1NTSwgeScpIDogJ05BJyB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdQcm9ncmFtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZFByb2dyYW0nIHwgdHJhbnNsYXRlIH19IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY29tcGxldGVkT24gP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5jb21wbGV0ZWRPbiB8IGRhdGU6ICdkIE1NTSwgeScpIDogJ05BJyB9fTwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGxldGVkQ291cnNlJyB8IHRyYW5zbGF0ZSB9fSB7eyBjb250ZW50Py5jb21wbGV0ZWRPblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBkb3dubG9hZC1zZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzI0cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzI0cHgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gY3Vyc29yLXBvaW50ZXIgXCIgKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpXCI+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlQm9vbFwiIHN0cm9rZVdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbYmluZGluZ0NsYXNzXT1cIidmbGV4IHJvdW5kZWQnXCIgW3dpZHRoXT1cIicyODBweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIicxNDhweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGVfYm94XCIgKm5nSWY9XCIhY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZyb21NYXJrZXRQbGFjZVwiIHNyYz1cIi9hc3NldHMvaWNvbnMvdG9jL25vLWNlcnRpZmljYXRlLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJObyBjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmcm9tTWFya2V0UGxhY2VcIiBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS1tYXJrZXQtcGxhY2Uuc3ZnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIk5vIGNlcnRpZmljYXRlIGltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNlcnRpZmljYXRlX292ZXJsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHRleHQtY2VudGVyIGdhcC0xIHAtNCB0ZXh0LXdoaXRlIG10LTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7J2FwcHRvY2hvbWUuY2VydGlmaWNhdGlvblRha2VzVGltZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+e3snYXBwdG9jaG9tZS5pc3N1ZVBlcnNpc3RzTWFpbHVzJyB8IHRyYW5zbGF0ZSB9fSBtaXNzaW9uLmthcm1heW9naUBnb3YuaW4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eydhcHB0b2Nob21lLmlzc3VlUGVyc2lzdHNNYWlsdXMnIHwgdHJhbnNsYXRlIH19IDxhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwibWFpbHRvOm1pc3Npb24ua2FybWF5b2dpQGdvdi5pblwiIGNsYXNzPVwiZW1haWxEZWZhdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9uLmthcm1heW9naUBnb3YuaW48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjZWxlYnJhdGlvbi1hbmltYXRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5pbWF0aW9uL2xlYWRlcmJvYXJkX2FuaW1hdGlvbi5naWZcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiFmcm9tTWFya2V0UGxhY2VcIiBjbGFzcz1cImNlcml0aWZpY2F0ZS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUuc3ZnJ1wiIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmcm9tTWFya2V0UGxhY2VcIiBjbGFzcz1cImNlcml0aWZpY2F0ZS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUtbWFya2V0LXBsYWNlLnN2ZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd2aWV3LWNlcnRpZmljYXRlJzogZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wsICd2aWV3LWNlcnQnOiAhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2x9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVCb29sXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2Njb250ZW50Y2FyZC52aWV3Q2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIiBjbGFzcz1cInVwbG9hZGVyLXN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0RGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY2VsZWJyYXRpb24tYW5pbWF0aW9uXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmltYXRpb24vbGVhZGVyYm9hcmRfYW5pbWF0aW9uLmdpZlwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNlcml0aWZpY2F0ZS1pbWFnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0RGF0YSB8IHBpcGVTYWZlU2FuaXRpemVyOiAndXJsJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgY2hpcHMtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN1YlRoZW1lIG9mIGNvbnRlbnRSZWFkRGF0YT8uc3ViVGhlbWU7IGxldCBqID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAgcm91bmRlZC1mdWxsIHAtMiB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZGVuJzogKGogPiAxICYmICFjb250ZW50Py52aWV3TW9yZSksICdjaGlwLWVsbGlwc2lzJzogIWNvbnRlbnQ/LnZpZXdNb3JlICYmIGNvbnRlbnQ/LnN1YlRoZW1lPy5sZW5ndGggPiAxIH1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cInN1YlRoZW1lXCI+e3sgc3ViVGhlbWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1wcmltYXJ5IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py5zdWJUaGVtZT8ubGVuZ3RoID4gMiAmJiAhY29udGVudD8udmlld01vcmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29udGVudC52aWV3TW9yZSA9ICFjb250ZW50LnZpZXdNb3JlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2NvbXBldGVuY3lDYXJkRGV0YWlscy52aWV3TW9yZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXByaW1hcnkgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnZpZXdNb3JlXCIgKGNsaWNrKT1cImNvbnRlbnQudmlld01vcmUgPSAhY29udGVudC52aWV3TW9yZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydjb21wZXRlbmN5Q2FyZERldGFpbHMudmlld0xlc3MnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2NlcnRpZmljYXRlTG9jaz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLW91dGVyLWRpdiBsb2NrZWQtY2VydGlmaWNhdGUtb3V0ZXItZGl2XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtbG9jayBwLTQgZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBjZXJ0aWZpY2F0ZS1sb2NrLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvYy5jZXJ0aWZpY2F0ZUxvY2tlZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgZmxleC1jb2wgcC00IGdhcC0yIGxvY2tpbmctc2NyZWVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9sb2NrX3dodC5zdmdcIiBhbHQ9XCJsb2NrIGltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlTG9ja2VkVGV4dCBwYi0yXCI+e3snYXBwdG9jLmNlcnRpZmljYXRlTG9ja2VkTWVzc2FnZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2tpbmctc2NyZWVuLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydhcHB0b2MudW5sb2NrQ2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlfX0gPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1cnZleUZvcm1lVGV4dFwiPnt7J2FwcHRvYy5zdXJ2ZXlGb3JtJyB8IHRyYW5zbGF0ZX19PC9zcGFuPiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcHRvYy51bmxvY2tDZXJ0aWZpY2F0ZTInIHwgdHJhbnNsYXRlIDogeyBjb3Vyc2VDYXRlZ29yeTogY29udGVudD8uY291cnNlQ2F0ZWdvcnkgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgOiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgfSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInN1cnZleUZvcm1lQnV0dG9uIHB4LTdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TdXJ2ZXlGb3JtUG9wdXAoKVwiPnt7J2FwcHRvYy5jb21wbGV0ZVN1cnZleU5vdycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjY29tcGV0ZW5jeUxhYmVsPlxyXG4gICAgPGRpdiBjbGFzcz1cInB0LW13ZWItNCBtYXQtc3ViaGVhZGluZy0xIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHdzLW1hdC1ibGFjazYwLXRleHQgaW5mby1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yXCJcclxuICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgI3Rvb2x0aXA9XCJtYXRUb29sdGlwXCIgKGNsaWNrKT1cInRvb2x0aXAudG9nZ2xlKClcIlxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzVG9vbHRpcCcgfCB0cmFuc2xhdGUgfX1cIj5pbmZvX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBteS00IHB4LTRcIiBbY2xhc3MubXQ2MF09XCJzdGlja3lcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICcnIDogJ2dhcC0xMCdcIj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgKm5nSWY9XCIoY29udGVudD8uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uY2VydElkKSAmJiAhZnJvbU1hcmtldFBsYWNlICYmICFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01hcmtldFBsYWNlQ2VydGlmaWNhdGUgJiYgZnJvbU1hcmtldFBsYWNlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNvbnRhaW5lclwiICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkJ1wiIFtoZWlnaHRdPVwiJzE0OHB4J1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmcm9tVmlld2VyIHx8IHJvdXRlci51cmwuaW5jbHVkZXMoJy92aWV3ZXIvcGRmL2RvXycpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgbXQtMlwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmb250LXNlbWlib2xkIHRleHQtYmFzZVwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8ubmFtZSkgfX0gPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2ItdGV4dCBicmVhay13b3JkcyB0ZXh0LXNtIG5vZHRyYW5zbGF0ZVwiPnt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fSB7e1xyXG4gICAgICAgICAgICAgICAgY29udGVudD8uc291cmNlIH19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBqdXN0aWZ5LWFyb3VuZCBoaWRlQWJvdmUxMjAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmN1cnJlbnRCYXRjaFNpemUgfHxcclxuICAgICAgICAgICAgICAgICAgICAnMCcgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy5iYXRjaFNpemUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py50b3RhbEFwcGxpZWQgfHwgJzAnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LmVucm9sbGVkIHx8ICcwJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy50b3RhbEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0aW1lci5kYXlzID49IDAgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTYgbXktNSBiYXRjaC10aW1lciBoaWRlQWJvdmUxMjAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYmF0Y2hTdGFydHNJbicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5kYXlzIHx8IDAgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgOlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ob3VycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA6XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5taW4gPT09IDYwID8gMDAgOiB0aW1lci5taW4gfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm1pbnV0ZXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiZnJvbVZpZXdlciB8fCBpc01vYmlsZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2MHB4J1wiIFtoZWlnaHRdPVwiJzYwcHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjBweCdcIiBbaGVpZ2h0XT1cIic2MHB4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzYwcHgnXCIgW2hlaWdodF09XCInNjBweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFmcm9tTWFya2V0UGxhY2VcIj5cclxuICAgICAgICAgICAgPHdzLXdpZGdldC10b2Mta3BpLXZhbHVlcyBbY29udGVudF09XCJjb250ZW50XCIgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIiBbaXNNb2JpbGVdPVwiaXNNb2JpbGVcIlxyXG4gICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCJcclxuICAgICAgICAgICAgICAgIFtsYW5ndWFnZUxpc3RdPVwibGFuZ3VhZ2VMaXN0XCI+PC93cy13aWRnZXQtdG9jLWtwaS12YWx1ZXM+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiXHJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnN1bW1hcnkgJiYgY29udGVudFJlYWREYXRhPy5jb250ZW50SWQgJiYgY29udGVudFJlYWREYXRhPy5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zdW1tYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzY1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgaXNNb2JpbGUsICdkZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXHJcbiAgICAgICAgICAgICAgICAjZGVzY0VsZW0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImNvbnRlbnRSZWFkRGF0YT8uc3VtbWFyeSB8IHJlcGxhY2VOYnNwXCIgY2xhc3M9XCJtb2ItdGV4dCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cImRlc2NyaXB0aW9uLnZpZXdMZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzY3JpcHRpb24uZWxsaXBzaXMgPSAhZGVzY3JpcHRpb24uZWxsaXBzaXM7IGRlc2NyaXB0aW9uLnZpZXdMZXNzID0gIWRlc2NyaXB0aW9uLnZpZXdMZXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24uZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8uY29udGVudElkICYmIGNvbnRlbnQ/LmNvbnRlbnRJZC5pbmNsdWRlcygnZXh0XycpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhKGNvbnRlbnQ/LmNvbnRlbnRJZCAmJiBjb250ZW50Py5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKSlcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zdW1tYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBzdW1tYXJ5LmVsbGlwc2lzICYmIGlzTW9iaWxlLCAnZGVzYy1lbGxpcHNpcyc6IHN1bW1hcnkuZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXHJcbiAgICAgICAgICAgICAgICAjc3VtbWFyeUVsZW0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRleHQgbm9kdHJhbnNsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cImhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5kZXNjcmlwdGlvbiB8IHJlcGxhY2VOYnNwKVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cInN1bW1hcnkudmlld0xlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdW1tYXJ5LmVsbGlwc2lzID0gIXN1bW1hcnkuZWxsaXBzaXM7IHN1bW1hcnkudmlld0xlc3MgPSAhc3VtbWFyeS52aWV3TGVzc1wiPiZuYnNwO3t7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwic3VtbWFyeS5lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1bW1hcnkuZWxsaXBzaXMgPSAhc3VtbWFyeS5lbGxpcHNpczsgc3VtbWFyeS52aWV3TGVzcyA9ICFzdW1tYXJ5LnZpZXdMZXNzXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uaW5zdHJ1Y3Rpb25zIHx8IGNvbnRlbnRSZWFkRGF0YT8ucHVycG9zZVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5sZWFybmluZ091dGNvbWUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiAhaXNNb2JpbGV9XCJcclxuICAgICAgICAgICAgICAgICNkZXNjRWxlbT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiY29udGVudFJlYWREYXRhPy5pbnN0cnVjdGlvbnMgfHwgY29udGVudFJlYWREYXRhPy5wdXJwb3NlIHwgcmVwbGFjZU5ic3BcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9iLXRleHQgYnJlYWstd29yZHMgbm9kdHJhbnNsYXRlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24udmlld0xlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCB0ZXh0LXNtXCIgKm5nSWY9XCJkZXNjcmlwdGlvbi5lbGxpcHNpc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2NyaXB0aW9uLmVsbGlwc2lzID0gIWRlc2NyaXB0aW9uLmVsbGlwc2lzOyBkZXNjcmlwdGlvbi52aWV3TGVzcyA9ICFkZXNjcmlwdGlvbi52aWV3TGVzc1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJjb250ZW50Py5vYmplY3RpdmVzXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXHJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxyXG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBwdC1td2ViLTggbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uub2JqZWN0aXZlcycgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgICAgIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydtb2ItZGVzYy1lbGxpcHNpcyc6IG9iamVjdGl2ZXMuZWxsaXBzaXMgJiYgaXNNb2JpbGUsICdkZXNjLWVsbGlwc2lzJzogb2JqZWN0aXZlcy5lbGxpcHNpcyAmJiAhaXNNb2JpbGV9XCJcclxuICAgICAgICAgICAgICAgICNvYmplY3RpdmVzRWxlbT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9iLXRleHQgbm9kdHJhbnNsYXRlXCIgW2lubmVySHRtbF09XCJoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/Lm9iamVjdGl2ZXMpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cIm9iamVjdGl2ZXMudmlld0xlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvYmplY3RpdmVzLmVsbGlwc2lzID0gIW9iamVjdGl2ZXMuZWxsaXBzaXM7IG9iamVjdGl2ZXMudmlld0xlc3MgPSAhb2JqZWN0aXZlcy52aWV3TGVzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICZuYnNwO3t7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cIm9iamVjdGl2ZXMuZWxsaXBzaXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvYmplY3RpdmVzLmVsbGlwc2lzID0gIW9iamVjdGl2ZXMuZWxsaXBzaXM7IG9iamVjdGl2ZXMudmlld0xlc3MgPSAhb2JqZWN0aXZlcy52aWV3TGVzc1wiPnt7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XHJcbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTIwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTIwcHgnXCIgW2hlaWdodF09XCInMzJweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjUwcHgnXCIgW2hlaWdodF09XCInODBweCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyNTBweCdcIiBbaGVpZ2h0XT1cIic4MHB4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc3RyaXA/LmxvYWRlcldpZGdldHM/Lmxlbmd0aCB8fCAhY29tcGV0ZW5jaWVzT2JqZWN0XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBldGVuY3lMYWJlbFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2Uubm9Db21wZXRlbmN5Rm91bmQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHJpcD8ubG9hZGVyV2lkZ2V0cz8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wZXRlbmN5TGFiZWxcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIHNtOmdhcC00IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY2llc09iamVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWVzLWJ1dHRvblwiIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogY29tcGV0ZW5jeVNlbGVjdGVkID09PSBpdGVtLmtleX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVNob3dDb21wZXRlbmNpZXMoaXRlbSwgJ3NlbGVjdGVkJylcIj57eyBpdGVtLmtleSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY2llc09iamVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5rZXkgPT09IGNvbXBldGVuY3lTZWxlY3RlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8d3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12MiBbbG9hZFN0YXR1c109XCInZG9uZSdcIiBbc3RyaXBDb25maWddPVwic3RyaXAuc3RyaXBDb25maWdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZGdldCBvZiBzdHJpcD8ubG9hZGVyV2lkZ2V0czsgdHJhY2tCeTogdHJhY2tlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW3dzUmVzb2x2ZXJXaWRnZXRdPVwid2lkZ2V0XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy11dGlscy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXHJcbiAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cclxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxyXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXHJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgIDwhLS0ge3tjb250ZW50fGpzb259fSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5rZXl3b3Jkcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFnc0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdGFnRGF0YTogY29udGVudFJlYWREYXRhPy5rZXl3b3JkcyB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3M/Lmxlbmd0aCA+IDFcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3M/Lmxlbmd0aFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhZ3NMaXN0XCJcclxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRhZ0RhdGE6IGNvbnRlbnQ/LnNlYXJjaFRhZ3M/LnNsaWNlKDEsY29udGVudD8uc2VhcmNoVGFncz8ubGVuZ3RoKSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFza2VsZXRvbkxvYWRlciAmJiBzZWN0b3JzTGlzdD8ubGVuZ3RoKSAmJiAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5Py50b0xvd2VyQ2FzZSgpID09PSAnbGVhcm5pbmcgcmVzb3VyY2UnIHx8XHJcbiAgICBjb250ZW50Py5yZXNvdXJjZUNhdGVnb3J5Py50b0xvd2VyQ2FzZSgpID09PSAnY2FzZSBzdHVkeScpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIiBmbGV4IGZsZXgtY29sXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICdneWFhbkthcm1heW9naS5zZWN0b3JzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VjdG9yc0xpc3Q/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMgc206Z2FwLTQgbWItMyBmbGV4LXdyYXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdG9yIG9mIHNlY3RvcnNMaXN0OyBsZXQgaSA9IGluZGV4OyBsZXQgaXNMYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJ7J3RoZW1lLWFjdGl2YXRlZCc6IGNvbXBldGVuY3lTZWxlY3RlZCA9PT0gaXRlbS5rZXl9XCItLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZXMtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RoZW1lLWFjdGl2YXRlZCc6IHNlbGVjdGVkU2VjdG9ySWQgPT09IHNlY3Rvcj8uc2VjdG9ySWR9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU3Vic2VjdG9yKHNlY3RvciwgJ3NlbGVjdGVkJylcIj57eyBzZWN0b3I/LnNlY3Rvck5hbWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwPy5zZWN0b3JXaWRnZXRzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy11dGlscy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyIFtsb2FkU3RhdHVzXT1cIidkb25lJ1wiIFtzdHJpcENvbmZpZ109XCJzdHJpcC5zdHJpcENvbmZpZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZGdldCBvZiBzdHJpcD8uc2VjdG9yV2lkZ2V0czsgdHJhY2tCeTogdHJhY2tlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFt3c1Jlc29sdmVyV2lkZ2V0XT1cIndpZGdldFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC93cy11dGlscy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RyaXA/LnNlY3RvcldpZGdldHM/Lmxlbmd0aCA9PT0gMCAmJiBzZWxlY3RlZFNlY3RvcklkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBTdWJzZWN0b3IgQXZhaWxhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiID5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3RvciBvZiBzZWN0b3JzTGlzdDsgbGV0IGkgPSBpbmRleDsgbGV0IGlzTGFzdCA9IGxhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiID57eyBzZWN0b3I/LnNlY3Rvck5hbWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cIiFpc0xhc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIHN1YlNlY3RvcnNMaXN0Py5sZW5ndGhcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnZ3lhYW5LYXJtYXlvZ2kuc3ViU2VjdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdG9yIG9mIHN1YlNlY3RvcnNMaXN0OyBsZXQgaSA9IGluZGV4OyBsZXQgaXNMYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCIgPnt7IHNlY3Rvcj8uc3ViU2VjdG9yTmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiIWlzTGFzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3RhZ3NMaXN0IGxldC10YWdEYXRhPVwidGFnRGF0YVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJ0YWdEYXRhPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCI+e3sgJ3VzZXJQcm9maWxlLnRhZ3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWdEYXRhPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiIFtuZ0NsYXNzXT1cInsndGFncy1lbGxpcHNpcyc6IHRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgI3RhZ3NFbGVtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRhZyBvZiB0YWdEYXRhOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZSh0YWcpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwidGFnRGF0YT8ubGVuZ3RoID4gKGkgKyAxKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgd3MtbWF0LWRlZmF1bHQtdGV4dCB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc1wiIChjbGljayk9XCJ2aWV3TW9yZVRhZ3MgPSAhdmlld01vcmVUYWdzXCI+e3tcclxuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzIG10LTFcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmlld01vcmVUYWdzXCIgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgKm5nSWY9XCIhdGFnRGF0YT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICB7eyAndXNlclByb2ZpbGUubm9UYWdzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnQ/LnNlYXJjaFRhZ3NcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTFcIj57eyAndXNlclByb2ZpbGUudGFncycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3MubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiBbbmdDbGFzc109XCJ7J3RhZ3MtZWxsaXBzaXMnOiBzZWFyY2hUYWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc31cIiAjc2VhcmNoVGFnRWxlbT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWcgb2YgY29udGVudD8uc2VhcmNoVGFnczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiID57eyBoYW5kbGVDYXBpdGFsaXplKHRhZykgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzLmxlbmd0aCA+IChpICsgMSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHdzLW1hdC1kZWZhdWx0LXRleHQgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHNcIiAqbmdJZj1cInNlYXJjaFRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzXCIgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzIG10LTFcIiAqbmdJZj1cInZpZXdNb3JlVGFnc1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidmlld01vcmVUYWdzID0gIXZpZXdNb3JlVGFnc1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgKm5nSWY9XCIhY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgIHt7ICd1c2VyUHJvZmlsZS5ub1RhZ3MnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUta2FybWEtcG9pbnRzXCI+XHJcbiAgICAgICAgPHdzLXdpZGdldC1rYXJtYS1wb2ludHMgW2NvbnRlbnRdPVwiY29udGVudFwiIFtidG5DYXRlZ29yeV09XCJcIiBbY29uZGl0aW9uXT1cImNvbmRpdGlvblwiXHJcbiAgICAgICAgICAgIChjbGlja0NsYWltS2FybWFQb2ludHMpPVwiaGFuZGxlQ2xpY2tPZkNsYWltKCRldmVudClcIiBbZGF0YV09XCJrcGFycmF5XCI+XHJcbiAgICAgICAgPC93cy13aWRnZXQta2FybWEtcG9pbnRzPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzcycHgnXCJcclxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZvclByZXZpZXdcIj5cclxuICAgICAgICA8IS0tIGNvbW1lbnRlZCBiZWNhdXNlIG9mIG5ldyBkaXNjdXNzaW9uIHYyIGNvbW1lbnRzIGltcGxtZW50YXRpb24gLS0+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZGlzY3Vzc2lvbi1kaXZcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBmb3J1bS1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBnYXAtNSBpdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ydW08L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uLXRleHQgc206cHItNFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmFueVN1Z2dlc3Rpb25zJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ub25lIHAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idXR0b25cIiAoY2xpY2spPVwibmF2aWdhdGVUb0Rpc2N1c3Npb25IdWIoKVwiPnt7ICdkaXNjdXNzLnN0YXJ0RGlzY3VzcycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIiAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMl1cIj5cclxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzJweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczNnB4J1wiIFtoZWlnaHRdPVwiJzM2cHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZC1mdWxsJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZnJvbU1hcmtldFBsYWNlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIiBbbmdDbGFzc109XCJ7J2hpZGVBYm92ZTEyMDAnOiAhcm91dGVyLnVybC5pbmNsdWRlcygnL3ZpZXdlci8nKX1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hdXRob3JzQW5kQ3VyYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRob3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImF1dGhvci5waG90byB8fCAnJ1wiIFtuYW1lXT1cImF1dGhvci5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUudG9Mb3dlckNhc2UoKSwgJ25hbWUnKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTMgbW9iLXRleHRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hdXRob3InIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNyZWF0b3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JDb250YWN0cylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwaG90b1VybF09XCJjcmVhdG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiY3JlYXRvci5uYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjcmVhdG9yPy5uYW1lLnRvTG93ZXJDYXNlKCksICduYW1lJykgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zIG1vYi10ZXh0XCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIiBbbmdDbGFzc109XCJ7J2hpZGVBYm92ZTEyMDAnOiAhcm91dGVyLnVybC5pbmNsdWRlcygnL3ZpZXdlci8nKX1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItbG9nby1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY29udGVudD8uY3JlYXRvckxvZ29cIiBbc3JjXT1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwie3sgJ2FwcHRvY3NpbmdsZXBhZ2UucHJvdmlkZXInIHwgdHJhbnNsYXRlIH19XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgc3JjPVwiL2Fzc2V0cy9pbnN0YW5jZXMvZWFnbGUvYXBwX2xvZ29zL0thcm1heW9naUJoYXJhdF9Mb2dvLnN2Z1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIGJyZWFrLWFsbFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8uc291cmNlLCAnc291cmNlJykgfX08L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cclxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInNDAwcHgnXCJcclxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZvclByZXZpZXdcIj5cclxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nXCI+IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHJhdGluZ3MtZGl2IGdhcC0xMFwiIGlkPVwicmF0aW5nc0RpdlwiICpuZ0lmPVwic2hvd1Jldmlld3NcIj5cclxuICAgICAgICAgICAgPHdzLXdpZGdldC1yYXRpbmctc3VtbWFyeSBbcmF0aW5nU3VtbWFyeV09XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkXCI+PC93cy13aWRnZXQtcmF0aW5nLXN1bW1hcnk+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCIgaWQ9XCJyZXZpZXdDb250YWluZXJcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS50b3BSZXZpZXdzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkPy5hdmdSYXRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiaGFuZGxlT3BlblJldmlld01vZGFsKClcIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21zZy5zaG93QWxsJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9wUmF0aW5nUmV2aWV3cyAmJiB0b3BSYXRpbmdSZXZpZXdzPy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNVwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJ2hvcml6b250YWwtc3RyaXAnIDogJ2ZsZXgtd3JhcCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtZGl2XCIgKm5nRm9yPVwibGV0IGVhY2hSZXZpZXcgb2YgdG9wUmF0aW5nUmV2aWV3cyB8IHNsaWNlOjA6NDsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNCBmbGV4IGZsZXgtY29sIGdhcC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGVmdCBkZXNjLWVsbGlwc2lzXCIgdGl0bGU9XCJ7eyBlYWNoUmV2aWV3Py5yZXZpZXcgfX1cIj57e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoZWFjaFJldmlldz8ucmV2aWV3KSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgcmF0aW5nLXN0YXJ0LXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c3RhcjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGVhY2hSZXZpZXc/LnJhdGluZyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiBpdGVtcy1jZW50ZXIgdGV4dC1zbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImVhY2hSZXZpZXc/LnBob3RvIHx8ICcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImVhY2hSZXZpZXc/LmZpcnN0TmFtZVwiPjwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGhhbmRsZUNhcGl0YWxpemUoZWFjaFJldmlldz8uZmlyc3ROYW1lLnRvTG93ZXJDYXNlKCksICduYW1lJykgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBteC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgZWFjaFJldmlldz8uZGF0ZSB8IHBpcGVSZWxhdGl2ZVRpbWUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhdG9wUmF0aW5nUmV2aWV3cyB8fCAhdG9wUmF0aW5nUmV2aWV3cz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdGV4dC1jZW50ZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLXdoaXRlIHAtNCByb3VuZGVkLW1kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm5vUmV2aWV3c0ZvdW5kJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cclxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uYXZlcmFnZVJhdGluZ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMyBqdXN0aWZ5LWNlbnRlciByYXRpbmdzLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS5zdmdcIiBhbHQ9XCJubyByYXRpbmdzIGltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtYm9sXCI+QmUgdGhlIGZpcnN0IG9uZSB0byByYXRlIHRoaXMgY291cnNlIGFuZCB5b3VyIDxici8+IGxlYXJuaW5nIGV4cGVyaWVuY2U8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==
|