@cqa-lib/cqa-ui 0.1.2 → 1.0.1

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 (125) hide show
  1. package/esm2020/lib/action-menu/action-menu.component.mjs +42 -0
  2. package/esm2020/lib/assets/images/image-assets.constants.mjs +28 -0
  3. package/esm2020/lib/badge/badge.component.mjs +141 -0
  4. package/esm2020/lib/button/button.component.mjs +42 -67
  5. package/esm2020/lib/column-visibility/column-visibility.component.mjs +69 -0
  6. package/esm2020/lib/dashboards/chart-card/chart-card.component.mjs +22 -0
  7. package/esm2020/lib/dashboards/coverage-module-card/coverage-module-card.component.mjs +105 -0
  8. package/esm2020/lib/dashboards/dashboard-header/dashboard-header.component.mjs +82 -0
  9. package/esm2020/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.mjs +59 -0
  10. package/esm2020/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.mjs +45 -0
  11. package/esm2020/lib/dashboards/insight-card/insight-card.component.mjs +201 -0
  12. package/esm2020/lib/dashboards/metrics-card/metrics-block.component.mjs +41 -0
  13. package/esm2020/lib/dashboards/metrics-card/metrics-card-item.interface.mjs +2 -0
  14. package/esm2020/lib/dashboards/metrics-card/metrics-card.component.mjs +62 -0
  15. package/esm2020/lib/dashboards/progress-text-card/progress-text-card.component.mjs +46 -0
  16. package/esm2020/lib/dashboards/test-distribution-card/test-distribution-card.component.mjs +35 -0
  17. package/esm2020/lib/dialog/dialog.component.mjs +4 -4
  18. package/esm2020/lib/dropdown-button/dropdown-button.component.mjs +189 -0
  19. package/esm2020/lib/dynamic-select/dynamic-select-field.component.mjs +160 -0
  20. package/esm2020/lib/empty-state/empty-state.component.mjs +37 -0
  21. package/esm2020/lib/filters/dynamic-filter/dynamic-filter.component.mjs +239 -0
  22. package/esm2020/lib/full-table-loader/full-table-loader.component.mjs +16 -0
  23. package/esm2020/lib/inline-sort/inline-sort.component.mjs +58 -0
  24. package/esm2020/lib/other-button/other-button.component.mjs +76 -0
  25. package/esm2020/lib/pagination/pagination.component.mjs +102 -0
  26. package/esm2020/lib/search-bar/search-bar.component.mjs +3 -3
  27. package/esm2020/lib/segment-control/segment-control.component.mjs +3 -3
  28. package/esm2020/lib/selected-filters/selected-filters.component.mjs +27 -0
  29. package/esm2020/lib/table/dynamic-table/dynamic-cell.directive.mjs +35 -0
  30. package/esm2020/lib/table/dynamic-table/dynamic-table.component.mjs +258 -0
  31. package/esm2020/lib/table-action-toolbar/table-action-toolbar.component.mjs +52 -0
  32. package/esm2020/lib/table-data-loader/table-data-loader.component.mjs +19 -0
  33. package/esm2020/lib/templates/table-template.component.mjs +365 -0
  34. package/esm2020/lib/ui-kit.module.mjs +196 -17
  35. package/esm2020/lib/utils/metadata-colors.util.mjs +100 -0
  36. package/esm2020/lib/utils/tw-overlay-container.mjs +22 -0
  37. package/esm2020/public-api.mjs +29 -1
  38. package/fesm2015/cqa-lib-cqa-ui.mjs +2899 -133
  39. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  40. package/fesm2020/cqa-lib-cqa-ui.mjs +2867 -133
  41. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  42. package/lib/action-menu/action-menu.component.d.ts +17 -0
  43. package/lib/assets/images/image-assets.constants.d.ts +20 -0
  44. package/lib/badge/badge.component.d.ts +25 -0
  45. package/lib/button/button.component.d.ts +6 -5
  46. package/lib/column-visibility/column-visibility.component.d.ts +33 -0
  47. package/lib/dashboards/chart-card/chart-card.component.d.ts +8 -0
  48. package/lib/dashboards/coverage-module-card/coverage-module-card.component.d.ts +44 -0
  49. package/lib/dashboards/dashboard-header/dashboard-header.component.d.ts +30 -0
  50. package/lib/dashboards/failed-test-cases-card/failed-test-cases-card.component.d.ts +28 -0
  51. package/lib/dashboards/heat-error-map-cell/heat-error-map-cell.component.d.ts +14 -0
  52. package/lib/dashboards/insight-card/insight-card.component.d.ts +73 -0
  53. package/lib/dashboards/metrics-card/metrics-block.component.d.ts +12 -0
  54. package/lib/dashboards/metrics-card/metrics-card-item.interface.d.ts +12 -0
  55. package/lib/dashboards/metrics-card/metrics-card.component.d.ts +17 -0
  56. package/lib/dashboards/progress-text-card/progress-text-card.component.d.ts +13 -0
  57. package/lib/dashboards/test-distribution-card/test-distribution-card.component.d.ts +29 -0
  58. package/lib/dropdown-button/dropdown-button.component.d.ts +32 -0
  59. package/lib/dynamic-select/dynamic-select-field.component.d.ts +43 -0
  60. package/lib/empty-state/empty-state.component.d.ts +20 -0
  61. package/lib/filters/dynamic-filter/dynamic-filter.component.d.ts +56 -0
  62. package/lib/full-table-loader/full-table-loader.component.d.ts +6 -0
  63. package/lib/inline-sort/inline-sort.component.d.ts +12 -0
  64. package/lib/other-button/other-button.component.d.ts +37 -0
  65. package/lib/pagination/pagination.component.d.ts +37 -0
  66. package/lib/selected-filters/selected-filters.component.d.ts +17 -0
  67. package/lib/table/dynamic-table/dynamic-cell.directive.d.ts +16 -0
  68. package/lib/table/dynamic-table/dynamic-table.component.d.ts +72 -0
  69. package/lib/table-action-toolbar/table-action-toolbar.component.d.ts +34 -0
  70. package/lib/table-data-loader/table-data-loader.component.d.ts +7 -0
  71. package/lib/templates/table-template.component.d.ts +90 -0
  72. package/lib/ui-kit.module.d.ts +43 -6
  73. package/lib/utils/metadata-colors.util.d.ts +50 -0
  74. package/lib/utils/tw-overlay-container.d.ts +12 -0
  75. package/package.json +1 -1
  76. package/public-api.d.ts +28 -0
  77. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.eot +0 -0
  78. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.otf +0 -0
  79. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.svg +14730 -0
  80. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.ttf +0 -0
  81. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.woff +0 -0
  82. package/src/assets/fonts/SFUIText-Bold/SF-UI-Text-Bold.woff2 +0 -0
  83. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.eot +0 -0
  84. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.otf +0 -0
  85. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.svg +21333 -0
  86. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.ttf +0 -0
  87. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.woff +0 -0
  88. package/src/assets/fonts/SFUIText-Light/SF-UI-Text-Light.woff2 +0 -0
  89. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.eot +0 -0
  90. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.otf +0 -0
  91. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.svg +14584 -0
  92. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.ttf +0 -0
  93. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.woff +0 -0
  94. package/src/assets/fonts/SFUIText-Medium/SF-UI-Text-Medium.woff2 +0 -0
  95. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.eot +0 -0
  96. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.otf +0 -0
  97. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.svg +17870 -0
  98. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.ttf +0 -0
  99. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.woff +0 -0
  100. package/src/assets/fonts/SFUIText-Regular/SF-UI-Text-Regular.woff2 +0 -0
  101. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.eot +0 -0
  102. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.otf +0 -0
  103. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.svg +14732 -0
  104. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.ttf +0 -0
  105. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.woff +0 -0
  106. package/src/assets/fonts/SFUIText-Semibold/SF-UI-Text-Semibold.woff2 +0 -0
  107. package/src/lib/assets/images/.gitkeep +0 -0
  108. package/src/lib/assets/images/DashboardIcon.png +0 -0
  109. package/src/lib/assets/images/FilesIcon.png +0 -0
  110. package/src/lib/assets/images/README.md +66 -0
  111. package/src/lib/assets/images/ReportsIcon.png +0 -0
  112. package/src/lib/assets/images/SearchIcon.png +0 -0
  113. package/src/lib/assets/images/StepsIcon.png +0 -0
  114. package/src/lib/assets/images/TestCaseIcon.png +0 -0
  115. package/src/lib/assets/images/analytics-chart-icon.svg +11 -0
  116. package/src/lib/assets/images/checklist-add-icon.svg +10 -0
  117. package/src/lib/assets/images/document-gear-icon.svg +9 -0
  118. package/src/lib/assets/images/empty-state-default-icon.svg +8 -0
  119. package/src/lib/assets/images/image-assets.constants.ts +38 -0
  120. package/src/lib/assets/images/search-debug-icon.svg +8 -0
  121. package/src/lib/assets/images/test-case-icon.svg +9 -0
  122. package/src/lib/assets/images/upload-folder-icon.svg +7 -0
  123. package/src/lib/utils/metadata-colors.constants.js +33 -0
  124. package/storybook-static/assets/images/README.md +66 -0
  125. package/styles.css +1 -1
