@sunbird-cb/toc 0.0.18 → 0.0.20
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/content-toc/app-toc-about/app-toc-about.component.mjs +3 -3
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +4 -4
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +4 -1
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +3 -3
- package/esm2022/lib/_services/widget-content.model.mjs +8 -1
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +62 -29
- package/esm2022/lib/services/app-toc-v2.service.mjs +12 -5
- package/esm2022/lib/services/app-toc.service.mjs +5 -2
- package/esm2022/lib/services/certificate.service.mjs +4 -1
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/sunbird-cb-toc.mjs +97 -41
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +1 -1
- package/lib/_services/widget-content.model.d.ts +6 -0
- package/lib/_services/widget-content.model.d.ts.map +1 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
- package/lib/services/app-toc-v2.service.d.ts.map +1 -1
- package/lib/services/app-toc.service.d.ts.map +1 -1
- package/lib/services/certificate.service.d.ts +1 -0
- package/lib/services/certificate.service.d.ts.map +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +2 -0
- package/public-api.d.ts.map +1 -1
package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs
CHANGED
|
@@ -875,11 +875,11 @@ export class AppTocAboutComponent {
|
|
|
875
875
|
}
|
|
876
876
|
}
|
|
877
877
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, deps: [{ token: i1.RatingService }, { token: i2.LoggerService }, { token: i3.MatLegacyDialog }, { token: i4.MatLegacySnackBar }, { token: i5.LoadCheckService }, { token: i6.TimerService }, { token: i7.AppTocService }, { token: i2.ConfigurationsService }, { token: i8.DiscussUtilsService }, { token: i9.Router }, { token: i10.ReviewComponentDataService }, { token: i11.HandleClaimService }, { token: i12.ResetRatingsService }, { token: i2.WidgetContentService }, { token: i9.ActivatedRoute }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
878
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: { condition: "condition", kparray: "kparray", content: "content", contentReadData: "contentReadData", baseContentReadData: "baseContentReadData", skeletonLoader: "skeletonLoader", sticky: "sticky", tocStructure: "tocStructure", pathSet: "pathSet", config: "config", resumeData: "resumeData", forPreview: "forPreview", showReviews: "showReviews", batchData: "batchData", fromViewer: "fromViewer", selectedBatchData: "selectedBatchData", selectedTabValue: "selectedTabValue", fromMarketPlace: "fromMarketPlace", showMarketPlaceCertificate: "showMarketPlaceCertificate", languageList: "languageList", lockCertificate: "lockCertificate" }, outputs: { trigerCompletionSurveyForm: "trigerCompletionSurveyForm" }, viewQueries: [{ propertyName: "summaryElem", first: true, predicate: ["summaryElem"], descendants: true }, { propertyName: "objectivesElem", first: true, predicate: ["objectivesElem"], descendants: true }, { propertyName: "descElem", first: true, predicate: ["descElem"], descendants: true }, { propertyName: "tagsElem", first: true, predicate: ["tagsElem"], descendants: true }, { propertyName: "searchTagElem", first: true, predicate: ["searchTagElem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n<div class=\"flex flex-col mt-4\" [ngClass]=\"isMobile ? 'mx-4' : ''\"\n *ngIf=\"contentReadData?.retirementDate && contentReadData?.lastEnrollmentDate\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex items-center content-retire-container\">\n <mat-icon class=\"material-icons retire-info-icon\">warning</mat-icon>\n <div class=\"body-1\">This course is scheduled for retirement. The last date to enroll is\n {{contentReadData?.lastEnrollmentDate | date: 'MMMM d, y'}}, and\n the course will be retired on {{contentReadData?.retirementDate | date: 'MMMM d, y'}}.\n </div>\n </div>\n </ng-container>\n</div>\n<div class=\"flex flex-col mt-4 mx-4 block\" *ngIf=\"isMobile && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n</div>\n\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold nodtranslate\">\n {{ 'apptocsinglepage.description' | translate }}\n </div>\n <!-- <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}\n </div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div> -->\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' |\n translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i17.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i18.RatingSummaryComponent, selector: "ws-widget-rating-summary", inputs: ["ratingSummary"] }, { kind: "component", type: i2.HorizontalScrollerV2Component, selector: "ws-utils-horizontal-scroller-v2", inputs: ["loadStatus", "onHover", "sliderConfig", "widgetsLength", "defaultMaxWidgets", "stripConfig", "stripsResultDataMap", "subtype"], outputs: ["loadNext"] }, { kind: "directive", type: i19.SbUiResolverDirective, selector: "[sbUiResolverWidget]", inputs: ["sbUiResolverWidget"] }, { kind: "directive", type: i20.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i21.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i22.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "pipe", type: i13.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.DatePipe, name: "date" }, { kind: "pipe", type: i2.PipeRelativeTimePipe, name: "pipeRelativeTime" }, { kind: "pipe", type: i23.TranslatePipe, name: "translate" }, { kind: "pipe", type: i24.ReplaceNbspPipe, name: "replaceNbsp" }] }); }
|
|
878
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocAboutComponent, selector: "ws-widget-app-toc-about", inputs: { condition: "condition", kparray: "kparray", content: "content", contentReadData: "contentReadData", baseContentReadData: "baseContentReadData", skeletonLoader: "skeletonLoader", sticky: "sticky", tocStructure: "tocStructure", pathSet: "pathSet", config: "config", resumeData: "resumeData", forPreview: "forPreview", showReviews: "showReviews", batchData: "batchData", fromViewer: "fromViewer", selectedBatchData: "selectedBatchData", selectedTabValue: "selectedTabValue", fromMarketPlace: "fromMarketPlace", showMarketPlaceCertificate: "showMarketPlaceCertificate", languageList: "languageList", lockCertificate: "lockCertificate" }, outputs: { trigerCompletionSurveyForm: "trigerCompletionSurveyForm" }, viewQueries: [{ propertyName: "summaryElem", first: true, predicate: ["summaryElem"], descendants: true }, { propertyName: "objectivesElem", first: true, predicate: ["objectivesElem"], descendants: true }, { propertyName: "descElem", first: true, predicate: ["descElem"], descendants: true }, { propertyName: "tagsElem", first: true, predicate: ["tagsElem"], descendants: true }, { propertyName: "searchTagElem", first: true, predicate: ["searchTagElem"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.courseCategory;else primaryCategoryCheck\">\n {{ 'apptocsinglepage.completedOn' | translate }} {{content?.courseCategory}} {{\n 'apptocsinglepage.on' | translate \n }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}\n\n </div>\n <ng-template #primaryCategoryCheck>\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </ng-template>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n<div class=\"flex flex-col mt-4\" [ngClass]=\"isMobile ? 'mx-4' : ''\"\n *ngIf=\"contentReadData?.retirementDate && contentReadData?.lastEnrollmentDate\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex items-center content-retire-container\">\n <mat-icon class=\"material-icons retire-info-icon\">warning</mat-icon>\n <div class=\"body-1\">This course is scheduled for retirement. The last date to enroll is\n {{contentReadData?.lastEnrollmentDate | date: 'MMMM d, y'}}, and\n the course will be retired on {{contentReadData?.retirementDate | date: 'MMMM d, y'}}.\n </div>\n </div>\n </ng-container>\n</div>\n<div class=\"flex flex-col mt-4 mx-4 block\" *ngIf=\"isMobile && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n</div>\n\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold nodtranslate\">\n {{ 'apptocsinglepage.description' | translate }}\n </div>\n <!-- <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}\n </div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div> -->\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' |\n translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i13.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i13.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i13.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i13.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i14.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i15.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i16.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i17.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i18.RatingSummaryComponent, selector: "ws-widget-rating-summary", inputs: ["ratingSummary"] }, { kind: "component", type: i2.HorizontalScrollerV2Component, selector: "ws-utils-horizontal-scroller-v2", inputs: ["loadStatus", "onHover", "sliderConfig", "widgetsLength", "defaultMaxWidgets", "stripConfig", "stripsResultDataMap", "subtype"], outputs: ["loadNext"] }, { kind: "directive", type: i19.SbUiResolverDirective, selector: "[sbUiResolverWidget]", inputs: ["sbUiResolverWidget"] }, { kind: "directive", type: i20.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i21.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i22.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "pipe", type: i13.SlicePipe, name: "slice" }, { kind: "pipe", type: i13.DatePipe, name: "date" }, { kind: "pipe", type: i2.PipeRelativeTimePipe, name: "pipeRelativeTime" }, { kind: "pipe", type: i23.TranslatePipe, name: "translate" }, { kind: "pipe", type: i24.ReplaceNbspPipe, name: "replaceNbsp" }] }); }
|
|
879
879
|
}
|
|
880
880
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocAboutComponent, decorators: [{
|
|
881
881
|
type: Component,
|
|
882
|
-
args: [{ selector: 'ws-widget-app-toc-about', template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n<div class=\"flex flex-col mt-4\" [ngClass]=\"isMobile ? 'mx-4' : ''\"\n *ngIf=\"contentReadData?.retirementDate && contentReadData?.lastEnrollmentDate\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex items-center content-retire-container\">\n <mat-icon class=\"material-icons retire-info-icon\">warning</mat-icon>\n <div class=\"body-1\">This course is scheduled for retirement. The last date to enroll is\n {{contentReadData?.lastEnrollmentDate | date: 'MMMM d, y'}}, and\n the course will be retired on {{contentReadData?.retirementDate | date: 'MMMM d, y'}}.\n </div>\n </div>\n </ng-container>\n</div>\n<div class=\"flex flex-col mt-4 mx-4 block\" *ngIf=\"isMobile && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n</div>\n\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold nodtranslate\">\n {{ 'apptocsinglepage.description' | translate }}\n </div>\n <!-- <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}\n </div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div> -->\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' |\n translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"] }]
|
|
882
|
+
args: [{ selector: 'ws-widget-app-toc-about', template: "<ng-template #certificateCard>\n <ng-container *ngIf=\"!disableCertificate\">\n <ng-container *ngIf=\"!lockCertificate; else certificateLock\">\n <div class=\"certificate-outer-div\">\n <div class=\"certificate-card\">\n <div class=\"flex flex-col certificate-info p-4 gap-3\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'200px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"text-sm font-semibold cursor-pointer truncate-3\">{{ content?.name }}\n </div>\n <!-- <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">{{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div> -->\n <div class=\"text-xs font-light\" *ngIf=\"content?.completedOn\">\n <div *ngIf=\"content?.courseCategory;else primaryCategoryCheck\">\n {{ 'apptocsinglepage.completedOn' | translate }} {{content?.courseCategory}} {{\n 'apptocsinglepage.on' | translate \n }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}\n\n </div>\n <ng-template #primaryCategoryCheck>\n <div *ngIf=\"content?.primaryCategory === 'Standalone Assessment'\">\n {{ 'apptocsinglepage.completedAssessment' | translate }} {{\n content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Program'\">\n {{ 'apptocsinglepage.completedProgram' | translate }} {{\n content?.completedOn ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n\n <div *ngIf=\"content?.primaryCategory === 'Course'\">\n {{ 'apptocsinglepage.completedCourse' | translate }} {{ content?.completedOn\n ?\n (content?.completedOn | date: 'd MMM, y') : 'NA' }}</div>\n </ng-template>\n </div>\n\n </ng-container>\n </div>\n <div class=\"flex justify-center download-section\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'24px'\"\n [height]=\"'24px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container>\n <mat-icon class=\"icon cursor-pointer \" *ngIf=\"!downloadCertificateBool\"\n (click)=\"handleOpenCertificateDialog()\">arrow_downward</mat-icon>\n <mat-spinner *ngIf=\"downloadCertificateBool\" strokeWidth=\"2\"\n [diameter]=\"20\"></mat-spinner>\n </ng-container>\n </div>\n </div>\n <div class=\"flex-1\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [width]=\"'280px'\"\n [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"certificate_box\" *ngIf=\"!content?.certificateObj?.certId\">\n <img *ngIf=\"!fromMarketPlace\" src=\"/assets/icons/toc/no-certificate.svg\"\n alt=\"No certificate image\" />\n <img *ngIf=\"fromMarketPlace\" src=\"/assets/icons/toc/no-certificate-market-place.svg\"\n alt=\"No certificate image\" />\n <div class=\"flex items-center certificate_overlay\">\n <div class=\"flex flex-col text-center gap-1 p-4 text-white mt-4\">\n <div>{{'apptochome.certificationTakesTime' | translate }}</div>\n <!-- <div>{{'apptochome.issuePersistsMailus' | translate }} mission.karmayogi@gov.in -->\n <div>{{'apptochome.issuePersistsMailus' | translate }} <a\n href=\"mailto:mission.karmayogi@gov.in\" class=\"emailDefault\">\n mission.karmayogi@gov.in</a>\n </div>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"content?.certificateObj?.certId\">\n <div class=\"img-container\">\n <img class=\"celebration-animation\"\n src=\"assets/images/animation/leaderboard_animation.gif\" />\n <img *ngIf=\"!fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate.svg'\" alt=\"certificate image\" />\n <img *ngIf=\"fromMarketPlace\" class=\"ceritificate-image\"\n [src]=\"'/assets/icons/toc/no-certificate-market-place.svg'\"\n alt=\"certificate image\" />\n\n <div\n [ngClass]=\"{'view-certificate': downloadCertificateBool, 'view-cert': !downloadCertificateBool}\">\n <button type=\"button\" (click)=\"handleOpenCertificateDialog()\">\n <span *ngIf=\"!downloadCertificateBool\">{{\n 'apptoccontentcard.viewCertificate' | translate }}</span>\n <div *ngIf=\"downloadCertificateBool\" class=\"uploader-status\">\n <mat-spinner></mat-spinner>\n </div>\n </button>\n </div>\n </div>\n </ng-container>\n <!-- <ng-container *ngIf=\"content?.certificateObj?.certData\">\n <img class=\"celebration-animation\" src=\"assets/images/animation/leaderboard_animation.gif\"/>\n <img class=\"ceritificate-image\"\n [src]=\"content?.certificateObj?.certData | pipeSafeSanitizer: 'url'\"\n alt=\"certificate image\" />\n </ng-container> -->\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-3 chips-card\">\n <ng-container *ngFor=\"let subTheme of contentReadData?.subTheme; let j = index\">\n <div class=\"chip rounded-full p-2 text-xs\"\n [ngClass]=\"{'hidden': (j > 1 && !content?.viewMore), 'chip-ellipsis': !content?.viewMore && content?.subTheme?.length > 1 }\"\n [title]=\"subTheme\">{{ subTheme }}</div>\n </ng-container>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.subTheme?.length > 2 && !content?.viewMore\"\n (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewMore' | translate}}\n </div>\n <div class=\"flex items-center text-primary underline cursor-pointer text-xs\"\n *ngIf=\"content?.viewMore\" (click)=\"content.viewMore = !content.viewMore\">\n {{'competencyCardDetails.viewLess' | translate}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #certificateLock>\n <div class=\"certificate-outer-div locked-certificate-outer-div\">\n <div class=\"certificate-lock p-4 flex flex-col gap-4\">\n <div class=\"flex justify-center items-center certificate-lock-text\">\n {{ 'apptoc.certificateLocked' | translate }}\n </div>\n <div class=\"flex justify-center items-center flex-col p-4 gap-2 locking-screen\">\n <img src=\"/assets/icons/lock_wht.svg\" alt=\"lock image\" />\n <div class=\"certificateLockedText pb-2\">{{'apptoc.certificateLockedMessage' | translate }}</div>\n <div class=\"locking-screen-description\">\n {{'apptoc.unlockCertificate' | translate}} <span\n class=\"surveyFormeText\">{{'apptoc.surveyForm' | translate}}</span> {{\n 'apptoc.unlockCertificate2' | translate : { courseCategory: content?.courseCategory ?\n content?.courseCategory : content?.primaryCategory } }}\n </div>\n\n <button mat-button class=\"surveyFormeButton px-7\"\n (click)=\"openSurveyFormPopup()\">{{'apptoc.completeSurveyNow' | translate}}</button>\n </div>\n </div>\n </div>\n </ng-template>\n </ng-container>\n</ng-template>\n\n<ng-template #competencyLabel>\n <div class=\"pt-mweb-4 mat-subheading-1 flex items-center gap-2\">\n {{ 'apptocsinglepage.competencies' | translate }}\n <mat-icon\n class=\"cursor-pointer ws-mat-black60-text info-icon mat-icon notranslate material-icons mat-icon-no-color\"\n [matTooltipPosition]=\"'below'\" #tooltip=\"matTooltip\" (click)=\"tooltip.toggle()\"\n matTooltip=\"{{ 'apptocsinglepage.competenciesTooltip' | translate }}\">info_outline</mat-icon>\n </div>\n</ng-template>\n<div class=\"flex flex-col mt-4\" [ngClass]=\"isMobile ? 'mx-4' : ''\"\n *ngIf=\"contentReadData?.retirementDate && contentReadData?.lastEnrollmentDate\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex items-center content-retire-container\">\n <mat-icon class=\"material-icons retire-info-icon\">warning</mat-icon>\n <div class=\"body-1\">This course is scheduled for retirement. The last date to enroll is\n {{contentReadData?.lastEnrollmentDate | date: 'MMMM d, y'}}, and\n the course will be retired on {{contentReadData?.retirementDate | date: 'MMMM d, y'}}.\n </div>\n </div>\n </ng-container>\n</div>\n<div class=\"flex flex-col mt-4 mx-4 block\" *ngIf=\"isMobile && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n</div>\n\n\n<div class=\"flex flex-col my-4 px-4\" [class.mt60]=\"sticky\" [ngClass]=\"isMobile ? '' : 'gap-10'\">\n <ng-container\n *ngIf=\"(content?.completionStatus === 2 || content?.certificateObj?.certId) && !fromMarketPlace && !disableCertificate\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"showMarketPlaceCertificate && fromMarketPlace\">\n <div class=\"certificate-container\" *ngIf=\"!skeletonLoader && !disableCertificate\">\n <div class=\"flex flex-row earned-certificate-container\">\n <div class=\"ribbon\"></div>\n <div class=\"certificate-background\">\n <div class=\"p-4\">\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n <div class=\"flex flex-col items-end\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"mobile-certificate-container\" *ngIf=\"!skeletonLoader\">\n <div class=\"earned-certificate-container\">\n <div class=\"flex flex-row\">\n <div class=\"ribbon\"></div>\n <div class=\"earned-certificate\">{{ 'apptocsinglepage.certificateEarned' | translate }}</div>\n </div>\n\n <div class=\"certificate-background\">\n <ng-container [ngTemplateOutlet]=\"certificateCard\"></ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [bindingClass]=\"'flex rounded'\" [height]=\"'148px'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"fromViewer || router.url.includes('/viewer/pdf/do_')\">\n <div class=\"flex flex-col gap-1 mt-2\">\n <div class=\"flex font-semibold text-base\">{{ handleCapitalize(content?.name) }} </div>\n <div class=\"mob-text break-words text-sm nodtranslate\">{{ 'cardcontentv2.by' | translate }} {{\n content?.source }}</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around hideAbove1200\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize ||\n '0' }}\n </div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 my-5 batch-timer hideAbove1200\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col\" *ngIf=\"fromViewer || isMobile\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-row gap-3\">\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'60px'\" [height]=\"'60px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [isMobile]=\"isMobile\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold nodtranslate\">\n {{ 'apptocsinglepage.description' | translate }}\n </div>\n <!-- <div *ngIf=\"content?.contentId && content?.contentId.includes('ext_')\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.description' | translate }}\n </div>\n <div *ngIf=\"!(content?.contentId && content?.contentId.includes('ext_'))\"\n class=\"mat-subheading-1 font-bold nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div> -->\n <div [ngClass]=\"{'mob-desc-ellipsis': summary.ellipsis && isMobile, 'desc-ellipsis': summary.ellipsis && !isMobile}\"\n #summaryElem>\n <div class=\"mob-text nodtranslate\"\n [innerHtml]=\"handleCapitalize(contentReadData?.description | replaceNbsp)\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"summary.viewLess\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\"> {{\n 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"summary.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"summary.ellipsis = !summary.ellipsis; summary.viewLess = !summary.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"contentReadData?.instructions || contentReadData?.purpose\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.instructions || contentReadData?.purpose | replaceNbsp\"\n class=\"mob-text break-words nodtranslate\"></div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\" *ngIf=\"content?.objectives\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 font-bold pt-mweb-8 nodtranslate\">{{ 'apptocsinglepage.learningOutcome' |\n translate\n }}</div>\n <div [ngClass]=\"{'mob-desc-ellipsis': objectives.ellipsis && isMobile, 'desc-ellipsis': objectives.ellipsis && !isMobile}\"\n #objectivesElem>\n <span class=\"mob-text nodtranslate\" [innerHtml]=\"handleCapitalize(content?.objectives)\"></span>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"objectives.viewLess\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"objectives.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"objectives.ellipsis = !objectives.ellipsis; objectives.viewLess = !objectives.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col\"\n *ngIf=\"contentReadData?.summary && contentReadData?.contentId && contentReadData?.contentId.includes('ext_')\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'80px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'80%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'65%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'apptocsinglepage.summary' | translate }}</div>\n <div class=\"desc\"\n [ngClass]=\"{'mob-desc-ellipsis': description.ellipsis && isMobile, 'desc-ellipsis': description.ellipsis && !isMobile}\"\n #descElem>\n\n <div [innerHTML]=\"contentReadData?.summary | replaceNbsp\" class=\"mob-text break-words nodtranslate\">\n </div>\n <div class=\"ws-mat-default-text font-bold cursor-pointer text-sm\" *ngIf=\"description.viewLess\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">\n {{ 'apptocsinglepage.viewLess' | translate }}</div>\n </div>\n <div class=\"ws-mat-default-text font-bold text-sm\" *ngIf=\"description.ellipsis\">\n <span class=\"cursor-pointer\"\n (click)=\"description.ellipsis = !description.ellipsis; description.viewLess = !description.viewLess\">{{\n 'apptocsinglepage.viewMore' | translate }}</span>\n </div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-3\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-row gap-3\">\n <ng-container *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n </div>\n <div class=\"flex flex-row gap-4\">\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'250px'\" [height]=\"'80px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngIf=\"!strip?.loaderWidgets?.length || !competenciesObject\">\n <div class=\"flex flex-col\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n {{ 'apptocsinglepage.noCompetencyFound' | translate }}\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.loaderWidgets?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <ng-container [ngTemplateOutlet]=\"competencyLabel\"></ng-container>\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3\">\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div class=\"themes-button\" [ngClass]=\"{'theme-activated': competencySelected === item.key}\"\n (click)=\"handleShowCompetencies(item, 'selected')\">{{ item.key }}</div>\n </ng-container>\n </div>\n <ng-container *ngFor=\"let item of competenciesObject\">\n <div *ngIf=\"item?.key === competencySelected\">\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2 mt-4\">\n <ws-widget-skeleton-loader [width]=\"'95%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'16px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <!-- {{content|json}} -->\n <ng-container *ngIf=\"contentReadData?.keywords?.length\">\n <ng-container [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: contentReadData?.keywords }\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.searchTags?.length > 1\">\n <ng-container *ngIf=\"content?.searchTags?.length\" [ngTemplateOutlet]=\"tagsList\"\n [ngTemplateOutletContext]=\"{ tagData: content?.searchTags?.slice(1,content?.searchTags?.length) }\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"(!skeletonLoader && sectorsList?.length) && (content?.primaryCategory?.toLowerCase() === 'learning resource' ||\n content?.resourceCategory?.toLowerCase() === 'case study')\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.sectors' | translate }}</div>\n <ng-container *ngIf=\"sectorsList?.length > 0\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-3 sm:gap-4 mb-3 flex-wrap\">\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <!-- [ngClass]=\"{'theme-activated': competencySelected === item.key}\"-->\n <div class=\"themes-button\"\n [ngClass]=\"{'theme-activated': selectedSectorId === sector?.sectorId}\"\n (click)=\"handleSubsector(sector, 'selected')\">{{ sector?.sectorName }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length\">\n <div>\n <ws-utils-horizontal-scroller-v2 [loadStatus]=\"'done'\" [stripConfig]=\"strip.stripConfig\">\n <ng-container *ngFor=\"let widget of strip?.sectorWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </ws-utils-horizontal-scroller-v2>\n </div>\n </ng-container>\n <ng-container *ngIf=\"strip?.sectorWidgets?.length === 0 && selectedSectorId\">\n <div class=\"mb-2\">\n No Subsector Available\n </div>\n </ng-container>\n </div>\n </ng-container>\n <!-- <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of sectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.sectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div> -->\n </div>\n </ng-container>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && subSectorsList?.length\">\n <div class=\"flex flex-col\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'gyaanKarmayogi.subSectors' | translate }}</div>\n <div class=\"flex flex-wrap gap-2\" >\n <ng-container *ngFor=\"let sector of subSectorsList; let i = index; let isLast = last\">\n <div class=\"text-xs mob-text\" >{{ sector?.subSectorName }}</div>\n <div class=\"flex items-center\" *ngIf=\"!isLast\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container> -->\n\n <ng-template #tagsList let-tagData=\"tagData\">\n <div class=\"flex flex-col\" *ngIf=\"tagData?.length\">\n <div class=\"mat-subheading-1 nodtranslate\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"tagData?.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': tagsEllipsis && !viewMoreTags}\"\n #tagsElem>\n <ng-container *ngFor=\"let tag of tagData; let i = index\">\n <div class=\"text-xs mob-text\">{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"tagData?.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\"\n *ngIf=\"tagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{\n 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\"\n *ngIf=\"viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' |\n translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!tagData?.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-template>\n\n <!-- <ng-container *ngIf=\"!skeletonLoader && content?.searchTags\">\n <div class=\"flex flex-col\" *ngIf=\"content?.searchTags.length\">\n <div class=\"mat-subheading-1\">{{ 'userProfile.tags' | translate }}</div>\n <ng-container *ngIf=\"content?.searchTags.length\">\n <div class=\"flex flex-wrap gap-2\" [ngClass]=\"{'tags-ellipsis': searchTagsEllipsis && !viewMoreTags}\" #searchTagElem>\n <ng-container *ngFor=\"let tag of content?.searchTags; let i = index\">\n <div class=\"text-xs mob-text\" >{{ handleCapitalize(tag) }}</div>\n <div class=\"flex items-center\" *ngIf=\"content?.searchTags.length > (i + 1)\">\n <span class=\"period\"></span>\n </div>\n </ng-container>\n </div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs\" *ngIf=\"searchTagsEllipsis && !viewMoreTags\" (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewMore' | translate }}</div>\n <div class=\"flex items-center ws-mat-default-text underline cursor-pointer text-xs mt-1\" *ngIf=\"viewMoreTags\"\n (click)=\"viewMoreTags = !viewMoreTags\">{{ 'apptocsinglepage.viewLess' | translate }}</div>\n </ng-container>\n <div class=\"flex flex-wrap gap-2\" *ngIf=\"!content?.searchTags.length\">\n {{ 'userProfile.noTags' | translate }}\n </div>\n </div>\n </ng-container> -->\n\n <div class=\"mobile-karma-points\">\n <ws-widget-karma-points [content]=\"content\" [btnCategory]=\"\" [condition]=\"condition\"\n (clickClaimKarmaPoints)=\"handleClickOfClaim($event)\" [data]=\"kparray\">\n </ws-widget-karma-points>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'72px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- commented because of new discussion v2 comments implmentation -->\n <!-- <div class=\"flex flex-col sm:flex-row items-center discussion-div\">\n <div class=\"flex-1 forum-content\">\n <div class=\"flex flex-col sm:flex-row gap-5 items-center\">\n <mat-icon>forum</mat-icon>\n <div class=\"suggestion-text sm:pr-4\">{{ 'apptocsinglepage.anySuggestions' | translate }}</div>\n </div>\n </div>\n <div class=\"flex-none p-3\">\n <button class=\"action-button\" (click)=\"navigateToDiscussionHub()\">{{ 'discuss.startDiscuss' | translate }}</button>\n </div>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-6\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader && !fromMarketPlace\">\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authorsAndCurators' | translate }}</div>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author.photo || ''\" [name]=\"author.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-4\"\n *ngFor=\"let creator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creator.photo || ''\" [name]=\"creator.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name.toLowerCase(), 'name') }}</div>\n <div class=\"text-xs leading-3 mob-text\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-column gap-3\" [ngClass]=\"{'hideAbove1200': !router.url.includes('/viewer/')}\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\">\n <div class=\"provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm break-all\">{{ handleCapitalize(content?.source, 'source') }}</div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'400px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && !forPreview\">\n <!-- <ng-container *ngIf=\"content?.averageRating\"> -->\n <div class=\"flex flex-col ratings-div gap-10\" id=\"ratingsDiv\" *ngIf=\"showReviews\">\n <ws-widget-rating-summary [ratingSummary]=\"ratingSummaryProcessed\"></ws-widget-rating-summary>\n\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1 mat-subheading-1 nodtranslate\" id=\"reviewContainer\">{{\n 'apptocsinglepage.topReviews' | translate }}</div>\n <ng-container *ngIf=\"ratingSummaryProcessed?.avgRating\">\n <div class=\"ws-mat-default-text cursor-pointer\" (click)=\"handleOpenReviewModal()\">{{\n 'msg.showAll' | translate }}</div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"topRatingReviews && topRatingReviews?.length\">\n <div class=\"flex gap-5\" [ngClass]=\"isMobile ? 'horizontal-strip' : 'flex-wrap'\">\n <div class=\"comment-div\" *ngFor=\"let eachReview of topRatingReviews | slice:0:4; let i = index\">\n <div class=\"p-4 flex flex-col gap-6\">\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"text-left desc-ellipsis\" title=\"{{ eachReview?.review }}\">{{\n handleCapitalize(eachReview?.review) }}</div>\n </div>\n <div class=\"flex flex-row gap-2 rating-start-value\">\n <mat-icon>star</mat-icon>\n <div>{{ eachReview?.rating }}</div>\n </div>\n </div>\n <div class=\"flex flex-row gap-2 items-center text-sm\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"eachReview?.photo || ''\"\n [name]=\"eachReview?.firstName\"></ws-widget-avatar-photo>\n <div class=\"flex flex-wrap\">\n <div>{{ handleCapitalize(eachReview?.firstName.toLowerCase(), 'name') }}</div>\n <div class=\"flex items-center mx-2\">\n <span class=\"period\"></span>\n </div>\n <div>{{ eachReview?.date | pipeRelativeTime }}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div *ngIf=\"!topRatingReviews || !topRatingReviews?.length\">\n <div class=\"flex flex-col text-center items-center justify-center bg-white p-4 rounded-md\">\n <div class=\"font-base font-bold nodtranslate\">{{ 'apptocsinglepage.noReviewsFound' | translate\n }}</div>\n </div>\n </div>\n </div>\n </div>\n <!-- </ng-container> -->\n <!-- <ng-container *ngIf=\"!content?.averageRating\">\n <div class=\"flex flex-col gap-3 justify-center ratings-div\">\n <img src=\"/assets/icons/toc/no-certificate.svg\" alt=\"no ratings image\" />\n <div class=\"text-lg font-bol\">Be the first one to rate this course and your <br/> learning experience</div>\n </div>\n </ng-container> -->\n </ng-container>\n</div>", styles: [".mt60{margin-top:60px}.mat-subheading-1{font-weight:700}.hidden{display:none!important}.info-icon{width:16px;height:16px;font-size:16px}.themes-button{border-radius:20px;border:1px solid rgba(0,0,0,.08);background-color:#e6e8ef;color:#0009;font-weight:400;letter-spacing:.25px;padding:8px 16px;cursor:pointer}.theme-activated{border:1px solid rgba(0,0,0,.8705882353);background-color:#dee6f2;color:#000000de;font-weight:700}.discussion-div{border-radius:12px;border:1px solid rgba(0,0,0,.08);background-color:#fff}.discussion-div .forum-content{padding:12px 28px}.discussion-div mat-icon{width:40px;height:40px;font-size:40px;color:#ff9800}.discussion-div .action-button{padding:12px 16px}@media screen and (max-width: 767px){.suggestion-text{text-align:center}.mob-text{color:#0009;word-wrap:break-word;width:100%}}.mob-text{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}::ng-deep .mob-text p{word-break:break-word!important;white-space:normal!important;word-wrap:break-word!important;overflow-wrap:break-word!important;text-align:left}.ratings-div{background-color:#1b4ca114;padding:24px}.ratings-div .ratings-container{max-width:380px;width:100%}.ratings-div .comment-div{background-color:#fff;border-radius:8px;border:1px solid rgba(0,0,0,.16);max-width:344px;width:100%}.ratings-div .comment-div .rating-start-value mat-icon{color:#ff9800}.horizontal-strip .comment-div{min-width:340px}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.text-ellipsis,.mob-desc-ellipsis,.desc-ellipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-box-orient:vertical;word-break:break-word}.desc{word-break:break-word;white-space:normal;overflow-wrap:break-word;text-align:left}.desc-ellipsis{min-height:72px;-webkit-line-clamp:3}.mob-desc-ellipsis{min-height:48px;-webkit-line-clamp:2}.tags-ellipsis{max-height:64px;overflow:hidden}::ng-deep .ratings-modal-box{max-width:880px!important;width:100%!important}::ng-deep .ratings-modal-box .mat-dialog-container{padding:0;border-radius:12px}@media screen and (max-width: 1000px){::ng-deep .ratings-modal-box{max-width:90vw!important}}.leading-5{font-family:Montserrat;font-size:16px;letter-spacing:.12px;color:#000000de;font-weight:500;margin-top:24px;margin-bottom:8px}.leading-4{font-family:Lato;font-size:14px;letter-spacing:.25px;color:#0009;font-weight:400;margin-top:8px;margin-bottom:24px}.kpi-values{margin:0 12px;min-width:72px}.earned-certificate-container{height:136px;border:1px solid rgb(27,76,161);border-radius:8px;background-color:#fff;max-width:768px}.earned-certificate-container .ribbon{position:relative;text-align:center;background:#1b4ca1;display:block;width:64px;height:60px;margin-left:20px;top:-6px;border-top-left-radius:4px;border-top-right-radius:4px}.earned-certificate-container .ribbon:after{content:\"\";width:100%;top:100%;position:absolute;display:block;border-width:4px 28px 24px 28px;border-color:#1b4ca1;border-bottom-color:transparent;border-style:solid;box-sizing:border-box}.earned-certificate-container .earned-certificate{font-family:Montserrat;font-size:20px;letter-spacing:.12px;line-height:28px;color:#1b4ca1;font-weight:600}.earned-certificate-container .certificate-background{background:url(/assets/icons/toc/cert-banner.svg);background-repeat:no-repeat;background-size:cover;width:100%;background-position-y:-88px;background-position-x:72px;height:inherit}.mobile-certificate-container{margin-top:10px;margin-bottom:20px}.mobile-certificate-container .earned-certificate-container{display:flex;flex-direction:column;gap:16px;height:100%}.mobile-certificate-container .earned-certificate-container .ribbon{width:52px;height:56px}.mobile-certificate-container .earned-certificate-container .ribbon:after{border-width:4px 28px 24px 24px}.mobile-certificate-container .earned-certificate{width:70%;padding:16px}.mobile-certificate-container .certificate-background{background:url(/assets/icons/toc/mob-cert-banner.svg);background-repeat:no-repeat;background-size:auto;width:100%;min-height:360px;background-position-x:center;background-position-y:8px}.mobile-certificate-container .certificate-outer-div{width:100%;position:relative;top:28px;right:0;min-height:200px;margin:0 auto 28px}.certificate-container{margin:108px 0 88px}@media screen and (max-width: 767px){.certificate-container{display:none}}@media screen and (min-width: 768px){.mobile-certificate-container{display:none}}.horizontal-strip{flex-direction:row;overflow-x:scroll;width:100%;align-items:center;text-align:center}.horizontal-strip::-webkit-scrollbar{display:none}.mobile-karma-points{max-width:360px}@media screen and (min-width: 1200px){.hideAbove1200{display:none!important}.mobile-karma-points{display:none}}@media screen and (max-width: 1200px){.pt-mweb-8{padding-top:2rem}.pt-mweb-4{padding-top:1rem}}.certificate_box{width:100%;height:180px;border-radius:12px;position:relative}.certificate_box img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:12px}.certificate_box .certificate_overlay{height:100%;width:100%;position:absolute;background:linear-gradient(180deg,#0000003d,#000000b0);top:0;left:0;z-index:1;border-radius:8px;overflow-y:auto}.certificate-outer-div{max-width:320px;width:100%;position:relative;right:108px;top:-168px;min-height:200px;z-index:10}.certificate-outer-div .certificate-card{border-radius:12px;border-top:1px solid rgba(0,0,0,.08);border-right:1px solid rgba(0,0,0,.08);border-left:1px solid rgba(0,0,0,.08);background:#fff;--mask: radial-gradient(16px at 16px 100%, #0000 98%, #000) -16px;mask:var(--mask)}.certificate-outer-div .certificate-card .ceritificate-image{display:flex;margin:auto;width:100%;border-radius:8px}.certificate-outer-div .certificate-card .icon{width:20px;height:20px;font-size:20px;color:#000000de}.certificate-outer-div .certificate-card .certificate-info{border-bottom:1px dashed rgba(0,0,0,.08)}.certificate-outer-div .chips-card{border-right:1px solid rgba(0,0,0,.16);border-bottom:1px solid rgba(0,0,0,.16);border-left:1px solid rgba(0,0,0,.16);padding:16px;background:#fff;border-radius:12px;--mask: radial-gradient(16px at 16px 0, #0000 98%, #000) -16px;mask:var(--mask)}.chip{border:1px solid rgba(0,0,0,.8705882353);color:#000000de;line-height:14px}.chip-ellipsis{white-space:nowrap;max-width:80px;overflow:hidden;text-overflow:ellipsis}.celebration-animation{position:absolute;left:0%;top:0;z-index:9999;width:100%}.download-section{z-index:99999}.truncate-3{-webkit-line-clamp:3;text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;word-wrap:break-word}.img-container{position:relative}.img-container .view-cert{visibility:hidden;display:none}.img-container:hover{display:block;z-index:99999}.img-container:hover .view-cert{visibility:visible;position:absolute;left:0;top:0;text-align:center;opacity:1;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%;background-color:#000000b5;border-radius:8px}.img-container:hover .view-cert button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999}.view-certificate{visibility:visible!important;display:block;position:absolute;left:0;top:0;text-align:center;opacity:1;background-color:#000000b5;border-radius:8px;transition:opacity .35s ease;display:flex;align-items:center;justify-content:center;width:100%;height:100%}.view-certificate button{color:#fff;border:1px solid white;padding:8px;background:transparent;border-radius:12px;cursor:pointer;z-index:999999;width:150px}.uploader-status ::ng-deep .mat-progress-spinner circle,.mat-spinner circle{stroke:#fff}.uploader-status ::ng-deep .mat-progress-spinner svg{width:24px!important;height:24px!important}.uploader-status ::ng-deep .mat-progress-spinner{width:24px!important;height:24px!important}.emailDefault{color:#f3962f!important;text-decoration:underline!important}.locked-certificate-outer-div{background-color:#fff;border-radius:10px}.certificate-lock{border:.7px solid rgba(0,0,0,.16);border-radius:12px}.certificate-lock .certificate-lock-text{color:#344054;font:700 14px/20.074px Inter}.certificate-lock .locking-screen{color:#fff;border-radius:4px;background-color:#000000db}.certificate-lock .certificateLockedText{color:#fff;text-align:center;font:700 11.72px/normal Lato}.certificate-lock .locking-screen-description{color:#fff;text-align:center;font:400 14px/normal Lato}.certificate-lock .locking-screen-description .surveyFormeText{color:#f3962f}.certificate-lock .surveyFormeButton{background-color:#1b4ca1;height:34px;border-radius:18px;color:#fff;font:700 12px Lato;border:0px;cursor:pointer}\n"] }]
|
|
883
883
|
}], ctorParameters: function () { return [{ type: i1.RatingService }, { type: i2.LoggerService }, { type: i3.MatLegacyDialog }, { type: i4.MatLegacySnackBar }, { type: i5.LoadCheckService }, { type: i6.TimerService }, { type: i7.AppTocService }, { type: i2.ConfigurationsService }, { type: i8.DiscussUtilsService }, { type: i9.Router }, { type: i10.ReviewComponentDataService }, { type: i11.HandleClaimService }, { type: i12.ResetRatingsService }, { type: i2.WidgetContentService }, { type: i9.ActivatedRoute }, { type: undefined, decorators: [{
|
|
884
884
|
type: Inject,
|
|
885
885
|
args: ['environment']
|
|
@@ -943,4 +943,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
943
943
|
type: ViewChild,
|
|
944
944
|
args: ['searchTagElem']
|
|
945
945
|
}] } });
|
|
946
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1hYm91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWFib3V0L2FwcC10b2MtYWJvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1hYm91dC9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFzRCxTQUFTLEVBQWMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFJakssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFMUMsMkJBQTJCO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUd6QixPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUd0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFZdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUE7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbkJsRyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQzVCLEtBQUss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QUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNtQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0ssY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0osUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNFLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDTyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc1NhbWVPckFmdGVyKVxuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSdcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyJ1xuXG5pbXBvcnQgeyBOc1dpZGdldFJlc29sdmVyIH0gZnJvbSAnQHN1bmJpcmQtY2IvcmVzb2x2ZXItdjInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSwgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3RpbWVyLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi9jb250ZW50LXNlcnZpY2VzL2hhbmRsZS1jbGFpbS5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJldmlld0NvbXBvbmVudERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vY29udGVudC1zZXJ2aWNlcy9yZXZpZXctY29tcG9uZW50LWRhdGEuc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5pbXBvcnQgeyBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLm1vZGVsJ1xuaW1wb3J0IHsgRGlzY3Vzc1V0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2Rpc2N1c3MtdXRpbHMuc2VydmljZSdcblxuaW1wb3J0IHsgUmV2aWV3c0NvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9yZXZpZXdzLWNvbnRlbnQvcmV2aWV3cy1jb250ZW50LmNvbXBvbmVudCdcbmltcG9ydCB7IENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2VydGlmaWNhdGUtZGlhbG9nL2NlcnRpZmljYXRlLWRpYWxvZy5jb21wb25lbnQnXG5cbmludGVyZmFjZSBJU3RyaXBVbml0Q29udGVudERhdGEge1xuICBrZXk6IHN0cmluZ1xuICBjYW5IaWRlU3RyaXA6IGJvb2xlYW5cbiAgbW9kZT86IHN0cmluZ1xuICBzaG93U3RyaXA6IGJvb2xlYW5cbiAgd2lkZ2V0cz86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhW11cbiAgc3RyaXBUaXRsZTogc3RyaW5nXG4gIHN0cmlwVGl0bGVMaW5rPzoge1xuICAgIGxpbms6IHN0cmluZyxcbiAgICBpY29uOiBzdHJpbmdcbiAgfSxcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgfSxcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYltdIHwgdW5kZWZpbmVkLFxuICBzdHJpcE5hbWU/OiBzdHJpbmdcbiAgc3RyaXBMb2dvPzogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHN0cmlwSW5mbz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSVN0cmlwSW5mb1xuICBub0RhdGFXaWRnZXQ/OiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YVxuICBlcnJvcldpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhXG4gIHNob3dPbk5vRGF0YTogYm9vbGVhblxuICBzaG93T25Mb2FkZXI6IGJvb2xlYW5cbiAgc2hvd09uRXJyb3I6IGJvb2xlYW5cbiAgbG9hZGVyV2lkZ2V0cz86IGFueVxuICBzdHJpcEJhY2tncm91bmQ/OiBzdHJpbmdcbiAgc2Vjb25kYXJ5SGVhZGluZz86IGFueVxuICB2aWV3TW9yZVVybDogYW55LFxuICBzZWN0b3JXaWRnZXRzPzogYW55XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtdG9jLWFib3V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b2MtYWJvdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuXG5leHBvcnQgY2xhc3MgQXBwVG9jQWJvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBcbiAgQElucHV0KCkgY29uZGl0aW9uOiBhbnlcbiAgQElucHV0KCkga3BhcnJheTogYW55XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICBASW5wdXQoKSBzdGlja3kgPSBmYWxzZVxuICBASW5wdXQoKSB0b2NTdHJ1Y3R1cmU6IGFueVxuICBASW5wdXQoKSBwYXRoU2V0OiBhbnlcbiAgQElucHV0KCkgY29uZmlnOiBhbnlcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogYW55XG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxuICBASW5wdXQoKSBzaG93UmV2aWV3cyA9IGZhbHNlXG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogYW55XG4gIEBJbnB1dCgpIGZyb21WaWV3ZXIgPSBmYWxzZVxuICBASW5wdXQoKSBzZWxlY3RlZEJhdGNoRGF0YTogYW55XG4gIEBJbnB1dCgpIHNlbGVjdGVkVGFiVmFsdWUgPSAwXG4gIEBJbnB1dCgpIGZyb21NYXJrZXRQbGFjZT8gPSBmYWxzZVxuICBASW5wdXQoKSBzaG93TWFya2V0UGxhY2VDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBJbnB1dCgpIGxhbmd1YWdlTGlzdCA9IFtdXG4gIEBJbnB1dCgpIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBPdXRwdXQoKSB0cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKVxuICBAVmlld0NoaWxkKCdzdW1tYXJ5RWxlbScpIHN1bW1hcnlFbGVtICE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnb2JqZWN0aXZlc0VsZW0nKSBvYmplY3RpdmVzRWxlbSAhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2Rlc2NFbGVtJykgZGVzY0VsZW0gITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCd0YWdzRWxlbScpIHRhZ3NFbGVtICE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnc2VhcmNoVGFnRWxlbScpIHNlYXJjaFRhZ0VsZW0gITogRWxlbWVudFJlZlxuICBkaXNhYmxlQ2VydGlmaWNhdGUgPSBmYWxzZVxuICBpc0V4dGVybmFsQ29udGVudCA9IGZhbHNlXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHN0cmlwc1Jlc3VsdERhdGFNYXAhOiB7IFtrZXk6IHN0cmluZ106IElTdHJpcFVuaXRDb250ZW50RGF0YSB9XG4gIHN1bW1hcnkgPSB7XG4gICAgZWxsaXBzaXM6IGZhbHNlLFxuICAgIHZpZXdMZXNzOiBmYWxzZSxcbiAgfVxuICBkZXNjcmlwdGlvbiA9IHtcbiAgICBlbGxpcHNpczogZmFsc2UsXG4gICAgdmlld0xlc3M6IGZhbHNlLFxuICB9XG4gIG9iamVjdGl2ZXMgPSB7XG4gICAgZWxsaXBzaXM6IGZhbHNlLFxuICAgIHZpZXdMZXNzOiBmYWxzZSxcbiAgfVxuICB0YWdzRWxsaXBzaXMgPSBmYWxzZVxuICBzZWFyY2hUYWdzRWxsaXBzaXMgPSBmYWxzZVxuICBjb21wZXRlbmN5U2VsZWN0ZWQgPSAnJ1xuICByYXRpbmdTdW1tYXJ5OiBhbnlcbiAgYXV0aFJlcGxpZXM6IGFueVxuICByYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkOiBhbnlcbiAgdG9wUmF0aW5nUmV2aWV3czogYW55W10gPSBbXVxuICByYXRpbmdSZXZpZXdzOiBhbnlbXSA9IFtdXG4gIGxhdGVzdFJldmlld3M6IGFueVtdID0gW11cbiAgZGlhbG9nUmVmOiBhbnlcbiAgZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gIGRpc2FibGVMb2FkTW9yZSA9IGZhbHNlXG4gIGxvb2t1cExvYWRpbmc6IEJvb2xlYW4gPSB0cnVlXG4gIGxhc3RMb29rVXA6IGFueVxuICByYXRpbmdMb29rdXA6IGFueVxuICByZXZpZXdQYWdlID0gMVxuICByZXZpZXdEZWZhdWx0TGltaXQgPSAyXG4gIGxvb2t1cExpbWl0ID0gM1xuICByYXRpbmdWaWV3Q291bnQgPSAzXG4gIHJhdGluZ1ZpZXdDb3VudERlZmF1bHQgPSAzXG4gIGNvbXBldGVuY2llc09iamVjdDogYW55ID0gW11cbiAgcHJpdmF0ZSBkZXN0cm95U3ViamVjdCQgPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgdmlld01vcmVUYWdzID0gZmFsc2VcbiAgdGltZXJVbnN1YnNjcmliZTogYW55XG4gIGRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2VcblxuICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCA9IHtcbiAgICBrZXk6ICdibGVuZGVkUHJvZ3JhbXMnLFxuICAgIGxvZ286ICcnLFxuICAgIHRpdGxlOiAnQmxlbmRlZCBQcm9ncmFtJyxcbiAgICBzdHJpcFRpdGxlTGluazoge1xuICAgICAgbGluazogJycsXG4gICAgICBpY29uOiAnJyxcbiAgICB9LFxuICAgIHNsaWRlckNvbmZpZzoge1xuICAgICAgc2hvd05hdnM6IHRydWUsXG4gICAgICBzaG93RG90czogZmFsc2UsXG4gICAgfSxcbiAgICBsb2FkZXI6IHRydWUsXG4gICAgc3RyaXBCYWNrZ3JvdW5kOiAnJyxcbiAgICB0aXRsZURlc2NyaXB0aW9uOiAnQmxlbmRlZCBQcm9ncmFtJyxcbiAgICBzdHJpcENvbmZpZzoge1xuICAgICAgY2FyZFN1YlR5cGU6ICdzdGFuZGFyZCcsXG4gICAgfSxcbiAgICB2aWV3TW9yZVVybDoge1xuICAgICAgcGF0aDogJycsXG4gICAgICB2aWV3TW9yZVRleHQ6ICdTaG93IGFsbCcsXG4gICAgICBxdWVyeVBhcmFtczogJycsXG4gICAgfSxcbiAgICB0YWJzOiBbXSxcbiAgICBmaWx0ZXJzOiBbXVxuICB9XG5cbiAgdGltZXI6IGFueSA9IHt9XG4gIGlzTW9iaWxlID0gZmFsc2VcbiAgY29tcGVudGVuY3lLZXkhOiBOc0NvbnRlbnQuSUNvbXBlbnRlbmN5S2V5c1xuICBzZWN0b3JzTGlzdDogYW55W10gPSBbXVxuICBzdWJTZWN0b3JzTGlzdDogYW55W10gPSBbXVxuICB1c2VyUHJvZmlsZTogYW55ID0gbnVsbFxuICBzdWJTZWN0b3JEZXRhaWxBcnI6IGFueSA9IFtdXG4gIHNlbGVjdGVkU2VjdG9yID0gJydcbiAgc2VsZWN0ZWRTZWN0b3JJZCA9ICcnXG4gIHJlZnJlc2hyYXRpbmdTdWJcbiAgcGFnZUNvbmZpZ0RhdGE6IGFueVxuICBlbnZpcm9ubWVudCE6IGFueVxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJhdGluZ1NlcnZpY2U6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSBsb2FkQ2hlY2tTZXJ2aWNlOiBMb2FkQ2hlY2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGltZXJTZXJ2aWNlOiBUaW1lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaXNjdXNzVXRpbGl0eVN2YzogRGlzY3Vzc1V0aWxzU2VydmljZSxcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZXZpZXdEYXRhU2VydmljZTogUmV2aWV3Q29tcG9uZW50RGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGFpbVNlcnZpY2U6IEhhbmRsZUNsYWltU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2V0UmF0aW5nc1NlcnZpY2U6IFJlc2V0UmF0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnlcbiAgKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50XG4gICAgdGhpcy5yZWZyZXNocmF0aW5nU3ViID0gdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnJlc2V0UmF0aW5ncyQuc3Vic2NyaWJlKChfcmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcbiAgICB9KVxuICB9XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFnZUNvbmZpZ0RhdGEgPSB0aGlzLmFjdGl2YXRlZFJvdXRlPy5zbmFwc2hvdD8uZGF0YT8ucGFnZURhdGE/LmRhdGFcbiAgICB0aGlzLmNvbXBlbnRlbmN5S2V5ID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbXBlbnRlbmN5W3RoaXMuZW52aXJvbm1lbnQuY29tcGVudGVuY3lWZXJzaW9uS2V5XVxuICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UudXNlclByb2ZpbGVcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTIwMCkge1xuICAgICAgdGhpcy5pc01vYmlsZSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc01vYmlsZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcbiAgICAgIC8vIHRoaXMubG9hZENvbXBldGVuY2llcygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkICYmIHRoaXMuY29udGVudC5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKSkge1xuICAgICAgLy8gdGhpcy5sb2FkQ29tcGV0ZW5jaWVzKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnRbJ3N1YlRoZW1lJ10gPSB0aGlzLmdldFN1YlRoZW1lcygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWSkge1xuICAgICAgdGhpcy5kaXNhYmxlQ2VydGlmaWNhdGUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uc2VjdG9yRGV0YWlsc192MSkge1xuICAgICAgLy8gUGFyc2Ugc3RyaW5nIHRvIGFycmF5IGlmIG5lZWRlZFxuICAgICAgbGV0IHNlY3RvckRldGFpbHNBcnJheSA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxXG5cbiAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRyeSB0byBwYXJzZSBpdCBpbnRvIGFuIGFycmF5XG4gICAgICBpZiAodHlwZW9mIHNlY3RvckRldGFpbHNBcnJheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3RvckRldGFpbHNBcnJheSlcbiAgICAgICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MSA9IHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzZWN0b3JEZXRhaWxzX3YxOicsIGUpXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5ID0gW11cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIG9ubHkgaWYgd2UgaGF2ZSBhIHZhbGlkIGFycmF5IHdpdGggaXRlbXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlY3RvckRldGFpbHNBcnJheSkgJiYgc2VjdG9yRGV0YWlsc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWN0b3JzTGlzdCA9IF8udW5pcUJ5KFxuICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zZWN0b3JOYW1lICYmIGl0ZW0/LnNlY3RvcklkKVxuICAgICAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICBzZWN0b3JJZDogaXRlbS5zZWN0b3JJZCxcbiAgICAgICAgICAgICAgc2VjdG9yTmFtZTogaXRlbS5zZWN0b3JOYW1lXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgJ3NlY3Rvck5hbWUnXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLnN1YlNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnN1YlNlY3Rvck5hbWUgJiYgaXRlbT8uc3ViU2VjdG9ySWQpXG4gICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHN1YlNlY3RvcklkOiBpdGVtLnN1YlNlY3RvcklkLFxuICAgICAgICAgICAgICBzdWJTZWN0b3JOYW1lOiBpdGVtLnN1YlNlY3Rvck5hbWVcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAnc3ViU2VjdG9yTmFtZSdcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICh0aGlzLnNlY3RvcnNMaXN0ICYmIHRoaXMuc2VjdG9yc0xpc3QubGVuZ3RoICYmIHRoaXMuc2VjdG9yc0xpc3RbMF0pIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3Vic2VjdG9yKHRoaXMuc2VjdG9yc0xpc3RbMF0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICBpZiAoXG4gICAgICB0aGlzLmNvbnRlbnQ/LmNvbnRlbnRJZCAmJlxuICAgICAgdGhpcy5jb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uZGF0YSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmRhdGEpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPT09IDJcbiAgICApIHtcbiAgICAgIHRoaXMuaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKCk7XG4gICAgfVxuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclNlcnZpY2UuZ2V0VGltZXJEYXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfdGltZXI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVyID0gX3RpbWVyXG4gICAgICB9KVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuY29tcGVudGVuY3lLZXkgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29tcGVudGVuY3lbdGhpcy5lbnZpcm9ubWVudC5jb21wZW50ZW5jeVZlcnNpb25LZXldXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRUYWJWYWx1ZSAmJiBjaGFuZ2VzLnNlbGVjdGVkVGFiVmFsdWUuY3VycmVudFZhbHVlID09PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3VtbWFyeUVsZW0gJiYgdGhpcy5zdW1tYXJ5RWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDcyKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnkuZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVzY0VsZW0gJiYgdGhpcy5kZXNjRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDcyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5vYmplY3RpdmVzRWxlbSAmJiB0aGlzLm9iamVjdGl2ZXNFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNzIpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0aXZlcy5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3VtbWFyeUVsZW0gJiYgdGhpcy5zdW1tYXJ5RWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ4KSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnkuZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVzY0VsZW0gJiYgdGhpcy5kZXNjRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ4KSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5vYmplY3RpdmVzRWxlbSAmJiB0aGlzLm9iamVjdGl2ZXNFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDgpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0aXZlcy5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50YWdzRWxlbSAmJiB0aGlzLnRhZ3NFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNjQpIHtcbiAgICAgICAgICB0aGlzLnRhZ3NFbGxpcHNpcyA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRhZ0VsZW0gJiYgdGhpcy5zZWFyY2hUYWdFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNjQpIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRhZ3NFbGxpcHNpcyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwgNTAwKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnNrZWxldG9uTG9hZGVyICYmICFjaGFuZ2VzLnNrZWxldG9uTG9hZGVyLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jb21wb25lbnRMb2FkZWQodHJ1ZSlcbiAgICAgIH0sIDUwMClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgICAgYXNzZXNzbWVudDogMCxcbiAgICAgICAgY291cnNlOiAwLFxuICAgICAgICBoYW5kc09uOiAwLFxuICAgICAgICBpbnRlcmFjdGl2ZVZpZGVvOiAwLFxuICAgICAgICBsZWFybmluZ01vZHVsZTogMCxcbiAgICAgICAgb3RoZXI6IDAsXG4gICAgICAgIHBkZjogMCxcbiAgICAgICAgc3VydmV5OiAwLFxuICAgICAgICBwb2RjYXN0OiAwLFxuICAgICAgICBwcmFjdGljZVRlc3Q6IDAsXG4gICAgICAgIGZpbmFsVGVzdDogMCxcbiAgICAgICAgcXVpejogMCxcbiAgICAgICAgdmlkZW86IDAsXG4gICAgICAgIHdlYk1vZHVsZTogMCxcbiAgICAgICAgd2ViUGFnZTogMCxcbiAgICAgICAgeW91dHViZTogMCxcbiAgICAgICAgaW50ZXJhY3RpdmVjb250ZW50OiAwLFxuICAgICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICAgIH1cbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBVbml0JyA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0gdGhpcy50b2NTdmMuZ2V0VG9jU3RydWN0dXJlKHRoaXMuY29udGVudCwgdGhpcy50b2NTdHJ1Y3R1cmUpXG4gICAgICBmb3IgKGNvbnN0IHByb2dUeXBlIGluIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZVtwcm9nVHlwZV0gPiAwKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIE9iamVjdC5rZXlzKHRoaXMucmF0aW5nU3VtbWFyeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXBldGVuY2llc09iamVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmxvYWRDb21wZXRlbmNpZXMoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRJZCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkLmluY2x1ZGVzKCdleHRfJykpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGV0ZW5jaWVzT2JqZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubG9hZENvbXBldGVuY2llcygpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhWydzdWJUaGVtZSddID0gdGhpcy5nZXRTdWJUaGVtZXMoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DQVNFX1NUVURZKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnNlY3RvckRldGFpbHNfdjEpIHtcbiAgICAgICAgLy8gUGFyc2Ugc3RyaW5nIHRvIGFycmF5IGlmIG5lZWRlZFxuICAgICAgICBsZXQgc2VjdG9yRGV0YWlsc0FycmF5ID0gdGhpcy5jb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVxuXG4gICAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRyeSB0byBwYXJzZSBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjdG9yRGV0YWlsc0FycmF5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3RvckRldGFpbHNBcnJheSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjEgPSBzZWN0b3JEZXRhaWxzQXJyYXlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHNlY3RvckRldGFpbHNfdjE6JywgZSlcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheSA9IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCBhcnJheSB3aXRoIGl0ZW1zXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlY3RvckRldGFpbHNBcnJheSkgJiYgc2VjdG9yRGV0YWlsc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzZWN0b3JzIHVzaW5nIGxvZGFzaFxuICAgICAgICAgIHRoaXMuc2VjdG9yc0xpc3QgPSBfLnVuaXFCeShcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnNlY3Rvck5hbWUgJiYgaXRlbT8uc2VjdG9ySWQpXG4gICAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzZWN0b3JJZDogaXRlbS5zZWN0b3JJZCxcbiAgICAgICAgICAgICAgICBzZWN0b3JOYW1lOiBpdGVtLnNlY3Rvck5hbWVcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgJ3NlY3Rvck5hbWUnXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCB1bmlxdWUgc3Vic2VjdG9ycyB1c2luZyBsb2Rhc2hcbiAgICAgICAgICB0aGlzLnN1YlNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXlcbiAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zdWJTZWN0b3JOYW1lICYmIGl0ZW0/LnN1YlNlY3RvcklkKVxuICAgICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgc3ViU2VjdG9ySWQ6IGl0ZW0uc3ViU2VjdG9ySWQsXG4gICAgICAgICAgICAgICAgc3ViU2VjdG9yTmFtZTogaXRlbS5zdWJTZWN0b3JOYW1lXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICdzdWJTZWN0b3JOYW1lJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgIGlmIChjaGFuZ2VzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuaXNFeHRlcm5hbENvbnRlbnQgPSBfLmdldChjaGFuZ2VzLCAnY29udGVudC5jdXJyZW50VmFsdWUuY29udGVudElkJywgJycpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2V4dF8nKVxuICAgIH1cbiAgfVxuXG4gIGdldFN1YlRoZW1lcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3ViVGhlbWVBcnI6IGFueVtdID0gW11cbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb21wZW50ZW5jeUtleSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0ubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPT09ICdzdHJpbmcnICYmIHRoaXMuY2hlY2tWYWxpZEpTT04odGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9IEpTT04ucGFyc2UodGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSlcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX2NvbXBldGVuY3lPYmo6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc3ViVGhlbWVBcnIuaW5kZXhPZihfY29tcGV0ZW5jeU9ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKSA9PT0gLTEpIHtcbiAgICAgICAgICBzdWJUaGVtZUFyci5wdXNoKF9jb21wZXRlbmN5T2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBzdWJUaGVtZUFyclxuICB9XG5cbiAgbG9hZENvbXBldGVuY2llcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldLmxlbmd0aCkge1xuICAgICAgY29uc3QgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSB7fVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9PT0gJ3N0cmluZydcbiAgICAgICAgJiYgdGhpcy5jaGVja1ZhbGlkSlNPTih0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPSBKU09OLnBhcnNlKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldKVxuICAgICAgfVxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX29iajogYW55KSA9PiB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dKSB7XG4gICAgICAgICAgaWYgKGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICBbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5VGhlbWVdXSkge1xuICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVRoZW1lID0gY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVxuICAgICAgICAgICAgW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIGlmIChjb21wZXRlbmN5VGhlbWUuaW5kZXhPZihfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pID09PSAtMSkge1xuICAgICAgICAgICAgICBjb21wZXRlbmN5VGhlbWUucHVzaChfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dXG4gICAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXSA9IHt9XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcGV0ZW5jaWVzT2JqZWN0KSB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wWyd2YWx1ZSddID0gY29tcGV0ZW5jaWVzT2JqZWN0W2tleV1cbiAgICAgICAgICB0aGlzLmNvbXBldGVuY2llc09iamVjdC5wdXNoKF90ZW1wKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZVNob3dDb21wZXRlbmNpZXModGhpcy5jb21wZXRlbmNpZXNPYmplY3RbMF0pXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU2hvd0NvbXBldGVuY2llcyhpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCA9IGl0ZW0ua2V5XG4gICAgY29uc3QgdmFsdWVPYmogPSBpdGVtLnZhbHVlXG4gICAgY29uc3QgY29tcGV0ZW5jeUFycmF5ID0gW11cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgaWYgKHZhbHVlT2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3QgX3RlbXBPYmo6IGFueSA9IHt9XG4gICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICBfdGVtcE9ialsndmFsdWUnXSA9IHZhbHVlT2JqW2tleV1cbiAgICAgICAgY29tcGV0ZW5jeUFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RyaXBbJ2xvYWRlcldpZGdldHMnXSA9IFtdXG4gICAgdGhpcy5zdHJpcFsnbG9hZGVyV2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldCh0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCwgY29tcGV0ZW5jeUFycmF5LCB0aGlzLnN0cmlwKVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldChcbiAgICBjb21wZXRlbmN5QXJlYTogc3RyaW5nLFxuICAgIGNvbXBldGVuY3lBcnJPYmplY3Q6IGFueSxcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIHJldHVybiAoY29tcGV0ZW5jeUFyck9iamVjdCB8fCBbXSkubWFwKChjb250ZW50OiBhbnksIGlkeDogbnVtYmVyKSA9PiAoXG4gICAgICBjb250ZW50ID8ge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjb21wZXRlbmN5Q2FyZCcsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21yLTQnLFxuICAgICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBjb21wZXRlbmN5QXJlYSxcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHdpZGdldFR5cGU6ICdjYXJkJyxcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NvbXBldGVuY3lDYXJkJyxcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbXItNCcsXG4gICAgICAgIHdpZGdldERhdGE6IHt9LFxuICAgICAgfVxuICAgICkpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hSYXRpbmdTdW1tYXJ5KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgdGhpcy5yYXRpbmdTZXJ2aWNlLmdldFJhdGluZ1N1bW1hcnkodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpLnN1YnNjcmliZShcbiAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeSA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYXRpbmdTdW1tYXJ5ID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGlkZSBsb2FkZXIgZm9yIE1hdERpYWxvZy4uLlxuICAgICAgICAgIGlmICh0aGlzLmRpYWxvZ1JlZikgeyB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2UgfVxuICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCA9IHRoaXMucHJvY2Vzc1JhdGluZ1N1bW1hcnkoKVxuICAgICAgICAgIC8vIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggcmF0aW5nIHN1bW1hcnksIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBmZXRjaFJhdGluZ0xvb2t1cCgpIHtcbiAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSB0cnVlXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBhY3Rpdml0eVR5cGU6IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGxpbWl0OiB0aGlzLmxvb2t1cExpbWl0LFxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF0aW5nU2VydmljZS5nZXRSYXRpbmdMb29rdXAocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFRvIGRpc2FibGUgdGhlIGxvYWRlciBpbiB0aGUgbW9kYWwuXG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV2aWV3UGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgcmVzLnJlc3VsdC5yZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYXRpbmdMb29rdXAuZmluZCgobzogYW55KSA9PiBvLnVwZGF0ZWRPblVVSUQgPT09IGl0ZW0udXBkYXRlZE9uVVVJRCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucmF0aW5nTG9va3VwLnB1c2goaXRlbSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByb2Nlc3NSYXRpbmdMb29rdXAocmVzLnJlc3VsdC5yZXNwb25zZSlcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7ICAgLy8gVG8gZGlzYWJsZSB0aGUgbG9hZGVyIGluIHRoZSBtb2RhbC5cbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBsb2FkIHJldmlld3MsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzUmF0aW5nTG9va3VwKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPCB0aGlzLmxvb2t1cExpbWl0KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gcmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nTG9va3VwXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KHRoaXMubGF0ZXN0UmV2aWV3cywgJ3VzZXJJZCcpXG4gICAgICBjb25zdCB1c2VySWRzID0gXy5tYXAodGhpcy5sYXRlc3RSZXZpZXdzLCAndXNlcklkJylcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdXNlcklkcykge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yYXRpbmdSZXZpZXdzKSB7XG4gICAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nUmV2aWV3cy5zbGljZSgpXG4gICAgICAgIHRoaXMucmV2aWV3RGF0YVNlcnZpY2Uuc2V0UmV2aWV3RGF0YSh0aGlzLnJhdGluZ1Jldmlld3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXV0aG9yUmVwbHkoaWRlbnRpZmllcjogc3RyaW5nLCBwcmltYXJ5Q2F0ZWdvcnk6IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2aXR5VHlwZTogcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICB1c2VySWQ6IHVzZXJJZHMsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJhdGluZ1NlcnZpY2UuZ2V0UmF0aW5nUmVwbHkocmVxdWVzdCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICBjb25zdCByYXRpbmdBdXRoUmVwbGF5ID0gcmVzLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgXy5mb3JFYWNoKHJhdGluZ0F1dGhSZXBsYXksIHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF0pIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoUmVwbGllc1t2YWx1ZS51c2VySWRdWydjb21tZW50J10gPSB2YWx1ZS5jb21tZW50XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsndXNlcklkJ10gPSB2YWx1ZS51c2VySWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXRlc3RSZXZpZXdzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmF1dGhSZXBsaWVzKVxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoUmVwbGllc1xuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIGF1dGhvciByZXBsaWVzLCBkdWUgdG8gc29tZSBlcnJvciEnKVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIGNvdW50U3RhcnNQZXJjZW50YWdlKHZhbHVlOiBhbnksIGtleTogYW55LCB0b3RhbDogYW55KSB7XG4gICAgaWYgKHZhbHVlICYmIHRvdGFsKSB7XG4gICAgICByZXR1cm4gKCgodmFsdWUgKiBrZXkpIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDIpXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuICBwcm9jZXNzUmF0aW5nU3VtbWFyeSgpIHtcbiAgICBjb25zdCBicmVha0Rvd25BcnJheTogYW55W10gPSBbXVxuICAgIGNvbnN0IHJhdGluZ1N1bW1hcnlQciA9IHtcbiAgICAgIGJyZWFrRG93bjogYnJlYWtEb3duQXJyYXksXG4gICAgICBsYXRlc3Q1MFJldmlld3M6IGJyZWFrRG93bkFycmF5LFxuICAgICAgcmF0aW5nc051bWJlcjogYnJlYWtEb3duQXJyYXksXG4gICAgICB0b3RhbF9udW1iZXJfb2ZfcmF0aW5nczogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxfbnVtYmVyX29mX3JhdGluZ3MnKSB8fCAwLFxuICAgICAgYXZnUmF0aW5nOiAwLFxuICAgIH1cblxuICAgIGNvbnN0IHRvdFJhdGluZ3MgPSBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICdzdW1fb2ZfdG90YWxfcmF0aW5ncycpIHx8IDBcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50MXN0YXJzJyksIDEsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiAxLFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSwgMiwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDIsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLFxuICAgIH0pXG4gICAgcmF0aW5nU3VtbWFyeVByLmJyZWFrRG93bi5wdXNoKHtcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLCAzLCB0b3RSYXRpbmdzKSxcbiAgICAgIGtleTogMyxcbiAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50M3N0YXJzJyksXG4gICAgfSlcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50NHN0YXJzJyksIDQsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiA0LFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSwgNSwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDUsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLFxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpIHtcbiAgICAgIGNvbnN0IGxhdGVzdDUwUmV2aWV3cyA9IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cylcbiAgICAgIGNvbnN0IG1vZGlmaWVkUmV2aWV3cyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgcmF0aW5nID0+IHtcbiAgICAgICAgcmF0aW5nWyd1c2VySWQnXSA9IHJhdGluZy51c2VyX2lkXG4gICAgICAgIHJldHVybiByYXRpbmdcbiAgICAgIH0pXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgY29uc3QgdXNlcklkcyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICByYXRpbmdTdW1tYXJ5UHIubGF0ZXN0NTBSZXZpZXdzID0gbW9kaWZpZWRSZXZpZXdzXG4gICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSBtb2RpZmllZFJldmlld3NcbiAgICAgIHRoaXMudG9wUmF0aW5nUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xuICAgIH1cbiAgICAvLyBUbyBwYXNzIGRhdGEgdG8gdGhlIHJldmlldyBjb250ZW50XG4gICAgdGhpcy5yZXZpZXdEYXRhU2VydmljZS5zZXRSZXZpZXdEYXRhKHRoaXMucmF0aW5nUmV2aWV3cylcblxuICAgIGlmICh0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKSB7XG4gICAgICByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID1cbiAgICAgICAgcGFyc2VGbG9hdCgodGhpcy5yYXRpbmdTdW1tYXJ5LnN1bV9vZl90b3RhbF9yYXRpbmdzIC8gdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKS50b0ZpeGVkKDEpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZ1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLnRvdGFsX251bWJlcl9vZl9yYXRpbmdzXG4gICAgfVxuICAgIHJldHVybiByYXRpbmdTdW1tYXJ5UHJcbiAgfVxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0ZW1wU3RyID0gc3RyXG4gICAgaWYgKHRlbXBTdHIpIHtcbiAgICAgIHRlbXBTdHIgPSB0ZW1wU3RyLnNwbGl0KCdfeDAwMERfLCcpLmpvaW4oJycpXG4gICAgfVxuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHRlbXBTdHIgJiYgdHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRlbXBTdHIuc3BsaXQoJyAnKS5tYXAoX3N0ciA9PiB7XG4gICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgfSkuam9pbignICcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGVtcFN0ciAmJiAodGVtcFN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRlbXBTdHIuc2xpY2UoMSkpXG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgaGFuZGxlT3BlblJldmlld01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihSZXZpZXdzQ29udGVudENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7IHJhdGluZ3M6IHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCwgcmV2aWV3czogdGhpcy5hdXRoUmVwbGllcywgbGF0ZXN0UmV2aWV3czogdGhpcy5yYXRpbmdMb29rdXAgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICdyYXRpbmdzLW1vZGFsLWJveCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChfcmVzdWx0OiBhbnkpID0+IHtcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhdGVMb2FkTW9yZS5zdWJzY3JpYmUoKF92YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmxvYWRNb3JlKF92YWx1ZSlcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UubG9hZExhdGVzdFJldmlld3Muc3Vic2NyaWJlKChfdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUxvYWRlciA9IHRydWVcbiAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yYXRpbmdWaWV3Q291bnREZWZhdWx0XG4gICAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cbiAgICAgIHRoaXMucmV2aWV3UGFnZSA9IDFcbiAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGlmIChfdmFsdWUgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxvYWRNb3JlKHNlbGVjdGVkUmV2aWV3OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZUxvYWRNb3JlKSB7XG4gICAgICB0aGlzLmxvb2t1cExvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXG4gICAgICB0aGlzLnJhdGluZ1ZpZXdDb3VudCA9IHRoaXMucmV2aWV3UGFnZSAqIHRoaXMucmV2aWV3RGVmYXVsdExpbWl0XG4gICAgICBpZiAoc2VsZWN0ZWRSZXZpZXcgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxuICAgICAgICB0aGlzLmZldGNoUmF0aW5nTG9va3VwKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgodGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnQpID4gdGhpcy5yYXRpbmdSZXZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJhdGluZ1ZpZXdDb3VudFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlVG9EaXNjdXNzaW9uSHViKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIG1lbnVPcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ2FsbC1kaXNjdXNzaW9ucycsXG4gICAgICAgICAgbGFiZWw6ICdBbGwgZGlzY3Vzc2lvbnMnLFxuICAgICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJvdXRlOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzJyxcbiAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ3RhZ3MnLFxuICAgICAgICAgIGxhYmVsOiAnVGFncycsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGU6ICdteS1kaXNjdXNzaW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1lvdXIgZGlzY3Vzc2lvbicsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgcm91dGU6ICdsZWFkZXJib2FyZCcsXG4gICAgICAgIC8vICAgbGFiZWw6ICdMZWFkZXIgQm9hcmQnLFxuICAgICAgICAvLyAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgLy8gfSxcbiAgICAgIF0sXG4gICAgICB1c2VyTmFtZTogKHRoaXMuY29uZmlnU2VydmljZS5ub2RlYmJVc2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1NlcnZpY2Uubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBpZDogMSxcbiAgICAgIH0sXG4gICAgICBjYXRlZ29yaWVzOiB7IHJlc3VsdDogW10gfSxcbiAgICAgIHJvdXRlclNsdWc6ICcvYXBwJyxcbiAgICAgIGhlYWRlck9wdGlvbnM6IGZhbHNlLFxuICAgICAgYmFubmVyT3B0aW9uOiB0cnVlLFxuICAgIH1cbiAgICB0aGlzLmRpc2N1c3NVdGlsaXR5U3ZjLnNldERpc2N1c3Npb25Db25maWcoY29uZmlnKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdob21lJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSlcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHAvZGlzY3Vzc2lvbi1mb3J1bSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHBhZ2U6ICdob21lJyB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnIH0pXG4gIH1cblxuICBoYW5kbGVDbGlja09mQ2xhaW0oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlQ2xhaW1TZXJ2aWNlLnNldENsYWltRGF0YShldmVudClcbiAgfVxuICBcbiAgZ2V0Q291cnNlSWRGb3JDZXJ0aWZpY2F0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcbiAgICBpZiAodGhpcy5jb250ZW50Py5jb250ZW50SWQ/LmluY2x1ZGVzKCdleHRfJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudElkO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFyYW1JZCB8fCAnJztcbiAgfVxuXG4gIC8vICBoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKSB7XG4gIC8vICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IHRydWU7XG4gIC8vICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZDtcblxuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5wYWdlQ29uZmlnRGF0YSkge1xuICAvLyAgICAgY29uc3QgYWxsb3dlZFByaW1hcnlDYXRlZ29yeSA9XG4gIC8vICAgICAgIHRoaXMucGFnZUNvbmZpZ0RhdGE/LmR5bmFtaWNDZXJ0aWZpY2F0ZUdlbmVyYXRpb24/LmFsbG93cyAmJlxuICAvLyAgICAgICB0aGlzLnBhZ2VDb25maWdEYXRhPy5keW5hbWljQ2VydGlmaWNhdGVHZW5lcmF0aW9uPy5hbGxvd3M/Lm1hcChcbiAgLy8gICAgICAgICAoY2F0OiBzdHJpbmcpID0+IGNhdD8udG9Mb3dlckNhc2UoKVxuICAvLyAgICAgICApO1xuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkgJiZcbiAgLy8gICAgICAoIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkuaW5jbHVkZXModGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpIHx8IFxuICAvLyAgICAgICBhbGxvd2VkUHJpbWFyeUNhdGVnb3J5LmluY2x1ZGVzKHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpKVxuICAvLyAgICAgKSB7XG4gIC8vICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAvLyAgICAgICAgICAgY291cnNlSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAvLyAgICAgICAgICAgYmF0Y2hJZDogdGhpcy5iYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoSWQgfHwgJycsXG4gIC8vICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlclByb2ZpbGUudXNlcklkLFxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgIH07XG4gIC8vICAgICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnRWMihwYXlsb2FkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gIC8vICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgIFxuICAvLyAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XG4gIC8vICAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgLy8gICAgICAgICAgICAgICAgIGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxuICAvLyAgICAgICAgICAgICAgICAgY2VydElkOlxuICAvLyAgICAgICAgICAgICAgICAgICAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWQpIHx8ICcnLFxuICAvLyAgICAgICAgICAgICAgIH0sXG4gIC8vICAgICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKTtcbiAgLy8gICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICAgJ1VuYWJsZSB0byBWaWV3IENlcnRpZmljYXRlLCBkdWUgdG8gc29tZSBlcnJvciEnXG4gIC8vICAgICAgICAgICApO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgKTtcbiAgLy8gICAgIH0gZWxzZSB7ZGVidWdnZXJcbiAgLy8gICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnQoY2VydElkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAvLyAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXVsnY2VydERhdGEnXSA9XG4gIC8vICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VsdC5wcmludFVyaTtcbiAgLy8gICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgLy8gICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICBkYXRhOiB7XG4gIC8vICAgICAgICAgICAgICAgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmksXG4gIC8vICAgICAgICAgICAgICAgY2VydElkOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZCxcbiAgLy8gICAgICAgICAgICAgfSxcbiAgLy8gICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdDRVJUSUZJQ0FURSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpO1xuICAvLyAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICdVbmFibGUgdG8gVmlldyBDZXJ0aWZpY2F0ZSwgcGxlYXNlIGNoZWNrIGFnYWluIGxhdGVyISdcbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICApO1xuICAvLyAgIH1cbiAgLy8gICB9IFxuICAvLyB9XG5cbiAgaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKCkge1xuICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSB0cnVlXG4gICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iaiAmJiAhdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhKSB7XG4gICAgIGlmIChjZXJ0SWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmRvd25sb2FkQ2VydChjZXJ0SWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ11bJ2NlcnREYXRhJ10gPSByZXNwb25zZS5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAgICAgICAgICAgICBkYXRhOiB7IGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIFZpZXcgQ2VydGlmaWNhdGUsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgIGRhdGE6IHsgY2V0OiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoKSB7XG4gICAgdGhpcy50cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2hlY2tWYWxpZEpTT04oc3RyOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZShzdHIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVN1YnNlY3RvcihpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN1YlNlY3RvckRldGFpbEFyciA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvciA9ICcnXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvcklkID0gJydcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc2VjdG9ySWQnXSA9PT0gaXRlbS5zZWN0b3JJZCkge1xuICAgICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgICAgJ3NlY3RvcklkJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3RvcklkJ10sXG4gICAgICAgICAgICAgICdzZWN0b3JOYW1lJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3Rvck5hbWUnXSxcbiAgICAgICAgICAgICAgJ2tleSc6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxW2ldWydzdWJTZWN0b3JOYW1lJ10sXG4gICAgICAgICAgICAgICd2YWx1ZSc6IFt0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIucHVzaChvYmopXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9yID0gaXRlbS5zZWN0b3JOYW1lXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9ySWQgPSBpdGVtLnNlY3RvcklkXG5cblxuICAgICAgY29uc3QgdmFsdWVPYmogPSBpdGVtXG4gICAgICBjb25zdCBzdWJTZWN0b3JBcnJheSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgICBpZiAodmFsdWVPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wT2JqOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wT2JqWyd2YWx1ZSddID0gdmFsdWVPYmpba2V5XVxuICAgICAgICAgIHN1YlNlY3RvckFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RyaXBbJ3NlY3RvcldpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29tcGV0ZW5jaWVzVG9XaWRnZXQoJ0JlaGF2aW91cmFsJywgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIsIHRoaXMuc3RyaXApXG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0JC51bnN1YnNjcmliZSgpXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcbiAgICBpZih0aGlzLnJlZnJlc2hyYXRpbmdTdWIpe1xuICAgICAgdGhpcy5yZWZyZXNocmF0aW5nU3ViLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlICNjZXJ0aWZpY2F0ZUNhcmQ+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2NrQ2VydGlmaWNhdGU7IGVsc2UgY2VydGlmaWNhdGVMb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtb3V0ZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgY2VydGlmaWNhdGUtaW5mbyBwLTQgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzIwMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMjRweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBmb250LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIHRydW5jYXRlLTNcIj57eyBjb250ZW50Py5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1saWdodFwiICpuZ0lmPVwiY29udGVudD8uY29tcGxldGVkT25cIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wbGV0ZWRDb3Vyc2UnIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnQ/LmNvbXBsZXRlZE9uID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWxpZ2h0XCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0ZWRPblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdTdGFuZGFsb25lIEFzc2Vzc21lbnQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZEFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlIH19IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LmNvbXBsZXRlZE9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LmNvbXBsZXRlZE9uIHwgZGF0ZTogJ2QgTU1NLCB5JykgOiAnTkEnIH19PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSAnUHJvZ3JhbSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGxldGVkUHJvZ3JhbScgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY29tcGxldGVkT24gP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZENvdXJzZScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uY29tcGxldGVkT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGRvd25sb2FkLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbYmluZGluZ0NsYXNzXT1cIidmbGV4IHJvdW5kZWQnXCIgW3dpZHRoXT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMjRweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBjdXJzb3ItcG9pbnRlciBcIiAqbmdJZj1cIiFkb3dubG9hZENlcnRpZmljYXRlQm9vbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZU9wZW5DZXJ0aWZpY2F0ZURpYWxvZygpXCI+YXJyb3dfZG93bndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIiBzdHJva2VXaWR0aD1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaWFtZXRlcl09XCIyMFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzI4MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGVpZ2h0XT1cIicxNDhweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGVfYm94XCIgKm5nSWY9XCIhY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiFmcm9tTWFya2V0UGxhY2VcIiBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cIk5vIGNlcnRpZmljYXRlIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJmcm9tTWFya2V0UGxhY2VcIiBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS1tYXJrZXQtcGxhY2Uuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJObyBjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY2VydGlmaWNhdGVfb3ZlcmxheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHRleHQtY2VudGVyIGdhcC0xIHAtNCB0ZXh0LXdoaXRlIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eydhcHB0b2Nob21lLmNlcnRpZmljYXRpb25UYWtlc1RpbWUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj57eydhcHB0b2Nob21lLmlzc3VlUGVyc2lzdHNNYWlsdXMnIHwgdHJhbnNsYXRlIH19IG1pc3Npb24ua2FybWF5b2dpQGdvdi5pbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eydhcHB0b2Nob21lLmlzc3VlUGVyc2lzdHNNYWlsdXMnIHwgdHJhbnNsYXRlIH19IDxhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj1cIm1haWx0bzptaXNzaW9uLmthcm1heW9naUBnb3YuaW5cIiBjbGFzcz1cImVtYWlsRGVmYXVsdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb24ua2FybWF5b2dpQGdvdi5pbjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uY2VydElkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1nLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjZWxlYnJhdGlvbi1hbmltYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaW1hZ2VzL2FuaW1hdGlvbi9sZWFkZXJib2FyZF9hbmltYXRpb24uZ2lmXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZyb21NYXJrZXRQbGFjZVwiIGNsYXNzPVwiY2VyaXRpZmljYXRlLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUuc3ZnJ1wiIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZnJvbU1hcmtldFBsYWNlXCIgY2xhc3M9XCJjZXJpdGlmaWNhdGUtaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cIicvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS1tYXJrZXQtcGxhY2Uuc3ZnJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cImNlcnRpZmljYXRlIGltYWdlXCIgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd2aWV3LWNlcnRpZmljYXRlJzogZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wsICd2aWV3LWNlcnQnOiAhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2x9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2Njb250ZW50Y2FyZC52aWV3Q2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVCb29sXCIgY2xhc3M9XCJ1cGxvYWRlci1zdGF0dXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnREYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY2VsZWJyYXRpb24tYW5pbWF0aW9uXCIgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmltYXRpb24vbGVhZGVyYm9hcmRfYW5pbWF0aW9uLmdpZlwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJjZXJpdGlmaWNhdGUtaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnREYXRhIHwgcGlwZVNhZmVTYW5pdGl6ZXI6ICd1cmwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTMgY2hpcHMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJUaGVtZSBvZiBjb250ZW50UmVhZERhdGE/LnN1YlRoZW1lOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcCByb3VuZGVkLWZ1bGwgcC0yIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaGlkZGVuJzogKGogPiAxICYmICFjb250ZW50Py52aWV3TW9yZSksICdjaGlwLWVsbGlwc2lzJzogIWNvbnRlbnQ/LnZpZXdNb3JlICYmIGNvbnRlbnQ/LnN1YlRoZW1lPy5sZW5ndGggPiAxIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJzdWJUaGVtZVwiPnt7IHN1YlRoZW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1wcmltYXJ5IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudD8uc3ViVGhlbWU/Lmxlbmd0aCA+IDIgJiYgIWNvbnRlbnQ/LnZpZXdNb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb250ZW50LnZpZXdNb3JlID0gIWNvbnRlbnQudmlld01vcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2NvbXBldGVuY3lDYXJkRGV0YWlscy52aWV3TW9yZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtcHJpbWFyeSB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnZpZXdNb3JlXCIgKGNsaWNrKT1cImNvbnRlbnQudmlld01vcmUgPSAhY29udGVudC52aWV3TW9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snY29tcGV0ZW5jeUNhcmREZXRhaWxzLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2NlcnRpZmljYXRlTG9jaz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1vdXRlci1kaXYgbG9ja2VkLWNlcnRpZmljYXRlLW91dGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1sb2NrIHAtNCBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBjZXJ0aWZpY2F0ZS1sb2NrLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2MuY2VydGlmaWNhdGVMb2NrZWQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgZmxleC1jb2wgcC00IGdhcC0yIGxvY2tpbmctc2NyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvbG9ja193aHQuc3ZnXCIgYWx0PVwibG9jayBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGVMb2NrZWRUZXh0IHBiLTJcIj57eydhcHB0b2MuY2VydGlmaWNhdGVMb2NrZWRNZXNzYWdlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2tpbmctc2NyZWVuLWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snYXBwdG9jLnVubG9ja0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZX19IDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5Rm9ybWVUZXh0XCI+e3snYXBwdG9jLnN1cnZleUZvcm0nIHwgdHJhbnNsYXRlfX08L3NwYW4+IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcHRvYy51bmxvY2tDZXJ0aWZpY2F0ZTInIHwgdHJhbnNsYXRlIDogeyBjb3Vyc2VDYXRlZ29yeTogY29udGVudD8uY291cnNlQ2F0ZWdvcnkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5IDogY29udGVudD8ucHJpbWFyeUNhdGVnb3J5IH0gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJzdXJ2ZXlGb3JtZUJ1dHRvbiBweC03XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblN1cnZleUZvcm1Qb3B1cCgpXCI+e3snYXBwdG9jLmNvbXBsZXRlU3VydmV5Tm93JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbXBldGVuY3lMYWJlbD5cbiAgICA8ZGl2IGNsYXNzPVwicHQtbXdlYi00IG1hdC1zdWJoZWFkaW5nLTEgZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGV0ZW5jaWVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgd3MtbWF0LWJsYWNrNjAtdGV4dCBpbmZvLWljb24gbWF0LWljb24gbm90cmFuc2xhdGUgbWF0ZXJpYWwtaWNvbnMgbWF0LWljb24tbm8tY29sb3JcIlxuICAgICAgICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYmVsb3cnXCIgI3Rvb2x0aXA9XCJtYXRUb29sdGlwXCIgKGNsaWNrKT1cInRvb2x0aXAudG9nZ2xlKClcIlxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBldGVuY2llc1Rvb2x0aXAnIHwgdHJhbnNsYXRlIH19XCI+aW5mb19vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtdC00XCIgW25nQ2xhc3NdPVwiaXNNb2JpbGUgPyAnbXgtNCcgOiAnJ1wiXG4gICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnJldGlyZW1lbnREYXRlICYmIGNvbnRlbnRSZWFkRGF0YT8ubGFzdEVucm9sbG1lbnREYXRlXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1yZXRpcmUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyByZXRpcmUtaW5mby1pY29uXCI+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keS0xXCI+VGhpcyBjb3Vyc2UgaXMgc2NoZWR1bGVkIGZvciByZXRpcmVtZW50LiBUaGUgbGFzdCBkYXRlIHRvIGVucm9sbCBpc1xuICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5sYXN0RW5yb2xsbWVudERhdGUgfCBkYXRlOiAnTU1NTSBkLCB5J319LCBhbmRcbiAgICAgICAgICAgICAgICB0aGUgY291cnNlIHdpbGwgYmUgcmV0aXJlZCBvbiB7e2NvbnRlbnRSZWFkRGF0YT8ucmV0aXJlbWVudERhdGUgfCBkYXRlOiAnTU1NTSBkLCB5J319LlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBtdC00IG14LTQgYmxvY2tcIiAqbmdJZj1cImlzTW9iaWxlICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudFZlcnNpb25JbmZvPy5pZGVudGlmaWVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgIGN1cnNvci1wb2ludGVyIHN3aXRjaC12ZXJzaW9uXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIlxuICAgICAgICAoa2V5ZG93bik9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLXN3aXRjaFwiPnt7ICdhcHB0b2Muc3dpdGNoVG9OZXdWZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIG15LTQgcHgtNFwiIFtjbGFzcy5tdDYwXT1cInN0aWNreVwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJycgOiAnZ2FwLTEwJ1wiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCIoY29udGVudD8uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uY2VydElkKSAmJiAhZnJvbU1hcmtldFBsYWNlICYmICFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNvbnRhaW5lclwiICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBlYXJuZWQtY2VydGlmaWNhdGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1iYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jZXJ0aWZpY2F0ZUVhcm5lZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1iYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VydGlmaWNhdGVDYXJkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dNYXJrZXRQbGFjZUNlcnRpZmljYXRlICYmIGZyb21NYXJrZXRQbGFjZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWRpc2FibGVDZXJ0aWZpY2F0ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWJib25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtYmFja2dyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY2VydGlmaWNhdGVFYXJuZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VydGlmaWNhdGVDYXJkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2VydGlmaWNhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY2VydGlmaWNhdGVFYXJuZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtYmFja2dyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbaGVpZ2h0XT1cIicxNDhweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZnJvbVZpZXdlciB8fCByb3V0ZXIudXJsLmluY2x1ZGVzKCcvdmlld2VyL3BkZi9kb18nKVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBtdC0yXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmb250LXNlbWlib2xkIHRleHQtYmFzZVwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8ubmFtZSkgfX0gPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRleHQgYnJlYWstd29yZHMgdGV4dC1zbSBub2R0cmFuc2xhdGVcIj57eyAnY2FyZGNvbnRlbnR2Mi5ieScgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgICBjb250ZW50Py5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMganVzdGlmeS1hcm91bmQgaGlkZUFib3ZlMTIwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmN1cnJlbnRCYXRjaFNpemUgfHxcbiAgICAgICAgICAgICAgICAgICAgJzAnIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy5iYXRjaFNpemUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py50b3RhbEFwcGxpZWQgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy50b3RhbEFwcGxpZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsRW5yb2xsZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZXIuZGF5cyA+PSAwICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNiBteS01IGJhdGNoLXRpbWVyIGhpZGVBYm92ZTEyMDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5iYXRjaFN0YXJ0c0luJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLmRheXMgfHwgMCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmhvdXJzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLm1pbiA9PT0gNjAgPyAwMCA6IHRpbWVyLm1pbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm1pbnV0ZXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiZnJvbVZpZXdlciB8fCBpc01vYmlsZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2MHB4J1wiIFtoZWlnaHRdPVwiJzYwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2MHB4J1wiIFtoZWlnaHRdPVwiJzYwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2MHB4J1wiIFtoZWlnaHRdPVwiJzYwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZyb21NYXJrZXRQbGFjZVwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC10b2Mta3BpLXZhbHVlcyBbY29udGVudF09XCJjb250ZW50XCIgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIiBbaXNNb2JpbGVdPVwiaXNNb2JpbGVcIlxuICAgICAgICAgICAgICAgIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCIgW2Jhc2VDb250ZW50UmVhZERhdGFdPVwiYmFzZUNvbnRlbnRSZWFkRGF0YVwiXG4gICAgICAgICAgICAgICAgW2xhbmd1YWdlTGlzdF09XCJsYW5ndWFnZUxpc3RcIj48L3dzLXdpZGdldC10b2Mta3BpLXZhbHVlcz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzk1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2ICpuZ0lmPVwiY29udGVudD8uY29udGVudElkICYmIGNvbnRlbnQ/LmNvbnRlbnRJZC5pbmNsdWRlcygnZXh0XycpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIShjb250ZW50Py5jb250ZW50SWQgJiYgY29udGVudD8uY29udGVudElkLmluY2x1ZGVzKCdleHRfJykpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnN1bW1hcnknIHwgdHJhbnNsYXRlIH19PC9kaXY+IC0tPlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogc3VtbWFyeS5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBzdW1tYXJ5LmVsbGlwc2lzICYmICFpc01vYmlsZX1cIlxuICAgICAgICAgICAgICAgICNzdW1tYXJ5RWxlbT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRleHQgbm9kdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2lubmVySHRtbF09XCJoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnRSZWFkRGF0YT8uZGVzY3JpcHRpb24gfCByZXBsYWNlTmJzcClcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwic3VtbWFyeS52aWV3TGVzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdW1tYXJ5LmVsbGlwc2lzID0gIXN1bW1hcnkuZWxsaXBzaXM7IHN1bW1hcnkudmlld0xlc3MgPSAhc3VtbWFyeS52aWV3TGVzc1wiPiZuYnNwO3t7XG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwic3VtbWFyeS5lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3VtbWFyeS5lbGxpcHNpcyA9ICFzdW1tYXJ5LmVsbGlwc2lzOyBzdW1tYXJ5LnZpZXdMZXNzID0gIXN1bW1hcnkudmlld0xlc3NcIj57e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5pbnN0cnVjdGlvbnMgfHwgY29udGVudFJlYWREYXRhPy5wdXJwb3NlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MHB4J1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubGVhcm5pbmdPdXRjb21lJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiAhaXNNb2JpbGV9XCJcbiAgICAgICAgICAgICAgICAjZGVzY0VsZW0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiY29udGVudFJlYWREYXRhPy5pbnN0cnVjdGlvbnMgfHwgY29udGVudFJlYWREYXRhPy5wdXJwb3NlIHwgcmVwbGFjZU5ic3BcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1vYi10ZXh0IGJyZWFrLXdvcmRzIG5vZHRyYW5zbGF0ZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCBjdXJzb3ItcG9pbnRlciB0ZXh0LXNtXCIgKm5nSWY9XCJkZXNjcmlwdGlvbi52aWV3TGVzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCB0ZXh0LXNtXCIgKm5nSWY9XCJkZXNjcmlwdGlvbi5lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzY3JpcHRpb24uZWxsaXBzaXMgPSAhZGVzY3JpcHRpb24uZWxsaXBzaXM7IGRlc2NyaXB0aW9uLnZpZXdMZXNzID0gIWRlc2NyaXB0aW9uLnZpZXdMZXNzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cImNvbnRlbnQ/Lm9iamVjdGl2ZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzY1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBmb250LWJvbGQgcHQtbXdlYi04IG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmxlYXJuaW5nT3V0Y29tZScgfFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBvYmplY3RpdmVzLmVsbGlwc2lzICYmIGlzTW9iaWxlLCAnZGVzYy1lbGxpcHNpcyc6IG9iamVjdGl2ZXMuZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXG4gICAgICAgICAgICAgICAgI29iamVjdGl2ZXNFbGVtPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibW9iLXRleHQgbm9kdHJhbnNsYXRlXCIgW2lubmVySHRtbF09XCJoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/Lm9iamVjdGl2ZXMpXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCBjdXJzb3ItcG9pbnRlciB0ZXh0LXNtXCIgKm5nSWY9XCJvYmplY3RpdmVzLnZpZXdMZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9iamVjdGl2ZXMuZWxsaXBzaXMgPSAhb2JqZWN0aXZlcy5lbGxpcHNpczsgb2JqZWN0aXZlcy52aWV3TGVzcyA9ICFvYmplY3RpdmVzLnZpZXdMZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO3t7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwib2JqZWN0aXZlcy5lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib2JqZWN0aXZlcy5lbGxpcHNpcyA9ICFvYmplY3RpdmVzLmVsbGlwc2lzOyBvYmplY3RpdmVzLnZpZXdMZXNzID0gIW9iamVjdGl2ZXMudmlld0xlc3NcIj57e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zdW1tYXJ5ICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudElkICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudElkLmluY2x1ZGVzKCdleHRfJylcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzY1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zdW1tYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iLWRlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBkZXNjcmlwdGlvbi5lbGxpcHNpcyAmJiAhaXNNb2JpbGV9XCJcbiAgICAgICAgICAgICAgICAjZGVzY0VsZW0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IFtpbm5lckhUTUxdPVwiY29udGVudFJlYWREYXRhPy5zdW1tYXJ5IHwgcmVwbGFjZU5ic3BcIiBjbGFzcz1cIm1vYi10ZXh0IGJyZWFrLXdvcmRzIG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCBjdXJzb3ItcG9pbnRlciB0ZXh0LXNtXCIgKm5nSWY9XCJkZXNjcmlwdGlvbi52aWV3TGVzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZXNjcmlwdGlvbi5lbGxpcHNpcyA9ICFkZXNjcmlwdGlvbi5lbGxpcHNpczsgZGVzY3JpcHRpb24udmlld0xlc3MgPSAhZGVzY3JpcHRpb24udmlld0xlc3NcIj5cbiAgICAgICAgICAgICAgICAgICAgJm5ic3A7e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGZvbnQtYm9sZCB0ZXh0LXNtXCIgKm5nSWY9XCJkZXNjcmlwdGlvbi5lbGxpcHNpc1wiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzY3JpcHRpb24uZWxsaXBzaXMgPSAhZGVzY3JpcHRpb24uZWxsaXBzaXM7IGRlc2NyaXB0aW9uLnZpZXdMZXNzID0gIWRlc2NyaXB0aW9uLnZpZXdMZXNzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyMHB4J1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMl1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzI1MHB4J1wiIFtoZWlnaHRdPVwiJzgwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyNTBweCdcIiBbaGVpZ2h0XT1cIic4MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXN0cmlwPy5sb2FkZXJXaWRnZXRzPy5sZW5ndGggfHwgIWNvbXBldGVuY2llc09iamVjdFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbXBldGVuY3lMYWJlbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLm5vQ29tcGV0ZW5jeUZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RyaXA/LmxvYWRlcldpZGdldHM/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wZXRlbmN5TGFiZWxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMyBzbTpnYXAtNCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jaWVzT2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWVzLWJ1dHRvblwiIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogY29tcGV0ZW5jeVNlbGVjdGVkID09PSBpdGVtLmtleX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTaG93Q29tcGV0ZW5jaWVzKGl0ZW0sICdzZWxlY3RlZCcpXCI+e3sgaXRlbS5rZXkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb21wZXRlbmNpZXNPYmplY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmtleSA9PT0gY29tcGV0ZW5jeVNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12MiBbbG9hZFN0YXR1c109XCInZG9uZSdcIiBbc3RyaXBDb25maWddPVwic3RyaXAuc3RyaXBDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygc3RyaXA/LmxvYWRlcldpZGdldHM7IHRyYWNrQnk6IHRyYWNrZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy11dGlscy1ob3Jpem9udGFsLXNjcm9sbGVyLXYyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8IS0tIHt7Y29udGVudHxqc29ufX0gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmtleXdvcmRzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFnc0xpc3RcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRhZ0RhdGE6IGNvbnRlbnRSZWFkRGF0YT8ua2V5d29yZHMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3M/Lmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzPy5sZW5ndGhcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJ0YWdzTGlzdFwiXG4gICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgdGFnRGF0YTogY29udGVudD8uc2VhcmNoVGFncz8uc2xpY2UoMSxjb250ZW50Py5zZWFyY2hUYWdzPy5sZW5ndGgpIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighc2tlbGV0b25Mb2FkZXIgJiYgc2VjdG9yc0xpc3Q/Lmxlbmd0aCkgJiYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeT8udG9Mb3dlckNhc2UoKSA9PT0gJ2xlYXJuaW5nIHJlc291cmNlJyB8fFxuICAgIGNvbnRlbnQ/LnJlc291cmNlQ2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdjYXNlIHN0dWR5JylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICdneWFhbkthcm1heW9naS5zZWN0b3JzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlY3RvcnNMaXN0Py5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMgc206Z2FwLTQgbWItMyBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3RvciBvZiBzZWN0b3JzTGlzdDsgbGV0IGkgPSBpbmRleDsgbGV0IGlzTGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogY29tcGV0ZW5jeVNlbGVjdGVkID09PSBpdGVtLmtleX1cIi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aGVtZXMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd0aGVtZS1hY3RpdmF0ZWQnOiBzZWxlY3RlZFNlY3RvcklkID09PSBzZWN0b3I/LnNlY3RvcklkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVTdWJzZWN0b3Ioc2VjdG9yLCAnc2VsZWN0ZWQnKVwiPnt7IHNlY3Rvcj8uc2VjdG9yTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RyaXA/LnNlY3RvcldpZGdldHM/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12MiBbbG9hZFN0YXR1c109XCInZG9uZSdcIiBbc3RyaXBDb25maWddPVwic3RyaXAuc3RyaXBDb25maWdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2lkZ2V0IG9mIHN0cmlwPy5zZWN0b3JXaWRnZXRzOyB0cmFja0J5OiB0cmFja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtzYlVpUmVzb2x2ZXJXaWRnZXRdPVwid2lkZ2V0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12Mj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwPy5zZWN0b3JXaWRnZXRzPy5sZW5ndGggPT09IDAgJiYgc2VsZWN0ZWRTZWN0b3JJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyBTdWJzZWN0b3IgQXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlY3RvciBvZiBzZWN0b3JzTGlzdDsgbGV0IGkgPSBpbmRleDsgbGV0IGlzTGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbW9iLXRleHRcIiA+e3sgc2VjdG9yPy5zZWN0b3JOYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiIWlzTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBzdWJTZWN0b3JzTGlzdD8ubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnZ3lhYW5LYXJtYXlvZ2kuc3ViU2VjdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0b3Igb2Ygc3ViU2VjdG9yc0xpc3Q7IGxldCBpID0gaW5kZXg7IGxldCBpc0xhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCIgPnt7IHNlY3Rvcj8uc3ViU2VjdG9yTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cIiFpc0xhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICA8bmctdGVtcGxhdGUgI3RhZ3NMaXN0IGxldC10YWdEYXRhPVwidGFnRGF0YVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwidGFnRGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAndXNlclByb2ZpbGUudGFncycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWdEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiBbbmdDbGFzc109XCJ7J3RhZ3MtZWxsaXBzaXMnOiB0YWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc31cIlxuICAgICAgICAgICAgICAgICAgICAjdGFnc0VsZW0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRhZyBvZiB0YWdEYXRhOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiPnt7IGhhbmRsZUNhcGl0YWxpemUodGFnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJ0YWdEYXRhPy5sZW5ndGggPiAoaSArIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHdzLW1hdC1kZWZhdWx0LXRleHQgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzXCIgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgd3MtbWF0LWRlZmF1bHQtdGV4dCB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14cyBtdC0xXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ2aWV3TW9yZVRhZ3NcIiAoY2xpY2spPVwidmlld01vcmVUYWdzID0gIXZpZXdNb3JlVGFnc1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiAqbmdJZj1cIiF0YWdEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICB7eyAndXNlclByb2ZpbGUubm9UYWdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudD8uc2VhcmNoVGFnc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xXCI+e3sgJ3VzZXJQcm9maWxlLnRhZ3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiBbbmdDbGFzc109XCJ7J3RhZ3MtZWxsaXBzaXMnOiBzZWFyY2hUYWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc31cIiAjc2VhcmNoVGFnRWxlbT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFnIG9mIGNvbnRlbnQ/LnNlYXJjaFRhZ3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCIgPnt7IGhhbmRsZUNhcGl0YWxpemUodGFnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzLmxlbmd0aCA+IChpICsgMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgd3MtbWF0LWRlZmF1bHQtdGV4dCB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiICpuZ0lmPVwic2VhcmNoVGFnc0VsbGlwc2lzICYmICF2aWV3TW9yZVRhZ3NcIiAoY2xpY2spPVwidmlld01vcmVUYWdzID0gIXZpZXdNb3JlVGFnc1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzIG10LTFcIiAqbmdJZj1cInZpZXdNb3JlVGFnc1wiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgKm5nSWY9XCIhY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICB7eyAndXNlclByb2ZpbGUubm9UYWdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPiAtLT5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUta2FybWEtcG9pbnRzXCI+XG4gICAgICAgIDx3cy13aWRnZXQta2FybWEtcG9pbnRzIFtjb250ZW50XT1cImNvbnRlbnRcIiBbYnRuQ2F0ZWdvcnldPVwiXCIgW2NvbmRpdGlvbl09XCJjb25kaXRpb25cIlxuICAgICAgICAgICAgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJoYW5kbGVDbGlja09mQ2xhaW0oJGV2ZW50KVwiIFtkYXRhXT1cImtwYXJyYXlcIj5cbiAgICAgICAgPC93cy13aWRnZXQta2FybWEtcG9pbnRzPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic3MnB4J1wiXG4gICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFmb3JQcmV2aWV3XCI+XG4gICAgICAgIDwhLS0gY29tbWVudGVkIGJlY2F1c2Ugb2YgbmV3IGRpc2N1c3Npb24gdjIgY29tbWVudHMgaW1wbG1lbnRhdGlvbiAtLT5cbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZGlzY3Vzc2lvbi1kaXZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgZm9ydW0tY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC01IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Zm9ydW08L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGlvbi10ZXh0IHNtOnByLTRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hbnlTdWdnZXN0aW9ucycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtbm9uZSBwLTNcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiIChjbGljayk9XCJuYXZpZ2F0ZVRvRGlzY3Vzc2lvbkh1YigpXCI+e3sgJ2Rpc2N1c3Muc3RhcnREaXNjdXNzJyB8IHRyYW5zbGF0ZSB9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PiAtLT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIiAqbmdGb3I9XCJsZXQgaSBvZiBbMSwgMl1cIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcycHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM2cHgnXCIgW2hlaWdodF09XCInMzZweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZC1mdWxsJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjRweCdcIiBbaGVpZ2h0XT1cIicxMnB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZnJvbU1hcmtldFBsYWNlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGdhcC0zXCIgW25nQ2xhc3NdPVwieydoaWRlQWJvdmUxMjAwJzogIXJvdXRlci51cmwuaW5jbHVkZXMoJy92aWV3ZXIvJyl9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcnNBbmRDdXJhdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGhvdG9VcmxdPVwiYXV0aG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiYXV0aG9yLm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUudG9Mb3dlckNhc2UoKSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zIG1vYi10ZXh0XCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNyZWF0b3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JDb250YWN0cylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwaG90b1VybF09XCJjcmVhdG9yLnBob3RvIHx8ICcnXCIgW25hbWVdPVwiY3JlYXRvci5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlYXRvcj8ubmFtZS50b0xvd2VyQ2FzZSgpLCAnbmFtZScpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTMgbW9iLXRleHRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jdXJhdG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiIFtuZ0NsYXNzXT1cInsnaGlkZUFib3ZlMTIwMCc6ICFyb3V0ZXIudXJsLmluY2x1ZGVzKCcvdmlld2VyLycpfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm92aWRlci1sb2dvLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiY29udGVudD8uY3JlYXRvckxvZ29cIiBbc3JjXT1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhY29udGVudD8uY3JlYXRvckxvZ29cIiBzcmM9XCIvYXNzZXRzL2luc3RhbmNlcy9lYWdsZS9hcHBfbG9nb3MvS2FybWF5b2dpQmhhcmF0X0xvZ28uc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gYnJlYWstYWxsXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5zb3VyY2UsICdzb3VyY2UnKSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic0MDBweCdcIlxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nXCI+IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCByYXRpbmdzLWRpdiBnYXAtMTBcIiBpZD1cInJhdGluZ3NEaXZcIiAqbmdJZj1cInNob3dSZXZpZXdzXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXJhdGluZy1zdW1tYXJ5IFtyYXRpbmdTdW1tYXJ5XT1cInJhdGluZ1N1bW1hcnlQcm9jZXNzZWRcIj48L3dzLXdpZGdldC1yYXRpbmctc3VtbWFyeT5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIG1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCIgaWQ9XCJyZXZpZXdDb250YWluZXJcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2UudG9wUmV2aWV3cycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJhdGluZ1N1bW1hcnlQcm9jZXNzZWQ/LmF2Z1JhdGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiaGFuZGxlT3BlblJldmlld01vZGFsKClcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtc2cuc2hvd0FsbCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvcFJhdGluZ1Jldmlld3MgJiYgdG9wUmF0aW5nUmV2aWV3cz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC01XCIgW25nQ2xhc3NdPVwiaXNNb2JpbGUgPyAnaG9yaXpvbnRhbC1zdHJpcCcgOiAnZmxleC13cmFwJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbW1lbnQtZGl2XCIgKm5nRm9yPVwibGV0IGVhY2hSZXZpZXcgb2YgdG9wUmF0aW5nUmV2aWV3cyB8IHNsaWNlOjA6NDsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTQgZmxleCBmbGV4LWNvbCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxlZnQgZGVzYy1lbGxpcHNpc1wiIHRpdGxlPVwie3sgZWFjaFJldmlldz8ucmV2aWV3IH19XCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShlYWNoUmV2aWV3Py5yZXZpZXcpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yIHJhdGluZy1zdGFydC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5zdGFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGVhY2hSZXZpZXc/LnJhdGluZyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiBpdGVtcy1jZW50ZXIgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGhvdG9VcmxdPVwiZWFjaFJldmlldz8ucGhvdG8gfHwgJydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImVhY2hSZXZpZXc/LmZpcnN0TmFtZVwiPjwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgaGFuZGxlQ2FwaXRhbGl6ZShlYWNoUmV2aWV3Py5maXJzdE5hbWUudG9Mb3dlckNhc2UoKSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgZWFjaFJldmlldz8uZGF0ZSB8IHBpcGVSZWxhdGl2ZVRpbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRvcFJhdGluZ1Jldmlld3MgfHwgIXRvcFJhdGluZ1Jldmlld3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB0ZXh0LWNlbnRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYmctd2hpdGUgcC00IHJvdW5kZWQtbWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm5vUmV2aWV3c0ZvdW5kJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zIGp1c3RpZnktY2VudGVyIHJhdGluZ3MtZGl2XCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL3RvYy9uby1jZXJ0aWZpY2F0ZS5zdmdcIiBhbHQ9XCJubyByYXRpbmdzIGltYWdlXCIgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZyBmb250LWJvbFwiPkJlIHRoZSBmaXJzdCBvbmUgdG8gcmF0ZSB0aGlzIGNvdXJzZSBhbmQgeW91ciA8YnIvPiBsZWFybmluZyBleHBlcmllbmNlPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9kaXY+Il19
|
|
946
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1hYm91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvdG9jL3NyYy9saWIvX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9hcHAtdG9jLWFib3V0L2FwcC10b2MtYWJvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1hYm91dC9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFzRCxTQUFTLEVBQWMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFJakssT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM5QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFMUMsMkJBQTJCO0FBQzNCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQTtBQUd6QixPQUFPLGNBQWMsTUFBTSw2QkFBNkIsQ0FBQTtBQUN4RCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUd0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFZdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOENBQThDLENBQUE7QUFDdEYsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sdURBQXVELENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBbkJsRyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQzVCLEtBQUss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QUFnQjtzQkFBeEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLDBCQUEwQjtzQkFBbEMsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQUNtQixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0ssY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ0osUUFBUTtzQkFBOUIsU0FBUzt1QkFBQyxVQUFVO2dCQUNFLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDTyxhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc1NhbWVPckFmdGVyKVxuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSdcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyJ1xuXG5pbXBvcnQgeyBOc1dpZGdldFJlc29sdmVyIH0gZnJvbSAnQHN1bmJpcmQtY2IvcmVzb2x2ZXItdjInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSwgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFRpbWVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3RpbWVyLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi9jb250ZW50LXNlcnZpY2VzL2hhbmRsZS1jbGFpbS5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJldmlld0NvbXBvbmVudERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vY29udGVudC1zZXJ2aWNlcy9yZXZpZXctY29tcG9uZW50LWRhdGEuc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5pbXBvcnQgeyBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLm1vZGVsJ1xuaW1wb3J0IHsgRGlzY3Vzc1V0aWxzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2Rpc2N1c3MtdXRpbHMuc2VydmljZSdcblxuaW1wb3J0IHsgUmV2aWV3c0NvbnRlbnRDb21wb25lbnQgfSBmcm9tICcuLi9yZXZpZXdzLWNvbnRlbnQvcmV2aWV3cy1jb250ZW50LmNvbXBvbmVudCdcbmltcG9ydCB7IENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY2VydGlmaWNhdGUtZGlhbG9nL2NlcnRpZmljYXRlLWRpYWxvZy5jb21wb25lbnQnXG5cbmludGVyZmFjZSBJU3RyaXBVbml0Q29udGVudERhdGEge1xuICBrZXk6IHN0cmluZ1xuICBjYW5IaWRlU3RyaXA6IGJvb2xlYW5cbiAgbW9kZT86IHN0cmluZ1xuICBzaG93U3RyaXA6IGJvb2xlYW5cbiAgd2lkZ2V0cz86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhW11cbiAgc3RyaXBUaXRsZTogc3RyaW5nXG4gIHN0cmlwVGl0bGVMaW5rPzoge1xuICAgIGxpbms6IHN0cmluZyxcbiAgICBpY29uOiBzdHJpbmdcbiAgfSxcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgfSxcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYltdIHwgdW5kZWZpbmVkLFxuICBzdHJpcE5hbWU/OiBzdHJpbmdcbiAgc3RyaXBMb2dvPzogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIHN0cmlwSW5mbz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSVN0cmlwSW5mb1xuICBub0RhdGFXaWRnZXQ/OiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YVxuICBlcnJvcldpZGdldD86IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhBbnlEYXRhXG4gIHNob3dPbk5vRGF0YTogYm9vbGVhblxuICBzaG93T25Mb2FkZXI6IGJvb2xlYW5cbiAgc2hvd09uRXJyb3I6IGJvb2xlYW5cbiAgbG9hZGVyV2lkZ2V0cz86IGFueVxuICBzdHJpcEJhY2tncm91bmQ/OiBzdHJpbmdcbiAgc2Vjb25kYXJ5SGVhZGluZz86IGFueVxuICB2aWV3TW9yZVVybDogYW55LFxuICBzZWN0b3JXaWRnZXRzPzogYW55XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLXdpZGdldC1hcHAtdG9jLWFib3V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b2MtYWJvdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWFib3V0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuXG5leHBvcnQgY2xhc3MgQXBwVG9jQWJvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBcbiAgQElucHV0KCkgY29uZGl0aW9uOiBhbnlcbiAgQElucHV0KCkga3BhcnJheTogYW55XG4gIEBJbnB1dCgpIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIGNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICBASW5wdXQoKSBzdGlja3kgPSBmYWxzZVxuICBASW5wdXQoKSB0b2NTdHJ1Y3R1cmU6IGFueVxuICBASW5wdXQoKSBwYXRoU2V0OiBhbnlcbiAgQElucHV0KCkgY29uZmlnOiBhbnlcbiAgQElucHV0KCkgcmVzdW1lRGF0YTogYW55XG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxuICBASW5wdXQoKSBzaG93UmV2aWV3cyA9IGZhbHNlXG4gIEBJbnB1dCgpIGJhdGNoRGF0YTogYW55XG4gIEBJbnB1dCgpIGZyb21WaWV3ZXIgPSBmYWxzZVxuICBASW5wdXQoKSBzZWxlY3RlZEJhdGNoRGF0YTogYW55XG4gIEBJbnB1dCgpIHNlbGVjdGVkVGFiVmFsdWUgPSAwXG4gIEBJbnB1dCgpIGZyb21NYXJrZXRQbGFjZT8gPSBmYWxzZVxuICBASW5wdXQoKSBzaG93TWFya2V0UGxhY2VDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBJbnB1dCgpIGxhbmd1YWdlTGlzdCA9IFtdXG4gIEBJbnB1dCgpIGxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gIEBPdXRwdXQoKSB0cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKVxuICBAVmlld0NoaWxkKCdzdW1tYXJ5RWxlbScpIHN1bW1hcnlFbGVtICE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnb2JqZWN0aXZlc0VsZW0nKSBvYmplY3RpdmVzRWxlbSAhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2Rlc2NFbGVtJykgZGVzY0VsZW0gITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCd0YWdzRWxlbScpIHRhZ3NFbGVtICE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnc2VhcmNoVGFnRWxlbScpIHNlYXJjaFRhZ0VsZW0gITogRWxlbWVudFJlZlxuICBkaXNhYmxlQ2VydGlmaWNhdGUgPSBmYWxzZVxuICBpc0V4dGVybmFsQ29udGVudCA9IGZhbHNlXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHN0cmlwc1Jlc3VsdERhdGFNYXAhOiB7IFtrZXk6IHN0cmluZ106IElTdHJpcFVuaXRDb250ZW50RGF0YSB9XG4gIHN1bW1hcnkgPSB7XG4gICAgZWxsaXBzaXM6IGZhbHNlLFxuICAgIHZpZXdMZXNzOiBmYWxzZSxcbiAgfVxuICBkZXNjcmlwdGlvbiA9IHtcbiAgICBlbGxpcHNpczogZmFsc2UsXG4gICAgdmlld0xlc3M6IGZhbHNlLFxuICB9XG4gIG9iamVjdGl2ZXMgPSB7XG4gICAgZWxsaXBzaXM6IGZhbHNlLFxuICAgIHZpZXdMZXNzOiBmYWxzZSxcbiAgfVxuICB0YWdzRWxsaXBzaXMgPSBmYWxzZVxuICBzZWFyY2hUYWdzRWxsaXBzaXMgPSBmYWxzZVxuICBjb21wZXRlbmN5U2VsZWN0ZWQgPSAnJ1xuICByYXRpbmdTdW1tYXJ5OiBhbnlcbiAgYXV0aFJlcGxpZXM6IGFueVxuICByYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkOiBhbnlcbiAgdG9wUmF0aW5nUmV2aWV3czogYW55W10gPSBbXVxuICByYXRpbmdSZXZpZXdzOiBhbnlbXSA9IFtdXG4gIGxhdGVzdFJldmlld3M6IGFueVtdID0gW11cbiAgZGlhbG9nUmVmOiBhbnlcbiAgZGlzcGxheUxvYWRlciA9IGZhbHNlXG4gIGRpc2FibGVMb2FkTW9yZSA9IGZhbHNlXG4gIGxvb2t1cExvYWRpbmc6IEJvb2xlYW4gPSB0cnVlXG4gIGxhc3RMb29rVXA6IGFueVxuICByYXRpbmdMb29rdXA6IGFueVxuICByZXZpZXdQYWdlID0gMVxuICByZXZpZXdEZWZhdWx0TGltaXQgPSAyXG4gIGxvb2t1cExpbWl0ID0gM1xuICByYXRpbmdWaWV3Q291bnQgPSAzXG4gIHJhdGluZ1ZpZXdDb3VudERlZmF1bHQgPSAzXG4gIGNvbXBldGVuY2llc09iamVjdDogYW55ID0gW11cbiAgcHJpdmF0ZSBkZXN0cm95U3ViamVjdCQgPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgdmlld01vcmVUYWdzID0gZmFsc2VcbiAgdGltZXJVbnN1YnNjcmliZTogYW55XG4gIGRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2VcblxuICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCA9IHtcbiAgICBrZXk6ICdibGVuZGVkUHJvZ3JhbXMnLFxuICAgIGxvZ286ICcnLFxuICAgIHRpdGxlOiAnQmxlbmRlZCBQcm9ncmFtJyxcbiAgICBzdHJpcFRpdGxlTGluazoge1xuICAgICAgbGluazogJycsXG4gICAgICBpY29uOiAnJyxcbiAgICB9LFxuICAgIHNsaWRlckNvbmZpZzoge1xuICAgICAgc2hvd05hdnM6IHRydWUsXG4gICAgICBzaG93RG90czogZmFsc2UsXG4gICAgfSxcbiAgICBsb2FkZXI6IHRydWUsXG4gICAgc3RyaXBCYWNrZ3JvdW5kOiAnJyxcbiAgICB0aXRsZURlc2NyaXB0aW9uOiAnQmxlbmRlZCBQcm9ncmFtJyxcbiAgICBzdHJpcENvbmZpZzoge1xuICAgICAgY2FyZFN1YlR5cGU6ICdzdGFuZGFyZCcsXG4gICAgfSxcbiAgICB2aWV3TW9yZVVybDoge1xuICAgICAgcGF0aDogJycsXG4gICAgICB2aWV3TW9yZVRleHQ6ICdTaG93IGFsbCcsXG4gICAgICBxdWVyeVBhcmFtczogJycsXG4gICAgfSxcbiAgICB0YWJzOiBbXSxcbiAgICBmaWx0ZXJzOiBbXVxuICB9XG5cbiAgdGltZXI6IGFueSA9IHt9XG4gIGlzTW9iaWxlID0gZmFsc2VcbiAgY29tcGVudGVuY3lLZXkhOiBOc0NvbnRlbnQuSUNvbXBlbnRlbmN5S2V5c1xuICBzZWN0b3JzTGlzdDogYW55W10gPSBbXVxuICBzdWJTZWN0b3JzTGlzdDogYW55W10gPSBbXVxuICB1c2VyUHJvZmlsZTogYW55ID0gbnVsbFxuICBzdWJTZWN0b3JEZXRhaWxBcnI6IGFueSA9IFtdXG4gIHNlbGVjdGVkU2VjdG9yID0gJydcbiAgc2VsZWN0ZWRTZWN0b3JJZCA9ICcnXG4gIHJlZnJlc2hyYXRpbmdTdWJcbiAgcGFnZUNvbmZpZ0RhdGE6IGFueVxuICBlbnZpcm9ubWVudCE6IGFueVxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJhdGluZ1NlcnZpY2U6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTZXJ2aWNlOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtYXRTbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSBsb2FkQ2hlY2tTZXJ2aWNlOiBMb2FkQ2hlY2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGltZXJTZXJ2aWNlOiBUaW1lclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaXNjdXNzVXRpbGl0eVN2YzogRGlzY3Vzc1V0aWxzU2VydmljZSxcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSByZXZpZXdEYXRhU2VydmljZTogUmV2aWV3Q29tcG9uZW50RGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGFpbVNlcnZpY2U6IEhhbmRsZUNsYWltU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2V0UmF0aW5nc1NlcnZpY2U6IFJlc2V0UmF0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIGVudmlyb25tZW50OiBhbnlcbiAgKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50XG4gICAgdGhpcy5yZWZyZXNocmF0aW5nU3ViID0gdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnJlc2V0UmF0aW5ncyQuc3Vic2NyaWJlKChfcmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcbiAgICB9KVxuICB9XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucGFnZUNvbmZpZ0RhdGEgPSB0aGlzLmFjdGl2YXRlZFJvdXRlPy5zbmFwc2hvdD8uZGF0YT8ucGFnZURhdGE/LmRhdGFcbiAgICB0aGlzLmNvbXBlbnRlbmN5S2V5ID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbXBlbnRlbmN5W3RoaXMuZW52aXJvbm1lbnQuY29tcGVudGVuY3lWZXJzaW9uS2V5XVxuICAgIHRoaXMudXNlclByb2ZpbGUgPSB0aGlzLmNvbmZpZ1NlcnZpY2UudXNlclByb2ZpbGVcbiAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gMTIwMCkge1xuICAgICAgdGhpcy5pc01vYmlsZSA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc01vYmlsZSA9IGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuZmV0Y2hSYXRpbmdTdW1tYXJ5KClcbiAgICAgIC8vIHRoaXMubG9hZENvbXBldGVuY2llcygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkICYmIHRoaXMuY29udGVudC5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKSkge1xuICAgICAgLy8gdGhpcy5sb2FkQ29tcGV0ZW5jaWVzKClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnRbJ3N1YlRoZW1lJ10gPSB0aGlzLmdldFN1YlRoZW1lcygpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ0FTRV9TVFVEWSkge1xuICAgICAgdGhpcy5kaXNhYmxlQ2VydGlmaWNhdGUgPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uc2VjdG9yRGV0YWlsc192MSkge1xuICAgICAgLy8gUGFyc2Ugc3RyaW5nIHRvIGFycmF5IGlmIG5lZWRlZFxuICAgICAgbGV0IHNlY3RvckRldGFpbHNBcnJheSA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxXG5cbiAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRyeSB0byBwYXJzZSBpdCBpbnRvIGFuIGFycmF5XG4gICAgICBpZiAodHlwZW9mIHNlY3RvckRldGFpbHNBcnJheSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3RvckRldGFpbHNBcnJheSlcbiAgICAgICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MSA9IHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzZWN0b3JEZXRhaWxzX3YxOicsIGUpXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5ID0gW11cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIG9ubHkgaWYgd2UgaGF2ZSBhIHZhbGlkIGFycmF5IHdpdGggaXRlbXNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlY3RvckRldGFpbHNBcnJheSkgJiYgc2VjdG9yRGV0YWlsc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5zZWN0b3JzTGlzdCA9IF8udW5pcUJ5KFxuICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zZWN0b3JOYW1lICYmIGl0ZW0/LnNlY3RvcklkKVxuICAgICAgICAgICAgLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgICBzZWN0b3JJZDogaXRlbS5zZWN0b3JJZCxcbiAgICAgICAgICAgICAgc2VjdG9yTmFtZTogaXRlbS5zZWN0b3JOYW1lXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgJ3NlY3Rvck5hbWUnXG4gICAgICAgIClcblxuICAgICAgICB0aGlzLnN1YlNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXG4gICAgICAgICAgc2VjdG9yRGV0YWlsc0FycmF5XG4gICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnN1YlNlY3Rvck5hbWUgJiYgaXRlbT8uc3ViU2VjdG9ySWQpXG4gICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHN1YlNlY3RvcklkOiBpdGVtLnN1YlNlY3RvcklkLFxuICAgICAgICAgICAgICBzdWJTZWN0b3JOYW1lOiBpdGVtLnN1YlNlY3Rvck5hbWVcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAnc3ViU2VjdG9yTmFtZSdcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICh0aGlzLnNlY3RvcnNMaXN0ICYmIHRoaXMuc2VjdG9yc0xpc3QubGVuZ3RoICYmIHRoaXMuc2VjdG9yc0xpc3RbMF0pIHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3Vic2VjdG9yKHRoaXMuc2VjdG9yc0xpc3RbMF0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICBpZiAoXG4gICAgICB0aGlzLmNvbnRlbnQ/LmNvbnRlbnRJZCAmJlxuICAgICAgdGhpcy5jb250ZW50Py5jZXJ0aWZpY2F0ZU9iaj8uZGF0YSAmJlxuICAgICAgT2JqZWN0LmtleXModGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmRhdGEpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPT09IDJcbiAgICApIHtcbiAgICAgIHRoaXMuaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKCk7XG4gICAgfVxuXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclNlcnZpY2UuZ2V0VGltZXJEYXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfdGltZXI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVyID0gX3RpbWVyXG4gICAgICB9KVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuY29tcGVudGVuY3lLZXkgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29tcGVudGVuY3lbdGhpcy5lbnZpcm9ubWVudC5jb21wZW50ZW5jeVZlcnNpb25LZXldXG4gICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRUYWJWYWx1ZSAmJiBjaGFuZ2VzLnNlbGVjdGVkVGFiVmFsdWUuY3VycmVudFZhbHVlID09PSAwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3VtbWFyeUVsZW0gJiYgdGhpcy5zdW1tYXJ5RWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDcyKSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnkuZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVzY0VsZW0gJiYgdGhpcy5kZXNjRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDcyKSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5vYmplY3RpdmVzRWxlbSAmJiB0aGlzLm9iamVjdGl2ZXNFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNzIpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0aXZlcy5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3VtbWFyeUVsZW0gJiYgdGhpcy5zdW1tYXJ5RWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ4KSB7XG4gICAgICAgICAgICB0aGlzLnN1bW1hcnkuZWxsaXBzaXMgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMuZGVzY0VsZW0gJiYgdGhpcy5kZXNjRWxlbS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ4KSB7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uLmVsbGlwc2lzID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5vYmplY3RpdmVzRWxlbSAmJiB0aGlzLm9iamVjdGl2ZXNFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDgpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0aXZlcy5lbGxpcHNpcyA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy50YWdzRWxlbSAmJiB0aGlzLnRhZ3NFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNjQpIHtcbiAgICAgICAgICB0aGlzLnRhZ3NFbGxpcHNpcyA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlYXJjaFRhZ0VsZW0gJiYgdGhpcy5zZWFyY2hUYWdFbGVtLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNjQpIHtcbiAgICAgICAgICB0aGlzLnNlYXJjaFRhZ3NFbGxpcHNpcyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSwgNTAwKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnNrZWxldG9uTG9hZGVyICYmICFjaGFuZ2VzLnNrZWxldG9uTG9hZGVyLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jb21wb25lbnRMb2FkZWQodHJ1ZSlcbiAgICAgIH0sIDUwMClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgICAgYXNzZXNzbWVudDogMCxcbiAgICAgICAgY291cnNlOiAwLFxuICAgICAgICBoYW5kc09uOiAwLFxuICAgICAgICBpbnRlcmFjdGl2ZVZpZGVvOiAwLFxuICAgICAgICBsZWFybmluZ01vZHVsZTogMCxcbiAgICAgICAgb3RoZXI6IDAsXG4gICAgICAgIHBkZjogMCxcbiAgICAgICAgc3VydmV5OiAwLFxuICAgICAgICBwb2RjYXN0OiAwLFxuICAgICAgICBwcmFjdGljZVRlc3Q6IDAsXG4gICAgICAgIGZpbmFsVGVzdDogMCxcbiAgICAgICAgcXVpejogMCxcbiAgICAgICAgdmlkZW86IDAsXG4gICAgICAgIHdlYk1vZHVsZTogMCxcbiAgICAgICAgd2ViUGFnZTogMCxcbiAgICAgICAgeW91dHViZTogMCxcbiAgICAgICAgaW50ZXJhY3RpdmVjb250ZW50OiAwLFxuICAgICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICAgIH1cbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBVbml0JyA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlID0gdGhpcy50b2NTdmMuZ2V0VG9jU3RydWN0dXJlKHRoaXMuY29udGVudCwgdGhpcy50b2NTdHJ1Y3R1cmUpXG4gICAgICBmb3IgKGNvbnN0IHByb2dUeXBlIGluIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZVtwcm9nVHlwZV0gPiAwKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIE9iamVjdC5rZXlzKHRoaXMucmF0aW5nU3VtbWFyeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbXBldGVuY2llc09iamVjdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmxvYWRDb21wZXRlbmNpZXMoKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRJZCAmJiB0aGlzLmNvbnRlbnQuY29udGVudElkLmluY2x1ZGVzKCdleHRfJykpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGV0ZW5jaWVzT2JqZWN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubG9hZENvbXBldGVuY2llcygpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhWydzdWJUaGVtZSddID0gdGhpcy5nZXRTdWJUaGVtZXMoKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DQVNFX1NUVURZKSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUNlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnNlY3RvckRldGFpbHNfdjEpIHtcbiAgICAgICAgLy8gUGFyc2Ugc3RyaW5nIHRvIGFycmF5IGlmIG5lZWRlZFxuICAgICAgICBsZXQgc2VjdG9yRGV0YWlsc0FycmF5ID0gdGhpcy5jb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVxuXG4gICAgICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRyeSB0byBwYXJzZSBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjdG9yRGV0YWlsc0FycmF5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXkgPSBKU09OLnBhcnNlKHNlY3RvckRldGFpbHNBcnJheSlcbiAgICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjEgPSBzZWN0b3JEZXRhaWxzQXJyYXlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHNlY3RvckRldGFpbHNfdjE6JywgZSlcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheSA9IFtdXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyBvbmx5IGlmIHdlIGhhdmUgYSB2YWxpZCBhcnJheSB3aXRoIGl0ZW1zXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlY3RvckRldGFpbHNBcnJheSkgJiYgc2VjdG9yRGV0YWlsc0FycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFeHRyYWN0IHVuaXF1ZSBzZWN0b3JzIHVzaW5nIGxvZGFzaFxuICAgICAgICAgIHRoaXMuc2VjdG9yc0xpc3QgPSBfLnVuaXFCeShcbiAgICAgICAgICAgIHNlY3RvckRldGFpbHNBcnJheVxuICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0/LnNlY3Rvck5hbWUgJiYgaXRlbT8uc2VjdG9ySWQpXG4gICAgICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICBzZWN0b3JJZDogaXRlbS5zZWN0b3JJZCxcbiAgICAgICAgICAgICAgICBzZWN0b3JOYW1lOiBpdGVtLnNlY3Rvck5hbWVcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgJ3NlY3Rvck5hbWUnXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCB1bmlxdWUgc3Vic2VjdG9ycyB1c2luZyBsb2Rhc2hcbiAgICAgICAgICB0aGlzLnN1YlNlY3RvcnNMaXN0ID0gXy51bmlxQnkoXG4gICAgICAgICAgICBzZWN0b3JEZXRhaWxzQXJyYXlcbiAgICAgICAgICAgICAgLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtPy5zdWJTZWN0b3JOYW1lICYmIGl0ZW0/LnN1YlNlY3RvcklkKVxuICAgICAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgc3ViU2VjdG9ySWQ6IGl0ZW0uc3ViU2VjdG9ySWQsXG4gICAgICAgICAgICAgICAgc3ViU2VjdG9yTmFtZTogaXRlbS5zdWJTZWN0b3JOYW1lXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICdzdWJTZWN0b3JOYW1lJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgIGlmIChjaGFuZ2VzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuaXNFeHRlcm5hbENvbnRlbnQgPSBfLmdldChjaGFuZ2VzLCAnY29udGVudC5jdXJyZW50VmFsdWUuY29udGVudElkJywgJycpLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ2V4dF8nKVxuICAgIH1cbiAgfVxuXG4gIGdldFN1YlRoZW1lcygpOiBhbnlbXSB7XG4gICAgY29uc3Qgc3ViVGhlbWVBcnI6IGFueVtdID0gW11cbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb21wZW50ZW5jeUtleSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0ubGVuZ3RoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPT09ICdzdHJpbmcnICYmIHRoaXMuY2hlY2tWYWxpZEpTT04odGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9IEpTT04ucGFyc2UodGhpcy5jb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSlcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX2NvbXBldGVuY3lPYmo6IGFueSkgPT4ge1xuICAgICAgICBpZiAoc3ViVGhlbWVBcnIuaW5kZXhPZihfY29tcGV0ZW5jeU9ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5U3ViVGhlbWVdKSA9PT0gLTEpIHtcbiAgICAgICAgICBzdWJUaGVtZUFyci5wdXNoKF9jb21wZXRlbmN5T2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBzdWJUaGVtZUFyclxuICB9XG5cbiAgbG9hZENvbXBldGVuY2llcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldLmxlbmd0aCkge1xuICAgICAgY29uc3QgY29tcGV0ZW5jaWVzT2JqZWN0OiBhbnkgPSB7fVxuICAgICAgaWYgKHR5cGVvZiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSA9PT0gJ3N0cmluZydcbiAgICAgICAgJiYgdGhpcy5jaGVja1ZhbGlkSlNPTih0aGlzLmJhc2VDb250ZW50UmVhZERhdGFbdGhpcy5jb21wZW50ZW5jeUtleS52S2V5XSkpIHtcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0gPSBKU09OLnBhcnNlKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVt0aGlzLmNvbXBlbnRlbmN5S2V5LnZLZXldKVxuICAgICAgfVxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhW3RoaXMuY29tcGVudGVuY3lLZXkudktleV0uZm9yRWFjaCgoX29iajogYW55KSA9PiB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dKSB7XG4gICAgICAgICAgaWYgKGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICBbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5VGhlbWVdXSkge1xuICAgICAgICAgICAgY29uc3QgY29tcGV0ZW5jeVRoZW1lID0gY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVxuICAgICAgICAgICAgW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIGlmIChjb21wZXRlbmN5VGhlbWUuaW5kZXhPZihfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pID09PSAtMSkge1xuICAgICAgICAgICAgICBjb21wZXRlbmN5VGhlbWUucHVzaChfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lTdWJUaGVtZV0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICAgIGNvbXBldGVuY2llc09iamVjdFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lBcmVhXV1cbiAgICAgICAgICAgIFtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dXG4gICAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXSA9IHt9XG4gICAgICAgICAgY29tcGV0ZW5jaWVzT2JqZWN0W19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeUFyZWFdXVtfb2JqW3RoaXMuY29tcGVudGVuY3lLZXkudkNvbXBldGVuY3lUaGVtZV1dID0gW11cbiAgICAgICAgICBjb21wZXRlbmNpZXNPYmplY3RbX29ialt0aGlzLmNvbXBlbnRlbmN5S2V5LnZDb21wZXRlbmN5QXJlYV1dW19vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVRoZW1lXV1cbiAgICAgICAgICAgIC5wdXNoKF9vYmpbdGhpcy5jb21wZW50ZW5jeUtleS52Q29tcGV0ZW5jeVN1YlRoZW1lXSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29tcGV0ZW5jaWVzT2JqZWN0KSB7XG4gICAgICAgIGlmIChjb21wZXRlbmNpZXNPYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wWyd2YWx1ZSddID0gY29tcGV0ZW5jaWVzT2JqZWN0W2tleV1cbiAgICAgICAgICB0aGlzLmNvbXBldGVuY2llc09iamVjdC5wdXNoKF90ZW1wKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZVNob3dDb21wZXRlbmNpZXModGhpcy5jb21wZXRlbmNpZXNPYmplY3RbMF0pXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlU2hvd0NvbXBldGVuY2llcyhpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCA9IGl0ZW0ua2V5XG4gICAgY29uc3QgdmFsdWVPYmogPSBpdGVtLnZhbHVlXG4gICAgY29uc3QgY29tcGV0ZW5jeUFycmF5ID0gW11cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgaWYgKHZhbHVlT2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3QgX3RlbXBPYmo6IGFueSA9IHt9XG4gICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICBfdGVtcE9ialsndmFsdWUnXSA9IHZhbHVlT2JqW2tleV1cbiAgICAgICAgY29tcGV0ZW5jeUFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3RyaXBbJ2xvYWRlcldpZGdldHMnXSA9IFtdXG4gICAgdGhpcy5zdHJpcFsnbG9hZGVyV2lkZ2V0cyddID0gdGhpcy50cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldCh0aGlzLmNvbXBldGVuY3lTZWxlY3RlZCwgY29tcGV0ZW5jeUFycmF5LCB0aGlzLnN0cmlwKVxuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Db21wZXRlbmNpZXNUb1dpZGdldChcbiAgICBjb21wZXRlbmN5QXJlYTogc3RyaW5nLFxuICAgIGNvbXBldGVuY3lBcnJPYmplY3Q6IGFueSxcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIHJldHVybiAoY29tcGV0ZW5jeUFyck9iamVjdCB8fCBbXSkubWFwKChjb250ZW50OiBhbnksIGlkeDogbnVtYmVyKSA9PiAoXG4gICAgICBjb250ZW50ID8ge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjb21wZXRlbmN5Q2FyZCcsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21yLTQnLFxuICAgICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBjb21wZXRlbmN5QXJlYSxcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgfSxcbiAgICAgIH0gOiB7XG4gICAgICAgIHdpZGdldFR5cGU6ICdjYXJkJyxcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NvbXBldGVuY3lDYXJkJyxcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbXItNCcsXG4gICAgICAgIHdpZGdldERhdGE6IHt9LFxuICAgICAgfVxuICAgICkpXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hSYXRpbmdTdW1tYXJ5KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgdGhpcy5yYXRpbmdTZXJ2aWNlLmdldFJhdGluZ1N1bW1hcnkodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpLnN1YnNjcmliZShcbiAgICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMucmVzdWx0ICYmIHJlcy5yZXN1bHQucmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeSA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yYXRpbmdTdW1tYXJ5ID0gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGlkZSBsb2FkZXIgZm9yIE1hdERpYWxvZy4uLlxuICAgICAgICAgIGlmICh0aGlzLmRpYWxvZ1JlZikgeyB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2UgfVxuICAgICAgICAgIHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCA9IHRoaXMucHJvY2Vzc1JhdGluZ1N1bW1hcnkoKVxuICAgICAgICAgIC8vIHRoaXMuZmV0Y2hSYXRpbmdMb29rdXAoKVxuICAgICAgICB9LFxuICAgICAgICAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKCdVbmFibGUgdG8gZmV0Y2ggcmF0aW5nIHN1bW1hcnksIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBmZXRjaFJhdGluZ0xvb2t1cCgpIHtcbiAgICB0aGlzLmRpc3BsYXlMb2FkZXIgPSB0cnVlXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBhY3Rpdml0eVR5cGU6IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGxpbWl0OiB0aGlzLmxvb2t1cExpbWl0LFxuICAgICAgICAuLi4oKHRoaXMubGFzdExvb2tVcCAmJiB0aGlzLmxhc3RMb29rVXAudXBkYXRlZE9uVVVJRCkgPyB7IHVwZGF0ZU9uOiAodGhpcy5sYXN0TG9va1VwICYmIHRoaXMubGFzdExvb2tVcC51cGRhdGVkT25VVUlEKSB9IDogbnVsbCksXG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF0aW5nU2VydmljZS5nZXRSYXRpbmdMb29rdXAocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFRvIGRpc2FibGUgdGhlIGxvYWRlciBpbiB0aGUgbW9kYWwuXG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5kaXNwbGF5TG9hZGVyID0gZmFsc2VcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmV2aWV3UGFnZSA+IDEpIHtcbiAgICAgICAgICAgICAgcmVzLnJlc3VsdC5yZXNwb25zZS5tYXAoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5yYXRpbmdMb29rdXAuZmluZCgobzogYW55KSA9PiBvLnVwZGF0ZWRPblVVSUQgPT09IGl0ZW0udXBkYXRlZE9uVVVJRCkpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucmF0aW5nTG9va3VwLnB1c2goaXRlbSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnJhdGluZ0xvb2t1cCA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnByb2Nlc3NSYXRpbmdMb29rdXAocmVzLnJlc3VsdC5yZXNwb25zZSlcbiAgICAgICAgfSxcbiAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuZGlhbG9nUmVmKSB7ICAgLy8gVG8gZGlzYWJsZSB0aGUgbG9hZGVyIGluIHRoZSBtb2RhbC5cbiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBsb2FkIHJldmlld3MsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzUmF0aW5nTG9va3VwKHJlc3BvbnNlOiBhbnkpIHtcbiAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPCB0aGlzLmxvb2t1cExpbWl0KSB7XG4gICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlTG9hZE1vcmUgPSBmYWxzZVxuICAgICAgfVxuICAgICAgdGhpcy5sYXN0TG9va1VwID0gcmVzcG9uc2VbcmVzcG9uc2UubGVuZ3RoIC0gMV1cbiAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nTG9va3VwXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KHRoaXMubGF0ZXN0UmV2aWV3cywgJ3VzZXJJZCcpXG4gICAgICBjb25zdCB1c2VySWRzID0gXy5tYXAodGhpcy5sYXRlc3RSZXZpZXdzLCAndXNlcklkJylcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdXNlcklkcykge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yYXRpbmdSZXZpZXdzKSB7XG4gICAgICAgIHRoaXMucmF0aW5nUmV2aWV3cyA9IHRoaXMucmF0aW5nUmV2aWV3cy5zbGljZSgpXG4gICAgICAgIHRoaXMucmV2aWV3RGF0YVNlcnZpY2Uuc2V0UmV2aWV3RGF0YSh0aGlzLnJhdGluZ1Jldmlld3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXV0aG9yUmVwbHkoaWRlbnRpZmllcjogc3RyaW5nLCBwcmltYXJ5Q2F0ZWdvcnk6IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzOiBhbnlbXSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIGFjdGl2aXR5SWQ6IGlkZW50aWZpZXIsXG4gICAgICAgIGFjdGl2aXR5VHlwZTogcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICB1c2VySWQ6IHVzZXJJZHMsXG4gICAgICB9LFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJhdGluZ1NlcnZpY2UuZ2V0UmF0aW5nUmVwbHkocmVxdWVzdCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvbnRlbnQpIHtcbiAgICAgICAgICBjb25zdCByYXRpbmdBdXRoUmVwbGF5ID0gcmVzLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgXy5mb3JFYWNoKHJhdGluZ0F1dGhSZXBsYXksIHZhbHVlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dGhSZXBsaWVzW3ZhbHVlLnVzZXJJZF0pIHtcbiAgICAgICAgICAgICAgdGhpcy5hdXRoUmVwbGllc1t2YWx1ZS51c2VySWRdWydjb21tZW50J10gPSB2YWx1ZS5jb21tZW50XG4gICAgICAgICAgICAgIHRoaXMuYXV0aFJlcGxpZXNbdmFsdWUudXNlcklkXVsndXNlcklkJ10gPSB2YWx1ZS51c2VySWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXRlc3RSZXZpZXdzID0gT2JqZWN0LnZhbHVlcyh0aGlzLmF1dGhSZXBsaWVzKVxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoUmVwbGllc1xuICAgICAgfSxcbiAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIGF1dGhvciByZXBsaWVzLCBkdWUgdG8gc29tZSBlcnJvciEnKVxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIGNvdW50U3RhcnNQZXJjZW50YWdlKHZhbHVlOiBhbnksIGtleTogYW55LCB0b3RhbDogYW55KSB7XG4gICAgaWYgKHZhbHVlICYmIHRvdGFsKSB7XG4gICAgICByZXR1cm4gKCgodmFsdWUgKiBrZXkpIC8gdG90YWwpICogMTAwKS50b0ZpeGVkKDIpXG4gICAgfVxuICAgIHJldHVybiAwXG4gIH1cblxuICBwcm9jZXNzUmF0aW5nU3VtbWFyeSgpIHtcbiAgICBjb25zdCBicmVha0Rvd25BcnJheTogYW55W10gPSBbXVxuICAgIGNvbnN0IHJhdGluZ1N1bW1hcnlQciA9IHtcbiAgICAgIGJyZWFrRG93bjogYnJlYWtEb3duQXJyYXksXG4gICAgICBsYXRlc3Q1MFJldmlld3M6IGJyZWFrRG93bkFycmF5LFxuICAgICAgcmF0aW5nc051bWJlcjogYnJlYWtEb3duQXJyYXksXG4gICAgICB0b3RhbF9udW1iZXJfb2ZfcmF0aW5nczogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxfbnVtYmVyX29mX3JhdGluZ3MnKSB8fCAwLFxuICAgICAgYXZnUmF0aW5nOiAwLFxuICAgIH1cblxuICAgIGNvbnN0IHRvdFJhdGluZ3MgPSBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICdzdW1fb2ZfdG90YWxfcmF0aW5ncycpIHx8IDBcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50MXN0YXJzJyksIDEsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiAxLFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQxc3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQyc3RhcnMnKSwgMiwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDIsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDJzdGFycycpLFxuICAgIH0pXG4gICAgcmF0aW5nU3VtbWFyeVByLmJyZWFrRG93bi5wdXNoKHtcbiAgICAgIHBlcmNlbnQ6IHRoaXMuY291bnRTdGFyc1BlcmNlbnRhZ2UoXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDNzdGFycycpLCAzLCB0b3RSYXRpbmdzKSxcbiAgICAgIGtleTogMyxcbiAgICAgIHZhbHVlOiBfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50M3N0YXJzJyksXG4gICAgfSlcbiAgICByYXRpbmdTdW1tYXJ5UHIuYnJlYWtEb3duLnB1c2goe1xuICAgICAgcGVyY2VudDogdGhpcy5jb3VudFN0YXJzUGVyY2VudGFnZShfLmdldCh0aGlzLnJhdGluZ1N1bW1hcnksICd0b3RhbGNvdW50NHN0YXJzJyksIDQsIHRvdFJhdGluZ3MpLFxuICAgICAga2V5OiA0LFxuICAgICAgdmFsdWU6IF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ0c3RhcnMnKSxcbiAgICB9KVxuICAgIHJhdGluZ1N1bW1hcnlQci5icmVha0Rvd24ucHVzaCh7XG4gICAgICBwZXJjZW50OiB0aGlzLmNvdW50U3RhcnNQZXJjZW50YWdlKF8uZ2V0KHRoaXMucmF0aW5nU3VtbWFyeSwgJ3RvdGFsY291bnQ1c3RhcnMnKSwgNSwgdG90UmF0aW5ncyksXG4gICAgICBrZXk6IDUsXG4gICAgICB2YWx1ZTogXy5nZXQodGhpcy5yYXRpbmdTdW1tYXJ5LCAndG90YWxjb3VudDVzdGFycycpLFxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5yYXRpbmdTdW1tYXJ5ICYmIHRoaXMucmF0aW5nU3VtbWFyeS5sYXRlc3Q1MFJldmlld3MpIHtcbiAgICAgIGNvbnN0IGxhdGVzdDUwUmV2aWV3cyA9IEpTT04ucGFyc2UodGhpcy5yYXRpbmdTdW1tYXJ5LmxhdGVzdDUwUmV2aWV3cylcbiAgICAgIGNvbnN0IG1vZGlmaWVkUmV2aWV3cyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgcmF0aW5nID0+IHtcbiAgICAgICAgcmF0aW5nWyd1c2VySWQnXSA9IHJhdGluZy51c2VyX2lkXG4gICAgICAgIHJldHVybiByYXRpbmdcbiAgICAgIH0pXG4gICAgICB0aGlzLmF1dGhSZXBsaWVzID0gW11cbiAgICAgIHRoaXMuYXV0aFJlcGxpZXMgPSBfLmtleUJ5KGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgY29uc3QgdXNlcklkcyA9IF8ubWFwKGxhdGVzdDUwUmV2aWV3cywgJ3VzZXJfaWQnKVxuICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICB0aGlzLmdldEF1dGhvclJlcGx5KHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB1c2VySWRzKVxuICAgICAgfVxuXG4gICAgICByYXRpbmdTdW1tYXJ5UHIubGF0ZXN0NTBSZXZpZXdzID0gbW9kaWZpZWRSZXZpZXdzXG4gICAgICB0aGlzLnJhdGluZ1Jldmlld3MgPSBtb2RpZmllZFJldmlld3NcbiAgICAgIHRoaXMudG9wUmF0aW5nUmV2aWV3cyA9IG1vZGlmaWVkUmV2aWV3c1xuICAgIH1cbiAgICAvLyBUbyBwYXNzIGRhdGEgdG8gdGhlIHJldmlldyBjb250ZW50XG4gICAgdGhpcy5yZXZpZXdEYXRhU2VydmljZS5zZXRSZXZpZXdEYXRhKHRoaXMucmF0aW5nUmV2aWV3cylcblxuICAgIGlmICh0aGlzLnJhdGluZ1N1bW1hcnkgJiYgdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKSB7XG4gICAgICByYXRpbmdTdW1tYXJ5UHIuYXZnUmF0aW5nID1cbiAgICAgICAgcGFyc2VGbG9hdCgodGhpcy5yYXRpbmdTdW1tYXJ5LnN1bV9vZl90b3RhbF9yYXRpbmdzIC8gdGhpcy5yYXRpbmdTdW1tYXJ5LnRvdGFsX251bWJlcl9vZl9yYXRpbmdzKS50b0ZpeGVkKDEpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLmF2Z1JhdGluZ1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gcmF0aW5nU3VtbWFyeVByLnRvdGFsX251bWJlcl9vZl9yYXRpbmdzXG4gICAgfVxuICAgIHJldHVybiByYXRpbmdTdW1tYXJ5UHJcbiAgfVxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB0ZW1wU3RyID0gc3RyXG4gICAgaWYgKHRlbXBTdHIpIHtcbiAgICAgIHRlbXBTdHIgPSB0ZW1wU3RyLnNwbGl0KCdfeDAwMERfLCcpLmpvaW4oJycpXG4gICAgfVxuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHRlbXBTdHIgJiYgdHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRlbXBTdHIuc3BsaXQoJyAnKS5tYXAoX3N0ciA9PiB7XG4gICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgfSkuam9pbignICcpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGVtcFN0ciAmJiAodGVtcFN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRlbXBTdHIuc2xpY2UoMSkpXG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgaGFuZGxlT3BlblJldmlld01vZGFsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihSZXZpZXdzQ29udGVudENvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICBkYXRhOiB7IHJhdGluZ3M6IHRoaXMucmF0aW5nU3VtbWFyeVByb2Nlc3NlZCwgcmV2aWV3czogdGhpcy5hdXRoUmVwbGllcywgbGF0ZXN0UmV2aWV3czogdGhpcy5yYXRpbmdMb29rdXAgfSxcbiAgICAgIHBhbmVsQ2xhc3M6ICdyYXRpbmdzLW1vZGFsLWJveCcsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgfSlcblxuICAgIHRoaXMuZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChfcmVzdWx0OiBhbnkpID0+IHtcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuaW5pdGlhdGVMb2FkTW9yZS5zdWJzY3JpYmUoKF92YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmxvYWRNb3JlKF92YWx1ZSlcbiAgICB9KVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UubG9hZExhdGVzdFJldmlld3Muc3Vic2NyaWJlKChfdmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZGlzcGxheUxvYWRlciA9IHRydWVcbiAgICAgIHRoaXMucmF0aW5nVmlld0NvdW50ID0gdGhpcy5yYXRpbmdWaWV3Q291bnREZWZhdWx0XG4gICAgICB0aGlzLmxhc3RMb29rVXAgPSAnJ1xuICAgICAgdGhpcy5yYXRpbmdSZXZpZXdzID0gW11cbiAgICAgIHRoaXMucmV2aWV3UGFnZSA9IDFcbiAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gZmFsc2VcbiAgICAgIHRoaXMucmF0aW5nTG9va3VwID0gW11cbiAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGlmIChfdmFsdWUgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ0xvb2t1cCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFJhdGluZ1N1bW1hcnkoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxvYWRNb3JlKHNlbGVjdGVkUmV2aWV3OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZUxvYWRNb3JlKSB7XG4gICAgICB0aGlzLmxvb2t1cExvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLnJldmlld1BhZ2UgPSB0aGlzLnJldmlld1BhZ2UgKyAxXG4gICAgICB0aGlzLnJhdGluZ1ZpZXdDb3VudCA9IHRoaXMucmV2aWV3UGFnZSAqIHRoaXMucmV2aWV3RGVmYXVsdExpbWl0XG4gICAgICBpZiAoc2VsZWN0ZWRSZXZpZXcgPT09ICdMYXRlc3QnKSB7XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJldmlld0RlZmF1bHRMaW1pdFxuICAgICAgICB0aGlzLmZldGNoUmF0aW5nTG9va3VwKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgodGhpcy5yZXZpZXdQYWdlICogdGhpcy5yYXRpbmdWaWV3Q291bnQpID4gdGhpcy5yYXRpbmdSZXZpZXdzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZGlzYWJsZUxvYWRNb3JlID0gdHJ1ZVxuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmRpc3BsYXlMb2FkZXIgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2aWV3UGFnZSA9IHRoaXMucmV2aWV3UGFnZSArIDFcbiAgICAgICAgdGhpcy5yYXRpbmdWaWV3Q291bnQgPSB0aGlzLnJldmlld1BhZ2UgKiB0aGlzLnJhdGluZ1ZpZXdDb3VudFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5hdmlnYXRlVG9EaXNjdXNzaW9uSHViKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIG1lbnVPcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ2FsbC1kaXNjdXNzaW9ucycsXG4gICAgICAgICAgbGFiZWw6ICdBbGwgZGlzY3Vzc2lvbnMnLFxuICAgICAgICAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHJvdXRlOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yaWVzJyxcbiAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZTogJ3RhZ3MnLFxuICAgICAgICAgIGxhYmVsOiAnVGFncycsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGU6ICdteS1kaXNjdXNzaW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1lvdXIgZGlzY3Vzc2lvbicsXG4gICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAvLyB7XG4gICAgICAgIC8vICAgcm91dGU6ICdsZWFkZXJib2FyZCcsXG4gICAgICAgIC8vICAgbGFiZWw6ICdMZWFkZXIgQm9hcmQnLFxuICAgICAgICAvLyAgIGVuYWJsZTogdHJ1ZSxcbiAgICAgICAgLy8gfSxcbiAgICAgIF0sXG4gICAgICB1c2VyTmFtZTogKHRoaXMuY29uZmlnU2VydmljZS5ub2RlYmJVc2VyUHJvZmlsZSAmJiB0aGlzLmNvbmZpZ1NlcnZpY2Uubm9kZWJiVXNlclByb2ZpbGUudXNlcm5hbWUpIHx8ICcnLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBpZDogMSxcbiAgICAgIH0sXG4gICAgICBjYXRlZ29yaWVzOiB7IHJlc3VsdDogW10gfSxcbiAgICAgIHJvdXRlclNsdWc6ICcvYXBwJyxcbiAgICAgIGhlYWRlck9wdGlvbnM6IGZhbHNlLFxuICAgICAgYmFubmVyT3B0aW9uOiB0cnVlLFxuICAgIH1cbiAgICB0aGlzLmRpc2N1c3NVdGlsaXR5U3ZjLnNldERpc2N1c3Npb25Db25maWcoY29uZmlnKVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdob21lJywgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSlcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hcHAvZGlzY3Vzc2lvbi1mb3J1bSddLCB7IHF1ZXJ5UGFyYW1zOiB7IHBhZ2U6ICdob21lJyB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnIH0pXG4gIH1cblxuICBoYW5kbGVDbGlja09mQ2xhaW0oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlQ2xhaW1TZXJ2aWNlLnNldENsYWltRGF0YShldmVudClcbiAgfVxuICBcbiAgZ2V0Q291cnNlSWRGb3JDZXJ0aWZpY2F0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcmFtSWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnaWQnKTtcbiAgICBpZiAodGhpcy5jb250ZW50Py5jb250ZW50SWQ/LmluY2x1ZGVzKCdleHRfJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuY29udGVudElkO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGFyYW1JZCB8fCAnJztcbiAgfVxuXG4gIC8vICBoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKSB7XG4gIC8vICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IHRydWU7XG4gIC8vICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZDtcblxuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5wYWdlQ29uZmlnRGF0YSkge1xuICAvLyAgICAgY29uc3QgYWxsb3dlZFByaW1hcnlDYXRlZ29yeSA9XG4gIC8vICAgICAgIHRoaXMucGFnZUNvbmZpZ0RhdGE/LmR5bmFtaWNDZXJ0aWZpY2F0ZUdlbmVyYXRpb24/LmFsbG93cyAmJlxuICAvLyAgICAgICB0aGlzLnBhZ2VDb25maWdEYXRhPy5keW5hbWljQ2VydGlmaWNhdGVHZW5lcmF0aW9uPy5hbGxvd3M/Lm1hcChcbiAgLy8gICAgICAgICAoY2F0OiBzdHJpbmcpID0+IGNhdD8udG9Mb3dlckNhc2UoKVxuICAvLyAgICAgICApO1xuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkgJiZcbiAgLy8gICAgICAoIGFsbG93ZWRQcmltYXJ5Q2F0ZWdvcnkuaW5jbHVkZXModGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpIHx8IFxuICAvLyAgICAgICBhbGxvd2VkUHJpbWFyeUNhdGVnb3J5LmluY2x1ZGVzKHRoaXMuY29udGVudD8uY291cnNlQ2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkpKVxuICAvLyAgICAgKSB7XG4gIC8vICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAvLyAgICAgICAgICAgY291cnNlSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAvLyAgICAgICAgICAgYmF0Y2hJZDogdGhpcy5iYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoSWQgfHwgJycsXG4gIC8vICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlclByb2ZpbGUudXNlcklkLFxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgIH07XG4gIC8vICAgICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnRWMihwYXlsb2FkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgICAgKHJlc3BvbnNlKSA9PiB7XG4gIC8vICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlO1xuICAgICAgICAgICAgIFxuICAvLyAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKENlcnRpZmljYXRlRGlhbG9nQ29tcG9uZW50LCB7XG4gIC8vICAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgLy8gICAgICAgICAgICAgICAgIGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxuICAvLyAgICAgICAgICAgICAgICAgY2VydElkOlxuICAvLyAgICAgICAgICAgICAgICAgICAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWQpIHx8ICcnLFxuICAvLyAgICAgICAgICAgICAgIH0sXG4gIC8vICAgICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIH0sXG4gIC8vICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKTtcbiAgLy8gICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICAgJ1VuYWJsZSB0byBWaWV3IENlcnRpZmljYXRlLCBkdWUgdG8gc29tZSBlcnJvciEnXG4gIC8vICAgICAgICAgICApO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgKTtcbiAgLy8gICAgIH0gZWxzZSB7ZGVidWdnZXJcbiAgLy8gICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnQoY2VydElkKS5zdWJzY3JpYmUoXG4gIC8vICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAvLyAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXVsnY2VydERhdGEnXSA9XG4gIC8vICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VsdC5wcmludFVyaTtcbiAgLy8gICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgLy8gICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAvLyAgICAgICAgICAgICBkYXRhOiB7XG4gIC8vICAgICAgICAgICAgICAgY2V0OiByZXNwb25zZS5yZXN1bHQucHJpbnRVcmksXG4gIC8vICAgICAgICAgICAgICAgY2VydElkOiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnRJZCxcbiAgLy8gICAgICAgICAgICAgfSxcbiAgLy8gICAgICAgICAgIH0pO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSxcbiAgLy8gICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLmRvd25sb2FkQ2VydGlmaWNhdGVCb29sID0gZmFsc2U7XG4gIC8vICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmVycm9yKCdDRVJUSUZJQ0FURSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpO1xuICAvLyAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihcbiAgLy8gICAgICAgICAgICdVbmFibGUgdG8gVmlldyBDZXJ0aWZpY2F0ZSwgcGxlYXNlIGNoZWNrIGFnYWluIGxhdGVyISdcbiAgLy8gICAgICAgICApO1xuICAvLyAgICAgICB9XG4gIC8vICAgICApO1xuICAvLyAgIH1cbiAgLy8gICB9IFxuICAvLyB9XG5cbiAgaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKCkge1xuICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSB0cnVlXG4gICAgY29uc3QgY2VydElkID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iai5jZXJ0SWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jZXJ0aWZpY2F0ZU9iaiAmJiAhdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhKSB7XG4gICAgIGlmIChjZXJ0SWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmRvd25sb2FkQ2VydChjZXJ0SWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5kb3dubG9hZENlcnRpZmljYXRlQm9vbCA9IGZhbHNlXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ11bJ2NlcnREYXRhJ10gPSByZXNwb25zZS5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nLm9wZW4oQ2VydGlmaWNhdGVEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMjAwcHgnLFxuICAgICAgICAgICAgICBkYXRhOiB7IGNldDogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5lcnJvcignQ0VSVElGSUNBVEUgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIFZpZXcgQ2VydGlmaWNhdGUsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2wgPSBmYWxzZVxuICAgICAgdGhpcy5kaWFsb2cub3BlbihDZXJ0aWZpY2F0ZURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICB3aWR0aDogJzEyMDBweCcsXG4gICAgICAgIGRhdGE6IHsgY2V0OiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNlcnRpZmljYXRlT2JqLmNlcnREYXRhLCBjZXJ0SWQ6IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2VydGlmaWNhdGVPYmouY2VydElkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoKSB7XG4gICAgdGhpcy50cmlnZXJDb21wbGV0aW9uU3VydmV5Rm9ybS5lbWl0KHRydWUpO1xuICB9XG5cbiAgY2hlY2tWYWxpZEpTT04oc3RyOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgSlNPTi5wYXJzZShzdHIpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVN1YnNlY3RvcihpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnN1YlNlY3RvckRldGFpbEFyciA9IFtdXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvciA9ICcnXG4gICAgdGhpcy5zZWxlY3RlZFNlY3RvcklkID0gJydcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc2VjdG9ySWQnXSA9PT0gaXRlbS5zZWN0b3JJZCkge1xuICAgICAgICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddKSB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge31cbiAgICAgICAgICAgIG9iaiA9IHtcbiAgICAgICAgICAgICAgJ3NlY3RvcklkJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3RvcklkJ10sXG4gICAgICAgICAgICAgICdzZWN0b3JOYW1lJzogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnNlY3RvckRldGFpbHNfdjFbaV1bJ3NlY3Rvck5hbWUnXSxcbiAgICAgICAgICAgICAgJ2tleSc6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5zZWN0b3JEZXRhaWxzX3YxW2ldWydzdWJTZWN0b3JOYW1lJ10sXG4gICAgICAgICAgICAgICd2YWx1ZSc6IFt0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuc2VjdG9yRGV0YWlsc192MVtpXVsnc3ViU2VjdG9yTmFtZSddXVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIucHVzaChvYmopXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9yID0gaXRlbS5zZWN0b3JOYW1lXG4gICAgICB0aGlzLnNlbGVjdGVkU2VjdG9ySWQgPSBpdGVtLnNlY3RvcklkXG5cblxuICAgICAgY29uc3QgdmFsdWVPYmogPSBpdGVtXG4gICAgICBjb25zdCBzdWJTZWN0b3JBcnJheSA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZU9iaikge1xuICAgICAgICBpZiAodmFsdWVPYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IF90ZW1wT2JqOiBhbnkgPSB7fVxuICAgICAgICAgIF90ZW1wT2JqWydrZXknXSA9IGtleVxuICAgICAgICAgIF90ZW1wT2JqWyd2YWx1ZSddID0gdmFsdWVPYmpba2V5XVxuICAgICAgICAgIHN1YlNlY3RvckFycmF5LnB1c2goX3RlbXBPYmopXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RyaXBbJ3NlY3RvcldpZGdldHMnXSA9IHRoaXMudHJhbnNmb3JtQ29tcGV0ZW5jaWVzVG9XaWRnZXQoJ0JlaGF2aW91cmFsJywgdGhpcy5zdWJTZWN0b3JEZXRhaWxBcnIsIHRoaXMuc3RyaXApXG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lTdWJqZWN0JC51bnN1YnNjcmliZSgpXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcbiAgICBpZih0aGlzLnJlZnJlc2hyYXRpbmdTdWIpe1xuICAgICAgdGhpcy5yZWZyZXNocmF0aW5nU3ViLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxufVxuIiwiPG5nLXRlbXBsYXRlICNjZXJ0aWZpY2F0ZUNhcmQ+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2NrQ2VydGlmaWNhdGU7IGVsc2UgY2VydGlmaWNhdGVMb2NrXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtb3V0ZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgY2VydGlmaWNhdGUtaW5mbyBwLTQgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCdcIiBbd2lkdGhdPVwiJzIwMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMjRweCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBmb250LXNlbWlib2xkIGN1cnNvci1wb2ludGVyIHRydW5jYXRlLTNcIj57eyBjb250ZW50Py5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1saWdodFwiICpuZ0lmPVwiY29udGVudD8uY29tcGxldGVkT25cIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wbGV0ZWRDb3Vyc2UnIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnQ/LmNvbXBsZXRlZE9uID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWxpZ2h0XCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0ZWRPblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeTtlbHNlIHByaW1hcnlDYXRlZ29yeUNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBsZXRlZE9uJyB8IHRyYW5zbGF0ZSB9fSB7e2NvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5fX0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLm9uJyB8IHRyYW5zbGF0ZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY29tcGxldGVkT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcHJpbWFyeUNhdGVnb3J5Q2hlY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gJ1N0YW5kYWxvbmUgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGxldGVkQXNzZXNzbWVudCcgfCB0cmFuc2xhdGUgfX0ge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD8uY29tcGxldGVkT25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8uY29tcGxldGVkT24gfCBkYXRlOiAnZCBNTU0sIHknKSA6ICdOQScgfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdQcm9ncmFtJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wbGV0ZWRQcm9ncmFtJyB8IHRyYW5zbGF0ZSB9fSB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5jb21wbGV0ZWRPbiA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5jb21wbGV0ZWRPbiB8IGRhdGU6ICdkIE1NTSwgeScpIDogJ05BJyB9fTwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY29tcGxldGVkQ291cnNlJyB8IHRyYW5zbGF0ZSB9fSB7eyBjb250ZW50Py5jb21wbGV0ZWRPblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5jb21wbGV0ZWRPbiB8IGRhdGU6ICdkIE1NTSwgeScpIDogJ05BJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBkb3dubG9hZC1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkJ1wiIFt3aWR0aF09XCInMjRweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWlnaHRdPVwiJzI0cHgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gY3Vyc29yLXBvaW50ZXIgXCIgKm5nSWY9XCIhZG93bmxvYWRDZXJ0aWZpY2F0ZUJvb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVPcGVuQ2VydGlmaWNhdGVEaWFsb2coKVwiPmFycm93X2Rvd253YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImRvd25sb2FkQ2VydGlmaWNhdGVCb29sXCIgc3Ryb2tlV2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiMjBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbYmluZGluZ0NsYXNzXT1cIidmbGV4IHJvdW5kZWQnXCIgW3dpZHRoXT1cIicyODBweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hlaWdodF09XCInMTQ4cHgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlX2JveFwiICpuZ0lmPVwiIWNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhZnJvbU1hcmtldFBsYWNlXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJObyBjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiZnJvbU1hcmtldFBsYWNlXCIgc3JjPVwiL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUtbWFya2V0LXBsYWNlLnN2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiTm8gY2VydGlmaWNhdGUgaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNlcnRpZmljYXRlX292ZXJsYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCB0ZXh0LWNlbnRlciBnYXAtMSBwLTQgdGV4dC13aGl0ZSBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3snYXBwdG9jaG9tZS5jZXJ0aWZpY2F0aW9uVGFrZXNUaW1lJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+e3snYXBwdG9jaG9tZS5pc3N1ZVBlcnNpc3RzTWFpbHVzJyB8IHRyYW5zbGF0ZSB9fSBtaXNzaW9uLmthcm1heW9naUBnb3YuaW4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3snYXBwdG9jaG9tZS5pc3N1ZVBlcnNpc3RzTWFpbHVzJyB8IHRyYW5zbGF0ZSB9fSA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCJtYWlsdG86bWlzc2lvbi5rYXJtYXlvZ2lAZ292LmluXCIgY2xhc3M9XCJlbWFpbERlZmF1bHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW9uLmthcm1heW9naUBnb3YuaW48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImltZy1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY2VsZWJyYXRpb24tYW5pbWF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ltYWdlcy9hbmltYXRpb24vbGVhZGVyYm9hcmRfYW5pbWF0aW9uLmdpZlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cIiFmcm9tTWFya2V0UGxhY2VcIiBjbGFzcz1cImNlcml0aWZpY2F0ZS1pbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiJy9hc3NldHMvaWNvbnMvdG9jL25vLWNlcnRpZmljYXRlLnN2ZydcIiBhbHQ9XCJjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImZyb21NYXJrZXRQbGFjZVwiIGNsYXNzPVwiY2VyaXRpZmljYXRlLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCInL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUtbWFya2V0LXBsYWNlLnN2ZydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJjZXJ0aWZpY2F0ZSBpbWFnZVwiIC8+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndmlldy1jZXJ0aWZpY2F0ZSc6IGRvd25sb2FkQ2VydGlmaWNhdGVCb29sLCAndmlldy1jZXJ0JzogIWRvd25sb2FkQ2VydGlmaWNhdGVCb29sfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaGFuZGxlT3BlbkNlcnRpZmljYXRlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWRvd25sb2FkQ2VydGlmaWNhdGVCb29sXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwdG9jY29udGVudGNhcmQudmlld0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkb3dubG9hZENlcnRpZmljYXRlQm9vbFwiIGNsYXNzPVwidXBsb2FkZXItc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNlbGVicmF0aW9uLWFuaW1hdGlvblwiIHNyYz1cImFzc2V0cy9pbWFnZXMvYW5pbWF0aW9uL2xlYWRlcmJvYXJkX2FuaW1hdGlvbi5naWZcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiY2VyaXRpZmljYXRlLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImNvbnRlbnQ/LmNlcnRpZmljYXRlT2JqPy5jZXJ0RGF0YSB8IHBpcGVTYWZlU2FuaXRpemVyOiAndXJsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiY2VydGlmaWNhdGUgaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0zIGNoaXBzLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3ViVGhlbWUgb2YgY29udGVudFJlYWREYXRhPy5zdWJUaGVtZTsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoaXAgcm91bmRlZC1mdWxsIHAtMiB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2hpZGRlbic6IChqID4gMSAmJiAhY29udGVudD8udmlld01vcmUpLCAnY2hpcC1lbGxpcHNpcyc6ICFjb250ZW50Py52aWV3TW9yZSAmJiBjb250ZW50Py5zdWJUaGVtZT8ubGVuZ3RoID4gMSB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwic3ViVGhlbWVcIj57eyBzdWJUaGVtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtcHJpbWFyeSB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnN1YlRoZW1lPy5sZW5ndGggPiAyICYmICFjb250ZW50Py52aWV3TW9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY29udGVudC52aWV3TW9yZSA9ICFjb250ZW50LnZpZXdNb3JlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydjb21wZXRlbmN5Q2FyZERldGFpbHMudmlld01vcmUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXByaW1hcnkgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50Py52aWV3TW9yZVwiIChjbGljayk9XCJjb250ZW50LnZpZXdNb3JlID0gIWNvbnRlbnQudmlld01vcmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2NvbXBldGVuY3lDYXJkRGV0YWlscy52aWV3TGVzcycgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjZXJ0aWZpY2F0ZUxvY2s+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtb3V0ZXItZGl2IGxvY2tlZC1jZXJ0aWZpY2F0ZS1vdXRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtbG9jayBwLTQgZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgY2VydGlmaWNhdGUtbG9jay10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnYXBwdG9jLmNlcnRpZmljYXRlTG9ja2VkJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIGZsZXgtY29sIHAtNCBnYXAtMiBsb2NraW5nLXNjcmVlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ljb25zL2xvY2tfd2h0LnN2Z1wiIGFsdD1cImxvY2sgaW1hZ2VcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlTG9ja2VkVGV4dCBwYi0yXCI+e3snYXBwdG9jLmNlcnRpZmljYXRlTG9ja2VkTWVzc2FnZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NraW5nLXNjcmVlbi1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2FwcHRvYy51bmxvY2tDZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGV9fSA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInN1cnZleUZvcm1lVGV4dFwiPnt7J2FwcHRvYy5zdXJ2ZXlGb3JtJyB8IHRyYW5zbGF0ZX19PC9zcGFuPiB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2MudW5sb2NrQ2VydGlmaWNhdGUyJyB8IHRyYW5zbGF0ZSA6IHsgY291cnNlQ2F0ZWdvcnk6IGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA6IGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSB9IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNsYXNzPVwic3VydmV5Rm9ybWVCdXR0b24gcHgtN1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5TdXJ2ZXlGb3JtUG9wdXAoKVwiPnt7J2FwcHRvYy5jb21wbGV0ZVN1cnZleU5vdycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjb21wZXRlbmN5TGFiZWw+XG4gICAgPGRpdiBjbGFzcz1cInB0LW13ZWItNCBtYXQtc3ViaGVhZGluZy0xIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIHt7ICdhcHB0b2NzaW5nbGVwYWdlLmNvbXBldGVuY2llcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHdzLW1hdC1ibGFjazYwLXRleHQgaW5mby1pY29uIG1hdC1pY29uIG5vdHJhbnNsYXRlIG1hdGVyaWFsLWljb25zIG1hdC1pY29uLW5vLWNvbG9yXCJcbiAgICAgICAgICAgIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2JlbG93J1wiICN0b29sdGlwPVwibWF0VG9vbHRpcFwiIChjbGljayk9XCJ0b29sdGlwLnRvZ2dsZSgpXCJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5jb21wZXRlbmNpZXNUb29sdGlwJyB8IHRyYW5zbGF0ZSB9fVwiPmluZm9fb3V0bGluZTwvbWF0LWljb24+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbXQtNFwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJ214LTQnIDogJydcIlxuICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5yZXRpcmVtZW50RGF0ZSAmJiBjb250ZW50UmVhZERhdGE/Lmxhc3RFbnJvbGxtZW50RGF0ZVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvbnRlbnQtcmV0aXJlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgcmV0aXJlLWluZm8taWNvblwiPndhcm5pbmc8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvZHktMVwiPlRoaXMgY291cnNlIGlzIHNjaGVkdWxlZCBmb3IgcmV0aXJlbWVudC4gVGhlIGxhc3QgZGF0ZSB0byBlbnJvbGwgaXNcbiAgICAgICAgICAgICAgICB7e2NvbnRlbnRSZWFkRGF0YT8ubGFzdEVucm9sbG1lbnREYXRlIHwgZGF0ZTogJ01NTU0gZCwgeSd9fSwgYW5kXG4gICAgICAgICAgICAgICAgdGhlIGNvdXJzZSB3aWxsIGJlIHJldGlyZWQgb24ge3tjb250ZW50UmVhZERhdGE/LnJldGlyZW1lbnREYXRlIHwgZGF0ZTogJ01NTU0gZCwgeSd9fS5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgbXQtNCBteC00IGJsb2NrXCIgKm5nSWY9XCJpc01vYmlsZSAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRWZXJzaW9uSW5mbz8uaWRlbnRpZmllclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xICBjdXJzb3ItcG9pbnRlciBzd2l0Y2gtdmVyc2lvblwiIChjbGljayk9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCJcbiAgICAgICAgKGtleWRvd24pPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImJ0bi1zd2l0Y2hcIj57eyAnYXBwdG9jLnN3aXRjaFRvTmV3VmVyc2lvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuXG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBteS00IHB4LTRcIiBbY2xhc3MubXQ2MF09XCJzdGlja3lcIiBbbmdDbGFzc109XCJpc01vYmlsZSA/ICcnIDogJ2dhcC0xMCdcIj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiKGNvbnRlbnQ/LmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY29udGVudD8uY2VydGlmaWNhdGVPYmo/LmNlcnRJZCkgJiYgIWZyb21NYXJrZXRQbGFjZSAmJiAhZGlzYWJsZUNlcnRpZmljYXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZXJ0aWZpY2F0ZS1jb250YWluZXJcIiAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWJib25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtYmFja2dyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY2VydGlmaWNhdGVFYXJuZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VydGlmaWNhdGVDYXJkXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtY2VydGlmaWNhdGUtY29udGFpbmVyXCIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlYXJuZWQtY2VydGlmaWNhdGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpYmJvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY2VydGlmaWNhdGVFYXJuZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2VydGlmaWNhdGUtYmFja2dyb3VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TWFya2V0UGxhY2VDZXJ0aWZpY2F0ZSAmJiBmcm9tTWFya2V0UGxhY2VcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWNvbnRhaW5lclwiICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFkaXNhYmxlQ2VydGlmaWNhdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGVhcm5lZC1jZXJ0aWZpY2F0ZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmliYm9uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlcnRpZmljYXRlQ2FyZFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWFybmVkLWNlcnRpZmljYXRlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWJib25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVhcm5lZC1jZXJ0aWZpY2F0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmNlcnRpZmljYXRlRWFybmVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNlcnRpZmljYXRlLWJhY2tncm91bmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjZXJ0aWZpY2F0ZUNhcmRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbYmluZGluZ0NsYXNzXT1cIidmbGV4IHJvdW5kZWQnXCIgW2hlaWdodF09XCInMTQ4cHgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZyb21WaWV3ZXIgfHwgcm91dGVyLnVybC5pbmNsdWRlcygnL3ZpZXdlci9wZGYvZG9fJylcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgbXQtMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZm9udC1zZW1pYm9sZCB0ZXh0LWJhc2VcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/Lm5hbWUpIH19IDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYi10ZXh0IGJyZWFrLXdvcmRzIHRleHQtc20gbm9kdHJhbnNsYXRlXCI+e3sgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19IHt7XG4gICAgICAgICAgICAgICAgY29udGVudD8uc291cmNlIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGp1c3RpZnktYXJvdW5kIGhpZGVBYm92ZTEyMDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5jdXJyZW50QmF0Y2hTaXplIHx8XG4gICAgICAgICAgICAgICAgICAgICcwJyB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MuYmF0Y2hTaXplJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkXCI+e3sgc2VsZWN0ZWRCYXRjaERhdGE/LnVzZXJDb3VudD8udG90YWxBcHBsaWVkIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxBcHBsaWVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtaW5mb1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkXCI+e3sgc2VsZWN0ZWRCYXRjaERhdGE/LnVzZXJDb3VudD8uZW5yb2xsZWQgfHwgJzAnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy50b3RhbEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRpbWVyLmRheXMgPj0gMCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTYgbXktNSBiYXRjaC10aW1lciBoaWRlQWJvdmUxMjAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdW5kZXJsaW5lXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYmF0Y2hTdGFydHNJbicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5kYXlzIHx8IDAgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kYXlzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb3VudGVyLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLm1pbiA9PT0gNjAgPyB0aW1lci5ob3VycyArIDEgOiB0aW1lci5ob3VycyB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ob3VycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY291bnRlci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTEgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5taW4gPT09IDYwID8gMDAgOiB0aW1lci5taW4gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5taW51dGVzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cImZyb21WaWV3ZXIgfHwgaXNNb2JpbGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjBweCdcIiBbaGVpZ2h0XT1cIic2MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjBweCdcIiBbaGVpZ2h0XT1cIic2MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjBweCdcIiBbaGVpZ2h0XT1cIic2MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmICFmcm9tTWFya2V0UGxhY2VcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtdG9jLWtwaS12YWx1ZXMgW2NvbnRlbnRdPVwiY29udGVudFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW2lzTW9iaWxlXT1cImlzTW9iaWxlXCJcbiAgICAgICAgICAgICAgICBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgIFtsYW5ndWFnZUxpc3RdPVwibGFuZ3VhZ2VMaXN0XCI+PC93cy13aWRnZXQtdG9jLWtwaS12YWx1ZXM+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwcHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTIgbXQtNFwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODAlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzY1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAge3sgJ2FwcHRvY3NpbmdsZXBhZ2UuZGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cImNvbnRlbnQ/LmNvbnRlbnRJZCAmJiBjb250ZW50Py5jb250ZW50SWQuaW5jbHVkZXMoJ2V4dF8nKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5kZXNjcmlwdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiEoY29udGVudD8uY29udGVudElkICYmIGNvbnRlbnQ/LmNvbnRlbnRJZC5pbmNsdWRlcygnZXh0XycpKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zdW1tYXJ5JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PiAtLT5cbiAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydtb2ItZGVzYy1lbGxpcHNpcyc6IHN1bW1hcnkuZWxsaXBzaXMgJiYgaXNNb2JpbGUsICdkZXNjLWVsbGlwc2lzJzogc3VtbWFyeS5lbGxpcHNpcyAmJiAhaXNNb2JpbGV9XCJcbiAgICAgICAgICAgICAgICAjc3VtbWFyeUVsZW0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYi10ZXh0IG5vZHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/LmRlc2NyaXB0aW9uIHwgcmVwbGFjZU5ic3ApXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIGN1cnNvci1wb2ludGVyIHRleHQtc21cIiAqbmdJZj1cInN1bW1hcnkudmlld0xlc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic3VtbWFyeS5lbGxpcHNpcyA9ICFzdW1tYXJ5LmVsbGlwc2lzOyBzdW1tYXJ5LnZpZXdMZXNzID0gIXN1bW1hcnkudmlld0xlc3NcIj4mbmJzcDt7e1xuICAgICAgICAgICAgICAgICAgICAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cInN1bW1hcnkuZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1bW1hcnkuZWxsaXBzaXMgPSAhc3VtbWFyeS5lbGxpcHNpczsgc3VtbWFyeS52aWV3TGVzcyA9ICFzdW1tYXJ5LnZpZXdMZXNzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uaW5zdHJ1Y3Rpb25zIHx8IGNvbnRlbnRSZWFkRGF0YT8ucHVycG9zZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtdC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MCUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzk1JSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNjUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmxlYXJuaW5nT3V0Y29tZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgaXNNb2JpbGUsICdkZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXG4gICAgICAgICAgICAgICAgI2Rlc2NFbGVtPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImNvbnRlbnRSZWFkRGF0YT8uaW5zdHJ1Y3Rpb25zIHx8IGNvbnRlbnRSZWFkRGF0YT8ucHVycG9zZSB8IHJlcGxhY2VOYnNwXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtb2ItdGV4dCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24udmlld0xlc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzY3JpcHRpb24uZWxsaXBzaXMgPSAhZGVzY3JpcHRpb24uZWxsaXBzaXM7IGRlc2NyaXB0aW9uLnZpZXdMZXNzID0gIWRlc2NyaXB0aW9uLnZpZXdMZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO3t7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24uZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2NyaXB0aW9uLmVsbGlwc2lzID0gIWRlc2NyaXB0aW9uLmVsbGlwc2lzOyBkZXNjcmlwdGlvbi52aWV3TGVzcyA9ICFkZXNjcmlwdGlvbi52aWV3TGVzc1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCIgKm5nSWY9XCJjb250ZW50Py5vYmplY3RpdmVzXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MHB4J1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgZm9udC1ib2xkIHB0LW13ZWItOCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5sZWFybmluZ091dGNvbWUnIHxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogb2JqZWN0aXZlcy5lbGxpcHNpcyAmJiBpc01vYmlsZSwgJ2Rlc2MtZWxsaXBzaXMnOiBvYmplY3RpdmVzLmVsbGlwc2lzICYmICFpc01vYmlsZX1cIlxuICAgICAgICAgICAgICAgICNvYmplY3RpdmVzRWxlbT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYi10ZXh0IG5vZHRyYW5zbGF0ZVwiIFtpbm5lckh0bWxdPVwiaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5vYmplY3RpdmVzKVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwib2JqZWN0aXZlcy52aWV3TGVzc1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvYmplY3RpdmVzLmVsbGlwc2lzID0gIW9iamVjdGl2ZXMuZWxsaXBzaXM7IG9iamVjdGl2ZXMudmlld0xlc3MgPSAhb2JqZWN0aXZlcy52aWV3TGVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDt7eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1kZWZhdWx0LXRleHQgZm9udC1ib2xkIHRleHQtc21cIiAqbmdJZj1cIm9iamVjdGl2ZXMuZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9iamVjdGl2ZXMuZWxsaXBzaXMgPSAhb2JqZWN0aXZlcy5lbGxpcHNpczsgb2JqZWN0aXZlcy52aWV3TGVzcyA9ICFvYmplY3RpdmVzLnZpZXdMZXNzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIlxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uc3VtbWFyeSAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRJZCAmJiBjb250ZW50UmVhZERhdGE/LmNvbnRlbnRJZC5pbmNsdWRlcygnZXh0XycpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic4MHB4J1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzgwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic2NSUnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uuc3VtbWFyeScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J21vYi1kZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgaXNNb2JpbGUsICdkZXNjLWVsbGlwc2lzJzogZGVzY3JpcHRpb24uZWxsaXBzaXMgJiYgIWlzTW9iaWxlfVwiXG4gICAgICAgICAgICAgICAgI2Rlc2NFbGVtPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIVE1MXT1cImNvbnRlbnRSZWFkRGF0YT8uc3VtbWFyeSB8IHJlcGxhY2VOYnNwXCIgY2xhc3M9XCJtb2ItdGV4dCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgY3Vyc29yLXBvaW50ZXIgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24udmlld0xlc3NcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVzY3JpcHRpb24uZWxsaXBzaXMgPSAhZGVzY3JpcHRpb24uZWxsaXBzaXM7IGRlc2NyaXB0aW9uLnZpZXdMZXNzID0gIWRlc2NyaXB0aW9uLnZpZXdMZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO3t7ICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdMZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWRlZmF1bHQtdGV4dCBmb250LWJvbGQgdGV4dC1zbVwiICpuZ0lmPVwiZGVzY3JpcHRpb24uZWxsaXBzaXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlc2NyaXB0aW9uLmVsbGlwc2lzID0gIWRlc2NyaXB0aW9uLmVsbGlwc2lzOyBkZXNjcmlwdGlvbi52aWV3TGVzcyA9ICFkZXNjcmlwdGlvbi52aWV3TGVzc1wiPnt7XG4gICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnZpZXdNb3JlJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjBweCdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDJdXCI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTIwcHgnXCIgW2hlaWdodF09XCInMzJweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyNTBweCdcIiBbaGVpZ2h0XT1cIic4MHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjUwcHgnXCIgW2hlaWdodF09XCInODBweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzdHJpcD8ubG9hZGVyV2lkZ2V0cz8ubGVuZ3RoIHx8ICFjb21wZXRlbmNpZXNPYmplY3RcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb21wZXRlbmN5TGFiZWxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB7eyAnYXBwdG9jc2luZ2xlcGFnZS5ub0NvbXBldGVuY3lGb3VuZCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwPy5sb2FkZXJXaWRnZXRzPy5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29tcGV0ZW5jeUxhYmVsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTMgc206Z2FwLTQgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbXBldGVuY2llc09iamVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRoZW1lcy1idXR0b25cIiBbbmdDbGFzc109XCJ7J3RoZW1lLWFjdGl2YXRlZCc6IGNvbXBldGVuY3lTZWxlY3RlZCA9PT0gaXRlbS5rZXl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU2hvd0NvbXBldGVuY2llcyhpdGVtLCAnc2VsZWN0ZWQnKVwiPnt7IGl0ZW0ua2V5IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29tcGV0ZW5jaWVzT2JqZWN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5rZXkgPT09IGNvbXBldGVuY3lTZWxlY3RlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXV0aWxzLWhvcml6b250YWwtc2Nyb2xsZXItdjIgW2xvYWRTdGF0dXNdPVwiJ2RvbmUnXCIgW3N0cmlwQ29uZmlnXT1cInN0cmlwLnN0cmlwQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2lkZ2V0IG9mIHN0cmlwPy5sb2FkZXJXaWRnZXRzOyB0cmFja0J5OiB0cmFja2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW3NiVWlSZXNvbHZlcldpZGdldF09XCJ3aWRnZXRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvd3MtdXRpbHMtaG9yaXpvbnRhbC1zY3JvbGxlci12Mj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInMTZweCdcIlxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG10LTRcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTUlJ1wiIFtoZWlnaHRdPVwiJzE2cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxNnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPCEtLSB7e2NvbnRlbnR8anNvbn19IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5rZXl3b3Jkcz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRhZ3NMaXN0XCJcbiAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB0YWdEYXRhOiBjb250ZW50UmVhZERhdGE/LmtleXdvcmRzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5zZWFyY2hUYWdzPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncz8ubGVuZ3RoXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwidGFnc0xpc3RcIlxuICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRhZ0RhdGE6IGNvbnRlbnQ/LnNlYXJjaFRhZ3M/LnNsaWNlKDEsY29udGVudD8uc2VhcmNoVGFncz8ubGVuZ3RoKSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIXNrZWxldG9uTG9hZGVyICYmIHNlY3RvcnNMaXN0Py5sZW5ndGgpICYmIChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnk/LnRvTG93ZXJDYXNlKCkgPT09ICdsZWFybmluZyByZXNvdXJjZScgfHxcbiAgICBjb250ZW50Py5yZXNvdXJjZUNhdGVnb3J5Py50b0xvd2VyQ2FzZSgpID09PSAnY2FzZSBzdHVkeScpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMSBub2R0cmFuc2xhdGVcIj57eyAnZ3lhYW5LYXJtYXlvZ2kuc2VjdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWN0b3JzTGlzdD8ubGVuZ3RoID4gMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIHNtOmdhcC00IG1iLTMgZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0b3Igb2Ygc2VjdG9yc0xpc3Q7IGxldCBpID0gaW5kZXg7IGxldCBpc0xhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBbbmdDbGFzc109XCJ7J3RoZW1lLWFjdGl2YXRlZCc6IGNvbXBldGVuY3lTZWxlY3RlZCA9PT0gaXRlbS5rZXl9XCItLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGhlbWVzLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGhlbWUtYWN0aXZhdGVkJzogc2VsZWN0ZWRTZWN0b3JJZCA9PT0gc2VjdG9yPy5zZWN0b3JJZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlU3Vic2VjdG9yKHNlY3RvciwgJ3NlbGVjdGVkJylcIj57eyBzZWN0b3I/LnNlY3Rvck5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0cmlwPy5zZWN0b3JXaWRnZXRzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXV0aWxzLWhvcml6b250YWwtc2Nyb2xsZXItdjIgW2xvYWRTdGF0dXNdPVwiJ2RvbmUnXCIgW3N0cmlwQ29uZmlnXT1cInN0cmlwLnN0cmlwQ29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdpZGdldCBvZiBzdHJpcD8uc2VjdG9yV2lkZ2V0czsgdHJhY2tCeTogdHJhY2tlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbc2JVaVJlc29sdmVyV2lkZ2V0XT1cIndpZGdldFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXV0aWxzLWhvcml6b250YWwtc2Nyb2xsZXItdjI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdHJpcD8uc2VjdG9yV2lkZ2V0cz8ubGVuZ3RoID09PSAwICYmIHNlbGVjdGVkU2VjdG9ySWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gU3Vic2VjdG9yIEF2YWlsYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZWN0b3Igb2Ygc2VjdG9yc0xpc3Q7IGxldCBpID0gaW5kZXg7IGxldCBpc0xhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIG1vYi10ZXh0XCIgPnt7IHNlY3Rvcj8uc2VjdG9yTmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cIiFpc0xhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgc3ViU2VjdG9yc0xpc3Q/Lmxlbmd0aFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCI+e3sgJ2d5YWFuS2FybWF5b2dpLnN1YlNlY3RvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIiA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VjdG9yIG9mIHN1YlNlY3RvcnNMaXN0OyBsZXQgaSA9IGluZGV4OyBsZXQgaXNMYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiID57eyBzZWN0b3I/LnN1YlNlY3Rvck5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCIhaXNMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+IC0tPlxuXG4gICAgPG5nLXRlbXBsYXRlICN0YWdzTGlzdCBsZXQtdGFnRGF0YT1cInRhZ0RhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cInRhZ0RhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTEgbm9kdHJhbnNsYXRlXCI+e3sgJ3VzZXJQcm9maWxlLnRhZ3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFnRGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgW25nQ2xhc3NdPVwieyd0YWdzLWVsbGlwc2lzJzogdGFnc0VsbGlwc2lzICYmICF2aWV3TW9yZVRhZ3N9XCJcbiAgICAgICAgICAgICAgICAgICAgI3RhZ3NFbGVtPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnRGF0YTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbW9iLXRleHRcIj57eyBoYW5kbGVDYXBpdGFsaXplKHRhZykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwidGFnRGF0YT8ubGVuZ3RoID4gKGkgKyAxKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVyaW9kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB3cy1tYXQtZGVmYXVsdC10ZXh0IHVuZGVybGluZSBjdXJzb3ItcG9pbnRlciB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWdzRWxsaXBzaXMgJiYgIXZpZXdNb3JlVGFnc1wiIChjbGljayk9XCJ2aWV3TW9yZVRhZ3MgPSAhdmlld01vcmVUYWdzXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld01vcmUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHdzLW1hdC1kZWZhdWx0LXRleHQgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHMgbXQtMVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidmlld01vcmVUYWdzXCIgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TGVzcycgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgKm5nSWY9XCIhdGFnRGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAge3sgJ3VzZXJQcm9maWxlLm5vVGFncycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnQ/LnNlYXJjaFRhZ3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2xcIiAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3MubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMVwiPnt7ICd1c2VyUHJvZmlsZS50YWdzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnNlYXJjaFRhZ3MubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC0yXCIgW25nQ2xhc3NdPVwieyd0YWdzLWVsbGlwc2lzJzogc2VhcmNoVGFnc0VsbGlwc2lzICYmICF2aWV3TW9yZVRhZ3N9XCIgI3NlYXJjaFRhZ0VsZW0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHRhZyBvZiBjb250ZW50Py5zZWFyY2hUYWdzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBtb2ItdGV4dFwiID57eyBoYW5kbGVDYXBpdGFsaXplKHRhZykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY29udGVudD8uc2VhcmNoVGFncy5sZW5ndGggPiAoaSArIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZXJpb2RcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHdzLW1hdC1kZWZhdWx0LXRleHQgdW5kZXJsaW5lIGN1cnNvci1wb2ludGVyIHRleHQteHNcIiAqbmdJZj1cInNlYXJjaFRhZ3NFbGxpcHNpcyAmJiAhdmlld01vcmVUYWdzXCIgKGNsaWNrKT1cInZpZXdNb3JlVGFncyA9ICF2aWV3TW9yZVRhZ3NcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS52aWV3TW9yZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgd3MtbWF0LWRlZmF1bHQtdGV4dCB1bmRlcmxpbmUgY3Vyc29yLXBvaW50ZXIgdGV4dC14cyBtdC0xXCIgKm5nSWY9XCJ2aWV3TW9yZVRhZ3NcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJ2aWV3TW9yZVRhZ3MgPSAhdmlld01vcmVUYWdzXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uudmlld0xlc3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiICpuZ0lmPVwiIWNvbnRlbnQ/LnNlYXJjaFRhZ3MubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAge3sgJ3VzZXJQcm9maWxlLm5vVGFncycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG5cbiAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWthcm1hLXBvaW50c1wiPlxuICAgICAgICA8d3Mtd2lkZ2V0LWthcm1hLXBvaW50cyBbY29udGVudF09XCJjb250ZW50XCIgW2J0bkNhdGVnb3J5XT1cIlwiIFtjb25kaXRpb25dPVwiY29uZGl0aW9uXCJcbiAgICAgICAgICAgIChjbGlja0NsYWltS2FybWFQb2ludHMpPVwiaGFuZGxlQ2xpY2tPZkNsYWltKCRldmVudClcIiBbZGF0YV09XCJrcGFycmF5XCI+XG4gICAgICAgIDwvd3Mtd2lkZ2V0LWthcm1hLXBvaW50cz5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInNzJweCdcIlxuICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICA8IS0tIGNvbW1lbnRlZCBiZWNhdXNlIG9mIG5ldyBkaXNjdXNzaW9uIHYyIGNvbW1lbnRzIGltcGxtZW50YXRpb24gLS0+XG4gICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgc206ZmxleC1yb3cgaXRlbXMtY2VudGVyIGRpc2N1c3Npb24tZGl2XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xIGZvcnVtLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBnYXAtNSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmZvcnVtPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tdGV4dCBzbTpwci00XCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYW55U3VnZ2VzdGlvbnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LW5vbmUgcC0zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idXR0b25cIiAoY2xpY2spPVwibmF2aWdhdGVUb0Rpc2N1c3Npb25IdWIoKVwiPnt7ICdkaXNjdXNzLnN0YXJ0RGlzY3VzcycgfCB0cmFuc2xhdGUgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj4gLS0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCIgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDJdXCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic3MnB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczNnB4J1wiIFtoZWlnaHRdPVwiJzM2cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQtZnVsbCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMTJweCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZyb21NYXJrZXRQbGFjZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiIFtuZ0NsYXNzXT1cInsnaGlkZUFib3ZlMTIwMCc6ICFyb3V0ZXIudXJsLmluY2x1ZGVzKCcvdmlld2VyLycpfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hdXRob3JzQW5kQ3VyYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhdXRob3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImF1dGhvci5waG90byB8fCAnJ1wiIFtuYW1lXT1cImF1dGhvci5uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoYXV0aG9yPy5uYW1lLnRvTG93ZXJDYXNlKCksICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctMyBtb2ItdGV4dFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjcmVhdG9yIG9mIGhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudFJlYWREYXRhPy5jcmVhdG9yQ29udGFjdHMpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGhvdG9VcmxdPVwiY3JlYXRvci5waG90byB8fCAnJ1wiIFtuYW1lXT1cImNyZWF0b3IubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGRcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNyZWF0b3I/Lm5hbWUudG9Mb3dlckNhc2UoKSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zIG1vYi10ZXh0XCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2x1bW4gZ2FwLTNcIiBbbmdDbGFzc109XCJ7J2hpZGVBYm92ZTEyMDAnOiAhcm91dGVyLnVybC5pbmNsdWRlcygnL3ZpZXdlci8nKX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UucHJvdmlkZXInIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItbG9nby1kaXZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50Py5jcmVhdG9yTG9nb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgc3JjPVwiL2Fzc2V0cy9pbnN0YW5jZXMvZWFnbGUvYXBwX2xvZ29zL0thcm1heW9naUJoYXJhdF9Mb2dvLnN2Z1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIGJyZWFrLWFsbFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8uc291cmNlLCAnc291cmNlJykgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInNDAwcHgnXCJcbiAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgIWZvclByZXZpZXdcIj5cbiAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uYXZlcmFnZVJhdGluZ1wiPiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgcmF0aW5ncy1kaXYgZ2FwLTEwXCIgaWQ9XCJyYXRpbmdzRGl2XCIgKm5nSWY9XCJzaG93UmV2aWV3c1wiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1yYXRpbmctc3VtbWFyeSBbcmF0aW5nU3VtbWFyeV09XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkXCI+PC93cy13aWRnZXQtcmF0aW5nLXN1bW1hcnk+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSBtYXQtc3ViaGVhZGluZy0xIG5vZHRyYW5zbGF0ZVwiIGlkPVwicmV2aWV3Q29udGFpbmVyXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcHB0b2NzaW5nbGVwYWdlLnRvcFJldmlld3MnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyYXRpbmdTdW1tYXJ5UHJvY2Vzc2VkPy5hdmdSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtZGVmYXVsdC10ZXh0IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImhhbmRsZU9wZW5SZXZpZXdNb2RhbCgpXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXNnLnNob3dBbGwnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0b3BSYXRpbmdSZXZpZXdzICYmIHRvcFJhdGluZ1Jldmlld3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNVwiIFtuZ0NsYXNzXT1cImlzTW9iaWxlID8gJ2hvcml6b250YWwtc3RyaXAnIDogJ2ZsZXgtd3JhcCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21tZW50LWRpdlwiICpuZ0Zvcj1cImxldCBlYWNoUmV2aWV3IG9mIHRvcFJhdGluZ1Jldmlld3MgfCBzbGljZTowOjQ7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC00IGZsZXggZmxleC1jb2wgZ2FwLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1sZWZ0IGRlc2MtZWxsaXBzaXNcIiB0aXRsZT1cInt7IGVhY2hSZXZpZXc/LnJldmlldyB9fVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNhcGl0YWxpemUoZWFjaFJldmlldz8ucmV2aWV3KSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMiByYXRpbmctc3RhcnQtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+c3RhcjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57eyBlYWNoUmV2aWV3Py5yYXRpbmcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTIgaXRlbXMtY2VudGVyIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXZhdGFyLXBob3RvIFtyYW5kb21Db2xvcl09XCJ0cnVlXCIgW2RhdGFsZW5dPVwiMVwiIFtzaXplXT1cIidyb3VuZC1tJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Bob3RvVXJsXT1cImVhY2hSZXZpZXc/LnBob3RvIHx8ICcnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJlYWNoUmV2aWV3Py5maXJzdE5hbWVcIj48L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGhhbmRsZUNhcGl0YWxpemUoZWFjaFJldmlldz8uZmlyc3ROYW1lLnRvTG93ZXJDYXNlKCksICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmlvZFwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGVhY2hSZXZpZXc/LmRhdGUgfCBwaXBlUmVsYXRpdmVUaW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiF0b3BSYXRpbmdSZXZpZXdzIHx8ICF0b3BSYXRpbmdSZXZpZXdzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgdGV4dC1jZW50ZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJnLXdoaXRlIHAtNCByb3VuZGVkLW1kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5ub1Jldmlld3NGb3VuZCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50Py5hdmVyYWdlUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMyBqdXN0aWZ5LWNlbnRlciByYXRpbmdzLWRpdlwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy90b2Mvbm8tY2VydGlmaWNhdGUuc3ZnXCIgYWx0PVwibm8gcmF0aW5ncyBpbWFnZVwiIC8+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbGcgZm9udC1ib2xcIj5CZSB0aGUgZmlyc3Qgb25lIHRvIHJhdGUgdGhpcyBjb3Vyc2UgYW5kIHlvdXIgPGJyLz4gbGVhcm5pbmcgZXhwZXJpZW5jZTwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPiAtLT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
|