eiu-app-kit 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,88 +1,105 @@
1
- # eiu-app-kit
2
-
3
- Thư viện Angular dùng chung cho các SPA EIU: **launcher ứng dụng trên header**, **tin Redmine / feature news**, popup “Có gì mới”.
4
-
5
- ## Cài qua npm
6
-
7
- ```bash
8
- npm install eiu-app-kit
9
- ```
10
-
11
- Ứng dụng Angular 15+, cùng major với peer dependencies của package.
12
-
13
- ## Cấu hình `AppModule` (hoặc `bootstrapApplication` + `importProvidersFrom`)
14
-
15
- ```ts
16
- import { HttpClientModule } from '@angular/common/http';
17
- import {
18
- EIU_APP_API_BASE_URL,
19
- EIU_APP_LAUNCHER_MENU_LOADER
20
- } from 'eiu-app-kit';
21
- import { environment } from './environments/environment';
22
- // import { ProjectService } from '...';
23
-
24
- @NgModule({
25
- imports: [
26
- HttpClientModule,
27
- // ...
28
- ],
29
- providers: [
30
- { provide: EIU_APP_API_BASE_URL, useValue: environment.API_EIU_APP },
31
- {
32
- provide: EIU_APP_LAUNCHER_MENU_LOADER,
33
- useFactory: (project: ProjectService) => ({
34
- loadItems: () => project.getAllProject()
35
- }),
36
- deps: [ProjectService]
37
- }
38
- ]
39
- })
40
- export class AppModule {}
41
- ```
42
-
43
- Kiểu phần tử từ `loadItems()` phải khớp `EiuAppLauncherMenuItem` (`name_VI`, `imageUrl`, `link`, `sortOrder`).
44
-
45
- ## Module layout (ví dụ `ThemeModule`)
46
-
47
- ```ts
48
- import { EiuAppFeatureNewsModule, EiuAppLauncherModule } from 'eiu-app-kit';
49
-
50
- @NgModule({
51
- imports: [CommonModule, EiuAppFeatureNewsModule, EiuAppLauncherModule]
52
- })
53
- export class ThemeModule {}
54
- ```
55
-
56
- ## Template header / layout
57
-
58
- ```html
59
- <app-eiu-app-launcher (sidebarToggle)="onToggleMenuSidebar()"></app-eiu-app-launcher>
60
- <app-feature-news-dialog></app-feature-news-dialog>
61
- ```
62
-
63
- `sidebarToggle`: host tự xử lý (NgRx, v.v.).
64
-
65
- ## Feature news
66
-
67
- Inject `FeatureNewsService`:
68
-
69
- - `checkAndShowFeatureNews(userId, projectIdentifier)` — khi có tin mới.
70
- - `showLatestFeatureNewsManually(userId, projectIdentifier)` — mở thủ công.
71
-
72
- Hằng số mặc định project Redmine: `FEATURE_NEWS_REDMINE_PROJECT_IDENTIFIER`.
73
-
74
- Khi logout `localStorage.clear()`, cân nhắc giữ key prefix `FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX`.
75
-
76
- ## Monorepo (path mapping, không publish)
77
-
78
- Trong `tsconfig` của app:
79
-
80
- ```json
81
- "paths": {
82
- "eiu-app-kit": ["../projects/eiu-app-kit/src/public-api.ts"]
83
- }
84
- ```
85
-
86
- ## Public API
87
-
88
- Xem `src/public-api.ts`: modules, services, models, `EIU_APP_API_BASE_URL`, `EIU_APP_LAUNCHER_MENU_LOADER`.
1
+ # eiu-app-kit
2
+
3
+ Thư viện Angular dùng chung cho các SPA EIU: **launcher ứng dụng trên header**, **tin Redmine / feature news**, popup “Có gì mới”.
4
+
5
+ ## Cài qua npm
6
+
7
+ ```bash
8
+ npm install eiu-app-kit
9
+ ```
10
+
11
+ Ứng dụng Angular 15+, cùng major với peer dependencies của package.
12
+
13
+ ## Cấu hình `AppModule` (hoặc `bootstrapApplication` + `importProvidersFrom`)
14
+
15
+ ```ts
16
+ import { HttpClientModule } from '@angular/common/http';
17
+ import {
18
+ EIU_APP_API_BASE_URL,
19
+ EIU_APP_LAUNCHER_MENU_LOADER
20
+ } from 'eiu-app-kit';
21
+ import { environment } from './environments/environment';
22
+ // import { ProjectService } from '...';
23
+
24
+ @NgModule({
25
+ imports: [
26
+ HttpClientModule,
27
+ // ...
28
+ ],
29
+ providers: [
30
+ { provide: EIU_APP_API_BASE_URL, useValue: environment.API_EIU_APP },
31
+ {
32
+ provide: EIU_APP_LAUNCHER_MENU_LOADER,
33
+ useFactory: (project: ProjectService) => ({
34
+ loadItems: () => project.getAllProject()
35
+ }),
36
+ deps: [ProjectService]
37
+ }
38
+ ]
39
+ })
40
+ export class AppModule {}
41
+ ```
42
+
43
+ Kiểu phần tử từ `loadItems()` phải khớp `EiuAppLauncherMenuItem` (`name_VI`, `imageUrl`, `link`, `sortOrder`).
44
+
45
+ ## Module layout (ví dụ `ThemeModule`)
46
+
47
+ ```ts
48
+ import {
49
+ EiuAppFeatureNewsModule,
50
+ EiuAppLauncherModule,
51
+ EiuAppUserMenuModule
52
+ } from 'eiu-app-kit';
53
+
54
+ @NgModule({
55
+ imports: [CommonModule, EiuAppFeatureNewsModule, EiuAppLauncherModule, EiuAppUserMenuModule]
56
+ })
57
+ export class ThemeModule {}
58
+ ```
59
+
60
+ ## Template header / layout
61
+
62
+ ```html
63
+ <app-eiu-app-launcher (sidebarToggle)="onToggleMenuSidebar()"></app-eiu-app-launcher>
64
+ <app-eiu-user-menu
65
+ [profile]="{ fullName: user.fullName, email: user.email, picture: user.picture }"
66
+ (changePassword)="changePassword()"
67
+ (logout)="logout()"
68
+ ></app-eiu-user-menu>
69
+ <app-feature-news-dialog></app-feature-news-dialog>
70
+ ```
71
+
72
+ `sidebarToggle`: host tự xử (NgRx, v.v.).
73
+
74
+ ## User menu component
75
+
76
+ `app-eiu-user-menu` không phụ thuộc Keycloak, TokenService hay translate pipe.
77
+
78
+ - Host truyền dữ liệu qua `profile: EiuUserMenuProfile`.
79
+ - Host tự xử lý logic qua events `(changePassword)` và `(logout)`.
80
+ - Có thể đổi label bằng `changePasswordLabel`, `logoutLabel`.
81
+
82
+ ## Feature news
83
+
84
+ Inject `FeatureNewsService`:
85
+
86
+ - `checkAndShowFeatureNews(userId, projectIdentifier)` — khi có tin mới.
87
+ - `showLatestFeatureNewsManually(userId, projectIdentifier)` — mở thủ công.
88
+
89
+ Hằng số mặc định project Redmine: `FEATURE_NEWS_REDMINE_PROJECT_IDENTIFIER`.
90
+
91
+ Khi logout có `localStorage.clear()`, cân nhắc giữ key prefix `FEATURE_NEWS_SEEN_STORAGE_KEY_PREFIX`.
92
+
93
+ ## Monorepo (path mapping, không publish)
94
+
95
+ Trong `tsconfig` của app:
96
+
97
+ ```json
98
+ "paths": {
99
+ "eiu-app-kit": ["../projects/eiu-app-kit/src/public-api.ts"]
100
+ }
101
+ ```
102
+
103
+ ## Public API
104
+
105
+ Xem `src/public-api.ts`: modules, services, models, `EIU_APP_API_BASE_URL`, `EIU_APP_LAUNCHER_MENU_LOADER`.
@@ -7,7 +7,6 @@ export class EiuAppFooterComponent {
7
7
  this.companyName = 'IT - EIU';
8
8
  this.companyUrl = 'https://sites.google.com/eiu.edu.vn/oit/';
9
9
  this.allRightsText = 'All rights reserved.';
10
- /** Nhãn cạnh số phiên bản (ví dụ "Version"). */
11
10
  this.versionLabel = 'Version';
12
11
  this.newFeatureClick = new EventEmitter();
13
12
  }
