@sunbird-cb/cbp-ai 0.1.122 → 0.1.124

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/ai-cbp.module.mjs +6 -1
  2. package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +65 -7
  3. package/esm2022/lib/components/marketplace-courses-alert/marketplace-courses-alert.component.mjs +47 -0
  4. package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +29 -1
  5. package/esm2022/lib/components/view-course-recommendation/view-course-recommendation.component.mjs +3 -3
  6. package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +35 -17
  7. package/esm2022/lib/modules/shared/services/shared.service.mjs +31 -7
  8. package/esm2022/public-api.mjs +2 -1
  9. package/fesm2022/sunbird-cb-cbp-ai.mjs +202 -32
  10. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
  11. package/lib/ai-cbp.module.d.ts +53 -52
  12. package/lib/ai-cbp.module.d.ts.map +1 -1
  13. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +6 -0
  14. package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -1
  15. package/lib/components/marketplace-courses-alert/marketplace-courses-alert.component.d.ts +31 -0
  16. package/lib/components/marketplace-courses-alert/marketplace-courses-alert.component.d.ts.map +1 -0
  17. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +1 -0
  18. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -1
  19. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +1 -0
  20. package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -1
  21. package/lib/modules/shared/services/shared.service.d.ts +13 -2
  22. package/lib/modules/shared/services/shared.service.d.ts.map +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +1 -0
  25. package/public-api.d.ts.map +1 -1
  26. package/sunbird-cb-cbp-ai-0.1.124.tgz +0 -0
  27. package/sunbird-cb-cbp-ai-0.1.122.tgz +0 -0
