@libs-ui/components-inputs-emoji 0.2.355-9 → 0.2.356-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.
- package/README.md +143 -2
- package/emoji.component.d.ts +13 -0
- package/esm2022/emoji.component.mjs +14 -1
- package/esm2022/interfaces/emoji.interface.mjs +1 -1
- package/fesm2022/libs-ui-components-inputs-emoji.mjs +13 -0
- package/fesm2022/libs-ui-components-inputs-emoji.mjs.map +1 -1
- package/interfaces/emoji.interface.d.ts +9 -0
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,3 +1,144 @@
|
|
|
1
|
-
# inputs-emoji
|
|
1
|
+
# @libs-ui/components-inputs-emoji
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> Component chọn Emoji (Emoji Picker) tích hợp trong Popover với tính năng tìm kiếm và phân loại.
|
|
4
|
+
|
|
5
|
+
## Giới thiệu
|
|
6
|
+
|
|
7
|
+
`LibsUiComponentsEmojiComponent` cung cấp một giao diện chọn emoji trực quan, hỗ trợ đầy đủ các nhóm emoji tiêu chuẩn, tìm kiếm theo tên và tối ưu hóa hiệu năng bằng lazy loading khi cuộn danh sách.
|
|
8
|
+
|
|
9
|
+
### Tính năng
|
|
10
|
+
|
|
11
|
+
- ✅ Danh sách Emoji đầy đủ, phân loại theo nhóm
|
|
12
|
+
- ✅ Tìm kiếm Emoji nhanh chóng
|
|
13
|
+
- ✅ Tích hợp sẵn Popover thông minh
|
|
14
|
+
- ✅ Lazy loading (scroll to load more) tối ưu hiệu năng
|
|
15
|
+
- ✅ Hỗ trợ Custom Trigger qua `ng-content`
|
|
16
|
+
- ✅ Tùy chỉnh linh hoạt kích thước và vị trí popup
|
|
17
|
+
|
|
18
|
+
## Khi nào sử dụng
|
|
19
|
+
|
|
20
|
+
- Khi cần cho phép người dùng chèn cảm xúc (emoji) vào nội dung văn bản.
|
|
21
|
+
- Phù hợp cho ứng dụng Chat, Comment, Social Media.
|
|
22
|
+
- Khi cần một bộ chọn emoji chuyên nghiệp nhưng vẫn tiết kiệm diện tích giao diện.
|
|
23
|
+
|
|
24
|
+
## Cài đặt
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# npm
|
|
28
|
+
npm install @libs-ui/components-inputs-emoji
|
|
29
|
+
|
|
30
|
+
# yarn
|
|
31
|
+
yarn add @libs-ui/components-inputs-emoji
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Import
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { LibsUiComponentsEmojiComponent } from '@libs-ui/components-inputs-emoji';
|
|
38
|
+
|
|
39
|
+
@Component({
|
|
40
|
+
standalone: true,
|
|
41
|
+
imports: [LibsUiComponentsEmojiComponent],
|
|
42
|
+
// ...
|
|
43
|
+
})
|
|
44
|
+
export class YourComponent {}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Ví dụ
|
|
48
|
+
|
|
49
|
+
### Cơ bản
|
|
50
|
+
|
|
51
|
+
```html
|
|
52
|
+
<libs_ui-components-emoji (outEventEmoji)="onSelect($event)" />
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Custom Trigger
|
|
56
|
+
|
|
57
|
+
```html
|
|
58
|
+
<libs_ui-components-emoji
|
|
59
|
+
[isNgContent]="true"
|
|
60
|
+
(outEventEmoji)="onSelect($event)">
|
|
61
|
+
<button>Chọn Emoji</button>
|
|
62
|
+
</libs_ui-components-emoji>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## API
|
|
66
|
+
|
|
67
|
+
### libs_ui-components-emoji
|
|
68
|
+
|
|
69
|
+
#### Inputs
|
|
70
|
+
|
|
71
|
+
| Property | Type | Default | Description |
|
|
72
|
+
| ----------------------- | ------------------------------ | ------------------------ | -------------------------------------------- |
|
|
73
|
+
| `[classIconInclude]` | `string` | `'libs-ui-icon-add'` | CSS class cho icon trigger mặc định |
|
|
74
|
+
| `[classInclude]` | `string` | `''` | CSS class bổ sung cho trigger container |
|
|
75
|
+
| `[classPopup]` | `string` | `'w-[290px] h-[245px]'` | CSS class cho container của popup chọn emoji |
|
|
76
|
+
| `[configPopover]` | `IPopoverOverlay` | `defaultConfigPopover()` | Cấu hình overlay cho Popover |
|
|
77
|
+
| `[isNgContent]` | `boolean` | `false` | Sử dụng ng-content làm trigger thay vì icon |
|
|
78
|
+
| `[modePopoverPosition]` | `'start' \| 'center' \| 'end'` | `undefined` | Chế độ căn lề cho Popover |
|
|
79
|
+
| `[zIndex]` | `number` | `0` | Giá trị Z-index nền của popup |
|
|
80
|
+
|
|
81
|
+
#### Outputs
|
|
82
|
+
|
|
83
|
+
| Property | Type | Description |
|
|
84
|
+
| ----------------------- | ------------------------------ | --------------------------------------------------- |
|
|
85
|
+
| `(outEventEmoji)` | `string` | Emit khi người dùng chọn một emoji |
|
|
86
|
+
| `(outFunctionsControl)` | `IPopoverFunctionControlEvent` | Emit các functions điều khiển Popover (show/remove) |
|
|
87
|
+
|
|
88
|
+
## Types & Interfaces
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Interface configure Popover
|
|
92
|
+
export interface IPopoverOverlay {
|
|
93
|
+
isAddContentToParentDocument?: boolean;
|
|
94
|
+
classInclude?: string;
|
|
95
|
+
widthByParent?: boolean;
|
|
96
|
+
width?: number;
|
|
97
|
+
minWidth?: number;
|
|
98
|
+
maxWidth?: number;
|
|
99
|
+
maxHeight?: number | null;
|
|
100
|
+
zIndex?: number;
|
|
101
|
+
direction?: 'top' | 'right' | 'bottom' | 'left';
|
|
102
|
+
position?: {
|
|
103
|
+
mode: 'start' | 'center' | 'end';
|
|
104
|
+
distance: number;
|
|
105
|
+
};
|
|
106
|
+
// ... (see @libs-ui/components-popover for full list)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface IPopoverFunctionControlEvent {
|
|
110
|
+
showPopoverOverlay: () => void;
|
|
111
|
+
removePopoverOverlay: () => void;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Công nghệ
|
|
116
|
+
|
|
117
|
+
| Technology | Version | Purpose |
|
|
118
|
+
| --------------- | ------- | ---------------- |
|
|
119
|
+
| Angular | 18+ | Framework |
|
|
120
|
+
| Angular Signals | - | State management |
|
|
121
|
+
| TailwindCSS | 3.x | Styling |
|
|
122
|
+
| OnPush | - | Change Detection |
|
|
123
|
+
|
|
124
|
+
## Demo
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
npx nx serve core-ui
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Truy cập: `http://localhost:4500/inputs/emoji`
|
|
131
|
+
|
|
132
|
+
## Unit Tests
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Chạy tests
|
|
136
|
+
npx nx test components-inputs-emoji
|
|
137
|
+
|
|
138
|
+
# Coverage
|
|
139
|
+
npx nx test components-inputs-emoji --coverage
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
|
|
144
|
+
MIT
|
package/emoji.component.d.ts
CHANGED
|
@@ -2,6 +2,10 @@ import { AfterViewInit } from '@angular/core';
|
|
|
2
2
|
import { IPopoverFunctionControlEvent, IPopoverOverlay } from '@libs-ui/components-popover';
|
|
3
3
|
import { IEmoji, IGroupEmoji } from './interfaces/emoji.interface';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
|
+
/**
|
|
6
|
+
* Component chọn Emoji (Emoji Picker) với tính năng tìm kiếm và phân loại
|
|
7
|
+
* Hỗ trợ hiển thị trong Popover hoàn chỉnh với lazy loading danh sách emoji
|
|
8
|
+
*/
|
|
5
9
|
export declare class LibsUiComponentsEmojiComponent implements AfterViewInit {
|
|
6
10
|
private functionsControl;
|
|
7
11
|
protected emojisCategories: import("@angular/core").WritableSignal<IGroupEmoji[]>;
|
|
@@ -15,14 +19,23 @@ export declare class LibsUiComponentsEmojiComponent implements AfterViewInit {
|
|
|
15
19
|
dataView: Array<IEmoji>;
|
|
16
20
|
allData: Array<IEmoji>;
|
|
17
21
|
}>;
|
|
22
|
+
/** Cấu hình overlay cho Popover chứa Emoji Picker */
|
|
18
23
|
readonly configPopover: import("@angular/core").InputSignalWithTransform<IPopoverOverlay, IPopoverOverlay | undefined>;
|
|
24
|
+
/** Sử dụng ng-content làm trigger thay vì icon mặc định */
|
|
19
25
|
readonly isNgContent: import("@angular/core").InputSignal<boolean | undefined>;
|
|
26
|
+
/** Giá trị Z-index cho popup. Tự động offset +5 cho content. */
|
|
20
27
|
readonly zIndex: import("@angular/core").InputSignalWithTransform<number, number | undefined>;
|
|
28
|
+
/** Chế độ căn lề cho Popover (start | center | end) */
|
|
21
29
|
readonly modePopoverPosition: import("@angular/core").InputSignal<"start" | "center" | "end" | undefined>;
|
|
30
|
+
/** CSS class cho container của popup chọn emoji */
|
|
22
31
|
readonly classPopup: import("@angular/core").InputSignalWithTransform<string, string | undefined>;
|
|
32
|
+
/** CSS class bổ sung cho trigger container */
|
|
23
33
|
readonly classInclude: import("@angular/core").InputSignalWithTransform<string, string | undefined>;
|
|
34
|
+
/** CSS class cho icon trigger (mặc định: libs-ui-icon-add) */
|
|
24
35
|
readonly classIconInclude: import("@angular/core").InputSignalWithTransform<string, string | undefined>;
|
|
36
|
+
/** Event emit khi người dùng chọn một emoji. Trả về ký tự emoji. */
|
|
25
37
|
readonly outEventEmoji: import("@angular/core").OutputEmitterRef<string>;
|
|
38
|
+
/** Emit các functions điều khiển Popover (show/remove) */
|
|
26
39
|
readonly outFunctionsControl: import("@angular/core").OutputEmitterRef<IPopoverFunctionControlEvent>;
|
|
27
40
|
private readonly emojiRef;
|
|
28
41
|
private readonly elementViewEmoji;
|
|
@@ -7,6 +7,10 @@ import { TranslateModule } from '@ngx-translate/core';
|
|
|
7
7
|
import { defaultConfigPopover, emojis } from './defines/emoji.define';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@ngx-translate/core";
|
|
10
|
+
/**
|
|
11
|
+
* Component chọn Emoji (Emoji Picker) với tính năng tìm kiếm và phân loại
|
|
12
|
+
* Hỗ trợ hiển thị trong Popover hoàn chỉnh với lazy loading danh sách emoji
|
|
13
|
+
*/
|
|
10
14
|
export class LibsUiComponentsEmojiComponent {
|
|
11
15
|
// #region PROPERTY
|
|
12
16
|
functionsControl = signal(undefined);
|
|
@@ -14,15 +18,24 @@ export class LibsUiComponentsEmojiComponent {
|
|
|
14
18
|
filter = signal({ page: 0, keySearch: '', groupSelected: 'Smileys & Emotion', perPage: 170 });
|
|
15
19
|
dataEmojiView = signal({ dataView: [], allData: [] });
|
|
16
20
|
// #region INPUT
|
|
21
|
+
/** Cấu hình overlay cho Popover chứa Emoji Picker */
|
|
17
22
|
configPopover = input(defaultConfigPopover(), { transform: (value) => (value ? value : defaultConfigPopover()) });
|
|
23
|
+
/** Sử dụng ng-content làm trigger thay vì icon mặc định */
|
|
18
24
|
isNgContent = input();
|
|
25
|
+
/** Giá trị Z-index cho popup. Tự động offset +5 cho content. */
|
|
19
26
|
zIndex = input(0, { transform: (value) => value ?? 0 });
|
|
27
|
+
/** Chế độ căn lề cho Popover (start | center | end) */
|
|
20
28
|
modePopoverPosition = input();
|
|
29
|
+
/** CSS class cho container của popup chọn emoji */
|
|
21
30
|
classPopup = input('w-[290px] h-[245px]', { transform: (val) => val ?? 'w-[290px] h-[245px]' });
|
|
31
|
+
/** CSS class bổ sung cho trigger container */
|
|
22
32
|
classInclude = input('', { transform: (val) => val ?? '' });
|
|
33
|
+
/** CSS class cho icon trigger (mặc định: libs-ui-icon-add) */
|
|
23
34
|
classIconInclude = input('libs-ui-icon-add', { transform: (val) => val ?? 'libs-ui-icon-add' });
|
|
24
35
|
// #region OUTPUT
|
|
36
|
+
/** Event emit khi người dùng chọn một emoji. Trả về ký tự emoji. */
|
|
25
37
|
outEventEmoji = output();
|
|
38
|
+
/** Emit các functions điều khiển Popover (show/remove) */
|
|
26
39
|
outFunctionsControl = output();
|
|
27
40
|
/* VIEW CHILD */
|
|
28
41
|
emojiRef = viewChild('emojiRef');
|
|
@@ -93,4 +106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
93
106
|
type: Component,
|
|
94
107
|
args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsSearchComponent, LibsUiComponentsPopoverComponent, LibsUiComponentsScrollOverlayDirective], template: "<libs_ui-components-popover\n [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex: (zIndex() || 1200) + 4,\n }\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover\n type=\"other\"\n mode=\"click-toggle\"\n class=\"flex\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"before:!text-[16px] before:!text-[#6a7383] {{ classIconInclude() }}\"></i>\n } @else {\n <ng-content></ng-content>\n }\n </libs_ui-components-popover>\n</libs_ui-components-popover>\n<ng-template #emojiRef>\n <div class=\"py-[10px] flex flex-col {{ classPopup() }}\">\n <div class=\"mx-[10px] mb-[12px]\">\n <div\n class=\"flex\"\n LibsUiComponentsScrollOverlayDirective>\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\n [class.libs-ui-bg-list-active]=\"filter().groupSelected === category.group_name\"\n (click)=\"handlerChooseCategory($event, category)\">\n <div class=\"mt-[1px] cursor-pointer text-[18px]\">\n {{ category.iconGroup }}\n </div>\n </div>\n }\n </div>\n </div>\n <div class=\"mx-[10px] mb-[12px]\">\n <libs_ui-components-inputs-search\n [searchConfig]=\"{\n placeholder: 'i18n_search',\n }\"\n [debounceTime]=\"0\"\n (outSearch)=\"handlerSearchEmoji($event)\" />\n </div>\n <div class=\"h-full w-full relative\">\n <div\n #elementViewEmoji\n class=\"w-full h-full px-[10px] absolute\"\n LibsUiComponentsScrollOverlayDirective\n (outScrollBottom)=\"handlerScrollBottom()\">\n @if (dataEmojiView().dataView.length) {\n @for (item of dataEmojiView().dataView; track $index) {\n <!-- n\u1EBFu sau c\u00F3 y\u00EAu c\u00E2u hover hi\u1EC3n th\u1ECB tooltio th\u00EC b\u1ECF [ignoreShowPopover]=\"true\" -->\n <span\n LibsUiComponentsPopoverDirective\n [ignoreShowPopover]=\"true\"\n [config]=\"{ content: item.description, zIndex: (zIndex() || 1200) + 5 }\"\n class=\"cursor-pointer flex shrink-0 h-fit m-[2px] float-left\"\n (click)=\"handlerAddEmoji(item)\">\n {{ item.emoji }}\n </span>\n }\n } @else {\n <div class=\"libs-ui-font-h5r text-[#9ca2ad] h-full w-full items-center justify-center\">\n {{ 'i18n_no_result' | translate }}\n </div>\n }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
|
|
95
108
|
}], ctorParameters: () => [] });
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUFpRCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVdEUsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDWCxnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLGFB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QUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNJLENBQUM7d0dBbEdVLDhCQUE4Qjs0RkFBOUIsOEJBQThCLDA0Q0NqQjNDLHV6RkEyRUEsMkNENURZLGVBQWUsNEZBQUUscUNBQXFDLG9WQUFFLGdDQUFnQyxvZ0JBQUUsc0NBQXNDOzs0RkFFL0gsOEJBQThCO2tCQVIxQyxTQUFTOytCQUVFLDBCQUEwQixjQUV4QixJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxlQUFlLEVBQUUscUNBQXFDLEVBQUUsZ0NBQWdDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIElQb3BvdmVyT3ZlcmxheSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBkZWxldGVVbmljb2RlIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBkZWZhdWx0Q29uZmlnUG9wb3ZlciwgZW1vamlzIH0gZnJvbSAnLi9kZWZpbmVzL2Vtb2ppLmRlZmluZSc7XG5pbXBvcnQgeyBJRW1vamksIElHcm91cEVtb2ppIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Vtb2ppLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZW1vamknLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1vamkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1NlYXJjaENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBmdW5jdGlvbnNDb250cm9sID0gc2lnbmFsPElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJvdGVjdGVkIGVtb2ppc0NhdGVnb3JpZXMgPSBzaWduYWw8QXJyYXk8SUdyb3VwRW1vamk+PihuZXcgQXJyYXk8SUdyb3VwRW1vamk+KCkpO1xuICBwcm90ZWN0ZWQgZmlsdGVyID0gc2lnbmFsKHsgcGFnZTogMCwga2V5U2VhcmNoOiAnJywgZ3JvdXBTZWxlY3RlZDogJ1NtaWxleXMgJiBFbW90aW9uJywgcGVyUGFnZTogMTcwIH0pO1xuICBwcm90ZWN0ZWQgZGF0YUVtb2ppVmlldyA9IHNpZ25hbDx7IGRhdGFWaWV3OiBBcnJheTxJRW1vamk+OyBhbGxEYXRhOiBBcnJheTxJRW1vamk+IH0+KHsgZGF0YVZpZXc6IFtdLCBhbGxEYXRhOiBbXSB9KTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGNvbmZpZ1BvcG92ZXIgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXksIElQb3BvdmVyT3ZlcmxheSB8IHVuZGVmaW5lZD4oZGVmYXVsdENvbmZpZ1BvcG92ZXIoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gKHZhbHVlID8gdmFsdWUgOiBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpKSB9KTtcbiAgcmVhZG9ubHkgaXNOZ0NvbnRlbnQgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZD4oMCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMCB9KTtcbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXJQb3NpdGlvbiA9IGlucHV0PCdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBjbGFzc1BvcHVwID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCd3LVsyOTBweF0gaC1bMjQ1cHhdJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAndy1bMjkwcHhdIGgtWzI0NXB4XScgfSk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWwpID0+IHZhbCA/PyAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJY29uSW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGlicy11aS1pY29uLWFkZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2xpYnMtdWktaWNvbi1hZGQnIH0pO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dEV2ZW50RW1vamkgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyogVklFVyBDSElMRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVtb2ppUmVmID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2Vtb2ppUmVmJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFZpZXdFbW9qaSA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2VsZW1lbnRWaWV3RW1vamknKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmVtb2ppc0NhdGVnb3JpZXMuc2V0KFxuICAgICAgZW1vamlzKCkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBpY29uR3JvdXA6IGl0ZW0uZW1vamlzWzBdLmVtb2ppLFxuICAgICAgICBlbW9qaXM6IG5ldyBBcnJheTxJRW1vamk+KCksXG4gICAgICB9KSlcbiAgICApO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnpJbmRleCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkuekluZGV4ID0gdGhpcy56SW5kZXgoKSArIDU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCkgJiYgdGhpcy5jb25maWdQb3BvdmVyKCkucG9zaXRpb24pIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSBhcyBhbnkpLnBvc2l0aW9uLm1vZGUgPSB0aGlzLm1vZGVQb3BvdmVyUG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSkge1xuICAgICAgICB0aGlzLmNvbmZpZ1BvcG92ZXIoKS50ZW1wbGF0ZSA9IHRoaXMuZW1vamlSZWYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGRFbW9qaShkYXRhOiBJRW1vamkpIHtcbiAgICB0aGlzLm91dEV2ZW50RW1vamkuZW1pdChkYXRhLmVtb2ppKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbChldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25zQ29udHJvbC5zZXQoZXZlbnQpO1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnNDb250cm9sKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNob29zZUNhdGVnb3J5KGV2ZW50OiBFdmVudCwgY2F0ZWdvcnk6IElHcm91cEVtb2ppKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBwYWdlOiAwLCBncm91cFNlbGVjdGVkOiBjYXRlZ29yeS5ncm91cF9uYW1lIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gICAgdGhpcy5lbGVtZW50Vmlld0Vtb2ppKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHsgdG9wOiAwIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWFyY2hFbW9qaShrZXlTZWFyY2g6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwga2V5U2VhcmNoOiBrZXlTZWFyY2gudHJpbSgpIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gICAgdGhpcy5lbGVtZW50Vmlld0Vtb2ppKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHsgdG9wOiAwIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oKSB7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBwYWdlOiBkYXRhLnBhZ2UgKyAxIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFWaWV3KCkge1xuICAgIGNvbnN0IGVtb2ppQnlHcm91cCA9IGVtb2ppcygpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZ3JvdXBfbmFtZSA9PT0gdGhpcy5maWx0ZXIoKS5ncm91cFNlbGVjdGVkKSBhcyBJR3JvdXBFbW9qaTtcbiAgICBjb25zdCBlbW9qaU1hdGNoID0gZW1vamlCeUdyb3VwLmVtb2ppcy5maWx0ZXIoKGl0ZW0pID0+IGRlbGV0ZVVuaWNvZGUoaXRlbS5kZXNjcmlwdGlvbikudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhkZWxldGVVbmljb2RlKHRoaXMuZmlsdGVyKCkua2V5U2VhcmNoLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSk7XG5cbiAgICBjb25zdCB7IHBhZ2UsIHBlclBhZ2UgfSA9IHRoaXMuZmlsdGVyKCk7XG4gICAgY29uc3QgZGF0YUluUGFnZSA9IGVtb2ppTWF0Y2guc2xpY2UocGFnZSAqIHBlclBhZ2UsIHBhZ2UgKiBwZXJQYWdlICsgcGVyUGFnZSk7XG5cbiAgICB0aGlzLmRhdGFFbW9qaVZpZXcudXBkYXRlKChpdGVtKSA9PiAoeyAuLi5pdGVtLCBhbGxEYXRhOiBlbW9qaU1hdGNoLCBkYXRhVmlldzogcGFnZSA/IFsuLi5pdGVtLmRhdGFWaWV3LCAuLi5kYXRhSW5QYWdlXSA6IGRhdGFJblBhZ2UgfSkpO1xuICB9XG59XG4iLCI8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKVwiXG4gIFtjb25maWddPVwie1xuICAgIGNvbnRlbnQ6ICdpMThuX3RleHRfZW1vamknLFxuICAgIHpJbmRleDogKHpJbmRleCgpIHx8IDEyMDApICsgNCxcbiAgfVwiXG4gIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgdHlwZT1cIm90aGVyXCJcbiAgICBtb2RlPVwiY2xpY2stdG9nZ2xlXCJcbiAgICBjbGFzcz1cImZsZXhcIlxuICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgIFtjb25maWddPVwiY29uZmlnUG9wb3ZlcigpXCJcbiAgICBbZGVidWdJZF09XCInZGVidWcgaWNvbiBlbW9paidcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8aSBjbGFzcz1cImJlZm9yZTohdGV4dC1bMTZweF0gYmVmb3JlOiF0ZXh0LVsjNmE3MzgzXSB7eyBjbGFzc0ljb25JbmNsdWRlKCkgfX1cIj48L2k+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZW1vamlSZWY+XG4gIDxkaXYgY2xhc3M9XCJweS1bMTBweF0gZmxleCBmbGV4LWNvbCB7eyBjbGFzc1BvcHVwKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImZsZXhcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZT5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZW1vamlzQ2F0ZWdvcmllcygpOyB0cmFjayBjYXRlZ29yeSkge1xuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZ3JvdyBwLVs0cHhdIHJvdW5kZWQtWzRweF0gYmctWyNmZmZmZmZdIGxpYnMtdWktYmctbGlzdC1ob3ZlclwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1iZy1saXN0LWFjdGl2ZV09XCJmaWx0ZXIoKS5ncm91cFNlbGVjdGVkID09PSBjYXRlZ29yeS5ncm91cF9uYW1lXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoJGV2ZW50LCBjYXRlZ29yeSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bMXB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxOHB4XVwiPlxuICAgICAgICAgICAgICB7eyBjYXRlZ29yeS5pY29uR3JvdXAgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoXG4gICAgICAgIFtzZWFyY2hDb25maWddPVwie1xuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnaTE4bl9zZWFyY2gnLFxuICAgICAgICB9XCJcbiAgICAgICAgW2RlYm91bmNlVGltZV09XCIwXCJcbiAgICAgICAgKG91dFNlYXJjaCk9XCJoYW5kbGVyU2VhcmNoRW1vamkoJGV2ZW50KVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2VsZW1lbnRWaWV3RW1vamlcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHB4LVsxMHB4XSBhYnNvbHV0ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgpXCI+XG4gICAgICAgIEBpZiAoZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDwhLS0gbuG6v3Ugc2F1IGPDsyB5w6p1IGPDonUgaG92ZXIgaGnhu4NuIHRo4buLIHRvb2x0aW8gdGjDrCBi4buPIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCIgLS0+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBpdGVtLmRlc2NyaXB0aW9uLCB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDUgfVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZmxleCBzaHJpbmstMCBoLWZpdCBtLVsycHhdIGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckFkZEVtb2ppKGl0ZW0pXCI+XG4gICAgICAgICAgICAgIHt7IGl0ZW0uZW1vamkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyM5Y2EyYWRdIGgtZnVsbCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICB7eyAnaTE4bl9ub19yZXN1bHQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUFpRCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFFdEU7OztHQUdHO0FBU0gsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDWCxnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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QUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTlFLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0ksQ0FBQzt3R0FsSFUsOEJBQThCOzRGQUE5Qiw4QkFBOEIsMDRDQ3JCM0MsdXpGQTJFQSwyQ0R4RFksZUFBZSw0RkFBRSxxQ0FBcUMsb1ZBQUUsZ0NBQWdDLG9nQkFBRSxzQ0FBc0M7OzRGQUUvSCw4QkFBOEI7a0JBUjFDLFNBQVM7K0JBRUUsMEJBQTBCLGNBRXhCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxxQ0FBcUMsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVBvcG92ZXJPdmVybGF5LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IGRlbGV0ZVVuaWNvZGUgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlZmF1bHRDb25maWdQb3BvdmVyLCBlbW9qaXMgfSBmcm9tICcuL2RlZmluZXMvZW1vamkuZGVmaW5lJztcbmltcG9ydCB7IElFbW9qaSwgSUdyb3VwRW1vamkgfSBmcm9tICcuL2ludGVyZmFjZXMvZW1vamkuaW50ZXJmYWNlJztcbi8qKlxuICogQ29tcG9uZW50IGNo4buNbiBFbW9qaSAoRW1vamkgUGlja2VyKSB24bubaSB0w61uaCBuxINuZyB0w6xtIGtp4bq/bSB2w6AgcGjDom4gbG/huqFpXG4gKiBI4buXIHRy4bujIGhp4buDbiB0aOG7iyB0cm9uZyBQb3BvdmVyIGhvw6BuIGNo4buJbmggduG7m2kgbGF6eSBsb2FkaW5nIGRhbmggc8OhY2ggZW1vamlcbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWVtb2ppJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Vtb2ppLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZV0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgZnVuY3Rpb25zQ29udHJvbCA9IHNpZ25hbDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBlbW9qaXNDYXRlZ29yaWVzID0gc2lnbmFsPEFycmF5PElHcm91cEVtb2ppPj4obmV3IEFycmF5PElHcm91cEVtb2ppPigpKTtcbiAgcHJvdGVjdGVkIGZpbHRlciA9IHNpZ25hbCh7IHBhZ2U6IDAsIGtleVNlYXJjaDogJycsIGdyb3VwU2VsZWN0ZWQ6ICdTbWlsZXlzICYgRW1vdGlvbicsIHBlclBhZ2U6IDE3MCB9KTtcbiAgcHJvdGVjdGVkIGRhdGFFbW9qaVZpZXcgPSBzaWduYWw8eyBkYXRhVmlldzogQXJyYXk8SUVtb2ppPjsgYWxsRGF0YTogQXJyYXk8SUVtb2ppPiB9Pih7IGRhdGFWaWV3OiBbXSwgYWxsRGF0YTogW10gfSk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICAvKiogQ+G6pXUgaMOsbmggb3ZlcmxheSBjaG8gUG9wb3ZlciBjaOG7qWEgRW1vamkgUGlja2VyICovXG4gIHJlYWRvbmx5IGNvbmZpZ1BvcG92ZXIgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXksIElQb3BvdmVyT3ZlcmxheSB8IHVuZGVmaW5lZD4oZGVmYXVsdENvbmZpZ1BvcG92ZXIoKSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gKHZhbHVlID8gdmFsdWUgOiBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpKSB9KTtcblxuICAvKiogU+G7rSBk4bulbmcgbmctY29udGVudCBsw6BtIHRyaWdnZXIgdGhheSB2w6wgaWNvbiBt4bq3YyDEkeG7i25oICovXG4gIHJlYWRvbmx5IGlzTmdDb250ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiogR2nDoSB0cuG7iyBaLWluZGV4IGNobyBwb3B1cC4gVOG7sSDEkeG7mW5nIG9mZnNldCArNSBjaG8gY29udGVudC4gKi9cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDAgfSk7XG5cbiAgLyoqIENo4bq/IMSR4buZIGPEg24gbOG7gSBjaG8gUG9wb3ZlciAoc3RhcnQgfCBjZW50ZXIgfCBlbmQpICovXG4gIHJlYWRvbmx5IG1vZGVQb3BvdmVyUG9zaXRpb24gPSBpbnB1dDwnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8IHVuZGVmaW5lZD4oKTtcblxuICAvKiogQ1NTIGNsYXNzIGNobyBjb250YWluZXIgY+G7p2EgcG9wdXAgY2jhu41uIGVtb2ppICovXG4gIHJlYWRvbmx5IGNsYXNzUG9wdXAgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ3ctWzI5MHB4XSBoLVsyNDVweF0nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICd3LVsyOTBweF0gaC1bMjQ1cHhdJyB9KTtcblxuICAvKiogQ1NTIGNsYXNzIGLhu5Ugc3VuZyBjaG8gdHJpZ2dlciBjb250YWluZXIgKi9cbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuXG4gIC8qKiBDU1MgY2xhc3MgY2hvIGljb24gdHJpZ2dlciAobeG6t2MgxJHhu4tuaDogbGlicy11aS1pY29uLWFkZCkgKi9cbiAgcmVhZG9ubHkgY2xhc3NJY29uSW5jbHVkZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignbGlicy11aS1pY29uLWFkZCcsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gJ2xpYnMtdWktaWNvbi1hZGQnIH0pO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIC8qKiBFdmVudCBlbWl0IGtoaSBuZ8aw4budaSBkw7luZyBjaOG7jW4gbeG7mXQgZW1vamkuIFRy4bqjIHbhu4Ega8O9IHThu7EgZW1vamkuICovXG4gIHJlYWRvbmx5IG91dEV2ZW50RW1vamkgPSBvdXRwdXQ8c3RyaW5nPigpO1xuXG4gIC8qKiBFbWl0IGPDoWMgZnVuY3Rpb25zIMSRaeG7gXUga2hp4buDbiBQb3BvdmVyIChzaG93L3JlbW92ZSkgKi9cbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIC8qIFZJRVcgQ0hJTEQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbW9qaVJlZiA9IHZpZXdDaGlsZDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbW9qaVJlZicpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRWaWV3RW1vamkgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCdlbGVtZW50Vmlld0Vtb2ppJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5lbW9qaXNDYXRlZ29yaWVzLnNldChcbiAgICAgIGVtb2ppcygpLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgaWNvbkdyb3VwOiBpdGVtLmVtb2ppc1swXS5lbW9qaSxcbiAgICAgICAgZW1vamlzOiBuZXcgQXJyYXk8SUVtb2ppPigpLFxuICAgICAgfSkpXG4gICAgKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy56SW5kZXgoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29uZmlnUG9wb3ZlcigpLnpJbmRleCA9IHRoaXMuekluZGV4KCkgKyA1O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubW9kZVBvcG92ZXJQb3NpdGlvbigpICYmIHRoaXMuY29uZmlnUG9wb3ZlcigpLnBvc2l0aW9uKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAodGhpcy5jb25maWdQb3BvdmVyKCkgYXMgYW55KS5wb3NpdGlvbi5tb2RlID0gdGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jb25maWdQb3BvdmVyKCkpIHtcbiAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkudGVtcGxhdGUgPSB0aGlzLmVtb2ppUmVmKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgLyogRlVOQ1RJT05TICovXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQWRkRW1vamkoZGF0YTogSUVtb2ppKSB7XG4gICAgdGhpcy5vdXRFdmVudEVtb2ppLmVtaXQoZGF0YS5lbW9qaSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmZ1bmN0aW9uc0NvbnRyb2wuc2V0KGV2ZW50KTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zQ29udHJvbCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaG9vc2VDYXRlZ29yeShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBJR3JvdXBFbW9qaSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwgZ3JvdXBTZWxlY3RlZDogY2F0ZWdvcnkuZ3JvdXBfbmFtZSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VhcmNoRW1vamkoa2V5U2VhcmNoOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZpbHRlci51cGRhdGUoKGRhdGEpID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGtleVNlYXJjaDoga2V5U2VhcmNoLnRyaW0oKSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICAgIHRoaXMuZWxlbWVudFZpZXdFbW9qaSgpPy5uYXRpdmVFbGVtZW50LnNjcm9sbCh7IHRvcDogMCB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2Nyb2xsQm90dG9tKCkge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogZGF0YS5wYWdlICsgMSB9KSk7XG4gICAgdGhpcy5nZXREYXRhVmlldygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREYXRhVmlldygpIHtcbiAgICBjb25zdCBlbW9qaUJ5R3JvdXAgPSBlbW9qaXMoKS5maW5kKChpdGVtKSA9PiBpdGVtLmdyb3VwX25hbWUgPT09IHRoaXMuZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCkgYXMgSUdyb3VwRW1vamk7XG4gICAgY29uc3QgZW1vamlNYXRjaCA9IGVtb2ppQnlHcm91cC5lbW9qaXMuZmlsdGVyKChpdGVtKSA9PiBkZWxldGVVbmljb2RlKGl0ZW0uZGVzY3JpcHRpb24pLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmZpbHRlcigpLmtleVNlYXJjaC50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuXG4gICAgY29uc3QgeyBwYWdlLCBwZXJQYWdlIH0gPSB0aGlzLmZpbHRlcigpO1xuICAgIGNvbnN0IGRhdGFJblBhZ2UgPSBlbW9qaU1hdGNoLnNsaWNlKHBhZ2UgKiBwZXJQYWdlLCBwYWdlICogcGVyUGFnZSArIHBlclBhZ2UpO1xuXG4gICAgdGhpcy5kYXRhRW1vamlWaWV3LnVwZGF0ZSgoaXRlbSkgPT4gKHsgLi4uaXRlbSwgYWxsRGF0YTogZW1vamlNYXRjaCwgZGF0YVZpZXc6IHBhZ2UgPyBbLi4uaXRlbS5kYXRhVmlldywgLi4uZGF0YUluUGFnZV0gOiBkYXRhSW5QYWdlIH0pKTtcbiAgfVxufVxuIiwiPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICBbY29uZmlnXT1cIntcbiAgICBjb250ZW50OiAnaTE4bl90ZXh0X2Vtb2ppJyxcbiAgICB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDQsXG4gIH1cIlxuICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgIHR5cGU9XCJvdGhlclwiXG4gICAgbW9kZT1cImNsaWNrLXRvZ2dsZVwiXG4gICAgY2xhc3M9XCJmbGV4XCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1BvcG92ZXIoKVwiXG4gICAgW2RlYnVnSWRdPVwiJ2RlYnVnIGljb24gZW1vaWonXCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gICAgQGlmICghaXNOZ0NvbnRlbnQoKSkge1xuICAgICAgPGkgY2xhc3M9XCJiZWZvcmU6IXRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bIzZhNzM4M10ge3sgY2xhc3NJY29uSW5jbHVkZSgpIH19XCI+PC9pPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG48bmctdGVtcGxhdGUgI2Vtb2ppUmVmPlxuICA8ZGl2IGNsYXNzPVwicHktWzEwcHhdIGZsZXggZmxleC1jb2wge3sgY2xhc3NQb3B1cCgpIH19XCI+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJmbGV4XCJcbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmU+XG4gICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGVtb2ppc0NhdGVnb3JpZXMoKTsgdHJhY2sgY2F0ZWdvcnkpIHtcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImdyb3cgcC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjZmZmZmZmXSBsaWJzLXVpLWJnLWxpc3QtaG92ZXJcIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktYmctbGlzdC1hY3RpdmVdPVwiZmlsdGVyKCkuZ3JvdXBTZWxlY3RlZCA9PT0gY2F0ZWdvcnkuZ3JvdXBfbmFtZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNob29zZUNhdGVnb3J5KCRldmVudCwgY2F0ZWdvcnkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtWzFweF0gY3Vyc29yLXBvaW50ZXIgdGV4dC1bMThweF1cIj5cbiAgICAgICAgICAgICAge3sgY2F0ZWdvcnkuaWNvbkdyb3VwIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXNlYXJjaFxuICAgICAgICBbc2VhcmNoQ29uZmlnXT1cIntcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ2kxOG5fc2VhcmNoJyxcbiAgICAgICAgfVwiXG4gICAgICAgIFtkZWJvdW5jZVRpbWVdPVwiMFwiXG4gICAgICAgIChvdXRTZWFyY2gpPVwiaGFuZGxlclNlYXJjaEVtb2ppKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgdy1mdWxsIHJlbGF0aXZlXCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNlbGVtZW50Vmlld0Vtb2ppXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbCBweC1bMTBweF0gYWJzb2x1dGVcIlxuICAgICAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgICAgICAob3V0U2Nyb2xsQm90dG9tKT1cImhhbmRsZXJTY3JvbGxCb3R0b20oKVwiPlxuICAgICAgICBAaWYgKGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldy5sZW5ndGgpIHtcbiAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGFFbW9qaVZpZXcoKS5kYXRhVmlldzsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8IS0tIG7hur91IHNhdSBjw7MgecOqdSBjw6J1IGhvdmVyIGhp4buDbiB0aOG7iyB0b29sdGlvIHRow6wgYuG7jyBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiIC0tPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgICAgICAgW2lnbm9yZVNob3dQb3BvdmVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogaXRlbS5kZXNjcmlwdGlvbiwgekluZGV4OiAoekluZGV4KCkgfHwgMTIwMCkgKyA1IH1cIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZsZXggc2hyaW5rLTAgaC1maXQgbS1bMnB4XSBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJBZGRFbW9qaShpdGVtKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmVtb2ppIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjOWNhMmFkXSBoLWZ1bGwgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAge3sgJ2kxOG5fbm9fcmVzdWx0JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBUaMO0bmcgdGluIG5ow7NtIEVtb2ppICovXG5leHBvcnQgaW50ZXJmYWNlIElHcm91cEVtb2ppIHtcbiAgLyoqIFTDqm4gbmjDs20gKHZkOiBTbWlsZXlzICYgRW1vdGlvbikgKi9cbiAgZ3JvdXBfbmFtZTogc3RyaW5nO1xuICAvKiogRGFuaCBzw6FjaCBlbW9qaSB0cm9uZyBuaMOzbSAqL1xuICBlbW9qaXM6IEFycmF5PElFbW9qaT47XG4gIC8qKiBLw70gdOG7sSDEkeG6oWkgZGnhu4duIGNobyBuaMOzbSAodGjGsOG7nW5nIGzDoCBlbW9qaSDEkeG6p3UgdGnDqm4pICovXG4gIGljb25Hcm91cD86IHN0cmluZztcbn1cblxuLyoqIENoaSB0aeG6v3QgbeG7mXQgRW1vamkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUVtb2ppIHtcbiAgLyoqIEvDvSB04buxIGVtb2ppIHRo4buxYyB04bq/ICovXG4gIGVtb2ppOiBzdHJpbmc7XG4gIC8qKiBNw7QgdOG6oyBlbW9qaSAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogRGFuaCBt4bulYyBj4bunYSBlbW9qaSAqL1xuICBjYXRlZ29yeTogc3RyaW5nO1xuICAvKiogVHLhuqFuZyB0aMOhaSBoaeG7g24gdGjhu4sgKi9cbiAgZGlzcGxheT86IGJvb2xlYW47XG59XG4iXX0=
|
|
@@ -1805,6 +1805,10 @@ const emojis = () => [
|
|
|
1805
1805
|
},
|
|
1806
1806
|
];
|
|
1807
1807
|
|
|
1808
|
+
/**
|
|
1809
|
+
* Component chọn Emoji (Emoji Picker) với tính năng tìm kiếm và phân loại
|
|
1810
|
+
* Hỗ trợ hiển thị trong Popover hoàn chỉnh với lazy loading danh sách emoji
|
|
1811
|
+
*/
|
|
1808
1812
|
class LibsUiComponentsEmojiComponent {
|
|
1809
1813
|
// #region PROPERTY
|
|
1810
1814
|
functionsControl = signal(undefined);
|
|
@@ -1812,15 +1816,24 @@ class LibsUiComponentsEmojiComponent {
|
|
|
1812
1816
|
filter = signal({ page: 0, keySearch: '', groupSelected: 'Smileys & Emotion', perPage: 170 });
|
|
1813
1817
|
dataEmojiView = signal({ dataView: [], allData: [] });
|
|
1814
1818
|
// #region INPUT
|
|
1819
|
+
/** Cấu hình overlay cho Popover chứa Emoji Picker */
|
|
1815
1820
|
configPopover = input(defaultConfigPopover(), { transform: (value) => (value ? value : defaultConfigPopover()) });
|
|
1821
|
+
/** Sử dụng ng-content làm trigger thay vì icon mặc định */
|
|
1816
1822
|
isNgContent = input();
|
|
1823
|
+
/** Giá trị Z-index cho popup. Tự động offset +5 cho content. */
|
|
1817
1824
|
zIndex = input(0, { transform: (value) => value ?? 0 });
|
|
1825
|
+
/** Chế độ căn lề cho Popover (start | center | end) */
|
|
1818
1826
|
modePopoverPosition = input();
|
|
1827
|
+
/** CSS class cho container của popup chọn emoji */
|
|
1819
1828
|
classPopup = input('w-[290px] h-[245px]', { transform: (val) => val ?? 'w-[290px] h-[245px]' });
|
|
1829
|
+
/** CSS class bổ sung cho trigger container */
|
|
1820
1830
|
classInclude = input('', { transform: (val) => val ?? '' });
|
|
1831
|
+
/** CSS class cho icon trigger (mặc định: libs-ui-icon-add) */
|
|
1821
1832
|
classIconInclude = input('libs-ui-icon-add', { transform: (val) => val ?? 'libs-ui-icon-add' });
|
|
1822
1833
|
// #region OUTPUT
|
|
1834
|
+
/** Event emit khi người dùng chọn một emoji. Trả về ký tự emoji. */
|
|
1823
1835
|
outEventEmoji = output();
|
|
1836
|
+
/** Emit các functions điều khiển Popover (show/remove) */
|
|
1824
1837
|
outFunctionsControl = output();
|
|
1825
1838
|
/* VIEW CHILD */
|
|
1826
1839
|
emojiRef = viewChild('emojiRef');
|