@@ -0,0 +1,35 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "@angular/common";
5
+ export class TestDistributionCardComponent {
6
+ constructor() {
7
+ this.title = 'Test Distribution';
8
+ this.segments = [];
9
+ this.items = [];
10
+ }
11
+ totalSegments() {
12
+ return this.segments.reduce((sum, s) => sum + (s.value || 0), 0) || 1;
13
+ }
14
+ segmentWidth(segment) {
15
+ const total = this.totalSegments();
16
+ const pct = Math.max(0, Math.min(100, (segment.value / total) * 100));
17
+ return pct + '%';
18
+ }
19
+ segmentColor(segment, fallback) {
20
+ return segment.colorClass || fallback;
21
+ }
22
+ }
23
+ TestDistributionCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDistributionCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
24
+ TestDistributionCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDistributionCardComponent, selector: "cqa-test-distribution-card", inputs: { title: "title", segments: "segments", items: "items" }, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-bg-white cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-p-4\">\n <!-- Title -->\n <h3 class=\"cqa-text-[16px] cqa-leading-6 cqa-font-medium cqa-text-[#111827] cqa-mb-3\">{{ title }}</h3>\n\n <!-- Stacked segments pill -->\n <div class=\"cqa-w-full cqa-h-[28px] cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden cqa-flex cqa-mb-3\">\n <ng-container *ngFor=\"let s of segments; let i = index; let last = last\">\n <div\n class=\"cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-text-white cqa-text-[12px] cqa-leading-[12px]\"\n [ngClass]=\"[\n segmentColor(s, i === 0 ? 'cqa-bg-[#4F46E5]' : i === segments.length - 1 ? 'cqa-bg-[#10B981]' : 'cqa-bg-[#8B5CF6]'),\n i === 0 ? 'cqa-rounded-l-full' : '',\n last ? 'cqa-rounded-r-full' : ''\n ]\" [style.width]=\"segmentWidth(s)\">\n {{ s.label }}\n </div>\n </ng-container>\n </div>\n\n <!-- Items list -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let it of items\" class=\"cqa-flex cqa-flex-col\">\n <!-- Parent row -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-py-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-icon class=\"cqa-text-[#6B7280]\" [style.width.px]=\"16\" [style.height.px]=\"16\" [style.fontSize.px]=\"16\"\n *ngIf=\"it.icon\">{{ it.icon }}</mat-icon>\n <span class=\"cqa-text-[14px] cqa-leading-5 cqa-text-[#111827]\">{{ it.label }}</span>\n </div>\n <div class=\"cqa-text-[14px] cqa-leading-5 cqa-font-semibold cqa-text-[#111827]\">{{ it.value | number }}</div>\n </div>\n\n <!-- Children rows -->\n <div *ngIf=\"it.children?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let ch of it.children\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-2 cqa-py-1 cqa-rounded-md cqa-bg-[#F9FAFB] cqa-text-[#6B7280]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <span class=\"cqa-w-[6px] cqa-h-[14px] cqa-rounded-full\"\n [ngClass]=\"ch.colorClass || 'cqa-bg-[#8B5CF6]'\"></span>\n <span class=\"cqa-text-[12px] cqa-leading-5\">\n {{ ch.label }}\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ ch.value }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "number": i2.DecimalPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDistributionCardComponent, decorators: [{
26
+ type: Component,
27
+ args: [{ selector: 'cqa-test-distribution-card', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-w-full cqa-bg-white cqa-rounded-[10px] cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-p-4\">\n <!-- Title -->\n <h3 class=\"cqa-text-[16px] cqa-leading-6 cqa-font-medium cqa-text-[#111827] cqa-mb-3\">{{ title }}</h3>\n\n <!-- Stacked segments pill -->\n <div class=\"cqa-w-full cqa-h-[28px] cqa-rounded-full cqa-bg-[#F3F4F6] cqa-overflow-hidden cqa-flex cqa-mb-3\">\n <ng-container *ngFor=\"let s of segments; let i = index; let last = last\">\n <div\n class=\"cqa-h-full cqa-flex cqa-items-center cqa-justify-center cqa-text-white cqa-text-[12px] cqa-leading-[12px]\"\n [ngClass]=\"[\n segmentColor(s, i === 0 ? 'cqa-bg-[#4F46E5]' : i === segments.length - 1 ? 'cqa-bg-[#10B981]' : 'cqa-bg-[#8B5CF6]'),\n i === 0 ? 'cqa-rounded-l-full' : '',\n last ? 'cqa-rounded-r-full' : ''\n ]\" [style.width]=\"segmentWidth(s)\">\n {{ s.label }}\n </div>\n </ng-container>\n </div>\n\n <!-- Items list -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let it of items\" class=\"cqa-flex cqa-flex-col\">\n <!-- Parent row -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-py-1\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <mat-icon class=\"cqa-text-[#6B7280]\" [style.width.px]=\"16\" [style.height.px]=\"16\" [style.fontSize.px]=\"16\"\n *ngIf=\"it.icon\">{{ it.icon }}</mat-icon>\n <span class=\"cqa-text-[14px] cqa-leading-5 cqa-text-[#111827]\">{{ it.label }}</span>\n </div>\n <div class=\"cqa-text-[14px] cqa-leading-5 cqa-font-semibold cqa-text-[#111827]\">{{ it.value | number }}</div>\n </div>\n\n <!-- Children rows -->\n <div *ngIf=\"it.children?.length\" class=\"cqa-flex cqa-flex-col cqa-gap-2\">\n <div *ngFor=\"let ch of it.children\"\n class=\"cqa-flex cqa-items-center cqa-justify-between cqa-px-2 cqa-py-1 cqa-rounded-md cqa-bg-[#F9FAFB] cqa-text-[#6B7280]\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-2\">\n <span class=\"cqa-w-[6px] cqa-h-[14px] cqa-rounded-full\"\n [ngClass]=\"ch.colorClass || 'cqa-bg-[#8B5CF6]'\"></span>\n <span class=\"cqa-text-[12px] cqa-leading-5\">\n {{ ch.label }}\n <span class=\"cqa-font-semibold cqa-text-[#111827]\">{{ ch.value }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
28
+ }], propDecorators: { title: [{
29
+ type: Input
30
+ }], segments: [{
31
+ type: Input
32
+ }], items: [{
33
+ type: Input
34
+ }] } });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kaXN0cmlidXRpb24tY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rhc2hib2FyZHMvdGVzdC1kaXN0cmlidXRpb24tY2FyZC90ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGFzaGJvYXJkcy90ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkL3Rlc3QtZGlzdHJpYnV0aW9uLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUE2QjFFLE1BQU0sT0FBTyw2QkFBNkI7SUFOMUM7UUFPVyxVQUFLLEdBQVcsbUJBQW1CLENBQUM7UUFDcEMsYUFBUSxHQUEwQixFQUFFLENBQUM7UUFDckMsVUFBSyxHQUF1QixFQUFFLENBQUM7S0FlekM7SUFiQyxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxZQUFZLENBQUMsT0FBNEI7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsWUFBWSxDQUFDLE9BQTRCLEVBQUUsUUFBZ0I7UUFDekQsT0FBTyxPQUFPLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztJQUN4QyxDQUFDOzswSEFqQlUsNkJBQTZCOzhHQUE3Qiw2QkFBNkIsb0lDN0IxQyxta0ZBa0RNOzJGRHJCTyw2QkFBNkI7a0JBTnpDLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNOzhCQUd0QyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvblNlZ21lbnQge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICAvKiogVGFpbHdpbmQtbGlrZSBjbGFzcyBvciBoZXggYmcgY29sb3IgKi9cbiAgY29sb3JDbGFzcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaXN0cmlidXRpb25DaGlsZEl0ZW0ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBjb2xvckNsYXNzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkl0ZW0ge1xuICBpY29uPzogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xuICBjb2xvckNsYXNzPzogc3RyaW5nOyAvLyB1c2VkIGZvciBpY29uL2FjY2VudCBpZiBkZXNpcmVkXG4gIGNoaWxkcmVuPzogRGlzdHJpYnV0aW9uQ2hpbGRJdGVtW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRpc3RyaWJ1dGlvbi1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rlc3QtZGlzdHJpYnV0aW9uLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERpc3RyaWJ1dGlvbkNhcmRDb21wb25lbnQge1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ1Rlc3QgRGlzdHJpYnV0aW9uJztcbiAgQElucHV0KCkgc2VnbWVudHM6IERpc3RyaWJ1dGlvblNlZ21lbnRbXSA9IFtdO1xuICBASW5wdXQoKSBpdGVtczogRGlzdHJpYnV0aW9uSXRlbVtdID0gW107XG5cbiAgdG90YWxTZWdtZW50cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlZ21lbnRzLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyAocy52YWx1ZSB8fCAwKSwgMCkgfHwgMTtcbiAgfVxuXG4gIHNlZ21lbnRXaWR0aChzZWdtZW50OiBEaXN0cmlidXRpb25TZWdtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWxTZWdtZW50cygpO1xuICAgIGNvbnN0IHBjdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgKHNlZ21lbnQudmFsdWUgLyB0b3RhbCkgKiAxMDApKTtcbiAgICByZXR1cm4gcGN0ICsgJyUnO1xuICB9XG5cbiAgc2VnbWVudENvbG9yKHNlZ21lbnQ6IERpc3RyaWJ1dGlvblNlZ21lbnQsIGZhbGxiYWNrOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzZWdtZW50LmNvbG9yQ2xhc3MgfHwgZmFsbGJhY2s7XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIj5cbiAgPGRpdiBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLWJnLXdoaXRlIGNxYS1yb3VuZGVkLVsxMHB4XSBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXAtNFwiPlxuICAgIDwhLS0gVGl0bGUgLS0+XG4gICAgPGgzIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLTYgY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbWItM1wiPnt7IHRpdGxlIH19PC9oMz5cblxuICAgIDwhLS0gU3RhY2tlZCBzZWdtZW50cyBwaWxsIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS1oLVsyOHB4XSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0YzRjRGNl0gY3FhLW92ZXJmbG93LWhpZGRlbiBjcWEtZmxleCBjcWEtbWItM1wiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcyBvZiBzZWdtZW50czsgbGV0IGkgPSBpbmRleDsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImNxYS1oLWZ1bGwgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXRleHQtd2hpdGUgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxMnB4XVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW1xuICAgICAgICAgICAgc2VnbWVudENvbG9yKHMsIGkgPT09IDAgPyAnY3FhLWJnLVsjNEY0NkU1XScgOiBpID09PSBzZWdtZW50cy5sZW5ndGggLSAxID8gJ2NxYS1iZy1bIzEwQjk4MV0nIDogJ2NxYS1iZy1bIzhCNUNGNl0nKSxcbiAgICAgICAgICAgIGkgPT09IDAgPyAnY3FhLXJvdW5kZWQtbC1mdWxsJyA6ICcnLFxuICAgICAgICAgICAgbGFzdCA/ICdjcWEtcm91bmRlZC1yLWZ1bGwnIDogJydcbiAgICAgICAgICBdXCIgW3N0eWxlLndpZHRoXT1cInNlZ21lbnRXaWR0aChzKVwiPlxuICAgICAgICAgIHt7IHMubGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gSXRlbXMgbGlzdCAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXQgb2YgaXRlbXNcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICA8IS0tIFBhcmVudCByb3cgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLXB5LTFcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiIFtzdHlsZS53aWR0aC5weF09XCIxNlwiIFtzdHlsZS5oZWlnaHQucHhdPVwiMTZcIiBbc3R5bGUuZm9udFNpemUucHhdPVwiMTZcIlxuICAgICAgICAgICAgICAqbmdJZj1cIml0Lmljb25cIj57eyBpdC5pY29uIH19PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzE0cHhdIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtWyMxMTE4MjddXCI+e3sgaXQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LVsxNHB4XSBjcWEtbGVhZGluZy01IGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGl0LnZhbHVlIHwgbnVtYmVyIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ2hpbGRyZW4gcm93cyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIml0LmNoaWxkcmVuPy5sZW5ndGhcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjaCBvZiBpdC5jaGlsZHJlblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtcHgtMiBjcWEtcHktMSBjcWEtcm91bmRlZC1tZCBjcWEtYmctWyNGOUZBRkJdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXctWzZweF0gY3FhLWgtWzE0cHhdIGNxYS1yb3VuZGVkLWZ1bGxcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNoLmNvbG9yQ2xhc3MgfHwgJ2NxYS1iZy1bIzhCNUNGNl0nXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy01XCI+XG4gICAgICAgICAgICAgICAge3sgY2gubGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XVwiPnt7IGNoLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=
@@ -55,7 +55,7 @@ export class DialogComponent {
55
55
  'cqa-rounded-2xl',
56
56
  'cqa-shadow-md',
57
57
  'cqa-border',
58
- 'cqa-border-[#E5E7EB]',
58
+ 'cqa-border-border-default',
59
59
  'cqa-p-6',
60
60
  'cqa-text-left',
61
61
  ];
@@ -116,12 +116,12 @@ export class DialogComponent {
116
116
  }
117
117
  }
118
118
  DialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
