structra-ui 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
  2. package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
  3. package/esm2022/app/_utils/estados-br.data.mjs +37 -0
  4. package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
  5. package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
  6. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
  7. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
  8. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
  9. package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
  10. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
  11. package/esm2022/app/app-shell/index.mjs +19 -0
  12. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
  13. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
  14. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
  15. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
  16. package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
  17. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
  18. package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
  19. package/esm2022/app/buttons/index.mjs +2 -0
  20. package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
  21. package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
  22. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
  23. package/esm2022/app/data-display/_models/index.mjs +2 -0
  24. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
  25. package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
  26. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
  27. package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
  28. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
  29. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
  30. package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
  31. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
  32. package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
  33. package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
  34. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
  35. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
  36. package/esm2022/app/data-display/index.mjs +19 -0
  37. package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
  38. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
  39. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
  40. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
  41. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
  42. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
  43. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
  44. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
  45. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
  46. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
  47. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
  48. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
  49. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
  50. package/esm2022/app/dialogs/index.mjs +12 -0
  51. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
  52. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
  53. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
  54. package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
  55. package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
  56. package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
  57. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
  58. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
  59. package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
  60. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
  61. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
  62. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
  63. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
  64. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
  65. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
  66. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
  67. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
  68. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
  69. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
  70. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
  71. package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
  72. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
  73. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
  74. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
  75. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
  76. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
  77. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
  78. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
  79. package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
  80. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
  81. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
  82. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
  83. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
  84. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
  85. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
  86. package/esm2022/app/fields/input-fields/index.mjs +22 -0
  87. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
  88. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
  89. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
  90. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
  91. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
  92. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
  93. package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
  94. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
  95. package/esm2022/app/form-layout/_models/index.mjs +2 -0
  96. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
  97. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
  98. package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
  99. package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
  100. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
  101. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
  102. package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
  103. package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
  104. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
  105. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
  106. package/esm2022/app/form-layout/index.mjs +14 -0
  107. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
  108. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
  109. package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
  110. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
  111. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
  112. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
  113. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
  114. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
  115. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
  116. package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
  117. package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
  118. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
  119. package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
  120. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
  121. package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
  122. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
  123. package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
  124. package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
  125. package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
  126. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
  127. package/esm2022/app/menus/index.mjs +11 -0
  128. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
  129. package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
  130. package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
  131. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
  132. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
  133. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
  134. package/esm2022/app/overlay/index.mjs +21 -0
  135. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
  136. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
  137. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
  138. package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
  139. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
  140. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
  141. package/esm2022/app/theme/app-theme.service.mjs +49 -0
  142. package/esm2022/app/theme/index.mjs +2 -0
  143. package/esm2022/structra-public-api.mjs +18 -0
  144. package/esm2022/structra-ui.mjs +5 -0
  145. package/esm2022/structra-version.mjs +3 -0
  146. package/fesm2022/structra-ui.mjs +8971 -0
  147. package/fesm2022/structra-ui.mjs.map +1 -0
  148. package/index.d.ts +5 -0
  149. package/package.json +15 -6
