@almatar/smart-booking-dashboard 0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/esm2022/almatar-smart-booking-dashboard.mjs +5 -0
  4. package/esm2022/lib/components/action-card/action-card.component.mjs +19 -0
  5. package/esm2022/lib/components/action-dialog/action-dialog.component.mjs +177 -0
  6. package/esm2022/lib/components/action-grid/action-grid.component.mjs +18 -0
  7. package/esm2022/lib/components/add-note-dialog/add-note-dialog.component.mjs +62 -0
  8. package/esm2022/lib/components/booking-input/booking-input.component.mjs +43 -0
  9. package/esm2022/lib/components/cancel-dialog/cancel-dialog.component.mjs +1441 -0
  10. package/esm2022/lib/components/data-search/data-search.component.mjs +84 -0
  11. package/esm2022/lib/components/flight-itinerary-card/flight-itinerary-card.component.mjs +73 -0
  12. package/esm2022/lib/components/result-panel/result-panel.component.mjs +46 -0
  13. package/esm2022/lib/components/workflow-actions/workflow-actions.component.mjs +19 -0
  14. package/esm2022/lib/config/dashboard.config.mjs +16 -0
  15. package/esm2022/lib/config/flight-actions.config.mjs +906 -0
  16. package/esm2022/lib/config/hotel-actions.config.mjs +53 -0
  17. package/esm2022/lib/config/labels.ar.mjs +116 -0
  18. package/esm2022/lib/models/action.types.mjs +2 -0
  19. package/esm2022/lib/models/booking.types.mjs +2 -0
  20. package/esm2022/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.mjs +145 -0
  21. package/esm2022/lib/services/booking.service.mjs +65 -0
  22. package/esm2022/lib/services/toast.service.mjs +19 -0
  23. package/esm2022/lib/smart-booking-dashboard.module.mjs +17 -0
  24. package/esm2022/lib/smart-booking-dashboard.routes.mjs +7 -0
  25. package/esm2022/public-api.mjs +9 -0
  26. package/fesm2022/almatar-smart-booking-dashboard.mjs +3259 -0
  27. package/fesm2022/almatar-smart-booking-dashboard.mjs.map +1 -0
  28. package/index.d.ts +5 -0
  29. package/lib/components/action-card/action-card.component.d.ts +10 -0
  30. package/lib/components/action-dialog/action-dialog.component.d.ts +26 -0
  31. package/lib/components/action-grid/action-grid.component.d.ts +10 -0
  32. package/lib/components/add-note-dialog/add-note-dialog.component.d.ts +25 -0
  33. package/lib/components/booking-input/booking-input.component.d.ts +23 -0
  34. package/lib/components/cancel-dialog/cancel-dialog.component.d.ts +395 -0
  35. package/lib/components/data-search/data-search.component.d.ts +21 -0
  36. package/lib/components/flight-itinerary-card/flight-itinerary-card.component.d.ts +17 -0
  37. package/lib/components/result-panel/result-panel.component.d.ts +14 -0
  38. package/lib/components/workflow-actions/workflow-actions.component.d.ts +7 -0
  39. package/lib/config/dashboard.config.d.ts +15 -0
  40. package/lib/config/flight-actions.config.d.ts +2 -0
  41. package/lib/config/hotel-actions.config.d.ts +2 -0
  42. package/lib/config/labels.ar.d.ts +2 -0
  43. package/lib/models/action.types.d.ts +34 -0
  44. package/lib/models/booking.types.d.ts +6 -0
  45. package/lib/pages/smart-booking-dashboard/smart-booking-dashboard.component.d.ts +43 -0
  46. package/lib/services/booking.service.d.ts +22 -0
  47. package/lib/services/toast.service.d.ts +10 -0
  48. package/lib/smart-booking-dashboard.module.d.ts +7 -0
  49. package/lib/smart-booking-dashboard.routes.d.ts +2 -0
  50. package/package.json +50 -0
  51. package/public-api.d.ts +5 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Almatar
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,132 @@
1
+ # @almatar/smart-booking-dashboard
2
+
3
+ Angular 18 library that ships the Almatar Smart Booking Dashboard (flight booking lookup, FCR workflow actions, notes, cancellations and refunds) as a drop-in routed feature for backoffice apps.
4
+
5
+ ## Install
6
+
7
+ The package is published privately to npmjs.org under the `@almatar` organisation. Any machine that installs it must be authenticated with an npm account that is a member of the org:
8
+
9
+ ```bash
10
+ npm login
11
+ ```
12
+
13
+ For CI, create an automation token in the org and put it in the project `.npmrc` via an environment variable, never as plain text in git:
14
+
15
+ ```
16
+ //registry.npmjs.org/:_authToken=${NPM_TOKEN}
17
+ ```
18
+
19
+ Then:
20
+
21
+ ```bash
22
+ npm install @almatar/smart-booking-dashboard
23
+ ```
24
+
25
+ Peer dependencies the host app must already have:
26
+
27
+ | Package | Version |
28
+ | --- | --- |
29
+ | `@angular/*` (core, common, forms, router, animations) | ^18.0.0 |
30
+ | `@ng-select/ng-select` | ^13.7.0 |
31
+ | `ngx-toastr` | ^17.0.2 |
32
+ | `primeicons` | ^4.0.0 |
33
+ | `rxjs` | ^7.8.0 |
34
+
35
+ ## Host app setup
36
+
37
+ ### 1. Global styles
38
+
39
+ The library uses ng-select, ngx-toastr and PrimeIcons classes but does not bundle their CSS. Add them to the `styles` array of your `angular.json`:
40
+
41
+ ```json
42
+ "styles": [
43
+ "node_modules/@ng-select/ng-select/themes/default.theme.css",
44
+ "node_modules/primeicons/primeicons.css",
45
+ "node_modules/ngx-toastr/toastr.css",
46
+ "src/styles.scss"
47
+ ]
48
+ ```
49
+
50
+ ### 2. Providers
51
+
52
+ The dashboard needs `HttpClient`, browser animations and Toastr at the root. Your own auth interceptor should attach the `Authorization` header; the library only adds `platform` and `Accept-Language`.
53
+
54
+ ```ts
55
+ import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
56
+ import { provideAnimations } from '@angular/platform-browser/animations';
57
+ import { provideToastr } from 'ngx-toastr';
58
+ import { provideSmartBookingDashboard } from '@almatar/smart-booking-dashboard';
59
+
60
+ export const appConfig = {
61
+ providers: [
62
+ provideHttpClient(withInterceptorsFromDi()),
63
+ provideAnimations(),
64
+ provideToastr(),
65
+ provideSmartBookingDashboard({
66
+ apiBase: '/api', // default '/api'
67
+ platform: 'BO', // default 'BO'
68
+ }),
69
+ ],
70
+ };
71
+ ```
72
+
73
+ NgModule-based apps: import `BrowserAnimationsModule` and `ToastrModule.forRoot()` and add the same `provideHttpClient(...)` and `provideSmartBookingDashboard(...)` calls to `providers`.
74
+
75
+ ### 3. Routing
76
+
77
+ Lazy-load the feature under whatever path you want:
78
+
79
+ ```ts
80
+ const routes: Routes = [
81
+ {
82
+ path: 'smart-booking',
83
+ canActivate: [AuthGuard],
84
+ loadChildren: () =>
85
+ import('@almatar/smart-booking-dashboard').then(m => m.SmartBookingDashboardModule),
86
+ },
87
+ ];
88
+ ```
89
+
90
+ Or, for standalone routing, spread `smartBookingDashboardRoutes` as children of your route.
91
+
92
+ ## Public API
93
+
94
+ | Export | Purpose |
95
+ | --- | --- |
96
+ | `SmartBookingDashboardModule` | Routed NgModule for `loadChildren` |
97
+ | `smartBookingDashboardRoutes` | The same routes for standalone `loadChildren` / children |
98
+ | `SmartBookingDashboardComponent` | The page component, if you prefer to route to it directly |
99
+ | `provideSmartBookingDashboard(config?)` | Environment providers that override the defaults |
100
+ | `SBD_CONFIG`, `SBD_DEFAULT_CONFIG`, `SbdConfig` | Injection token, defaults and type for the config |
101
+
102
+ ### `SbdConfig`
103
+
104
+ | Field | Default | Description |
105
+ | --- | --- | --- |
106
+ | `apiBase` | `'/api'` | Base URL of the backend API |
107
+ | `platform` | `'BO'` | Value of the `platform` header sent with FCR requests |
108
+
109
+ ## Development
110
+
111
+ From the repository root:
112
+
113
+ ```bash
114
+ npm install
115
+ npm start # demo app on http://localhost:4300 (proxies /api)
116
+ npm run lib:build # builds to dist/smart-booking-dashboard
117
+ ```
118
+
119
+ ## Publishing
120
+
121
+ 1. Bump `version` in `projects/smart-booking-dashboard/package.json`.
122
+ 2. Make sure you are logged in to npm with an account that is an owner or admin of the `almatar` org (`npm whoami`).
123
+ 3. Run from the repository root:
124
+ ```bash
125
+ npm run lib:publish
126
+ ```
127
+
128
+ `lib:publish` builds the library and publishes the `./dist/smart-booking-dashboard` folder with `access: restricted`, so the package stays private to the org. Never publish from the repository root; the root package is marked private on purpose.
129
+
130
+ ## License
131
+
132
+ MIT
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxtYXRhci1zbWFydC1ib29raW5nLWRhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9hbG1hdGFyLXNtYXJ0LWJvb2tpbmctZGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
@@ -0,0 +1,19 @@
1
+ import { Component, input, output } from '@angular/core';
2
+ import { TooltipModule } from 'primeng/tooltip';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "primeng/tooltip";
5
+ export class SbdActionCardComponent {
6
+ constructor() {
7
+ this.action = input.required();
8
+ this.active = input(false);
9
+ this.loading = input(false);
10
+ this.selected = output();
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdActionCardComponent, isStandalone: true, selector: "app-sbd-action-card", inputs: { action: { classPropertyName: "action", publicName: "action", isSignal: true, isRequired: true, transformFunction: null }, active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selected: "selected" }, ngImport: i0, template: "<button class=\"sbd-action-card\" [class.sbd-action-card--active]=\"active()\"\n [class.sbd-action-card--loading]=\"loading()\" [pTooltip]=\"action().subtitle\"\n tooltipPosition=\"top\" (click)=\"selected.emit(action().key)\" type=\"button\">\n @if (active()) { <span class=\"sbd-action-card__dot\"></span> }\n <div class=\"sbd-action-card__icon-tile\">\n <i [class]=\"action().icon\"></i>\n </div>\n <div class=\"sbd-action-card__body\">\n <span class=\"sbd-action-card__label\">{{ action().label }}</span>\n <span class=\"sbd-action-card__sub\">{{ action().subtitle }}</span>\n </div>\n</button>\n", styles: [".sbd-action-card{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:14px;background:#fff;border:1.5px solid #e2e8f0;border-radius:10px;cursor:pointer;text-align:left;width:100%;transition:transform .15s,box-shadow .15s,border-color .15s;font-family:inherit}.sbd-action-card:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000014;border-color:#1e2e4a}.sbd-action-card--active{border-color:#3b82f6!important;background:#eff6ff!important}.sbd-action-card--active .sbd-action-card__icon-tile{background:#3b82f61f;color:#3b82f6}.sbd-action-card--active .sbd-action-card__label{color:#3b82f6}.sbd-action-card--loading{pointer-events:none;opacity:.7}.sbd-action-card__dot{position:absolute;top:8px;right:8px;width:7px;height:7px;border-radius:50%;background:#3b82f6}.sbd-action-card__icon-tile{width:38px;height:38px;border-radius:8px;background:#f1f5f9;color:#1e2e4a;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbd-action-card__icon-tile i{font-size:18px}.sbd-action-card__body{display:flex;flex-direction:column;gap:2px;min-width:0;width:100%}.sbd-action-card__label{font-size:12.5px;font-weight:700;color:#1e2e4a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sbd-action-card__sub{font-size:11px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"], dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "fitContent", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionCardComponent, decorators: [{
16
+ type: Component,
17
+ args: [{ selector: 'app-sbd-action-card', standalone: true, imports: [TooltipModule], template: "<button class=\"sbd-action-card\" [class.sbd-action-card--active]=\"active()\"\n [class.sbd-action-card--loading]=\"loading()\" [pTooltip]=\"action().subtitle\"\n tooltipPosition=\"top\" (click)=\"selected.emit(action().key)\" type=\"button\">\n @if (active()) { <span class=\"sbd-action-card__dot\"></span> }\n <div class=\"sbd-action-card__icon-tile\">\n <i [class]=\"action().icon\"></i>\n </div>\n <div class=\"sbd-action-card__body\">\n <span class=\"sbd-action-card__label\">{{ action().label }}</span>\n <span class=\"sbd-action-card__sub\">{{ action().subtitle }}</span>\n </div>\n</button>\n", styles: [".sbd-action-card{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:14px;background:#fff;border:1.5px solid #e2e8f0;border-radius:10px;cursor:pointer;text-align:left;width:100%;transition:transform .15s,box-shadow .15s,border-color .15s;font-family:inherit}.sbd-action-card:hover{transform:translateY(-2px);box-shadow:0 4px 16px #00000014;border-color:#1e2e4a}.sbd-action-card--active{border-color:#3b82f6!important;background:#eff6ff!important}.sbd-action-card--active .sbd-action-card__icon-tile{background:#3b82f61f;color:#3b82f6}.sbd-action-card--active .sbd-action-card__label{color:#3b82f6}.sbd-action-card--loading{pointer-events:none;opacity:.7}.sbd-action-card__dot{position:absolute;top:8px;right:8px;width:7px;height:7px;border-radius:50%;background:#3b82f6}.sbd-action-card__icon-tile{width:38px;height:38px;border-radius:8px;background:#f1f5f9;color:#1e2e4a;display:flex;align-items:center;justify-content:center;flex-shrink:0}.sbd-action-card__icon-tile i{font-size:18px}.sbd-action-card__body{display:flex;flex-direction:column;gap:2px;min-width:0;width:100%}.sbd-action-card__label{font-size:12.5px;font-weight:700;color:#1e2e4a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sbd-action-card__sub{font-size:11px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n"] }]
18
+ }] });
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2FjdGlvbi1jYXJkL2FjdGlvbi1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9hY3Rpb24tY2FyZC9hY3Rpb24tY2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFVaEQsTUFBTSxPQUFPLHNCQUFzQjtJQVBuQztRQVFFLFdBQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFnQixDQUFDO1FBQ3hDLFdBQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsWUFBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixhQUFRLEdBQUcsTUFBTSxFQUFVLENBQUM7S0FDN0I7K0dBTFksc0JBQXNCO21HQUF0QixzQkFBc0IsaWZDWG5DLDBtQkFZQSxxNENETFksYUFBYTs7NEZBSVosc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLHFCQUFxQixjQUNuQixJQUFJLFdBQ1AsQ0FBQyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgQWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zYmQtYWN0aW9uLWNhcmQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbVG9vbHRpcE1vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hY3Rpb24tY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9hY3Rpb24tY2FyZC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFNiZEFjdGlvbkNhcmRDb21wb25lbnQge1xuICBhY3Rpb24gPSBpbnB1dC5yZXF1aXJlZDxBY3Rpb25Db25maWc+KCk7XG4gIGFjdGl2ZSA9IGlucHV0KGZhbHNlKTtcbiAgbG9hZGluZyA9IGlucHV0KGZhbHNlKTtcbiAgc2VsZWN0ZWQgPSBvdXRwdXQ8c3RyaW5nPigpO1xufVxuIiwiPGJ1dHRvbiBjbGFzcz1cInNiZC1hY3Rpb24tY2FyZFwiIFtjbGFzcy5zYmQtYWN0aW9uLWNhcmQtLWFjdGl2ZV09XCJhY3RpdmUoKVwiXG4gIFtjbGFzcy5zYmQtYWN0aW9uLWNhcmQtLWxvYWRpbmddPVwibG9hZGluZygpXCIgW3BUb29sdGlwXT1cImFjdGlvbigpLnN1YnRpdGxlXCJcbiAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgKGNsaWNrKT1cInNlbGVjdGVkLmVtaXQoYWN0aW9uKCkua2V5KVwiIHR5cGU9XCJidXR0b25cIj5cbiAgQGlmIChhY3RpdmUoKSkgeyA8c3BhbiBjbGFzcz1cInNiZC1hY3Rpb24tY2FyZF9fZG90XCI+PC9zcGFuPiB9XG4gIDxkaXYgY2xhc3M9XCJzYmQtYWN0aW9uLWNhcmRfX2ljb24tdGlsZVwiPlxuICAgIDxpIFtjbGFzc109XCJhY3Rpb24oKS5pY29uXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNiZC1hY3Rpb24tY2FyZF9fYm9keVwiPlxuICAgIDxzcGFuIGNsYXNzPVwic2JkLWFjdGlvbi1jYXJkX19sYWJlbFwiPnt7IGFjdGlvbigpLmxhYmVsIH19PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwic2JkLWFjdGlvbi1jYXJkX19zdWJcIj57eyBhY3Rpb24oKS5zdWJ0aXRsZSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2J1dHRvbj5cbiJdfQ==
@@ -0,0 +1,177 @@
1
+ import { Component, input, output, inject, signal, computed, effect } from '@angular/core';
2
+ import { DialogModule } from 'primeng/dialog';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { NgSelectModule } from '@ng-select/ng-select';
6
+ import { of } from 'rxjs';
7
+ import { map, catchError } from 'rxjs/operators';
8
+ import { AR_LABELS, AR_SECTION_TITLES } from '../../config/labels.ar';
9
+ import { SbdBookingService } from '../../services/booking.service';
10
+ import { SbdToastService } from '../../services/toast.service';
11
+ import { SbdResultPanelComponent } from '../result-panel/result-panel.component';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "primeng/dialog";
14
+ import * as i2 from "primeng/api";
15
+ import * as i3 from "primeng/button";
16
+ import * as i4 from "@angular/forms";
17
+ import * as i5 from "@ng-select/ng-select";
18
+ export class SbdActionDialogComponent {
19
+ constructor() {
20
+ this.bookingService = inject(SbdBookingService);
21
+ this.toast = inject(SbdToastService);
22
+ this.visible = input(false);
23
+ this.bookingId = input('');
24
+ this.product = input('flight');
25
+ this.actions = input([]);
26
+ this.initialKey = input(null);
27
+ // Pre-fetched booking data from the parent — avoids a redundant API call
28
+ // when the action's apiField is already satisfied by the initial lookup.
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ this.preloadedData = input(null);
31
+ this.closed = output();
32
+ this.selectedAction = signal(null);
33
+ this.actionStatus = signal('idle');
34
+ this.actionData = signal(null);
35
+ this.elapsedMs = signal(0);
36
+ this.copying = signal(false);
37
+ this.resultContent = computed(() => {
38
+ const a = this.selectedAction();
39
+ const d = this.actionData();
40
+ return a && d ? a.formatter(d) : null;
41
+ });
42
+ effect(() => {
43
+ if (this.visible()) {
44
+ const key = this.initialKey();
45
+ const action = key ? this.actions().find(a => a.key === key) ?? null : null;
46
+ if (action) {
47
+ this.onActionSelect(action);
48
+ }
49
+ }
50
+ else {
51
+ this.selectedAction.set(null);
52
+ this.actionStatus.set('idle');
53
+ this.actionData.set(null);
54
+ this.elapsedMs.set(0);
55
+ }
56
+ }, { allowSignalWrites: true });
57
+ }
58
+ copyResult(mode) {
59
+ const enResult = this.resultContent();
60
+ const action = this.selectedAction();
61
+ if (!enResult || !action)
62
+ return;
63
+ if (mode === 'en') {
64
+ const text = this.buildBilingualText(enResult, null);
65
+ navigator.clipboard.writeText(text).then(() => this.toast.success('Copied EN'));
66
+ return;
67
+ }
68
+ this.copying.set(true);
69
+ const arData$ = action.apiField === '$refund_details'
70
+ ? this.bookingService.getRefundDetails(this.bookingId(), this.product(), 'ar').pipe(map((data) => data), catchError(() => of(null)))
71
+ : this.bookingService.getBooking(this.bookingId(), this.product(), action.apiField, 'ar').pipe(map(({ data }) => data), catchError(() => of(null)));
72
+ arData$.subscribe(arRaw => {
73
+ const arResult = arRaw ? action.formatter(arRaw) : null;
74
+ const text = mode === 'ar'
75
+ ? this.buildBilingualText(null, arResult)
76
+ : this.buildBilingualText(enResult, arResult);
77
+ const msg = mode === 'ar' ? 'Copied AR' : 'Copied EN + AR';
78
+ navigator.clipboard.writeText(text)
79
+ .then(() => this.toast.success(msg))
80
+ .catch(() => this.toast.success('Copied to clipboard'))
81
+ .finally(() => this.copying.set(false));
82
+ });
83
+ }
84
+ buildBilingualText(en, ar) {
85
+ const LTR = '‎';
86
+ const RTL = '‏';
87
+ const divider = `${LTR}${'─'.repeat(40)}`;
88
+ const formatEn = (r) => {
89
+ const lines = [`${LTR}${r.title}`];
90
+ if (r.subtitle)
91
+ lines.push(`${LTR}${r.subtitle}`);
92
+ lines.push('');
93
+ if (r.sections?.length) {
94
+ for (const s of r.sections) {
95
+ lines.push(`${LTR}── ${s.title} ──`);
96
+ for (const row of s.rows) {
97
+ lines.push(row.value ? `${LTR}${row.label}: ${row.value}` : `${LTR}· ${row.label}`);
98
+ }
99
+ lines.push('');
100
+ }
101
+ }
102
+ else if (r.points?.length) {
103
+ for (const p of r.points)
104
+ lines.push(`${LTR}${p.label}: ${p.value}`);
105
+ }
106
+ if (r.callout)
107
+ lines.push(`${LTR}Note: ${r.callout.message}`);
108
+ return lines;
109
+ };
110
+ const formatAr = (r) => {
111
+ const tl = (label) => AR_LABELS[label] ?? label;
112
+ const ts = (title) => AR_SECTION_TITLES[title] ?? title;
113
+ const lines = [`${RTL}${r.title}`];
114
+ if (r.subtitle)
115
+ lines.push(`${RTL}${r.subtitle}`);
116
+ lines.push('');
117
+ if (r.sections?.length) {
118
+ for (const s of r.sections) {
119
+ lines.push(`${RTL}── ${ts(s.title)} ──`);
120
+ for (const row of s.rows) {
121
+ lines.push(row.value ? `${RTL}${tl(row.label)}: ${row.value}` : `${RTL}· ${tl(row.label)}`);
122
+ }
123
+ lines.push('');
124
+ }
125
+ }
126
+ else if (r.points?.length) {
127
+ for (const p of r.points)
128
+ lines.push(`${RTL}${tl(p.label)}: ${p.value}`);
129
+ }
130
+ if (r.callout)
131
+ lines.push(`${RTL}ملاحظة: ${r.callout.message}`);
132
+ return lines;
133
+ };
134
+ if (!en && ar)
135
+ return formatAr(ar).join('\r\n');
136
+ if (en && !ar)
137
+ return formatEn(en).join('\r\n');
138
+ return [...formatEn(en), '', divider, '', ...formatAr(ar)].join('\r\n');
139
+ }
140
+ onActionSelect(action) {
141
+ if (!action)
142
+ return;
143
+ this.selectedAction.set(action);
144
+ this.actionStatus.set('loading');
145
+ this.actionData.set(null);
146
+ // Use pre-fetched data when available and the action doesn't need its own
147
+ // endpoint (i.e. not the special $refund_details POST).
148
+ const cached = this.preloadedData();
149
+ if (action.apiField !== '$refund_details' && cached) {
150
+ this.actionData.set(cached);
151
+ this.elapsedMs.set(0);
152
+ this.actionStatus.set('success');
153
+ return;
154
+ }
155
+ const start = performance.now();
156
+ const source$ = action.apiField === '$refund_details'
157
+ ? this.bookingService.getRefundDetails(this.bookingId(), this.product()).pipe(map((data) => ({ data, elapsedMs: performance.now() - start })))
158
+ : this.bookingService.getBooking(this.bookingId(), this.product(), action.apiField);
159
+ source$.subscribe({
160
+ next: ({ data, elapsedMs }) => {
161
+ this.actionData.set(data);
162
+ this.elapsedMs.set(elapsedMs);
163
+ this.actionStatus.set('success');
164
+ },
165
+ error: () => {
166
+ this.actionStatus.set('error');
167
+ },
168
+ });
169
+ }
170
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
171
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: SbdActionDialogComponent, isStandalone: true, selector: "app-sbd-action-dialog", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: false, transformFunction: null }, product: { classPropertyName: "product", publicName: "product", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, initialKey: { classPropertyName: "initialKey", publicName: "initialKey", isSignal: true, isRequired: false, transformFunction: null }, preloadedData: { classPropertyName: "preloadedData", publicName: "preloadedData", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<p-dialog\n [visible]=\"visible()\"\n (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\"\n [blockScroll]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '720px', maxHeight: '90vh' }\"\n styleClass=\"sbd-action-dialog-wrapper\"\n header=\"Browse Actions\">\n\n <div class=\"sad\">\n\n <!-- ng-select dropdown -->\n <div class=\"sad__picker\">\n <ng-select\n [items]=\"actions()\"\n [ngModel]=\"selectedAction()\"\n (change)=\"onActionSelect($event)\"\n [searchable]=\"true\"\n [clearable]=\"false\"\n bindLabel=\"label\"\n placeholder=\"Search actions...\"\n class=\"sad__select\">\n\n <!-- Selected value display -->\n <ng-template ng-label-tmp let-item=\"item\">\n <div class=\"sad__option\">\n <i class=\"{{ item.icon }} sad__option-icon\"></i>\n <div class=\"sad__option-text\">\n <span class=\"sad__option-label\">{{ item.label }}</span>\n <span class=\"sad__option-sub\">{{ item.subtitle }}</span>\n </div>\n </div>\n </ng-template>\n\n <!-- Dropdown list item -->\n <ng-template ng-option-tmp let-item=\"item\" let-search=\"searchTerm\">\n <div class=\"sad__option\">\n <i class=\"{{ item.icon }} sad__option-icon\"></i>\n <div class=\"sad__option-text\">\n <span class=\"sad__option-label\">{{ item.label }}</span>\n <span class=\"sad__option-sub\">{{ item.subtitle }}</span>\n </div>\n </div>\n </ng-template>\n\n </ng-select>\n </div>\n\n <!-- Result area -->\n <div class=\"sad__result\">\n <app-sbd-result-panel\n [actionLabel]=\"selectedAction()?.label ?? ''\"\n [elapsedMs]=\"elapsedMs()\"\n [status]=\"actionStatus()\"\n [result]=\"resultContent()\"\n />\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <button pButton label=\"Copy EN\" icon=\"pi pi-copy\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('en')\">\n </button>\n <button pButton label=\"Copy AR\" icon=\"pi pi-copy\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('ar')\">\n </button>\n <button pButton label=\"Copy EN + AR\"\n [icon]=\"copying() ? 'pi pi-spin pi-spinner' : 'pi pi-copy'\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('both')\">\n </button>\n <button pButton label=\"Close\" icon=\"pi pi-times\" class=\"p-button-outlined p-button-secondary p-button-sm\" (click)=\"closed.emit()\"></button>\n </ng-template>\n\n</p-dialog>\n", styles: [".sad{display:flex;flex-direction:column;font-family:inherit}.sad__picker{padding:16px 20px;border-bottom:1px solid #e2e8f0}.sad__select{width:100%}.sad__select ::ng-deep .ng-select-container{height:56px}.sad__option{display:flex;align-items:center;gap:10px;padding:2px 0}.sad__option-icon{font-size:14px;color:#64748b;flex-shrink:0;width:20px;text-align:center}.sad__option-text{display:flex;flex-direction:column;gap:2px;min-width:0}.sad__option-label{font-size:13.5px;font-weight:600;color:#1e2e4a}.sad__option-sub{font-size:11.5px;color:#94a3b8}.sad__result{overflow-y:auto;max-height:calc(90vh - 200px)}.sad__result::-webkit-scrollbar{width:4px}.sad__result::-webkit-scrollbar-track{background:transparent}.sad__result::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:4px}.sad__result ::ng-deep .sbd-result-panel{border:none;border-radius:0;box-shadow:none}.sad__select.ng-select .ng-select-container{border:1px solid #e2e8f0;border-radius:8px;min-height:48px;font-family:inherit;box-shadow:none}.sad__select.ng-select .ng-select-container:hover{border-color:#94a3b8}.sad__select.ng-select .ng-select-container .ng-value-container{padding:0 12px}.sad__select.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#94a3b8;font-size:13.5px}.sad__select.ng-select .ng-select-container .ng-value-container .ng-value{font-size:13.5px}.sad__select.ng-select .ng-select-container .ng-arrow-wrapper{padding-right:10px}.sad__select.ng-select .ng-select-container .ng-arrow-wrapper .ng-arrow{border-color:#94a3b8 transparent transparent}.sad__select.ng-select.ng-select-focused .ng-select-container{border-color:#94a3b8;box-shadow:0 0 0 3px #94a3b826}.sad__select.ng-select.ng-select-opened .ng-select-container{border-color:#94a3b8;border-radius:8px 8px 0 0}.sad__select.ng-select.ng-select-opened .ng-select-container .ng-arrow{border-color:transparent transparent #94a3b8}.sad__select .ng-dropdown-panel{border:1px solid #e2e8f0;border-top:none;border-radius:0 0 8px 8px;box-shadow:0 8px 24px #00000014}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items{max-height:520px}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{padding:8px 12px;color:#1e2e4a;font-size:13.5px;background:#fff}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option:hover,.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background:#f8fafc}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected{background:#f1f5f9;font-weight:500}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .sad__option-label{color:#1e2e4a}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .sad__option-icon{color:#475569}.sad__select .ng-dropdown-panel .ng-dropdown-header{border-bottom:1px solid #f1f5f9;padding:8px 12px}\n"], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }, { kind: "component", type: i5.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "ariaLabel", "markFirst", "placeholder", "fixedPlaceholder", "notFoundText", "typeToSearchText", "preventToggleOnRightClick", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "ngClass", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick", "keyDownFn"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: i5.NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "directive", type: i5.NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "component", type: SbdResultPanelComponent, selector: "app-sbd-result-panel", inputs: ["actionLabel", "elapsedMs", "status", "result"], outputs: ["feedbackGiven"] }] }); }
172
+ }
173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionDialogComponent, decorators: [{
174
+ type: Component,
175
+ args: [{ selector: 'app-sbd-action-dialog', standalone: true, imports: [DialogModule, ButtonModule, FormsModule, NgSelectModule, SbdResultPanelComponent], template: "<p-dialog\n [visible]=\"visible()\"\n (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\"\n [blockScroll]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '720px', maxHeight: '90vh' }\"\n styleClass=\"sbd-action-dialog-wrapper\"\n header=\"Browse Actions\">\n\n <div class=\"sad\">\n\n <!-- ng-select dropdown -->\n <div class=\"sad__picker\">\n <ng-select\n [items]=\"actions()\"\n [ngModel]=\"selectedAction()\"\n (change)=\"onActionSelect($event)\"\n [searchable]=\"true\"\n [clearable]=\"false\"\n bindLabel=\"label\"\n placeholder=\"Search actions...\"\n class=\"sad__select\">\n\n <!-- Selected value display -->\n <ng-template ng-label-tmp let-item=\"item\">\n <div class=\"sad__option\">\n <i class=\"{{ item.icon }} sad__option-icon\"></i>\n <div class=\"sad__option-text\">\n <span class=\"sad__option-label\">{{ item.label }}</span>\n <span class=\"sad__option-sub\">{{ item.subtitle }}</span>\n </div>\n </div>\n </ng-template>\n\n <!-- Dropdown list item -->\n <ng-template ng-option-tmp let-item=\"item\" let-search=\"searchTerm\">\n <div class=\"sad__option\">\n <i class=\"{{ item.icon }} sad__option-icon\"></i>\n <div class=\"sad__option-text\">\n <span class=\"sad__option-label\">{{ item.label }}</span>\n <span class=\"sad__option-sub\">{{ item.subtitle }}</span>\n </div>\n </div>\n </ng-template>\n\n </ng-select>\n </div>\n\n <!-- Result area -->\n <div class=\"sad__result\">\n <app-sbd-result-panel\n [actionLabel]=\"selectedAction()?.label ?? ''\"\n [elapsedMs]=\"elapsedMs()\"\n [status]=\"actionStatus()\"\n [result]=\"resultContent()\"\n />\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <button pButton label=\"Copy EN\" icon=\"pi pi-copy\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('en')\">\n </button>\n <button pButton label=\"Copy AR\" icon=\"pi pi-copy\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('ar')\">\n </button>\n <button pButton label=\"Copy EN + AR\"\n [icon]=\"copying() ? 'pi pi-spin pi-spinner' : 'pi pi-copy'\"\n class=\"p-button-outlined p-button-sm\"\n [disabled]=\"actionStatus() !== 'success' || copying()\"\n (click)=\"copyResult('both')\">\n </button>\n <button pButton label=\"Close\" icon=\"pi pi-times\" class=\"p-button-outlined p-button-secondary p-button-sm\" (click)=\"closed.emit()\"></button>\n </ng-template>\n\n</p-dialog>\n", styles: [".sad{display:flex;flex-direction:column;font-family:inherit}.sad__picker{padding:16px 20px;border-bottom:1px solid #e2e8f0}.sad__select{width:100%}.sad__select ::ng-deep .ng-select-container{height:56px}.sad__option{display:flex;align-items:center;gap:10px;padding:2px 0}.sad__option-icon{font-size:14px;color:#64748b;flex-shrink:0;width:20px;text-align:center}.sad__option-text{display:flex;flex-direction:column;gap:2px;min-width:0}.sad__option-label{font-size:13.5px;font-weight:600;color:#1e2e4a}.sad__option-sub{font-size:11.5px;color:#94a3b8}.sad__result{overflow-y:auto;max-height:calc(90vh - 200px)}.sad__result::-webkit-scrollbar{width:4px}.sad__result::-webkit-scrollbar-track{background:transparent}.sad__result::-webkit-scrollbar-thumb{background:#e2e8f0;border-radius:4px}.sad__result ::ng-deep .sbd-result-panel{border:none;border-radius:0;box-shadow:none}.sad__select.ng-select .ng-select-container{border:1px solid #e2e8f0;border-radius:8px;min-height:48px;font-family:inherit;box-shadow:none}.sad__select.ng-select .ng-select-container:hover{border-color:#94a3b8}.sad__select.ng-select .ng-select-container .ng-value-container{padding:0 12px}.sad__select.ng-select .ng-select-container .ng-value-container .ng-placeholder{color:#94a3b8;font-size:13.5px}.sad__select.ng-select .ng-select-container .ng-value-container .ng-value{font-size:13.5px}.sad__select.ng-select .ng-select-container .ng-arrow-wrapper{padding-right:10px}.sad__select.ng-select .ng-select-container .ng-arrow-wrapper .ng-arrow{border-color:#94a3b8 transparent transparent}.sad__select.ng-select.ng-select-focused .ng-select-container{border-color:#94a3b8;box-shadow:0 0 0 3px #94a3b826}.sad__select.ng-select.ng-select-opened .ng-select-container{border-color:#94a3b8;border-radius:8px 8px 0 0}.sad__select.ng-select.ng-select-opened .ng-select-container .ng-arrow{border-color:transparent transparent #94a3b8}.sad__select .ng-dropdown-panel{border:1px solid #e2e8f0;border-top:none;border-radius:0 0 8px 8px;box-shadow:0 8px 24px #00000014}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items{max-height:520px}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option{padding:8px 12px;color:#1e2e4a;font-size:13.5px;background:#fff}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option:hover,.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-marked{background:#f8fafc}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected{background:#f1f5f9;font-weight:500}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .sad__option-label{color:#1e2e4a}.sad__select .ng-dropdown-panel .ng-dropdown-panel-items .ng-option.ng-option-selected .sad__option-icon{color:#475569}.sad__select .ng-dropdown-panel .ng-dropdown-header{border-bottom:1px solid #f1f5f9;padding:8px 12px}\n"] }]
176
+ }], ctorParameters: () => [] });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1ib29raW5nLWRhc2hib2FyZC9zcmMvbGliL2NvbXBvbmVudHMvYWN0aW9uLWRpYWxvZy9hY3Rpb24tZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9hY3Rpb24tZGlhbG9nL2FjdGlvbi1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQixPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7QUFTakYsTUFBTSxPQUFPLHdCQUF3QjtJQTJCbkM7UUExQlEsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQyxVQUFLLEdBQVksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWpELFlBQU8sR0FBVSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsY0FBUyxHQUFRLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQVUsS0FBSyxDQUFjLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLFlBQU8sR0FBVSxLQUFLLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLGVBQVUsR0FBTyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO1FBQzVDLHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsOERBQThEO1FBQzlELGtCQUFhLEdBQUksS0FBSyxDQUFhLElBQUksQ0FBQyxDQUFDO1FBQ3pDLFdBQU0sR0FBVyxNQUFNLEVBQVEsQ0FBQztRQUVoQyxtQkFBYyxHQUFHLE1BQU0sQ0FBc0IsSUFBSSxDQUFDLENBQUM7UUFDbkQsaUJBQVksR0FBSyxNQUFNLENBQTJDLE1BQU0sQ0FBQyxDQUFDO1FBQzFFLGVBQVUsR0FBTyxNQUFNLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDdkMsY0FBUyxHQUFRLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixZQUFPLEdBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9CLGtCQUFhLEdBQUcsUUFBUSxDQUF1QixHQUFHLEVBQUU7WUFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUdELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzVFLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQTBCO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBRWpDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDaEYsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxLQUFLLGlCQUFpQjtZQUNuRCxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDL0UsR0FBRyxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3pEO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzFGLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDcEQsQ0FBQztRQUVOLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUk7Z0JBQ3hCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzRCxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7aUJBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbkMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7aUJBQ3RELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEVBQXdCLEVBQUUsRUFBd0I7UUFDM0UsTUFBTSxHQUFHLEdBQU8sR0FBRyxDQUFDO1FBQ3BCLE1BQU0sR0FBRyxHQUFPLEdBQUcsQ0FBQztRQUNwQixNQUFNLE9BQU8sR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFMUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFnQixFQUFZLEVBQUU7WUFDOUMsTUFBTSxLQUFLLEdBQWEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsQ0FBQyxRQUFRO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNmLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUM7b0JBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztvQkFDdEYsQ0FBQztvQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQzVCLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU07b0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLENBQUM7WUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFnQixFQUFZLEVBQUU7WUFDOUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUM7WUFDeEQsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQztZQUNoRSxNQUFNLEtBQUssR0FBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxDQUFDLFFBQVE7Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO2dCQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDekMsS0FBSyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5RixDQUFDO29CQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pCLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDNUIsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTTtvQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUNELElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDaEUsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUU7WUFBRyxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxFQUFFLElBQUssQ0FBQyxFQUFFO1lBQUUsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQTJCO1FBQ3hDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQiwwRUFBMEU7UUFDMUUsd0RBQXdEO1FBQ3hELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssaUJBQWlCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsS0FBSyxpQkFBaUI7WUFDbkQsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FDekUsR0FBRyxDQUFDLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUN6RTtZQUNILENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RixPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2hCLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBbEtVLHdCQUF3QjttR0FBeEIsd0JBQXdCLGk1QkN0QnJDLHEyRkFtRkEscTNGRGpFWSxZQUFZLGkwQkFBRSxZQUFZLHNLQUFFLFdBQVcsOFZBQUUsY0FBYyw0b0NBQUUsdUJBQXVCOzs0RkFJL0Usd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQsIGluamVjdCwgc2lnbmFsLCBjb21wdXRlZCwgZWZmZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dNb2R1bGUgfSBmcm9tICdwcmltZW5nL2RpYWxvZyc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5nU2VsZWN0TW9kdWxlIH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQWN0aW9uQ29uZmlnLCBSZXN1bHRDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi50eXBlcyc7XG5pbXBvcnQgeyBBUl9MQUJFTFMsIEFSX1NFQ1RJT05fVElUTEVTIH0gZnJvbSAnLi4vLi4vY29uZmlnL2xhYmVscy5hcic7XG5pbXBvcnQgeyBQcm9kdWN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9ib29raW5nLnR5cGVzJztcbmltcG9ydCB7IFNiZEJvb2tpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYm9va2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFNiZFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2JkUmVzdWx0UGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9yZXN1bHQtcGFuZWwvcmVzdWx0LXBhbmVsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zYmQtYWN0aW9uLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEaWFsb2dNb2R1bGUsIEJ1dHRvbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE5nU2VsZWN0TW9kdWxlLCBTYmRSZXN1bHRQYW5lbENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hY3Rpb24tZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FjdGlvbi1kaWFsb2cuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTYmRBY3Rpb25EaWFsb2dDb21wb25lbnQge1xuICBwcml2YXRlIGJvb2tpbmdTZXJ2aWNlID0gaW5qZWN0KFNiZEJvb2tpbmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCAgICAgICAgICA9IGluamVjdChTYmRUb2FzdFNlcnZpY2UpO1xuXG4gIHZpc2libGUgICAgICAgID0gaW5wdXQoZmFsc2UpO1xuICBib29raW5nSWQgICAgICA9IGlucHV0KCcnKTtcbiAgcHJvZHVjdCAgICAgICAgPSBpbnB1dDxQcm9kdWN0VHlwZT4oJ2ZsaWdodCcpO1xuICBhY3Rpb25zICAgICAgICA9IGlucHV0PEFjdGlvbkNvbmZpZ1tdPihbXSk7XG4gIGluaXRpYWxLZXkgICAgID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIC8vIFByZS1mZXRjaGVkIGJvb2tpbmcgZGF0YSBmcm9tIHRoZSBwYXJlbnQg4oCUIGF2b2lkcyBhIHJlZHVuZGFudCBBUEkgY2FsbFxuICAvLyB3aGVuIHRoZSBhY3Rpb24ncyBhcGlGaWVsZCBpcyBhbHJlYWR5IHNhdGlzZmllZCBieSB0aGUgaW5pdGlhbCBsb29rdXAuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByZWxvYWRlZERhdGEgID0gaW5wdXQ8YW55IHwgbnVsbD4obnVsbCk7XG4gIGNsb3NlZCAgICAgICAgID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgc2VsZWN0ZWRBY3Rpb24gPSBzaWduYWw8QWN0aW9uQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gIGFjdGlvblN0YXR1cyAgID0gc2lnbmFsPCdpZGxlJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdlcnJvcic+KCdpZGxlJyk7XG4gIGFjdGlvbkRhdGEgICAgID0gc2lnbmFsPHVua25vd24+KG51bGwpO1xuICBlbGFwc2VkTXMgICAgICA9IHNpZ25hbCgwKTtcbiAgY29weWluZyAgICAgICAgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHJlc3VsdENvbnRlbnQgPSBjb21wdXRlZDxSZXN1bHRDb250ZW50IHwgbnVsbD4oKCkgPT4ge1xuICAgIGNvbnN0IGEgPSB0aGlzLnNlbGVjdGVkQWN0aW9uKCk7XG4gICAgY29uc3QgZCA9IHRoaXMuYWN0aW9uRGF0YSgpO1xuICAgIHJldHVybiBhICYmIGQgPyBhLmZvcm1hdHRlcihkKSA6IG51bGw7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy52aXNpYmxlKCkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5pbml0aWFsS2V5KCk7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IGtleSA/IHRoaXMuYWN0aW9ucygpLmZpbmQoYSA9PiBhLmtleSA9PT0ga2V5KSA/PyBudWxsIDogbnVsbDtcbiAgICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICAgIHRoaXMub25BY3Rpb25TZWxlY3QoYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFjdGlvbi5zZXQobnVsbCk7XG4gICAgICAgIHRoaXMuYWN0aW9uU3RhdHVzLnNldCgnaWRsZScpO1xuICAgICAgICB0aGlzLmFjdGlvbkRhdGEuc2V0KG51bGwpO1xuICAgICAgICB0aGlzLmVsYXBzZWRNcy5zZXQoMCk7XG4gICAgICB9XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvcHlSZXN1bHQobW9kZTogJ2VuJyB8ICdhcicgfCAnYm90aCcpOiB2b2lkIHtcbiAgICBjb25zdCBlblJlc3VsdCA9IHRoaXMucmVzdWx0Q29udGVudCgpO1xuICAgIGNvbnN0IGFjdGlvbiAgID0gdGhpcy5zZWxlY3RlZEFjdGlvbigpO1xuICAgIGlmICghZW5SZXN1bHQgfHwgIWFjdGlvbikgcmV0dXJuO1xuXG4gICAgaWYgKG1vZGUgPT09ICdlbicpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkQmlsaW5ndWFsVGV4dChlblJlc3VsdCwgbnVsbCk7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS50aGVuKCgpID0+IHRoaXMudG9hc3Quc3VjY2VzcygnQ29waWVkIEVOJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY29weWluZy5zZXQodHJ1ZSk7XG5cbiAgICBjb25zdCBhckRhdGEkID0gYWN0aW9uLmFwaUZpZWxkID09PSAnJHJlZnVuZF9kZXRhaWxzJ1xuICAgICAgPyB0aGlzLmJvb2tpbmdTZXJ2aWNlLmdldFJlZnVuZERldGFpbHModGhpcy5ib29raW5nSWQoKSwgdGhpcy5wcm9kdWN0KCksICdhcicpLnBpcGUoXG4gICAgICAgICAgbWFwKChkYXRhOiB1bmtub3duKSA9PiBkYXRhKSwgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIClcbiAgICAgIDogdGhpcy5ib29raW5nU2VydmljZS5nZXRCb29raW5nKHRoaXMuYm9va2luZ0lkKCksIHRoaXMucHJvZHVjdCgpLCBhY3Rpb24uYXBpRmllbGQsICdhcicpLnBpcGUoXG4gICAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpLFxuICAgICAgICApO1xuXG4gICAgYXJEYXRhJC5zdWJzY3JpYmUoYXJSYXcgPT4ge1xuICAgICAgY29uc3QgYXJSZXN1bHQgPSBhclJhdyA/IGFjdGlvbi5mb3JtYXR0ZXIoYXJSYXcpIDogbnVsbDtcbiAgICAgIGNvbnN0IHRleHQgPSBtb2RlID09PSAnYXInXG4gICAgICAgID8gdGhpcy5idWlsZEJpbGluZ3VhbFRleHQobnVsbCwgYXJSZXN1bHQpXG4gICAgICAgIDogdGhpcy5idWlsZEJpbGluZ3VhbFRleHQoZW5SZXN1bHQsIGFyUmVzdWx0KTtcbiAgICAgIGNvbnN0IG1zZyA9IG1vZGUgPT09ICdhcicgPyAnQ29waWVkIEFSJyA6ICdDb3BpZWQgRU4gKyBBUic7XG4gICAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnRvYXN0LnN1Y2Nlc3MobXNnKSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMudG9hc3Quc3VjY2VzcygnQ29waWVkIHRvIGNsaXBib2FyZCcpKVxuICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmNvcHlpbmcuc2V0KGZhbHNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQmlsaW5ndWFsVGV4dChlbjogUmVzdWx0Q29udGVudCB8IG51bGwsIGFyOiBSZXN1bHRDb250ZW50IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgTFRSICAgICA9ICfigI4nO1xuICAgIGNvbnN0IFJUTCAgICAgPSAn4oCPJztcbiAgICBjb25zdCBkaXZpZGVyID0gYCR7TFRSfSR7J+KUgCcucmVwZWF0KDQwKX1gO1xuXG4gICAgY29uc3QgZm9ybWF0RW4gPSAocjogUmVzdWx0Q29udGVudCk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgJHtMVFJ9JHtyLnRpdGxlfWBdO1xuICAgICAgaWYgKHIuc3VidGl0bGUpIGxpbmVzLnB1c2goYCR7TFRSfSR7ci5zdWJ0aXRsZX1gKTtcbiAgICAgIGxpbmVzLnB1c2goJycpO1xuICAgICAgaWYgKHIuc2VjdGlvbnM/Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2Ygci5zZWN0aW9ucykge1xuICAgICAgICAgIGxpbmVzLnB1c2goYCR7TFRSfeKUgOKUgCAke3MudGl0bGV9IOKUgOKUgGApO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHMucm93cykge1xuICAgICAgICAgICAgbGluZXMucHVzaChyb3cudmFsdWUgPyBgJHtMVFJ9JHtyb3cubGFiZWx9OiAke3Jvdy52YWx1ZX1gIDogYCR7TFRSfcK3ICR7cm93LmxhYmVsfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyLnBvaW50cz8ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByLnBvaW50cykgbGluZXMucHVzaChgJHtMVFJ9JHtwLmxhYmVsfTogJHtwLnZhbHVlfWApO1xuICAgICAgfVxuICAgICAgaWYgKHIuY2FsbG91dCkgbGluZXMucHVzaChgJHtMVFJ9Tm90ZTogJHtyLmNhbGxvdXQubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBsaW5lcztcbiAgICB9O1xuXG4gICAgY29uc3QgZm9ybWF0QXIgPSAocjogUmVzdWx0Q29udGVudCk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IHRsID0gKGxhYmVsOiBzdHJpbmcpID0+IEFSX0xBQkVMU1tsYWJlbF0gPz8gbGFiZWw7XG4gICAgICBjb25zdCB0cyA9ICh0aXRsZTogc3RyaW5nKSA9PiBBUl9TRUNUSU9OX1RJVExFU1t0aXRsZV0gPz8gdGl0bGU7XG4gICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbYCR7UlRMfSR7ci50aXRsZX1gXTtcbiAgICAgIGlmIChyLnN1YnRpdGxlKSBsaW5lcy5wdXNoKGAke1JUTH0ke3Iuc3VidGl0bGV9YCk7XG4gICAgICBsaW5lcy5wdXNoKCcnKTtcbiAgICAgIGlmIChyLnNlY3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBzIG9mIHIuc2VjdGlvbnMpIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKGAke1JUTH3ilIDilIAgJHt0cyhzLnRpdGxlKX0g4pSA4pSAYCk7XG4gICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcy5yb3dzKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKHJvdy52YWx1ZSA/IGAke1JUTH0ke3RsKHJvdy5sYWJlbCl9OiAke3Jvdy52YWx1ZX1gIDogYCR7UlRMfcK3ICR7dGwocm93LmxhYmVsKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGluZXMucHVzaCgnJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoci5wb2ludHM/Lmxlbmd0aCkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2Ygci5wb2ludHMpIGxpbmVzLnB1c2goYCR7UlRMfSR7dGwocC5sYWJlbCl9OiAke3AudmFsdWV9YCk7XG4gICAgICB9XG4gICAgICBpZiAoci5jYWxsb3V0KSBsaW5lcy5wdXNoKGAke1JUTH3ZhdmE2KfYrdi42Kk6ICR7ci5jYWxsb3V0Lm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gbGluZXM7XG4gICAgfTtcblxuICAgIGlmICghZW4gJiYgYXIpICByZXR1cm4gZm9ybWF0QXIoYXIpLmpvaW4oJ1xcclxcbicpO1xuICAgIGlmIChlbiAgJiYgIWFyKSByZXR1cm4gZm9ybWF0RW4oZW4pLmpvaW4oJ1xcclxcbicpO1xuICAgIHJldHVybiBbLi4uZm9ybWF0RW4oZW4hKSwgJycsIGRpdmlkZXIsICcnLCAuLi5mb3JtYXRBcihhciEpXS5qb2luKCdcXHJcXG4nKTtcbiAgfVxuXG4gIG9uQWN0aW9uU2VsZWN0KGFjdGlvbjogQWN0aW9uQ29uZmlnIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICghYWN0aW9uKSByZXR1cm47XG4gICAgdGhpcy5zZWxlY3RlZEFjdGlvbi5zZXQoYWN0aW9uKTtcbiAgICB0aGlzLmFjdGlvblN0YXR1cy5zZXQoJ2xvYWRpbmcnKTtcbiAgICB0aGlzLmFjdGlvbkRhdGEuc2V0KG51bGwpO1xuXG4gICAgLy8gVXNlIHByZS1mZXRjaGVkIGRhdGEgd2hlbiBhdmFpbGFibGUgYW5kIHRoZSBhY3Rpb24gZG9lc24ndCBuZWVkIGl0cyBvd25cbiAgICAvLyBlbmRwb2ludCAoaS5lLiBub3QgdGhlIHNwZWNpYWwgJHJlZnVuZF9kZXRhaWxzIFBPU1QpLlxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucHJlbG9hZGVkRGF0YSgpO1xuICAgIGlmIChhY3Rpb24uYXBpRmllbGQgIT09ICckcmVmdW5kX2RldGFpbHMnICYmIGNhY2hlZCkge1xuICAgICAgdGhpcy5hY3Rpb25EYXRhLnNldChjYWNoZWQpO1xuICAgICAgdGhpcy5lbGFwc2VkTXMuc2V0KDApO1xuICAgICAgdGhpcy5hY3Rpb25TdGF0dXMuc2V0KCdzdWNjZXNzJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIGNvbnN0IHNvdXJjZSQgPSBhY3Rpb24uYXBpRmllbGQgPT09ICckcmVmdW5kX2RldGFpbHMnXG4gICAgICA/IHRoaXMuYm9va2luZ1NlcnZpY2UuZ2V0UmVmdW5kRGV0YWlscyh0aGlzLmJvb2tpbmdJZCgpLCB0aGlzLnByb2R1Y3QoKSkucGlwZShcbiAgICAgICAgICBtYXAoKGRhdGE6IHVua25vd24pID0+ICh7IGRhdGEsIGVsYXBzZWRNczogcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCB9KSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLmJvb2tpbmdTZXJ2aWNlLmdldEJvb2tpbmcodGhpcy5ib29raW5nSWQoKSwgdGhpcy5wcm9kdWN0KCksIGFjdGlvbi5hcGlGaWVsZCk7XG5cbiAgICBzb3VyY2UkLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoeyBkYXRhLCBlbGFwc2VkTXMgfSkgPT4ge1xuICAgICAgICB0aGlzLmFjdGlvbkRhdGEuc2V0KGRhdGEpO1xuICAgICAgICB0aGlzLmVsYXBzZWRNcy5zZXQoZWxhcHNlZE1zKTtcbiAgICAgICAgdGhpcy5hY3Rpb25TdGF0dXMuc2V0KCdzdWNjZXNzJyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5hY3Rpb25TdGF0dXMuc2V0KCdlcnJvcicpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuIiwiPHAtZGlhbG9nXG4gIFt2aXNpYmxlXT1cInZpc2libGUoKVwiXG4gICh2aXNpYmxlQ2hhbmdlKT1cIiRldmVudCA/IG51bGwgOiBjbG9zZWQuZW1pdCgpXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBbYmxvY2tTY3JvbGxdPVwidHJ1ZVwiXG4gIFtkcmFnZ2FibGVdPVwiZmFsc2VcIlxuICBbcmVzaXphYmxlXT1cImZhbHNlXCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc3MjBweCcsIG1heEhlaWdodDogJzkwdmgnIH1cIlxuICBzdHlsZUNsYXNzPVwic2JkLWFjdGlvbi1kaWFsb2ctd3JhcHBlclwiXG4gIGhlYWRlcj1cIkJyb3dzZSBBY3Rpb25zXCI+XG5cbiAgPGRpdiBjbGFzcz1cInNhZFwiPlxuXG4gICAgPCEtLSBuZy1zZWxlY3QgZHJvcGRvd24gLS0+XG4gICAgPGRpdiBjbGFzcz1cInNhZF9fcGlja2VyXCI+XG4gICAgICA8bmctc2VsZWN0XG4gICAgICAgIFtpdGVtc109XCJhY3Rpb25zKClcIlxuICAgICAgICBbbmdNb2RlbF09XCJzZWxlY3RlZEFjdGlvbigpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkFjdGlvblNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgW3NlYXJjaGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGVhcmFibGVdPVwiZmFsc2VcIlxuICAgICAgICBiaW5kTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFjdGlvbnMuLi5cIlxuICAgICAgICBjbGFzcz1cInNhZF9fc2VsZWN0XCI+XG5cbiAgICAgICAgPCEtLSBTZWxlY3RlZCB2YWx1ZSBkaXNwbGF5IC0tPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmctbGFiZWwtdG1wIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYWRfX29wdGlvblwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJ7eyBpdGVtLmljb24gfX0gc2FkX19vcHRpb24taWNvblwiPjwvaT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzYWRfX29wdGlvbi10ZXh0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2FkX19vcHRpb24tbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNhZF9fb3B0aW9uLXN1YlwiPnt7IGl0ZW0uc3VidGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8IS0tIERyb3Bkb3duIGxpc3QgaXRlbSAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nLW9wdGlvbi10bXAgbGV0LWl0ZW09XCJpdGVtXCIgbGV0LXNlYXJjaD1cInNlYXJjaFRlcm1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FkX19vcHRpb25cIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3sgaXRlbS5pY29uIH19IHNhZF9fb3B0aW9uLWljb25cIj48L2k+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2FkX19vcHRpb24tdGV4dFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNhZF9fb3B0aW9uLWxhYmVsXCI+e3sgaXRlbS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzYWRfX29wdGlvbi1zdWJcIj57eyBpdGVtLnN1YnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDwvbmctc2VsZWN0PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBSZXN1bHQgYXJlYSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwic2FkX19yZXN1bHRcIj5cbiAgICAgIDxhcHAtc2JkLXJlc3VsdC1wYW5lbFxuICAgICAgICBbYWN0aW9uTGFiZWxdPVwic2VsZWN0ZWRBY3Rpb24oKT8ubGFiZWwgPz8gJydcIlxuICAgICAgICBbZWxhcHNlZE1zXT1cImVsYXBzZWRNcygpXCJcbiAgICAgICAgW3N0YXR1c109XCJhY3Rpb25TdGF0dXMoKVwiXG4gICAgICAgIFtyZXN1bHRdPVwicmVzdWx0Q29udGVudCgpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIkNvcHkgRU5cIiBpY29uPVwicGkgcGktY29weVwiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNtXCJcbiAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25TdGF0dXMoKSAhPT0gJ3N1Y2Nlc3MnIHx8IGNvcHlpbmcoKVwiXG4gICAgICAoY2xpY2spPVwiY29weVJlc3VsdCgnZW4nKVwiPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIkNvcHkgQVJcIiBpY29uPVwicGkgcGktY29weVwiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNtXCJcbiAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25TdGF0dXMoKSAhPT0gJ3N1Y2Nlc3MnIHx8IGNvcHlpbmcoKVwiXG4gICAgICAoY2xpY2spPVwiY29weVJlc3VsdCgnYXInKVwiPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIkNvcHkgRU4gKyBBUlwiXG4gICAgICBbaWNvbl09XCJjb3B5aW5nKCkgPyAncGkgcGktc3BpbiBwaS1zcGlubmVyJyA6ICdwaSBwaS1jb3B5J1wiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNtXCJcbiAgICAgIFtkaXNhYmxlZF09XCJhY3Rpb25TdGF0dXMoKSAhPT0gJ3N1Y2Nlc3MnIHx8IGNvcHlpbmcoKVwiXG4gICAgICAoY2xpY2spPVwiY29weVJlc3VsdCgnYm90aCcpXCI+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwiQ2xvc2VcIiBpY29uPVwicGkgcGktdGltZXNcIiBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeSBwLWJ1dHRvbi1zbVwiIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCI+PC9idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvcC1kaWFsb2c+XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { Component, input, output } from '@angular/core';
2
+ import { SbdActionCardComponent } from '../action-card/action-card.component';
3
+ import * as i0 from "@angular/core";
4
+ export class SbdActionGridComponent {
5
+ constructor() {
6
+ this.actions = input.required();
7
+ this.activeKey = input(null);
8
+ this.loadingKey = input(null);
9
+ this.actionSelected = output();
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdActionGridComponent, isStandalone: true, selector: "app-sbd-action-grid", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: true, transformFunction: null }, activeKey: { classPropertyName: "activeKey", publicName: "activeKey", isSignal: true, isRequired: false, transformFunction: null }, loadingKey: { classPropertyName: "loadingKey", publicName: "loadingKey", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { actionSelected: "actionSelected" }, ngImport: i0, template: "<div class=\"sbd-action-grid\">\n <div class=\"sbd-action-grid__header\">\n <h3 class=\"sbd-action-grid__title\">Booking Details</h3>\n </div>\n <div class=\"sbd-action-grid__grid\">\n @for (action of actions(); track action.key) {\n <app-sbd-action-card [action]=\"action\" [active]=\"activeKey() === action.key\"\n [loading]=\"loadingKey() === action.key\" (selected)=\"actionSelected.emit($event)\" />\n }\n </div>\n</div>\n", styles: [".sbd-action-grid{background:#fff;border-radius:12px;border:1px solid #e2e8f0;padding:20px}.sbd-action-grid__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.sbd-action-grid__title{font-size:13.5px;font-weight:700;color:#1e2e4a;margin:0}.sbd-action-grid__count{font-size:11.5px;color:#94a3b8;background:#f8fafc;border:1px solid #e2e8f0;border-radius:20px;padding:2px 10px}.sbd-action-grid__grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}@media (max-width: 1200px){.sbd-action-grid__grid{grid-template-columns:repeat(4,1fr)}}@media (max-width: 900px){.sbd-action-grid__grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 640px){.sbd-action-grid__grid{grid-template-columns:repeat(2,1fr)}}\n"], dependencies: [{ kind: "component", type: SbdActionCardComponent, selector: "app-sbd-action-card", inputs: ["action", "active", "loading"], outputs: ["selected"] }] }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdActionGridComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'app-sbd-action-grid', standalone: true, imports: [SbdActionCardComponent], template: "<div class=\"sbd-action-grid\">\n <div class=\"sbd-action-grid__header\">\n <h3 class=\"sbd-action-grid__title\">Booking Details</h3>\n </div>\n <div class=\"sbd-action-grid__grid\">\n @for (action of actions(); track action.key) {\n <app-sbd-action-card [action]=\"action\" [active]=\"activeKey() === action.key\"\n [loading]=\"loadingKey() === action.key\" (selected)=\"actionSelected.emit($event)\" />\n }\n </div>\n</div>\n", styles: [".sbd-action-grid{background:#fff;border-radius:12px;border:1px solid #e2e8f0;padding:20px}.sbd-action-grid__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.sbd-action-grid__title{font-size:13.5px;font-weight:700;color:#1e2e4a;margin:0}.sbd-action-grid__count{font-size:11.5px;color:#94a3b8;background:#f8fafc;border:1px solid #e2e8f0;border-radius:20px;padding:2px 10px}.sbd-action-grid__grid{display:grid;grid-template-columns:repeat(5,1fr);gap:10px}@media (max-width: 1200px){.sbd-action-grid__grid{grid-template-columns:repeat(4,1fr)}}@media (max-width: 900px){.sbd-action-grid__grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 640px){.sbd-action-grid__grid{grid-template-columns:repeat(2,1fr)}}\n"] }]
17
+ }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtYm9va2luZy1kYXNoYm9hcmQvc3JjL2xpYi9jb21wb25lbnRzL2FjdGlvbi1ncmlkL2FjdGlvbi1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9hY3Rpb24tZ3JpZC9hY3Rpb24tZ3JpZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBVTlFLE1BQU0sT0FBTyxzQkFBc0I7SUFQbkM7UUFRRSxZQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBa0IsQ0FBQztRQUMzQyxjQUFTLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUN2QyxlQUFVLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUN4QyxtQkFBYyxHQUFHLE1BQU0sRUFBVSxDQUFDO0tBQ25DOytHQUxZLHNCQUFzQjttR0FBdEIsc0JBQXNCLGtoQkNYbkMsc2NBV0EsMnlCREpZLHNCQUFzQjs7NEZBSXJCLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNiZEFjdGlvbkNhcmRDb21wb25lbnQgfSBmcm9tICcuLi9hY3Rpb24tY2FyZC9hY3Rpb24tY2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FjdGlvbi50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zYmQtYWN0aW9uLWdyaWQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbU2JkQWN0aW9uQ2FyZENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hY3Rpb24tZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9hY3Rpb24tZ3JpZC5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFNiZEFjdGlvbkdyaWRDb21wb25lbnQge1xuICBhY3Rpb25zID0gaW5wdXQucmVxdWlyZWQ8QWN0aW9uQ29uZmlnW10+KCk7XG4gIGFjdGl2ZUtleSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBsb2FkaW5nS2V5ID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGFjdGlvblNlbGVjdGVkID0gb3V0cHV0PHN0cmluZz4oKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJzYmQtYWN0aW9uLWdyaWRcIj5cbiAgPGRpdiBjbGFzcz1cInNiZC1hY3Rpb24tZ3JpZF9faGVhZGVyXCI+XG4gICAgPGgzIGNsYXNzPVwic2JkLWFjdGlvbi1ncmlkX190aXRsZVwiPkJvb2tpbmcgRGV0YWlsczwvaDM+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwic2JkLWFjdGlvbi1ncmlkX19ncmlkXCI+XG4gICAgQGZvciAoYWN0aW9uIG9mIGFjdGlvbnMoKTsgdHJhY2sgYWN0aW9uLmtleSkge1xuICAgICAgPGFwcC1zYmQtYWN0aW9uLWNhcmQgW2FjdGlvbl09XCJhY3Rpb25cIiBbYWN0aXZlXT1cImFjdGl2ZUtleSgpID09PSBhY3Rpb24ua2V5XCJcbiAgICAgICAgW2xvYWRpbmddPVwibG9hZGluZ0tleSgpID09PSBhY3Rpb24ua2V5XCIgKHNlbGVjdGVkKT1cImFjdGlvblNlbGVjdGVkLmVtaXQoJGV2ZW50KVwiIC8+XG4gICAgfVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,62 @@
1
+ import { Component, input, output, inject, signal, effect } from '@angular/core';
2
+ import { DialogModule } from 'primeng/dialog';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { FormsModule } from '@angular/forms';
5
+ import { NgSelectModule } from '@ng-select/ng-select';
6
+ import { SbdBookingService } from '../../services/booking.service';
7
+ import { SbdToastService } from '../../services/toast.service';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "primeng/dialog";
10
+ import * as i2 from "primeng/api";
11
+ import * as i3 from "primeng/button";
12
+ import * as i4 from "@angular/forms";
13
+ export class SbdAddNoteDialogComponent {
14
+ constructor() {
15
+ this.bookingService = inject(SbdBookingService);
16
+ this.toast = inject(SbdToastService);
17
+ this.visible = input(false);
18
+ this.bookingId = input('');
19
+ this.product = input('flight');
20
+ this.closed = output();
21
+ this.message = signal('');
22
+ this.action = signal('GENERAL');
23
+ this.submitting = signal(false);
24
+ this.actionOptions = [
25
+ { label: 'General', value: 'GENERAL', icon: 'pi pi-comment' },
26
+ { label: 'Feedback', value: 'FEEDBACK', icon: 'pi pi-thumbs-up' },
27
+ { label: 'Remark', value: 'REMARK', icon: 'pi pi-exclamation-circle' },
28
+ ];
29
+ effect(() => {
30
+ if (!this.visible())
31
+ this.reset();
32
+ }, { allowSignalWrites: true });
33
+ }
34
+ submit() {
35
+ const msg = this.message().trim();
36
+ if (!msg)
37
+ return;
38
+ this.submitting.set(true);
39
+ this.bookingService.addNote(this.bookingId(), this.product(), msg, this.action()).subscribe({
40
+ next: () => {
41
+ this.toast.success('Note added successfully');
42
+ this.closed.emit();
43
+ },
44
+ error: () => {
45
+ this.toast.error('Failed to add note. Please try again.');
46
+ this.submitting.set(false);
47
+ },
48
+ });
49
+ }
50
+ reset() {
51
+ this.message.set('');
52
+ this.action.set('GENERAL');
53
+ this.submitting.set(false);
54
+ }
55
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdAddNoteDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SbdAddNoteDialogComponent, isStandalone: true, selector: "app-sbd-add-note-dialog", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, bookingId: { classPropertyName: "bookingId", publicName: "bookingId", isSignal: true, isRequired: false, transformFunction: null }, product: { classPropertyName: "product", publicName: "product", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, ngImport: i0, template: "<p-dialog\n [visible]=\"visible()\"\n (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\"\n [blockScroll]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '480px' }\"\n styleClass=\"sbd-add-note-dialog-wrapper\"\n header=\"Add Note\">\n\n <div class=\"and\">\n\n <!-- Note type -->\n <div class=\"and__field\">\n <label class=\"and__label\">Note type</label>\n <div class=\"and__type-group\">\n @for (opt of actionOptions; track opt.value) {\n <button\n type=\"button\"\n class=\"and__type-btn\"\n [class.and__type-btn--active]=\"action() === opt.value\"\n (click)=\"action.set(opt.value)\">\n <i class=\"{{ opt.icon }}\"></i>\n {{ opt.label }}\n </button>\n }\n </div>\n </div>\n\n <!-- Message -->\n <div class=\"and__field\">\n <label class=\"and__label\">\n Message\n <span class=\"and__char-count\">{{ message().length }} / 1000</span>\n </label>\n <textarea\n class=\"and__textarea\"\n [ngModel]=\"message()\"\n (ngModelChange)=\"message.set($event)\"\n placeholder=\"Write your note here...\"\n rows=\"6\"\n maxlength=\"1000\"\n [disabled]=\"submitting()\">\n </textarea>\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <button pButton label=\"Cancel\" icon=\"pi pi-times\"\n class=\"p-button-outlined p-button-secondary p-button-sm\"\n [disabled]=\"submitting()\"\n (click)=\"closed.emit()\">\n </button>\n <button pButton label=\"Submit Note\"\n [icon]=\"submitting() ? 'pi pi-spin pi-spinner' : 'pi pi-check'\"\n class=\"p-button-sm\"\n [disabled]=\"!message().trim() || submitting()\"\n (click)=\"submit()\">\n </button>\n </ng-template>\n\n</p-dialog>\n", styles: [".and{display:flex;flex-direction:column;gap:20px;padding:4px 0}.and__field{display:flex;flex-direction:column;gap:8px}.and__label{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.and__char-count{font-size:11px;font-weight:500;text-transform:none;letter-spacing:0;color:#94a3b8}.and__type-group{display:flex;gap:8px}.and__type-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:9px 12px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f8fafc;color:#64748b;font-size:12.5px;font-weight:600;cursor:pointer;transition:all .15s ease}.and__type-btn .pi{font-size:13px}.and__type-btn:hover{border-color:#94a3b8;background:#f1f5f9;color:#334155}.and__type-btn--active{border-color:#3b82f6;background:#eff6ff;color:#1d4ed8}.and__type-btn--active:hover{border-color:#2563eb;background:#dbeafe}.and__textarea{width:100%;resize:vertical;padding:10px 12px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13.5px;font-family:inherit;color:#1e2e4a;background:#fff;line-height:1.55;transition:border-color .15s ease;box-sizing:border-box}.and__textarea::placeholder{color:#94a3b8}.and__textarea:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.and__textarea:disabled{background:#f8fafc;color:#94a3b8;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: NgSelectModule }] }); }
57
+ }
58
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SbdAddNoteDialogComponent, decorators: [{
59
+ type: Component,
60
+ args: [{ selector: 'app-sbd-add-note-dialog', standalone: true, imports: [DialogModule, ButtonModule, FormsModule, NgSelectModule], template: "<p-dialog\n [visible]=\"visible()\"\n (visibleChange)=\"$event ? null : closed.emit()\"\n [modal]=\"true\"\n [blockScroll]=\"true\"\n [draggable]=\"false\"\n [resizable]=\"false\"\n [style]=\"{ width: '480px' }\"\n styleClass=\"sbd-add-note-dialog-wrapper\"\n header=\"Add Note\">\n\n <div class=\"and\">\n\n <!-- Note type -->\n <div class=\"and__field\">\n <label class=\"and__label\">Note type</label>\n <div class=\"and__type-group\">\n @for (opt of actionOptions; track opt.value) {\n <button\n type=\"button\"\n class=\"and__type-btn\"\n [class.and__type-btn--active]=\"action() === opt.value\"\n (click)=\"action.set(opt.value)\">\n <i class=\"{{ opt.icon }}\"></i>\n {{ opt.label }}\n </button>\n }\n </div>\n </div>\n\n <!-- Message -->\n <div class=\"and__field\">\n <label class=\"and__label\">\n Message\n <span class=\"and__char-count\">{{ message().length }} / 1000</span>\n </label>\n <textarea\n class=\"and__textarea\"\n [ngModel]=\"message()\"\n (ngModelChange)=\"message.set($event)\"\n placeholder=\"Write your note here...\"\n rows=\"6\"\n maxlength=\"1000\"\n [disabled]=\"submitting()\">\n </textarea>\n </div>\n\n </div>\n\n <ng-template pTemplate=\"footer\">\n <button pButton label=\"Cancel\" icon=\"pi pi-times\"\n class=\"p-button-outlined p-button-secondary p-button-sm\"\n [disabled]=\"submitting()\"\n (click)=\"closed.emit()\">\n </button>\n <button pButton label=\"Submit Note\"\n [icon]=\"submitting() ? 'pi pi-spin pi-spinner' : 'pi pi-check'\"\n class=\"p-button-sm\"\n [disabled]=\"!message().trim() || submitting()\"\n (click)=\"submit()\">\n </button>\n </ng-template>\n\n</p-dialog>\n", styles: [".and{display:flex;flex-direction:column;gap:20px;padding:4px 0}.and__field{display:flex;flex-direction:column;gap:8px}.and__label{display:flex;align-items:center;justify-content:space-between;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:#64748b}.and__char-count{font-size:11px;font-weight:500;text-transform:none;letter-spacing:0;color:#94a3b8}.and__type-group{display:flex;gap:8px}.and__type-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:9px 12px;border:1.5px solid #e2e8f0;border-radius:8px;background:#f8fafc;color:#64748b;font-size:12.5px;font-weight:600;cursor:pointer;transition:all .15s ease}.and__type-btn .pi{font-size:13px}.and__type-btn:hover{border-color:#94a3b8;background:#f1f5f9;color:#334155}.and__type-btn--active{border-color:#3b82f6;background:#eff6ff;color:#1d4ed8}.and__type-btn--active:hover{border-color:#2563eb;background:#dbeafe}.and__textarea{width:100%;resize:vertical;padding:10px 12px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13.5px;font-family:inherit;color:#1e2e4a;background:#fff;line-height:1.55;transition:border-color .15s ease;box-sizing:border-box}.and__textarea::placeholder{color:#94a3b8}.and__textarea:focus{outline:none;border-color:#3b82f6;box-shadow:0 0 0 3px #3b82f61a}.and__textarea:disabled{background:#f8fafc;color:#94a3b8;cursor:not-allowed}\n"] }]
61
+ }], ctorParameters: () => [] });
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLW5vdGUtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9hZGQtbm90ZS1kaWFsb2cvYWRkLW5vdGUtZGlhbG9nLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LWJvb2tpbmctZGFzaGJvYXJkL3NyYy9saWIvY29tcG9uZW50cy9hZGQtbm90ZS1kaWFsb2cvYWRkLW5vdGUtZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7QUFZL0QsTUFBTSxPQUFPLHlCQUF5QjtJQW1CcEM7UUFsQlEsbUJBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMzQyxVQUFLLEdBQVksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWpELFlBQU8sR0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsY0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixZQUFPLEdBQUssS0FBSyxDQUFjLFFBQVEsQ0FBQyxDQUFDO1FBQ3pDLFdBQU0sR0FBTSxNQUFNLEVBQVEsQ0FBQztRQUUzQixZQUFPLEdBQU0sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3hCLFdBQU0sR0FBTyxNQUFNLENBQWEsU0FBUyxDQUFDLENBQUM7UUFDM0MsZUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQixrQkFBYSxHQUF5RDtZQUM3RSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQy9ELEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtZQUNqRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUksS0FBSyxFQUFFLFFBQVEsRUFBSSxJQUFJLEVBQUUsMEJBQTBCLEVBQUU7U0FDM0UsQ0FBQztRQUdBLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEMsQ0FBQyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTTtRQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU87UUFFakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFGLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDOytHQTlDVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw4ZkNuQnRDLDQyREFnRUEsNDVDRGpEWSxZQUFZLGkwQkFBRSxZQUFZLHNLQUFFLFdBQVcsaXhCQUFFLGNBQWM7OzRGQUl0RCx5QkFBeUI7a0JBUHJDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCwgaW5qZWN0LCBzaWduYWwsIGVmZmVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGlhbG9nTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kaWFsb2cnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ1NlbGVjdE1vZHVsZSB9IGZyb20gJ0BuZy1zZWxlY3Qvbmctc2VsZWN0JztcblxuaW1wb3J0IHsgU2JkQm9va2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ib29raW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2JkVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBQcm9kdWN0VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9ib29raW5nLnR5cGVzJztcblxudHlwZSBOb3RlQWN0aW9uID0gJ0dFTkVSQUwnIHwgJ0ZFRURCQUNLJyB8ICdSRU1BUksnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtc2JkLWFkZC1ub3RlLWRpYWxvZycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEaWFsb2dNb2R1bGUsIEJ1dHRvbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE5nU2VsZWN0TW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FkZC1ub3RlLWRpYWxvZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9hZGQtbm90ZS1kaWFsb2cuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBTYmRBZGROb3RlRGlhbG9nQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBib29raW5nU2VydmljZSA9IGluamVjdChTYmRCb29raW5nU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgICAgICAgICAgPSBpbmplY3QoU2JkVG9hc3RTZXJ2aWNlKTtcblxuICB2aXNpYmxlICAgPSBpbnB1dChmYWxzZSk7XG4gIGJvb2tpbmdJZCA9IGlucHV0KCcnKTtcbiAgcHJvZHVjdCAgID0gaW5wdXQ8UHJvZHVjdFR5cGU+KCdmbGlnaHQnKTtcbiAgY2xvc2VkICAgID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgbWVzc2FnZSAgICA9IHNpZ25hbCgnJyk7XG4gIGFjdGlvbiAgICAgPSBzaWduYWw8Tm90ZUFjdGlvbj4oJ0dFTkVSQUwnKTtcbiAgc3VibWl0dGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgYWN0aW9uT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogTm90ZUFjdGlvbjsgaWNvbjogc3RyaW5nIH1bXSA9IFtcbiAgICB7IGxhYmVsOiAnR2VuZXJhbCcsICB2YWx1ZTogJ0dFTkVSQUwnLCAgaWNvbjogJ3BpIHBpLWNvbW1lbnQnIH0sXG4gICAgeyBsYWJlbDogJ0ZlZWRiYWNrJywgdmFsdWU6ICdGRUVEQkFDSycsIGljb246ICdwaSBwaS10aHVtYnMtdXAnIH0sXG4gICAgeyBsYWJlbDogJ1JlbWFyaycsICAgdmFsdWU6ICdSRU1BUksnLCAgIGljb246ICdwaSBwaS1leGNsYW1hdGlvbi1jaXJjbGUnIH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy52aXNpYmxlKCkpIHRoaXMucmVzZXQoKTtcbiAgICB9LCB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH0pO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGNvbnN0IG1zZyA9IHRoaXMubWVzc2FnZSgpLnRyaW0oKTtcbiAgICBpZiAoIW1zZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zdWJtaXR0aW5nLnNldCh0cnVlKTtcbiAgICB0aGlzLmJvb2tpbmdTZXJ2aWNlLmFkZE5vdGUodGhpcy5ib29raW5nSWQoKSwgdGhpcy5wcm9kdWN0KCksIG1zZywgdGhpcy5hY3Rpb24oKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5zdWNjZXNzKCdOb3RlIGFkZGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5lcnJvcignRmFpbGVkIHRvIGFkZCBub3RlLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgICAgICB0aGlzLnN1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZS5zZXQoJycpO1xuICAgIHRoaXMuYWN0aW9uLnNldCgnR0VORVJBTCcpO1xuICAgIHRoaXMuc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICB9XG59XG4iLCI8cC1kaWFsb2dcbiAgW3Zpc2libGVdPVwidmlzaWJsZSgpXCJcbiAgKHZpc2libGVDaGFuZ2UpPVwiJGV2ZW50ID8gbnVsbCA6IGNsb3NlZC5lbWl0KClcIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIFtibG9ja1Njcm9sbF09XCJ0cnVlXCJcbiAgW2RyYWdnYWJsZV09XCJmYWxzZVwiXG4gIFtyZXNpemFibGVdPVwiZmFsc2VcIlxuICBbc3R5bGVdPVwieyB3aWR0aDogJzQ4MHB4JyB9XCJcbiAgc3R5bGVDbGFzcz1cInNiZC1hZGQtbm90ZS1kaWFsb2ctd3JhcHBlclwiXG4gIGhlYWRlcj1cIkFkZCBOb3RlXCI+XG5cbiAgPGRpdiBjbGFzcz1cImFuZFwiPlxuXG4gICAgPCEtLSBOb3RlIHR5cGUgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFuZF9fZmllbGRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImFuZF9fbGFiZWxcIj5Ob3RlIHR5cGU8L2xhYmVsPlxuICAgICAgPGRpdiBjbGFzcz1cImFuZF9fdHlwZS1ncm91cFwiPlxuICAgICAgICBAZm9yIChvcHQgb2YgYWN0aW9uT3B0aW9uczsgdHJhY2sgb3B0LnZhbHVlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImFuZF9fdHlwZS1idG5cIlxuICAgICAgICAgICAgW2NsYXNzLmFuZF9fdHlwZS1idG4tLWFjdGl2ZV09XCJhY3Rpb24oKSA9PT0gb3B0LnZhbHVlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhY3Rpb24uc2V0KG9wdC52YWx1ZSlcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwie3sgb3B0Lmljb24gfX1cIj48L2k+XG4gICAgICAgICAgICB7eyBvcHQubGFiZWwgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE1lc3NhZ2UgLS0+XG4gICAgPGRpdiBjbGFzcz1cImFuZF9fZmllbGRcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImFuZF9fbGFiZWxcIj5cbiAgICAgICAgTWVzc2FnZVxuICAgICAgICA8c3BhbiBjbGFzcz1cImFuZF9fY2hhci1jb3VudFwiPnt7IG1lc3NhZ2UoKS5sZW5ndGggfX0gLyAxMDAwPC9zcGFuPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYVxuICAgICAgICBjbGFzcz1cImFuZF9fdGV4dGFyZWFcIlxuICAgICAgICBbbmdNb2RlbF09XCJtZXNzYWdlKClcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJtZXNzYWdlLnNldCgkZXZlbnQpXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJXcml0ZSB5b3VyIG5vdGUgaGVyZS4uLlwiXG4gICAgICAgIHJvd3M9XCI2XCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiMTAwMFwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzdWJtaXR0aW5nKClcIj5cbiAgICAgIDwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxidXR0b24gcEJ1dHRvbiBsYWJlbD1cIkNhbmNlbFwiIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICBjbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkIHAtYnV0dG9uLXNlY29uZGFyeSBwLWJ1dHRvbi1zbVwiXG4gICAgICBbZGlzYWJsZWRdPVwic3VibWl0dGluZygpXCJcbiAgICAgIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCI+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiBwQnV0dG9uIGxhYmVsPVwiU3VibWl0IE5vdGVcIlxuICAgICAgW2ljb25dPVwic3VibWl0dGluZygpID8gJ3BpIHBpLXNwaW4gcGktc3Bpbm5lcicgOiAncGkgcGktY2hlY2snXCJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tc21cIlxuICAgICAgW2Rpc2FibGVkXT1cIiFtZXNzYWdlKCkudHJpbSgpIHx8IHN1Ym1pdHRpbmcoKVwiXG4gICAgICAoY2xpY2spPVwic3VibWl0KClcIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPC9wLWRpYWxvZz5cbiJdfQ==