119
- DialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DialogComponent, selector: "cqa-dialog", viewQueries: [{ propertyName: "portalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true, static: true }], ngImport: i0, template: "<div id=\"cqa-ui-root\" style=\"display: block;\">\n <div class=\"cqa-flex cqa-w-full cqa-justify-center cqa-px-4 sm:cqa-px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-[#111827]\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"cqa-text-sm cqa-leading-6 cqa-text-[#4B5563]\">\n {{ config.description }}\n </p>\n\n <div\n *ngIf=\"config.warning\"\n class=\"cqa-rounded-xl cqa-border cqa-border-red-200 cqa-bg-red-50 cqa-px-4 cqa-py-3 cqa-text-sm cqa-leading-5 cqa-text-red-700\"\n >\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"cqa-text-sm cqa-text-[#111827]\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"cqa-mt-4 cqa-flex cqa-flex-wrap cqa-gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button\n *ngFor=\"let button of config.buttons\"\n type=\"button\"\n [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\"\n (clicked)=\"onButtonClick(button)\"\n >\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "type"], outputs: ["clicked"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
119
+ DialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DialogComponent, selector: "cqa-dialog", viewQueries: [{ propertyName: "portalOutlet", first: true, predicate: CdkPortalOutlet, descendants: true, static: true }], ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-flex cqa-w-full cqa-justify-center cqa-px-4 sm:cqa-px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-dialog\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"cqa-text-sm cqa-leading-6 cqa-text-dialog-secondary\">\n {{ config.description }}\n </p>\n\n <div *ngIf=\"config.warning\"\n class=\"cqa-rounded-xl cqa-border cqa-border-red-200 cqa-bg-red-50 cqa-px-4 cqa-py-3 cqa-text-sm cqa-leading-5 cqa-text-red-700\">\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"cqa-text-sm cqa-text-dialog\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"cqa-mt-4 cqa-flex cqa-flex-wrap cqa-gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button *ngFor=\"let button of config.buttons\" type=\"button\" [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\" (clicked)=\"onButtonClick(button)\">\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>", components: [{ type: i1.ButtonComponent, selector: "cqa-button", inputs: ["variant", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass"], outputs: ["clicked"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
120
120
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogComponent, decorators: [{
121
121
  type: Component,
122
- args: [{ selector: 'cqa-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\" style=\"display: block;\">\n <div class=\"cqa-flex cqa-w-full cqa-justify-center cqa-px-4 sm:cqa-px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-[#111827]\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"cqa-text-sm cqa-leading-6 cqa-text-[#4B5563]\">\n {{ config.description }}\n </p>\n\n <div\n *ngIf=\"config.warning\"\n class=\"cqa-rounded-xl cqa-border cqa-border-red-200 cqa-bg-red-50 cqa-px-4 cqa-py-3 cqa-text-sm cqa-leading-5 cqa-text-red-700\"\n >\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"cqa-text-sm cqa-text-[#111827]\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"cqa-mt-4 cqa-flex cqa-flex-wrap cqa-gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button\n *ngFor=\"let button of config.buttons\"\n type=\"button\"\n [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\"\n (clicked)=\"onButtonClick(button)\"\n >\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n", styles: [] }]
122
+ args: [{ selector: 'cqa-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <div class=\"cqa-flex cqa-w-full cqa-justify-center cqa-px-4 sm:cqa-px-6\">\n <div [ngClass]=\"panelClassList\" [ngStyle]=\"panelStyles\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-5\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <h2 class=\"cqa-text-lg cqa-font-semibold cqa-text-dialog\">\n {{ config.title }}\n </h2>\n\n <p *ngIf=\"config.description\" class=\"cqa-text-sm cqa-leading-6 cqa-text-dialog-secondary\">\n {{ config.description }}\n </p>\n\n <div *ngIf=\"config.warning\"\n class=\"cqa-rounded-xl cqa-border cqa-border-red-200 cqa-bg-red-50 cqa-px-4 cqa-py-3 cqa-text-sm cqa-leading-5 cqa-text-red-700\">\n {{ config.warning }}\n </div>\n </div>\n\n <div class=\"cqa-text-sm cqa-text-dialog\" [class.hidden]=\"!contentAttached\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n\n <div class=\"cqa-mt-4 cqa-flex cqa-flex-wrap cqa-gap-3\" [ngClass]=\"buttonAlignmentClass\">\n <cqa-button *ngFor=\"let button of config.buttons\" type=\"button\" [variant]=\"buttonVariant(button)\"\n [ngClass]=\"buttonHostClasses(button)\" (clicked)=\"onButtonClick(button)\">\n {{ button.label }}\n </cqa-button>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [] }]
123
123
  }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { portalOutlet: [{
124
124
  type: ViewChild,
125
125
  args: [CdkPortalOutlet, { static: true }]
126
126
  }] } });
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQVd2RixNQUFNLE9BQU8sZUFBZTtJQVMxQixZQUE2QixnQkFBa0MsRUFBbUIsR0FBc0I7UUFBM0UscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFtQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUZ4RyxvQkFBZSxHQUFHLEtBQUssQ0FBQztJQUVtRixDQUFDO0lBRTVHLGNBQWMsQ0FBQyxRQUE4QixFQUFFLE9BQWlDO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUVELE1BQU0sZUFBZSxHQUNuQixPQUFPO1lBQ1A7Z0JBQ0UsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSTtnQkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSTthQUN4QixDQUFDO1FBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxlQUFlLENBQUMsU0FBbUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQW1DO1FBQ3JELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2pELElBQUksYUFBYSxHQUE2RCxTQUFTLENBQUM7UUFFeEYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoRDtRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFeEYsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQStCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLElBQUksT0FBTyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsY0FBYztZQUNkLFlBQVk7WUFDWixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixZQUFZO1lBQ1osc0JBQXNCO1lBQ3RCLFNBQVM7WUFDVCxlQUFlO1NBQ2hCLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUs7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU87U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBbUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxNQUFNO2dCQUNULE9BQU8sTUFBTSxDQUFDO1lBQ2hCLEtBQUssT0FBTztnQkFDVixPQUFPLE9BQU8sQ0FBQztZQUNqQixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxRQUFRLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBbUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBZ0M7UUFDMUQsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxNQUFNO2dCQUNULE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsS0FBSyxRQUFRO2dCQUNYLE9BQU8sb0JBQW9CLENBQUM7WUFDOUIsS0FBSyxPQUFPLENBQUM7WUFDYjtnQkFDRSxPQUFPLGlCQUFpQixDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBd0I7UUFDNUMsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7NEdBeklVLGVBQWU7Z0dBQWYsZUFBZSxnR0FFZixlQUFlLDhEQ3RCNUIseS9DQTBDQTsyRkR0QmEsZUFBZTtrQkFOM0IsU0FBUzsrQkFDRSxZQUFZLG1CQUdMLHVCQUF1QixDQUFDLE1BQU07dUlBSUQsWUFBWTtzQkFBekQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDZGtQb3J0YWxPdXRsZXQsIENvbXBvbmVudFBvcnRhbCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERpYWxvZ0J1dHRvbkFsaWdubWVudCwgRGlhbG9nQnV0dG9uQ29uZmlnLCBEaWFsb2dDb25maWcsIERpYWxvZ0NvbnRlbnRDb25maWcgfSBmcm9tICcuL2RpYWxvZy5tb2RlbHMnO1xuaW1wb3J0IHsgQnV0dG9uVmFyaWFudCB9IGZyb20gJy4uL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IERpYWxvZ1JlZiB9IGZyb20gJy4vZGlhbG9nLXJlZic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1kaWFsb2cnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIERpYWxvZ0NvbXBvbmVudDxUUmVzdWx0ID0gdW5rbm93bj4ge1xuXG4gIEBWaWV3Q2hpbGQoQ2RrUG9ydGFsT3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9KSBwb3J0YWxPdXRsZXQ/OiBDZGtQb3J0YWxPdXRsZXQ7XG5cbiAgY29uZmlnITogRGlhbG9nQ29uZmlnPERpYWxvZ0NvbnRlbnRDb25maWcsIFRSZXN1bHQ+O1xuICBkaWFsb2dSZWYhOiBEaWFsb2dSZWY8VFJlc3VsdD47XG5cbiAgY29udGVudEF0dGFjaGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgYXR0YWNoVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+LCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9ydGFsT3V0bGV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVDb250ZXh0ID1cbiAgICAgIGNvbnRleHQgPz9cbiAgICAgIHtcbiAgICAgICAgJGltcGxpY2l0OiB0aGlzLmNvbmZpZz8uZGF0YSxcbiAgICAgICAgZGF0YTogdGhpcy5jb25maWc/LmRhdGEsXG4gICAgICB9O1xuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0ZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZUNvbnRleHQpO1xuICAgIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCk7XG4gICAgdGhpcy5tYXJrQ29udGVudEF0dGFjaGVkKCk7XG4gIH1cblxuICBhdHRhY2hDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnRQb3J0YWw8dW5rbm93bj4pOiBDb21wb25lbnRSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5wb3J0YWxPdXRsZXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5wb3J0YWxPdXRsZXQuYXR0YWNoQ29tcG9uZW50UG9ydGFsKGNvbXBvbmVudCk7XG4gICAgdGhpcy5tYXJrQ29udGVudEF0dGFjaGVkKCk7XG4gICAgcmV0dXJuIGNvbXBvbmVudFJlZjtcbiAgfVxuXG4gIGFzeW5jIG9uQnV0dG9uQ2xpY2soYnV0dG9uOiBEaWFsb2dCdXR0b25Db25maWc8VFJlc3VsdD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zZU9uQ2xpY2sgPSBidXR0b24uY2xvc2VPbkNsaWNrID8/IHRydWU7XG4gICAgbGV0IGhhbmRsZXJSZXN1bHQ6IFRSZXN1bHQgfCBmYWxzZSB8IHZvaWQgfCBQcm9taXNlPFRSZXN1bHQgfCBmYWxzZSB8IHZvaWQ+ID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGJ1dHRvbi5oYW5kbGVyKSB7XG4gICAgICBoYW5kbGVyUmVzdWx0ID0gYnV0dG9uLmhhbmRsZXIodGhpcy5kaWFsb2dSZWYpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkID0gaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UgPyBhd2FpdCBoYW5kbGVyUmVzdWx0IDogaGFuZGxlclJlc3VsdDtcblxuICAgIGlmICghY2xvc2VPbkNsaWNrIHx8IHJlc29sdmVkID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc29sdmVkIGFzIFRSZXN1bHQgfCB1bmRlZmluZWQpO1xuICB9XG5cbiAgZ2V0IGJ1dHRvbkFsaWdubWVudENsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgYWxpZ25tZW50ID0gdGhpcy5jb25maWc/LmJ1dHRvbkFsaWdubWVudCA/PyAncmlnaHQnO1xuICAgIHJldHVybiB0aGlzLm1hcEFsaWdubWVudFRvQ2xhc3MoYWxpZ25tZW50KTtcbiAgfVxuXG4gIGdldCBwYW5lbENsYXNzTGlzdCgpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgICAnY3FhLXJlbGF0aXZlJyxcbiAgICAgICdjcWEtdy1mdWxsJyxcbiAgICAgICdjcWEtYmctd2hpdGUnLFxuICAgICAgJ2NxYS1yb3VuZGVkLTJ4bCcsXG4gICAgICAnY3FhLXNoYWRvdy1tZCcsXG4gICAgICAnY3FhLWJvcmRlcicsXG4gICAgICAnY3FhLWJvcmRlci1bI0U1RTdFQl0nLFxuICAgICAgJ2NxYS1wLTYnLFxuICAgICAgJ2NxYS10ZXh0LWxlZnQnLFxuICAgIF07XG5cbiAgICBjb25zdCBjdXN0b20gPSB0aGlzLmNvbmZpZz8ucGFuZWxDbGFzcztcblxuICAgIGlmICghY3VzdG9tKSB7XG4gICAgICByZXR1cm4gYmFzZUNsYXNzZXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY3VzdG9tKSA/IFsuLi5iYXNlQ2xhc3NlcywgLi4uY3VzdG9tXSA6IFsuLi5iYXNlQ2xhc3NlcywgY3VzdG9tXTtcbiAgfVxuXG4gIGdldCBwYW5lbFN0eWxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY29uZmlnPy53aWR0aCxcbiAgICAgIG1heFdpZHRoOiB0aGlzLmNvbmZpZz8ubWF4V2lkdGggPz8gJzQ4MHB4JyxcbiAgICB9O1xuICB9XG5cbiAgYnV0dG9uVmFyaWFudChidXR0b246IERpYWxvZ0J1dHRvbkNvbmZpZzxUUmVzdWx0Pik6IEJ1dHRvblZhcmlhbnQge1xuICAgIGNvbnN0IHJvbGUgPSB0aGlzLm5vcm1hbGl6ZVJvbGUoYnV0dG9uLnJvbGUpO1xuXG4gICAgc3dpdGNoIChyb2xlKSB7XG4gICAgICBjYXNlICdzZWNvbmRhcnknOlxuICAgICAgICByZXR1cm4gJ291dGxpbmVkJztcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgICByZXR1cm4gJ3RleHQnO1xuICAgICAgY2FzZSAndG9uYWwnOlxuICAgICAgICByZXR1cm4gJ3RvbmFsJztcbiAgICAgIGNhc2UgJ2VsZXZhdGVkJzpcbiAgICAgICAgcmV0dXJuICdlbGV2YXRlZCc7XG4gICAgICBjYXNlICdmaWxsZWQnOlxuICAgICAgY2FzZSAncHJpbWFyeSc6XG4gICAgICBjYXNlICd3YXJuJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnZmlsbGVkJztcbiAgICB9XG4gIH1cblxuICBidXR0b25Ib3N0Q2xhc3NlcyhidXR0b246IERpYWxvZ0J1dHRvbkNvbmZpZzxUUmVzdWx0Pik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByb2xlID0gdGhpcy5ub3JtYWxpemVSb2xlKGJ1dHRvbi5yb2xlKTtcblxuICAgIGlmIChyb2xlID09PSAnd2FybicpIHtcbiAgICAgIHJldHVybiBbJ2NxYS1kaWFsb2ctYnRuLXdhcm4nXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwcml2YXRlIG1hcEFsaWdubWVudFRvQ2xhc3MoYWxpZ25tZW50OiBEaWFsb2dCdXR0b25BbGlnbm1lbnQpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoYWxpZ25tZW50KSB7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgcmV0dXJuICdjcWEtanVzdGlmeS1zdGFydCc7XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICByZXR1cm4gJ2NxYS1qdXN0aWZ5LWNlbnRlcic7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2NxYS1qdXN0aWZ5LWVuZCc7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQ29udGVudEF0dGFjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEF0dGFjaGVkID0gdHJ1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplUm9sZShyb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiAocm9sZSA/PyAnc2Vjb25kYXJ5JykudHJpbSgpLnNwbGl0KC9cXHMrLylbMF07XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLXctZnVsbCBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXB4LTQgc206Y3FhLXB4LTZcIj5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInBhbmVsQ2xhc3NMaXN0XCIgW25nU3R5bGVdPVwicGFuZWxTdHlsZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC01XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zXCI+XG4gICAgICAgICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtbGcgY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddXCI+XG4gICAgICAgICAgICB7eyBjb25maWcudGl0bGUgfX1cbiAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgPHAgKm5nSWY9XCJjb25maWcuZGVzY3JpcHRpb25cIiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLTYgY3FhLXRleHQtWyM0QjU1NjNdXCI+XG4gICAgICAgICAgICB7eyBjb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAqbmdJZj1cImNvbmZpZy53YXJuaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXJvdW5kZWQteGwgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXJlZC0yMDAgY3FhLWJnLXJlZC01MCBjcWEtcHgtNCBjcWEtcHktMyBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy01IGNxYS10ZXh0LXJlZC03MDBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGNvbmZpZy53YXJuaW5nIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGV4dC1zbSBjcWEtdGV4dC1bIzExMTgyN11cIiBbY2xhc3MuaGlkZGVuXT1cIiFjb250ZW50QXR0YWNoZWRcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgY2RrUG9ydGFsT3V0bGV0PjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbXQtNCBjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1nYXAtM1wiIFtuZ0NsYXNzXT1cImJ1dHRvbkFsaWdubWVudENsYXNzXCI+XG4gICAgICAgICAgPGNxYS1idXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBidXR0b24gb2YgY29uZmlnLmJ1dHRvbnNcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbdmFyaWFudF09XCJidXR0b25WYXJpYW50KGJ1dHRvbilcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiYnV0dG9uSG9zdENsYXNzZXMoYnV0dG9uKVwiXG4gICAgICAgICAgICAoY2xpY2tlZCk9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGJ1dHRvbi5sYWJlbCB9fVxuICAgICAgICAgIDwvY3FhLWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuXG4iXX0=
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBR1QsU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQW1CLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7OztBQVd2RixNQUFNLE9BQU8sZUFBZTtJQVMxQixZQUE2QixnQkFBa0MsRUFBbUIsR0FBc0I7UUFBM0UscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFtQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUZ4RyxvQkFBZSxHQUFHLEtBQUssQ0FBQztJQUVtRixDQUFDO0lBRTVHLGNBQWMsQ0FBQyxRQUE4QixFQUFFLE9BQWlDO1FBQzlFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE9BQU87U0FDUjtRQUVELE1BQU0sZUFBZSxHQUNuQixPQUFPO1lBQ1A7Z0JBQ0UsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSTtnQkFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSTthQUN4QixDQUFDO1FBQ0osTUFBTSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxlQUFlLENBQUMsU0FBbUM7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQW1DO1FBQ3JELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ2pELElBQUksYUFBYSxHQUE2RCxTQUFTLENBQUM7UUFFeEYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoRDtRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFFeEYsSUFBSSxDQUFDLFlBQVksSUFBSSxRQUFRLEtBQUssS0FBSyxFQUFFO1lBQ3ZDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQStCLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxlQUFlLElBQUksT0FBTyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxXQUFXLEdBQUc7WUFDbEIsY0FBYztZQUNkLFlBQVk7WUFDWixjQUFjO1lBQ2QsaUJBQWlCO1lBQ2pCLGVBQWU7WUFDZixZQUFZO1lBQ1osMkJBQTJCO1lBQzNCLFNBQVM7WUFDVCxlQUFlO1NBQ2hCLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsT0FBTyxXQUFXLENBQUM7U0FDcEI7UUFFRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTztZQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUs7WUFDekIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU87U0FDM0MsQ0FBQztJQUNKLENBQUM7SUFFRCxhQUFhLENBQUMsTUFBbUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsUUFBUSxJQUFJLEVBQUU7WUFDWixLQUFLLFdBQVc7Z0JBQ2QsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxNQUFNO2dCQUNULE9BQU8sTUFBTSxDQUFDO1lBQ2hCLEtBQUssT0FBTztnQkFDVixPQUFPLE9BQU8sQ0FBQztZQUNqQixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssTUFBTSxDQUFDO1lBQ1o7Z0JBQ0UsT0FBTyxRQUFRLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBbUM7UUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU8sbUJBQW1CLENBQUMsU0FBZ0M7UUFDMUQsUUFBUSxTQUFTLEVBQUU7WUFDakIsS0FBSyxNQUFNO2dCQUNULE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsS0FBSyxRQUFRO2dCQUNYLE9BQU8sb0JBQW9CLENBQUM7WUFDOUIsS0FBSyxPQUFPLENBQUM7WUFDYjtnQkFDRSxPQUFPLGlCQUFpQixDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhLENBQUMsSUFBd0I7UUFDNUMsT0FBTyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7NEdBeklVLGVBQWU7Z0dBQWYsZUFBZSxnR0FFZixlQUFlLDhEQ3RCNUIsaTRDQWdDTTsyRkRaTyxlQUFlO2tCQU4zQixTQUFTOytCQUNFLFlBQVksbUJBR0wsdUJBQXVCLENBQUMsTUFBTTt1SUFJRCxZQUFZO3NCQUF6RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50UmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka1BvcnRhbE91dGxldCwgQ29tcG9uZW50UG9ydGFsLCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgRGlhbG9nQnV0dG9uQWxpZ25tZW50LCBEaWFsb2dCdXR0b25Db25maWcsIERpYWxvZ0NvbmZpZywgRGlhbG9nQ29udGVudENvbmZpZyB9IGZyb20gJy4vZGlhbG9nLm1vZGVscyc7XG5pbXBvcnQgeyBCdXR0b25WYXJpYW50IH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGlhbG9nUmVmIH0gZnJvbSAnLi9kaWFsb2ctcmVmJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3FhLWRpYWxvZycsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRGlhbG9nQ29tcG9uZW50PFRSZXN1bHQgPSB1bmtub3duPiB7XG5cbiAgQFZpZXdDaGlsZChDZGtQb3J0YWxPdXRsZXQsIHsgc3RhdGljOiB0cnVlIH0pIHBvcnRhbE91dGxldD86IENka1BvcnRhbE91dGxldDtcblxuICBjb25maWchOiBEaWFsb2dDb25maWc8RGlhbG9nQ29udGVudENvbmZpZywgVFJlc3VsdD47XG4gIGRpYWxvZ1JlZiE6IERpYWxvZ1JlZjxUUmVzdWx0PjtcblxuICBjb250ZW50QXR0YWNoZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBhdHRhY2hUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4sIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3J0YWxPdXRsZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0ZW1wbGF0ZUNvbnRleHQgPVxuICAgICAgY29udGV4dCA/P1xuICAgICAge1xuICAgICAgICAkaW1wbGljaXQ6IHRoaXMuY29uZmlnPy5kYXRhLFxuICAgICAgICBkYXRhOiB0aGlzLmNvbmZpZz8uZGF0YSxcbiAgICAgIH07XG4gICAgY29uc3QgcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRlbXBsYXRlLCB0aGlzLnZpZXdDb250YWluZXJSZWYsIHRlbXBsYXRlQ29udGV4dCk7XG4gICAgdGhpcy5wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTtcbiAgICB0aGlzLm1hcmtDb250ZW50QXR0YWNoZWQoKTtcbiAgfVxuXG4gIGF0dGFjaENvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudFBvcnRhbDx1bmtub3duPik6IENvbXBvbmVudFJlZjx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnBvcnRhbE91dGxldCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnBvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwoY29tcG9uZW50KTtcbiAgICB0aGlzLm1hcmtDb250ZW50QXR0YWNoZWQoKTtcbiAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICB9XG5cbiAgYXN5bmMgb25CdXR0b25DbGljayhidXR0b246IERpYWxvZ0J1dHRvbkNvbmZpZzxUUmVzdWx0Pik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3NlT25DbGljayA9IGJ1dHRvbi5jbG9zZU9uQ2xpY2sgPz8gdHJ1ZTtcbiAgICBsZXQgaGFuZGxlclJlc3VsdDogVFJlc3VsdCB8IGZhbHNlIHwgdm9pZCB8IFByb21pc2U8VFJlc3VsdCB8IGZhbHNlIHwgdm9pZD4gPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYnV0dG9uLmhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXJSZXN1bHQgPSBidXR0b24uaGFuZGxlcih0aGlzLmRpYWxvZ1JlZik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IGhhbmRsZXJSZXN1bHQgOiBoYW5kbGVyUmVzdWx0O1xuXG4gICAgaWYgKCFjbG9zZU9uQ2xpY2sgfHwgcmVzb2x2ZWQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UocmVzb2x2ZWQgYXMgVFJlc3VsdCB8IHVuZGVmaW5lZCk7XG4gIH1cblxuICBnZXQgYnV0dG9uQWxpZ25tZW50Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLmNvbmZpZz8uYnV0dG9uQWxpZ25tZW50ID8/ICdyaWdodCc7XG4gICAgcmV0dXJuIHRoaXMubWFwQWxpZ25tZW50VG9DbGFzcyhhbGlnbm1lbnQpO1xuICB9XG5cbiAgZ2V0IHBhbmVsQ2xhc3NMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS13LWZ1bGwnLFxuICAgICAgJ2NxYS1iZy13aGl0ZScsXG4gICAgICAnY3FhLXJvdW5kZWQtMnhsJyxcbiAgICAgICdjcWEtc2hhZG93LW1kJyxcbiAgICAgICdjcWEtYm9yZGVyJyxcbiAgICAgICdjcWEtYm9yZGVyLWJvcmRlci1kZWZhdWx0JyxcbiAgICAgICdjcWEtcC02JyxcbiAgICAgICdjcWEtdGV4dC1sZWZ0JyxcbiAgICBdO1xuXG4gICAgY29uc3QgY3VzdG9tID0gdGhpcy5jb25maWc/LnBhbmVsQ2xhc3M7XG5cbiAgICBpZiAoIWN1c3RvbSkge1xuICAgICAgcmV0dXJuIGJhc2VDbGFzc2VzO1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGN1c3RvbSkgPyBbLi4uYmFzZUNsYXNzZXMsIC4uLmN1c3RvbV0gOiBbLi4uYmFzZUNsYXNzZXMsIGN1c3RvbV07XG4gIH1cblxuICBnZXQgcGFuZWxTdHlsZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0aGlzLmNvbmZpZz8ud2lkdGgsXG4gICAgICBtYXhXaWR0aDogdGhpcy5jb25maWc/Lm1heFdpZHRoID8/ICc0ODBweCcsXG4gICAgfTtcbiAgfVxuXG4gIGJ1dHRvblZhcmlhbnQoYnV0dG9uOiBEaWFsb2dCdXR0b25Db25maWc8VFJlc3VsdD4pOiBCdXR0b25WYXJpYW50IHtcbiAgICBjb25zdCByb2xlID0gdGhpcy5ub3JtYWxpemVSb2xlKGJ1dHRvbi5yb2xlKTtcblxuICAgIHN3aXRjaCAocm9sZSkge1xuICAgICAgY2FzZSAnc2Vjb25kYXJ5JzpcbiAgICAgICAgcmV0dXJuICdvdXRsaW5lZCc7XG4gICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICAgIGNhc2UgJ3RvbmFsJzpcbiAgICAgICAgcmV0dXJuICd0b25hbCc7XG4gICAgICBjYXNlICdlbGV2YXRlZCc6XG4gICAgICAgIHJldHVybiAnZWxldmF0ZWQnO1xuICAgICAgY2FzZSAnZmlsbGVkJzpcbiAgICAgIGNhc2UgJ3ByaW1hcnknOlxuICAgICAgY2FzZSAnd2Fybic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2ZpbGxlZCc7XG4gICAgfVxuICB9XG5cbiAgYnV0dG9uSG9zdENsYXNzZXMoYnV0dG9uOiBEaWFsb2dCdXR0b25Db25maWc8VFJlc3VsdD4pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgcm9sZSA9IHRoaXMubm9ybWFsaXplUm9sZShidXR0b24ucm9sZSk7XG5cbiAgICBpZiAocm9sZSA9PT0gJ3dhcm4nKSB7XG4gICAgICByZXR1cm4gWydjcWEtZGlhbG9nLWJ0bi13YXJuJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBBbGlnbm1lbnRUb0NsYXNzKGFsaWdubWVudDogRGlhbG9nQnV0dG9uQWxpZ25tZW50KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiAnY3FhLWp1c3RpZnktc3RhcnQnO1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgcmV0dXJuICdjcWEtanVzdGlmeS1jZW50ZXInO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdjcWEtanVzdGlmeS1lbmQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFya0NvbnRlbnRBdHRhY2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRlbnRBdHRhY2hlZCA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVJvbGUocm9sZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHJvbGUgPz8gJ3NlY29uZGFyeScpLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzBdO1xuICB9XG59XG5cblxuIiwiPGRpdiBpZD1cImNxYS11aS1yb290XCI+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtcHgtNCBzbTpjcWEtcHgtNlwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwicGFuZWxDbGFzc0xpc3RcIiBbbmdTdHlsZV09XCJwYW5lbFN0eWxlc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICAgICAgICA8aDIgY2xhc3M9XCJjcWEtdGV4dC1sZyBjcWEtZm9udC1zZW1pYm9sZCBjcWEtdGV4dC1kaWFsb2dcIj5cbiAgICAgICAgICAgIHt7IGNvbmZpZy50aXRsZSB9fVxuICAgICAgICAgIDwvaDI+XG5cbiAgICAgICAgICA8cCAqbmdJZj1cImNvbmZpZy5kZXNjcmlwdGlvblwiIGNsYXNzPVwiY3FhLXRleHQtc20gY3FhLWxlYWRpbmctNiBjcWEtdGV4dC1kaWFsb2ctc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICB7eyBjb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLndhcm5pbmdcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtcm91bmRlZC14bCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItcmVkLTIwMCBjcWEtYmctcmVkLTUwIGNxYS1weC00IGNxYS1weS0zIGNxYS10ZXh0LXNtIGNxYS1sZWFkaW5nLTUgY3FhLXRleHQtcmVkLTcwMFwiPlxuICAgICAgICAgICAge3sgY29uZmlnLndhcm5pbmcgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS10ZXh0LXNtIGNxYS10ZXh0LWRpYWxvZ1wiIFtjbGFzcy5oaWRkZW5dPVwiIWNvbnRlbnRBdHRhY2hlZFwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBjZGtQb3J0YWxPdXRsZXQ+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1tdC00IGNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWdhcC0zXCIgW25nQ2xhc3NdPVwiYnV0dG9uQWxpZ25tZW50Q2xhc3NcIj5cbiAgICAgICAgICA8Y3FhLWJ1dHRvbiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGNvbmZpZy5idXR0b25zXCIgdHlwZT1cImJ1dHRvblwiIFt2YXJpYW50XT1cImJ1dHRvblZhcmlhbnQoYnV0dG9uKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJidXR0b25Ib3N0Q2xhc3NlcyhidXR0b24pXCIgKGNsaWNrZWQpPVwib25CdXR0b25DbGljayhidXR0b24pXCI+XG4gICAgICAgICAgICB7eyBidXR0b24ubGFiZWwgfX1cbiAgICAgICAgICA8L2NxYS1idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,189 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/icon";
4
+ import * as i2 from "@angular/common";
5
+ export class DropdownButtonComponent {
6
+ constructor() {
7
+ this.label = 'Select an option';
8
+ this.options = [];
9
+ this.disabled = false;
10
+ this.selectionChange = new EventEmitter();
11
+ this.opened = new EventEmitter();
12
+ this.closed = new EventEmitter();
13
+ this.isOpen = false;
14
+ this.clickInside = false;
15
+ }
16
+ get displayLabel() {
17
+ if (this.selectedValue !== undefined && this.selectedValue !== null) {
18
+ const selectedOption = this.options.find(opt => opt.value === this.selectedValue);
19
+ return selectedOption ? selectedOption.label : this.label;
20
+ }
21
+ return this.placeholder || this.label;
22
+ }
23
+ get buttonClasses() {
24
+ const baseClasses = [
25
+ 'cqa-h-9',
26
+ 'cqa-px-3',
27
+ 'cqa-py-2',
28
+ 'cqa-bg-gray-100',
29
+ 'cqa-rounded-[5px]',
30
+ 'cqa-outline',
31
+ 'cqa-outline-1',
32
+ 'cqa-outline-offset-[-1px]',
33
+ 'cqa-outline-gray-200',
34
+ 'cqa-inline-flex',
35
+ 'cqa-justify-center',
36
+ 'cqa-items-center',
37
+ 'cqa-gap-1',
38
+ 'cqa-cursor-pointer',
39
+ 'cqa-transition-colors'
40
+ ];
41
+ if (this.disabled) {
42
+ baseClasses.push('cqa-opacity-50', 'cqa-cursor-not-allowed');
43
+ }
44
+ else {
45
+ baseClasses.push('cqa-hover:cqa-bg-gray-200');
46
+ }
47
+ if (this.isOpen) {
48
+ baseClasses.push('cqa-bg-gray-200');
49
+ }
50
+ return baseClasses.join(' ');
51
+ }
52
+ get labelClasses() {
53
+ return [
54
+ 'cqa-text-center',
55
+ 'cqa-justify-center',
56
+ 'cqa-text-gray-950',
57
+ 'cqa-text-xs',
58
+ 'cqa-font-medium',
59
+ 'cqa-leading-4'
60
+ ].join(' ');
61
+ }
62
+ get arrowClasses() {
63
+ const baseClasses = [
64
+ 'cqa-w-4',
65
+ 'cqa-h-4',
66
+ 'cqa-relative',
67
+ 'cqa-transition-transform'
68
+ ];
69
+ if (this.isOpen) {
70
+ baseClasses.push('cqa-rotate-180');
71
+ }
72
+ return baseClasses.join(' ');
73
+ }
74
+ toggleDropdown(event) {
75
+ if (this.disabled)
76
+ return;
77
+ if (event) {
78
+ event.stopPropagation();
79
+ event.preventDefault();
80
+ this.clickInside = true;
81
+ }
82
+ this.isOpen = !this.isOpen;
83
+ // Reset clickInside flag after a short delay
84
+ setTimeout(() => {
85
+ this.clickInside = false;
86
+ if (this.isOpen) {
87
+ this.opened.emit();
88
+ }
89
+ else {
90
+ this.closed.emit();
91
+ }
92
+ }, 100);
93
+ }
94
+ selectOption(option, event) {
95
+ if (option.disabled)
96
+ return;
97
+ if (event) {
98
+ event.stopPropagation();
99
+ this.clickInside = true;
100
+ }
101
+ this.selectedValue = option.value;
102
+ this.isOpen = false;
103
+ this.selectionChange.emit(option.value);
104
+ this.closed.emit();
105
+ // Reset flag after selection
106
+ setTimeout(() => {
107
+ this.clickInside = false;
108
+ }, 100);
109
+ }
110
+ getButtonWidth() {
111
+ if (this.buttonElement?.nativeElement) {
112
+ const width = this.buttonElement.nativeElement.offsetWidth;
113
+ return width > 0 ? width : 150; // Fallback to 150px if width is 0
114
+ }
115
+ return 150; // Default fallback width
116
+ }
117
+ getOptionClasses(option) {
118
+ const baseClasses = [
119
+ 'cqa-p-1.5',
120
+ 'cqa-rounded-md',
121
+ 'cqa-inline-flex',
122
+ 'cqa-justify-start',
123
+ 'cqa-items-center',
124
+ 'cqa-cursor-pointer',
125
+ 'cqa-transition-colors'
126
+ ];
127
+ if (option.disabled) {
128
+ baseClasses.push('cqa-opacity-50', 'cqa-cursor-not-allowed');
129
+ }
130
+ else {
131
+ baseClasses.push('cqa-hover:cqa-bg-gray-50');
132
+ }
133
+ if (this.selectedValue === option.value) {
134
+ baseClasses.push('cqa-bg-primary-surface');
135
+ }
136
+ return baseClasses.join(' ');
137
+ }
138
+ onDocumentClick(event) {
139
+ // Ignore if click was inside the component (button click)
140
+ if (this.clickInside) {
141
+ return;
142
+ }
143
+ // Use a longer delay to ensure dropdown has time to render
144
+ setTimeout(() => {
145
+ if (!this.isOpen)
146
+ return;
147
+ const target = event.target;
148
+ // Check if click is inside the component container
149
+ if (this.dropdownContainer?.nativeElement?.contains(target)) {
150
+ return;
151
+ }
152
+ // Close dropdown if click is outside
153
+ this.isOpen = false;
154
+ this.closed.emit();
155
+ }, 200);
156
+ }
157
+ }
158
+ DropdownButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DropdownButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
159
+ DropdownButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DropdownButtonComponent, selector: "cqa-dropdown-button", inputs: { label: "label", options: "options", selectedValue: "selectedValue", disabled: "disabled", placeholder: "placeholder" }, outputs: { selectionChange: "selectionChange", opened: "opened", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "dropdownContainer", first: true, predicate: ["dropdownContainer"], descendants: true }, { propertyName: "buttonElement", first: true, predicate: ["buttonElement"], descendants: true }], ngImport: i0, template: "<div id=\"cqa-ui-root\" #dropdownContainer style=\"position: relative; display: inline-block; width: auto;\">\n <button\n #buttonElement\n type=\"button\"\n [class]=\"buttonClasses\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-haspopup]=\"true\"\n >\n <div [class]=\"labelClasses\">\n {{ displayLabel }}\n </div>\n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </button>\n\n <!-- Dropdown Menu -->\n <div\n *ngIf=\"isOpen && options && options.length > 0\"\n class=\"cqa-absolute cqa-top-full cqa-left-0 cqa-mt-1 cqa-p-1.5 cqa-bg-white cqa-rounded-lg cqa-shadow-[0px_2px_4px_-2px_rgba(0,0,0,0.10)] cqa-shadow-md cqa-outline cqa-outline-1 cqa-outline-offset-[-1px] cqa-outline-gray-200 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-z-[9999] cqa-w-auto cqa-max-w-[350px]\"\n >\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5 cqa-w-full\">\n <div\n *ngFor=\"let option of options\"\n (click)=\"selectOption(option, $event)\"\n [class]=\"getOptionClasses(option)\"\n class=\"cqa-w-full cqa-whitespace-nowrap\"\n >\n <div class=\"cqa-w-6 cqa-h-4 cqa-pr-2 cqa-inline-flex cqa-flex-col cqa-justify-center cqa-items-center\">\n <mat-icon\n *ngIf=\"selectedValue === option.value\"\n class=\"cqa-w-4 cqa-h-4 cqa-text-primary cqa-text-base cqa-leading-4\"\n >check</mat-icon>\n </div>\n <div class=\"cqa-flex-1 cqa-inline-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div class=\"cqa-justify-center cqa-text-gray-950 cqa-text-sm cqa-font-normal cqa-leading-5 cqa-font-geist\">\n {{ option.label }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DropdownButtonComponent, decorators: [{
161
+ type: Component,
162
+ args: [{ selector: 'cqa-dropdown-button', template: "<div id=\"cqa-ui-root\" #dropdownContainer style=\"position: relative; display: inline-block; width: auto;\">\n <button\n #buttonElement\n type=\"button\"\n [class]=\"buttonClasses\"\n [disabled]=\"disabled\"\n (click)=\"toggleDropdown($event)\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-haspopup]=\"true\"\n >\n <div [class]=\"labelClasses\">\n {{ displayLabel }}\n </div>\n <div [class]=\"arrowClasses\">\n <svg\n class=\"cqa-w-2 cqa-h-1 cqa-absolute cqa-left-[4px] cqa-top-[6px]\"\n viewBox=\"0 0 8 4\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M0 0L4 4L8 0\"\n stroke=\"#0B0B0C\"\n stroke-width=\"1.33\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n </button>\n\n <!-- Dropdown Menu -->\n <div\n *ngIf=\"isOpen && options && options.length > 0\"\n class=\"cqa-absolute cqa-top-full cqa-left-0 cqa-mt-1 cqa-p-1.5 cqa-bg-white cqa-rounded-lg cqa-shadow-[0px_2px_4px_-2px_rgba(0,0,0,0.10)] cqa-shadow-md cqa-outline cqa-outline-1 cqa-outline-offset-[-1px] cqa-outline-gray-200 cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-z-[9999] cqa-w-auto cqa-max-w-[350px]\"\n >\n <div class=\"cqa-flex cqa-flex-col cqa-justify-start cqa-items-start cqa-gap-0.5 cqa-w-full\">\n <div\n *ngFor=\"let option of options\"\n (click)=\"selectOption(option, $event)\"\n [class]=\"getOptionClasses(option)\"\n class=\"cqa-w-full cqa-whitespace-nowrap\"\n >\n <div class=\"cqa-w-6 cqa-h-4 cqa-pr-2 cqa-inline-flex cqa-flex-col cqa-justify-center cqa-items-center\">\n <mat-icon\n *ngIf=\"selectedValue === option.value\"\n class=\"cqa-w-4 cqa-h-4 cqa-text-primary cqa-text-base cqa-leading-4\"\n >check</mat-icon>\n </div>\n <div class=\"cqa-flex-1 cqa-inline-flex cqa-flex-col cqa-justify-start cqa-items-start\">\n <div class=\"cqa-justify-center cqa-text-gray-950 cqa-text-sm cqa-font-normal cqa-leading-5 cqa-font-geist\">\n {{ option.label }}\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n", styles: [] }]
163
+ }], propDecorators: { label: [{
164
+ type: Input
165
+ }], options: [{
166
+ type: Input
167
+ }], selectedValue: [{
168
+ type: Input
169
+ }], disabled: [{
170
+ type: Input
171
+ }], placeholder: [{
172
+ type: Input
173
+ }], selectionChange: [{
174
+ type: Output
175
+ }], opened: [{
176
+ type: Output
177
+ }], closed: [{
178
+ type: Output
179
+ }], dropdownContainer: [{
180
+ type: ViewChild,
181
+ args: ['dropdownContainer', { static: false }]
182
+ }], buttonElement: [{
183
+ type: ViewChild,
184
+ args: ['buttonElement', { static: false }]
185
+ }], onDocumentClick: [{
186
+ type: HostListener,
187
+ args: ['document:click', ['$event']]
188
+ }] } });
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZHJvcGRvd24tYnV0dG9uL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Ryb3Bkb3duLWJ1dHRvbi9kcm9wZG93bi1idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQWMsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBYTVHLE1BQU0sT0FBTyx1QkFBdUI7SUFMcEM7UUFNVyxVQUFLLEdBQVcsa0JBQWtCLENBQUM7UUFDbkMsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0IsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUd6QixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDMUMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLNUMsV0FBTSxHQUFZLEtBQUssQ0FBQztRQUNoQixnQkFBVyxHQUFZLEtBQUssQ0FBQztLQW9LdEM7SUFsS0MsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUNuRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xGLE9BQU8sY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NB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O2dCQUFFLE9BQU87WUFFekIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7WUFFM0MsbURBQW1EO1lBQ25ELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQzNELE9BQU87YUFDUjtZQUVELHFDQUFxQztZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7O29IQWxMVSx1QkFBdUI7d0dBQXZCLHVCQUF1QixpakJDYnBDLDZ0RUEyREE7MkZEOUNhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7OEJBS3RCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUU0QyxpQkFBaUI7c0JBQW5FLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNGLGFBQWE7c0JBQTNELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFpSjdDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bkb3duT3B0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZHJvcGRvd24tYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Ryb3Bkb3duLWJ1dHRvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW11cbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25CdXR0b25Db21wb25lbnQge1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJ1NlbGVjdCBhbiBvcHRpb24nO1xuICBASW5wdXQoKSBvcHRpb25zOiBEcm9wZG93bk9wdGlvbltdID0gW107XG4gIEBJbnB1dCgpIHNlbGVjdGVkVmFsdWU/OiBhbnk7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGRyb3Bkb3duQ29udGFpbmVyPzogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnYnV0dG9uRWxlbWVudCcsIHsgc3RhdGljOiBmYWxzZSB9KSBidXR0b25FbGVtZW50PzogRWxlbWVudFJlZjtcblxuICBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbGlja0luc2lkZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGdldCBkaXNwbGF5TGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5zZWxlY3RlZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKG9wdCA9PiBvcHQudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICByZXR1cm4gc2VsZWN0ZWRPcHRpb24gPyBzZWxlY3RlZE9wdGlvbi5sYWJlbCA6IHRoaXMubGFiZWw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsYWNlaG9sZGVyIHx8IHRoaXMubGFiZWw7XG4gIH1cblxuICBnZXQgYnV0dG9uQ2xhc3NlcygpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2VDbGFzc2VzID0gW1xuICAgICAgJ2NxYS1oLTknLFxuICAgICAgJ2NxYS1weC0zJyxcbiAgICAgICdjcWEtcHktMicsXG4gICAgICAnY3FhLWJnLWdyYXktMTAwJyxcbiAgICAgICdjcWEtcm91bmRlZC1bNXB4XScsXG4gICAgICAnY3FhLW91dGxpbmUnLFxuICAgICAgJ2NxYS1vdXRsaW5lLTEnLFxuICAgICAgJ2NxYS1vdXRsaW5lLW9mZnNldC1bLTFweF0nLFxuICAgICAgJ2NxYS1vdXRsaW5lLWdyYXktMjAwJyxcbiAgICAgICdjcWEtaW5saW5lLWZsZXgnLFxuICAgICAgJ2NxYS1qdXN0aWZ5LWNlbnRlcicsXG4gICAgICAnY3FhLWl0ZW1zLWNlbnRlcicsXG4gICAgICAnY3FhLWdhcC0xJyxcbiAgICAgICdjcWEtY3Vyc29yLXBvaW50ZXInLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLWNvbG9ycydcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIGJhc2VDbGFzc2VzLnB1c2goJ2NxYS1vcGFjaXR5LTUwJywgJ2NxYS1jdXJzb3Itbm90LWFsbG93ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZUNsYXNzZXMucHVzaCgnY3FhLWhvdmVyOmNxYS1iZy1ncmF5LTIwMCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgYmFzZUNsYXNzZXMucHVzaCgnY3FhLWJnLWdyYXktMjAwJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VDbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBsYWJlbENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2NxYS10ZXh0LWNlbnRlcicsXG4gICAgICAnY3FhLWp1c3RpZnktY2VudGVyJyxcbiAgICAgICdjcWEtdGV4dC1ncmF5LTk1MCcsXG4gICAgICAnY3FhLXRleHQteHMnLFxuICAgICAgJ2NxYS1mb250LW1lZGl1bScsXG4gICAgICAnY3FhLWxlYWRpbmctNCdcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuXG4gIGdldCBhcnJvd0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlQ2xhc3NlcyA9IFtcbiAgICAgICdjcWEtdy00JyxcbiAgICAgICdjcWEtaC00JyxcbiAgICAgICdjcWEtcmVsYXRpdmUnLFxuICAgICAgJ2NxYS10cmFuc2l0aW9uLXRyYW5zZm9ybSdcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtcm90YXRlLTE4MCcpO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlQ2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICB0b2dnbGVEcm9wZG93bihldmVudD86IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgIFxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5jbGlja0luc2lkZSA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaXNPcGVuID0gIXRoaXMuaXNPcGVuO1xuICAgIFxuICAgIC8vIFJlc2V0IGNsaWNrSW5zaWRlIGZsYWcgYWZ0ZXIgYSBzaG9ydCBkZWxheVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jbGlja0luc2lkZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICB9XG5cbiAgc2VsZWN0T3B0aW9uKG9wdGlvbjogRHJvcGRvd25PcHRpb24sIGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChvcHRpb24uZGlzYWJsZWQpIHJldHVybjtcbiAgICBcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jbGlja0luc2lkZSA9IHRydWU7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQob3B0aW9uLnZhbHVlKTtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgXG4gICAgLy8gUmVzZXQgZmxhZyBhZnRlciBzZWxlY3Rpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xpY2tJbnNpZGUgPSBmYWxzZTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZ2V0QnV0dG9uV2lkdGgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5idXR0b25FbGVtZW50Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMuYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgcmV0dXJuIHdpZHRoID4gMCA/IHdpZHRoIDogMTUwOyAvLyBGYWxsYmFjayB0byAxNTBweCBpZiB3aWR0aCBpcyAwXG4gICAgfVxuICAgIHJldHVybiAxNTA7IC8vIERlZmF1bHQgZmFsbGJhY2sgd2lkdGhcbiAgfVxuXG4gIGdldE9wdGlvbkNsYXNzZXMob3B0aW9uOiBEcm9wZG93bk9wdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZUNsYXNzZXMgPSBbXG4gICAgICAnY3FhLXAtMS41JyxcbiAgICAgICdjcWEtcm91bmRlZC1tZCcsXG4gICAgICAnY3FhLWlubGluZS1mbGV4JyxcbiAgICAgICdjcWEtanVzdGlmeS1zdGFydCcsXG4gICAgICAnY3FhLWl0ZW1zLWNlbnRlcicsXG4gICAgICAnY3FhLWN1cnNvci1wb2ludGVyJyxcbiAgICAgICdjcWEtdHJhbnNpdGlvbi1jb2xvcnMnXG4gICAgXTtcblxuICAgIGlmIChvcHRpb24uZGlzYWJsZWQpIHtcbiAgICAgIGJhc2VDbGFzc2VzLnB1c2goJ2NxYS1vcGFjaXR5LTUwJywgJ2NxYS1jdXJzb3Itbm90LWFsbG93ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFzZUNsYXNzZXMucHVzaCgnY3FhLWhvdmVyOmNxYS1iZy1ncmF5LTUwJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRWYWx1ZSA9PT0gb3B0aW9uLnZhbHVlKSB7XG4gICAgICBiYXNlQ2xhc3Nlcy5wdXNoKCdjcWEtYmctcHJpbWFyeS1zdXJmYWNlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VDbGFzc2VzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWdub3JlIGlmIGNsaWNrIHdhcyBpbnNpZGUgdGhlIGNvbXBvbmVudCAoYnV0dG9uIGNsaWNrKVxuICAgIGlmICh0aGlzLmNsaWNrSW5zaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBhIGxvbmdlciBkZWxheSB0byBlbnN1cmUgZHJvcGRvd24gaGFzIHRpbWUgdG8gcmVuZGVyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNPcGVuKSByZXR1cm47XG4gICAgICBcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgY29udGFpbmVyXG4gICAgICBpZiAodGhpcy5kcm9wZG93bkNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8uY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsb3NlIGRyb3Bkb3duIGlmIGNsaWNrIGlzIG91dHNpZGVcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgfSwgMjAwKTtcbiAgfVxufVxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIiAjZHJvcGRvd25Db250YWluZXIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IGF1dG87XCI+XG4gIDxidXR0b25cbiAgICAjYnV0dG9uRWxlbWVudFxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtjbGFzc109XCJidXR0b25DbGFzc2VzXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bigkZXZlbnQpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzT3BlblwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJ0cnVlXCJcbiAgPlxuICAgIDxkaXYgW2NsYXNzXT1cImxhYmVsQ2xhc3Nlc1wiPlxuICAgICAge3sgZGlzcGxheUxhYmVsIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbY2xhc3NdPVwiYXJyb3dDbGFzc2VzXCI+XG4gICAgICA8c3ZnXG4gICAgICAgIGNsYXNzPVwiY3FhLXctMiBjcWEtaC0xIGNxYS1hYnNvbHV0ZSBjcWEtbGVmdC1bNHB4XSBjcWEtdG9wLVs2cHhdXCJcbiAgICAgICAgdmlld0JveD1cIjAgMCA4IDRcIlxuICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIGQ9XCJNMCAwTDQgNEw4IDBcIlxuICAgICAgICAgIHN0cm9rZT1cIiMwQjBCMENcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuMzNcIlxuICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICA8L2J1dHRvbj5cblxuICA8IS0tIERyb3Bkb3duIE1lbnUgLS0+XG4gIDxkaXZcbiAgICAqbmdJZj1cImlzT3BlbiAmJiBvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoID4gMFwiXG4gICAgY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLXRvcC1mdWxsIGNxYS1sZWZ0LTAgY3FhLW10LTEgY3FhLXAtMS41IGNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1sZyBjcWEtc2hhZG93LVswcHhfMnB4XzRweF8tMnB4X3JnYmEoMCwwLDAsMC4xMCldIGNxYS1zaGFkb3ctbWQgY3FhLW91dGxpbmUgY3FhLW91dGxpbmUtMSBjcWEtb3V0bGluZS1vZmZzZXQtWy0xcHhdIGNxYS1vdXRsaW5lLWdyYXktMjAwIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLXotWzk5OTldIGNxYS13LWF1dG8gY3FhLW1heC13LVszNTBweF1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtanVzdGlmeS1zdGFydCBjcWEtaXRlbXMtc3RhcnQgY3FhLWdhcC0wLjUgY3FhLXctZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIlxuICAgICAgICAoY2xpY2spPVwic2VsZWN0T3B0aW9uKG9wdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgIFtjbGFzc109XCJnZXRPcHRpb25DbGFzc2VzKG9wdGlvbilcIlxuICAgICAgICBjbGFzcz1cImNxYS13LWZ1bGwgY3FhLXdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS13LTYgY3FhLWgtNCBjcWEtcHItMiBjcWEtaW5saW5lLWZsZXggY3FhLWZsZXgtY29sIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVmFsdWUgPT09IG9wdGlvbi52YWx1ZVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS13LTQgY3FhLWgtNCBjcWEtdGV4dC1wcmltYXJ5IGNxYS10ZXh0LWJhc2UgY3FhLWxlYWRpbmctNFwiXG4gICAgICAgICAgPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1pbmxpbmUtZmxleCBjcWEtZmxleC1jb2wgY3FhLWp1c3RpZnktc3RhcnQgY3FhLWl0ZW1zLXN0YXJ0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1ncmF5LTk1MCBjcWEtdGV4dC1zbSBjcWEtZm9udC1ub3JtYWwgY3FhLWxlYWRpbmctNSBjcWEtZm9udC1nZWlzdFwiPlxuICAgICAgICAgICAge3sgb3B0aW9uLmxhYmVsIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbiJdfQ==
@@ -0,0 +1,160 @@
1
+ import { ChangeDetectionStrategy, Component, Input, ViewChild, ElementRef, HostListener } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/material/form-field";
4
+ import * as i2 from "@angular/material/select";
5
+ import * as i3 from "@angular/material/core";
6
+ import * as i4 from "@angular/forms";
7
+ import * as i5 from "@angular/common";
8
+ export class DynamicSelectFieldComponent {
9
+ constructor() {
10
+ // Must be public for template access in Angular's strict template checking mode
11
+ this.searchTextByKey = {};
12
+ }
13
+ ngOnInit() {
14
+ if (!this.config || !this.config.key) {
15
+ throw new Error('cqa-dynamic-select: input "config.key" is required.');
16
+ }
17
+ }
18
+ ngOnChanges(changes) {
19
+ if ('config' in changes) {
20
+ // When config changes (including toggling multiple), ensure control value shape matches
21
+ this.syncControlValueForMultipleMode();
22
+ }
23
+ }
24
+ get panelClass() {
25
+ return `ctc-select-panel ${this.isMultiple ? 'multiple' : ''}`.trim();
26
+ }
27
+ get isMultiple() {
28
+ return this.toBoolean(this.config?.multiple);
29
+ }
30
+ get isDisabled() {
31
+ return this.toBoolean(this.config?.disabled);
32
+ }
33
+ toBoolean(value) {
34
+ if (typeof value === 'string') {
35
+ const v = value.trim().toLowerCase();
36
+ if (v === 'true' || v === '1')
37
+ return true;
38
+ if (v === 'false' || v === '0' || v === '')
39
+ return false;
40
+ return true; // any other non-empty string treated as truthy
41
+ }
42
+ if (typeof value === 'number') {
43
+ return value !== 0;
44
+ }
45
+ return !!value;
46
+ }
47
+ syncControlValueForMultipleMode() {
48
+ const key = this.config?.key;
49
+ if (!key || !this.form)
50
+ return;
51
+ const control = this.form.get(key);
52
+ if (!control)
53
+ return;
54
+ const currentValue = control.value;
55
+ if (this.isMultiple) {
56
+ if (currentValue == null)
57
+ return;
58
+ if (Array.isArray(currentValue))
59
+ return;
60
+ control.setValue([currentValue], { emitEvent: false });
61
+ }
62
+ else {
63
+ if (!Array.isArray(currentValue))
64
+ return;
65
+ control.setValue(currentValue.length ? currentValue[0] : null, { emitEvent: false });
66
+ }
67
+ }
68
+ onSelectOpenedChange(opened, _select) {
69
+ if (!opened) {
70
+ // Reset search text on close so the next open shows full list
71
+ if (this.config?.key) {
72
+ this.searchTextByKey[this.config.key] = '';
73
+ }
74
+ // Ensure any previous custom listeners are cleared (legacy compatibility)
75
+ if (this.outsideCleanup) {
76
+ this.outsideCleanup();
77
+ this.outsideCleanup = undefined;
78
+ }
79
+ return;
80
+ }
81
+ // Focus the search box if enabled
82
+ if (this.config?.searchable) {
83
+ setTimeout(() => {
84
+ const input = document.querySelector('.ts-select-search-input');
85
+ input?.focus();
86
+ }, 0);
87
+ }
88
+ }
89
+ onSearch(key, value) {
90
+ this.searchTextByKey[key] = value ?? '';
91
+ }
92
+ filteredOptions(c) {
93
+ const t = (this.searchTextByKey[c.key] || '').toLowerCase().trim();
94
+ if (!t)
95
+ return c.options || [];
96
+ return (c.options || []).filter((opt) => {
97
+ const text = String(opt.name ?? opt.label ?? opt.value ?? '').toLowerCase();
98
+ return text.includes(t);
99
+ });
100
+ }
101
+ // Close when an option is selected if requested. Always close for single-select.
102
+ onOptionSelected(select) {
103
+ // Let Angular Material auto-close for single-select.
104
+ // For multi-select, close only if explicitly requested.
105
+ const shouldClose = this.isMultiple ? !!this.config?.closeOnSelect : false;
106
+ if (shouldClose) {
107
+ try {
108
+ select.close();
109
+ }
110
+ catch { }
111
+ }
112
+ // If searchable, clear the search after selection so reopening works predictably
113
+ if (this.config?.searchable && this.config?.key) {
114
+ this.searchTextByKey[this.config.key] = '';
115
+ }
116
+ }
117
+ handleDocumentClick(event) {
118
+ // Close when clicking outside of the trigger and outside of the open panel
119
+ if (!this.selectRef?.panelOpen) {
120
+ return;
121
+ }
122
+ const target = event.target;
123
+ if (!target)
124
+ return;
125
+ // If click is inside the component host, ignore
126
+ if (this.hostEl?.nativeElement && this.hostEl.nativeElement.contains(target)) {
127
+ return;
128
+ }
129
+ // If click is inside any open mat-select panel, ignore
130
+ const panelEls = Array.from(document.querySelectorAll('.mat-select-panel'));
131
+ const clickInsidePanel = panelEls.some((el) => el.contains(target));
132
+ if (clickInsidePanel) {
133
+ return;
134
+ }
135
+ try {
136
+ this.selectRef.close();
137
+ }
138
+ catch { }
139
+ }
140
+ }
141
+ DynamicSelectFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
142
+ DynamicSelectFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: DynamicSelectFieldComponent, selector: "cqa-dynamic-select", inputs: { form: "form", config: "config" }, host: { listeners: { "document:click": "handleDocumentClick($event)" } }, viewQueries: [{ propertyName: "selectRef", first: true, predicate: ["selectRef"], descendants: true }, { propertyName: "hostEl", first: true, predicate: ["host"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div id=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"config.placeholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onOptionSelected(selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n\n <mat-option *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\"\n [textContent]=\"opt.name ?? opt.label ?? opt.value\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </mat-option>\n </mat-select>\n\n <div>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", components: [{ type: i1.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DynamicSelectFieldComponent, decorators: [{
144
+ type: Component,
145
+ args: [{ selector: 'cqa-dynamic-select', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div id=\"cqa-ui-root\">\n <ng-container [formGroup]=\"form\">\n <label *ngIf=\"config.label\"\n class=\"form-label cqa-text-[#374151] cqa-text-[14px] cqa-font-medium cqa-block cqa-leading-[1.4] cqa-mb-2\">{{\n config.label }}</label>\n <mat-form-field #host class=\"mat-select-custom cqa-w-full\" appearance=\"fill\">\n <mat-select #selectRef=\"matSelect\" [placeholder]=\"config.placeholder\" [disabled]=\"isDisabled\" [multiple]=\"isMultiple\"\n disableOptionCentering [panelClass]=\"panelClass\" [formControlName]=\"config.key\"\n (openedChange)=\"onSelectOpenedChange($event, selectRef)\" (selectionChange)=\"onOptionSelected(selectRef)\">\n\n <mat-option *ngIf=\"config.searchable\" class=\"ts-select-search\" disabled>\n <input class=\"ts-select-search-input\" type=\"text\" [value]=\"searchTextByKey[config.key] || ''\"\n (click)=\"$event.stopPropagation()\" (mousedown)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\" (input)=\"onSearch(config.key, $any($event.target).value)\"\n placeholder=\"Search...\" />\n </mat-option>\n\n <mat-option *ngFor=\"let opt of filteredOptions(config)\" [value]=\"opt.id ?? opt.value\"\n [textContent]=\"opt.name ?? opt.label ?? opt.value\">\n {{ opt.name ?? opt.label ?? opt.value }}\n </mat-option>\n </mat-select>\n\n <div>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 6L8 10L12 6\" stroke=\"#0A0A0A\" stroke-width=\"1.33333\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n </mat-form-field>\n </ng-container>\n</div>", styles: [] }]
146
+ }], propDecorators: { form: [{
147
+ type: Input
148
+ }], config: [{
149
+ type: Input
150
+ }], selectRef: [{
151
+ type: ViewChild,
152
+ args: ['selectRef', { static: false }]
153
+ }], hostEl: [{
154
+ type: ViewChild,
155
+ args: ['host', { static: false, read: ElementRef }]
156
+ }], handleDocumentClick: [{
157
+ type: HostListener,
158
+ args: ['document:click', ['$event']]
159
+ }] } });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1zZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9keW5hbWljLXNlbGVjdC9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFvQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQThCakosTUFBTSxPQUFPLDJCQUEyQjtJQU54QztRQWFFLGdGQUFnRjtRQUNoRixvQkFBZSxHQUEyQixFQUFFLENBQUM7S0FtSTlDO0lBaElDLFFBQVE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztTQUN4RTtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQ3ZCLHdGQUF3RjtZQUN4RixJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLG9CQUFvQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFD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c0JBQTdELFNBQVM7dUJBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQWlIdEQsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U2VsZWN0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcblxuLy8gTG9jYWwgb3B0aW9uIG1vZGVsIChwcmV2aW91c2x5IGltcG9ydGVkIGZyb20gcmVtb3ZlZCBjcWEtc2VsZWN0IGNvbXBvbmVudClcbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcbiAgaWQ/OiBhbnk7XG4gIHZhbHVlPzogYW55O1xuICBuYW1lPzogc3RyaW5nO1xuICBsYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEeW5hbWljU2VsZWN0RmllbGRDb25maWcge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBkaXNhYmxlZD86IGJvb2xlYW47XG4gIG11bHRpcGxlPzogYm9vbGVhbjtcbiAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCBjbG9zZSB0aGUgcGFuZWwgd2hlbiBhbiBvcHRpb24gaXMgc2VsZWN0ZWQgKHVzZWZ1bCBmb3IgbXVsdGktc2VsZWN0IGluIGhlYWRlcnMpLiAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhbjtcbiAgb3B0aW9uczogU2VsZWN0T3B0aW9uW107XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS1keW5hbWljLXNlbGVjdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9keW5hbWljLXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljU2VsZWN0RmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGZvcm0hOiBGb3JtR3JvdXA7XG4gIEBJbnB1dCgpIGNvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcblxuICBAVmlld0NoaWxkKCdzZWxlY3RSZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgc2VsZWN0UmVmPzogTWF0U2VsZWN0O1xuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlLCByZWFkOiBFbGVtZW50UmVmIH0pIGhvc3RFbD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8vIE11c3QgYmUgcHVibGljIGZvciB0ZW1wbGF0ZSBhY2Nlc3MgaW4gQW5ndWxhcidzIHN0cmljdCB0ZW1wbGF0ZSBjaGVja2luZyBtb2RlXG4gIHNlYXJjaFRleHRCeUtleTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIG91dHNpZGVDbGVhbnVwPzogKCkgPT4gdm9pZDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnIHx8ICF0aGlzLmNvbmZpZy5rZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3FhLWR5bmFtaWMtc2VsZWN0OiBpbnB1dCBcImNvbmZpZy5rZXlcIiBpcyByZXF1aXJlZC4nKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCdjb25maWcnIGluIGNoYW5nZXMpIHtcbiAgICAgIC8vIFdoZW4gY29uZmlnIGNoYW5nZXMgKGluY2x1ZGluZyB0b2dnbGluZyBtdWx0aXBsZSksIGVuc3VyZSBjb250cm9sIHZhbHVlIHNoYXBlIG1hdGNoZXNcbiAgICAgIHRoaXMuc3luY0NvbnRyb2xWYWx1ZUZvck11bHRpcGxlTW9kZSgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBwYW5lbENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBjdGMtc2VsZWN0LXBhbmVsICR7dGhpcy5pc011bHRpcGxlID8gJ211bHRpcGxlJyA6ICcnfWAudHJpbSgpO1xuICB9XG5cbiAgZ2V0IGlzTXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG9Cb29sZWFuKHRoaXMuY29uZmlnPy5tdWx0aXBsZSk7XG4gIH1cblxuICBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50b0Jvb2xlYW4odGhpcy5jb25maWc/LmRpc2FibGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgdG9Cb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHYgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh2ID09PSAndHJ1ZScgfHwgdiA9PT0gJzEnKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmICh2ID09PSAnZmFsc2UnIHx8IHYgPT09ICcwJyB8fCB2ID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGFueSBvdGhlciBub24tZW1wdHkgc3RyaW5nIHRyZWF0ZWQgYXMgdHJ1dGh5XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT09IDA7XG4gICAgfVxuICAgIHJldHVybiAhIXZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQ29udHJvbFZhbHVlRm9yTXVsdGlwbGVNb2RlKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnPy5rZXk7XG4gICAgaWYgKCFrZXkgfHwgIXRoaXMuZm9ybSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBpZiAodGhpcy5pc011bHRpcGxlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwpIHJldHVybjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoW2N1cnJlbnRWYWx1ZV0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnRWYWx1ZSkpIHJldHVybjtcbiAgICAgIGNvbnRyb2wuc2V0VmFsdWUoY3VycmVudFZhbHVlLmxlbmd0aCA/IGN1cnJlbnRWYWx1ZVswXSA6IG51bGwsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdE9wZW5lZENoYW5nZShvcGVuZWQ6IGJvb2xlYW4sIF9zZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIGlmICghb3BlbmVkKSB7XG4gICAgICAvLyBSZXNldCBzZWFyY2ggdGV4dCBvbiBjbG9zZSBzbyB0aGUgbmV4dCBvcGVuIHNob3dzIGZ1bGwgbGlzdFxuICAgICAgaWYgKHRoaXMuY29uZmlnPy5rZXkpIHtcbiAgICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgICAgfVxuICAgICAgLy8gRW5zdXJlIGFueSBwcmV2aW91cyBjdXN0b20gbGlzdGVuZXJzIGFyZSBjbGVhcmVkIChsZWdhY3kgY29tcGF0aWJpbGl0eSlcbiAgICAgIGlmICh0aGlzLm91dHNpZGVDbGVhbnVwKSB7XG4gICAgICAgIHRoaXMub3V0c2lkZUNsZWFudXAoKTtcbiAgICAgICAgdGhpcy5vdXRzaWRlQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGb2N1cyB0aGUgc2VhcmNoIGJveCBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnPy5zZWFyY2hhYmxlKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcudHMtc2VsZWN0LXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpbnB1dD8uZm9jdXMoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlba2V5XSA9IHZhbHVlID8/ICcnO1xuICB9XG5cbiAgZmlsdGVyZWRPcHRpb25zKGM6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZyk6IFNlbGVjdE9wdGlvbltdIHtcbiAgICBjb25zdCB0ID0gKHRoaXMuc2VhcmNoVGV4dEJ5S2V5W2Mua2V5XSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKCF0KSByZXR1cm4gYy5vcHRpb25zIHx8IFtdO1xuICAgIHJldHVybiAoYy5vcHRpb25zIHx8IFtdKS5maWx0ZXIoKG9wdCkgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IFN0cmluZyhvcHQubmFtZSA/PyBvcHQubGFiZWwgPz8gb3B0LnZhbHVlID8/ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIHRleHQuaW5jbHVkZXModCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBDbG9zZSB3aGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCBpZiByZXF1ZXN0ZWQuIEFsd2F5cyBjbG9zZSBmb3Igc2luZ2xlLXNlbGVjdC5cbiAgb25PcHRpb25TZWxlY3RlZChzZWxlY3Q6IE1hdFNlbGVjdCk6IHZvaWQge1xuICAgIC8vIExldCBBbmd1bGFyIE1hdGVyaWFsIGF1dG8tY2xvc2UgZm9yIHNpbmdsZS1zZWxlY3QuXG4gICAgLy8gRm9yIG11bHRpLXNlbGVjdCwgY2xvc2Ugb25seSBpZiBleHBsaWNpdGx5IHJlcXVlc3RlZC5cbiAgICBjb25zdCBzaG91bGRDbG9zZSA9IHRoaXMuaXNNdWx0aXBsZSA/ICEhdGhpcy5jb25maWc/LmNsb3NlT25TZWxlY3QgOiBmYWxzZTtcbiAgICBpZiAoc2hvdWxkQ2xvc2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlbGVjdC5jbG9zZSgpO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICAvLyBJZiBzZWFyY2hhYmxlLCBjbGVhciB0aGUgc2VhcmNoIGFmdGVyIHNlbGVjdGlvbiBzbyByZW9wZW5pbmcgd29ya3MgcHJlZGljdGFibHlcbiAgICBpZiAodGhpcy5jb25maWc/LnNlYXJjaGFibGUgJiYgdGhpcy5jb25maWc/LmtleSkge1xuICAgICAgdGhpcy5zZWFyY2hUZXh0QnlLZXlbdGhpcy5jb25maWcua2V5XSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIENsb3NlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSBvZiB0aGUgdHJpZ2dlciBhbmQgb3V0c2lkZSBvZiB0aGUgb3BlbiBwYW5lbFxuICAgIGlmICghdGhpcy5zZWxlY3RSZWY/LnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgLy8gSWYgY2xpY2sgaXMgaW5zaWRlIHRoZSBjb21wb25lbnQgaG9zdCwgaWdub3JlXG4gICAgaWYgKHRoaXMuaG9zdEVsPy5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJZiBjbGljayBpcyBpbnNpZGUgYW55IG9wZW4gbWF0LXNlbGVjdCBwYW5lbCwgaWdub3JlXG4gICAgY29uc3QgcGFuZWxFbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtc2VsZWN0LXBhbmVsJykpIGFzIEhUTUxFbGVtZW50W107XG4gICAgY29uc3QgY2xpY2tJbnNpZGVQYW5lbCA9IHBhbmVsRWxzLnNvbWUoKGVsKSA9PiBlbC5jb250YWlucyh0YXJnZXQpKTtcbiAgICBpZiAoY2xpY2tJbnNpZGVQYW5lbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5zZWxlY3RSZWYuY2xvc2UoKTtcbiAgICB9IGNhdGNoIHt9XG4gIH1cbn1cblxuXG4iLCI8ZGl2IGlkPVwiY3FhLXVpLXJvb3RcIj5cbiAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bGFiZWwgKm5nSWY9XCJjb25maWcubGFiZWxcIlxuICAgICAgY2xhc3M9XCJmb3JtLWxhYmVsIGNxYS10ZXh0LVsjMzc0MTUxXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1ibG9jayBjcWEtbGVhZGluZy1bMS40XSBjcWEtbWItMlwiPnt7XG4gICAgICBjb25maWcubGFiZWwgfX08L2xhYmVsPlxuICAgIDxtYXQtZm9ybS1maWVsZCAjaG9zdCBjbGFzcz1cIm1hdC1zZWxlY3QtY3VzdG9tIGNxYS13LWZ1bGxcIiBhcHBlYXJhbmNlPVwiZmlsbFwiPlxuICAgICAgPG1hdC1zZWxlY3QgI3NlbGVjdFJlZj1cIm1hdFNlbGVjdFwiIFtwbGFjZWhvbGRlcl09XCJjb25maWcucGxhY2Vob2xkZXJcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiIFttdWx0aXBsZV09XCJpc011bHRpcGxlXCJcbiAgICAgICAgZGlzYWJsZU9wdGlvbkNlbnRlcmluZyBbcGFuZWxDbGFzc109XCJwYW5lbENsYXNzXCIgW2Zvcm1Db250cm9sTmFtZV09XCJjb25maWcua2V5XCJcbiAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvblNlbGVjdE9wZW5lZENoYW5nZSgkZXZlbnQsIHNlbGVjdFJlZilcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uT3B0aW9uU2VsZWN0ZWQoc2VsZWN0UmVmKVwiPlxuXG4gICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiY29uZmlnLnNlYXJjaGFibGVcIiBjbGFzcz1cInRzLXNlbGVjdC1zZWFyY2hcIiBkaXNhYmxlZD5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJ0cy1zZWxlY3Qtc2VhcmNoLWlucHV0XCIgdHlwZT1cInRleHRcIiBbdmFsdWVdPVwic2VhcmNoVGV4dEJ5S2V5W2NvbmZpZy5rZXldIHx8ICcnXCJcbiAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAobW91c2Vkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoaW5wdXQpPVwib25TZWFyY2goY29uZmlnLmtleSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAvPlxuICAgICAgICA8L21hdC1vcHRpb24+XG5cbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBmaWx0ZXJlZE9wdGlvbnMoY29uZmlnKVwiIFt2YWx1ZV09XCJvcHQuaWQgPz8gb3B0LnZhbHVlXCJcbiAgICAgICAgICBbdGV4dENvbnRlbnRdPVwib3B0Lm5hbWUgPz8gb3B0LmxhYmVsID8/IG9wdC52YWx1ZVwiPlxuICAgICAgICAgIHt7IG9wdC5uYW1lID8/IG9wdC5sYWJlbCA/PyBvcHQudmFsdWUgfX1cbiAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICA8ZGl2PlxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTQgNkw4IDEwTDEyIDZcIiBzdHJva2U9XCIjMEEwQTBBXCIgc3Ryb2tlLXdpZHRoPVwiMS4zMzMzM1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+Il19