@@ -0,0 +1,7 @@
1
+ export { DropdownBaseComponent } from './_base/dropdown-base/dropdown-base.component';
2
+ export { DropdownOptionFieldBase } from './_base/dropdown-option-field.base';
3
+ export { DropdownMultiOptionFieldBase } from './_base/dropdown-multi-option-field.base';
4
+ export { SelectFieldComponent } from './select-field/select-field.component';
5
+ export { MultiselectFieldComponent } from './multiselect-field/multiselect-field.component';
6
+ export { DropdownSearchFieldComponent } from './dropdown-search-field/dropdown-search-field.component';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2ZpZWxkcy9kcm9wZG93bi1maWVsZHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDNUYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0seURBQXlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBEcm9wZG93bkJhc2VDb21wb25lbnQgfSBmcm9tICcuL19iYXNlL2Ryb3Bkb3duLWJhc2UvZHJvcGRvd24tYmFzZS5jb21wb25lbnQnO1xyXG5leHBvcnQgeyBEcm9wZG93bk9wdGlvbkZpZWxkQmFzZSB9IGZyb20gJy4vX2Jhc2UvZHJvcGRvd24tb3B0aW9uLWZpZWxkLmJhc2UnO1xyXG5leHBvcnQgeyBEcm9wZG93bk11bHRpT3B0aW9uRmllbGRCYXNlIH0gZnJvbSAnLi9fYmFzZS9kcm9wZG93bi1tdWx0aS1vcHRpb24tZmllbGQuYmFzZSc7XHJcbmV4cG9ydCB7IFNlbGVjdEZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi9zZWxlY3QtZmllbGQvc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IE11bHRpc2VsZWN0RmllbGRDb21wb25lbnQgfSBmcm9tICcuL211bHRpc2VsZWN0LWZpZWxkL211bHRpc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCB7IERyb3Bkb3duU2VhcmNoRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2Ryb3Bkb3duLXNlYXJjaC1maWVsZC9kcm9wZG93bi1zZWFyY2gtZmllbGQuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCB0eXBlIHtcclxuICBVaVNlbGVjdE9wdGlvbixcclxuICBTZWxlY3RQYWdlUmVxdWVzdGVkLFxyXG4gIERyb3Bkb3duU2VhcmNoUGFnZVJlcXVlc3RlZCxcclxuICBEcm9wZG93bkxpc3RCaW5kaW5ncyxcclxufSBmcm9tICcuL19tb2RlbHMnO1xyXG4iXX0=
@@ -0,0 +1,379 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, booleanAttribute, forwardRef, inject, numberAttribute, } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { BaseFieldComponent } from '../../input-fields/_base/base-field.component';
4
+ import { DropdownMultiOptionFieldBase } from '../_base/dropdown-multi-option-field.base';
5
+ import { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';
6
+ import { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';
7
+ import { SkeletonListComponent } from '../../../loading/skeleton-loading';
8
+ import * as i0 from "@angular/core";
9
+ export class MultiselectFieldComponent extends DropdownMultiOptionFieldBase {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.hostRef = inject((ElementRef));
13
+ /** Por omissão `true`: mesmo padrão do select com lista longa (`pageRequested` + scroll). */
14
+ this.pagination = true;
15
+ this.pageSize = 10;
16
+ this.hasMore = false;
17
+ this.loadingMore = false;
18
+ this.pageRequested = new EventEmitter();
19
+ this.panelOpen = false;
20
+ this.panelOverlayWidth = 0;
21
+ this.scrollLoadTimer = null;
22
+ }
23
+ get hostInvalidClass() {
24
+ return this.uiInvalid;
25
+ }
26
+ /** Alias de {@link pagination}. */
27
+ set pageableInput(value) {
28
+ this.pagination = value;
29
+ }
30
+ writeValue(value) {
31
+ // Normaliza: FormControl pode enviar null; valor interno é sempre array.
32
+ const normalized = value == null ? [] : Array.isArray(value) ? [...value] : [];
33
+ this.internalValue = normalized;
34
+ this.afterWriteValue(normalized);
35
+ this.refreshMultiFilledUi();
36
+ if (this.ngControl?.control) {
37
+ this.syncControlUi();
38
+ }
39
+ else {
40
+ this.cdr.markForCheck();
41
+ }
42
+ }
43
+ afterWriteValue(_value) {
44
+ this.syncActiveIndexToFirstEnabled();
45
+ this.cdr.markForCheck();
46
+ }
47
+ /** Texto numa linha: rótulos separados por vírgula + ellipsis no CSS. */
48
+ get displaySummary() {
49
+ const vals = this.internalValue;
50
+ if (!Array.isArray(vals) || vals.length === 0) {
51
+ return '';
52
+ }
53
+ return vals
54
+ .map((v) => this.findOptionByValue(v)?.label ?? String(v))
55
+ .join(', ');
56
+ }
57
+ get optionsListId() {
58
+ return `${this.controlId}-multilist`;
59
+ }
60
+ ngOnChanges(changes) {
61
+ super.ngOnChanges(changes);
62
+ if (!this.panelOpen || !this.pagination || this.loadingMore) {
63
+ return;
64
+ }
65
+ if (changes['loadingMore'] || changes['options']) {
66
+ setTimeout(() => this.tryEmitIfShortList(), 0);
67
+ }
68
+ }
69
+ ngOnDestroy() {
70
+ if (this.scrollLoadTimer != null) {
71
+ clearTimeout(this.scrollLoadTimer);
72
+ }
73
+ }
74
+ onDropdownOpenChange(next) {
75
+ this.panelOpen = next;
76
+ if (next) {
77
+ this.syncActiveIndexToFirstEnabled();
78
+ if (this.pagination && !this.loadingMore) {
79
+ this.pageRequested.emit({ page: 0, pageSize: this.pageSize });
80
+ }
81
+ }
82
+ else {
83
+ if (this.scrollLoadTimer != null) {
84
+ clearTimeout(this.scrollLoadTimer);
85
+ this.scrollLoadTimer = null;
86
+ }
87
+ setTimeout(() => this.focusValueButtonIfFocusLost(), 0);
88
+ }
89
+ if (next && this.pagination) {
90
+ setTimeout(() => this.tryEmitIfShortList(), 0);
91
+ setTimeout(() => this.tryEmitIfShortList(), 80);
92
+ }
93
+ this.cdr.markForCheck();
94
+ }
95
+ onTriggerKeydown(ev) {
96
+ if (this.disabled) {
97
+ return;
98
+ }
99
+ if (this.readonly) {
100
+ if (ev.key === ' ' || ev.key === 'Enter') {
101
+ ev.preventDefault();
102
+ }
103
+ return;
104
+ }
105
+ if (this.panelOpen) {
106
+ if (ev.key === 'Escape') {
107
+ ev.preventDefault();
108
+ this.onDropdownOpenChange(false);
109
+ return;
110
+ }
111
+ const n = this.listOptions.length;
112
+ if (n > 0) {
113
+ switch (ev.key) {
114
+ case 'ArrowDown':
115
+ ev.preventDefault();
116
+ this.activeIndex = this.stepActive(1);
117
+ this.cdr.markForCheck();
118
+ return;
119
+ case 'ArrowUp':
120
+ ev.preventDefault();
121
+ this.activeIndex = this.stepActive(-1);
122
+ this.cdr.markForCheck();
123
+ return;
124
+ case 'Home':
125
+ ev.preventDefault();
126
+ this.activeIndex = this.firstEnabledIndex();
127
+ this.cdr.markForCheck();
128
+ return;
129
+ case 'End':
130
+ ev.preventDefault();
131
+ this.activeIndex = this.lastEnabledIndex();
132
+ this.cdr.markForCheck();
133
+ return;
134
+ case 'Enter':
135
+ case ' ':
136
+ ev.preventDefault();
137
+ this.toggleActiveOption();
138
+ return;
139
+ default:
140
+ break;
141
+ }
142
+ }
143
+ return;
144
+ }
145
+ if ((ev.key === 'Delete' || ev.key === 'Backspace') &&
146
+ this.filledUi) {
147
+ ev.preventDefault();
148
+ this.onClear();
149
+ return;
150
+ }
151
+ if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {
152
+ ev.preventDefault();
153
+ this.openToggle();
154
+ return;
155
+ }
156
+ if (ev.key === 'Enter' || ev.key === ' ') {
157
+ ev.preventDefault();
158
+ ev.stopPropagation();
159
+ this.openToggle();
160
+ }
161
+ }
162
+ focusValueButtonIfFocusLost() {
163
+ const a = document.activeElement;
164
+ if (a === document.body || a === document.documentElement || a == null) {
165
+ document.getElementById(this.controlId)?.focus({ preventScroll: true });
166
+ }
167
+ }
168
+ onOptionsListScroll(ev) {
169
+ if (!this.pagination || this.loadingMore || !this.hasMore) {
170
+ return;
171
+ }
172
+ const el = ev.target;
173
+ if (this.options.length === 0) {
174
+ return;
175
+ }
176
+ if (this.scrollLoadTimer != null) {
177
+ clearTimeout(this.scrollLoadTimer);
178
+ }
179
+ this.scrollLoadTimer = setTimeout(() => {
180
+ this.scrollLoadTimer = null;
181
+ if (el.scrollHeight <= el.clientHeight + 8) {
182
+ if (this.hasMore && !this.loadingMore && this.options.length > 0) {
183
+ this.emitNextPageRequest();
184
+ }
185
+ return;
186
+ }
187
+ const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 64;
188
+ if (!nearBottom) {
189
+ return;
190
+ }
191
+ this.emitNextPageRequest();
192
+ }, 120);
193
+ }
194
+ emitNextPageRequest() {
195
+ if (!this.pagination || this.loadingMore || !this.hasMore) {
196
+ return;
197
+ }
198
+ if (this.options.length === 0) {
199
+ return;
200
+ }
201
+ const nextPage = Math.floor(this.options.length / this.pageSize);
202
+ this.pageRequested.emit({ page: nextPage, pageSize: this.pageSize });
203
+ }
204
+ tryEmitIfShortList() {
205
+ if (!this.panelOpen || !this.pagination || this.loadingMore || !this.hasMore) {
206
+ return;
207
+ }
208
+ if (this.options.length === 0) {
209
+ return;
210
+ }
211
+ const el = document.getElementById(this.optionsListId);
212
+ if (!el) {
213
+ return;
214
+ }
215
+ if (el.scrollHeight <= el.clientHeight + 8) {
216
+ this.emitNextPageRequest();
217
+ }
218
+ }
219
+ openToggle() {
220
+ if (this.disabled || this.readonly || this.loading) {
221
+ return;
222
+ }
223
+ const next = !this.panelOpen;
224
+ if (next) {
225
+ const w = this.hostRef.nativeElement.getBoundingClientRect().width;
226
+ this.panelOverlayWidth = Math.max(0, Math.ceil(w));
227
+ }
228
+ this.onDropdownOpenChange(next);
229
+ }
230
+ toggleOption(opt) {
231
+ if (opt.disabled || this.disabled || this.readonly) {
232
+ return;
233
+ }
234
+ const cur = [...(Array.isArray(this.internalValue) ? this.internalValue : [])];
235
+ const j = cur.findIndex((v) => this.matches(v, opt.value));
236
+ if (j >= 0) {
237
+ cur.splice(j, 1);
238
+ }
239
+ else {
240
+ cur.push(opt.value);
241
+ }
242
+ this.emitModelValue(cur);
243
+ this.finishMultiTouch();
244
+ this.cdr.markForCheck();
245
+ }
246
+ toggleActiveOption() {
247
+ const opt = this.listOptions[this.activeIndex];
248
+ if (opt && !opt.disabled) {
249
+ this.toggleOption(opt);
250
+ }
251
+ }
252
+ onOptionRowKeydown(ev, opt) {
253
+ if (opt.disabled || this.disabled || this.readonly) {
254
+ return;
255
+ }
256
+ if (ev.key !== 'Enter' && ev.key !== ' ') {
257
+ return;
258
+ }
259
+ ev.preventDefault();
260
+ ev.stopPropagation();
261
+ this.toggleOption(opt);
262
+ }
263
+ onListKeydown(ev) {
264
+ if (ev.key === 'Escape') {
265
+ ev.preventDefault();
266
+ this.onDropdownOpenChange(false);
267
+ return;
268
+ }
269
+ if (ev.key === 'Delete' || ev.key === 'Backspace') {
270
+ if (!this.disabled && !this.readonly && this.filledUi) {
271
+ ev.preventDefault();
272
+ this.onClear();
273
+ }
274
+ return;
275
+ }
276
+ if (this.listOptions.length === 0) {
277
+ return;
278
+ }
279
+ switch (ev.key) {
280
+ case 'ArrowDown':
281
+ ev.preventDefault();
282
+ this.activeIndex = this.stepActive(1);
283
+ break;
284
+ case 'ArrowUp':
285
+ ev.preventDefault();
286
+ this.activeIndex = this.stepActive(-1);
287
+ break;
288
+ case 'Home':
289
+ ev.preventDefault();
290
+ this.activeIndex = this.firstEnabledIndex();
291
+ break;
292
+ case 'End':
293
+ ev.preventDefault();
294
+ this.activeIndex = this.lastEnabledIndex();
295
+ break;
296
+ case 'Enter':
297
+ case ' ':
298
+ ev.preventDefault();
299
+ this.toggleActiveOption();
300
+ break;
301
+ default:
302
+ return;
303
+ }
304
+ this.cdr.markForCheck();
305
+ }
306
+ onClear() {
307
+ if (this.disabled || this.readonly) {
308
+ return;
309
+ }
310
+ this.emitModelValue([]);
311
+ this.onDropdownOpenChange(false);
312
+ this.notifyTouched();
313
+ this.cdr.markForCheck();
314
+ }
315
+ onDropdownBlur(ev) {
316
+ const triggerRoot = this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;
317
+ scheduleCloseDropdownPanelOnTriggerBlur({
318
+ triggerRoot,
319
+ isPanelOpen: () => this.panelOpen,
320
+ closePanel: () => this.onDropdownOpenChange(false),
321
+ notifyTouched: () => this.notifyTouched(),
322
+ blurRelatedTarget: ev?.relatedTarget ?? null,
323
+ });
324
+ }
325
+ /** Escape com foco no limpar/prefixo do `base-field` (não passa pelo div da origem do overlay). */
326
+ onDropdownHostEscape(ev) {
327
+ if (!this.panelOpen || ev.key !== 'Escape') {
328
+ return;
329
+ }
330
+ ev.preventDefault();
331
+ this.onDropdownOpenChange(false);
332
+ }
333
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
334
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MultiselectFieldComponent, isStandalone: true, selector: "app-multiselect-field", inputs: { pagination: ["pagination", "pagination", booleanAttribute], pageableInput: ["pageable", "pageableInput", booleanAttribute], pageSize: ["pageSize", "pageSize", numberAttribute], hasMore: "hasMore", loadingMore: "loadingMore" }, outputs: { pageRequested: "pageRequested" }, host: { listeners: { "keydown": "onDropdownHostEscape($event)" }, properties: { "class.multiselect-field--invalid": "this.hostInvalidClass" } }, providers: [
335
+ {
336
+ provide: NG_VALUE_ACCESSOR,
337
+ useExisting: forwardRef(() => MultiselectFieldComponent),
338
+ multi: true,
339
+ },
340
+ ], viewQueries: [{ propertyName: "optionsPanelTpl", first: true, predicate: ["optionsPanelTpl"], descendants: true, static: true }, { propertyName: "dropdownTriggerRootRef", first: true, predicate: ["dropdownFieldTriggerRoot"], descendants: true, read: ElementRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"multiselect-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"multiselect-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <div\n role=\"combobox\"\n class=\"multiselect-field__value-btn\"\n [class.multiselect-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar v\u00E1rios'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"multiselect-field__value\">{{ displaySummary }}</span>\n </div>\n <button type=\"button\" class=\"multiselect-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de op\u00E7\u00F5es\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down multiselect-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"multiselect-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\" aria-multiselectable=\"true\"\n (mousedown)=\"$event.preventDefault()\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"multiselect-field__option\" [class.multiselect-field__option--disabled]=\"opt.disabled\"\n [class.multiselect-field__option--selected]=\"isSelected(opt)\"\n [class.multiselect-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"toggleOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n <span class=\"multiselect-field__check\" aria-hidden=\"true\">\n @if (isSelected(opt)) {\n <i class=\"fa-solid fa-check multiselect-field__check-icon\"></i>\n }\n </span>\n <span class=\"multiselect-field__option-label\">{{ opt.label }}</span>\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.multiselect-field__wrap{display:flex;flex:1;align-items:stretch;align-self:stretch;min-width:0;width:100%;box-sizing:border-box}.multiselect-field__origin{display:flex;align-items:center;align-self:stretch;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.multiselect-field__value-btn{flex:1;min-width:0;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:pointer;display:flex;align-items:center;user-select:text;-webkit-user-select:text;-moz-user-select:text}.multiselect-field__value-btn:focus,.multiselect-field__value-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__value-btn--is-disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity);pointer-events:none}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .multiselect-field__value-btn:not(.multiselect-field__value-btn--is-disabled){color:var(--ui-field-readonly-input-text);-webkit-text-fill-color:var(--ui-field-readonly-input-text)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .multiselect-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}.multiselect-field__value{display:block;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:text;-webkit-user-select:text;-moz-user-select:text}.multiselect-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;align-self:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.multiselect-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.multiselect-field__chevron-btn:focus,.multiselect-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host.multiselect-field--invalid .multiselect-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.multiselect-field--invalid .multiselect-field__chevron-btn .multiselect-field__chevron-icon{color:inherit}:host.multiselect-field--invalid .multiselect-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.multiselect-field--invalid .multiselect-field__chevron-btn:focus,:host.multiselect-field--invalid .multiselect-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.multiselect-field__list{margin:0;padding:.25rem 0;width:100%;max-height:min(240px,50vh);box-sizing:border-box;list-style:none;outline:none;overflow-x:hidden;overflow-y:auto;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.multiselect-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.multiselect-field__loading--footer{border-top:1px solid rgba(0,0,0,.06)}.multiselect-field__option{display:flex;align-items:center;gap:.5rem;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.multiselect-field__option--selected:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.multiselect-field__option--active:not(.multiselect-field__option--disabled):not(.multiselect-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.multiselect-field__option.multiselect-field__option--active.multiselect-field__option--selected:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.multiselect-field__option--disabled{opacity:.45;cursor:not-allowed}.multiselect-field__option:hover:not(.multiselect-field__option--disabled):not(.multiselect-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.multiselect-field__option.multiselect-field__option--selected:hover:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}.multiselect-field__check{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem}.multiselect-field__check-icon{font-size:.85rem;line-height:1;color:var(--ui-field-float-border-focus)}.multiselect-field__option-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}\n"], dependencies: [{ kind: "component", type: BaseFieldComponent, selector: "app-base-field", inputs: ["label", "errorMessage", "required", "showRequiredMark", "invalid", "filled", "disabled", "readonly", "inputId", "errorId", "showPrefixIcon", "prefixIcon", "clearable", "clearAriaLabel", "showSuffixSlot", "valueAlignEnd", "loading", "skeletonVariant", "mostrarMenuContexto", "contextMenuItems", "contextMenuId"], outputs: ["clear", "contextMenuSelect"] }, { kind: "component", type: DropdownBaseComponent, selector: "app-dropdown-base", inputs: ["open", "panelTemplate", "panelWidthPx", "closeOnEscape", "hasBackdrop", "connectedPositions", "pushConnectedOverlay", "bareOverlayPanel"], outputs: ["openChange"] }, { kind: "component", type: SkeletonListComponent, selector: "app-skeleton-list", inputs: ["rows", "leading", "rowGap", "lineHeight", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
341
+ }
342
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiselectFieldComponent, decorators: [{
343
+ type: Component,
344
+ args: [{ selector: 'app-multiselect-field', standalone: true, imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
345
+ {
346
+ provide: NG_VALUE_ACCESSOR,
347
+ useExisting: forwardRef(() => MultiselectFieldComponent),
348
+ multi: true,
349
+ },
350
+ ], template: "<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"multiselect-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"multiselect-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <div\n role=\"combobox\"\n class=\"multiselect-field__value-btn\"\n [class.multiselect-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar v\u00E1rios'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"multiselect-field__value\">{{ displaySummary }}</span>\n </div>\n <button type=\"button\" class=\"multiselect-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de op\u00E7\u00F5es\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down multiselect-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"multiselect-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\" aria-multiselectable=\"true\"\n (mousedown)=\"$event.preventDefault()\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"multiselect-field__option\" [class.multiselect-field__option--disabled]=\"opt.disabled\"\n [class.multiselect-field__option--selected]=\"isSelected(opt)\"\n [class.multiselect-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"toggleOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n <span class=\"multiselect-field__check\" aria-hidden=\"true\">\n @if (isSelected(opt)) {\n <i class=\"fa-solid fa-check multiselect-field__check-icon\"></i>\n }\n </span>\n <span class=\"multiselect-field__option-label\">{{ opt.label }}</span>\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;width:100%;box-sizing:border-box}:host ::ng-deep .base-field:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}:host ::ng-deep .base-field--invalid:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}:host ::ng-deep .base-field.base-field--readonly:not(.base-field--invalid):not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}:host ::ng-deep .base-field.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.multiselect-field__wrap{display:flex;flex:1;align-items:stretch;align-self:stretch;min-width:0;width:100%;box-sizing:border-box}.multiselect-field__origin{display:flex;align-items:center;align-self:stretch;min-width:0;width:100%;min-height:calc(1.8rem + 1.35em);box-sizing:border-box}.multiselect-field__value-btn{flex:1;min-width:0;margin:0;box-sizing:border-box;min-height:calc(1.8rem + 1.35em);padding:1.35rem .35rem .45rem .75rem;font-size:1rem;line-height:1.35;font-family:inherit;text-align:left;color:var(--ui-field-float-input-text);background:transparent;border:0;border-radius:0;box-shadow:none;cursor:pointer;display:flex;align-items:center;user-select:text;-webkit-user-select:text;-moz-user-select:text}.multiselect-field__value-btn:focus,.multiselect-field__value-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__value-btn--is-disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity);pointer-events:none}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .multiselect-field__value-btn:not(.multiselect-field__value-btn--is-disabled){color:var(--ui-field-readonly-input-text);-webkit-text-fill-color:var(--ui-field-readonly-input-text)}:host ::ng-deep .base-field--readonly:not(.base-field--disabled) .multiselect-field__chevron-btn:disabled{opacity:1;cursor:default;color:var(--ui-field-readonly-prefix-color)}.multiselect-field__value{display:block;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;user-select:text;-webkit-user-select:text;-moz-user-select:text}.multiselect-field__chevron-btn{display:flex;flex-shrink:0;align-items:center;justify-content:center;align-self:center;box-sizing:border-box;width:2rem;height:2rem;margin:0 .1rem;padding:0;border:0;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.multiselect-field__chevron-btn:hover:not(:disabled){background:#5a7fa31f;color:var(--ui-field-float-label-top-color)}.multiselect-field__chevron-btn:focus,.multiselect-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__chevron-btn:disabled{cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity)}:host.multiselect-field--invalid .multiselect-field__chevron-btn{color:var(--ui-field-float-label-invalid-color)}:host.multiselect-field--invalid .multiselect-field__chevron-btn .multiselect-field__chevron-icon{color:inherit}:host.multiselect-field--invalid .multiselect-field__chevron-btn:hover:not(:disabled){background:#b91c1c1f}:host.multiselect-field--invalid .multiselect-field__chevron-btn:focus,:host.multiselect-field--invalid .multiselect-field__chevron-btn:focus-visible{outline:none;box-shadow:none}.multiselect-field__chevron-icon{display:inline-flex;align-items:center;justify-content:center;padding-top:2px;font-size:.8rem;line-height:1}.multiselect-field__list{margin:0;padding:.25rem 0;width:100%;max-height:min(240px,50vh);box-sizing:border-box;list-style:none;outline:none;overflow-x:hidden;overflow-y:auto;background:var(--app-color-nav-surface, var(--app-color-surface, #fff))}.multiselect-field__loading{padding:.65rem .75rem;font-size:.85rem;line-height:1.35;color:var(--ui-field-float-label-color);text-align:center}.multiselect-field__loading--footer{border-top:1px solid rgba(0,0,0,.06)}.multiselect-field__option{display:flex;align-items:center;gap:.5rem;padding:.45rem .75rem;font-size:.95rem;line-height:1.35;cursor:pointer;color:var(--ui-field-float-input-text)}.multiselect-field__option--selected:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg)}.multiselect-field__option--active:not(.multiselect-field__option--disabled):not(.multiselect-field__option--selected){background:var(--app-color-dropdown-option-highlight-bg)}.multiselect-field__option.multiselect-field__option--active.multiselect-field__option--selected:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-bg-active)}.multiselect-field__option--disabled{opacity:.45;cursor:not-allowed}.multiselect-field__option:hover:not(.multiselect-field__option--disabled):not(.multiselect-field__option--selected){background:var(--app-color-dropdown-option-hover-bg)}.multiselect-field__option.multiselect-field__option--selected:hover:not(.multiselect-field__option--disabled){background:var(--app-color-dropdown-option-selected-hover-bg)}.multiselect-field__check{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem}.multiselect-field__check-icon{font-size:.85rem;line-height:1;color:var(--ui-field-float-border-focus)}.multiselect-field__option-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}\n"] }]
351
+ }], propDecorators: { hostInvalidClass: [{
352
+ type: HostBinding,
353
+ args: ['class.multiselect-field--invalid']
354
+ }], pagination: [{
355
+ type: Input,
356
+ args: [{ transform: booleanAttribute }]
357
+ }], pageableInput: [{
358
+ type: Input,
359
+ args: [{ alias: 'pageable', transform: booleanAttribute }]
360
+ }], pageSize: [{
361
+ type: Input,
362
+ args: [{ transform: numberAttribute }]
363
+ }], hasMore: [{
364
+ type: Input
365
+ }], loadingMore: [{
366
+ type: Input
367
+ }], pageRequested: [{
368
+ type: Output
369
+ }], optionsPanelTpl: [{
370
+ type: ViewChild,
371
+ args: ['optionsPanelTpl', { static: true }]
372
+ }], dropdownTriggerRootRef: [{
373
+ type: ViewChild,
374
+ args: ['dropdownFieldTriggerRoot', { read: ElementRef }]
375
+ }], onDropdownHostEscape: [{
376
+ type: HostListener,
377
+ args: ['keydown', ['$event']]
378
+ }] } });
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9maWVsZHMvZHJvcGRvd24tZmllbGRzL211bHRpc2VsZWN0LWZpZWxkL211bHRpc2VsZWN0LWZpZWxkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2Ryb3Bkb3duLWZpZWxkcy9tdWx0aXNlbGVjdC1maWVsZC9tdWx0aXNlbGVjdC1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFHTixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixNQUFNLEVBQ04sZUFBZSxHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNuRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUd6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsdUNBQXVDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7QUFpQjFFLE1BQU0sT0FBTyx5QkFDWCxTQUFRLDRCQUE0QjtJQWhCdEM7O1FBbUJtQixZQUFPLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUM7UUFPM0QsNkZBQTZGO1FBQ3JELGVBQVUsR0FBRyxJQUFJLENBQUM7UUFRbkIsYUFBUSxHQUFH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QUFFLGVBQWUsRUFBRTtnQkFDNUIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ2EsYUFBYTtzQkFBL0IsTUFBTTtnQkFHUCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk3QixzQkFBc0I7c0JBRHRDLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQXVVM0Qsb0JBQW9CO3NCQURuQixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIFZpZXdDaGlsZCxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgaW5qZWN0LFxyXG4gIG51bWJlckF0dHJpYnV0ZSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEJhc2VGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2lucHV0LWZpZWxkcy9fYmFzZS9iYXNlLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERyb3Bkb3duTXVsdGlPcHRpb25GaWVsZEJhc2UgfSBmcm9tICcuLi9fYmFzZS9kcm9wZG93bi1tdWx0aS1vcHRpb24tZmllbGQuYmFzZSc7XHJcbmltcG9ydCB0eXBlIHsgU2VsZWN0UGFnZVJlcXVlc3RlZCB9IGZyb20gJy4uL19tb2RlbHMvc2VsZWN0LXBhZ2luYXRpb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBVaVNlbGVjdE9wdGlvbiB9IGZyb20gJy4uL19tb2RlbHMvc2VsZWN0LW9wdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IERyb3Bkb3duQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL19iYXNlL2Ryb3Bkb3duLWJhc2UvZHJvcGRvd24tYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBzY2hlZHVsZUNsb3NlRHJvcGRvd25QYW5lbE9uVHJpZ2dlckJsdXIgfSBmcm9tICcuLi9fYmFzZS9kcm9wZG93bi10cmlnZ2VyLWJsdXIudXRpbCc7XHJcbmltcG9ydCB7IFNrZWxldG9uTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2xvYWRpbmcvc2tlbGV0b24tbG9hZGluZyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1tdWx0aXNlbGVjdC1maWVsZCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQmFzZUZpZWxkQ29tcG9uZW50LCBEcm9wZG93bkJhc2VDb21wb25lbnQsIFNrZWxldG9uTGlzdENvbXBvbmVudF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpc2VsZWN0LWZpZWxkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vbXVsdGlzZWxlY3QtZmllbGQuY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlzZWxlY3RGaWVsZENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlzZWxlY3RGaWVsZENvbXBvbmVudFxyXG4gIGV4dGVuZHMgRHJvcGRvd25NdWx0aU9wdGlvbkZpZWxkQmFzZVxyXG4gIGltcGxlbWVudHMgT25EZXN0cm95LCBPbkNoYW5nZXNcclxue1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdFJlZiA9IGluamVjdChFbGVtZW50UmVmPEhUTUxFbGVtZW50Pik7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MubXVsdGlzZWxlY3QtZmllbGQtLWludmFsaWQnKVxyXG4gIGdldCBob3N0SW52YWxpZENsYXNzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudWlJbnZhbGlkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFBvciBvbWlzc8OjbyBgdHJ1ZWA6IG1lc21vIHBhZHLDo28gZG8gc2VsZWN0IGNvbSBsaXN0YSBsb25nYSAoYHBhZ2VSZXF1ZXN0ZWRgICsgc2Nyb2xsKS4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgcGFnaW5hdGlvbiA9IHRydWU7XHJcblxyXG4gIC8qKiBBbGlhcyBkZSB7QGxpbmsgcGFnaW5hdGlvbn0uICovXHJcbiAgQElucHV0KHsgYWxpYXM6ICdwYWdlYWJsZScsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIHNldCBwYWdlYWJsZUlucHV0KHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnBhZ2luYXRpb24gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHBhZ2VTaXplID0gMTA7XHJcbiAgQElucHV0KCkgaGFzTW9yZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGxvYWRpbmdNb3JlID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHBhZ2VSZXF1ZXN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdFBhZ2VSZXF1ZXN0ZWQ+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ29wdGlvbnNQYW5lbFRwbCcsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgb3B0aW9uc1BhbmVsVHBsITogVGVtcGxhdGVSZWY8dW5rbm93bj47XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duRmllbGRUcmlnZ2VyUm9vdCcsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25UcmlnZ2VyUm9vdFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICBwYW5lbE9wZW4gPSBmYWxzZTtcclxuICBwYW5lbE92ZXJsYXlXaWR0aCA9IDA7XHJcbiAgcHJpdmF0ZSBzY3JvbGxMb2FkVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IHVua25vd25bXSB8IG51bGwpOiB2b2lkIHtcclxuICAgIC8vIE5vcm1hbGl6YTogRm9ybUNvbnRyb2wgcG9kZSBlbnZpYXIgbnVsbDsgdmFsb3IgaW50ZXJubyDDqSBzZW1wcmUgYXJyYXkuXHJcbiAgICBjb25zdCBub3JtYWxpemVkID1cclxuICAgICAgdmFsdWUgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogW107XHJcbiAgICB0aGlzLmludGVybmFsVmFsdWUgPSBub3JtYWxpemVkO1xyXG4gICAgdGhpcy5hZnRlcldyaXRlVmFsdWUobm9ybWFsaXplZCk7XHJcbiAgICB0aGlzLnJlZnJlc2hNdWx0aUZpbGxlZFVpKCk7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2w/LmNvbnRyb2wpIHtcclxuICAgICAgdGhpcy5zeW5jQ29udHJvbFVpKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhZnRlcldyaXRlVmFsdWUoX3ZhbHVlOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgIHRoaXMuc3luY0FjdGl2ZUluZGV4VG9GaXJzdEVuYWJsZWQoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRleHRvIG51bWEgbGluaGE6IHLDs3R1bG9zIHNlcGFyYWRvcyBwb3IgdsOtcmd1bGEgKyBlbGxpcHNpcyBubyBDU1MuICovXHJcbiAgZ2V0IGRpc3BsYXlTdW1tYXJ5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCB2YWxzID0gdGhpcy5pbnRlcm5hbFZhbHVlO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHMpIHx8IHZhbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiB2YWxzXHJcbiAgICAgIC5tYXAoKHYpID0+IHRoaXMuZmluZE9wdGlvbkJ5VmFsdWUodik/LmxhYmVsID8/IFN0cmluZyh2KSlcclxuICAgICAgLmpvaW4oJywgJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgb3B0aW9uc0xpc3RJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuY29udHJvbElkfS1tdWx0aWxpc3RgO1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XHJcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuIHx8ICF0aGlzLnBhZ2luYXRpb24gfHwgdGhpcy5sb2FkaW5nTW9yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1snbG9hZGluZ01vcmUnXSB8fCBjaGFuZ2VzWydvcHRpb25zJ10pIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyeUVtaXRJZlNob3J0TGlzdCgpLCAwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2Nyb2xsTG9hZFRpbWVyICE9IG51bGwpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsTG9hZFRpbWVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25PcGVuQ2hhbmdlKG5leHQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMucGFuZWxPcGVuID0gbmV4dDtcclxuICAgIGlmIChuZXh0KSB7XHJcbiAgICAgIHRoaXMuc3luY0FjdGl2ZUluZGV4VG9GaXJzdEVuYWJsZWQoKTtcclxuICAgICAgaWYgKHRoaXMucGFnaW5hdGlvbiAmJiAhdGhpcy5sb2FkaW5nTW9yZSkge1xyXG4gICAgICAgIHRoaXMucGFnZVJlcXVlc3RlZC5lbWl0KHsgcGFnZTogMCwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnNjcm9sbExvYWRUaW1lciAhPSBudWxsKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsTG9hZFRpbWVyKTtcclxuICAgICAgICB0aGlzLnNjcm9sbExvYWRUaW1lciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzVmFsdWVCdXR0b25JZkZvY3VzTG9zdCgpLCAwKTtcclxuICAgIH1cclxuICAgIGlmIChuZXh0ICYmIHRoaXMucGFnaW5hdGlvbikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJ5RW1pdElmU2hvcnRMaXN0KCksIDApO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudHJ5RW1pdElmU2hvcnRMaXN0KCksIDgwKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25UcmlnZ2VyS2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgaWYgKGV2LmtleSA9PT0gJyAnIHx8IGV2LmtleSA9PT0gJ0VudGVyJykge1xyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xyXG4gICAgICBpZiAoZXYua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG4gPSB0aGlzLmxpc3RPcHRpb25zLmxlbmd0aDtcclxuICAgICAgaWYgKG4gPiAwKSB7XHJcbiAgICAgICAgc3dpdGNoIChldi5rZXkpIHtcclxuICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XHJcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLnN0ZXBBY3RpdmUoMSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBjYXNlICdBcnJvd1VwJzpcclxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuc3RlcEFjdGl2ZSgtMSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBjYXNlICdIb21lJzpcclxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuZmlyc3RFbmFibGVkSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGNhc2UgJ0VuZCc6XHJcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSW5kZXggPSB0aGlzLmxhc3RFbmFibGVkSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIGNhc2UgJ0VudGVyJzpcclxuICAgICAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUFjdGl2ZU9wdGlvbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgKGV2LmtleSA9PT0gJ0RlbGV0ZScgfHwgZXYua2V5ID09PSAnQmFja3NwYWNlJykgJiZcclxuICAgICAgdGhpcy5maWxsZWRVaVxyXG4gICAgKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHRoaXMub25DbGVhcigpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoZXYua2V5ID09PSAnQXJyb3dEb3duJyB8fCBldi5rZXkgPT09ICdBcnJvd1VwJykge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLm9wZW5Ub2dnbGUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2LmtleSA9PT0gJ0VudGVyJyB8fCBldi5rZXkgPT09ICcgJykge1xyXG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5vcGVuVG9nZ2xlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvY3VzVmFsdWVCdXR0b25JZkZvY3VzTG9zdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG4gICAgaWYgKGEgPT09IGRvY3VtZW50LmJvZHkgfHwgYSA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGEgPT0gbnVsbCkge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvbnRyb2xJZCk/LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3B0aW9uc0xpc3RTY3JvbGwoZXY6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWwgPSBldi50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zY3JvbGxMb2FkVGltZXIgIT0gbnVsbCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5zY3JvbGxMb2FkVGltZXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zY3JvbGxMb2FkVGltZXIgPSBudWxsO1xyXG4gICAgICBpZiAoZWwuc2Nyb2xsSGVpZ2h0IDw9IGVsLmNsaWVudEhlaWdodCArIDgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNNb3JlICYmICF0aGlzLmxvYWRpbmdNb3JlICYmIHRoaXMub3B0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmVtaXROZXh0UGFnZVJlcXVlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG5lYXJCb3R0b20gPVxyXG4gICAgICAgIGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8PSA2NDtcclxuICAgICAgaWYgKCFuZWFyQm90dG9tKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdE5leHRQYWdlUmVxdWVzdCgpO1xyXG4gICAgfSwgMTIwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdE5leHRQYWdlUmVxdWVzdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wYWdpbmF0aW9uIHx8IHRoaXMubG9hZGluZ01vcmUgfHwgIXRoaXMuaGFzTW9yZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXh0UGFnZSA9IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLmxlbmd0aCAvIHRoaXMucGFnZVNpemUpO1xyXG4gICAgdGhpcy5wYWdlUmVxdWVzdGVkLmVtaXQoeyBwYWdlOiBuZXh0UGFnZSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeUVtaXRJZlNob3J0TGlzdCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wYW5lbE9wZW4gfHwgIXRoaXMucGFnaW5hdGlvbiB8fCB0aGlzLmxvYWRpbmdNb3JlIHx8ICF0aGlzLmhhc01vcmUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnNMaXN0SWQpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcclxuICAgIGlmICghZWwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGVsLnNjcm9sbEhlaWdodCA8PSBlbC5jbGllbnRIZWlnaHQgKyA4KSB7XHJcbiAgICAgIHRoaXMuZW1pdE5leHRQYWdlUmVxdWVzdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblRvZ2dsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkgfHwgdGhpcy5sb2FkaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG5leHQgPSAhdGhpcy5wYW5lbE9wZW47XHJcbiAgICBpZiAobmV4dCkge1xyXG4gICAgICBjb25zdCB3ID0gdGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XHJcbiAgICAgIHRoaXMucGFuZWxPdmVybGF5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwodykpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShuZXh0KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU9wdGlvbihvcHQ6IFVpU2VsZWN0T3B0aW9uPHVua25vd24+KTogdm9pZCB7XHJcbiAgICBpZiAob3B0LmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjdXIgPSBbLi4uKEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFZhbHVlKSA/IHRoaXMuaW50ZXJuYWxWYWx1ZSA6IFtdKV07XHJcbiAgICBjb25zdCBqID0gY3VyLmZpbmRJbmRleCgodikgPT4gdGhpcy5tYXRjaGVzKHYsIG9wdC52YWx1ZSkpO1xyXG4gICAgaWYgKGogPj0gMCkge1xyXG4gICAgICBjdXIuc3BsaWNlKGosIDEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY3VyLnB1c2gob3B0LnZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdE1vZGVsVmFsdWUoY3VyKTtcclxuICAgIHRoaXMuZmluaXNoTXVsdGlUb3VjaCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRvZ2dsZUFjdGl2ZU9wdGlvbigpOiB2b2lkIHtcclxuICAgIGNvbnN0IG9wdCA9IHRoaXMubGlzdE9wdGlvbnNbdGhpcy5hY3RpdmVJbmRleF07XHJcbiAgICBpZiAob3B0ICYmICFvcHQuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy50b2dnbGVPcHRpb24ob3B0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3B0aW9uUm93S2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCwgb3B0OiBVaVNlbGVjdE9wdGlvbjx1bmtub3duPik6IHZvaWQge1xyXG4gICAgaWYgKG9wdC5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGV2LmtleSAhPT0gJ0VudGVyJyAmJiBldi5rZXkgIT09ICcgJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnRvZ2dsZU9wdGlvbihvcHQpO1xyXG4gIH1cclxuXHJcbiAgb25MaXN0S2V5ZG93bihldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2LmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChldi5rZXkgPT09ICdEZWxldGUnIHx8IGV2LmtleSA9PT0gJ0JhY2tzcGFjZScpIHtcclxuICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZmlsbGVkVWkpIHtcclxuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMub25DbGVhcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxpc3RPcHRpb25zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzd2l0Y2ggKGV2LmtleSkge1xyXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOlxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMuc3RlcEFjdGl2ZSgxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5zdGVwQWN0aXZlKC0xKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSG9tZSc6XHJcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUluZGV4ID0gdGhpcy5maXJzdEVuYWJsZWRJbmRleCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdFbmQnOlxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJbmRleCA9IHRoaXMubGFzdEVuYWJsZWRJbmRleCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdFbnRlcic6XHJcbiAgICAgIGNhc2UgJyAnOlxyXG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVBY3RpdmVPcHRpb24oKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uQ2xlYXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZW1pdE1vZGVsVmFsdWUoW10pO1xyXG4gICAgdGhpcy5vbkRyb3Bkb3duT3BlbkNoYW5nZShmYWxzZSk7XHJcbiAgICB0aGlzLm5vdGlmeVRvdWNoZWQoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wZG93bkJsdXIoZXY/OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0cmlnZ2VyUm9vdCA9XHJcbiAgICAgIHRoaXMuZHJvcGRvd25UcmlnZ2VyUm9vdFJlZj8ubmF0aXZlRWxlbWVudCA/PyB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHNjaGVkdWxlQ2xvc2VEcm9wZG93blBhbmVsT25UcmlnZ2VyQmx1cih7XHJcbiAgICAgIHRyaWdnZXJSb290LFxyXG4gICAgICBpc1BhbmVsT3BlbjogKCkgPT4gdGhpcy5wYW5lbE9wZW4sXHJcbiAgICAgIGNsb3NlUGFuZWw6ICgpID0+IHRoaXMub25Ecm9wZG93bk9wZW5DaGFuZ2UoZmFsc2UpLFxyXG4gICAgICBub3RpZnlUb3VjaGVkOiAoKSA9PiB0aGlzLm5vdGlmeVRvdWNoZWQoKSxcclxuICAgICAgYmx1clJlbGF0ZWRUYXJnZXQ6IGV2Py5yZWxhdGVkVGFyZ2V0ID8/IG51bGwsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBFc2NhcGUgY29tIGZvY28gbm8gbGltcGFyL3ByZWZpeG8gZG8gYGJhc2UtZmllbGRgIChuw6NvIHBhc3NhIHBlbG8gZGl2IGRhIG9yaWdlbSBkbyBvdmVybGF5KS4gKi9cclxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBvbkRyb3Bkb3duSG9zdEVzY2FwZShldjogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCBldi5rZXkgIT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLm9uRHJvcGRvd25PcGVuQ2hhbmdlKGZhbHNlKTtcclxuICB9XHJcbn1cclxuIiwiPGFwcC1iYXNlLWZpZWxkIFtsYWJlbF09XCJmbG9hdExhYmVsQ2FwdGlvblwiIFtmaWxsZWRdPVwiZmlsbGVkVWlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgW2Vycm9yTWVzc2FnZV09XCJ1aUVycm9yTWVzc2FnZVwiIFtyZXF1aXJlZF09XCJ1aVJlcXVpcmVkRWZmZWN0aXZlXCIgW3Nob3dSZXF1aXJlZE1hcmtdPVwic2hvd1JlcXVpcmVkTWFya1wiIFtpbnZhbGlkXT1cInVpSW52YWxpZFwiXG4gIFtpbnB1dElkXT1cImNvbnRyb2xJZFwiIFtlcnJvcklkXT1cImVycm9yRWxlbWVudElkXCIgW3Nob3dQcmVmaXhJY29uXT1cInNob3dQcmVmaXhJY29uXCIgW3ByZWZpeEljb25dPVwicHJlZml4SWNvblwiXG4gIFtjbGVhcmFibGVdPVwiY2xlYXJhYmxlXCIgW2NsZWFyQXJpYUxhYmVsXT1cImNsZWFyQXJpYUxhYmVsXCJcbiAgW21vc3RyYXJNZW51Q29udGV4dG9dPVwibW9zdHJhck1lbnVDb250ZXh0b1wiIFtjb250ZXh0TWVudUl0ZW1zXT1cImNvbnRleHRNZW51SXRlbXNcIiBbY29udGV4dE1lbnVJZF09XCJjb250ZXh0TWVudUlkXCJcbiAgKGNsZWFyKT1cIm9uQ2xlYXIoKVwiIChjb250ZXh0TWVudVNlbGVjdCk9XCJjb250ZXh0TWVudVNlbGVjdC5lbWl0KCRldmVudClcIj5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2FwcEZpZWxkUHJlZml4XVwiIC8+XG4gIDxkaXYgY2xhc3M9XCJtdWx0aXNlbGVjdC1maWVsZF9fd3JhcFwiPlxuICAgIDxhcHAtZHJvcGRvd24tYmFzZSBbb3Blbl09XCJwYW5lbE9wZW5cIiBbcGFuZWxUZW1wbGF0ZV09XCJvcHRpb25zUGFuZWxUcGxcIiBbcGFuZWxXaWR0aFB4XT1cInBhbmVsT3ZlcmxheVdpZHRoXCJcbiAgICAgIChvcGVuQ2hhbmdlKT1cIm9uRHJvcGRvd25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxkaXYgI2Ryb3Bkb3duRmllbGRUcmlnZ2VyUm9vdCBjbGFzcz1cIm11bHRpc2VsZWN0LWZpZWxkX19vcmlnaW5cIiBhcHBEcm9wZG93blRyaWdnZXJcbiAgICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICAgIGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGRfX3ZhbHVlLWJ0blwiXG4gICAgICAgICAgW2NsYXNzLm11bHRpc2VsZWN0LWZpZWxkX192YWx1ZS1idG4tLWlzLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbaWRdPVwiY29udHJvbElkXCJcbiAgICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWUgfHwgbnVsbFwiXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1yZWFkb25seV09XCJyZWFkb25seSAmJiAhZGlzYWJsZWQgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW5cIlxuICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInBhbmVsT3BlbiA/IG9wdGlvbnNMaXN0SWQgOiBudWxsXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwidWlJbnZhbGlkXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInVpQXJpYURlc2NyaWJlZEJ5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImZsb2F0TGFiZWxDYXB0aW9uIHx8IHBsYWNlaG9sZGVyIHx8ICdTZWxlY2lvbmFyIHbDoXJpb3MnXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblRvZ2dsZSgpXCJcbiAgICAgICAgICAoYmx1cik9XCJvbkRyb3Bkb3duQmx1cigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGRfX3ZhbHVlXCI+e3sgZGlzcGxheVN1bW1hcnkgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm11bHRpc2VsZWN0LWZpZWxkX19jaGV2cm9uLWJ0blwiIHRhYmluZGV4PVwiLTFcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxPcGVuXCIgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIiBhcmlhLWxhYmVsPVwiQWJyaXIgbGlzdGEgZGUgb3DDp8O1ZXNcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuVG9nZ2xlKClcIiAoYmx1cik9XCJvbkRyb3Bkb3duQmx1cigkZXZlbnQpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJmYS1zb2xpZCBmYS1jaGV2cm9uLWRvd24gbXVsdGlzZWxlY3QtZmllbGRfX2NoZXZyb24taWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2FwcC1kcm9wZG93bi1iYXNlPlxuICA8L2Rpdj5cbjwvYXBwLWJhc2UtZmllbGQ+XG5cbjxuZy10ZW1wbGF0ZSAjb3B0aW9uc1BhbmVsVHBsPlxuICA8ZGl2IGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGRfX2xpc3RcIiBbaWRdPVwib3B0aW9uc0xpc3RJZFwiIHJvbGU9XCJsaXN0Ym94XCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwidHJ1ZVwiXG4gICAgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICAgKGJsdXIpPVwib25Ecm9wZG93bkJsdXIoJGV2ZW50KVwiIChrZXlkb3duKT1cIm9uTGlzdEtleWRvd24oJGV2ZW50KVwiIChzY3JvbGwpPVwib25PcHRpb25zTGlzdFNjcm9sbCgkZXZlbnQpXCI+XG4gICAgQGlmIChsaXN0T3B0aW9ucy5sZW5ndGggPT09IDAgJiYgKG9wdGlvbnNMb2FkaW5nIHx8IChwYWdpbmF0aW9uICYmIGxvYWRpbmdNb3JlKSkpIHtcbiAgICA8YXBwLXNrZWxldG9uLWxpc3QgW3Jvd3NdPVwiOFwiIC8+XG4gICAgfVxuICAgIEBmb3IgKG9wdCBvZiBsaXN0T3B0aW9uczsgdHJhY2sgdHJhY2tPcHRpb24oJGluZGV4LCBvcHQpKSB7XG4gICAgPGRpdiByb2xlPVwib3B0aW9uXCIgY2xhc3M9XCJtdWx0aXNlbGVjdC1maWVsZF9fb3B0aW9uXCIgW2NsYXNzLm11bHRpc2VsZWN0LWZpZWxkX19vcHRpb24tLWRpc2FibGVkXT1cIm9wdC5kaXNhYmxlZFwiXG4gICAgICBbY2xhc3MubXVsdGlzZWxlY3QtZmllbGRfX29wdGlvbi0tc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCJcbiAgICAgIFtjbGFzcy5tdWx0aXNlbGVjdC1maWVsZF9fb3B0aW9uLS1hY3RpdmVdPVwiIW9wdC5kaXNhYmxlZCAmJiBhY3RpdmVJbmRleCA9PT0gJGluZGV4XCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIm9wdC5kaXNhYmxlZCA/IG51bGwgOiAtMVwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChvcHQpXCIgKGNsaWNrKT1cInRvZ2dsZU9wdGlvbihvcHQpXCJcbiAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uUm93S2V5ZG93bigkZXZlbnQsIG9wdClcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGRfX2NoZWNrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIEBpZiAoaXNTZWxlY3RlZChvcHQpKSB7XG4gICAgICAgIDxpIGNsYXNzPVwiZmEtc29saWQgZmEtY2hlY2sgbXVsdGlzZWxlY3QtZmllbGRfX2NoZWNrLWljb25cIj48L2k+XG4gICAgICAgIH1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwibXVsdGlzZWxlY3QtZmllbGRfX29wdGlvbi1sYWJlbFwiPnt7IG9wdC5sYWJlbCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChvcHRpb25zLmxlbmd0aCA+IDAgJiYgcGFnaW5hdGlvbiAmJiBsb2FkaW5nTW9yZSkge1xuICAgIDxhcHAtc2tlbGV0b24tbGlzdCBbcm93c109XCIxXCIgW2xlYWRpbmddPVwiZmFsc2VcIiAvPlxuICAgIH1cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19