@libs-ui/components-inputs-emoji 0.2.306-4 → 0.2.307-0

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.
@@ -9,28 +9,29 @@ import * as i0 from "@angular/core";
9
9
  import * as i1 from "@ngx-translate/core";
10
10
  export class LibsUiComponentsEmojiComponent {
11
11
  // #region PROPERTY
12
+ functionsControl = signal(undefined);
12
13
  emojisCategories = signal(new Array());
13
14
  filter = signal({ page: 0, keySearch: '', groupSelected: 'Smileys & Emotion', perPage: 170 });
14
15
  dataEmojiView = signal({ dataView: [], allData: [] });
15
16
  // #region INPUT
16
- configPopover = input(defaultConfigPopover(), { transform: value => value ? value : defaultConfigPopover() });
17
+ configPopover = input(defaultConfigPopover(), { transform: (value) => (value ? value : defaultConfigPopover()) });
17
18
  isNgContent = input();
18
- zIndex = input(0, { transform: value => value ?? 0 });
19
+ zIndex = input(0, { transform: (value) => value ?? 0 });
19
20
  modePopoverPosition = input();
20
- classPopup = input('w-[290px] h-[245px]', { transform: val => val ?? 'w-[290px] h-[245px]' });
21
- classInclude = input('', { transform: val => val ?? '' });
22
- classIconInclude = input('', { transform: val => val ?? '' });
21
+ classPopup = input('w-[290px] h-[245px]', { transform: (val) => val ?? 'w-[290px] h-[245px]' });
22
+ classInclude = input('', { transform: (val) => val ?? '' });
23
+ classIconInclude = input('', { transform: (val) => val ?? '' });
23
24
  // #region OUTPUT
24
25
  outEventEmoji = output();
25
- moFunctionsControl = output();
26
+ outFunctionsControl = output();
26
27
  /* VIEW CHILD */
27
28
  emojiRef = viewChild('emojiRef');
28
29
  elementViewEmoji = viewChild('elementViewEmoji');
29
30
  constructor() {
30
- this.emojisCategories.set(emojis().map(item => ({
31
+ this.emojisCategories.set(emojis().map((item) => ({
31
32
  ...item,
32
33
  iconGroup: item.emojis[0].emoji,
33
- emojis: new Array()
34
+ emojis: new Array(),
34
35
  })));
35
36
  effect(() => {
36
37
  if (this.zIndex()) {
@@ -57,40 +58,39 @@ export class LibsUiComponentsEmojiComponent {
57
58
  this.outEventEmoji.emit(data.emoji);
58
59
  }
59
60
  async handlerFunctionsControl(event) {
60
- this.moFunctionsControl.emit(event);
61
+ this.functionsControl.set(event);
62
+ this.outFunctionsControl.emit(event);
63
+ }
64
+ get FunctionsControl() {
65
+ return this.functionsControl();
61
66
  }
62
67
  async handlerChooseCategory(event, category) {
63
68
  event.stopPropagation();
64
- this.filter.update(data => ({ ...data, page: 0, groupSelected: category.group_name }));
69
+ this.filter.update((data) => ({ ...data, page: 0, groupSelected: category.group_name }));
65
70
  this.getDataView();
66
71
  this.elementViewEmoji()?.nativeElement.scroll({ top: 0 });
67
72
  }
68
73
  async handlerSearchEmoji(keySearch) {
69
- this.filter.update(data => ({ ...data, page: 0, keySearch: keySearch.trim() }));
74
+ this.filter.update((data) => ({ ...data, page: 0, keySearch: keySearch.trim() }));
70
75
  this.getDataView();
71
76
  this.elementViewEmoji()?.nativeElement.scroll({ top: 0 });
72
77
  }
73
78
  handlerScrollBottom() {
74
- this.filter.update(data => ({ ...data, page: data.page + 1, }));
79
+ this.filter.update((data) => ({ ...data, page: data.page + 1 }));
75
80
  this.getDataView();
76
81
  }
77
82
  getDataView() {
78
- const emojiByGroup = emojis().find(item => item.group_name === this.filter().groupSelected);
79
- const emojiMatch = emojiByGroup.emojis.filter(item => deleteUnicode(item.description).toLocaleLowerCase().includes(deleteUnicode(this.filter().keySearch.toLocaleLowerCase())));
83
+ const emojiByGroup = emojis().find((item) => item.group_name === this.filter().groupSelected);
84
+ const emojiMatch = emojiByGroup.emojis.filter((item) => deleteUnicode(item.description).toLocaleLowerCase().includes(deleteUnicode(this.filter().keySearch.toLocaleLowerCase())));
80
85
  const { page, perPage } = this.filter();
81
86
  const dataInPage = emojiMatch.slice(page * perPage, page * perPage + perPage);
82
- this.dataEmojiView.update(item => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
87
+ this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
83
88
  }
84
89
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
85
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", moFunctionsControl: "moFunctionsControl" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex:(zIndex() || 1200) + 4\n }\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover type='other'\n mode='click-toggle'\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class='libs-ui-icon-add before:!text-[16px] {{ classIconInclude() }}'>\n </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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category;) {\n <div class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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 [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 #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 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 }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
90
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, 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 [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"libs-ui-icon-add before:!text-[16px] {{ 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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
86
91
  }
87
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
88
93
  type: Component,
89
- args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
90
- TranslateModule,
91
- LibsUiComponentsInputsSearchComponent,
92
- LibsUiComponentsPopoverComponent,
93
- LibsUiComponentsScrollOverlayDirective
94
- ], template: "<libs_ui-components-popover [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex:(zIndex() || 1200) + 4\n }\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover type='other'\n mode='click-toggle'\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class='libs-ui-icon-add before:!text-[16px] {{ classIconInclude() }}'>\n </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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category;) {\n <div class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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 [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 #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 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 }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
94
+ 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 [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"libs-ui-icon-add before:!text-[16px] {{ 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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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
95
  }], ctorParameters: () => [] });
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUFpRCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFldEUsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDVCxnQkFBZ0IsR0FBRyxNQUFNLENBQXFCLElBQUksS0FBSyxFQUFlLENBQUMsQ0FBQztJQUN4RSxNQUFNLEdBQUcsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM5RixhQUFhLEdBQUcsTUFBTSxDQUFzRCxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUs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QUE4QjtrQkFiMUMsU0FBUzsrQkFFRSwwQkFBMEIsY0FFeEIsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDO3dCQUNQLGVBQWU7d0JBQ2YscUNBQXFDO3dCQUNyQyxnQ0FBZ0M7d0JBQ2hDLHNDQUFzQztxQkFDdkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBlZmZlY3QsIEVsZW1lbnRSZWYsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoJztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIElQb3BvdmVyT3ZlcmxheSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNjcm9sbC1vdmVybGF5JztcbmltcG9ydCB7IFRZUEVfVEVNUExBVEVfUkVGIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBkZWxldGVVbmljb2RlIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBkZWZhdWx0Q29uZmlnUG9wb3ZlciwgZW1vamlzIH0gZnJvbSAnLi9kZWZpbmVzL2Vtb2ppLmRlZmluZSc7XG5pbXBvcnQgeyBJRW1vamksIElHcm91cEVtb2ppIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2Vtb2ppLmludGVyZmFjZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtZW1vamknLFxuICB0ZW1wbGF0ZVVybDogJy4vZW1vamkuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1xuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJvdGVjdGVkIGVtb2ppc0NhdGVnb3JpZXMgPSBzaWduYWw8QXJyYXk8SUdyb3VwRW1vamk+PihuZXcgQXJyYXk8SUdyb3VwRW1vamk+KCkpO1xuICBwcm90ZWN0ZWQgZmlsdGVyID0gc2lnbmFsKHsgcGFnZTogMCwga2V5U2VhcmNoOiAnJywgZ3JvdXBTZWxlY3RlZDogJ1NtaWxleXMgJiBFbW90aW9uJywgcGVyUGFnZTogMTcwIH0pO1xuICBwcm90ZWN0ZWQgZGF0YUVtb2ppVmlldyA9IHNpZ25hbDx7IGRhdGFWaWV3OiBBcnJheTxJRW1vamk+LCBhbGxEYXRhOiBBcnJheTxJRW1vamk+IH0+KHsgZGF0YVZpZXc6IFtdLCBhbGxEYXRhOiBbXSB9KTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGNvbmZpZ1BvcG92ZXIgPSBpbnB1dDxJUG9wb3Zlck92ZXJsYXksIElQb3BvdmVyT3ZlcmxheSB8IHVuZGVmaW5lZD4oZGVmYXVsdENvbmZpZ1BvcG92ZXIoKSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8gdmFsdWUgOiBkZWZhdWx0Q29uZmlnUG9wb3ZlcigpIH0pO1xuICByZWFkb25seSBpc05nQ29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigwLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gMCB9KTtcbiAgcmVhZG9ubHkgbW9kZVBvcG92ZXJQb3NpdGlvbiA9IGlucHV0PCdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBjbGFzc1BvcHVwID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCd3LVsyOTBweF0gaC1bMjQ1cHhdJywgeyB0cmFuc2Zvcm06IHZhbCA9PiB2YWwgPz8gJ3ctWzI5MHB4XSBoLVsyNDVweF0nIH0pO1xuICByZWFkb25seSBjbGFzc0luY2x1ZGUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJycsIHsgdHJhbnNmb3JtOiB2YWwgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0ljb25JbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogdmFsID0+IHZhbCA/PyAnJyB9KTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXRFdmVudEVtb2ppID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbW9GdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyogVklFVyBDSElMRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVtb2ppUmVmID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2Vtb2ppUmVmJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFZpZXdFbW9qaSA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2VsZW1lbnRWaWV3RW1vamknKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgKSB7XG4gICAgdGhpcy5lbW9qaXNDYXRlZ29yaWVzLnNldChlbW9qaXMoKS5tYXAoaXRlbSA9PiAoe1xuICAgICAgLi4uaXRlbSxcbiAgICAgIGljb25Hcm91cDogaXRlbS5lbW9qaXNbMF0uZW1vamksXG4gICAgICBlbW9qaXM6IG5ldyBBcnJheTxJRW1vamk+KClcbiAgICB9KSkpO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnpJbmRleCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkuekluZGV4ID0gdGhpcy56SW5kZXgoKSArIDU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCkgJiYgdGhpcy5jb25maWdQb3BvdmVyKCkucG9zaXRpb24pIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSBhcyBhbnkpLnBvc2l0aW9uLm1vZGUgPSB0aGlzLm1vZGVQb3BvdmVyUG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSkge1xuICAgICAgICB0aGlzLmNvbmZpZ1BvcG92ZXIoKS50ZW1wbGF0ZSA9IHRoaXMuZW1vamlSZWYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGRFbW9qaShkYXRhOiBJRW1vamkpIHtcbiAgICB0aGlzLm91dEV2ZW50RW1vamkuZW1pdChkYXRhLmVtb2ppKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbChldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMubW9GdW5jdGlvbnNDb250cm9sLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaG9vc2VDYXRlZ29yeShldmVudDogRXZlbnQsIGNhdGVnb3J5OiBJR3JvdXBFbW9qaSkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZShkYXRhID0+ICh7IC4uLmRhdGEsIHBhZ2U6IDAsIGdyb3VwU2VsZWN0ZWQ6IGNhdGVnb3J5Lmdyb3VwX25hbWUgfSkpO1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgICB0aGlzLmVsZW1lbnRWaWV3RW1vamkoKT8ubmF0aXZlRWxlbWVudC5zY3JvbGwoeyB0b3A6IDAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlclNlYXJjaEVtb2ppKGtleVNlYXJjaDogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwga2V5U2VhcmNoOiBrZXlTZWFyY2gudHJpbSgpIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gICAgdGhpcy5lbGVtZW50Vmlld0Vtb2ppKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHsgdG9wOiAwIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oKSB7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKGRhdGEgPT4gKHsgLi4uZGF0YSwgcGFnZTogZGF0YS5wYWdlICsgMSwgfSkpO1xuICAgIHRoaXMuZ2V0RGF0YVZpZXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YVZpZXcoKSB7XG4gICAgY29uc3QgZW1vamlCeUdyb3VwID0gZW1vamlzKCkuZmluZChpdGVtID0+IGl0ZW0uZ3JvdXBfbmFtZSA9PT0gdGhpcy5maWx0ZXIoKS5ncm91cFNlbGVjdGVkKSBhcyBJR3JvdXBFbW9qaTtcbiAgICBjb25zdCBlbW9qaU1hdGNoID0gZW1vamlCeUdyb3VwLmVtb2ppcy5maWx0ZXIoaXRlbSA9PiBkZWxldGVVbmljb2RlKGl0ZW0uZGVzY3JpcHRpb24pLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoZGVsZXRlVW5pY29kZSh0aGlzLmZpbHRlcigpLmtleVNlYXJjaC50b0xvY2FsZUxvd2VyQ2FzZSgpKSkpO1xuXG4gICAgY29uc3QgeyBwYWdlLCBwZXJQYWdlIH0gPSB0aGlzLmZpbHRlcigpO1xuICAgIGNvbnN0IGRhdGFJblBhZ2UgPSBlbW9qaU1hdGNoLnNsaWNlKHBhZ2UgKiBwZXJQYWdlLCBwYWdlICogcGVyUGFnZSArIHBlclBhZ2UpO1xuXG4gICAgdGhpcy5kYXRhRW1vamlWaWV3LnVwZGF0ZShpdGVtID0+ICh7IC4uLml0ZW0sIGFsbERhdGE6IGVtb2ppTWF0Y2gsIGRhdGFWaWV3OiBwYWdlID8gWy4uLml0ZW0uZGF0YVZpZXcsIC4uLmRhdGFJblBhZ2VdIDogZGF0YUluUGFnZSB9KSk7XG4gIH1cblxufVxuIiwiPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjbGFzc0luY2x1ZGVdPVwiY2xhc3NJbmNsdWRlKClcIlxuICBbY29uZmlnXT1cIntcbiAgICBjb250ZW50OiAnaTE4bl90ZXh0X2Vtb2ppJyxcbiAgICB6SW5kZXg6KHpJbmRleCgpIHx8IDEyMDApICsgNFxuICB9XCJcbiAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2woJGV2ZW50KVwiPlxuICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgdHlwZT0nb3RoZXInXG4gICAgbW9kZT0nY2xpY2stdG9nZ2xlJ1xuICAgIFtpZ25vcmVIaWRkZW5Qb3BvdmVyQ29udGVudFdoZW5Nb3VzZUxlYXZlXT1cInRydWVcIlxuICAgIFtjb25maWddPVwiY29uZmlnUG9wb3ZlcigpXCJcbiAgICBbZGVidWdJZF09XCInZGVidWcgaWNvbiBlbW9paidcIlxuICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICBAaWYgKCFpc05nQ29udGVudCgpKSB7XG4gICAgICA8aSBjbGFzcz0nbGlicy11aS1pY29uLWFkZCBiZWZvcmU6IXRleHQtWzE2cHhdIHt7IGNsYXNzSWNvbkluY2x1ZGUoKSB9fSc+XG4gICAgICA8L2k+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgfVxuICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjxuZy10ZW1wbGF0ZSAjZW1vamlSZWY+XG4gIDxkaXYgY2xhc3M9XCJweS1bMTBweF0gZmxleCBmbGV4LWNvbCB7eyBjbGFzc1BvcHVwKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXggb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGVtb2ppc0NhdGVnb3JpZXMoKTsgdHJhY2sgY2F0ZWdvcnk7KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImdyb3cgcC1bNHB4XSByb3VuZGVkLVs0cHhdIGJnLVsjZmZmZmZmXSBsaWJzLXVpLWJnLWxpc3QtaG92ZXJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJDaG9vc2VDYXRlZ29yeSgkZXZlbnQsIGNhdGVnb3J5KVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LVsxcHhdIGN1cnNvci1wb2ludGVyIHRleHQtWzE4cHhdXCI+XG4gICAgICAgICAgICAgIHt7IGNhdGVnb3J5Lmljb25Hcm91cCB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteC1bMTBweF0gbWItWzEycHhdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1zZWFyY2ggW3NlYXJjaENvbmZpZ109XCJ7XG4gICAgICAgICAgcGxhY2Vob2xkZXI6ICdpMThuX3NlYXJjaCcsXG4gICAgICAgIH1cIlxuICAgICAgICBbZGVib3VuY2VUaW1lXT1cIjBcIlxuICAgICAgICAob3V0U2VhcmNoKT1cImhhbmRsZXJTZWFyY2hFbW9qaSgkZXZlbnQpXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaC1mdWxsIHctZnVsbCByZWxhdGl2ZVwiPlxuICAgICAgPGRpdiAjZWxlbWVudFZpZXdFbW9qaVxuICAgICAgICBjbGFzcz1cInctZnVsbCBoLWZ1bGwgIHB4LVsxMHB4XSBhYnNvbHV0ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgpXCI+XG4gICAgICAgIEBpZiAoZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDwhLS0gbuG6v3Ugc2F1IGPDsyB5w6p1IGPDonUgaG92ZXIgaGnhu4NuIHRo4buLIHRvb2x0aW8gdGjDrCBi4buPIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwie2NvbnRlbnQ6aXRlbS5kZXNjcmlwdGlvbix6SW5kZXg6KHpJbmRleCgpfHwgMTIwMCkrNX1cIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIGZsZXggc2hyaW5rLTAgaC1maXQgbS1bMnB4XSBmbG9hdC1sZWZ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJBZGRFbW9qaShpdGVtKVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLmVtb2ppIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg1ciB0ZXh0LVsjOWNhMmFkXSBoLWZ1bGwgdy1mdWxsIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAge3sgKCAnaTE4bl9ub19yZXN1bHQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvZW1vamkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFlLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEssT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUYsT0FBTyxFQUFpRCxnQ0FBZ0MsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVdEUsTUFBTSxPQUFPLDhCQUE4QjtJQUN6QyxtQkFBbUI7SUFDWCxnQkFBZ0IsR0FBRyxNQUFNLENBQTJDLFNBQVMsQ0FBQyxDQUFDO0lBRTdFLGdCQUFnQixHQUFHLE1BQU0sQ0FBcUIsSUFBSSxLQUFLLEVBQWUsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLGFB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QUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0ksQ0FBQzt3R0FsR1UsOEJBQThCOzRGQUE5Qiw4QkFBOEIsMDRDQ2pCM0MscXBGQXVFQSwyQ0R4RFksZUFBZSw0RkFBRSxxQ0FBcUMsb1ZBQUUsZ0NBQWdDLG9nQkFBRSxzQ0FBc0M7OzRGQUUvSCw4QkFBOEI7a0JBUjFDLFNBQVM7K0JBRUUsMEJBQTBCLGNBRXhCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSxxQ0FBcUMsRUFBRSxnQ0FBZ0MsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNTZWFyY2hDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1zZWFyY2gnO1xuaW1wb3J0IHsgSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVBvcG92ZXJPdmVybGF5LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IGRlbGV0ZVVuaWNvZGUgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGRlZmF1bHRDb25maWdQb3BvdmVyLCBlbW9qaXMgfSBmcm9tICcuL2RlZmluZXMvZW1vamkuZGVmaW5lJztcbmltcG9ydCB7IElFbW9qaSwgSUdyb3VwRW1vamkgfSBmcm9tICcuL2ludGVyZmFjZXMvZW1vamkuaW50ZXJmYWNlJztcbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1lbW9qaScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbW9qaS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBMaWJzVWlDb21wb25lbnRzSW5wdXRzU2VhcmNoQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzRW1vamlDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgLy8gI3JlZ2lvbiBQUk9QRVJUWVxuICBwcml2YXRlIGZ1bmN0aW9uc0NvbnRyb2wgPSBzaWduYWw8SVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgZW1vamlzQ2F0ZWdvcmllcyA9IHNpZ25hbDxBcnJheTxJR3JvdXBFbW9qaT4+KG5ldyBBcnJheTxJR3JvdXBFbW9qaT4oKSk7XG4gIHByb3RlY3RlZCBmaWx0ZXIgPSBzaWduYWwoeyBwYWdlOiAwLCBrZXlTZWFyY2g6ICcnLCBncm91cFNlbGVjdGVkOiAnU21pbGV5cyAmIEVtb3Rpb24nLCBwZXJQYWdlOiAxNzAgfSk7XG4gIHByb3RlY3RlZCBkYXRhRW1vamlWaWV3ID0gc2lnbmFsPHsgZGF0YVZpZXc6IEFycmF5PElFbW9qaT47IGFsbERhdGE6IEFycmF5PElFbW9qaT4gfT4oeyBkYXRhVmlldzogW10sIGFsbERhdGE6IFtdIH0pO1xuXG4gIC8vICNyZWdpb24gSU5QVVRcbiAgcmVhZG9ubHkgY29uZmlnUG9wb3ZlciA9IGlucHV0PElQb3BvdmVyT3ZlcmxheSwgSVBvcG92ZXJPdmVybGF5IHwgdW5kZWZpbmVkPihkZWZhdWx0Q29uZmlnUG9wb3ZlcigpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiAodmFsdWUgPyB2YWx1ZSA6IGRlZmF1bHRDb25maWdQb3BvdmVyKCkpIH0pO1xuICByZWFkb25seSBpc05nQ29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAwIH0pO1xuICByZWFkb25seSBtb2RlUG9wb3ZlclBvc2l0aW9uID0gaW5wdXQ8J3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGNsYXNzUG9wdXAgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ3ctWzI5MHB4XSBoLVsyNDVweF0nLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICd3LVsyOTBweF0gaC1bMjQ1cHhdJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuICByZWFkb25seSBjbGFzc0ljb25JbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/ICcnIH0pO1xuXG4gIC8vICNyZWdpb24gT1VUUFVUXG4gIHJlYWRvbmx5IG91dEV2ZW50RW1vamkgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgLyogVklFVyBDSElMRCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVtb2ppUmVmID0gdmlld0NoaWxkPFRlbXBsYXRlUmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2Vtb2ppUmVmJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFZpZXdFbW9qaSA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPFRZUEVfVEVNUExBVEVfUkVGPj4oJ2VsZW1lbnRWaWV3RW1vamknKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmVtb2ppc0NhdGVnb3JpZXMuc2V0KFxuICAgICAgZW1vamlzKCkubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAuLi5pdGVtLFxuICAgICAgICBpY29uR3JvdXA6IGl0ZW0uZW1vamlzWzBdLmVtb2ppLFxuICAgICAgICBlbW9qaXM6IG5ldyBBcnJheTxJRW1vamk+KCksXG4gICAgICB9KSlcbiAgICApO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnpJbmRleCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb25maWdQb3BvdmVyKCkuekluZGV4ID0gdGhpcy56SW5kZXgoKSArIDU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tb2RlUG9wb3ZlclBvc2l0aW9uKCkgJiYgdGhpcy5jb25maWdQb3BvdmVyKCkucG9zaXRpb24pIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSBhcyBhbnkpLnBvc2l0aW9uLm1vZGUgPSB0aGlzLm1vZGVQb3BvdmVyUG9zaXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZ1BvcG92ZXIoKSkge1xuICAgICAgICB0aGlzLmNvbmZpZ1BvcG92ZXIoKS50ZW1wbGF0ZSA9IHRoaXMuZW1vamlSZWYoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gIH1cblxuICAvKiBGVU5DVElPTlMgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGRFbW9qaShkYXRhOiBJRW1vamkpIHtcbiAgICB0aGlzLm91dEV2ZW50RW1vamkuZW1pdChkYXRhLmVtb2ppKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbChldmVudDogSVBvcG92ZXJGdW5jdGlvbkNvbnRyb2xFdmVudCkge1xuICAgIHRoaXMuZnVuY3Rpb25zQ29udHJvbC5zZXQoZXZlbnQpO1xuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRnVuY3Rpb25zQ29udHJvbCgpOiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mdW5jdGlvbnNDb250cm9sKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckNob29zZUNhdGVnb3J5KGV2ZW50OiBFdmVudCwgY2F0ZWdvcnk6IElHcm91cEVtb2ppKSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBwYWdlOiAwLCBncm91cFNlbGVjdGVkOiBjYXRlZ29yeS5ncm91cF9uYW1lIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gICAgdGhpcy5lbGVtZW50Vmlld0Vtb2ppKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHsgdG9wOiAwIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWFyY2hFbW9qaShrZXlTZWFyY2g6IHN0cmluZykge1xuICAgIHRoaXMuZmlsdGVyLnVwZGF0ZSgoZGF0YSkgPT4gKHsgLi4uZGF0YSwgcGFnZTogMCwga2V5U2VhcmNoOiBrZXlTZWFyY2gudHJpbSgpIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gICAgdGhpcy5lbGVtZW50Vmlld0Vtb2ppKCk/Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHsgdG9wOiAwIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTY3JvbGxCb3R0b20oKSB7XG4gICAgdGhpcy5maWx0ZXIudXBkYXRlKChkYXRhKSA9PiAoeyAuLi5kYXRhLCBwYWdlOiBkYXRhLnBhZ2UgKyAxIH0pKTtcbiAgICB0aGlzLmdldERhdGFWaWV3KCk7XG4gIH1cblxuICBwcml2YXRlIGdldERhdGFWaWV3KCkge1xuICAgIGNvbnN0IGVtb2ppQnlHcm91cCA9IGVtb2ppcygpLmZpbmQoKGl0ZW0pID0+IGl0ZW0uZ3JvdXBfbmFtZSA9PT0gdGhpcy5maWx0ZXIoKS5ncm91cFNlbGVjdGVkKSBhcyBJR3JvdXBFbW9qaTtcbiAgICBjb25zdCBlbW9qaU1hdGNoID0gZW1vamlCeUdyb3VwLmVtb2ppcy5maWx0ZXIoKGl0ZW0pID0+IGRlbGV0ZVVuaWNvZGUoaXRlbS5kZXNjcmlwdGlvbikudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhkZWxldGVVbmljb2RlKHRoaXMuZmlsdGVyKCkua2V5U2VhcmNoLnRvTG9jYWxlTG93ZXJDYXNlKCkpKSk7XG5cbiAgICBjb25zdCB7IHBhZ2UsIHBlclBhZ2UgfSA9IHRoaXMuZmlsdGVyKCk7XG4gICAgY29uc3QgZGF0YUluUGFnZSA9IGVtb2ppTWF0Y2guc2xpY2UocGFnZSAqIHBlclBhZ2UsIHBhZ2UgKiBwZXJQYWdlICsgcGVyUGFnZSk7XG5cbiAgICB0aGlzLmRhdGFFbW9qaVZpZXcudXBkYXRlKChpdGVtKSA9PiAoeyAuLi5pdGVtLCBhbGxEYXRhOiBlbW9qaU1hdGNoLCBkYXRhVmlldzogcGFnZSA/IFsuLi5pdGVtLmRhdGFWaWV3LCAuLi5kYXRhSW5QYWdlXSA6IGRhdGFJblBhZ2UgfSkpO1xuICB9XG59XG4iLCI8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGUoKVwiXG4gIFtjb25maWddPVwie1xuICAgIGNvbnRlbnQ6ICdpMThuX3RleHRfZW1vamknLFxuICAgIHpJbmRleDogKHpJbmRleCgpIHx8IDEyMDApICsgNCxcbiAgfVwiXG4gIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgdHlwZT1cIm90aGVyXCJcbiAgICBtb2RlPVwiY2xpY2stdG9nZ2xlXCJcbiAgICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgICBbY29uZmlnXT1cImNvbmZpZ1BvcG92ZXIoKVwiXG4gICAgW2RlYnVnSWRdPVwiJ2RlYnVnIGljb24gZW1vaWonXCJcbiAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbCgkZXZlbnQpXCI+XG4gICAgQGlmICghaXNOZ0NvbnRlbnQoKSkge1xuICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tYWRkIGJlZm9yZTohdGV4dC1bMTZweF0ge3sgY2xhc3NJY29uSW5jbHVkZSgpIH19XCI+PC9pPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbjwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG48bmctdGVtcGxhdGUgI2Vtb2ppUmVmPlxuICA8ZGl2IGNsYXNzPVwicHktWzEwcHhdIGZsZXggZmxleC1jb2wge3sgY2xhc3NQb3B1cCgpIH19XCI+XG4gICAgPGRpdiBjbGFzcz1cIm14LVsxMHB4XSBtYi1bMTJweF1cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICBAZm9yIChjYXRlZ29yeSBvZiBlbW9qaXNDYXRlZ29yaWVzKCk7IHRyYWNrIGNhdGVnb3J5KSB7XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJncm93IHAtWzRweF0gcm91bmRlZC1bNHB4XSBiZy1bI2ZmZmZmZl0gbGlicy11aS1iZy1saXN0LWhvdmVyXCJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVyQ2hvb3NlQ2F0ZWdvcnkoJGV2ZW50LCBjYXRlZ29yeSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC1bMXB4XSBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxOHB4XVwiPlxuICAgICAgICAgICAgICB7eyBjYXRlZ29yeS5pY29uR3JvdXAgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXgtWzEwcHhdIG1iLVsxMnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtc2VhcmNoXG4gICAgICAgIFtzZWFyY2hDb25maWddPVwie1xuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnaTE4bl9zZWFyY2gnLFxuICAgICAgICB9XCJcbiAgICAgICAgW2RlYm91bmNlVGltZV09XCIwXCJcbiAgICAgICAgKG91dFNlYXJjaCk9XCJoYW5kbGVyU2VhcmNoRW1vamkoJGV2ZW50KVwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImgtZnVsbCB3LWZ1bGwgcmVsYXRpdmVcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgI2VsZW1lbnRWaWV3RW1vamlcbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsIHB4LVsxMHB4XSBhYnNvbHV0ZVwiXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgICAgIChvdXRTY3JvbGxCb3R0b20pPVwiaGFuZGxlclNjcm9sbEJvdHRvbSgpXCI+XG4gICAgICAgIEBpZiAoZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3Lmxlbmd0aCkge1xuICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YUVtb2ppVmlldygpLmRhdGFWaWV3OyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDwhLS0gbuG6v3Ugc2F1IGPDsyB5w6p1IGPDonUgaG92ZXIgaGnhu4NuIHRo4buLIHRvb2x0aW8gdGjDrCBi4buPIFtpZ25vcmVTaG93UG9wb3Zlcl09XCJ0cnVlXCIgLS0+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICAgICAgICBbaWdub3JlU2hvd1BvcG92ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBpdGVtLmRlc2NyaXB0aW9uLCB6SW5kZXg6ICh6SW5kZXgoKSB8fCAxMjAwKSArIDUgfVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZmxleCBzaHJpbmstMCBoLWZpdCBtLVsycHhdIGZsb2F0LWxlZnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckFkZEVtb2ppKGl0ZW0pXCI+XG4gICAgICAgICAgICAgIHt7IGl0ZW0uZW1vamkgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDVyIHRleHQtWyM5Y2EyYWRdIGgtZnVsbCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICB7eyAnaTE4bl9ub19yZXN1bHQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwRW1vamkge1xuICBncm91cF9uYW1lOiBzdHJpbmc7XG4gIGVtb2ppczogQXJyYXk8SUVtb2ppPjtcbiAgaWNvbkdyb3VwPzogc3RyaW5nO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVtb2ppIHtcbiAgZW1vamk6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgZGlzcGxheT86IGJvb2xlYW47XG59Il19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamkuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9lbW9qaS9zcmMvaW50ZXJmYWNlcy9lbW9qaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwRW1vamkge1xuICBncm91cF9uYW1lOiBzdHJpbmc7XG4gIGVtb2ppczogQXJyYXk8SUVtb2ppPjtcbiAgaWNvbkdyb3VwPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbW9qaSB7XG4gIGVtb2ppOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIGRpc3BsYXk/OiBib29sZWFuO1xufVxuIl19
@@ -10,7 +10,7 @@ import { TranslateModule } from '@ngx-translate/core';
10
10
  const defaultConfigPopover = () => ({
11
11
  position: {
12
12
  mode: 'end',
13
- distance: 0
13
+ distance: 0,
14
14
  },
15
15
  direction: 'top',
16
16
  directionDistance: 2,
@@ -18,7 +18,7 @@ const defaultConfigPopover = () => ({
18
18
  ignoreArrow: true,
19
19
  maxWidth: 500,
20
20
  maxHeight: 500,
21
- animationConfig: {}
21
+ animationConfig: {},
22
22
  });
23
23
  const emojis = () => [
24
24
  {
@@ -178,7 +178,8 @@ const emojis = () => [
178
178
  { emoji: '💭', description: 'thought balloon', category: 'Smileys & Emotion' },
179
179
  { emoji: '💤', description: 'zzz', category: 'Smileys & Emotion' },
180
180
  ],
181
- }, {
181
+ },
182
+ {
182
183
  group_name: 'People & Body',
183
184
  emojis: [
184
185
  { emoji: '👋', description: 'waving hand', category: 'People & Body' },
@@ -529,7 +530,8 @@ const emojis = () => [
529
530
  { emoji: '🫂', description: 'people hugging', category: 'People & Body' },
530
531
  { emoji: '👣', description: 'footprints', category: 'People & Body' },
531
532
  ],
532
- }, {
533
+ },
534
+ {
533
535
  group_name: 'Animals & Nature',
534
536
  emojis: [
535
537
  { emoji: '🐵', description: 'monkey face', category: 'Animals & Nature' },
@@ -673,7 +675,8 @@ const emojis = () => [
673
675
  { emoji: '🍂', description: 'fallen leaf', category: 'Animals & Nature' },
674
676
  { emoji: '🍃', description: 'leaf fluttering in wind', category: 'Animals & Nature' },
675
677
  ],
676
- }, {
678
+ },
679
+ {
677
680
  group_name: 'Food & Drink',
678
681
  emojis: [
679
682
  { emoji: '🍇', description: 'grapes', category: 'Food & Drink' },
@@ -805,7 +808,8 @@ const emojis = () => [
805
808
  { emoji: '🔪', description: 'kitchen knife', category: 'Food & Drink' },
806
809
  { emoji: '🏺', description: 'amphora', category: 'Food & Drink' },
807
810
  ],
808
- }, {
811
+ },
812
+ {
809
813
  group_name: 'Travel & Places',
810
814
  emojis: [
811
815
  { emoji: '🌍', description: 'globe showing Europe-Africa', category: 'Travel & Places' },
@@ -1023,7 +1027,8 @@ const emojis = () => [
1023
1027
  { emoji: '💧', description: 'droplet', category: 'Travel & Places' },
1024
1028
  { emoji: '🌊', description: 'water wave', category: 'Travel & Places' },
1025
1029
  ],
1026
- }, {
1030
+ },
1031
+ {
1027
1032
  group_name: 'Activities',
1028
1033
  emojis: [
1029
1034
  { emoji: '🎃', description: 'jack-o-lantern', category: 'Activities' },
@@ -1106,7 +1111,8 @@ const emojis = () => [
1106
1111
  { emoji: '🧶', description: 'yarn', category: 'Activities' },
1107
1112
  { emoji: '🪢', description: 'knot', category: 'Activities' },
1108
1113
  ],
1109
- }, {
1114
+ },
1115
+ {
1110
1116
  group_name: 'Objects',
1111
1117
  emojis: [
1112
1118
  { emoji: '👓', description: 'glasses', category: 'Objects' },
@@ -1351,7 +1357,8 @@ const emojis = () => [
1351
1357
  { emoji: '🗿', description: 'moai', category: 'Objects' },
1352
1358
  { emoji: '🪧', description: 'placard', category: 'Objects' },
1353
1359
  ],
1354
- }, {
1360
+ },
1361
+ {
1355
1362
  group_name: 'Symbols',
1356
1363
  emojis: [
1357
1364
  { emoji: '🏧', description: 'ATM sign', category: 'Symbols' },
@@ -1521,7 +1528,8 @@ const emojis = () => [
1521
1528
  { emoji: '🔳', description: 'white square button', category: 'Symbols' },
1522
1529
  { emoji: '🔲', description: 'black square button', category: 'Symbols' },
1523
1530
  ],
1524
- }, {
1531
+ },
1532
+ {
1525
1533
  group_name: 'Flags',
1526
1534
  emojis: [
1527
1535
  { emoji: '🏁', description: 'chequered flag', category: 'Flags' },
@@ -1799,28 +1807,29 @@ const emojis = () => [
1799
1807
 
1800
1808
  class LibsUiComponentsEmojiComponent {
1801
1809
  // #region PROPERTY
1810
+ functionsControl = signal(undefined);
1802
1811
  emojisCategories = signal(new Array());
1803
1812
  filter = signal({ page: 0, keySearch: '', groupSelected: 'Smileys & Emotion', perPage: 170 });
1804
1813
  dataEmojiView = signal({ dataView: [], allData: [] });
1805
1814
  // #region INPUT
1806
- configPopover = input(defaultConfigPopover(), { transform: value => value ? value : defaultConfigPopover() });
1815
+ configPopover = input(defaultConfigPopover(), { transform: (value) => (value ? value : defaultConfigPopover()) });
1807
1816
  isNgContent = input();
1808
- zIndex = input(0, { transform: value => value ?? 0 });
1817
+ zIndex = input(0, { transform: (value) => value ?? 0 });
1809
1818
  modePopoverPosition = input();
1810
- classPopup = input('w-[290px] h-[245px]', { transform: val => val ?? 'w-[290px] h-[245px]' });
1811
- classInclude = input('', { transform: val => val ?? '' });
1812
- classIconInclude = input('', { transform: val => val ?? '' });
1819
+ classPopup = input('w-[290px] h-[245px]', { transform: (val) => val ?? 'w-[290px] h-[245px]' });
1820
+ classInclude = input('', { transform: (val) => val ?? '' });
1821
+ classIconInclude = input('', { transform: (val) => val ?? '' });
1813
1822
  // #region OUTPUT
1814
1823
  outEventEmoji = output();
1815
- moFunctionsControl = output();
1824
+ outFunctionsControl = output();
1816
1825
  /* VIEW CHILD */
1817
1826
  emojiRef = viewChild('emojiRef');
1818
1827
  elementViewEmoji = viewChild('elementViewEmoji');
1819
1828
  constructor() {
1820
- this.emojisCategories.set(emojis().map(item => ({
1829
+ this.emojisCategories.set(emojis().map((item) => ({
1821
1830
  ...item,
1822
1831
  iconGroup: item.emojis[0].emoji,
1823
- emojis: new Array()
1832
+ emojis: new Array(),
1824
1833
  })));
1825
1834
  effect(() => {
1826
1835
  if (this.zIndex()) {
@@ -1847,41 +1856,40 @@ class LibsUiComponentsEmojiComponent {
1847
1856
  this.outEventEmoji.emit(data.emoji);
1848
1857
  }
1849
1858
  async handlerFunctionsControl(event) {
1850
- this.moFunctionsControl.emit(event);
1859
+ this.functionsControl.set(event);
1860
+ this.outFunctionsControl.emit(event);
1861
+ }
1862
+ get FunctionsControl() {
1863
+ return this.functionsControl();
1851
1864
  }
1852
1865
  async handlerChooseCategory(event, category) {
1853
1866
  event.stopPropagation();
1854
- this.filter.update(data => ({ ...data, page: 0, groupSelected: category.group_name }));
1867
+ this.filter.update((data) => ({ ...data, page: 0, groupSelected: category.group_name }));
1855
1868
  this.getDataView();
1856
1869
  this.elementViewEmoji()?.nativeElement.scroll({ top: 0 });
1857
1870
  }
1858
1871
  async handlerSearchEmoji(keySearch) {
1859
- this.filter.update(data => ({ ...data, page: 0, keySearch: keySearch.trim() }));
1872
+ this.filter.update((data) => ({ ...data, page: 0, keySearch: keySearch.trim() }));
1860
1873
  this.getDataView();
1861
1874
  this.elementViewEmoji()?.nativeElement.scroll({ top: 0 });
1862
1875
  }
1863
1876
  handlerScrollBottom() {
1864
- this.filter.update(data => ({ ...data, page: data.page + 1, }));
1877
+ this.filter.update((data) => ({ ...data, page: data.page + 1 }));
1865
1878
  this.getDataView();
1866
1879
  }
1867
1880
  getDataView() {
1868
- const emojiByGroup = emojis().find(item => item.group_name === this.filter().groupSelected);
1869
- const emojiMatch = emojiByGroup.emojis.filter(item => deleteUnicode(item.description).toLocaleLowerCase().includes(deleteUnicode(this.filter().keySearch.toLocaleLowerCase())));
1881
+ const emojiByGroup = emojis().find((item) => item.group_name === this.filter().groupSelected);
1882
+ const emojiMatch = emojiByGroup.emojis.filter((item) => deleteUnicode(item.description).toLocaleLowerCase().includes(deleteUnicode(this.filter().keySearch.toLocaleLowerCase())));
1870
1883
  const { page, perPage } = this.filter();
1871
1884
  const dataInPage = emojiMatch.slice(page * perPage, page * perPage + perPage);
1872
- this.dataEmojiView.update(item => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
1885
+ this.dataEmojiView.update((item) => ({ ...item, allData: emojiMatch, dataView: page ? [...item.dataView, ...dataInPage] : dataInPage }));
1873
1886
  }
1874
1887
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsEmojiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1875
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", moFunctionsControl: "moFunctionsControl" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, template: "<libs_ui-components-popover [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex:(zIndex() || 1200) + 4\n }\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover type='other'\n mode='click-toggle'\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class='libs-ui-icon-add before:!text-[16px] {{ classIconInclude() }}'>\n </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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category;) {\n <div class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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 [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 #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 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 }\n </div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1888
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsEmojiComponent, isStandalone: true, selector: "libs_ui-components-emoji", inputs: { configPopover: { classPropertyName: "configPopover", publicName: "configPopover", isSignal: true, isRequired: false, transformFunction: null }, isNgContent: { classPropertyName: "isNgContent", publicName: "isNgContent", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, modePopoverPosition: { classPropertyName: "modePopoverPosition", publicName: "modePopoverPosition", isSignal: true, isRequired: false, transformFunction: null }, classPopup: { classPropertyName: "classPopup", publicName: "classPopup", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classIconInclude: { classPropertyName: "classIconInclude", publicName: "classIconInclude", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outEventEmoji: "outEventEmoji", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "emojiRef", first: true, predicate: ["emojiRef"], descendants: true, isSignal: true }, { propertyName: "elementViewEmoji", first: true, predicate: ["elementViewEmoji"], descendants: true, isSignal: true }], ngImport: i0, 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 [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"libs-ui-icon-add before:!text-[16px] {{ 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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsInputsSearchComponent, selector: "libs_ui-components-inputs-search", inputs: ["disable", "readonly", "searchConfig", "ignoreAutoComplete", "debounceTime", "ignoreStopPropagationEvent", "focusTimeOut", "blurTimeOut"], outputs: ["outSearch", "outValueChange", "outIconLeft", "outIconRight", "outFocusAndBlur", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1876
1889
  }
1877
1890
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsEmojiComponent, decorators: [{
1878
1891
  type: Component,
1879
- args: [{ selector: 'libs_ui-components-emoji', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1880
- TranslateModule,
1881
- LibsUiComponentsInputsSearchComponent,
1882
- LibsUiComponentsPopoverComponent,
1883
- LibsUiComponentsScrollOverlayDirective
1884
- ], template: "<libs_ui-components-popover [classInclude]=\"classInclude()\"\n [config]=\"{\n content: 'i18n_text_emoji',\n zIndex:(zIndex() || 1200) + 4\n }\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n <libs_ui-components-popover type='other'\n mode='click-toggle'\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class='libs-ui-icon-add before:!text-[16px] {{ classIconInclude() }}'>\n </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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category;) {\n <div class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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 [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 #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 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 }\n </div>\n </div>\n </div>\n</ng-template>\n" }]
1892
+ 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 [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"configPopover()\"\n [debugId]=\"'debug icon emoij'\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n @if (!isNgContent()) {\n <i class=\"libs-ui-icon-add before:!text-[16px] {{ 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 class=\"flex overflow-x-auto\">\n @for (category of emojisCategories(); track category) {\n <div\n class=\"grow p-[4px] rounded-[4px] bg-[#ffffff] libs-ui-bg-list-hover\"\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" }]
1885
1893
  }], ctorParameters: () => [] });
1886
1894
 
1887
1895
  /**