@@ -17,10 +16,10 @@ export class EiuAppFooterComponent {
17
16
  }
18
17
  }
19
18
  EiuAppFooterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- EiuAppFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppFooterComponent, selector: "app-eiu-app-footer", inputs: { appVersion: "appVersion", copyrightYear: "copyrightYear", companyName: "companyName", companyUrl: "companyUrl", allRightsText: "allRightsText", versionLabel: "versionLabel" }, outputs: { newFeatureClick: "newFeatureClick" }, ngImport: i0, template: "<div class=\"main-footer\">\r\n <div class=\"float-right d-none d-sm-block\">\r\n <span class=\"version-radar\" aria-hidden=\"true\"></span><b>\r\n <a href=\"#\" (click)=\"onNewFeatureDialogClick($event)\" class=\"color-eiu-primary\" style=\"margin: 0\">\r\n {{ versionLabel }} </a>\r\n </b>\r\n {{ appVersion }}\r\n </div>\r\n <strong>\r\n <span>Copyright &copy; {{ copyrightYear }}</span>\r\n <a [href]=\"companyUrl\" [title]=\"companyName\" target=\"_blank\" style=\"margin: 0\" class=\"color-eiu-primary\">\r\n {{ companyName }}\r\n </a>\r\n <span>.</span>\r\n </strong>\r\n <span> {{ allRightsText }}</span>\r\n</div>", styles: [":host{display:block}.color-eiu-primary{color:#174168!important}.version-radar{display:inline-block;width:11px;height:11px;border-radius:50%;background:var(--color-eiu-primary);margin-right:7px;position:relative;top:-1px;box-shadow:0 0 6px var(--color-eiu-primary),0 0 16px var(--color-eiu-primary)}.version-radar:before,.version-radar:after{content:\"\";position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%) scale(.22);border-radius:50%;border:2px solid var(--color-eiu-primary);opacity:.75;box-shadow:0 0 12px var(--color-eiu-primary);animation:radar-ring 1.25s ease-out infinite;pointer-events:none}.version-radar:after{animation-delay:.8s;opacity:.45;box-shadow:0 0 10px var(--color-eiu-primary)}@keyframes radar-ring{0%{transform:translate(-50%,-50%) scale(.22);opacity:.85}70%{opacity:.35}to{transform:translate(-50%,-50%) scale(1.55);opacity:0}}\n"] });