@@ -0,0 +1,47 @@
1
+ import { Component, Inject, ViewEncapsulation } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/dialog";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/forms";
7
+ import * as i4 from "@angular/material/icon";
8
+ export const MARKETPLACE_ALERT_PANEL_CLASS = 'marketplace-alert-panel';
9
+ /**
10
+ * Confirmation shown before saving / sending courses for approval when marketplace courses are included.
11
+ * Closes with `true` only when the user acknowledges and confirms.
12
+ */
13
+ export class MarketplaceCoursesAlertComponent {
14
+ constructor(dialogRef, data) {
15
+ this.dialogRef = dialogRef;
16
+ this.data = data;
17
+ this.rows = [];
18
+ this.total = { marketplace: 0, free: 0, paid: 0 };
19
+ this.confirmLabel = 'Proceed';
20
+ this.acknowledged = false;
21
+ this.rows = (data?.rows || []).filter(row => row.marketplace > 0);
22
+ this.confirmLabel = data?.confirmLabel || this.confirmLabel;
23
+ this.rows.forEach(row => {
24
+ this.total.marketplace += row.marketplace;
25
+ this.total.free += row.free;
26
+ this.total.paid += row.paid;
27
+ });
28
+ }
29
+ confirm() {
30
+ if (this.acknowledged) {
31
+ this.dialogRef.close(true);
32
+ }
33
+ }
34
+ cancel() {
35
+ this.dialogRef.close(false);
36
+ }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarketplaceCoursesAlertComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
38
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MarketplaceCoursesAlertComponent, selector: "app-marketplace-courses-alert", ngImport: i0, template: "<div class=\"mkt-alert\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"mkt-alert-title\" aria-describedby=\"mkt-alert-msg\">\n <div class=\"mkt-alert-header\">\n <span class=\"mkt-alert-icon\" aria-hidden=\"true\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#B45309\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n </span>\n <h2 id=\"mkt-alert-title\" class=\"mkt-alert-title\">Marketplace courses included</h2>\n <button type=\"button\" class=\"mkt-alert-close\" aria-label=\"Close\" (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"mkt-alert-body\">\n <p id=\"mkt-alert-msg\" class=\"mkt-alert-msg\">\n This plan includes\n <strong class=\"mkt-strong\">{{ total.marketplace }} marketplace {{ total.marketplace === 1 ? 'course' : 'courses' }}</strong>\n (<strong class=\"mkt-free-text\">{{ total.free }} Free</strong> and\n <strong class=\"mkt-paid-text\">{{ total.paid }} Paid</strong>).\n The availability of enrolment licences is subject to availability and confirmation by Karmayogi Bharat.\n Do you want to proceed?\n </p>\n\n <div class=\"mkt-table-wrap\" *ngIf=\"rows.length\">\n <table class=\"mkt-table\">\n <thead>\n <tr>\n <th scope=\"col\" class=\"text-left\">Designation</th>\n <th scope=\"col\">Marketplace</th>\n <th scope=\"col\">Free</th>\n <th scope=\"col\">Paid</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows\">\n <td class=\"text-left\">{{ row.name || '-' }}</td>\n <td class=\"mkt-count\">{{ row.marketplace }}</td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: row.free, type: 'free' }\"></ng-container></td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: row.paid, type: 'paid' }\"></ng-container></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"rows.length > 1\">\n <tr>\n <th scope=\"row\" class=\"text-left\">Total ({{ rows.length }} designations)</th>\n <td class=\"mkt-count\">{{ total.marketplace }}</td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: total.free, type: 'free' }\"></ng-container></td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: total.paid, type: 'paid' }\"></ng-container></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <label class=\"mkt-ack\" [class.checked]=\"acknowledged\">\n <input type=\"checkbox\" [(ngModel)]=\"acknowledged\">\n <span>I acknowledge that licence availability for marketplace courses is subject to confirmation by Karmayogi Bharat.</span>\n </label>\n </div>\n\n <div class=\"mkt-alert-footer\">\n <span class=\"mkt-hint\">{{ acknowledged ? '' : 'Tick the acknowledgement to continue' }}</span>\n <button type=\"button\" class=\"mkt-btn mkt-btn-cancel\" (click)=\"cancel()\">Cancel</button>\n <button type=\"button\" class=\"mkt-btn mkt-btn-confirm\" [disabled]=\"!acknowledged\" (click)=\"confirm()\">{{ confirmLabel }}</button>\n </div>\n</div>\n\n<ng-template #countBadge let-count=\"count\" let-type=\"type\">\n <span *ngIf=\"count > 0\" class=\"mkt-badge\" [ngClass]=\"type\">{{ count }}</span>\n <span *ngIf=\"!count\" class=\"mkt-zero\">0</span>\n</ng-template>\n", styles: [".marketplace-alert-panel .mat-mdc-dialog-surface,.marketplace-alert-panel .mat-dialog-container{padding:0;border-radius:14px;overflow:hidden;box-shadow:0 24px 64px #0f172a47}.mkt-alert{display:flex;flex-direction:column;background:#fff;color:#1a2433;font-family:inherit}.mkt-alert-header{display:flex;align-items:center;gap:12px;padding:18px 20px 18px 24px;border-bottom:1px solid #EEF1F5}.mkt-alert-icon{flex-shrink:0;width:36px;height:36px;border-radius:50%;background:#fff1d6;display:flex;align-items:center;justify-content:center}.mkt-alert-title{flex:1;margin:0;font-size:18px;font-weight:700}.mkt-alert-close{width:44px;height:44px;border:none;border-radius:8px;background:transparent;color:#5a6473;cursor:pointer;display:flex;align-items:center;justify-content:center}.mkt-alert-body{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.mkt-alert-msg{margin:0;font-size:14px;line-height:1.65;color:#3a4452}.mkt-strong{color:#1a2433}.mkt-free-text{color:#006400}.mkt-paid-text{color:#8b1a1a}.mkt-table-wrap{border:1px solid #DDE3EC;border-radius:10px;overflow:hidden}.mkt-table{width:100%;border-collapse:collapse}.mkt-table th,.mkt-table td{padding:10px 14px;font-size:13px;text-align:center}.mkt-table .text-left{text-align:left}.mkt-table thead th{background:#f8fafc;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#5a6473;border-bottom:1px solid #DDE3EC}.mkt-table tbody td{border-bottom:1px solid #EEF1F5}.mkt-table tfoot tr{background:#f4f6fa}.mkt-table tfoot th,.mkt-count{font-weight:700}.mkt-badge{display:inline-block;min-width:28px;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:700;box-sizing:border-box}.mkt-badge.free{background:#0080001c;color:#006400}.mkt-badge.paid{background:#d32f2f1c;color:#8b1a1a}.mkt-zero{font-size:12px;color:#6b7280}.mkt-ack{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1px solid #C3CBD8;border-radius:10px;background:#fff;cursor:pointer;font-size:13px;line-height:1.5}.mkt-ack input{width:18px;height:18px;margin:1px 0 0;accent-color:#1B4CA1;flex-shrink:0;cursor:pointer}.mkt-ack.checked{border-color:#1b4ca1;background:#f0f5ff}.mkt-alert-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 24px;background:#f8fafc;border-top:1px solid #EEF1F5}.mkt-hint{flex:1;min-width:160px;font-size:12px;color:#5a6473}.mkt-btn{min-height:40px;padding:0 18px;border-radius:8px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer}.mkt-btn-cancel{border:1px solid #C3CBD8;background:#fff;color:#1a2433}.mkt-btn-confirm{border:none;background:#1b4ca1;color:#fff}.mkt-btn-confirm:disabled{background:#d5dae2;color:#5a6473;cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], encapsulation: i0.ViewEncapsulation.None }); }
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MarketplaceCoursesAlertComponent, decorators: [{
41
+ type: Component,
42
+ args: [{ selector: 'app-marketplace-courses-alert', encapsulation: ViewEncapsulation.None, template: "<div class=\"mkt-alert\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"mkt-alert-title\" aria-describedby=\"mkt-alert-msg\">\n <div class=\"mkt-alert-header\">\n <span class=\"mkt-alert-icon\" aria-hidden=\"true\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#B45309\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"></path>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"></line>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"></line>\n </svg>\n </span>\n <h2 id=\"mkt-alert-title\" class=\"mkt-alert-title\">Marketplace courses included</h2>\n <button type=\"button\" class=\"mkt-alert-close\" aria-label=\"Close\" (click)=\"cancel()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n\n <div class=\"mkt-alert-body\">\n <p id=\"mkt-alert-msg\" class=\"mkt-alert-msg\">\n This plan includes\n <strong class=\"mkt-strong\">{{ total.marketplace }} marketplace {{ total.marketplace === 1 ? 'course' : 'courses' }}</strong>\n (<strong class=\"mkt-free-text\">{{ total.free }} Free</strong> and\n <strong class=\"mkt-paid-text\">{{ total.paid }} Paid</strong>).\n The availability of enrolment licences is subject to availability and confirmation by Karmayogi Bharat.\n Do you want to proceed?\n </p>\n\n <div class=\"mkt-table-wrap\" *ngIf=\"rows.length\">\n <table class=\"mkt-table\">\n <thead>\n <tr>\n <th scope=\"col\" class=\"text-left\">Designation</th>\n <th scope=\"col\">Marketplace</th>\n <th scope=\"col\">Free</th>\n <th scope=\"col\">Paid</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows\">\n <td class=\"text-left\">{{ row.name || '-' }}</td>\n <td class=\"mkt-count\">{{ row.marketplace }}</td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: row.free, type: 'free' }\"></ng-container></td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: row.paid, type: 'paid' }\"></ng-container></td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"rows.length > 1\">\n <tr>\n <th scope=\"row\" class=\"text-left\">Total ({{ rows.length }} designations)</th>\n <td class=\"mkt-count\">{{ total.marketplace }}</td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: total.free, type: 'free' }\"></ng-container></td>\n <td><ng-container *ngTemplateOutlet=\"countBadge; context: { count: total.paid, type: 'paid' }\"></ng-container></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <label class=\"mkt-ack\" [class.checked]=\"acknowledged\">\n <input type=\"checkbox\" [(ngModel)]=\"acknowledged\">\n <span>I acknowledge that licence availability for marketplace courses is subject to confirmation by Karmayogi Bharat.</span>\n </label>\n </div>\n\n <div class=\"mkt-alert-footer\">\n <span class=\"mkt-hint\">{{ acknowledged ? '' : 'Tick the acknowledgement to continue' }}</span>\n <button type=\"button\" class=\"mkt-btn mkt-btn-cancel\" (click)=\"cancel()\">Cancel</button>\n <button type=\"button\" class=\"mkt-btn mkt-btn-confirm\" [disabled]=\"!acknowledged\" (click)=\"confirm()\">{{ confirmLabel }}</button>\n </div>\n</div>\n\n<ng-template #countBadge let-count=\"count\" let-type=\"type\">\n <span *ngIf=\"count > 0\" class=\"mkt-badge\" [ngClass]=\"type\">{{ count }}</span>\n <span *ngIf=\"!count\" class=\"mkt-zero\">0</span>\n</ng-template>\n", styles: [".marketplace-alert-panel .mat-mdc-dialog-surface,.marketplace-alert-panel .mat-dialog-container{padding:0;border-radius:14px;overflow:hidden;box-shadow:0 24px 64px #0f172a47}.mkt-alert{display:flex;flex-direction:column;background:#fff;color:#1a2433;font-family:inherit}.mkt-alert-header{display:flex;align-items:center;gap:12px;padding:18px 20px 18px 24px;border-bottom:1px solid #EEF1F5}.mkt-alert-icon{flex-shrink:0;width:36px;height:36px;border-radius:50%;background:#fff1d6;display:flex;align-items:center;justify-content:center}.mkt-alert-title{flex:1;margin:0;font-size:18px;font-weight:700}.mkt-alert-close{width:44px;height:44px;border:none;border-radius:8px;background:transparent;color:#5a6473;cursor:pointer;display:flex;align-items:center;justify-content:center}.mkt-alert-body{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.mkt-alert-msg{margin:0;font-size:14px;line-height:1.65;color:#3a4452}.mkt-strong{color:#1a2433}.mkt-free-text{color:#006400}.mkt-paid-text{color:#8b1a1a}.mkt-table-wrap{border:1px solid #DDE3EC;border-radius:10px;overflow:hidden}.mkt-table{width:100%;border-collapse:collapse}.mkt-table th,.mkt-table td{padding:10px 14px;font-size:13px;text-align:center}.mkt-table .text-left{text-align:left}.mkt-table thead th{background:#f8fafc;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#5a6473;border-bottom:1px solid #DDE3EC}.mkt-table tbody td{border-bottom:1px solid #EEF1F5}.mkt-table tfoot tr{background:#f4f6fa}.mkt-table tfoot th,.mkt-count{font-weight:700}.mkt-badge{display:inline-block;min-width:28px;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:700;box-sizing:border-box}.mkt-badge.free{background:#0080001c;color:#006400}.mkt-badge.paid{background:#d32f2f1c;color:#8b1a1a}.mkt-zero{font-size:12px;color:#6b7280}.mkt-ack{display:flex;gap:12px;align-items:flex-start;padding:14px 16px;border:1px solid #C3CBD8;border-radius:10px;background:#fff;cursor:pointer;font-size:13px;line-height:1.5}.mkt-ack input{width:18px;height:18px;margin:1px 0 0;accent-color:#1B4CA1;flex-shrink:0;cursor:pointer}.mkt-ack.checked{border-color:#1b4ca1;background:#f0f5ff}.mkt-alert-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:14px 24px;background:#f8fafc;border-top:1px solid #EEF1F5}.mkt-hint{flex:1;min-width:160px;font-size:12px;color:#5a6473}.mkt-btn{min-height:40px;padding:0 18px;border-radius:8px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer}.mkt-btn-cancel{border:1px solid #C3CBD8;background:#fff;color:#1a2433}.mkt-btn-confirm{border:none;background:#1b4ca1;color:#fff}.mkt-btn-confirm:disabled{background:#d5dae2;color:#5a6473;cursor:not-allowed}\n"] }]
43
+ }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
44
+ type: Inject,
45
+ args: [MAT_DIALOG_DATA]
46
+ }] }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0cGxhY2UtY291cnNlcy1hbGVydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9tYXJrZXRwbGFjZS1jb3Vyc2VzLWFsZXJ0L21hcmtldHBsYWNlLWNvdXJzZXMtYWxlcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvbWFya2V0cGxhY2UtY291cnNlcy1hbGVydC9tYXJrZXRwbGFjZS1jb3Vyc2VzLWFsZXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBZ0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQUV6RSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyx5QkFBeUIsQ0FBQTtBQWV0RTs7O0dBR0c7QUFRSCxNQUFNLE9BQU8sZ0NBQWdDO0lBTTNDLFlBQ1MsU0FBeUQsRUFDaEMsSUFBaUM7UUFEMUQsY0FBUyxHQUFULFNBQVMsQ0FBZ0Q7UUFDaEMsU0FBSSxHQUFKLElBQUksQ0FBNkI7UUFQbkUsU0FBSSxHQUEwQixFQUFFLENBQUE7UUFDaEMsVUFBSyxHQUF3QixFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUE7UUFDakUsaUJBQVksR0FBRyxTQUFTLENBQUE7UUFDeEIsaUJBQVksR0FBRyxLQUFLLENBQUE7UUFNbEIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQTtRQUNqRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQTtRQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUE7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQTtRQUM3QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1NBQzNCO0lBQ0gsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixDQUFDOytHQTNCVSxnQ0FBZ0MsOENBUWpDLGVBQWU7bUdBUmQsZ0NBQWdDLHFFQzdCN0MsZ25JQXdFQTs7NEZEM0NhLGdDQUFnQztrQkFQNUMsU0FBUzsrQkFDRSwrQkFBK0IsaUJBSTFCLGlCQUFpQixDQUFDLElBQUk7OzBCQVVsQyxNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuZXhwb3J0IGNvbnN0IE1BUktFVFBMQUNFX0FMRVJUX1BBTkVMX0NMQVNTID0gJ21hcmtldHBsYWNlLWFsZXJ0LXBhbmVsJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtldHBsYWNlQ291bnRSb3cge1xuICBuYW1lPzogc3RyaW5nXG4gIG1hcmtldHBsYWNlOiBudW1iZXJcbiAgZnJlZTogbnVtYmVyXG4gIHBhaWQ6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtldHBsYWNlQ291cnNlc0FsZXJ0RGF0YSB7XG4gIC8vIE9uZSByb3cgcGVyIGRlc2lnbmF0aW9uOyB0aGUgVG90YWwgcm93IGlzIHNob3duIG9ubHkgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lXG4gIHJvd3M6IE1hcmtldHBsYWNlQ291bnRSb3dbXVxuICBjb25maXJtTGFiZWw/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBDb25maXJtYXRpb24gc2hvd24gYmVmb3JlIHNhdmluZyAvIHNlbmRpbmcgY291cnNlcyBmb3IgYXBwcm92YWwgd2hlbiBtYXJrZXRwbGFjZSBjb3Vyc2VzIGFyZSBpbmNsdWRlZC5cbiAqIENsb3NlcyB3aXRoIGB0cnVlYCBvbmx5IHdoZW4gdGhlIHVzZXIgYWNrbm93bGVkZ2VzIGFuZCBjb25maXJtcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW1hcmtldHBsYWNlLWNvdXJzZXMtYWxlcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFya2V0cGxhY2UtY291cnNlcy1hbGVydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hcmtldHBsYWNlLWNvdXJzZXMtYWxlcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gVW5zY29wZWQgc28gdGhlIGRpYWxvZyBzdXJmYWNlIGNhbiBiZSBzdHlsZWQgdmlhIE1BUktFVFBMQUNFX0FMRVJUX1BBTkVMX0NMQVNTOyBhbGwgY2xhc3NlcyBhcmUgbWt0LSBwcmVmaXhlZFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE1hcmtldHBsYWNlQ291cnNlc0FsZXJ0Q29tcG9uZW50IHtcbiAgcm93czogTWFya2V0cGxhY2VDb3VudFJvd1tdID0gW11cbiAgdG90YWw6IE1hcmtldHBsYWNlQ291bnRSb3cgPSB7IG1hcmtldHBsYWNlOiAwLCBmcmVlOiAwLCBwYWlkOiAwIH1cbiAgY29uZmlybUxhYmVsID0gJ1Byb2NlZWQnXG4gIGFja25vd2xlZGdlZCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPE1hcmtldHBsYWNlQ291cnNlc0FsZXJ0Q29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IE1hcmtldHBsYWNlQ291cnNlc0FsZXJ0RGF0YVxuICApIHtcbiAgICB0aGlzLnJvd3MgPSAoZGF0YT8ucm93cyB8fCBbXSkuZmlsdGVyKHJvdyA9PiByb3cubWFya2V0cGxhY2UgPiAwKVxuICAgIHRoaXMuY29uZmlybUxhYmVsID0gZGF0YT8uY29uZmlybUxhYmVsIHx8IHRoaXMuY29uZmlybUxhYmVsXG4gICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICAgIHRoaXMudG90YWwubWFya2V0cGxhY2UgKz0gcm93Lm1hcmtldHBsYWNlXG4gICAgICB0aGlzLnRvdGFsLmZyZWUgKz0gcm93LmZyZWVcbiAgICAgIHRoaXMudG90YWwucGFpZCArPSByb3cucGFpZFxuICAgIH0pXG4gIH1cblxuICBjb25maXJtKCkge1xuICAgIGlmICh0aGlzLmFja25vd2xlZGdlZCkge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodHJ1ZSlcbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoZmFsc2UpXG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJta3QtYWxlcnRcIiByb2xlPVwiYWxlcnRkaWFsb2dcIiBhcmlhLW1vZGFsPVwidHJ1ZVwiIGFyaWEtbGFiZWxsZWRieT1cIm1rdC1hbGVydC10aXRsZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJta3QtYWxlcnQtbXNnXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1rdC1hbGVydC1oZWFkZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJta3QtYWxlcnQtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjQjQ1MzA5XCIgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMC4yOSAzLjg2IDEuODIgMThhMiAyIDAgMCAwIDEuNzEgM2gxNi45NGEyIDIgMCAwIDAgMS43MS0zTDEzLjcxIDMuODZhMiAyIDAgMCAwLTMuNDIgMHpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiOVwiIHgyPVwiMTJcIiB5Mj1cIjEzXCI+PC9saW5lPlxuICAgICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTJcIiB5MT1cIjE3XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTdcIj48L2xpbmU+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8aDIgaWQ9XCJta3QtYWxlcnQtdGl0bGVcIiBjbGFzcz1cIm1rdC1hbGVydC10aXRsZVwiPk1hcmtldHBsYWNlIGNvdXJzZXMgaW5jbHVkZWQ8L2gyPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1rdC1hbGVydC1jbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJjYW5jZWwoKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWt0LWFsZXJ0LWJvZHlcIj5cbiAgICAgICAgPHAgaWQ9XCJta3QtYWxlcnQtbXNnXCIgY2xhc3M9XCJta3QtYWxlcnQtbXNnXCI+XG4gICAgICAgICAgICBUaGlzIHBsYW4gaW5jbHVkZXNcbiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJta3Qtc3Ryb25nXCI+e3sgdG90YWwubWFya2V0cGxhY2UgfX0gbWFya2V0cGxhY2Uge3sgdG90YWwubWFya2V0cGxhY2UgPT09IDEgPyAnY291cnNlJyA6ICdjb3Vyc2VzJyB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgKDxzdHJvbmcgY2xhc3M9XCJta3QtZnJlZS10ZXh0XCI+e3sgdG90YWwuZnJlZSB9fSBGcmVlPC9zdHJvbmc+IGFuZFxuICAgICAgICAgICAgPHN0cm9uZyBjbGFzcz1cIm1rdC1wYWlkLXRleHRcIj57eyB0b3RhbC5wYWlkIH19IFBhaWQ8L3N0cm9uZz4pLlxuICAgICAgICAgICAgVGhlIGF2YWlsYWJpbGl0eSBvZiBlbnJvbG1lbnQgbGljZW5jZXMgaXMgc3ViamVjdCB0byBhdmFpbGFiaWxpdHkgYW5kIGNvbmZpcm1hdGlvbiBieSBLYXJtYXlvZ2kgQmhhcmF0LlxuICAgICAgICAgICAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD9cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJta3QtdGFibGUtd3JhcFwiICpuZ0lmPVwicm93cy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cIm1rdC10YWJsZVwiPlxuICAgICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJ0ZXh0LWxlZnRcIj5EZXNpZ25hdGlvbjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5NYXJrZXRwbGFjZTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj5GcmVlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPlBhaWQ8L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0ZXh0LWxlZnRcIj57eyByb3cubmFtZSB8fCAnLScgfX08L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibWt0LWNvdW50XCI+e3sgcm93Lm1hcmtldHBsYWNlIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY291bnRCYWRnZTsgY29udGV4dDogeyBjb3VudDogcm93LmZyZWUsIHR5cGU6ICdmcmVlJyB9XCI+PC9uZy1jb250YWluZXI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY291bnRCYWRnZTsgY29udGV4dDogeyBjb3VudDogcm93LnBhaWQsIHR5cGU6ICdwYWlkJyB9XCI+PC9uZy1jb250YWluZXI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDx0Zm9vdCAqbmdJZj1cInJvd3MubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJyb3dcIiBjbGFzcz1cInRleHQtbGVmdFwiPlRvdGFsICh7eyByb3dzLmxlbmd0aCB9fSBkZXNpZ25hdGlvbnMpPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1rdC1jb3VudFwiPnt7IHRvdGFsLm1hcmtldHBsYWNlIH19PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY291bnRCYWRnZTsgY29udGV4dDogeyBjb3VudDogdG90YWwuZnJlZSwgdHlwZTogJ2ZyZWUnIH1cIj48L25nLWNvbnRhaW5lcj48L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb3VudEJhZGdlOyBjb250ZXh0OiB7IGNvdW50OiB0b3RhbC5wYWlkLCB0eXBlOiAncGFpZCcgfVwiPjwvbmctY29udGFpbmVyPjwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC90Zm9vdD5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIm1rdC1hY2tcIiBbY2xhc3MuY2hlY2tlZF09XCJhY2tub3dsZWRnZWRcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImFja25vd2xlZGdlZFwiPlxuICAgICAgICAgICAgPHNwYW4+SSBhY2tub3dsZWRnZSB0aGF0IGxpY2VuY2UgYXZhaWxhYmlsaXR5IGZvciBtYXJrZXRwbGFjZSBjb3Vyc2VzIGlzIHN1YmplY3QgdG8gY29uZmlybWF0aW9uIGJ5IEthcm1heW9naSBCaGFyYXQuPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1rdC1hbGVydC1mb290ZXJcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJta3QtaGludFwiPnt7IGFja25vd2xlZGdlZCA/ICcnIDogJ1RpY2sgdGhlIGFja25vd2xlZGdlbWVudCB0byBjb250aW51ZScgfX08L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWt0LWJ0biBta3QtYnRuLWNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1rdC1idG4gbWt0LWJ0bi1jb25maXJtXCIgW2Rpc2FibGVkXT1cIiFhY2tub3dsZWRnZWRcIiAoY2xpY2spPVwiY29uZmlybSgpXCI+e3sgY29uZmlybUxhYmVsIH19PC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNjb3VudEJhZGdlIGxldC1jb3VudD1cImNvdW50XCIgbGV0LXR5cGU9XCJ0eXBlXCI+XG4gICAgPHNwYW4gKm5nSWY9XCJjb3VudCA+IDBcIiBjbGFzcz1cIm1rdC1iYWRnZVwiIFtuZ0NsYXNzXT1cInR5cGVcIj57eyBjb3VudCB9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cIiFjb3VudFwiIGNsYXNzPVwibWt0LXplcm9cIj4wPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==