@sunbird-cb/toc 0.0.7 → 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 -500
- 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 -70
- package/esm2022/sunbird-cb-toc.mjs +4 -4
- package/fesm2022/sunbird-cb-toc.mjs +24777 -24250
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +22 -22
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +22 -22
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +183 -183
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -48
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +171 -154
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +128 -128
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +51 -51
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -29
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
- package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
- package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -25
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
- package/lib/_collection-api.d.ts +34 -34
- package/lib/_constants/widget-content.constants.d.ts +7 -7
- package/lib/_directives/tooltip.directive.d.ts +17 -17
- package/lib/_models/common.model.d.ts +3 -3
- package/lib/_models/error.model.d.ts +5 -5
- package/lib/_pipes/highlight.pipe.d.ts +10 -10
- package/lib/_services/rating.service.d.ts +18 -18
- package/lib/_services/samuhik-charcha.service.d.ts +13 -13
- package/lib/_services/viewer-route-util.d.ts +8 -8
- package/lib/_services/widget-content.model.d.ts +515 -515
- package/lib/_services/widget-content.service.d.ts +101 -101
- package/lib/_shared/translate-loader.factory.d.ts +7 -7
- package/lib/app-toc-lib.module.d.ts +88 -88
- package/lib/collection.config.d.ts +159 -159
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +78 -78
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +314 -314
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +408 -408
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -195
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +43 -43
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
- package/lib/models/app-toc-analytics.model.d.ts +152 -152
- package/lib/models/app-toc.model.d.ts +84 -84
- package/lib/models/auto-complete.model.d.ts +27 -27
- package/lib/models/card-content.model.d.ts +19 -19
- package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
- package/lib/models/discussion-forum.model.d.ts +40 -40
- package/lib/models/goal.model.d.ts +22 -22
- package/lib/models/meta-tag.model.d.ts +6 -6
- package/lib/models/playlist.model.d.ts +23 -23
- package/lib/models/profile-revamp.model.d.ts +14 -14
- package/lib/models/rating.model.d.ts +17 -17
- package/lib/models/user-profile.model.d.ts +37 -37
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
- package/lib/resolvers/config-resolver.service.d.ts +11 -11
- package/lib/resolvers/profile-resolver.service.d.ts +11 -11
- package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
- package/lib/services/access-control.service.d.ts +29 -29
- package/lib/services/action.service.d.ts +9 -9
- package/lib/services/app-toc-v2.service.d.ts +16 -14
- package/lib/services/app-toc.service.d.ts +235 -177
- package/lib/services/certificate.service.d.ts +42 -42
- package/lib/services/discuss-utils.service.d.ts +33 -33
- package/lib/services/editor.service.d.ts +17 -17
- package/lib/services/load-check.service.d.ts +8 -8
- package/lib/services/loader.service.d.ts +16 -16
- package/lib/services/mobile-apps.service.d.ts +38 -38
- package/lib/services/netcore.service.d.ts +33 -33
- package/lib/services/nps-grid.service.d.ts +15 -15
- package/lib/services/otp.service.d.ts +20 -20
- package/lib/services/profile-v2.service.d.ts +20 -20
- package/lib/services/reset-ratings.service.d.ts +8 -8
- package/lib/services/resource-download-helper.service.d.ts +29 -29
- package/lib/services/timer.service.d.ts +9 -9
- package/lib/services/title-tag.service.d.ts +21 -21
- package/lib/services/user-profile.service.d.ts +24 -24
- package/lib/services/viewer-data.service.d.ts +58 -58
- package/lib/services/viewer-util.service.d.ts +76 -62
- package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
- package/lib/share-toc/share-toc.module.d.ts +32 -32
- package/package.json +1 -1
- package/public-api.d.ts +56 -55
|
@@ -1,297 +1,297 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { ConfirmationDialogComponent } from '@sunbird-cb/consumption';
|
|
3
|
-
import * as _ from 'lodash';
|
|
4
|
-
import { AssignmentViewerV2Component } from '../app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/router";
|
|
7
|
-
import * as i2 from "@angular/material/legacy-snack-bar";
|
|
8
|
-
import * as i3 from "../../../../services/app-toc.service";
|
|
9
|
-
import * as i4 from "@sunbird-cb/utils-v2";
|
|
10
|
-
import * as i5 from "@angular/material/dialog";
|
|
11
|
-
import * as i6 from "@angular/material/legacy-dialog";
|
|
12
|
-
import * as i7 from "@angular/common";
|
|
13
|
-
import * as i8 from "@angular/material/icon";
|
|
14
|
-
import * as i9 from "@angular/material/progress-spinner";
|
|
15
|
-
import * as i10 from "@ngx-translate/core";
|
|
16
|
-
export class AppTocBatchAssignmentsComponent {
|
|
17
|
-
constructor(router, snackBar, tocSvc, configSvc, dialog, dialogLegacy, route) {
|
|
18
|
-
this.router = router;
|
|
19
|
-
this.snackBar = snackBar;
|
|
20
|
-
this.tocSvc = tocSvc;
|
|
21
|
-
this.configSvc = configSvc;
|
|
22
|
-
this.dialog = dialog;
|
|
23
|
-
this.dialogLegacy = dialogLegacy;
|
|
24
|
-
this.route = route;
|
|
25
|
-
this.assignments = [];
|
|
26
|
-
this.allowType = ['.pdf'];
|
|
27
|
-
this.isLoading = false;
|
|
28
|
-
this.submissions = [];
|
|
29
|
-
this.batchId = this.route.snapshot.queryParams.batchId ?
|
|
30
|
-
this.route.snapshot.queryParams.batchId : '';
|
|
31
|
-
}
|
|
32
|
-
ngOnInit() {
|
|
33
|
-
this.fetchAssignments();
|
|
34
|
-
}
|
|
35
|
-
getUserAssignmentStatus() {
|
|
36
|
-
if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
|
|
37
|
-
const request = {
|
|
38
|
-
filters: {
|
|
39
|
-
contextId: this.content.identifier,
|
|
40
|
-
submittedBy: this.configSvc.userProfile.userId
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
this.tocSvc.getAssignmentStatus(request).subscribe((response) => {
|
|
44
|
-
this.submissions = _.get(response, 'result.response.content', []);
|
|
45
|
-
console.log('submissions', this.submissions);
|
|
46
|
-
this.processAssignmentsWithStatus();
|
|
47
|
-
}, error => {
|
|
48
|
-
console.error('Error fetching assignment status', error);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
processAssignmentsWithStatus() {
|
|
53
|
-
this.assignments = this.assignments.map((assignment) => ({
|
|
54
|
-
...assignment,
|
|
55
|
-
expand: false,
|
|
56
|
-
downloading: false,
|
|
57
|
-
enableDownload: false,
|
|
58
|
-
answerURL: this.submissions.find(sub => sub.formId === assignment.formId)?.submitUrl || '',
|
|
59
|
-
status: this.submissions.find(sub => sub.formId === assignment.formId)?.status || 'PENDING',
|
|
60
|
-
enableView: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED',
|
|
61
|
-
submissionMeta: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED' ? this.submissions.find(sub => sub.formId === assignment.formId)?.submissionMeta : {}
|
|
62
|
-
}));
|
|
63
|
-
}
|
|
64
|
-
fetchAssignments() {
|
|
65
|
-
const payload = {
|
|
66
|
-
query: '',
|
|
67
|
-
filters: {
|
|
68
|
-
"additionalProperties.batchId": this.batchId,
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
this.tocSvc.searchAssignments(payload).subscribe((response) => {
|
|
72
|
-
let assignments = _.get(response, 'result.response.content', []);
|
|
73
|
-
this.assignments = assignments.map((assignment) => ({
|
|
74
|
-
...assignment,
|
|
75
|
-
expand: false,
|
|
76
|
-
downloading: false,
|
|
77
|
-
enableView: false,
|
|
78
|
-
enableDownload: false,
|
|
79
|
-
answerURL: '',
|
|
80
|
-
status: '',
|
|
81
|
-
submissionMeta: {}
|
|
82
|
-
}));
|
|
83
|
-
this.getUserAssignmentStatus();
|
|
84
|
-
}, error => {
|
|
85
|
-
console.error('Error fetching assignments', error);
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
handleViewFeedback(assignment) {
|
|
89
|
-
assignment.expand = true;
|
|
90
|
-
}
|
|
91
|
-
downloadFile(assignment) {
|
|
92
|
-
assignment.downloading = true;
|
|
93
|
-
assignment.enableDownload = true;
|
|
94
|
-
this.selectedAssignment = assignment;
|
|
95
|
-
this.downloadFileWithFetch(assignment);
|
|
96
|
-
}
|
|
97
|
-
downloadFileDirectly(assignment) {
|
|
98
|
-
if (assignment.additionalProperties.assignmentUrl) {
|
|
99
|
-
window.open(assignment.additionalProperties.assignmentUrl, '_blank');
|
|
100
|
-
assignment.downloading = false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async downloadFileWithFetch(assignment) {
|
|
104
|
-
if (!assignment.additionalProperties.assignmentUrl)
|
|
105
|
-
return;
|
|
106
|
-
try {
|
|
107
|
-
const response = await fetch(assignment.additionalProperties.assignmentUrl);
|
|
108
|
-
if (!response.ok) {
|
|
109
|
-
throw new Error('Network response was not ok');
|
|
110
|
-
}
|
|
111
|
-
const blob = await response.blob();
|
|
112
|
-
const url = window.URL.createObjectURL(blob);
|
|
113
|
-
const link = document.createElement('a');
|
|
114
|
-
link.href = url;
|
|
115
|
-
link.download = this.extractFilenameFromUrl(assignment.additionalProperties.assignmentUrl) || `${assignment.title}.pdf`;
|
|
116
|
-
document.body.appendChild(link);
|
|
117
|
-
link.click();
|
|
118
|
-
document.body.removeChild(link);
|
|
119
|
-
window.URL.revokeObjectURL(url);
|
|
120
|
-
assignment.downloading = false;
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
console.error('Download failed:', error);
|
|
124
|
-
this.downloadFileDirectly(assignment);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
triggerFileUpload(assignment) {
|
|
128
|
-
this.selectedAssignment = assignment;
|
|
129
|
-
if (assignment.answerURL) {
|
|
130
|
-
this.submitAssignment(assignment);
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
const fileInput = document.getElementById('sResourceFile');
|
|
134
|
-
if (fileInput) {
|
|
135
|
-
fileInput.click();
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
submitAssignment(assessment) {
|
|
140
|
-
console.log('Submit assignment clicked', assessment);
|
|
141
|
-
const dialgoData = {
|
|
142
|
-
description: 'You have already uploaded an assignment. Choose an option below to either keep your current submission or upload a new file.',
|
|
143
|
-
type: 'warning',
|
|
144
|
-
buttonsPositionClass: 'justify-center items-center',
|
|
145
|
-
buttons: [
|
|
146
|
-
{
|
|
147
|
-
classes: 'btn-out-line',
|
|
148
|
-
text: 'Re-upload',
|
|
149
|
-
response: 0
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
classes: 'succes-button',
|
|
153
|
-
text: 'Keep Submission',
|
|
154
|
-
response: 1
|
|
155
|
-
}
|
|
156
|
-
]
|
|
157
|
-
};
|
|
158
|
-
const dialogRef = this.dialogLegacy.open(ConfirmationDialogComponent, {
|
|
159
|
-
data: dialgoData,
|
|
160
|
-
disableClose: false,
|
|
161
|
-
width: '400px',
|
|
162
|
-
maxWidth: '90vw'
|
|
163
|
-
});
|
|
164
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
165
|
-
if (result === 1) {
|
|
166
|
-
//this.viewAssignments(assessment.answerURL)
|
|
167
|
-
this.previewAssignments(assessment.answerURL);
|
|
168
|
-
}
|
|
169
|
-
else if (result === 0) {
|
|
170
|
-
const fileInput = document.getElementById('sResourceFile');
|
|
171
|
-
if (fileInput) {
|
|
172
|
-
fileInput.click();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
fileInputEmit(fileInput) {
|
|
178
|
-
if (!fileInput || fileInput.length === 0) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
const file = fileInput[0];
|
|
182
|
-
if (this.checkFileType(file)) {
|
|
183
|
-
this.upload(file);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
async upload(file) {
|
|
187
|
-
this.resourceFileAdded = file;
|
|
188
|
-
this.isLoading = true;
|
|
189
|
-
try {
|
|
190
|
-
const uploadRes = await this.tocSvc.uploadAssignmentAnswer(this.content.identifier, this.batchId, this.selectedAssignment.formId, file).toPromise();
|
|
191
|
-
if (uploadRes && uploadRes.responseCode === 'OK') {
|
|
192
|
-
this.openSnackbar('File uploaded successfully');
|
|
193
|
-
this.previewAssignments(uploadRes.result.url);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
this.isLoading = false;
|
|
197
|
-
this.openSnackbar('File upload failed. Please try again.');
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
catch (error) {
|
|
201
|
-
this.isLoading = false;
|
|
202
|
-
console.error('Upload API error:', error);
|
|
203
|
-
this.openSnackbar('File upload failed. Please try again.');
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
previewAssignments(result) {
|
|
207
|
-
this.isLoading = false;
|
|
208
|
-
this.callingViewAssignments(result);
|
|
209
|
-
}
|
|
210
|
-
callingViewAssignments(url) {
|
|
211
|
-
const dialogRef = this.dialog.open(AssignmentViewerV2Component, {
|
|
212
|
-
width: '40%',
|
|
213
|
-
disableClose: true,
|
|
214
|
-
panelClass: 'dialog_sidenav',
|
|
215
|
-
data: {
|
|
216
|
-
assessment: this.selectedAssignment,
|
|
217
|
-
url: url,
|
|
218
|
-
contentId: this.content.identifier,
|
|
219
|
-
batchId: this.batchId,
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
dialogRef.afterClosed().subscribe(result => {
|
|
223
|
-
setTimeout(() => {
|
|
224
|
-
this.fetchAssignments();
|
|
225
|
-
}, 1000);
|
|
226
|
-
console.log(result);
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
checkFileType(file) {
|
|
230
|
-
let flag = false;
|
|
231
|
-
if (file && file.size) {
|
|
232
|
-
const fileInMB = Math.floor(file.size / (1024 * 1024));
|
|
233
|
-
if (fileInMB > 5) {
|
|
234
|
-
this.openSnackbar('File size exceeds 5 MB limit. Please upload a smaller file.');
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
if (file && this.allowType && this.allowType.length > 0) {
|
|
239
|
-
this.allowType.forEach((ele) => {
|
|
240
|
-
if (file.name.toLowerCase().endsWith(ele)) {
|
|
241
|
-
flag = true;
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
if (!flag) {
|
|
246
|
-
this.openSnackbar('Invalid file type uploaded. Please upload supporting format only.');
|
|
247
|
-
}
|
|
248
|
-
this.fileExtention = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
|
|
249
|
-
if (file) {
|
|
250
|
-
if (['.pdf'].includes(this.fileExtention)) {
|
|
251
|
-
flag = true;
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
flag = false;
|
|
255
|
-
}
|
|
256
|
-
if (!flag) {
|
|
257
|
-
this.openSnackbar('Invalid file type uploaded. Please upload PDF format only.');
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
return flag;
|
|
261
|
-
}
|
|
262
|
-
getMarks(submissionMeta) {
|
|
263
|
-
if (submissionMeta?.marksGiven != null && submissionMeta?.maximumMarks != null) {
|
|
264
|
-
return `${submissionMeta.marksGiven}` + '/' + `${submissionMeta.maximumMarks}`;
|
|
265
|
-
}
|
|
266
|
-
else if (submissionMeta?.marksGiven != null) {
|
|
267
|
-
return `${submissionMeta.marksGiven}`;
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
return 'N/A';
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
openSnackbar(primaryMsg, duration = 5000) {
|
|
274
|
-
this.snackBar.open(primaryMsg, 'X', {
|
|
275
|
-
duration,
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
extractFilenameFromUrl(url) {
|
|
279
|
-
try {
|
|
280
|
-
const urlParts = url.split('/');
|
|
281
|
-
const filename = urlParts[urlParts.length - 1];
|
|
282
|
-
return filename.includes('.') ? filename : '';
|
|
283
|
-
}
|
|
284
|
-
catch (error) {
|
|
285
|
-
return '';
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, deps: [{ token: i1.Router }, { token: i2.MatLegacySnackBar }, { token: i3.AppTocService }, { token: i4.ConfigurationsService }, { token: i5.MatDialog }, { token: i6.MatLegacyDialog }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
289
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: { content: "content" }, ngImport: i0, template: "<div class=\"guide-container\">\n <div class=\"flex flex row\">\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\n </div>\n </div>\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\n <div class=\"guide-card\">\n <div class=\"content flex gap-4 justify-between flex-middle\">\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\n </span>\n <span *ngIf=\"!assignment.downloading\">\n {{ 'userAssignments.download' | translate }}\n </span>\n </button>\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\"\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\n Upload\n </button> -->\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\n (change)=\"fileInputEmit(resourceFile.files)\">\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\n }}</button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\n </ng-container>\n\n </div>\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\n (click)=\"assignment.expand = !assignment.expand\">\n close\n </mat-icon>\n </div>\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\n <div class=\"font-bold font-style\">\n <div>\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\n </div>\n </div>\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\n <div class=\"font-style\">\n {{assignment?.submissionMeta?.instructorFeedback}}\n </div>\n </div>\n\n </div>\n </ng-container>\n</div>\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\n</div>\n\n\n<!-- No teachers resources message -->\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\n {{ 'userAssignments.noAssignments' | translate }}\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
|
|
290
|
-
}
|
|
291
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, decorators: [{
|
|
292
|
-
type: Component,
|
|
293
|
-
args: [{ selector: 'ws-widget-app-batch-assignments', template: "<div class=\"guide-container\">\n <div class=\"flex flex row\">\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\n </div>\n </div>\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\n <div class=\"guide-card\">\n <div class=\"content flex gap-4 justify-between flex-middle\">\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\n </span>\n <span *ngIf=\"!assignment.downloading\">\n {{ 'userAssignments.download' | translate }}\n </span>\n </button>\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\"\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\n {{ 'userAssignments.upload' | translate }}\n </button>\n </ng-container>\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\n Upload\n </button> -->\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\n (change)=\"fileInputEmit(resourceFile.files)\">\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\n }}</button>\n </ng-container>\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\n </ng-container>\n\n </div>\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\n (click)=\"assignment.expand = !assignment.expand\">\n close\n </mat-icon>\n </div>\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\n <div class=\"font-bold font-style\">\n <div>\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\n </div>\n </div>\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\n <div class=\"font-style\">\n {{assignment?.submissionMeta?.instructorFeedback}}\n </div>\n </div>\n\n </div>\n </ng-container>\n</div>\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\n</div>\n\n\n<!-- No teachers resources message -->\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\n {{ 'userAssignments.noAssignments' | translate }}\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"] }]
|
|
294
|
-
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MatLegacySnackBar }, { type: i3.AppTocService }, { type: i4.ConfigurationsService }, { type: i5.MatDialog }, { type: i6.MatLegacyDialog }, { type: i1.ActivatedRoute }]; }, propDecorators: { content: [{
|
|
295
|
-
type: Input
|
|
296
|
-
}] } });
|
|
297
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBTXhELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXJFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7QUFRbEgsTUFBTSxPQUFPLCtCQUErQjtJQWExQyxZQUFtQixNQUFjLEVBQ3ZCLFFBQTJCLEVBQzVCLE1BQXFCLEVBQ3JCLFNBQWdDLEVBQy9CLE1BQWlCLEVBQ2pCLFlBQTZCLEVBQzdCLEtBQXFCO1FBTlosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBaEIvQixnQkFBVyxHQUFVLEVBQUUsQ0FBQTtRQUN2QixjQUFTLEdBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUc5QixjQUFTLEdBQVksS0FBSyxDQUFBO1FBRzFCLGdCQUFXLEdBQVUsRUFBRSxDQUFBO1FBV3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDbkUsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsT0FBTyxFQUFFO29CQUNQLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7b0JBQ2xDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNO2lCQUMvQzthQUNGLENBQUE7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUNuRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFBO2dCQUNqRSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQzVDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFBO1lBQ3JDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzFELENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFDSCxDQUFDO0lBRUQsNEJBQTRCO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUQsR0FBRyxVQUFVO1lBQ2IsTUFBTSxFQUFFLEtBQUs7WUFDYixXQUFXLEVBQUUsS0FBSztZQUNsQixjQUFjLEVBQUUsS0FBSztZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLElBQUksRUFBRTtZQUMxRixNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLElBQUksU0FBUztZQUMzRixVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEtBQUssV0FBVztZQUNsRyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtTQUM3TCxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxNQUFNLE9BQU8sR0FBUTtZQUNuQixLQUFLLEVBQUUsRUFBRTtZQUNULE9BQU8sRUFBRTtnQkFDUCw4QkFBOEIsRUFBRSxJQUFJLENBQUMsT0FBTzthQUM3QztTQUNGLENBQUE7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ2pFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBQ2hFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdkQsR0FBRyxVQUFVO2dCQUNiLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixVQUFVLEVBQUUsS0FBSztnQkFDakIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGNBQWMsRUFBRSxFQUFFO2FBQ25CLENBQUMsQ0FBQyxDQUFBO1lBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7UUFDaEMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNwRCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUFlO1FBQ2hDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO0lBQzFCLENBQUM7SUFFRCxZQUFZLENBQUMsVUFBZTtRQUMxQixVQUFVLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTtRQUM3QixVQUFVLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQTtRQUNoQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFBO1FBQ3BDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsVUFBZTtRQUNsQyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLEVBQUU7WUFDakQsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFBO1lBQ3BFLFVBQVUsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO1NBQy9CO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFlO1FBQ3pDLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsYUFBYTtZQUFFLE9BQU07UUFDMUQsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO2FBQy9DO1lBQ0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDbEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDNUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQTtZQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLE1BQU0sQ0FBQTtZQUN2SCxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMvQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDWixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMvQixVQUFVLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtTQUMvQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtZQUN4QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUE7U0FDdEM7SUFDSCxDQUFDO0lBR0QsaUJBQWlCLENBQUMsVUFBZTtRQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsVUFBVSxDQUFBO1FBQ3BDLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7U0FDbEM7YUFBTTtZQUNMLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFxQixDQUFDO1lBQy9FLElBQUksU0FBUyxFQUFFO2dCQUNiLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNuQjtTQUNGO0lBRUgsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQWU7UUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUNwRCxNQUFNLFVBQVUsR0FBRztZQUNqQixXQUFXLEVBQUUsOEhBQThIO1lBQzNJLElBQUksRUFBRSxTQUFTO1lBQ2Ysb0JBQW9CLEVBQUUsNkJBQTZCO1lBQ25ELE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxPQUFPLEVBQUUsY0FBYztvQkFDdkIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFFBQVEsRUFBRSxDQUFDO2lCQUNaO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixJQUFJLEVBQUUsaUJBQWlCO29CQUN2QixRQUFRLEVBQUUsQ0FBQztpQkFDWjthQUNGO1NBQ0YsQ0FBQTtRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQ3BFLElBQUksRUFBRSxVQUFVO1lBQ2hCLFlBQVksRUFBRSxLQUFLO1lBQ25CLEtBQUssRUFBRSxPQUFPO1lBQ2QsUUFBUSxFQUFFLE1BQU07U0FDakIsQ0FBQyxDQUFBO1FBRUYsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ2hELElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDaEIsNENBQTRDO2dCQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2FBQzlDO2lCQUFNLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQXFCLENBQUM7Z0JBQy9FLElBQUksU0FBUyxFQUFFO29CQUNiLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtpQkFDbEI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGFBQWEsQ0FBQyxTQUEwQjtRQUN0QyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLE9BQU07U0FDUDtRQUNELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUNsQjtJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVM7UUFDcEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtRQUVyQixJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQVEsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUM5QixJQUFJLENBQ0wsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtZQUViLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxZQUFZLEtBQUssSUFBSSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLDRCQUE0QixDQUFDLENBQUE7Z0JBQy9DLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQzlDO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO2dCQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxDQUFDLENBQUE7YUFDM0Q7U0FDRjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDekMsSUFBSSxDQUFDLFlBQVksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO1NBQzNEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQVc7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxHQUFRO1FBQzdCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFO1lBQzlELEtBQUssRUFBRSxLQUFLO1lBQ1osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLGdCQUFnQjtZQUM1QixJQUFJLEVBQUU7Z0JBQ0osVUFBVSxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ25DLEdBQUcsRUFBRSxHQUFHO2dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVU7Z0JBQ2xDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN0QjtTQUNGLENBQUMsQ0FBQTtRQUNGLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDekMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTtZQUN6QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDUixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUdELGFBQWEsQ0FBQyxJQUFVO1FBQ3RCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQTtRQUNoQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3JCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ3RELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFlBQVksQ0FBQyw2REFBNkQsQ0FBQyxDQUFBO2dCQUNoRixPQUFPLEtBQUssQ0FBQTthQUNiO1NBQ0Y7UUFDRCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFBO2lCQUNaO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDtRQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLG1FQUFtRSxDQUFDLENBQUE7U0FDdkY7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDbEYsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDekMsSUFBSSxHQUFHLElBQUksQ0FBQTthQUNaO2lCQUFNO2dCQUNMLElBQUksR0FBRyxLQUFLLENBQUE7YUFDYjtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyw0REFBNEQsQ0FBQyxDQUFBO2FBQ2hGO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxRQUFRLENBQUMsY0FBbUI7UUFDMUIsSUFBSSxjQUFjLEVBQUUsVUFBVSxJQUFJLElBQUksSUFBSSxjQUFjLEVBQUUsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM5RSxPQUFPLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtTQUMvRTthQUFNLElBQUksY0FBYyxFQUFFLFVBQVUsSUFBSSxJQUFJLEVBQUU7WUFDN0MsT0FBTyxHQUFHLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtTQUN0QzthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUE7U0FDYjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsVUFBa0IsRUFBRSxXQUFtQixJQUFJO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7WUFDbEMsUUFBUTtTQUNULENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxzQkFBc0IsQ0FBQyxHQUFXO1FBQ2hDLElBQUk7WUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7U0FDOUM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7SUFDSCxDQUFDOytHQXhTVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1R0NqQjVDLDJ2SUFnRk07OzRGRC9ETywrQkFBK0I7a0JBTjNDLFNBQVM7K0JBQ0UsaUNBQWlDO2dSQU9sQyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZydcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1hc3NpZ25tZW50LXZpZXdlclYyL2FwcC10b2MtYXNzaWdubWVudC12aWV3ZXJWMi5jb21wb25lbnQnXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NCYXRjaEFzc2lnbm1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjb250ZW50OiBhbnlcbiAgYXNzaWdubWVudHM6IGFueVtdID0gW11cbiAgYWxsb3dUeXBlOiBzdHJpbmdbXSA9IFsnLnBkZiddXG4gIGZpbGVFeHRlbnRpb246IGFueVxuICByZXNvdXJjZUZpbGVBZGRlZDogYW55XG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlXG4gIHNlbGVjdGVkQXNzaWdubWVudDogYW55XG4gIGJhdGNoSWQ6IGFueVxuICBzdWJtaXNzaW9uczogYW55W10gPSBbXVxuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdExlZ2FjeVNuYWNrQmFyLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBkaWFsb2dMZWdhY3k6IE1hdExlZ2FjeURpYWxvZyxcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgKSB7XG4gICAgdGhpcy5iYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZldGNoQXNzaWdubWVudHMoKVxuICB9XG5cbiAgZ2V0VXNlckFzc2lnbm1lbnRTdGF0dXMoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGNvbnRleHRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3VibWl0dGVkQnk6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnRvY1N2Yy5nZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnN1Ym1pc3Npb25zID0gXy5nZXQocmVzcG9uc2UsICdyZXN1bHQucmVzcG9uc2UuY29udGVudCcsIFtdKVxuICAgICAgICBjb25zb2xlLmxvZygnc3VibWlzc2lvbnMnLCB0aGlzLnN1Ym1pc3Npb25zKVxuICAgICAgICB0aGlzLnByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKVxuICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBmZXRjaGluZyBhc3NpZ25tZW50IHN0YXR1cycsIGVycm9yKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzQXNzaWdubWVudHNXaXRoU3RhdHVzKCkge1xuICAgIHRoaXMuYXNzaWdubWVudHMgPSB0aGlzLmFzc2lnbm1lbnRzLm1hcCgoYXNzaWdubWVudDogYW55KSA9PiAoe1xuICAgICAgLi4uYXNzaWdubWVudCxcbiAgICAgIGV4cGFuZDogZmFsc2UsXG4gICAgICBkb3dubG9hZGluZzogZmFsc2UsXG4gICAgICBlbmFibGVEb3dubG9hZDogZmFsc2UsXG4gICAgICBhbnN3ZXJVUkw6IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdWJtaXRVcmwgfHwgJycsXG4gICAgICBzdGF0dXM6IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdGF0dXMgfHwgJ1BFTkRJTkcnLFxuICAgICAgZW5hYmxlVmlldzogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcsXG4gICAgICBzdWJtaXNzaW9uTWV0YTogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcgPyB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3VibWlzc2lvbk1ldGEgOiB7fVxuICAgIH0pKVxuICB9XG4gIGZldGNoQXNzaWdubWVudHMoKSB7XG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xuICAgICAgcXVlcnk6ICcnLFxuICAgICAgZmlsdGVyczoge1xuICAgICAgICBcImFkZGl0aW9uYWxQcm9wZXJ0aWVzLmJhdGNoSWRcIjogdGhpcy5iYXRjaElkLFxuICAgICAgfSxcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuc2VhcmNoQXNzaWdubWVudHMocGF5bG9hZCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICBsZXQgYXNzaWdubWVudHMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXG4gICAgICB0aGlzLmFzc2lnbm1lbnRzID0gYXNzaWdubWVudHMubWFwKChhc3NpZ25tZW50OiBhbnkpID0+ICh7XG4gICAgICAgIC4uLmFzc2lnbm1lbnQsXG4gICAgICAgIGV4cGFuZDogZmFsc2UsXG4gICAgICAgIGRvd25sb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlVmlldzogZmFsc2UsXG4gICAgICAgIGVuYWJsZURvd25sb2FkOiBmYWxzZSxcbiAgICAgICAgYW5zd2VyVVJMOiAnJyxcbiAgICAgICAgc3RhdHVzOiAnJyxcbiAgICAgICAgc3VibWlzc2lvbk1ldGE6IHt9XG4gICAgICB9KSlcbiAgICAgIHRoaXMuZ2V0VXNlckFzc2lnbm1lbnRTdGF0dXMoKVxuICAgIH0sIGVycm9yID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIGFzc2lnbm1lbnRzJywgZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZVZpZXdGZWVkYmFjayhhc3NpZ25tZW50OiBhbnkpIHtcbiAgICBhc3NpZ25tZW50LmV4cGFuZCA9IHRydWVcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShhc3NpZ25tZW50OiBhbnkpIHtcbiAgICBhc3NpZ25tZW50LmRvd25sb2FkaW5nID0gdHJ1ZVxuICAgIGFzc2lnbm1lbnQuZW5hYmxlRG93bmxvYWQgPSB0cnVlXG4gICAgdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQgPSBhc3NpZ25tZW50XG4gICAgdGhpcy5kb3dubG9hZEZpbGVXaXRoRmV0Y2goYXNzaWdubWVudClcbiAgfVxuXG4gIGRvd25sb2FkRmlsZURpcmVjdGx5KGFzc2lnbm1lbnQ6IGFueSkge1xuICAgIGlmIChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCwgJ19ibGFuaycpXG4gICAgICBhc3NpZ25tZW50LmRvd25sb2FkaW5nID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBhc3luYyBkb3dubG9hZEZpbGVXaXRoRmV0Y2goYXNzaWdubWVudDogYW55KSB7XG4gICAgaWYgKCFhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHJldHVyblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybClcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZXR3b3JrIHJlc3BvbnNlIHdhcyBub3Qgb2snKVxuICAgICAgfVxuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKVxuICAgICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGxpbmsuaHJlZiA9IHVybFxuICAgICAgbGluay5kb3dubG9hZCA9IHRoaXMuZXh0cmFjdEZpbGVuYW1lRnJvbVVybChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHx8IGAke2Fzc2lnbm1lbnQudGl0bGV9LnBkZmBcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaylcbiAgICAgIGxpbmsuY2xpY2soKVxuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKVxuICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKVxuICAgICAgYXNzaWdubWVudC5kb3dubG9hZGluZyA9IGZhbHNlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Rvd25sb2FkIGZhaWxlZDonLCBlcnJvcilcbiAgICAgIHRoaXMuZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudClcbiAgICB9XG4gIH1cblxuXG4gIHRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQ6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50ID0gYXNzaWdubWVudFxuICAgIGlmIChhc3NpZ25tZW50LmFuc3dlclVSTCkge1xuICAgICAgdGhpcy5zdWJtaXRBc3NpZ25tZW50KGFzc2lnbm1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzUmVzb3VyY2VGaWxlJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGlmIChmaWxlSW5wdXQpIHtcbiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBzdWJtaXRBc3NpZ25tZW50KGFzc2Vzc21lbnQ6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdTdWJtaXQgYXNzaWdubWVudCBjbGlja2VkJywgYXNzZXNzbWVudClcbiAgICBjb25zdCBkaWFsZ29EYXRhID0ge1xuICAgICAgZGVzY3JpcHRpb246ICdZb3UgaGF2ZSBhbHJlYWR5IHVwbG9hZGVkIGFuIGFzc2lnbm1lbnQuIENob29zZSBhbiBvcHRpb24gYmVsb3cgdG8gZWl0aGVyIGtlZXAgeW91ciBjdXJyZW50IHN1Ym1pc3Npb24gb3IgdXBsb2FkIGEgbmV3IGZpbGUuJyxcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgIGJ1dHRvbnNQb3NpdGlvbkNsYXNzOiAnanVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyJyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGNsYXNzZXM6ICdidG4tb3V0LWxpbmUnLFxuICAgICAgICAgIHRleHQ6ICdSZS11cGxvYWQnLFxuICAgICAgICAgIHJlc3BvbnNlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiAnc3VjY2VzLWJ1dHRvbicsXG4gICAgICAgICAgdGV4dDogJ0tlZXAgU3VibWlzc2lvbicsXG4gICAgICAgICAgcmVzcG9uc2U6IDFcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ0xlZ2FjeS5vcGVuKENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGlhbGdvRGF0YSxcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXG4gICAgICB3aWR0aDogJzQwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dydcbiAgICB9KVxuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gMSkge1xuICAgICAgICAvL3RoaXMudmlld0Fzc2lnbm1lbnRzKGFzc2Vzc21lbnQuYW5zd2VyVVJMKVxuICAgICAgICB0aGlzLnByZXZpZXdBc3NpZ25tZW50cyhhc3Nlc3NtZW50LmFuc3dlclVSTClcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGZpbGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzUmVzb3VyY2VGaWxlJykgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgaWYgKGZpbGVJbnB1dCkge1xuICAgICAgICAgIGZpbGVJbnB1dC5jbGljaygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZmlsZUlucHV0RW1pdChmaWxlSW5wdXQ6IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghZmlsZUlucHV0IHx8IGZpbGVJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmaWxlID0gZmlsZUlucHV0WzBdXG4gICAgaWYgKHRoaXMuY2hlY2tGaWxlVHlwZShmaWxlKSkge1xuICAgICAgdGhpcy51cGxvYWQoZmlsZSlcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGxvYWQoZmlsZTogYW55KSB7XG4gICAgdGhpcy5yZXNvdXJjZUZpbGVBZGRlZCA9IGZpbGVcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGxvYWRSZXM6IGFueSA9IGF3YWl0IHRoaXMudG9jU3ZjLnVwbG9hZEFzc2lnbm1lbnRBbnN3ZXIoXG4gICAgICAgIHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmJhdGNoSWQsXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50LmZvcm1JZCxcbiAgICAgICAgZmlsZVxuICAgICAgKS50b1Byb21pc2UoKVxuXG4gICAgICBpZiAodXBsb2FkUmVzICYmIHVwbG9hZFJlcy5yZXNwb25zZUNvZGUgPT09ICdPSycpIHtcbiAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JylcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHModXBsb2FkUmVzLnJlc3VsdC51cmwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG4gICAgICBjb25zb2xlLmVycm9yKCdVcGxvYWQgQVBJIGVycm9yOicsIGVycm9yKVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ZpbGUgdXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKVxuICAgIH1cbiAgfVxuXG4gIHByZXZpZXdBc3NpZ25tZW50cyhyZXN1bHQ6IGFueSkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICB0aGlzLmNhbGxpbmdWaWV3QXNzaWdubWVudHMocmVzdWx0KVxuICB9XG5cbiAgY2FsbGluZ1ZpZXdBc3NpZ25tZW50cyh1cmw6IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwJScsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICBwYW5lbENsYXNzOiAnZGlhbG9nX3NpZGVuYXYnLFxuICAgICAgZGF0YToge1xuICAgICAgICBhc3Nlc3NtZW50OiB0aGlzLnNlbGVjdGVkQXNzaWdubWVudCxcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuYmF0Y2hJZCxcbiAgICAgIH1cbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmV0Y2hBc3NpZ25tZW50cygpXG4gICAgICB9LCAxMDAwKVxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgIH0pXG4gIH1cblxuXG4gIGNoZWNrRmlsZVR5cGUoZmlsZTogRmlsZSkge1xuICAgIGxldCBmbGFnID0gZmFsc2VcbiAgICBpZiAoZmlsZSAmJiBmaWxlLnNpemUpIHtcbiAgICAgIGNvbnN0IGZpbGVJbk1CID0gTWF0aC5mbG9vcihmaWxlLnNpemUgLyAoMTAyNCAqIDEwMjQpKVxuICAgICAgaWYgKGZpbGVJbk1CID4gNSkge1xuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignRmlsZSBzaXplIGV4Y2VlZHMgNSBNQiBsaW1pdC4gUGxlYXNlIHVwbG9hZCBhIHNtYWxsZXIgZmlsZS4nKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpbGUgJiYgdGhpcy5hbGxvd1R5cGUgJiYgdGhpcy5hbGxvd1R5cGUubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5hbGxvd1R5cGUuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGVsZSkpIHtcbiAgICAgICAgICBmbGFnID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdJbnZhbGlkIGZpbGUgdHlwZSB1cGxvYWRlZC4gUGxlYXNlIHVwbG9hZCBzdXBwb3J0aW5nIGZvcm1hdCBvbmx5LicpXG4gICAgfVxuICAgIHRoaXMuZmlsZUV4dGVudGlvbiA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZyhmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSlcbiAgICBpZiAoZmlsZSkge1xuICAgICAgaWYgKFsnLnBkZiddLmluY2x1ZGVzKHRoaXMuZmlsZUV4dGVudGlvbikpIHtcbiAgICAgICAgZmxhZyA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsYWcgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdJbnZhbGlkIGZpbGUgdHlwZSB1cGxvYWRlZC4gUGxlYXNlIHVwbG9hZCBQREYgZm9ybWF0IG9ubHkuJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsYWdcbiAgfVxuXG4gIGdldE1hcmtzKHN1Ym1pc3Npb25NZXRhOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsICYmIHN1Ym1pc3Npb25NZXRhPy5tYXhpbXVtTWFya3MgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGAke3N1Ym1pc3Npb25NZXRhLm1hcmtzR2l2ZW59YCArICcvJyArIGAke3N1Ym1pc3Npb25NZXRhLm1heGltdW1NYXJrc31gXG4gICAgfSBlbHNlIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnTi9BJ1xuICAgIH1cbiAgfVxuXG4gIG9wZW5TbmFja2JhcihwcmltYXJ5TXNnOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSA1MDAwKSB7XG4gICAgdGhpcy5zbmFja0Jhci5vcGVuKHByaW1hcnlNc2csICdYJywge1xuICAgICAgZHVyYXRpb24sXG4gICAgfSlcbiAgfVxuICBleHRyYWN0RmlsZW5hbWVGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsUGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSB1cmxQYXJ0c1t1cmxQYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgcmV0dXJuIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykgPyBmaWxlbmFtZSA6ICcnXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImd1aWRlLWNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4IHJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJhbm5lciBpbmZvLWJhbm5lci13YXJuaW5nIGZsZXggZmxleC1yb3cgaXRtLWNlbnRlclwiPlxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIG1hcmdpbi1yaWdodC1zIGFzc2lnbm1lbnQtbm90ZS1pY29uXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICA8c3BhbiBjbGFzcz1cImFzc2lnbm1lbnQtbm90ZVwiPiB7eyAndXNlckFzc2lnbm1lbnRzLm5vdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXNzaWdubWVudCBvZiBhc3NpZ25tZW50czsgaW5kZXggYXMgaVwiPlxuICAgIDxkaXYgY2xhc3M9XCJndWlkZS1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudCBmbGV4IGdhcC00IGp1c3RpZnktYmV0d2VlbiBmbGV4LW1pZGRsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm90ZS10aXRsZVwiPnt7aSArIDF9fS4ge3thc3NpZ25tZW50LnRpdGxlfX0gPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbWlkZGxlIGdhcC0zXCIgKm5nSWY9XCIhYXNzaWdubWVudC5leHBhbmRcIj5cbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJkb3dubG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRvd25sb2FkRmlsZShhc3NpZ25tZW50KVwiIFtkaXNhYmxlZF09XCJhc3NpZ25tZW50LmRvd25sb2FkaW5nXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIiBjbGFzcz1cIndoaXRlLXNwaW5uZXJcIj5cbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIiBbc3R5bGUuY29sb3JdPVwiJ3doaXRlJ1wiIHN0cm9rZVdpZHRoPVwiMlwiPjwvbWF0LXNwaW5uZXI+RG93bmxvYWRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIj5cbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy5kb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdEUkFGVCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInVwbG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIj5cbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgIT09ICdEUkFGVCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInVwbG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnIHx8IGFzc2lnbm1lbnQuc3RhdHVzID09PSAnRVZBTFVBVEVEJyB8fCAhYXNzaWdubWVudC5lbmFibGVEb3dubG9hZFwiPlxuICAgICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLnVwbG9hZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlckZpbGVVcGxvYWQoYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwiIWFzc2lnbm1lbnQuZW5hYmxlRG93bmxvYWRcIj5cbiAgICAgICAgICAgIFVwbG9hZFxuICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICA8aW5wdXQgI3Jlc291cmNlRmlsZSB0eXBlPVwiZmlsZVwiIG5hbWU9XCJzUmVzb3VyY2VGaWxlXCIgaWQ9XCJzUmVzb3VyY2VGaWxlXCIgY2xhc3M9XCJoaWRkZW5cIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlSW5wdXRFbWl0KHJlc291cmNlRmlsZS5maWxlcylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnXCI+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ2aWV3LWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCdcIj5cbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBjbGFzcz1cInZpZXctYnRuIGN1cnNvci1wb2ludGVyIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktY2VudGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZVZpZXdGZWVkYmFjayhhc3NpZ25tZW50KVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjLWljb25cIiAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kXCJcbiAgICAgICAgICAoY2xpY2spPVwiYXNzaWdubWVudC5leHBhbmQgPSAhYXNzaWdubWVudC5leHBhbmRcIj5cbiAgICAgICAgICBjbG9zZVxuICAgICAgICA8L21hdC1pY29uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gZmxleC1jb2wgbXQtNCBmZWVkYmFjay1jb250YWluZXJcIlxuICAgICAgICAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kICYmIGFzc2lnbm1lbnQ/LnN1Ym1pc3Npb25NZXRhPy5tYXJrc0dpdmVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGQgZm9udC1zdHlsZVwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLm1hcmtzT2J0YWluZWQnIHwgdHJhbnNsYXRlIH19IC0ge3tnZXRNYXJrcyhhc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YSl9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+e3sgJ3VzZXJBc3NpZ25tZW50cy5pbnN0cnVjdG9yRmVlZGJhY2snIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb250LXN0eWxlXCI+XG4gICAgICAgICAge3thc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YT8uaW5zdHJ1Y3RvckZlZWRiYWNrfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTQgbG9hZGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgPG1hdC1zcGlubmVyIHN0cm9rZVdpZHRoPVwiM1wiIFtkaWFtZXRlcl09XCI1MFwiIFtzdHlsZS5zdHJva2VdPVwiJyMxQjRDQTEnXCIgY2xhc3M9XCJibHVlLXNwaW5uZXJcIj48L21hdC1zcGlubmVyPlxuPC9kaXY+XG5cblxuPCEtLSBObyB0ZWFjaGVycyByZXNvdXJjZXMgbWVzc2FnZSAtLT5cbjxkaXYgKm5nSWY9XCJhc3NpZ25tZW50cz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXNvdXJjZXMtbWVzc2FnZSBtdC00XCI+XG4gIHt7ICd1c2VyQXNzaWdubWVudHMubm9Bc3NpZ25tZW50cycgfCB0cmFuc2xhdGUgfX1cbjwvZGl2PiJdfQ==
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { ConfirmationDialogComponent } from '@sunbird-cb/consumption';
|
|
3
|
+
import * as _ from 'lodash';
|
|
4
|
+
import { AssignmentViewerV2Component } from '../app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/router";
|
|
7
|
+
import * as i2 from "@angular/material/legacy-snack-bar";
|
|
8
|
+
import * as i3 from "../../../../services/app-toc.service";
|
|
9
|
+
import * as i4 from "@sunbird-cb/utils-v2";
|
|
10
|
+
import * as i5 from "@angular/material/dialog";
|
|
11
|
+
import * as i6 from "@angular/material/legacy-dialog";
|
|
12
|
+
import * as i7 from "@angular/common";
|
|
13
|
+
import * as i8 from "@angular/material/icon";
|
|
14
|
+
import * as i9 from "@angular/material/progress-spinner";
|
|
15
|
+
import * as i10 from "@ngx-translate/core";
|
|
16
|
+
export class AppTocBatchAssignmentsComponent {
|
|
17
|
+
constructor(router, snackBar, tocSvc, configSvc, dialog, dialogLegacy, route) {
|
|
18
|
+
this.router = router;
|
|
19
|
+
this.snackBar = snackBar;
|
|
20
|
+
this.tocSvc = tocSvc;
|
|
21
|
+
this.configSvc = configSvc;
|
|
22
|
+
this.dialog = dialog;
|
|
23
|
+
this.dialogLegacy = dialogLegacy;
|
|
24
|
+
this.route = route;
|
|
25
|
+
this.assignments = [];
|
|
26
|
+
this.allowType = ['.pdf'];
|
|
27
|
+
this.isLoading = false;
|
|
28
|
+
this.submissions = [];
|
|
29
|
+
this.batchId = this.route.snapshot.queryParams.batchId ?
|
|
30
|
+
this.route.snapshot.queryParams.batchId : '';
|
|
31
|
+
}
|
|
32
|
+
ngOnInit() {
|
|
33
|
+
this.fetchAssignments();
|
|
34
|
+
}
|
|
35
|
+
getUserAssignmentStatus() {
|
|
36
|
+
if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
|
|
37
|
+
const request = {
|
|
38
|
+
filters: {
|
|
39
|
+
contextId: this.content.identifier,
|
|
40
|
+
submittedBy: this.configSvc.userProfile.userId
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
this.tocSvc.getAssignmentStatus(request).subscribe((response) => {
|
|
44
|
+
this.submissions = _.get(response, 'result.response.content', []);
|
|
45
|
+
console.log('submissions', this.submissions);
|
|
46
|
+
this.processAssignmentsWithStatus();
|
|
47
|
+
}, error => {
|
|
48
|
+
console.error('Error fetching assignment status', error);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
processAssignmentsWithStatus() {
|
|
53
|
+
this.assignments = this.assignments.map((assignment) => ({
|
|
54
|
+
...assignment,
|
|
55
|
+
expand: false,
|
|
56
|
+
downloading: false,
|
|
57
|
+
enableDownload: false,
|
|
58
|
+
answerURL: this.submissions.find(sub => sub.formId === assignment.formId)?.submitUrl || '',
|
|
59
|
+
status: this.submissions.find(sub => sub.formId === assignment.formId)?.status || 'PENDING',
|
|
60
|
+
enableView: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED',
|
|
61
|
+
submissionMeta: this.submissions.find(sub => sub.formId === assignment.formId)?.status === 'EVALUATED' ? this.submissions.find(sub => sub.formId === assignment.formId)?.submissionMeta : {}
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
fetchAssignments() {
|
|
65
|
+
const payload = {
|
|
66
|
+
query: '',
|
|
67
|
+
filters: {
|
|
68
|
+
"additionalProperties.batchId": this.batchId,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
this.tocSvc.searchAssignments(payload).subscribe((response) => {
|
|
72
|
+
let assignments = _.get(response, 'result.response.content', []);
|
|
73
|
+
this.assignments = assignments.map((assignment) => ({
|
|
74
|
+
...assignment,
|
|
75
|
+
expand: false,
|
|
76
|
+
downloading: false,
|
|
77
|
+
enableView: false,
|
|
78
|
+
enableDownload: false,
|
|
79
|
+
answerURL: '',
|
|
80
|
+
status: '',
|
|
81
|
+
submissionMeta: {}
|
|
82
|
+
}));
|
|
83
|
+
this.getUserAssignmentStatus();
|
|
84
|
+
}, error => {
|
|
85
|
+
console.error('Error fetching assignments', error);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
handleViewFeedback(assignment) {
|
|
89
|
+
assignment.expand = true;
|
|
90
|
+
}
|
|
91
|
+
downloadFile(assignment) {
|
|
92
|
+
assignment.downloading = true;
|
|
93
|
+
assignment.enableDownload = true;
|
|
94
|
+
this.selectedAssignment = assignment;
|
|
95
|
+
this.downloadFileWithFetch(assignment);
|
|
96
|
+
}
|
|
97
|
+
downloadFileDirectly(assignment) {
|
|
98
|
+
if (assignment.additionalProperties.assignmentUrl) {
|
|
99
|
+
window.open(assignment.additionalProperties.assignmentUrl, '_blank');
|
|
100
|
+
assignment.downloading = false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async downloadFileWithFetch(assignment) {
|
|
104
|
+
if (!assignment.additionalProperties.assignmentUrl)
|
|
105
|
+
return;
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(assignment.additionalProperties.assignmentUrl);
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error('Network response was not ok');
|
|
110
|
+
}
|
|
111
|
+
const blob = await response.blob();
|
|
112
|
+
const url = window.URL.createObjectURL(blob);
|
|
113
|
+
const link = document.createElement('a');
|
|
114
|
+
link.href = url;
|
|
115
|
+
link.download = this.extractFilenameFromUrl(assignment.additionalProperties.assignmentUrl) || `${assignment.title}.pdf`;
|
|
116
|
+
document.body.appendChild(link);
|
|
117
|
+
link.click();
|
|
118
|
+
document.body.removeChild(link);
|
|
119
|
+
window.URL.revokeObjectURL(url);
|
|
120
|
+
assignment.downloading = false;
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('Download failed:', error);
|
|
124
|
+
this.downloadFileDirectly(assignment);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
triggerFileUpload(assignment) {
|
|
128
|
+
this.selectedAssignment = assignment;
|
|
129
|
+
if (assignment.answerURL) {
|
|
130
|
+
this.submitAssignment(assignment);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const fileInput = document.getElementById('sResourceFile');
|
|
134
|
+
if (fileInput) {
|
|
135
|
+
fileInput.click();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
submitAssignment(assessment) {
|
|
140
|
+
console.log('Submit assignment clicked', assessment);
|
|
141
|
+
const dialgoData = {
|
|
142
|
+
description: 'You have already uploaded an assignment. Choose an option below to either keep your current submission or upload a new file.',
|
|
143
|
+
type: 'warning',
|
|
144
|
+
buttonsPositionClass: 'justify-center items-center',
|
|
145
|
+
buttons: [
|
|
146
|
+
{
|
|
147
|
+
classes: 'btn-out-line',
|
|
148
|
+
text: 'Re-upload',
|
|
149
|
+
response: 0
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
classes: 'succes-button',
|
|
153
|
+
text: 'Keep Submission',
|
|
154
|
+
response: 1
|
|
155
|
+
}
|
|
156
|
+
]
|
|
157
|
+
};
|
|
158
|
+
const dialogRef = this.dialogLegacy.open(ConfirmationDialogComponent, {
|
|
159
|
+
data: dialgoData,
|
|
160
|
+
disableClose: false,
|
|
161
|
+
width: '400px',
|
|
162
|
+
maxWidth: '90vw'
|
|
163
|
+
});
|
|
164
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
165
|
+
if (result === 1) {
|
|
166
|
+
//this.viewAssignments(assessment.answerURL)
|
|
167
|
+
this.previewAssignments(assessment.answerURL);
|
|
168
|
+
}
|
|
169
|
+
else if (result === 0) {
|
|
170
|
+
const fileInput = document.getElementById('sResourceFile');
|
|
171
|
+
if (fileInput) {
|
|
172
|
+
fileInput.click();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
fileInputEmit(fileInput) {
|
|
178
|
+
if (!fileInput || fileInput.length === 0) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const file = fileInput[0];
|
|
182
|
+
if (this.checkFileType(file)) {
|
|
183
|
+
this.upload(file);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
async upload(file) {
|
|
187
|
+
this.resourceFileAdded = file;
|
|
188
|
+
this.isLoading = true;
|
|
189
|
+
try {
|
|
190
|
+
const uploadRes = await this.tocSvc.uploadAssignmentAnswer(this.content.identifier, this.batchId, this.selectedAssignment.formId, file).toPromise();
|
|
191
|
+
if (uploadRes && uploadRes.responseCode === 'OK') {
|
|
192
|
+
this.openSnackbar('File uploaded successfully');
|
|
193
|
+
this.previewAssignments(uploadRes.result.url);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
this.isLoading = false;
|
|
197
|
+
this.openSnackbar('File upload failed. Please try again.');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.isLoading = false;
|
|
202
|
+
console.error('Upload API error:', error);
|
|
203
|
+
this.openSnackbar('File upload failed. Please try again.');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
previewAssignments(result) {
|
|
207
|
+
this.isLoading = false;
|
|
208
|
+
this.callingViewAssignments(result);
|
|
209
|
+
}
|
|
210
|
+
callingViewAssignments(url) {
|
|
211
|
+
const dialogRef = this.dialog.open(AssignmentViewerV2Component, {
|
|
212
|
+
width: '40%',
|
|
213
|
+
disableClose: true,
|
|
214
|
+
panelClass: 'dialog_sidenav',
|
|
215
|
+
data: {
|
|
216
|
+
assessment: this.selectedAssignment,
|
|
217
|
+
url: url,
|
|
218
|
+
contentId: this.content.identifier,
|
|
219
|
+
batchId: this.batchId,
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
dialogRef.afterClosed().subscribe(result => {
|
|
223
|
+
setTimeout(() => {
|
|
224
|
+
this.fetchAssignments();
|
|
225
|
+
}, 1000);
|
|
226
|
+
console.log(result);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
checkFileType(file) {
|
|
230
|
+
let flag = false;
|
|
231
|
+
if (file && file.size) {
|
|
232
|
+
const fileInMB = Math.floor(file.size / (1024 * 1024));
|
|
233
|
+
if (fileInMB > 5) {
|
|
234
|
+
this.openSnackbar('File size exceeds 5 MB limit. Please upload a smaller file.');
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (file && this.allowType && this.allowType.length > 0) {
|
|
239
|
+
this.allowType.forEach((ele) => {
|
|
240
|
+
if (file.name.toLowerCase().endsWith(ele)) {
|
|
241
|
+
flag = true;
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
if (!flag) {
|
|
246
|
+
this.openSnackbar('Invalid file type uploaded. Please upload supporting format only.');
|
|
247
|
+
}
|
|
248
|
+
this.fileExtention = file.name.toLowerCase().substring(file.name.lastIndexOf('.'));
|
|
249
|
+
if (file) {
|
|
250
|
+
if (['.pdf'].includes(this.fileExtention)) {
|
|
251
|
+
flag = true;
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
flag = false;
|
|
255
|
+
}
|
|
256
|
+
if (!flag) {
|
|
257
|
+
this.openSnackbar('Invalid file type uploaded. Please upload PDF format only.');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return flag;
|
|
261
|
+
}
|
|
262
|
+
getMarks(submissionMeta) {
|
|
263
|
+
if (submissionMeta?.marksGiven != null && submissionMeta?.maximumMarks != null) {
|
|
264
|
+
return `${submissionMeta.marksGiven}` + '/' + `${submissionMeta.maximumMarks}`;
|
|
265
|
+
}
|
|
266
|
+
else if (submissionMeta?.marksGiven != null) {
|
|
267
|
+
return `${submissionMeta.marksGiven}`;
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
return 'N/A';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
openSnackbar(primaryMsg, duration = 5000) {
|
|
274
|
+
this.snackBar.open(primaryMsg, 'X', {
|
|
275
|
+
duration,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
extractFilenameFromUrl(url) {
|
|
279
|
+
try {
|
|
280
|
+
const urlParts = url.split('/');
|
|
281
|
+
const filename = urlParts[urlParts.length - 1];
|
|
282
|
+
return filename.includes('.') ? filename : '';
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
return '';
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, deps: [{ token: i1.Router }, { token: i2.MatLegacySnackBar }, { token: i3.AppTocService }, { token: i4.ConfigurationsService }, { token: i5.MatDialog }, { token: i6.MatLegacyDialog }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
289
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocBatchAssignmentsComponent, selector: "ws-widget-app-batch-assignments", inputs: { content: "content" }, ngImport: i0, template: "<div class=\"guide-container\">\r\n <div class=\"flex flex row\">\r\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\r\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\r\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\r\n <div class=\"guide-card\">\r\n <div class=\"content flex gap-4 justify-between flex-middle\">\r\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\r\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\r\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\r\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\r\n </span>\r\n <span *ngIf=\"!assignment.downloading\">\r\n {{ 'userAssignments.download' | translate }}\r\n </span>\r\n </button>\r\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\"\r\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\r\n Upload\r\n </button> -->\r\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\r\n (change)=\"fileInputEmit(resourceFile.files)\">\r\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\r\n }}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\r\n </ng-container>\r\n\r\n </div>\r\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\r\n (click)=\"assignment.expand = !assignment.expand\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\r\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\r\n <div class=\"font-bold font-style\">\r\n <div>\r\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\r\n </div>\r\n </div>\r\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\r\n <div class=\"font-style\">\r\n {{assignment?.submissionMeta?.instructorFeedback}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\r\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\r\n</div>\r\n\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\r\n {{ 'userAssignments.noAssignments' | translate }}\r\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }] }); }
|
|
290
|
+
}
|
|
291
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocBatchAssignmentsComponent, decorators: [{
|
|
292
|
+
type: Component,
|
|
293
|
+
args: [{ selector: 'ws-widget-app-batch-assignments', template: "<div class=\"guide-container\">\r\n <div class=\"flex flex row\">\r\n <div class=\"info-banner info-banner-warning flex flex-row itm-center\">\r\n <mat-icon class=\"info-icon margin-right-s assignment-note-icon\">info</mat-icon>\r\n <span class=\"assignment-note\"> {{ 'userAssignments.note' | translate }}</span>\r\n </div>\r\n </div>\r\n <ng-container *ngFor=\"let assignment of assignments; index as i\">\r\n <div class=\"guide-card\">\r\n <div class=\"content flex gap-4 justify-between flex-middle\">\r\n <div class=\"note-title\">{{i + 1}}. {{assignment.title}} </div>\r\n <div class=\"flex flex-middle gap-3\" *ngIf=\"!assignment.expand\">\r\n <button mat-button class=\"download-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"downloadFile(assignment)\" [disabled]=\"assignment.downloading\">\r\n <span *ngIf=\"assignment.downloading\" class=\"white-spinner\">\r\n <mat-spinner diameter=\"16\" class=\"mr-2\" [style.color]=\"'white'\" strokeWidth=\"2\"></mat-spinner>Download\r\n </span>\r\n <span *ngIf=\"!assignment.downloading\">\r\n {{ 'userAssignments.download' | translate }}\r\n </span>\r\n </button>\r\n <ng-container *ngIf=\"assignment.status === 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status !== 'DRAFT'\">\r\n <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\"\r\n [disabled]=\"assignment.status === 'SUBMITTED' || assignment.status === 'EVALUATED' || !assignment.enableDownload\">\r\n {{ 'userAssignments.upload' | translate }}\r\n </button>\r\n </ng-container>\r\n <!-- <button mat-button class=\"upload-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"triggerFileUpload(assignment)\" [disabled]=\"!assignment.enableDownload\">\r\n Upload\r\n </button> -->\r\n <input #resourceFile type=\"file\" name=\"sResourceFile\" id=\"sResourceFile\" class=\"hidden\"\r\n (change)=\"fileInputEmit(resourceFile.files)\">\r\n <ng-container *ngIf=\"assignment.status === 'SUBMITTED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\" [disabled]=\"true\">{{ 'userAssignments.viewFeedback' | translate\r\n }}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"assignment.status === 'EVALUATED'\">\r\n <button mat-button class=\"view-btn cursor-pointer flex align-center justify-center\"\r\n (click)=\"handleViewFeedback(assignment)\">{{ 'userAssignments.viewFeedback' | translate }}</button>\r\n </ng-container>\r\n\r\n </div>\r\n <mat-icon class=\"cursor-pointer c-icon\" *ngIf=\"assignment.expand\"\r\n (click)=\"assignment.expand = !assignment.expand\">\r\n close\r\n </mat-icon>\r\n </div>\r\n <div class=\"flex justify-between flex-col mt-4 feedback-container\"\r\n *ngIf=\"assignment.expand && assignment?.submissionMeta?.marksGiven\">\r\n <div class=\"font-bold font-style\">\r\n <div>\r\n {{ 'userAssignments.marksObtained' | translate }} - {{getMarks(assignment?.submissionMeta)}}\r\n </div>\r\n </div>\r\n <div class=\"font-bold font-style\">{{ 'userAssignments.instructorFeedback' | translate }}</div>\r\n <div class=\"font-style\">\r\n {{assignment?.submissionMeta?.instructorFeedback}}\r\n </div>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n</div>\r\n<div class=\"flex justify-center items-center mt-4 loader\" *ngIf=\"isLoading\">\r\n <mat-spinner strokeWidth=\"3\" [diameter]=\"50\" [style.stroke]=\"'#1B4CA1'\" class=\"blue-spinner\"></mat-spinner>\r\n</div>\r\n\r\n\r\n<!-- No teachers resources message -->\r\n<div *ngIf=\"assignments?.length === 0\" class=\"no-resources-message mt-4\">\r\n {{ 'userAssignments.noAssignments' | translate }}\r\n</div>", styles: [".download-btn,.view-btn{background-color:#1b4ca1;border-radius:16px;padding:6px 16px;color:#fff;font-size:14px;font-weight:600;border:none!important;font-family:Lato}.view-btn:disabled{cursor:not-allowed;opacity:.6}.c-icon{color:#1b4ca1!important;font-size:14px;height:14px;width:14px;font-weight:600;border:1px solid #1B4CA1;border-radius:11px;padding:2px}.upload-btn{background-color:#fff;border:1px solid #1B4CA1!important;border-radius:16px;padding:6px 16px;color:#1b4ca1;font-weight:600;font-size:14px;font-family:Lato}.font-style{font-size:14px;font-family:Lato}.note-title{font-family:Lato;font-weight:500;font-style:Medium;font-size:16px;line-height:100%;letter-spacing:0%}.guide-card{border-radius:8px;background-color:#fff;padding:16px;margin:16px 0}.download-btn,.download-link{cursor:pointer;transition:opacity .2s ease}.download-btn:disabled,.download-link:disabled{opacity:.6;cursor:not-allowed}.upload-btn:disabled{cursor:not-allowed;border:1px solid #858181!important;color:#858181}mat-spinner{display:inline-block;vertical-align:middle;margin-right:8px}.download-btn .white-spinner ::ng-deep .mat-progress-spinner circle,.download-btn .white-spinner ::ng-deep .mat-spinner circle{stroke:#fff!important}.loader{position:absolute;top:50%;left:50%}.loader .blue-spinner{transform:translate(-50%,-50%);z-index:1000}.loader .blue-spinner ::ng-deep .mat-progress-spinner circle,.loader .blue-spinner ::ng-deep .mat-spinner circle{stroke:#1b4ca1!important}.feedback-container{background:#f4f8ff;padding:15px;border-radius:10px}.assignment-note{font-family:Lato;color:#1b4ca1}.assignment-note-icon{font-size:22px!important;width:22px!important;height:22px!important;color:#f0aa6b!important}\n"] }]
|
|
294
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.MatLegacySnackBar }, { type: i3.AppTocService }, { type: i4.ConfigurationsService }, { type: i5.MatDialog }, { type: i6.MatLegacyDialog }, { type: i1.ActivatedRoute }]; }, propDecorators: { content: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}] } });
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzL2FwcC10b2MtYmF0Y2gtYXNzaWdubWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1iYXRjaC1hc3NpZ25tZW50cy9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFBO0FBTXhELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBRXJFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFBOzs7Ozs7Ozs7Ozs7QUFRbEgsTUFBTSxPQUFPLCtCQUErQjtJQWExQyxZQUFtQixNQUFjLEVBQ3ZCLFFBQTJCLEVBQzVCLE1BQXFCLEVBQ3JCLFNBQWdDLEVBQy9CLE1BQWlCLEVBQ2pCLFlBQTZCLEVBQzdCLEtBQXFCO1FBTlosV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFtQjtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLFVBQUssR0FB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WUFDRixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQy9CLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQzlDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7U0FDOUM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7SUFDSCxDQUFDOytHQXhTVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1R0NqQjVDLDI1SUFnRk07OzRGRC9ETywrQkFBK0I7a0JBTjNDLFNBQVM7K0JBQ0UsaUNBQWlDO2dSQU9sQyxPQUFPO3NCQUFmLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnXHJcbmltcG9ydCB7IE1hdExlZ2FjeVNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LXNuYWNrLWJhcidcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXHJcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXHJcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xyXG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50IH0gZnJvbSAnLi4vYXBwLXRvYy1hc3NpZ25tZW50LXZpZXdlclYyL2FwcC10b2MtYXNzaWdubWVudC12aWV3ZXJWMi5jb21wb25lbnQnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtYmF0Y2gtYXNzaWdubWVudHMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWJhdGNoLWFzc2lnbm1lbnRzLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQXBwVG9jQmF0Y2hBc3NpZ25tZW50c0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIGNvbnRlbnQ6IGFueVxyXG4gIGFzc2lnbm1lbnRzOiBhbnlbXSA9IFtdXHJcbiAgYWxsb3dUeXBlOiBzdHJpbmdbXSA9IFsnLnBkZiddXHJcbiAgZmlsZUV4dGVudGlvbjogYW55XHJcbiAgcmVzb3VyY2VGaWxlQWRkZWQ6IGFueVxyXG4gIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlXHJcbiAgc2VsZWN0ZWRBc3NpZ25tZW50OiBhbnlcclxuICBiYXRjaElkOiBhbnlcclxuICBzdWJtaXNzaW9uczogYW55W10gPSBbXVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0TGVnYWN5U25hY2tCYXIsXHJcbiAgICBwdWJsaWMgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxyXG4gICAgcHVibGljIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgZGlhbG9nTGVnYWN5OiBNYXRMZWdhY3lEaWFsb2csXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICApIHtcclxuICAgIHRoaXMuYmF0Y2hJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA/XHJcbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZmV0Y2hBc3NpZ25tZW50cygpXHJcbiAgfVxyXG5cclxuICBnZXRVc2VyQXNzaWdubWVudFN0YXR1cygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQpIHtcclxuICAgICAgY29uc3QgcmVxdWVzdCA9IHtcclxuICAgICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxyXG4gICAgICAgICAgc3VibWl0dGVkQnk6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRvY1N2Yy5nZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3VibWlzc2lvbnMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXHJcbiAgICAgICAgY29uc29sZS5sb2coJ3N1Ym1pc3Npb25zJywgdGhpcy5zdWJtaXNzaW9ucylcclxuICAgICAgICB0aGlzLnByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKVxyXG4gICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYXNzaWdubWVudCBzdGF0dXMnLCBlcnJvcilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb2Nlc3NBc3NpZ25tZW50c1dpdGhTdGF0dXMoKSB7XHJcbiAgICB0aGlzLmFzc2lnbm1lbnRzID0gdGhpcy5hc3NpZ25tZW50cy5tYXAoKGFzc2lnbm1lbnQ6IGFueSkgPT4gKHtcclxuICAgICAgLi4uYXNzaWdubWVudCxcclxuICAgICAgZXhwYW5kOiBmYWxzZSxcclxuICAgICAgZG93bmxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICBlbmFibGVEb3dubG9hZDogZmFsc2UsXHJcbiAgICAgIGFuc3dlclVSTDogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN1Ym1pdFVybCB8fCAnJyxcclxuICAgICAgc3RhdHVzOiB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3RhdHVzIHx8ICdQRU5ESU5HJyxcclxuICAgICAgZW5hYmxlVmlldzogdGhpcy5zdWJtaXNzaW9ucy5maW5kKHN1YiA9PiBzdWIuZm9ybUlkID09PSBhc3NpZ25tZW50LmZvcm1JZCk/LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCcsXHJcbiAgICAgIHN1Ym1pc3Npb25NZXRhOiB0aGlzLnN1Ym1pc3Npb25zLmZpbmQoc3ViID0+IHN1Yi5mb3JtSWQgPT09IGFzc2lnbm1lbnQuZm9ybUlkKT8uc3RhdHVzID09PSAnRVZBTFVBVEVEJyA/IHRoaXMuc3VibWlzc2lvbnMuZmluZChzdWIgPT4gc3ViLmZvcm1JZCA9PT0gYXNzaWdubWVudC5mb3JtSWQpPy5zdWJtaXNzaW9uTWV0YSA6IHt9XHJcbiAgICB9KSlcclxuICB9XHJcbiAgZmV0Y2hBc3NpZ25tZW50cygpIHtcclxuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgcXVlcnk6ICcnLFxyXG4gICAgICBmaWx0ZXJzOiB7XHJcbiAgICAgICAgXCJhZGRpdGlvbmFsUHJvcGVydGllcy5iYXRjaElkXCI6IHRoaXMuYmF0Y2hJZCxcclxuICAgICAgfSxcclxuICAgIH1cclxuICAgIHRoaXMudG9jU3ZjLnNlYXJjaEFzc2lnbm1lbnRzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgYXNzaWdubWVudHMgPSBfLmdldChyZXNwb25zZSwgJ3Jlc3VsdC5yZXNwb25zZS5jb250ZW50JywgW10pXHJcbiAgICAgIHRoaXMuYXNzaWdubWVudHMgPSBhc3NpZ25tZW50cy5tYXAoKGFzc2lnbm1lbnQ6IGFueSkgPT4gKHtcclxuICAgICAgICAuLi5hc3NpZ25tZW50LFxyXG4gICAgICAgIGV4cGFuZDogZmFsc2UsXHJcbiAgICAgICAgZG93bmxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZVZpZXc6IGZhbHNlLFxyXG4gICAgICAgIGVuYWJsZURvd25sb2FkOiBmYWxzZSxcclxuICAgICAgICBhbnN3ZXJVUkw6ICcnLFxyXG4gICAgICAgIHN0YXR1czogJycsXHJcbiAgICAgICAgc3VibWlzc2lvbk1ldGE6IHt9XHJcbiAgICAgIH0pKVxyXG4gICAgICB0aGlzLmdldFVzZXJBc3NpZ25tZW50U3RhdHVzKClcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgYXNzaWdubWVudHMnLCBlcnJvcilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudDogYW55KSB7XHJcbiAgICBhc3NpZ25tZW50LmV4cGFuZCA9IHRydWVcclxuICB9XHJcblxyXG4gIGRvd25sb2FkRmlsZShhc3NpZ25tZW50OiBhbnkpIHtcclxuICAgIGFzc2lnbm1lbnQuZG93bmxvYWRpbmcgPSB0cnVlXHJcbiAgICBhc3NpZ25tZW50LmVuYWJsZURvd25sb2FkID0gdHJ1ZVxyXG4gICAgdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQgPSBhc3NpZ25tZW50XHJcbiAgICB0aGlzLmRvd25sb2FkRmlsZVdpdGhGZXRjaChhc3NpZ25tZW50KVxyXG4gIH1cclxuXHJcbiAgZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudDogYW55KSB7XHJcbiAgICBpZiAoYXNzaWdubWVudC5hZGRpdGlvbmFsUHJvcGVydGllcy5hc3NpZ25tZW50VXJsKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCwgJ19ibGFuaycpXHJcbiAgICAgIGFzc2lnbm1lbnQuZG93bmxvYWRpbmcgPSBmYWxzZVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZG93bmxvYWRGaWxlV2l0aEZldGNoKGFzc2lnbm1lbnQ6IGFueSkge1xyXG4gICAgaWYgKCFhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpIHJldHVyblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChhc3NpZ25tZW50LmFkZGl0aW9uYWxQcm9wZXJ0aWVzLmFzc2lnbm1lbnRVcmwpXHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05ldHdvcmsgcmVzcG9uc2Ugd2FzIG5vdCBvaycpXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKVxyXG4gICAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKVxyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXHJcbiAgICAgIGxpbmsuaHJlZiA9IHVybFxyXG4gICAgICBsaW5rLmRvd25sb2FkID0gdGhpcy5leHRyYWN0RmlsZW5hbWVGcm9tVXJsKGFzc2lnbm1lbnQuYWRkaXRpb25hbFByb3BlcnRpZXMuYXNzaWdubWVudFVybCkgfHwgYCR7YXNzaWdubWVudC50aXRsZX0ucGRmYFxyXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspXHJcbiAgICAgIGxpbmsuY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspXHJcbiAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybClcclxuICAgICAgYXNzaWdubWVudC5kb3dubG9hZGluZyA9IGZhbHNlXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdEb3dubG9hZCBmYWlsZWQ6JywgZXJyb3IpXHJcbiAgICAgIHRoaXMuZG93bmxvYWRGaWxlRGlyZWN0bHkoYXNzaWdubWVudClcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICB0cmlnZ2VyRmlsZVVwbG9hZChhc3NpZ25tZW50OiBhbnkpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50ID0gYXNzaWdubWVudFxyXG4gICAgaWYgKGFzc2lnbm1lbnQuYW5zd2VyVVJMKSB7XHJcbiAgICAgIHRoaXMuc3VibWl0QXNzaWdubWVudChhc3NpZ25tZW50KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NSZXNvdXJjZUZpbGUnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICBpZiAoZmlsZUlucHV0KSB7XHJcbiAgICAgICAgZmlsZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzdWJtaXRBc3NpZ25tZW50KGFzc2Vzc21lbnQ6IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coJ1N1Ym1pdCBhc3NpZ25tZW50IGNsaWNrZWQnLCBhc3Nlc3NtZW50KVxyXG4gICAgY29uc3QgZGlhbGdvRGF0YSA9IHtcclxuICAgICAgZGVzY3JpcHRpb246ICdZb3UgaGF2ZSBhbHJlYWR5IHVwbG9hZGVkIGFuIGFzc2lnbm1lbnQuIENob29zZSBhbiBvcHRpb24gYmVsb3cgdG8gZWl0aGVyIGtlZXAgeW91ciBjdXJyZW50IHN1Ym1pc3Npb24gb3IgdXBsb2FkIGEgbmV3IGZpbGUuJyxcclxuICAgICAgdHlwZTogJ3dhcm5pbmcnLFxyXG4gICAgICBidXR0b25zUG9zaXRpb25DbGFzczogJ2p1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlcicsXHJcbiAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjbGFzc2VzOiAnYnRuLW91dC1saW5lJyxcclxuICAgICAgICAgIHRleHQ6ICdSZS11cGxvYWQnLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IDBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNsYXNzZXM6ICdzdWNjZXMtYnV0dG9uJyxcclxuICAgICAgICAgIHRleHQ6ICdLZWVwIFN1Ym1pc3Npb24nLFxyXG4gICAgICAgICAgcmVzcG9uc2U6IDFcclxuICAgICAgICB9XHJcbiAgICAgIF1cclxuICAgIH1cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nTGVnYWN5Lm9wZW4oQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IGRpYWxnb0RhdGEsXHJcbiAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAnNDAwcHgnLFxyXG4gICAgICBtYXhXaWR0aDogJzkwdncnXHJcbiAgICB9KVxyXG5cclxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCA9PT0gMSkge1xyXG4gICAgICAgIC8vdGhpcy52aWV3QXNzaWdubWVudHMoYXNzZXNzbWVudC5hbnN3ZXJVUkwpXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHMoYXNzZXNzbWVudC5hbnN3ZXJVUkwpXHJcbiAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSAwKSB7XHJcbiAgICAgICAgY29uc3QgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NSZXNvdXJjZUZpbGUnKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgICAgIGlmIChmaWxlSW5wdXQpIHtcclxuICAgICAgICAgIGZpbGVJbnB1dC5jbGljaygpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZmlsZUlucHV0RW1pdChmaWxlSW5wdXQ6IEZpbGVMaXN0IHwgbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKCFmaWxlSW5wdXQgfHwgZmlsZUlucHV0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnN0IGZpbGUgPSBmaWxlSW5wdXRbMF1cclxuICAgIGlmICh0aGlzLmNoZWNrRmlsZVR5cGUoZmlsZSkpIHtcclxuICAgICAgdGhpcy51cGxvYWQoZmlsZSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHVwbG9hZChmaWxlOiBhbnkpIHtcclxuICAgIHRoaXMucmVzb3VyY2VGaWxlQWRkZWQgPSBmaWxlXHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cGxvYWRSZXM6IGFueSA9IGF3YWl0IHRoaXMudG9jU3ZjLnVwbG9hZEFzc2lnbm1lbnRBbnN3ZXIoXHJcbiAgICAgICAgdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXHJcbiAgICAgICAgdGhpcy5iYXRjaElkLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRBc3NpZ25tZW50LmZvcm1JZCxcclxuICAgICAgICBmaWxlXHJcbiAgICAgICkudG9Qcm9taXNlKClcclxuXHJcbiAgICAgIGlmICh1cGxvYWRSZXMgJiYgdXBsb2FkUmVzLnJlc3BvbnNlQ29kZSA9PT0gJ09LJykge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseScpXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3QXNzaWdubWVudHModXBsb2FkUmVzLnJlc3VsdC51cmwpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBBUEkgZXJyb3I6JywgZXJyb3IpXHJcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHVwbG9hZCBmYWlsZWQuIFBsZWFzZSB0cnkgYWdhaW4uJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByZXZpZXdBc3NpZ25tZW50cyhyZXN1bHQ6IGFueSkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5jYWxsaW5nVmlld0Fzc2lnbm1lbnRzKHJlc3VsdClcclxuICB9XHJcblxyXG4gIGNhbGxpbmdWaWV3QXNzaWdubWVudHModXJsOiBhbnkpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQXNzaWdubWVudFZpZXdlclYyQ29tcG9uZW50LCB7XHJcbiAgICAgIHdpZHRoOiAnNDAlJyxcclxuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxyXG4gICAgICBwYW5lbENsYXNzOiAnZGlhbG9nX3NpZGVuYXYnLFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgYXNzZXNzbWVudDogdGhpcy5zZWxlY3RlZEFzc2lnbm1lbnQsXHJcbiAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgY29udGVudElkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcclxuICAgICAgICBiYXRjaElkOiB0aGlzLmJhdGNoSWQsXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5mZXRjaEFzc2lnbm1lbnRzKClcclxuICAgICAgfSwgMTAwMClcclxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICBjaGVja0ZpbGVUeXBlKGZpbGU6IEZpbGUpIHtcclxuICAgIGxldCBmbGFnID0gZmFsc2VcclxuICAgIGlmIChmaWxlICYmIGZpbGUuc2l6ZSkge1xyXG4gICAgICBjb25zdCBmaWxlSW5NQiA9IE1hdGguZmxvb3IoZmlsZS5zaXplIC8gKDEwMjQgKiAxMDI0KSlcclxuICAgICAgaWYgKGZpbGVJbk1CID4gNSkge1xyXG4gICAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdGaWxlIHNpemUgZXhjZWVkcyA1IE1CIGxpbWl0LiBQbGVhc2UgdXBsb2FkIGEgc21hbGxlciBmaWxlLicpXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChmaWxlICYmIHRoaXMuYWxsb3dUeXBlICYmIHRoaXMuYWxsb3dUeXBlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5hbGxvd1R5cGUuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoZWxlKSkge1xyXG4gICAgICAgICAgZmxhZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0ludmFsaWQgZmlsZSB0eXBlIHVwbG9hZGVkLiBQbGVhc2UgdXBsb2FkIHN1cHBvcnRpbmcgZm9ybWF0IG9ubHkuJylcclxuICAgIH1cclxuICAgIHRoaXMuZmlsZUV4dGVudGlvbiA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZyhmaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSlcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIGlmIChbJy5wZGYnXS5pbmNsdWRlcyh0aGlzLmZpbGVFeHRlbnRpb24pKSB7XHJcbiAgICAgICAgZmxhZyA9IHRydWVcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmbGFnID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWZsYWcpIHtcclxuICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignSW52YWxpZCBmaWxlIHR5cGUgdXBsb2FkZWQuIFBsZWFzZSB1cGxvYWQgUERGIGZvcm1hdCBvbmx5LicpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmbGFnXHJcbiAgfVxyXG5cclxuICBnZXRNYXJrcyhzdWJtaXNzaW9uTWV0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmIChzdWJtaXNzaW9uTWV0YT8ubWFya3NHaXZlbiAhPSBudWxsICYmIHN1Ym1pc3Npb25NZXRhPy5tYXhpbXVtTWFya3MgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gICsgJy8nICsgYCR7c3VibWlzc2lvbk1ldGEubWF4aW11bU1hcmtzfWBcclxuICAgIH0gZWxzZSBpZiAoc3VibWlzc2lvbk1ldGE/Lm1hcmtzR2l2ZW4gIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gYCR7c3VibWlzc2lvbk1ldGEubWFya3NHaXZlbn1gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ04vQSdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5TbmFja2JhcihwcmltYXJ5TXNnOiBzdHJpbmcsIGR1cmF0aW9uOiBudW1iZXIgPSA1MDAwKSB7XHJcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XHJcbiAgICAgIGR1cmF0aW9uLFxyXG4gICAgfSlcclxuICB9XHJcbiAgZXh0cmFjdEZpbGVuYW1lRnJvbVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdCgnLycpXHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdXJsUGFydHNbdXJsUGFydHMubGVuZ3RoIC0gMV1cclxuICAgICAgcmV0dXJuIGZpbGVuYW1lLmluY2x1ZGVzKCcuJykgPyBmaWxlbmFtZSA6ICcnXHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImd1aWRlLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXggcm93XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5mby1iYW5uZXIgaW5mby1iYW5uZXItd2FybmluZyBmbGV4IGZsZXgtcm93IGl0bS1jZW50ZXJcIj5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaW5mby1pY29uIG1hcmdpbi1yaWdodC1zIGFzc2lnbm1lbnQtbm90ZS1pY29uXCI+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiYXNzaWdubWVudC1ub3RlXCI+IHt7ICd1c2VyQXNzaWdubWVudHMubm90ZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhc3NpZ25tZW50IG9mIGFzc2lnbm1lbnRzOyBpbmRleCBhcyBpXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZ3VpZGUtY2FyZFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGVudCBmbGV4IGdhcC00IGp1c3RpZnktYmV0d2VlbiBmbGV4LW1pZGRsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJub3RlLXRpdGxlXCI+e3tpICsgMX19LiB7e2Fzc2lnbm1lbnQudGl0bGV9fSA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSBnYXAtM1wiICpuZ0lmPVwiIWFzc2lnbm1lbnQuZXhwYW5kXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJkb3dubG9hZC1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGFzc2lnbm1lbnQpXCIgW2Rpc2FibGVkXT1cImFzc2lnbm1lbnQuZG93bmxvYWRpbmdcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJhc3NpZ25tZW50LmRvd25sb2FkaW5nXCIgY2xhc3M9XCJ3aGl0ZS1zcGlubmVyXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIGRpYW1ldGVyPVwiMTZcIiBjbGFzcz1cIm1yLTJcIiBbc3R5bGUuY29sb3JdPVwiJ3doaXRlJ1wiIHN0cm9rZVdpZHRoPVwiMlwiPjwvbWF0LXNwaW5uZXI+RG93bmxvYWRcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFhc3NpZ25tZW50LmRvd25sb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy5kb3dubG9hZCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdEUkFGVCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCI+XHJcbiAgICAgICAgICAgICAge3sgJ3VzZXJBc3NpZ25tZW50cy51cGxvYWQnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXNzaWdubWVudC5zdGF0dXMgIT09ICdEUkFGVCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidXBsb2FkLWJ0biBjdXJzb3ItcG9pbnRlciBmbGV4IGFsaWduLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCJcclxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYXNzaWdubWVudC5zdGF0dXMgPT09ICdTVUJNSVRURUQnIHx8IGFzc2lnbm1lbnQuc3RhdHVzID09PSAnRVZBTFVBVEVEJyB8fCAhYXNzaWdubWVudC5lbmFibGVEb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgIHt7ICd1c2VyQXNzaWdubWVudHMudXBsb2FkJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPCEtLSA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJ1cGxvYWQtYnRuIGN1cnNvci1wb2ludGVyIGZsZXggYWxpZ24tY2VudGVyIGp1c3RpZnktY2VudGVyXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJGaWxlVXBsb2FkKGFzc2lnbm1lbnQpXCIgW2Rpc2FibGVkXT1cIiFhc3NpZ25tZW50LmVuYWJsZURvd25sb2FkXCI+XHJcbiAgICAgICAgICAgIFVwbG9hZFxyXG4gICAgICAgICAgPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgPGlucHV0ICNyZXNvdXJjZUZpbGUgdHlwZT1cImZpbGVcIiBuYW1lPVwic1Jlc291cmNlRmlsZVwiIGlkPVwic1Jlc291cmNlRmlsZVwiIGNsYXNzPVwiaGlkZGVuXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlSW5wdXRFbWl0KHJlc291cmNlRmlsZS5maWxlcylcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ1NVQk1JVFRFRCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidmlldy1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPnt7ICd1c2VyQXNzaWdubWVudHMudmlld0ZlZWRiYWNrJyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICAgIH19PC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhc3NpZ25tZW50LnN0YXR1cyA9PT0gJ0VWQUxVQVRFRCdcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwidmlldy1idG4gY3Vyc29yLXBvaW50ZXIgZmxleCBhbGlnbi1jZW50ZXIganVzdGlmeS1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVWaWV3RmVlZGJhY2soYXNzaWdubWVudClcIj57eyAndXNlckFzc2lnbm1lbnRzLnZpZXdGZWVkYmFjaycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBjLWljb25cIiAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kXCJcclxuICAgICAgICAgIChjbGljayk9XCJhc3NpZ25tZW50LmV4cGFuZCA9ICFhc3NpZ25tZW50LmV4cGFuZFwiPlxyXG4gICAgICAgICAgY2xvc2VcclxuICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGZsZXgtY29sIG10LTQgZmVlZGJhY2stY29udGFpbmVyXCJcclxuICAgICAgICAqbmdJZj1cImFzc2lnbm1lbnQuZXhwYW5kICYmIGFzc2lnbm1lbnQ/LnN1Ym1pc3Npb25NZXRhPy5tYXJrc0dpdmVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICB7eyAndXNlckFzc2lnbm1lbnRzLm1hcmtzT2J0YWluZWQnIHwgdHJhbnNsYXRlIH19IC0ge3tnZXRNYXJrcyhhc3NpZ25tZW50Py5zdWJtaXNzaW9uTWV0YSl9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZCBmb250LXN0eWxlXCI+e3sgJ3VzZXJBc3NpZ25tZW50cy5pbnN0cnVjdG9yRmVlZGJhY2snIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtc3R5bGVcIj5cclxuICAgICAgICAgIHt7YXNzaWdubWVudD8uc3VibWlzc2lvbk1ldGE/Lmluc3RydWN0b3JGZWVkYmFja319XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIG10LTQgbG9hZGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cclxuICA8bWF0LXNwaW5uZXIgc3Ryb2tlV2lkdGg9XCIzXCIgW2RpYW1ldGVyXT1cIjUwXCIgW3N0eWxlLnN0cm9rZV09XCInIzFCNENBMSdcIiBjbGFzcz1cImJsdWUtc3Bpbm5lclwiPjwvbWF0LXNwaW5uZXI+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjwhLS0gTm8gdGVhY2hlcnMgcmVzb3VyY2VzIG1lc3NhZ2UgLS0+XHJcbjxkaXYgKm5nSWY9XCJhc3NpZ25tZW50cz8ubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJuby1yZXNvdXJjZXMtbWVzc2FnZSBtdC00XCI+XHJcbiAge3sgJ3VzZXJBc3NpZ25tZW50cy5ub0Fzc2lnbm1lbnRzJyB8IHRyYW5zbGF0ZSB9fVxyXG48L2Rpdj4iXX0=
|