19
+ EiuAppFooterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppFooterComponent, selector: "app-eiu-app-footer", inputs: { appVersion: "appVersion", copyrightYear: "copyrightYear", companyName: "companyName", companyUrl: "companyUrl", allRightsText: "allRightsText", versionLabel: "versionLabel" }, outputs: { newFeatureClick: "newFeatureClick" }, ngImport: i0, template: "<div class=\"main-footer\">\r\n <div class=\"footer-bar\">\r\n <div class=\"footer-bar__copy\">\r\n <span>Copyright \u00A9 {{ copyrightYear }}</span>\r\n <a\r\n class=\"footer-bar__link\"\r\n href=\"https://sites.google.com/eiu.edu.vn/oit/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {{ companyName }}\r\n </a>\r\n <span>. {{ allRightsText }}</span>\r\n </div>\r\n \r\n <div class=\"footer-bar__version\">\r\n <button\r\n type=\"button\"\r\n class=\"footer-version-chip-wrap\"\r\n (click)=\"onNewFeatureDialogClick($event)\"\r\n [attr.aria-label]=\"\r\n 'Application version ' + appVersion + '. Nh\u1EA5n \u0111\u1EC3 sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard'\r\n \"\r\n title=\"Sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard\"\r\n >\r\n <div class=\"footer-version-chip\">\r\n <span class=\"footer-radar\" aria-hidden=\"true\">\r\n <span class=\"footer-radar__sweep\"></span>\r\n <svg class=\"footer-radar__dot\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">\r\n <circle class=\"footer-radar__dot-shape\" cx=\"12\" cy=\"12\" r=\"3.25\" />\r\n </svg>\r\n </span>\r\n <div class=\"footer-version\">\r\n <span class=\"footer-version__label\">{{ versionLabel }}</span>\r\n <span class=\"footer-version__sep\" aria-hidden=\"true\">\u00B7</span>\r\n <span class=\"footer-version__value\" translate=\"no\">{{ appVersion }}</span>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block}:host.main-footer{display:block;padding:.65rem 1rem;background:#fff;border-top:1px solid #e5e7eb;color:#6b7280;font-size:.8125rem;line-height:1.45}.color-eiu-primary{color:#174168!important}.footer-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem}.footer-bar__copy{color:#6b7280}.footer-bar__link{color:var(--color-eiu-primary);font-weight:600;text-decoration:none;margin:0 .15em;&:hover{text-decoration:underline}&:focus-visible{outline:2px solid #2563eb;outline-offset:2px;border-radius:2px}}.footer-bar__version{margin-left:auto;display:inline-flex;align-items:center}.footer-version-chip-wrap{--footer-chip-duration: 2.8s;position:relative;display:inline-flex;padding:3px;border:none;border-radius:11px;overflow:hidden;font:inherit;color:inherit;line-height:inherit;cursor:pointer;background:transparent;box-shadow:0 2px 14px #0ea5e92e;transition:transform .15s ease,box-shadow .15s ease;&:hover{transform:translateY(-1px);box-shadow:0 3px 16px #0ea5e942}&:active{transform:translateY(0)}&:focus{outline:none}&:focus-visible{outline:2px solid var(--color-eiu-primary);outline-offset:3px}}.footer-version-chip-wrap:before{content:\"\";position:absolute;left:50%;top:50%;width:220%;height:220%;margin-left:-110%;margin-top:-110%;transform-origin:center center;backface-visibility:hidden;will-change:transform;background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 228deg,color-mix(in srgb,var(--color-eiu-primary) 32%,transparent) 242deg,color-mix(in srgb,var(--color-eiu-primary) 62%,#ffffff) 256deg,var(--color-eiu-primary) 274deg,color-mix(in srgb,var(--color-eiu-primary) 92%,#334155) 292deg,color-mix(in srgb,var(--color-eiu-primary) 48%,#ffffff) 306deg,color-mix(in srgb,var(--color-eiu-primary) 26%,transparent) 322deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 342deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 360deg);animation:footer-chip-beam-spin var(--footer-chip-duration) linear infinite}.footer-version-chip{position:relative;z-index:1;display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .45rem .2rem .3rem;border-radius:8px;border:none;background:#fafafa}@keyframes footer-chip-beam-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.footer-radar{position:relative;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:50%;overflow:hidden;background:transparent}.footer-radar__sweep{position:absolute;inset:-42%;border-radius:50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 218deg,rgba(254,202,202,.55) 232deg,rgba(248,113,113,.9) 255deg,rgba(239,68,68,.95) 278deg,rgba(220,38,38,.98) 302deg,rgba(185,28,28,.75) 330deg,rgba(254,226,226,.65) 360deg);animation:footer-radar-spin 2.8s linear infinite}.footer-radar__dot{position:absolute;z-index:1;left:50%;top:50%;width:46%;height:46%;transform:translate(-50%,-50%);pointer-events:none;display:block;color:#ef4444;filter:drop-shadow(0 0 2px rgba(220,38,38,.85)) drop-shadow(0 0 3px rgba(248,113,113,.9))}.footer-radar__dot-shape{fill:currentColor}.footer-version{display:inline-flex;align-items:baseline;gap:.28rem;min-width:0;line-height:1.2}.footer-version__label{font-size:.625rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#9ca3af;white-space:nowrap}.footer-version__sep{color:#d1d5db;font-weight:600;-webkit-user-select:none;user-select:none}.footer-version__value{font-family:ui-monospace,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:600;color:#334155;letter-spacing:-.02em;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes footer-radar-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.footer-version-chip-wrap{box-shadow:0 1px 12px #3b82f629}.footer-version-chip-wrap:before{animation:none;will-change:auto;transform:rotate(52deg);background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 235deg,var(--color-eiu-primary) 258deg,color-mix(in srgb,var(--color-eiu-primary) 58%,#ffffff) 278deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 315deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 360deg)}.footer-radar__sweep{animation:none;background:conic-gradient(from 180deg,rgba(254,202,202,.55) 0deg,rgba(248,113,113,.75) 55deg,rgba(239,68,68,.85) 105deg,rgba(220,38,38,.8) 155deg,rgba(185,28,28,.55) 200deg,transparent 220deg,transparent 360deg)}}@media (max-width: 575.98px){.footer-bar__version{margin-left:0}}\n"] });
21
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppFooterComponent, decorators: [{
22
21
  type: Component,
23
- args: [{ selector: 'app-eiu-app-footer', template: "<div class=\"main-footer\">\r\n <div class=\"float-right d-none d-sm-block\">\r\n <span class=\"version-radar\" aria-hidden=\"true\"></span><b>\r\n <a href=\"#\" (click)=\"onNewFeatureDialogClick($event)\" class=\"color-eiu-primary\" style=\"margin: 0\">\r\n {{ versionLabel }} </a>\r\n </b>\r\n {{ appVersion }}\r\n </div>\r\n <strong>\r\n <span>Copyright &copy; {{ copyrightYear }}</span>\r\n <a [href]=\"companyUrl\" [title]=\"companyName\" target=\"_blank\" style=\"margin: 0\" class=\"color-eiu-primary\">\r\n {{ companyName }}\r\n </a>\r\n <span>.</span>\r\n </strong>\r\n <span> {{ allRightsText }}</span>\r\n</div>", styles: [":host{display:block}.color-eiu-primary{color:#174168!important}.version-radar{display:inline-block;width:11px;height:11px;border-radius:50%;background:var(--color-eiu-primary);margin-right:7px;position:relative;top:-1px;box-shadow:0 0 6px var(--color-eiu-primary),0 0 16px var(--color-eiu-primary)}.version-radar:before,.version-radar:after{content:\"\";position:absolute;left:50%;top:50%;width:24px;height:24px;transform:translate(-50%,-50%) scale(.22);border-radius:50%;border:2px solid var(--color-eiu-primary);opacity:.75;box-shadow:0 0 12px var(--color-eiu-primary);animation:radar-ring 1.25s ease-out infinite;pointer-events:none}.version-radar:after{animation-delay:.8s;opacity:.45;box-shadow:0 0 10px var(--color-eiu-primary)}@keyframes radar-ring{0%{transform:translate(-50%,-50%) scale(.22);opacity:.85}70%{opacity:.35}to{transform:translate(-50%,-50%) scale(1.55);opacity:0}}\n"] }]
22
+ args: [{ selector: 'app-eiu-app-footer', template: "<div class=\"main-footer\">\r\n <div class=\"footer-bar\">\r\n <div class=\"footer-bar__copy\">\r\n <span>Copyright \u00A9 {{ copyrightYear }}</span>\r\n <a\r\n class=\"footer-bar__link\"\r\n href=\"https://sites.google.com/eiu.edu.vn/oit/\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n {{ companyName }}\r\n </a>\r\n <span>. {{ allRightsText }}</span>\r\n </div>\r\n \r\n <div class=\"footer-bar__version\">\r\n <button\r\n type=\"button\"\r\n class=\"footer-version-chip-wrap\"\r\n (click)=\"onNewFeatureDialogClick($event)\"\r\n [attr.aria-label]=\"\r\n 'Application version ' + appVersion + '. Nh\u1EA5n \u0111\u1EC3 sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard'\r\n \"\r\n title=\"Sao ch\u00E9p phi\u00EAn b\u1EA3n v\u00E0o clipboard\"\r\n >\r\n <div class=\"footer-version-chip\">\r\n <span class=\"footer-radar\" aria-hidden=\"true\">\r\n <span class=\"footer-radar__sweep\"></span>\r\n <svg class=\"footer-radar__dot\" viewBox=\"0 0 24 24\" focusable=\"false\" aria-hidden=\"true\">\r\n <circle class=\"footer-radar__dot-shape\" cx=\"12\" cy=\"12\" r=\"3.25\" />\r\n </svg>\r\n </span>\r\n <div class=\"footer-version\">\r\n <span class=\"footer-version__label\">{{ versionLabel }}</span>\r\n <span class=\"footer-version__sep\" aria-hidden=\"true\">\u00B7</span>\r\n <span class=\"footer-version__value\" translate=\"no\">{{ appVersion }}</span>\r\n </div>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block}:host.main-footer{display:block;padding:.65rem 1rem;background:#fff;border-top:1px solid #e5e7eb;color:#6b7280;font-size:.8125rem;line-height:1.45}.color-eiu-primary{color:#174168!important}.footer-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.5rem 1rem}.footer-bar__copy{color:#6b7280}.footer-bar__link{color:var(--color-eiu-primary);font-weight:600;text-decoration:none;margin:0 .15em;&:hover{text-decoration:underline}&:focus-visible{outline:2px solid #2563eb;outline-offset:2px;border-radius:2px}}.footer-bar__version{margin-left:auto;display:inline-flex;align-items:center}.footer-version-chip-wrap{--footer-chip-duration: 2.8s;position:relative;display:inline-flex;padding:3px;border:none;border-radius:11px;overflow:hidden;font:inherit;color:inherit;line-height:inherit;cursor:pointer;background:transparent;box-shadow:0 2px 14px #0ea5e92e;transition:transform .15s ease,box-shadow .15s ease;&:hover{transform:translateY(-1px);box-shadow:0 3px 16px #0ea5e942}&:active{transform:translateY(0)}&:focus{outline:none}&:focus-visible{outline:2px solid var(--color-eiu-primary);outline-offset:3px}}.footer-version-chip-wrap:before{content:\"\";position:absolute;left:50%;top:50%;width:220%;height:220%;margin-left:-110%;margin-top:-110%;transform-origin:center center;backface-visibility:hidden;will-change:transform;background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 228deg,color-mix(in srgb,var(--color-eiu-primary) 32%,transparent) 242deg,color-mix(in srgb,var(--color-eiu-primary) 62%,#ffffff) 256deg,var(--color-eiu-primary) 274deg,color-mix(in srgb,var(--color-eiu-primary) 92%,#334155) 292deg,color-mix(in srgb,var(--color-eiu-primary) 48%,#ffffff) 306deg,color-mix(in srgb,var(--color-eiu-primary) 26%,transparent) 322deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 342deg,color-mix(in srgb,var(--color-eiu-primary) 14%,transparent) 360deg);animation:footer-chip-beam-spin var(--footer-chip-duration) linear infinite}.footer-version-chip{position:relative;z-index:1;display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .45rem .2rem .3rem;border-radius:8px;border:none;background:#fafafa}@keyframes footer-chip-beam-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.footer-radar{position:relative;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:50%;overflow:hidden;background:transparent}.footer-radar__sweep{position:absolute;inset:-42%;border-radius:50%;background:conic-gradient(from 0deg,transparent 0deg,transparent 218deg,rgba(254,202,202,.55) 232deg,rgba(248,113,113,.9) 255deg,rgba(239,68,68,.95) 278deg,rgba(220,38,38,.98) 302deg,rgba(185,28,28,.75) 330deg,rgba(254,226,226,.65) 360deg);animation:footer-radar-spin 2.8s linear infinite}.footer-radar__dot{position:absolute;z-index:1;left:50%;top:50%;width:46%;height:46%;transform:translate(-50%,-50%);pointer-events:none;display:block;color:#ef4444;filter:drop-shadow(0 0 2px rgba(220,38,38,.85)) drop-shadow(0 0 3px rgba(248,113,113,.9))}.footer-radar__dot-shape{fill:currentColor}.footer-version{display:inline-flex;align-items:baseline;gap:.28rem;min-width:0;line-height:1.2}.footer-version__label{font-size:.625rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#9ca3af;white-space:nowrap}.footer-version__sep{color:#d1d5db;font-weight:600;-webkit-user-select:none;user-select:none}.footer-version__value{font-family:ui-monospace,Menlo,Monaco,Consolas,monospace;font-size:.75rem;font-weight:600;color:#334155;letter-spacing:-.02em;max-width:12rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@keyframes footer-radar-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.footer-version-chip-wrap{box-shadow:0 1px 12px #3b82f629}.footer-version-chip-wrap:before{animation:none;will-change:auto;transform:rotate(52deg);background:conic-gradient(from 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 0deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 235deg,var(--color-eiu-primary) 258deg,color-mix(in srgb,var(--color-eiu-primary) 58%,#ffffff) 278deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 315deg,color-mix(in srgb,var(--color-eiu-primary) 18%,transparent) 360deg)}.footer-radar__sweep{animation:none;background:conic-gradient(from 180deg,rgba(254,202,202,.55) 0deg,rgba(248,113,113,.75) 55deg,rgba(239,68,68,.85) 105deg,rgba(220,38,38,.8) 155deg,rgba(185,28,28,.55) 200deg,transparent 220deg,transparent 360deg)}}@media (max-width: 575.98px){.footer-bar__version{margin-left:0}}\n"] }]
24
23
  }], propDecorators: { appVersion: [{
25
24
  type: Input
26
25
  }], copyrightYear: [{
@@ -36,4 +35,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
36
35
  }], newFeatureClick: [{
37
36
  type: Output
38
37
  }] } });
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPdkUsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1ZLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFFdkIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFFekIsZUFBVSxHQUFHLDBDQUEwQyxDQUFDO1FBRXhELGtCQUFhLEdBQUcsc0JBQXNCLENBQUM7UUFFaEQsZ0RBQWdEO1FBQ3ZDLGlCQUFZLEdBQUcsU0FBUyxDQUFDO1FBSWYsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0tBTWhFO0lBSkUsdUJBQXVCLENBQUMsS0FBWTtRQUNqQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDOzttSEFyQlMscUJBQXFCO3VHQUFyQixxQkFBcUIscVNDUGxDLHdyQkFnQk07NEZEVE8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNHLG9CQUFvQjs4QkFLckIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSWEsZUFBZTtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6ICdhcHAtZWl1LWFwcC1mb290ZXInLFxyXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLWZvb3Rlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVpdUFwcEZvb3RlckNvbXBvbmVudCB7XHJcbiAgIEBJbnB1dCgpIGFwcFZlcnNpb24gPSAnJztcclxuXHJcbiAgIEBJbnB1dCgpIGNvcHlyaWdodFllYXIgPSAnMjAyMyc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55TmFtZSA9ICdJVCAtIEVJVSc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55VXJsID0gJ2h0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9laXUuZWR1LnZuL29pdC8nO1xyXG5cclxuICAgQElucHV0KCkgYWxsUmlnaHRzVGV4dCA9ICdBbGwgcmlnaHRzIHJlc2VydmVkLic7XHJcblxyXG4gICAvKiogTmjDo24gY+G6oW5oIHPhu5EgcGhpw6puIGLhuqNuICh2w60gZOG7pSBcIlZlcnNpb25cIikuICovXHJcbiAgIEBJbnB1dCgpIHZlcnNpb25MYWJlbCA9ICdWZXJzaW9uJztcclxuXHJcblxyXG5cclxuICAgQE91dHB1dCgpIHJlYWRvbmx5IG5ld0ZlYXR1cmVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgIG9uTmV3RmVhdHVyZURpYWxvZ0NsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLm5ld0ZlYXR1cmVDbGljay5lbWl0KCk7XHJcbiAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibWFpbi1mb290ZXJcIj5cclxuICAgPGRpdiBjbGFzcz1cImZsb2F0LXJpZ2h0IGQtbm9uZSBkLXNtLWJsb2NrXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidmVyc2lvbi1yYWRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj48Yj5cclxuICAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwib25OZXdGZWF0dXJlRGlhbG9nQ2xpY2soJGV2ZW50KVwiIGNsYXNzPVwiY29sb3ItZWl1LXByaW1hcnlcIiBzdHlsZT1cIm1hcmdpbjogMFwiPlxyXG4gICAgICAgICAgICB7eyB2ZXJzaW9uTGFiZWwgfX0gPC9hPlxyXG4gICAgICA8L2I+XHJcbiAgICAgIHt7IGFwcFZlcnNpb24gfX1cclxuICAgPC9kaXY+XHJcbiAgIDxzdHJvbmc+XHJcbiAgICAgIDxzcGFuPkNvcHlyaWdodCAmY29weTsge3sgY29weXJpZ2h0WWVhciB9fTwvc3Bhbj5cclxuICAgICAgPGEgW2hyZWZdPVwiY29tcGFueVVybFwiIFt0aXRsZV09XCJjb21wYW55TmFtZVwiIHRhcmdldD1cIl9ibGFua1wiIHN0eWxlPVwibWFyZ2luOiAwXCIgY2xhc3M9XCJjb2xvci1laXUtcHJpbWFyeVwiPlxyXG4gICAgICAgICB7eyBjb21wYW55TmFtZSB9fVxyXG4gICAgICA8L2E+XHJcbiAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgIDwvc3Ryb25nPlxyXG4gICA8c3Bhbj4ge3sgYWxsUmlnaHRzVGV4dCB9fTwvc3Bhbj5cclxuPC9kaXY+Il19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFPdkUsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQU1ZLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFFaEIsa0JBQWEsR0FBRyxNQUFNLENBQUM7UUFFdkIsZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFFekIsZUFBVSxHQUFHLDBDQUEwQyxDQUFDO1FBRXhELGtCQUFhLEdBQUcsc0JBQXNCLENBQUM7UUFFdkMsaUJBQVksR0FBRyxTQUFTLENBQUM7UUFFZixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FNaEU7SUFKRSx1QkFBdUIsQ0FBQyxLQUFZO1FBQ2pDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7O21IQWxCUyxxQkFBcUI7dUdBQXJCLHFCQUFxQixxU0NQbEMsbzFEQXlDTTs0RkRsQ08scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNHLG9CQUFvQjs4QkFLckIsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRWEsZUFBZTtzQkFBakMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6ICdhcHAtZWl1LWFwcC1mb290ZXInLFxyXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC1mb290ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLWZvb3Rlci5jb21wb25lbnQuY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEVpdUFwcEZvb3RlckNvbXBvbmVudCB7XHJcbiAgIEBJbnB1dCgpIGFwcFZlcnNpb24gPSAnJztcclxuXHJcbiAgIEBJbnB1dCgpIGNvcHlyaWdodFllYXIgPSAnMjAyMyc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55TmFtZSA9ICdJVCAtIEVJVSc7XHJcblxyXG4gICBASW5wdXQoKSBjb21wYW55VXJsID0gJ2h0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9laXUuZWR1LnZuL29pdC8nO1xyXG5cclxuICAgQElucHV0KCkgYWxsUmlnaHRzVGV4dCA9ICdBbGwgcmlnaHRzIHJlc2VydmVkLic7XHJcblxyXG4gICBASW5wdXQoKSB2ZXJzaW9uTGFiZWwgPSAnVmVyc2lvbic7XHJcblxyXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgbmV3RmVhdHVyZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICAgb25OZXdGZWF0dXJlRGlhbG9nQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMubmV3RmVhdHVyZUNsaWNrLmVtaXQoKTtcclxuICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJtYWluLWZvb3RlclwiPlxyXG4gICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhcl9fY29weVwiPlxyXG4gICAgICAgICA8c3Bhbj5Db3B5cmlnaHQgwqkge3sgY29weXJpZ2h0WWVhciB9fTwvc3Bhbj5cclxuICAgICAgICAgPGFcclxuICAgICAgICAgICAgY2xhc3M9XCJmb290ZXItYmFyX19saW5rXCJcclxuICAgICAgICAgICAgaHJlZj1cImh0dHBzOi8vc2l0ZXMuZ29vZ2xlLmNvbS9laXUuZWR1LnZuL29pdC9cIlxyXG4gICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcclxuICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb21wYW55TmFtZSB9fVxyXG4gICAgICAgICA8L2E+XHJcbiAgICAgICAgIDxzcGFuPi4ge3sgYWxsUmlnaHRzVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgIFxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJhcl9fdmVyc2lvblwiPlxyXG4gICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjbGFzcz1cImZvb3Rlci12ZXJzaW9uLWNoaXAtd3JhcFwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5ld0ZlYXR1cmVEaWFsb2dDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcclxuICAgICAgICAgICAgICAgJ0FwcGxpY2F0aW9uIHZlcnNpb24gJyArIGFwcFZlcnNpb24gKyAnLiBOaOG6pW4gxJHhu4Mgc2FvIGNow6lwIHBoacOqbiBi4bqjbiB2w6BvIGNsaXBib2FyZCdcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgdGl0bGU9XCJTYW8gY2jDqXAgcGhpw6puIGLhuqNuIHbDoG8gY2xpcGJvYXJkXCJcclxuICAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLXZlcnNpb24tY2hpcFwiPlxyXG4gICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci1yYWRhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci1yYWRhcl9fc3dlZXBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJmb290ZXItcmFkYXJfX2RvdFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmb2N1c2FibGU9XCJmYWxzZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwiZm9vdGVyLXJhZGFyX19kb3Qtc2hhcGVcIiBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzLjI1XCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci12ZXJzaW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9vdGVyLXZlcnNpb25fX2xhYmVsXCI+e3sgdmVyc2lvbkxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvb3Rlci12ZXJzaW9uX19zZXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj7Ctzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb290ZXItdmVyc2lvbl9fdmFsdWVcIiB0cmFuc2xhdGU9XCJub1wiPnt7IGFwcFZlcnNpb24gfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICA8L2Rpdj5cclxuPC9kaXY+Il19
@@ -0,0 +1,87 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ export class EiuAppUserMenuComponent {
5
+ constructor() {
6
+ /** Thông tin user — host bind từ service token / session. */
7
+ this.profile = null;
8
+ /** Ảnh mặc định khi `picture` lỗi hoặc trống (đường dẫn trong assets của host). */
9
+ this.fallbackAvatar = 'assets/img/icons/default-profile.png';
10
+ this.changePasswordLabel = 'Đổi mật khẩu';
11
+ this.logoutLabel = 'Đăng xuất';
12
+ /** Host xử lý (ví dụ redirect SSO đổi mật khẩu). */
13
+ this.changePassword = new EventEmitter();
14
+ /** Host xử lý (ví dụ Keycloak logout + clear storage). */
15
+ this.logout = new EventEmitter();
16
+ this.menuOpen = false;
17
+ }
18
+ onTriggerClick(event) {
19
+ event.preventDefault();
20
+ event.stopPropagation();
21
+ this.menuOpen = !this.menuOpen;
22
+ }
23
+ onChangePasswordClick(event) {
24
+ event.preventDefault();
25
+ this.changePassword.emit();
26
+ this.menuOpen = false;
27
+ }
28
+ onLogoutClick(event) {
29
+ event.preventDefault();
30
+ this.logout.emit();
31
+ this.menuOpen = false;
32
+ }
33
+ onAvatarError(event) {
34
+ const img = event.target;
35
+ if (img && img.src !== this._absoluteFallback()) {
36
+ img.src = this.fallbackAvatar;
37
+ }
38
+ }
39
+ onDocumentClick(event) {
40
+ if (!this.menuOpen) {
41
+ return;
42
+ }
43
+ const root = this._root?.nativeElement;
44
+ if (root && !root.contains(event.target)) {
45
+ this.menuOpen = false;
46
+ }
47
+ }
48
+ onEscape() {
49
+ this.menuOpen = false;
50
+ }
51
+ _absoluteFallback() {
52
+ try {
53
+ return new URL(this.fallbackAvatar, window.location.origin).href;
54
+ }
55
+ catch {
56
+ return this.fallbackAvatar;
57
+ }
58
+ }
59
+ }
60
+ EiuAppUserMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
+ EiuAppUserMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: EiuAppUserMenuComponent, selector: "app-eiu-user-menu", inputs: { profile: "profile", fallbackAvatar: "fallbackAvatar", changePasswordLabel: "changePasswordLabel", logoutLabel: "logoutLabel" }, outputs: { changePassword: "changePassword", logout: "logout" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()" } }, viewQueries: [{ propertyName: "_root", first: true, predicate: ["root"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"eiu-user-menu\" #root *ngIf=\"profile as p\">\r\n <div class=\"eiu-user-menu__shell\">\r\n <a\r\n class=\"nav-link eiu-user-menu__trigger\"\r\n href=\"#\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"menuOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n (click)=\"onTriggerClick($event)\"\r\n >\r\n <div class=\"eiu-user-menu__trigger-inner\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"25\"\r\n height=\"25\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--sm\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <span class=\"eiu-user-menu__name text-grey-8 text-capitalize\">{{ p.fullName }}</span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"eiu-user-menu__dropdown\" *ngIf=\"menuOpen\" role=\"menu\">\r\n <div class=\"eiu-user-menu__header bg-eiu-primary\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"90\"\r\n height=\"90\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--lg\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <p>\r\n <span>{{ p.fullName }}</span>\r\n <small *ngIf=\"p.email as email\">\r\n <span class=\"mr-2\">{{ email }}</span>\r\n </small>\r\n </p>\r\n </div>\r\n <div class=\"eiu-user-menu__footer\">\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-left\"\r\n role=\"menuitem\"\r\n (click)=\"onChangePasswordClick($event)\"\r\n >\r\n <i class=\"fa fa-exchange-alt mr-1\"></i>\r\n {{ changePasswordLabel }}\r\n </a>\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-right\"\r\n role=\"menuitem\"\r\n (click)=\"onLogoutClick($event)\"\r\n >\r\n <i class=\"fa fa-sign-out-alt mr-1\"></i>\r\n {{ logoutLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center}.eiu-user-menu{position:relative;border:none;width:auto;display:flex;justify-content:center;align-items:center}.eiu-user-menu__shell{position:relative;display:flex;align-items:center}.eiu-user-menu__trigger{padding:.5rem .75rem}.eiu-user-menu__dropdown{position:absolute;right:0;top:100%;z-index:1050;min-width:280px;margin-top:.25rem;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem #0000002d}.eiu-user-menu__img--sm{margin:0 3px;border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.eiu-user-menu__img--lg{border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b;border:3px solid rgba(255,255,255,.2)}.eiu-user-menu__header{display:flex;align-items:center;flex-direction:column;height:175px;padding:10px;text-align:center}.eiu-user-menu__header img{z-index:5;height:90px;width:90px}.eiu-user-menu__header p{z-index:5;font-size:17px;margin-top:10px}.eiu-user-menu__header p small{display:block;font-size:12px}.eiu-user-menu__footer{background-color:#f8f9fa;padding:10px}.eiu-user-menu__footer:after{display:block;clear:both;content:\"\"}.eiu-user-menu__footer .btn-default{color:#6c757d;font-size:13px}@media (min-width: 576px){.eiu-user-menu__footer .btn-default:hover{background-color:#f8f9fa}}.eiu-user-menu__trigger-inner{display:flex;flex-wrap:wrap;align-items:center}.eiu-user-menu__trigger-inner .eiu-user-menu__name{max-width:0 15px;margin:3px auto}.text-grey-8{color:#616161}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuComponent, decorators: [{
63
+ type: Component,
64
+ args: [{ selector: 'app-eiu-user-menu', template: "<div class=\"eiu-user-menu\" #root *ngIf=\"profile as p\">\r\n <div class=\"eiu-user-menu__shell\">\r\n <a\r\n class=\"nav-link eiu-user-menu__trigger\"\r\n href=\"#\"\r\n role=\"button\"\r\n [attr.aria-expanded]=\"menuOpen\"\r\n [attr.aria-haspopup]=\"true\"\r\n (click)=\"onTriggerClick($event)\"\r\n >\r\n <div class=\"eiu-user-menu__trigger-inner\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"25\"\r\n height=\"25\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--sm\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <span class=\"eiu-user-menu__name text-grey-8 text-capitalize\">{{ p.fullName }}</span>\r\n </div>\r\n </a>\r\n\r\n <div class=\"eiu-user-menu__dropdown\" *ngIf=\"menuOpen\" role=\"menu\">\r\n <div class=\"eiu-user-menu__header bg-eiu-primary\">\r\n <img\r\n [src]=\"p.picture || fallbackAvatar\"\r\n [alt]=\"p.fullName\"\r\n width=\"90\"\r\n height=\"90\"\r\n class=\"eiu-user-menu__img eiu-user-menu__img--lg\"\r\n (error)=\"onAvatarError($event)\"\r\n />\r\n <p>\r\n <span>{{ p.fullName }}</span>\r\n <small *ngIf=\"p.email as email\">\r\n <span class=\"mr-2\">{{ email }}</span>\r\n </small>\r\n </p>\r\n </div>\r\n <div class=\"eiu-user-menu__footer\">\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-left\"\r\n role=\"menuitem\"\r\n (click)=\"onChangePasswordClick($event)\"\r\n >\r\n <i class=\"fa fa-exchange-alt mr-1\"></i>\r\n {{ changePasswordLabel }}\r\n </a>\r\n <a\r\n href=\"#\"\r\n class=\"btn btn-default btn-flat float-right\"\r\n role=\"menuitem\"\r\n (click)=\"onLogoutClick($event)\"\r\n >\r\n <i class=\"fa fa-sign-out-alt mr-1\"></i>\r\n {{ logoutLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;justify-content:center;align-items:center}.eiu-user-menu{position:relative;border:none;width:auto;display:flex;justify-content:center;align-items:center}.eiu-user-menu__shell{position:relative;display:flex;align-items:center}.eiu-user-menu__trigger{padding:.5rem .75rem}.eiu-user-menu__dropdown{position:absolute;right:0;top:100%;z-index:1050;min-width:280px;margin-top:.25rem;background:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem #0000002d}.eiu-user-menu__img--sm{margin:0 3px;border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b}.eiu-user-menu__img--lg{border-radius:50%;object-fit:cover;box-shadow:0 3px 6px #00000029,0 3px 6px #0000003b;border:3px solid rgba(255,255,255,.2)}.eiu-user-menu__header{display:flex;align-items:center;flex-direction:column;height:175px;padding:10px;text-align:center}.eiu-user-menu__header img{z-index:5;height:90px;width:90px}.eiu-user-menu__header p{z-index:5;font-size:17px;margin-top:10px}.eiu-user-menu__header p small{display:block;font-size:12px}.eiu-user-menu__footer{background-color:#f8f9fa;padding:10px}.eiu-user-menu__footer:after{display:block;clear:both;content:\"\"}.eiu-user-menu__footer .btn-default{color:#6c757d;font-size:13px}@media (min-width: 576px){.eiu-user-menu__footer .btn-default:hover{background-color:#f8f9fa}}.eiu-user-menu__trigger-inner{display:flex;flex-wrap:wrap;align-items:center}.eiu-user-menu__trigger-inner .eiu-user-menu__name{max-width:0 15px;margin:3px auto}.text-grey-8{color:#616161}\n"] }]
65
+ }], propDecorators: { _root: [{
66
+ type: ViewChild,
67
+ args: ['root', { static: true }]
68
+ }], profile: [{
69
+ type: Input
70
+ }], fallbackAvatar: [{
71
+ type: Input
72
+ }], changePasswordLabel: [{
73
+ type: Input
74
+ }], logoutLabel: [{
75
+ type: Input
76
+ }], changePassword: [{
77
+ type: Output
78
+ }], logout: [{
79
+ type: Output
80
+ }], onDocumentClick: [{
81
+ type: HostListener,
82
+ args: ['document:click', ['$event']]
83
+ }], onEscape: [{
84
+ type: HostListener,
85
+ args: ['document:keydown.escape']
86
+ }] } });
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNKLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNYLE1BQU0sZUFBZSxDQUFDOzs7QUFRdkIsTUFBTSxPQUFPLHVCQUF1QjtJQUxwQztRQVFHLDZEQUE2RDtRQUNwRCxZQUFPLEdBQThCLElBQUksQ0FBQztRQUVuRCxtRkFBbUY7UUFDMUUsbUJBQWMsR0FBRyxzQ0FBc0MsQ0FBQztRQUV4RCx3QkFBbUIsR0FBRyxjQUFjLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFFbkMsb0RBQW9EO1FBQ2pDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUM3RCwwREFBMEQ7UUFDdkMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFckQsYUFBUSxHQUFHLEtBQUssQ0FBQztLQWtEbkI7SUFoREUsY0FBYyxDQUFDLEtBQVk7UUFDeEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNsQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsS0FBWTtRQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQVk7UUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUEwQixDQUFDO1FBQzdDLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUU7WUFDOUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ2hDO0lBQ0osQ0FBQztJQUdELGVBQWUsQ0FBQyxLQUFpQjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1Q7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQztRQUN2QyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO0lBQ0osQ0FBQztJQUdELFFBQVE7UUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRU8saUJBQWlCO1FBQ3RCLElBQUk7WUFDRCxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDbkU7UUFBQyxNQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQzdCO0lBQ0osQ0FBQzs7cUhBbEVTLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGdlQ2hCcEMsazFFQStEQTs0RkQvQ2EsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNHLG1CQUFtQjs4QkFLeUIsS0FBSztzQkFBMUQsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUcxQixPQUFPO3NCQUFmLEtBQUs7Z0JBR0csY0FBYztzQkFBdEIsS0FBSztnQkFFRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFHYSxjQUFjO3NCQUFoQyxNQUFNO2dCQUVZLE1BQU07c0JBQXhCLE1BQU07Z0JBOEJQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgIENvbXBvbmVudCxcclxuICAgRWxlbWVudFJlZixcclxuICAgRXZlbnRFbWl0dGVyLFxyXG4gICBIb3N0TGlzdGVuZXIsXHJcbiAgIElucHV0LFxyXG4gICBPdXRwdXQsXHJcbiAgIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFaXVVc2VyTWVudVByb2ZpbGUgfSBmcm9tICcuL2VpdS11c2VyLW1lbnUubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgIHNlbGVjdG9yOiAnYXBwLWVpdS11c2VyLW1lbnUnLFxyXG4gICB0ZW1wbGF0ZVVybDogJy4vZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICBzdHlsZVVybHM6IFsnLi9laXUtYXBwLXVzZXItbWVudS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBVc2VyTWVudUNvbXBvbmVudCB7XHJcbiAgIEBWaWV3Q2hpbGQoJ3Jvb3QnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHJlYWRvbmx5IF9yb290ITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAvKiogVGjDtG5nIHRpbiB1c2VyIOKAlCBob3N0IGJpbmQgdOG7qyBzZXJ2aWNlIHRva2VuIC8gc2Vzc2lvbi4gKi9cclxuICAgQElucHV0KCkgcHJvZmlsZTogRWl1VXNlck1lbnVQcm9maWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAvKiog4bqibmggbeG6t2MgxJHhu4tuaCBraGkgYHBpY3R1cmVgIGzhu5dpIGhv4bq3YyB0cuG7kW5nICjEkcaw4budbmcgZOG6q24gdHJvbmcgYXNzZXRzIGPhu6dhIGhvc3QpLiAqL1xyXG4gICBASW5wdXQoKSBmYWxsYmFja0F2YXRhciA9ICdhc3NldHMvaW1nL2ljb25zL2RlZmF1bHQtcHJvZmlsZS5wbmcnO1xyXG5cclxuICAgQElucHV0KCkgY2hhbmdlUGFzc3dvcmRMYWJlbCA9ICfEkOG7lWkgbeG6rXQga2jhuql1JztcclxuICAgQElucHV0KCkgbG9nb3V0TGFiZWwgPSAnxJDEg25nIHh14bqldCc7XHJcblxyXG4gICAvKiogSG9zdCB44butIGzDvSAodsOtIGThu6UgcmVkaXJlY3QgU1NPIMSR4buVaSBt4bqtdCBraOG6qXUpLiAqL1xyXG4gICBAT3V0cHV0KCkgcmVhZG9ubHkgY2hhbmdlUGFzc3dvcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgIC8qKiBIb3N0IHjhu60gbMO9ICh2w60gZOG7pSBLZXljbG9hayBsb2dvdXQgKyBjbGVhciBzdG9yYWdlKS4gKi9cclxuICAgQE91dHB1dCgpIHJlYWRvbmx5IGxvZ291dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgIG1lbnVPcGVuID0gZmFsc2U7XHJcblxyXG4gICBvblRyaWdnZXJDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIHRoaXMubWVudU9wZW4gPSAhdGhpcy5tZW51T3BlbjtcclxuICAgfVxyXG5cclxuICAgb25DaGFuZ2VQYXNzd29yZENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNoYW5nZVBhc3N3b3JkLmVtaXQoKTtcclxuICAgICAgdGhpcy5tZW51T3BlbiA9IGZhbHNlO1xyXG4gICB9XHJcblxyXG4gICBvbkxvZ291dENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmxvZ291dC5lbWl0KCk7XHJcbiAgICAgIHRoaXMubWVudU9wZW4gPSBmYWxzZTtcclxuICAgfVxyXG5cclxuICAgb25BdmF0YXJFcnJvcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgICAgY29uc3QgaW1nID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICAgIGlmIChpbWcgJiYgaW1nLnNyYyAhPT0gdGhpcy5fYWJzb2x1dGVGYWxsYmFjaygpKSB7XHJcbiAgICAgICAgIGltZy5zcmMgPSB0aGlzLmZhbGxiYWNrQXZhdGFyO1xyXG4gICAgICB9XHJcbiAgIH1cclxuXHJcbiAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5tZW51T3Blbikge1xyXG4gICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3Qgcm9vdCA9IHRoaXMuX3Jvb3Q/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGlmIChyb290ICYmICFyb290LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xyXG4gICAgICAgICB0aGlzLm1lbnVPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgfVxyXG5cclxuICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxyXG4gICBvbkVzY2FwZSgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5tZW51T3BlbiA9IGZhbHNlO1xyXG4gICB9XHJcblxyXG4gICBwcml2YXRlIF9hYnNvbHV0ZUZhbGxiYWNrKCk6IHN0cmluZyB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgIHJldHVybiBuZXcgVVJMKHRoaXMuZmFsbGJhY2tBdmF0YXIsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pLmhyZWY7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICByZXR1cm4gdGhpcy5mYWxsYmFja0F2YXRhcjtcclxuICAgICAgfVxyXG4gICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImVpdS11c2VyLW1lbnVcIiAjcm9vdCAqbmdJZj1cInByb2ZpbGUgYXMgcFwiPlxyXG4gICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fc2hlbGxcIj5cclxuICAgICAgPGFcclxuICAgICAgICAgY2xhc3M9XCJuYXYtbGluayBlaXUtdXNlci1tZW51X190cmlnZ2VyXCJcclxuICAgICAgICAgaHJlZj1cIiNcIlxyXG4gICAgICAgICByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtZW51T3BlblwiXHJcbiAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwidHJ1ZVwiXHJcbiAgICAgICAgIChjbGljayk9XCJvblRyaWdnZXJDbGljaygkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fdHJpZ2dlci1pbm5lclwiPlxyXG4gICAgICAgICAgICA8aW1nXHJcbiAgICAgICAgICAgICAgIFtzcmNdPVwicC5waWN0dXJlIHx8IGZhbGxiYWNrQXZhdGFyXCJcclxuICAgICAgICAgICAgICAgW2FsdF09XCJwLmZ1bGxOYW1lXCJcclxuICAgICAgICAgICAgICAgd2lkdGg9XCIyNVwiXHJcbiAgICAgICAgICAgICAgIGhlaWdodD1cIjI1XCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJlaXUtdXNlci1tZW51X19pbWcgZWl1LXVzZXItbWVudV9faW1nLS1zbVwiXHJcbiAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkF2YXRhckVycm9yKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVpdS11c2VyLW1lbnVfX25hbWUgdGV4dC1ncmV5LTggdGV4dC1jYXBpdGFsaXplXCI+e3sgcC5mdWxsTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvYT5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJlaXUtdXNlci1tZW51X19kcm9wZG93blwiICpuZ0lmPVwibWVudU9wZW5cIiByb2xlPVwibWVudVwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9faGVhZGVyIGJnLWVpdS1wcmltYXJ5XCI+XHJcbiAgICAgICAgICAgIDxpbWdcclxuICAgICAgICAgICAgICAgW3NyY109XCJwLnBpY3R1cmUgfHwgZmFsbGJhY2tBdmF0YXJcIlxyXG4gICAgICAgICAgICAgICBbYWx0XT1cInAuZnVsbE5hbWVcIlxyXG4gICAgICAgICAgICAgICB3aWR0aD1cIjkwXCJcclxuICAgICAgICAgICAgICAgaGVpZ2h0PVwiOTBcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImVpdS11c2VyLW1lbnVfX2ltZyBlaXUtdXNlci1tZW51X19pbWctLWxnXCJcclxuICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uQXZhdGFyRXJyb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxwPlxyXG4gICAgICAgICAgICAgICA8c3Bhbj57eyBwLmZ1bGxOYW1lIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJwLmVtYWlsIGFzIGVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXItMlwiPnt7IGVtYWlsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZWl1LXVzZXItbWVudV9fZm9vdGVyXCI+XHJcbiAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWZsYXQgZmxvYXQtbGVmdFwiXHJcbiAgICAgICAgICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJvbkNoYW5nZVBhc3N3b3JkQ2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1leGNoYW5nZS1hbHQgbXItMVwiPjwvaT5cclxuICAgICAgICAgICAgICAge3sgY2hhbmdlUGFzc3dvcmRMYWJlbCB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLWZsYXQgZmxvYXQtcmlnaHRcIlxyXG4gICAgICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAoY2xpY2spPVwib25Mb2dvdXRDbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNpZ24tb3V0LWFsdCBtci0xXCI+PC9pPlxyXG4gICAgICAgICAgICAgICB7eyBsb2dvdXRMYWJlbCB9fVxyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { EiuAppUserMenuComponent } from './eiu-app-user-menu.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Menu user header (avatar, đổi mật khẩu, đăng xuất).
7
+ * Host cung cấp `[profile]` và xử lý `(changePassword)` / `(logout)`.
8
+ */
9
+ export class EiuAppUserMenuModule {
10
+ }
11
+ EiuAppUserMenuModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
12
+ EiuAppUserMenuModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, declarations: [EiuAppUserMenuComponent], imports: [CommonModule], exports: [EiuAppUserMenuComponent] });
13
+ EiuAppUserMenuModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, imports: [CommonModule] });
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: EiuAppUserMenuModule, decorators: [{
15
+ type: NgModule,
16
+ args: [{
17
+ imports: [CommonModule],
18
+ declarations: [EiuAppUserMenuComponent],
19
+ exports: [EiuAppUserMenuComponent]
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZWl1LWFwcC1raXQvc3JjL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQUV4RTs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sb0JBQW9COztrSEFBcEIsb0JBQW9CO21IQUFwQixvQkFBb0IsaUJBSGYsdUJBQXVCLGFBRDVCLFlBQVksYUFFWix1QkFBdUI7bUhBRXZCLG9CQUFvQixZQUpwQixZQUFZOzRGQUlaLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUCxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQ3ZCLFlBQVksRUFBRSxDQUFDLHVCQUF1QixDQUFDO29CQUN2QyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztpQkFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFaXVBcHBVc2VyTWVudUNvbXBvbmVudCB9IGZyb20gJy4vZWl1LWFwcC11c2VyLW1lbnUuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBNZW51IHVzZXIgaGVhZGVyIChhdmF0YXIsIMSR4buVaSBt4bqtdCBraOG6qXUsIMSRxINuZyB4deG6pXQpLlxyXG4gKiBIb3N0IGN1bmcgY+G6pXAgYFtwcm9maWxlXWAgdsOgIHjhu60gbMO9IGAoY2hhbmdlUGFzc3dvcmQpYCAvIGAobG9nb3V0KWAuXHJcbiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICAgZGVjbGFyYXRpb25zOiBbRWl1QXBwVXNlck1lbnVDb21wb25lbnRdLFxyXG4gICBleHBvcnRzOiBbRWl1QXBwVXNlck1lbnVDb21wb25lbnRdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFaXVBcHBVc2VyTWVudU1vZHVsZSB7fVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWl1LXVzZXItbWVudS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9saWIvdXNlci1tZW51L2VpdS11c2VyLW1lbnUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUaMO0bmcgdGluIHVzZXIgaGnhu4NuIHRo4buLIHRyw6puIG1lbnUgKGF2YXRhciwgdMOqbiwgZW1haWwpLlxyXG4gKiBIb3N0IG1hcCB04burIHRva2VuIC8gQVBJIGPhu6dhIOG7qW5nIGThu6VuZy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWl1VXNlck1lbnVQcm9maWxlIHtcclxuICAgLyoqIFVSTCDhuqNuaCDEkeG6oWkgZGnhu4duICh0deG7syBjaOG7jW4pLiAqL1xyXG4gICBwaWN0dXJlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgLyoqIEjhu40gdMOqbiBoaeG7g24gdGjhu4suICovXHJcbiAgIGZ1bGxOYW1lOiBzdHJpbmc7XHJcbiAgIC8qKiBFbWFpbCAodHXhu7MgY2jhu41uKS4gKi9cclxuICAgZW1haWw/OiBzdHJpbmcgfCBudWxsO1xyXG59XHJcbiJdfQ==
@@ -6,6 +6,9 @@ export * from './lib/app-launcher/eiu-app-launcher-menu.model';
6
6
  export * from './lib/app-launcher/eiu-app-launcher-menu.token';
7
7
  export * from './lib/app-launcher/eiu-app-launcher.component';
8
8
  export * from './lib/app-launcher/eiu-app-launcher.module';
9
+ export * from './lib/user-menu/eiu-user-menu.model';
10
+ export * from './lib/user-menu/eiu-app-user-menu.component';
11
+ export * from './lib/user-menu/eiu-app-user-menu.module';
9
12
  export * from './lib/sidebar-shared/sidebar-shared.model';
10
13
  export * from './lib/sidebar-shared/logo/eiu-sidebar-logo.component';
11
14
  export * from './lib/sidebar-shared/contact/eiu-contact-support.component';
@@ -20,4 +23,4 @@ export * from './lib/feature-news/feature-news-dialog.service';
20
23
  export * from './lib/feature-news/feature-news.service';
21
24
  export * from './lib/feature-news/feature-news-dialog.component';
22
25
  export * from './lib/feature-news/eiu-app-feature-news.module';
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBFSVUgQXBwIEtpdCDigJQgdMOhaSBz4butIGThu6VuZyBnaeG7r2EgY8OhYyBBbmd1bGFyIGFwcCAoZmVhdHVyZSBuZXdzIFJlZG1pbmUsIGxhdW5jaGVyIGhlYWRlciwg4oCmKVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2VpdS1hcHAta2l0LnRva2Vucyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci1tZW51Lm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLW1lbnUudG9rZW4nO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwLWxhdW5jaGVyL2VpdS1hcHAtbGF1bmNoZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWRlYmFyLXNoYXJlZC9zaWRlYmFyLXNoYXJlZC5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWRlYmFyLXNoYXJlZC9sb2dvL2VpdS1zaWRlYmFyLWxvZ28uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpZGViYXItc2hhcmVkL2NvbnRhY3QvZWl1LWNvbnRhY3Qtc3VwcG9ydC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lkZWJhci1zaGFyZWQvZWl1LXNpZGViYXItc2hhcmVkLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvb3Rlci9laXUtYXBwLWZvb3Rlci5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL2NvbnN0YW50cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL29wZXJhdGlvbi1yZXN1bHQubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL21vZGVscy9yZWRtaW5lLW5ld3MubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL25ld3MtYXBpLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL2ZlYXR1cmUtbmV3cy1kaWFsb2cuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvZmVhdHVyZS1uZXdzLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL2ZlYXR1cmUtbmV3cy1kaWFsb2cuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9laXUtYXBwLWZlYXR1cmUtbmV3cy5tb2R1bGUnO1xuIl19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2VpdS1hcHAta2l0L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGdEQUFnRCxDQUFDO0FBQy9ELGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsZ0RBQWdELENBQUM7QUFDL0QsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxrREFBa0QsQ0FBQztBQUNqRSxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsa0RBQWtELENBQUM7QUFDakUsY0FBYyxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIEVJVSBBcHAgS2l0IOKAlCB0w6FpIHPhu60gZOG7pW5nIGdp4buvYSBjw6FjIEFuZ3VsYXIgYXBwIChmZWF0dXJlIG5ld3MgUmVkbWluZSwgbGF1bmNoZXIgaGVhZGVyLCDigKYpXHJcbiAqL1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZWl1LWFwcC1raXQudG9rZW5zJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXBwLWxhdW5jaGVyL2VpdS1hcHAtbGF1bmNoZXItbWVudS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FwcC1sYXVuY2hlci9laXUtYXBwLWxhdW5jaGVyLW1lbnUudG9rZW4nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcHAtbGF1bmNoZXIvZWl1LWFwcC1sYXVuY2hlci5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi91c2VyLW1lbnUvZWl1LXVzZXItbWVudS5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3VzZXItbWVudS9laXUtYXBwLXVzZXItbWVudS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi91c2VyLW1lbnUvZWl1LWFwcC11c2VyLW1lbnUubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lkZWJhci1zaGFyZWQvc2lkZWJhci1zaGFyZWQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaWRlYmFyLXNoYXJlZC9sb2dvL2VpdS1zaWRlYmFyLWxvZ28uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2lkZWJhci1zaGFyZWQvY29udGFjdC9laXUtY29udGFjdC1zdXBwb3J0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NpZGViYXItc2hhcmVkL2VpdS1zaWRlYmFyLXNoYXJlZC5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb290ZXIvZWl1LWFwcC1mb290ZXIuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZm9vdGVyL2VpdS1hcHAtZm9vdGVyLm1vZHVsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL29wZXJhdGlvbi1yZXN1bHQubW9kZWwnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mZWF0dXJlLW5ld3MvbW9kZWxzL3JlZG1pbmUtbmV3cy5tb2RlbCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9uZXdzLWFwaS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZmVhdHVyZS1uZXdzL2ZlYXR1cmUtbmV3cy1kaWFsb2cuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3Muc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9mZWF0dXJlLW5ld3MtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ZlYXR1cmUtbmV3cy9laXUtYXBwLWZlYXR1cmUtbmV3cy5tb2R1bGUnO1xyXG4iXX0=