@design-system-rte/angular 1.2.1-rc5 → 1.4.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.
Files changed (30) hide show
  1. package/esm2022/lib/components/dropdown/dropdown-item/dropdown-item.component.mjs +157 -14
  2. package/esm2022/lib/components/dropdown/dropdown-menu/dropdown-menu.component.mjs +71 -6
  3. package/esm2022/lib/components/dropdown/dropdown.directive.mjs +48 -39
  4. package/esm2022/lib/components/dropdown/dropdown.types.mjs +2 -0
  5. package/esm2022/lib/components/dropdown/index.mjs +1 -3
  6. package/esm2022/lib/components/icon/icon-map.mjs +112 -112
  7. package/esm2022/lib/components/modal/modal.component.mjs +3 -3
  8. package/esm2022/lib/components/segmented-control/segmented-control.component.mjs +5 -3
  9. package/esm2022/lib/components/side-nav/side-nav.component.mjs +1 -1
  10. package/esm2022/lib/components/stepper/stepper.component.mjs +3 -3
  11. package/esm2022/lib/components/tab/tab-item/tab-item.component.mjs +3 -3
  12. package/esm2022/lib/components/tab/tab.component.mjs +1 -1
  13. package/esm2022/lib/components/tag/tag.component.mjs +4 -3
  14. package/esm2022/public-api.mjs +9 -1
  15. package/fesm2022/design-system-rte-angular.mjs +431 -219
  16. package/fesm2022/design-system-rte-angular.mjs.map +1 -1
  17. package/lib/components/assistive-text/assistive-text.component.d.ts +1 -1
  18. package/lib/components/chip/chip.component.d.ts +1 -1
  19. package/lib/components/dropdown/dropdown-item/dropdown-item.component.d.ts +28 -16
  20. package/lib/components/dropdown/dropdown-menu/dropdown-menu.component.d.ts +14 -3
  21. package/lib/components/dropdown/dropdown.directive.d.ts +8 -4
  22. package/lib/components/dropdown/dropdown.types.d.ts +30 -0
  23. package/lib/components/dropdown/index.d.ts +1 -0
  24. package/lib/components/segmented-control/segmented-control.component.d.ts +3 -1
  25. package/lib/components/side-nav/side-nav.component.d.ts +2 -2
  26. package/lib/components/tab/tab.component.d.ts +1 -1
  27. package/lib/components/tag/tag.component.d.ts +2 -1
  28. package/lib/components/text-input/base-text-input/base-text-input.component.d.ts +1 -1
  29. package/package.json +2 -2
  30. package/public-api.d.ts +8 -0
@@ -1,17 +1,34 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { Component, computed, input, output } from "@angular/core";
2
+ import { ChangeDetectorRef, Component, computed, ElementRef, inject, input, output, signal, } from "@angular/core";
3
3
  import { shouldDisplayBadge } from "@design-system-rte/core/components/badge/badge.utils";
4
+ import { DropdownManager } from "@design-system-rte/core/components/dropdown/DropdownManager";
4
5
  import { ENTER_KEY, SPACE_KEY } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
5
6
  import { BadgeComponent } from "../../badge/badge.component";
6
7
  import { DividerComponent } from "../../divider/divider.component";
7
8
  import { IconComponent } from "../../icon/icon.component";
9
+ import { focusDropdownFirstElement } from "../dropdown.utils";
8
10
  import * as i0 from "@angular/core";
9
11
  import * as i1 from "@angular/common";
12
+ const SUB_MENU_CLOSE_DELAY_MS = 300;
10
13
  export class DropdownItemComponent {
11
14
  constructor() {
15
+ this.elementRef = inject(ElementRef);
16
+ this.cdr = inject(ChangeDetectorRef);
12
17
  this.item = input();
13
18
  this.menuId = input();
14
19
  this.itemEvent = output();
20
+ this.submenuRequest = output();
21
+ this.subMenuOpen = signal(false);
22
+ this.subMenuRef = null;
23
+ this.closeSubMenuTimeout = null;
24
+ this.subMenuSubscriptions = [];
25
+ this.dropdownManagerUnsubscribe = null;
26
+ this.hasChildren = computed(() => (this.item()?.children?.length ?? 0) > 0);
27
+ this.childDropdownId = computed(() => {
28
+ const menuId = this.menuId();
29
+ const label = this.item()?.label ?? "";
30
+ return menuId && label ? `${menuId}-${label.replace(/\s+/g, "")}` : "";
31
+ });
15
32
  this.shouldDisplayBadge = computed(() => {
16
33
  const item = this.item();
17
34
  return shouldDisplayBadge({
@@ -21,6 +38,7 @@ export class DropdownItemComponent {
21
38
  badgeIcon: item?.badgeIcon,
22
39
  });
23
40
  });
41
+ this.boundHandleSubMenuMouseEnter = () => this.handleSubMenuMouseEnter();
24
42
  }
25
43
  handleClick(event) {
26
44
  if (this.item()?.disabled) {
@@ -28,31 +46,156 @@ export class DropdownItemComponent {
28
46
  event.stopPropagation();
29
47
  return;
30
48
  }
49
+ if (this.hasChildren()) {
50
+ event.preventDefault();
51
+ event.stopPropagation();
52
+ this.openSubMenu();
53
+ return;
54
+ }
31
55
  this.itemEvent.emit({
32
56
  event,
33
57
  id: this.item()?.id || this.item()?.label || "",
58
+ item: this.item(),
34
59
  });
35
60
  }
36
61
  handleKeyDown(event) {
37
62
  event.preventDefault();
38
- if ([SPACE_KEY, ENTER_KEY].includes(event.key)) {
39
- if (this.item()?.link) {
40
- const link = event.target.closest("li")?.querySelector("a");
41
- link?.click();
42
- }
43
- else {
44
- this.itemEvent.emit({
45
- event,
46
- id: this.item()?.id || this.item()?.label || "",
47
- });
63
+ if (this.item()?.link && [SPACE_KEY, ENTER_KEY].includes(event.key)) {
64
+ const link = event.target.closest("li")?.querySelector("a");
65
+ link?.click();
66
+ return;
67
+ }
68
+ if (this.hasChildren()) {
69
+ if (event.key === SPACE_KEY) {
70
+ this.openSubMenu();
71
+ const childId = this.childDropdownId();
72
+ if (childId) {
73
+ setTimeout(() => focusDropdownFirstElement(childId), 0);
74
+ }
48
75
  }
76
+ return;
77
+ }
78
+ if ([SPACE_KEY, ENTER_KEY].includes(event.key)) {
79
+ this.itemEvent.emit({
80
+ event,
81
+ id: this.item()?.id || this.item()?.label || "",
82
+ item: this.item(),
83
+ });
84
+ }
85
+ }
86
+ handleMouseEnter() {
87
+ if (this.item()?.disabled || !this.hasChildren())
88
+ return;
89
+ const menuId = this.menuId();
90
+ const childId = this.childDropdownId();
91
+ if (menuId) {
92
+ DropdownManager.closeSubMenus(menuId, childId);
93
+ this.openSubMenu();
94
+ }
95
+ }
96
+ handleFocus() {
97
+ if (this.item()?.disabled || !this.hasChildren())
98
+ return;
99
+ const menuId = this.menuId();
100
+ const childId = this.childDropdownId();
101
+ if (menuId) {
102
+ DropdownManager.closeSubMenus(menuId, childId);
103
+ }
104
+ }
105
+ handleMouseLeave() {
106
+ if (!this.hasChildren())
107
+ return;
108
+ this.scheduleCloseSubMenu();
109
+ }
110
+ handleSubMenuMouseEnter() {
111
+ this.cancelCloseSubMenu();
112
+ }
113
+ openSubMenuForKeyboard() {
114
+ this.openSubMenu();
115
+ const childId = this.childDropdownId();
116
+ if (childId) {
117
+ setTimeout(() => focusDropdownFirstElement(childId), 0);
118
+ }
119
+ }
120
+ openSubMenu() {
121
+ if (this.subMenuRef)
122
+ return;
123
+ const children = this.item()?.children;
124
+ const childId = this.childDropdownId();
125
+ if (!children?.length || !childId)
126
+ return;
127
+ const triggerElement = this.elementRef.nativeElement.querySelector("li.rte-dropdown-item");
128
+ if (!triggerElement)
129
+ return;
130
+ DropdownManager.open(childId);
131
+ this.submenuRequest.emit({
132
+ children,
133
+ childId,
134
+ triggerElement,
135
+ onCreated: (result) => this.wireSubmenu(result),
136
+ });
137
+ }
138
+ wireSubmenu(result) {
139
+ if (this.subMenuRef)
140
+ return;
141
+ this.subMenuRef = result.componentRef;
142
+ const hostElement = result.hostElement;
143
+ const childId = this.childDropdownId();
144
+ this.dropdownManagerUnsubscribe = DropdownManager.subscribe(childId ?? "", () => this.destroySubMenu());
145
+ const menuInstance = this.subMenuRef.instance;
146
+ const itemSub = menuInstance.itemEvent.subscribe((emittedItemEvent) => {
147
+ this.itemEvent.emit({ ...emittedItemEvent, item: emittedItemEvent.item });
148
+ });
149
+ const closeSub = menuInstance.closingMenu.subscribe(() => {
150
+ this.destroySubMenu();
151
+ });
152
+ this.subMenuSubscriptions.push(() => {
153
+ itemSub.unsubscribe();
154
+ closeSub.unsubscribe();
155
+ });
156
+ hostElement.addEventListener("mouseenter", this.boundHandleSubMenuMouseEnter);
157
+ this.subMenuOpen.set(true);
158
+ this.cdr.markForCheck();
159
+ }
160
+ scheduleCloseSubMenu() {
161
+ this.cancelCloseSubMenu();
162
+ this.closeSubMenuTimeout = setTimeout(() => {
163
+ this.closeSubMenuTimeout = null;
164
+ this.destroySubMenu();
165
+ }, SUB_MENU_CLOSE_DELAY_MS);
166
+ }
167
+ cancelCloseSubMenu() {
168
+ if (this.closeSubMenuTimeout) {
169
+ clearTimeout(this.closeSubMenuTimeout);
170
+ this.closeSubMenuTimeout = null;
49
171
  }
50
172
  }
173
+ destroySubMenu() {
174
+ this.cancelCloseSubMenu();
175
+ this.subMenuSubscriptions.forEach((unsubscribe) => unsubscribe());
176
+ this.subMenuSubscriptions = [];
177
+ if (this.subMenuRef) {
178
+ const hostElement = this.subMenuRef.location.nativeElement;
179
+ hostElement.removeEventListener("mouseenter", this.boundHandleSubMenuMouseEnter);
180
+ const childId = this.childDropdownId();
181
+ this.dropdownManagerUnsubscribe?.();
182
+ this.dropdownManagerUnsubscribe = null;
183
+ if (childId)
184
+ DropdownManager.close(childId);
185
+ this.subMenuRef.destroy();
186
+ this.subMenuRef = null;
187
+ }
188
+ this.subMenuOpen.set(false);
189
+ this.cdr.markForCheck();
190
+ }
191
+ ngOnDestroy() {
192
+ this.destroySubMenu();
193
+ }
51
194
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
52
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: DropdownItemComponent, isStandalone: true, selector: "rte-dropdown-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent" }, ngImport: i0, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"item()?.selected\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge"] }] }); }
195
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: DropdownItemComponent, isStandalone: true, selector: "rte-dropdown-item", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", submenuRequest: "submenuRequest" }, ngImport: i0, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"hasChildren() ? subMenuOpen() : item()?.selected\"\n [attr.aria-haspopup]=\"hasChildren() ? 'menu' : null\"\n [attr.aria-expanded]=\"hasChildren() ? subMenuOpen() : null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (focus)=\"handleFocus()\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <rte-icon *ngIf=\"hasChildren()\" name=\"arrow-chevron-right\" />\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: IconComponent, selector: "rte-icon", inputs: ["name", "size", "color", "classes", "appearance"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }, { kind: "component", type: BadgeComponent, selector: "rte-badge", inputs: ["badgeType", "badgeSize", "badgeContent", "count", "icon", "simpleBadge"] }] }); }
53
196
  }
54
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownItemComponent, decorators: [{
55
198
  type: Component,
56
- args: [{ selector: "rte-dropdown-item", imports: [CommonModule, IconComponent, DividerComponent, BadgeComponent], standalone: true, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"item()?.selected\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"] }]
199
+ args: [{ selector: "rte-dropdown-item", imports: [CommonModule, IconComponent, DividerComponent, BadgeComponent], standalone: true, template: "<ng-container>\n <li\n #itemRef\n class=\"rte-dropdown-item\"\n role=\"menuitem\"\n tabindex=\"0\"\n [attr.data-disabled]=\"item()?.disabled\"\n [attr.data-active]=\"hasChildren() ? subMenuOpen() : item()?.selected\"\n [attr.aria-haspopup]=\"hasChildren() ? 'menu' : null\"\n [attr.aria-expanded]=\"hasChildren() ? subMenuOpen() : null\"\n (click)=\"handleClick($event)\"\n (keydown)=\"handleKeyDown($event)\"\n (mouseenter)=\"handleMouseEnter()\"\n (mouseleave)=\"handleMouseLeave()\"\n (focus)=\"handleFocus()\"\n >\n <span *ngIf=\"item()?.hasIndent && !item()?.leftIcon\" style=\"width: 20px\"></span>\n <rte-icon *ngIf=\"item()?.leftIcon\" [name]=\"item()?.leftIcon ?? ''\" />\n <ng-container [ngSwitch]=\"!!item()?.link\">\n <a *ngSwitchCase=\"true\" style=\"flex: 2; text-decoration: none; color: inherit\" [href]=\"item()?.link\"\n >{{ item()?.label }}\n </a>\n <span *ngSwitchDefault style=\"flex: 2\">{{ item()?.label }}</span>\n </ng-container>\n <rte-icon *ngIf=\"hasChildren()\" name=\"arrow-chevron-right\" />\n <div *ngIf=\"item()?.trailingText\">{{ item()?.trailingText }}</div>\n <rte-badge\n *ngIf=\"shouldDisplayBadge()\"\n [badgeType]=\"item()?.badgeType!\"\n [badgeContent]=\"item()?.badgeContent!\"\n [count]=\"item()?.badgeCount\"\n [simpleBadge]=\"true\"\n [icon]=\"item()?.badgeIcon ?? ''\"\n [badgeSize]=\"item()?.badgeSize!\"\n ></rte-badge>\n </li>\n <div *ngIf=\"item()?.hasSeparator\" class=\"dropdown-divider\">\n <rte-divider />\n </div>\n</ng-container>\n", styles: [".rte-dropdown-item{font-family:Arial;font-size:14px;font-weight:400;line-height:20px;letter-spacing:0px;color:var(--content-secondary);display:flex;height:40px;padding:8px 12px;align-items:center;gap:12px;align-self:stretch;cursor:pointer;box-sizing:border-box}.rte-dropdown-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rte-dropdown-item:hover{background-color:var(--background-hover)}.rte-dropdown-item[data-disabled=true]{cursor:not-allowed;color:var(--content-disabled);background:var(--background-disabled)}.rte-dropdown-item[data-active=true]{background-color:var(--background-brand-inverse-pressed)}.rte-dropdown-item:focus-visible{outline:none;background-color:var(--background-hover)}.dropdown-divider{width:100%;padding:8px 0}\n"] }]
57
200
  }] });
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24taXRlbS9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUUxRixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBRXJHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQXNCMUQsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVFXLFNBQUksR0FBRyxLQUFLLEVBQXNCLENBQUM7UUFDbkMsV0FBTSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxNQUFNLEVBQWdDLENBQUM7UUFFbkQsdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxrQkFBa0IsQ0FBQztnQkFDeEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUztnQkFDNUIsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZO2dCQUNoQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVU7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUzthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztLQTZCSjtJQTNCQyxXQUFXLENBQUMsS0FBWTtRQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsS0FBSztZQUNMLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRTtTQUNoRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW9CO1FBQ2hDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztvQkFDbEIsS0FBSztvQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7aUJBQ2hELENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0F6Q1UscUJBQXFCO21HQUFyQixxQkFBcUIsOFdDOUJsQywwdkNBa0NBLGt6QkRUWSxZQUFZLCtZQUFFLGFBQWEsaUhBQUUsZ0JBQWdCLHdIQUFFLGNBQWM7OzRGQUs1RCxxQkFBcUI7a0JBUGpDLFNBQVM7K0JBQ0UsbUJBQW1CLFdBQ3BCLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsY0FDNUQsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIEV2ZW50RW1pdHRlciwgaW5wdXQsIG91dHB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBzaG91bGREaXNwbGF5QmFkZ2UgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9iYWRnZS9iYWRnZS51dGlsc1wiO1xuaW1wb3J0IHsgRHJvcGRvd25JdGVtUHJvcHMgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEVOVEVSX0tFWSwgU1BBQ0VfS0VZIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbnN0YW50cy9rZXlib2FyZC9rZXlib2FyZC5jb25zdGFudHNcIjtcblxuaW1wb3J0IHsgQmFkZ2VDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vYmFkZ2UvYmFkZ2UuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEaXZpZGVyQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2RpdmlkZXIvZGl2aWRlci5jb21wb25lbnRcIjtcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tIFwiLi4vLi4vaWNvbi9pY29uLmNvbXBvbmVudFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bkb3duSXRlbUNvbmZpZyBleHRlbmRzIE9taXQ8RHJvcGRvd25JdGVtUHJvcHMsIFwib25DbGlja1wiPiB7XG4gIGlkPzogc3RyaW5nO1xuICBzZWxlY3RlZD86IGJvb2xlYW47XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxlZnRJY29uPzogc3RyaW5nO1xuICB0cmFpbGluZ1RleHQ/OiBzdHJpbmc7XG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgaGFzU2VwYXJhdG9yPzogYm9vbGVhbjtcbiAgaGFzSW5kZW50PzogYm9vbGVhbjtcbiAgbGluaz86IHN0cmluZztcbiAgY2xpY2s/OiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLWRyb3Bkb3duLWl0ZW1cIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgRGl2aWRlckNvbXBvbmVudCwgQmFkZ2VDb21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5zY3NzXCIsXG59KVxuZXhwb3J0IGNsYXNzIERyb3Bkb3duSXRlbUNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGl0ZW0gPSBpbnB1dDxEcm9wZG93bkl0ZW1Db25maWc+KCk7XG4gIHJlYWRvbmx5IG1lbnVJZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaXRlbUV2ZW50ID0gb3V0cHV0PHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0+KCk7XG5cbiAgcmVhZG9ubHkgc2hvdWxkRGlzcGxheUJhZGdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICByZXR1cm4gc2hvdWxkRGlzcGxheUJhZGdlKHtcbiAgICAgIHNob3dCYWRnZTogISFpdGVtPy5zaG93QmFkZ2UsXG4gICAgICBiYWRnZUNvbnRlbnQ6IGl0ZW0/LmJhZGdlQ29udGVudCxcbiAgICAgIGJhZGdlQ291bnQ6IGl0ZW0/LmJhZGdlQ291bnQsXG4gICAgICBiYWRnZUljb246IGl0ZW0/LmJhZGdlSWNvbixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbSgpPy5kaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLml0ZW1FdmVudC5lbWl0KHtcbiAgICAgIGV2ZW50LFxuICAgICAgaWQ6IHRoaXMuaXRlbSgpPy5pZCB8fCB0aGlzLml0ZW0oKT8ubGFiZWwgfHwgXCJcIixcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKFtTUEFDRV9LRVksIEVOVEVSX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgaWYgKHRoaXMuaXRlbSgpPy5saW5rKSB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwibGlcIik/LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgICAgICBsaW5rPy5jbGljaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pdGVtRXZlbnQuZW1pdCh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgaWQ6IHRoaXMuaXRlbSgpPy5pZCB8fCB0aGlzLml0ZW0oKT8ubGFiZWwgfHwgXCJcIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyPlxuICA8bGlcbiAgICAjaXRlbVJlZlxuICAgIGNsYXNzPVwicnRlLWRyb3Bkb3duLWl0ZW1cIlxuICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICBbYXR0ci5kYXRhLWRpc2FibGVkXT1cIml0ZW0oKT8uZGlzYWJsZWRcIlxuICAgIFthdHRyLmRhdGEtYWN0aXZlXT1cIml0ZW0oKT8uc2VsZWN0ZWRcIlxuICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlEb3duKCRldmVudClcIlxuICA+XG4gICAgPHNwYW4gKm5nSWY9XCJpdGVtKCk/Lmhhc0luZGVudCAmJiAhaXRlbSgpPy5sZWZ0SWNvblwiIHN0eWxlPVwid2lkdGg6IDIwcHhcIj48L3NwYW4+XG4gICAgPHJ0ZS1pY29uICpuZ0lmPVwiaXRlbSgpPy5sZWZ0SWNvblwiIFtuYW1lXT1cIml0ZW0oKT8ubGVmdEljb24gPz8gJydcIiAvPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cIiEhaXRlbSgpPy5saW5rXCI+XG4gICAgICA8YSAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiIHN0eWxlPVwiZmxleDogMjsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBjb2xvcjogaW5oZXJpdFwiIFtocmVmXT1cIml0ZW0oKT8ubGlua1wiXG4gICAgICAgID57eyBpdGVtKCk/LmxhYmVsIH19XG4gICAgICA8L2E+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IHN0eWxlPVwiZmxleDogMlwiPnt7IGl0ZW0oKT8ubGFiZWwgfX08L3NwYW4+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW0oKT8udHJhaWxpbmdUZXh0XCI+e3sgaXRlbSgpPy50cmFpbGluZ1RleHQgfX08L2Rpdj5cbiAgICA8cnRlLWJhZGdlXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlCYWRnZSgpXCJcbiAgICAgIFtiYWRnZVR5cGVdPVwiaXRlbSgpPy5iYWRnZVR5cGUhXCJcbiAgICAgIFtiYWRnZUNvbnRlbnRdPVwiaXRlbSgpPy5iYWRnZUNvbnRlbnQhXCJcbiAgICAgIFtjb3VudF09XCJpdGVtKCk/LmJhZGdlQ291bnRcIlxuICAgICAgW3NpbXBsZUJhZGdlXT1cInRydWVcIlxuICAgICAgW2ljb25dPVwiaXRlbSgpPy5iYWRnZUljb24gPz8gJydcIlxuICAgICAgW2JhZGdlU2l6ZV09XCJpdGVtKCk/LmJhZGdlU2l6ZSFcIlxuICAgID48L3J0ZS1iYWRnZT5cbiAgPC9saT5cbiAgPGRpdiAqbmdJZj1cIml0ZW0oKT8uaGFzU2VwYXJhdG9yXCIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+XG4gICAgPHJ0ZS1kaXZpZGVyIC8+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24taXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24taXRlbS9kcm9wZG93bi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUYsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7QUFJOUQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFTcEMsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVFXLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXhDLFNBQUksR0FBRyxLQUFLLEVBQXNCLENBQUM7UUFDbkMsV0FBTSxHQUFHLEtBQUssRUFBVSxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxNQUFNLEVBQTJELENBQUM7UUFDOUUsbUJBQWMsR0FBRyxNQUFNLEVBQXVCLENBQUM7UUFFL0MsZ0JBQVcsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFdEMsZUFBVSxHQUF5RCxJQUFJLENBQUM7UUFDeEUsd0JBQW1CLEdBQXlDLElBQUksQ0FBQztRQUNqRSx5QkFBb0IsR0FBbUIsRUFBRSxDQUFDO1FBQzFDLCtCQUEwQixHQUF3QixJQUFJLENBQUM7UUFFdEQsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO1FBRU0sdUJBQWtCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsT0FBTyxrQkFBa0IsQ0FBQztnQkFDeEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUztnQkFDNUIsWUFBWSxFQUFFLElBQUksRUFBRSxZQUFZO2dCQUNoQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVU7Z0JBQzVCLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUzthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQTJKYyxpQ0FBNEIsR0FBRyxHQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztLQXVCNUY7SUFoTEMsV0FBVyxDQUFDLEtBQVk7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNsQixLQUFLO1lBQ0wsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBb0I7UUFDaEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXZCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEUsTUFBTSxJQUFJLEdBQUksS0FBSyxDQUFDLE1BQXNCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDZCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQkFDWixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDbEIsS0FBSztnQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU87UUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1FBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLGVBQWUsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFFMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUF1QixDQUFDO1FBQ2pILElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTztRQUU1QixlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLFFBQVE7WUFDUixPQUFPO1lBQ1AsY0FBYztZQUNkLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDaEQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUE0QjtRQUM5QyxJQUFJLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUV4RyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBT3BDLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDOUMsQ0FBQyxnQkFBeUUsRUFBRSxFQUFFO1lBQzVFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1RSxDQUFDLENBQ0YsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN2RCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUU5RSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDekMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSU8sY0FBYztRQUNwQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsYUFBNEIsQ0FBQztZQUMxRSxXQUFXLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7WUFDdkMsSUFBSSxPQUFPO2dCQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDOytHQWhOVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixnWkNqQ2xDLGlsREF3Q0Esa3pCRFpZLFlBQVksK1lBQUUsYUFBYSxpSEFBRSxnQkFBZ0Isd0hBQUUsY0FBYzs7NEZBSzVELHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSxtQkFBbUIsV0FDcEIsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxjQUM1RCxJQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBzaG91bGREaXNwbGF5QmFkZ2UgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9iYWRnZS9iYWRnZS51dGlsc1wiO1xuaW1wb3J0IHsgRHJvcGRvd25NYW5hZ2VyIH0gZnJvbSBcIkBkZXNpZ24tc3lzdGVtLXJ0ZS9jb3JlL2NvbXBvbmVudHMvZHJvcGRvd24vRHJvcGRvd25NYW5hZ2VyXCI7XG5pbXBvcnQgeyBFTlRFUl9LRVksIFNQQUNFX0tFWSB9IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb25zdGFudHMva2V5Ym9hcmQva2V5Ym9hcmQuY29uc3RhbnRzXCI7XG5cbmltcG9ydCB7IEJhZGdlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2JhZGdlL2JhZGdlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRGl2aWRlckNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9kaXZpZGVyL2RpdmlkZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2ljb24vaWNvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IERyb3Bkb3duSXRlbUNvbmZpZywgU3VibWVudUNyZWF0ZWRSZXN1bHQsIFN1Ym1lbnVSZXF1ZXN0RXZlbnQgfSBmcm9tIFwiLi4vZHJvcGRvd24udHlwZXNcIjtcbmltcG9ydCB7IGZvY3VzRHJvcGRvd25GaXJzdEVsZW1lbnQgfSBmcm9tIFwiLi4vZHJvcGRvd24udXRpbHNcIjtcblxuZXhwb3J0IHR5cGUgeyBEcm9wZG93bkl0ZW1Db25maWcgfTtcblxuY29uc3QgU1VCX01FTlVfQ0xPU0VfREVMQVlfTVMgPSAzMDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJydGUtZHJvcGRvd24taXRlbVwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJY29uQ29tcG9uZW50LCBEaXZpZGVyQ29tcG9uZW50LCBCYWRnZUNvbXBvbmVudF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiBcIi4vZHJvcGRvd24taXRlbS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybDogXCIuL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50LnNjc3NcIixcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25JdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIHJlYWRvbmx5IGl0ZW0gPSBpbnB1dDxEcm9wZG93bkl0ZW1Db25maWc+KCk7XG4gIHJlYWRvbmx5IG1lbnVJZCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgaXRlbUV2ZW50ID0gb3V0cHV0PHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nOyBpdGVtPzogRHJvcGRvd25JdGVtQ29uZmlnIH0+KCk7XG4gIHJlYWRvbmx5IHN1Ym1lbnVSZXF1ZXN0ID0gb3V0cHV0PFN1Ym1lbnVSZXF1ZXN0RXZlbnQ+KCk7XG5cbiAgcmVhZG9ubHkgc3ViTWVudU9wZW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgc3ViTWVudVJlZjogaW1wb3J0KFwiQGFuZ3VsYXIvY29yZVwiKS5Db21wb25lbnRSZWY8dW5rbm93bj4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjbG9zZVN1Yk1lbnVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN1Yk1lbnVTdWJzY3JpcHRpb25zOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIGRyb3Bkb3duTWFuYWdlclVuc3Vic2NyaWJlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICByZWFkb25seSBoYXNDaGlsZHJlbiA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLml0ZW0oKT8uY2hpbGRyZW4/Lmxlbmd0aCA/PyAwKSA+IDApO1xuICByZWFkb25seSBjaGlsZERyb3Bkb3duSWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbWVudUlkID0gdGhpcy5tZW51SWQoKTtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuaXRlbSgpPy5sYWJlbCA/PyBcIlwiO1xuICAgIHJldHVybiBtZW51SWQgJiYgbGFiZWwgPyBgJHttZW51SWR9LSR7bGFiZWwucmVwbGFjZSgvXFxzKy9nLCBcIlwiKX1gIDogXCJcIjtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgc2hvdWxkRGlzcGxheUJhZGdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICByZXR1cm4gc2hvdWxkRGlzcGxheUJhZGdlKHtcbiAgICAgIHNob3dCYWRnZTogISFpdGVtPy5zaG93QmFkZ2UsXG4gICAgICBiYWRnZUNvbnRlbnQ6IGl0ZW0/LmJhZGdlQ29udGVudCxcbiAgICAgIGJhZGdlQ291bnQ6IGl0ZW0/LmJhZGdlQ291bnQsXG4gICAgICBiYWRnZUljb246IGl0ZW0/LmJhZGdlSWNvbixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbSgpPy5kaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNDaGlsZHJlbigpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB0aGlzLm9wZW5TdWJNZW51KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXRlbUV2ZW50LmVtaXQoe1xuICAgICAgZXZlbnQsXG4gICAgICBpZDogdGhpcy5pdGVtKCk/LmlkIHx8IHRoaXMuaXRlbSgpPy5sYWJlbCB8fCBcIlwiLFxuICAgICAgaXRlbTogdGhpcy5pdGVtKCksXG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLml0ZW0oKT8ubGluayAmJiBbU1BBQ0VfS0VZLCBFTlRFUl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IGxpbmsgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwibGlcIik/LnF1ZXJ5U2VsZWN0b3IoXCJhXCIpO1xuICAgICAgbGluaz8uY2xpY2soKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oYXNDaGlsZHJlbigpKSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBTUEFDRV9LRVkpIHtcbiAgICAgICAgdGhpcy5vcGVuU3ViTWVudSgpO1xuICAgICAgICBjb25zdCBjaGlsZElkID0gdGhpcy5jaGlsZERyb3Bkb3duSWQoKTtcbiAgICAgICAgaWYgKGNoaWxkSWQpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzRHJvcGRvd25GaXJzdEVsZW1lbnQoY2hpbGRJZCksIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFtTUEFDRV9LRVksIEVOVEVSX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgdGhpcy5pdGVtRXZlbnQuZW1pdCh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBpZDogdGhpcy5pdGVtKCk/LmlkIHx8IHRoaXMuaXRlbSgpPy5sYWJlbCB8fCBcIlwiLFxuICAgICAgICBpdGVtOiB0aGlzLml0ZW0oKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbSgpPy5kaXNhYmxlZCB8fCAhdGhpcy5oYXNDaGlsZHJlbigpKSByZXR1cm47XG4gICAgY29uc3QgbWVudUlkID0gdGhpcy5tZW51SWQoKTtcbiAgICBjb25zdCBjaGlsZElkID0gdGhpcy5jaGlsZERyb3Bkb3duSWQoKTtcbiAgICBpZiAobWVudUlkKSB7XG4gICAgICBEcm9wZG93bk1hbmFnZXIuY2xvc2VTdWJNZW51cyhtZW51SWQsIGNoaWxkSWQpO1xuICAgICAgdGhpcy5vcGVuU3ViTWVudSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLml0ZW0oKT8uZGlzYWJsZWQgfHwgIXRoaXMuaGFzQ2hpbGRyZW4oKSkgcmV0dXJuO1xuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubWVudUlkKCk7XG4gICAgY29uc3QgY2hpbGRJZCA9IHRoaXMuY2hpbGREcm9wZG93bklkKCk7XG4gICAgaWYgKG1lbnVJZCkge1xuICAgICAgRHJvcGRvd25NYW5hZ2VyLmNsb3NlU3ViTWVudXMobWVudUlkLCBjaGlsZElkKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNb3VzZUxlYXZlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNDaGlsZHJlbigpKSByZXR1cm47XG4gICAgdGhpcy5zY2hlZHVsZUNsb3NlU3ViTWVudSgpO1xuICB9XG5cbiAgaGFuZGxlU3ViTWVudU1vdXNlRW50ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxDbG9zZVN1Yk1lbnUoKTtcbiAgfVxuXG4gIG9wZW5TdWJNZW51Rm9yS2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU3ViTWVudSgpO1xuICAgIGNvbnN0IGNoaWxkSWQgPSB0aGlzLmNoaWxkRHJvcGRvd25JZCgpO1xuICAgIGlmIChjaGlsZElkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IGZvY3VzRHJvcGRvd25GaXJzdEVsZW1lbnQoY2hpbGRJZCksIDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlblN1Yk1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3ViTWVudVJlZikgcmV0dXJuO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5pdGVtKCk/LmNoaWxkcmVuO1xuICAgIGNvbnN0IGNoaWxkSWQgPSB0aGlzLmNoaWxkRHJvcGRvd25JZCgpO1xuICAgIGlmICghY2hpbGRyZW4/Lmxlbmd0aCB8fCAhY2hpbGRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHJpZ2dlckVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwibGkucnRlLWRyb3Bkb3duLWl0ZW1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghdHJpZ2dlckVsZW1lbnQpIHJldHVybjtcblxuICAgIERyb3Bkb3duTWFuYWdlci5vcGVuKGNoaWxkSWQpO1xuXG4gICAgdGhpcy5zdWJtZW51UmVxdWVzdC5lbWl0KHtcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgY2hpbGRJZCxcbiAgICAgIHRyaWdnZXJFbGVtZW50LFxuICAgICAgb25DcmVhdGVkOiAocmVzdWx0KSA9PiB0aGlzLndpcmVTdWJtZW51KHJlc3VsdCksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHdpcmVTdWJtZW51KHJlc3VsdDogU3VibWVudUNyZWF0ZWRSZXN1bHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdWJNZW51UmVmKSByZXR1cm47XG4gICAgdGhpcy5zdWJNZW51UmVmID0gcmVzdWx0LmNvbXBvbmVudFJlZjtcbiAgICBjb25zdCBob3N0RWxlbWVudCA9IHJlc3VsdC5ob3N0RWxlbWVudDtcbiAgICBjb25zdCBjaGlsZElkID0gdGhpcy5jaGlsZERyb3Bkb3duSWQoKTtcblxuICAgIHRoaXMuZHJvcGRvd25NYW5hZ2VyVW5zdWJzY3JpYmUgPSBEcm9wZG93bk1hbmFnZXIuc3Vic2NyaWJlKGNoaWxkSWQgPz8gXCJcIiwgKCkgPT4gdGhpcy5kZXN0cm95U3ViTWVudSgpKTtcblxuICAgIGNvbnN0IG1lbnVJbnN0YW5jZSA9IHRoaXMuc3ViTWVudVJlZi5pbnN0YW5jZSBhcyB7XG4gICAgICBpdGVtRXZlbnQ6IHtcbiAgICAgICAgc3Vic2NyaWJlOiAoY2FsbGJhY2s6IChldmVudDogeyBldmVudDogRXZlbnQ7IGlkOiBzdHJpbmc7IGl0ZW0/OiBEcm9wZG93bkl0ZW1Db25maWcgfSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNsb3NpbmdNZW51OiB7IHN1YnNjcmliZTogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH0gfTtcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW1TdWIgPSBtZW51SW5zdGFuY2UuaXRlbUV2ZW50LnN1YnNjcmliZShcbiAgICAgIChlbWl0dGVkSXRlbUV2ZW50OiB7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9KSA9PiB7XG4gICAgICAgIHRoaXMuaXRlbUV2ZW50LmVtaXQoeyAuLi5lbWl0dGVkSXRlbUV2ZW50LCBpdGVtOiBlbWl0dGVkSXRlbUV2ZW50Lml0ZW0gfSk7XG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgY2xvc2VTdWIgPSBtZW51SW5zdGFuY2UuY2xvc2luZ01lbnUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZGVzdHJveVN1Yk1lbnUoKTtcbiAgICB9KTtcbiAgICB0aGlzLnN1Yk1lbnVTdWJzY3JpcHRpb25zLnB1c2goKCkgPT4ge1xuICAgICAgaXRlbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgY2xvc2VTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIGhvc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXMuYm91bmRIYW5kbGVTdWJNZW51TW91c2VFbnRlcik7XG5cbiAgICB0aGlzLnN1Yk1lbnVPcGVuLnNldCh0cnVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVDbG9zZVN1Yk1lbnUoKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxDbG9zZVN1Yk1lbnUoKTtcbiAgICB0aGlzLmNsb3NlU3ViTWVudVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VTdWJNZW51VGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmRlc3Ryb3lTdWJNZW51KCk7XG4gICAgfSwgU1VCX01FTlVfQ0xPU0VfREVMQVlfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxDbG9zZVN1Yk1lbnUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xvc2VTdWJNZW51VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VTdWJNZW51VGltZW91dCk7XG4gICAgICB0aGlzLmNsb3NlU3ViTWVudVRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRIYW5kbGVTdWJNZW51TW91c2VFbnRlciA9ICgpOiB2b2lkID0+IHRoaXMuaGFuZGxlU3ViTWVudU1vdXNlRW50ZXIoKTtcblxuICBwcml2YXRlIGRlc3Ryb3lTdWJNZW51KCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsQ2xvc2VTdWJNZW51KCk7XG4gICAgdGhpcy5zdWJNZW51U3Vic2NyaXB0aW9ucy5mb3JFYWNoKCh1bnN1YnNjcmliZSkgPT4gdW5zdWJzY3JpYmUoKSk7XG4gICAgdGhpcy5zdWJNZW51U3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIGlmICh0aGlzLnN1Yk1lbnVSZWYpIHtcbiAgICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gdGhpcy5zdWJNZW51UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBob3N0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCB0aGlzLmJvdW5kSGFuZGxlU3ViTWVudU1vdXNlRW50ZXIpO1xuICAgICAgY29uc3QgY2hpbGRJZCA9IHRoaXMuY2hpbGREcm9wZG93bklkKCk7XG4gICAgICB0aGlzLmRyb3Bkb3duTWFuYWdlclVuc3Vic2NyaWJlPy4oKTtcbiAgICAgIHRoaXMuZHJvcGRvd25NYW5hZ2VyVW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgaWYgKGNoaWxkSWQpIERyb3Bkb3duTWFuYWdlci5jbG9zZShjaGlsZElkKTtcbiAgICAgIHRoaXMuc3ViTWVudVJlZi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnN1Yk1lbnVSZWYgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnN1Yk1lbnVPcGVuLnNldChmYWxzZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lTdWJNZW51KCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXI+XG4gIDxsaVxuICAgICNpdGVtUmVmXG4gICAgY2xhc3M9XCJydGUtZHJvcGRvd24taXRlbVwiXG4gICAgcm9sZT1cIm1lbnVpdGVtXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuICAgIFthdHRyLmRhdGEtZGlzYWJsZWRdPVwiaXRlbSgpPy5kaXNhYmxlZFwiXG4gICAgW2F0dHIuZGF0YS1hY3RpdmVdPVwiaGFzQ2hpbGRyZW4oKSA/IHN1Yk1lbnVPcGVuKCkgOiBpdGVtKCk/LnNlbGVjdGVkXCJcbiAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cImhhc0NoaWxkcmVuKCkgPyAnbWVudScgOiBudWxsXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImhhc0NoaWxkcmVuKCkgPyBzdWJNZW51T3BlbigpIDogbnVsbFwiXG4gICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKCRldmVudClcIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleURvd24oJGV2ZW50KVwiXG4gICAgKG1vdXNlZW50ZXIpPVwiaGFuZGxlTW91c2VFbnRlcigpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJoYW5kbGVNb3VzZUxlYXZlKClcIlxuICAgIChmb2N1cyk9XCJoYW5kbGVGb2N1cygpXCJcbiAgPlxuICAgIDxzcGFuICpuZ0lmPVwiaXRlbSgpPy5oYXNJbmRlbnQgJiYgIWl0ZW0oKT8ubGVmdEljb25cIiBzdHlsZT1cIndpZHRoOiAyMHB4XCI+PC9zcGFuPlxuICAgIDxydGUtaWNvbiAqbmdJZj1cIml0ZW0oKT8ubGVmdEljb25cIiBbbmFtZV09XCJpdGVtKCk/LmxlZnRJY29uID8/ICcnXCIgLz5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCIhIWl0ZW0oKT8ubGlua1wiPlxuICAgICAgPGEgKm5nU3dpdGNoQ2FzZT1cInRydWVcIiBzdHlsZT1cImZsZXg6IDI7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6IGluaGVyaXRcIiBbaHJlZl09XCJpdGVtKCk/LmxpbmtcIlxuICAgICAgICA+e3sgaXRlbSgpPy5sYWJlbCB9fVxuICAgICAgPC9hPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBzdHlsZT1cImZsZXg6IDJcIj57eyBpdGVtKCk/LmxhYmVsIH19PC9zcGFuPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxydGUtaWNvbiAqbmdJZj1cImhhc0NoaWxkcmVuKClcIiBuYW1lPVwiYXJyb3ctY2hldnJvbi1yaWdodFwiIC8+XG4gICAgPGRpdiAqbmdJZj1cIml0ZW0oKT8udHJhaWxpbmdUZXh0XCI+e3sgaXRlbSgpPy50cmFpbGluZ1RleHQgfX08L2Rpdj5cbiAgICA8cnRlLWJhZGdlXG4gICAgICAqbmdJZj1cInNob3VsZERpc3BsYXlCYWRnZSgpXCJcbiAgICAgIFtiYWRnZVR5cGVdPVwiaXRlbSgpPy5iYWRnZVR5cGUhXCJcbiAgICAgIFtiYWRnZUNvbnRlbnRdPVwiaXRlbSgpPy5iYWRnZUNvbnRlbnQhXCJcbiAgICAgIFtjb3VudF09XCJpdGVtKCk/LmJhZGdlQ291bnRcIlxuICAgICAgW3NpbXBsZUJhZGdlXT1cInRydWVcIlxuICAgICAgW2ljb25dPVwiaXRlbSgpPy5iYWRnZUljb24gPz8gJydcIlxuICAgICAgW2JhZGdlU2l6ZV09XCJpdGVtKCk/LmJhZGdlU2l6ZSFcIlxuICAgID48L3J0ZS1iYWRnZT5cbiAgPC9saT5cbiAgPGRpdiAqbmdJZj1cIml0ZW0oKT8uaGFzU2VwYXJhdG9yXCIgY2xhc3M9XCJkcm9wZG93bi1kaXZpZGVyXCI+XG4gICAgPHJ0ZS1kaXZpZGVyIC8+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
@@ -1,9 +1,14 @@
1
1
  import { CommonModule } from "@angular/common";
2
- import { Component, computed, contentChild, ElementRef, HostListener, inject, input, output, viewChild, } from "@angular/core";
3
- import { ARROW_DOWN_KEY, ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ESCAPE_KEY, TAB_KEY, } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
2
+ import { Component, computed, contentChild, ElementRef, HostListener, inject, input, output, ViewContainerRef, viewChild, viewChildren, } from "@angular/core";
3
+ import { DropdownManager } from "@design-system-rte/core/components/dropdown/DropdownManager";
4
+ import { getAutoAlignment, getAutoPlacementDropdown, getCoordinates, } from "@design-system-rte/core/components/utils/auto-placement";
5
+ import { ARROW_DOWN_KEY, ARROW_UP_KEY, ESCAPE_KEY, TAB_KEY, } from "@design-system-rte/core/constants/keyboard/keyboard.constants";
6
+ import { logError, logWarn } from "@design-system-rte/core/utils/log-handlers";
4
7
  import { DropdownService } from "../../../services/dropdown.service";
8
+ import { OverlayService } from "../../../services/overlay.service";
5
9
  import { DividerComponent } from "../../divider/divider.component";
6
10
  import { DropdownItemComponent } from "../dropdown-item/dropdown-item.component";
11
+ import { focusParentDropdownFirstElement } from "../dropdown.utils";
7
12
  import { DropdownMenuFooterDirective } from "./dropdown-menu-footer.directive";
8
13
  import { DropdownMenuHeaderDirective } from "./dropdown-menu-header.directive";
9
14
  import * as i0 from "@angular/core";
@@ -11,7 +16,10 @@ import * as i1 from "@angular/common";
11
16
  export class DropdownMenuComponent {
12
17
  constructor() {
13
18
  this.elementRef = inject(ElementRef);
19
+ this.pendingPositioningFrameId = null;
14
20
  this.dropdownService = inject(DropdownService);
21
+ this.overlayService = inject(OverlayService);
22
+ this.viewContainerRef = inject(ViewContainerRef);
15
23
  this.items = input([]);
16
24
  this.menuId = input();
17
25
  this.itemEvent = output();
@@ -28,6 +36,7 @@ export class DropdownMenuComponent {
28
36
  this.footerTemplate = input(undefined);
29
37
  this.headerContentRef = viewChild("headerContent");
30
38
  this.footerContentRef = viewChild("footerContent");
39
+ this.itemComponents = viewChildren(DropdownItemComponent);
31
40
  this.hasHeaderContent = computed(() => {
32
41
  const hasTemplate = !!this.headerTemplate();
33
42
  const hasProjectedContent = !!this.headerContentRef()?.nativeElement?.children.length;
@@ -39,36 +48,92 @@ export class DropdownMenuComponent {
39
48
  return hasTemplate || hasProjectedContent;
40
49
  });
41
50
  }
51
+ static { this.SUB_MENU_OFFSET = 4; }
42
52
  getChildMenuId(itemIndex) {
43
53
  return `${this.menuId()}:${itemIndex + 1}`;
44
54
  }
45
55
  handleItemEvent(itemEvent) {
46
56
  this.itemEvent.emit(itemEvent);
47
57
  }
58
+ handleSubmenuRequest(event) {
59
+ const { children, childId, triggerElement, onCreated } = event;
60
+ const componentRef = this.overlayService.create(DropdownMenuComponent, this.viewContainerRef);
61
+ componentRef.setInput("items", children);
62
+ componentRef.setInput("menuId", childId);
63
+ componentRef.setInput("isOpen", true);
64
+ const hostElement = componentRef.location.nativeElement;
65
+ this.cancelPendingPositioningFrame();
66
+ this.pendingPositioningFrameId = requestAnimationFrame(() => {
67
+ this.pendingPositioningFrameId = null;
68
+ try {
69
+ const subMenuHost = componentRef.location?.nativeElement;
70
+ const menuElement = subMenuHost?.querySelector(".rte-dropdown-menu");
71
+ if (!triggerElement || !menuElement) {
72
+ logWarn("DropdownMenuComponent", "Unable to position submenu: required DOM elements not found.");
73
+ return;
74
+ }
75
+ const position = getAutoPlacementDropdown({
76
+ hostElement: triggerElement,
77
+ castedElement: menuElement,
78
+ defaultPosition: "right",
79
+ offset: DropdownMenuComponent.SUB_MENU_OFFSET,
80
+ hasDropdownParent: true,
81
+ });
82
+ const alignment = getAutoAlignment(triggerElement, menuElement, position);
83
+ const coords = getCoordinates(position, triggerElement, menuElement, DropdownMenuComponent.SUB_MENU_OFFSET, alignment);
84
+ hostElement.style.display = "block";
85
+ hostElement.style.position = "absolute";
86
+ hostElement.style.top = `${coords.top}px`;
87
+ hostElement.style.left = `${coords.left}px`;
88
+ hostElement.style.opacity = "1";
89
+ }
90
+ catch (error) {
91
+ logError("DropdownMenuComponent", "Error while positioning submenu:", error);
92
+ }
93
+ });
94
+ onCreated({ componentRef, hostElement });
95
+ }
96
+ ngOnDestroy() {
97
+ this.cancelPendingPositioningFrame();
98
+ }
99
+ cancelPendingPositioningFrame() {
100
+ if (this.pendingPositioningFrameId !== null) {
101
+ cancelAnimationFrame(this.pendingPositioningFrameId);
102
+ this.pendingPositioningFrameId = null;
103
+ }
104
+ }
48
105
  onKeyDown(event) {
49
106
  if (!event.target || !this.menuId()) {
50
107
  return;
51
108
  }
52
- if ([ARROW_UP_KEY, ARROW_DOWN_KEY, ARROW_LEFT_KEY, ARROW_RIGHT_KEY, TAB_KEY].includes(event.key)) {
109
+ if ([ARROW_UP_KEY, ARROW_DOWN_KEY, TAB_KEY].includes(event.key)) {
53
110
  event.preventDefault();
54
111
  }
55
112
  if (event.key === ESCAPE_KEY) {
56
113
  this.closingMenu.emit();
57
114
  }
58
115
  const menuId = this.menuId();
116
+ if (event.key === TAB_KEY && event.shiftKey) {
117
+ const parentMenuId = DropdownManager.getParentDropdownId(menuId);
118
+ if (parentMenuId) {
119
+ focusParentDropdownFirstElement(menuId);
120
+ this.closingMenu.emit();
121
+ return;
122
+ }
123
+ }
59
124
  this.dropdownService.handleKeyboardInput(event.key, {
60
125
  menuElement: this.elementRef,
61
126
  menuId,
62
127
  });
63
128
  }
64
129
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DropdownMenuComponent, isStandalone: true, selector: "rte-dropdown-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", closingMenu: "closingMenu" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.data-menu-id": "menuId()" } }, queries: [{ propertyName: "headerDirective", first: true, predicate: DropdownMenuHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerDirective", first: true, predicate: DropdownMenuFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "headerContentRef", first: true, predicate: ["headerContent"], descendants: true, isSignal: true }, { propertyName: "footerContentRef", first: true, predicate: ["footerContent"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item [item]=\"item\" (itemEvent)=\"handleItemEvent($event)\" />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DropdownItemComponent, selector: "rte-dropdown-item", inputs: ["item", "menuId"], outputs: ["itemEvent"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }] }); }
130
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DropdownMenuComponent, isStandalone: true, selector: "rte-dropdown-menu", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, menuId: { classPropertyName: "menuId", publicName: "menuId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, footerTemplate: { classPropertyName: "footerTemplate", publicName: "footerTemplate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemEvent: "itemEvent", closingMenu: "closingMenu" }, host: { listeners: { "keydown": "onKeyDown($event)" }, properties: { "attr.data-menu-id": "menuId()" } }, queries: [{ propertyName: "headerDirective", first: true, predicate: DropdownMenuHeaderDirective, descendants: true, isSignal: true }, { propertyName: "footerDirective", first: true, predicate: DropdownMenuFooterDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "headerContentRef", first: true, predicate: ["headerContent"], descendants: true, isSignal: true }, { propertyName: "footerContentRef", first: true, predicate: ["footerContent"], descendants: true, isSignal: true }, { propertyName: "itemComponents", predicate: DropdownItemComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item\n [item]=\"item\"\n [menuId]=\"menuId()\"\n (itemEvent)=\"handleItemEvent($event)\"\n (submenuRequest)=\"handleSubmenuRequest($event)\"\n />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DropdownItemComponent, selector: "rte-dropdown-item", inputs: ["item", "menuId"], outputs: ["itemEvent", "submenuRequest"] }, { kind: "component", type: DividerComponent, selector: "rte-divider", inputs: ["orientation", "thickness", "appearance", "endPoint"] }] }); }
66
131
  }
67
132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DropdownMenuComponent, decorators: [{
68
133
  type: Component,
69
- args: [{ selector: "rte-dropdown-menu", imports: [CommonModule, DropdownItemComponent, DividerComponent], standalone: true, host: { "[attr.data-menu-id]": "menuId()" }, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item [item]=\"item\" (itemEvent)=\"handleItemEvent($event)\" />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"] }]
134
+ args: [{ selector: "rte-dropdown-menu", imports: [CommonModule, DropdownItemComponent, DividerComponent], standalone: true, host: { "[attr.data-menu-id]": "menuId()" }, template: "<div class=\"rte-dropdown-menu {{ isOpen() ? 'open' : 'closed' }}\" [ngStyle]=\"menuStyle()\">\n @if (hasHeaderContent()) {\n <div class=\"rte-dropdown-menu-header\">\n @if (headerTemplate() || headerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(headerTemplate() || headerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #headerContent>\n <ng-content select=\"[dropdown-menu-header]\"></ng-content>\n </div>\n }\n <rte-divider />\n </div>\n }\n <div class=\"rte-dropdown-menu-content\">\n <ul class=\"rte-dropdown-items\" role=\"menu\" [attr.aria-activedescendant]=\"menuId()\">\n @for (item of items(); track item.label; let i = $index) {\n <rte-dropdown-item\n [item]=\"item\"\n [menuId]=\"menuId()\"\n (itemEvent)=\"handleItemEvent($event)\"\n (submenuRequest)=\"handleSubmenuRequest($event)\"\n />\n }\n </ul>\n </div>\n @if (hasFooterContent()) {\n <div class=\"rte-dropdown-menu-footer\">\n <rte-divider />\n @if (footerTemplate() || footerDirective()?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"(footerTemplate() || footerDirective()?.templateRef) ?? null\"></ng-container>\n } @else {\n <div #footerContent>\n <ng-content select=\"[dropdown-menu-footer]\"></ng-content>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{display:none;position:absolute}.rte-dropdown-menu{opacity:0;box-shadow:0 8px 16px 0 var(--elevation-shadow-key),0 0 2px 0 var(--elevation-shadow-ambient);background:linear-gradient(0deg,var(--elevation-surface-shadow-4) 0%,var(--elevation-surface-shadow-4) 100%);background-color:var(--background-default);position:absolute;top:0;left:0;display:flex;min-width:112px;max-width:280px;padding:8px 0;flex-direction:column;align-items:flex-start;gap:0px;border-radius:4px;transition:opacity .1s ease-in-out;pointer-events:auto;overflow-x:hidden;overflow-y:auto}.rte-dropdown-menu-header,.rte-dropdown-menu-content,.rte-dropdown-menu-footer{width:100%}.rte-dropdown-menu.open{opacity:1}.rte-dropdown-menu .rte-dropdown-items{width:100%;padding:0;margin:0}.rte-dropdown-menu .rte-dropdown-items li{list-style:none}\n"] }]
70
135
  }], propDecorators: { onKeyDown: [{
71
136
  type: HostListener,
72
137
  args: ["keydown", ["$event"]]
73
138
  }] } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEVBQ1YsT0FBTyxHQUNSLE1BQU0sK0RBQStELENBQUM7QUFFdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBc0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUVyRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBVS9FLE1BQU0sT0FBTyxxQkFBcUI7SUFSbEM7UUFTbUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxvQkFBZSxHQUFHLE1BQU0s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ekIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFZLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUM1QixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FsRVUscUJBQXFCO21HQUFyQixxQkFBcUIsNmpDQWtCUSwyQkFBMkIsa0dBQzNCLDJCQUEyQix1VEN4RHJFLDZ5Q0FpQ0EsdzJCREZZLFlBQVksMlJBQUUscUJBQXFCLGtIQUFFLGdCQUFnQjs7NEZBTXBELHFCQUFxQjtrQkFSakMsU0FBUzsrQkFDRSxtQkFBbUIsV0FDcEIsQ0FBQyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsY0FDcEQsSUFBSSxRQUdWLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFOzhCQWtEM0MsU0FBUztzQkFEUixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGNvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBvdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICB2aWV3Q2hpbGQsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBBUlJPV19ET1dOX0tFWSxcbiAgQVJST1dfTEVGVF9LRVksXG4gIEFSUk9XX1JJR0hUX0tFWSxcbiAgQVJST1dfVVBfS0VZLFxuICBFU0NBUEVfS0VZLFxuICBUQUJfS0VZLFxufSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29uc3RhbnRzL2tleWJvYXJkL2tleWJvYXJkLmNvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBEcm9wZG93blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvZHJvcGRvd24uc2VydmljZVwiO1xuaW1wb3J0IHsgRGl2aWRlckNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9kaXZpZGVyL2RpdmlkZXIuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9wZG93bkl0ZW1Db21wb25lbnQsIERyb3Bkb3duSXRlbUNvbmZpZyB9IGZyb20gXCIuLi9kcm9wZG93bi1pdGVtL2Ryb3Bkb3duLWl0ZW0uY29tcG9uZW50XCI7XG5cbmltcG9ydCB7IERyb3Bkb3duTWVudUZvb3RlckRpcmVjdGl2ZSB9IGZyb20gXCIuL2Ryb3Bkb3duLW1lbnUtZm9vdGVyLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgRHJvcGRvd25NZW51SGVhZGVyRGlyZWN0aXZlIH0gZnJvbSBcIi4vZHJvcGRvd24tbWVudS1oZWFkZXIuZGlyZWN0aXZlXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJydGUtZHJvcGRvd24tbWVudVwiLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEcm9wZG93bkl0ZW1Db21wb25lbnQsIERpdmlkZXJDb21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZVVybDogXCIuL2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmw6IFwiLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5zY3NzXCIsXG4gIGhvc3Q6IHsgXCJbYXR0ci5kYXRhLW1lbnUtaWRdXCI6IFwibWVudUlkKClcIiB9LFxufSlcbmV4cG9ydCBjbGFzcyBEcm9wZG93bk1lbnVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25TZXJ2aWNlID0gaW5qZWN0KERyb3Bkb3duU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgaXRlbXMgPSBpbnB1dDxEcm9wZG93bkl0ZW1Db25maWdbXT4oW10pO1xuICByZWFkb25seSBtZW51SWQgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgcmVhZG9ubHkgaXRlbUV2ZW50ID0gb3V0cHV0PHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0+KCk7XG5cbiAgcmVhZG9ubHkgd2lkdGhTdHlsZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLndpZHRoKCkgIT09IHVuZGVmaW5lZCA/IGAke3RoaXMud2lkdGgoKX1weGAgOiB1bmRlZmluZWQpKTtcbiAgcmVhZG9ubHkgaXNPcGVuID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB3aWR0aCA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuICByZWFkb25seSBjbG9zaW5nTWVudSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IG1lbnVTdHlsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCgpID8geyB3aWR0aDogdGhpcy53aWR0aCgpICsgXCJweFwiLCBcIm1heC13aWR0aFwiOiB0aGlzLndpZHRoKCkgKyBcInB4XCIgfSA6IHt9O1xuICB9KTtcblxuICByZWFkb25seSBoZWFkZXJEaXJlY3RpdmUgPSBjb250ZW50Q2hpbGQoRHJvcGRvd25NZW51SGVhZGVyRGlyZWN0aXZlKTtcbiAgcmVhZG9ubHkgZm9vdGVyRGlyZWN0aXZlID0gY29udGVudENoaWxkKERyb3Bkb3duTWVudUZvb3RlckRpcmVjdGl2ZSk7XG5cbiAgcmVhZG9ubHkgaGVhZGVyVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGZvb3RlclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IGhlYWRlckNvbnRlbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KFwiaGVhZGVyQ29udGVudFwiKTtcbiAgcmVhZG9ubHkgZm9vdGVyQ29udGVudFJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oXCJmb290ZXJDb250ZW50XCIpO1xuXG4gIHJlYWRvbmx5IGhhc0hlYWRlckNvbnRlbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaGFzVGVtcGxhdGUgPSAhIXRoaXMuaGVhZGVyVGVtcGxhdGUoKTtcbiAgICBjb25zdCBoYXNQcm9qZWN0ZWRDb250ZW50ID0gISF0aGlzLmhlYWRlckNvbnRlbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uY2hpbGRyZW4ubGVuZ3RoO1xuICAgIHJldHVybiBoYXNUZW1wbGF0ZSB8fCBoYXNQcm9qZWN0ZWRDb250ZW50O1xuICB9KTtcblxuICByZWFkb25seSBoYXNGb290ZXJDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1RlbXBsYXRlID0gISF0aGlzLmZvb3RlclRlbXBsYXRlKCk7XG4gICAgY29uc3QgaGFzUHJvamVjdGVkQ29udGVudCA9ICEhdGhpcy5mb290ZXJDb250ZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNoaWxkcmVuLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzVGVtcGxhdGUgfHwgaGFzUHJvamVjdGVkQ29udGVudDtcbiAgfSk7XG5cbiAgZ2V0Q2hpbGRNZW51SWQoaXRlbUluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1lbnVJZCgpfToke2l0ZW1JbmRleCArIDF9YDtcbiAgfVxuXG4gIGhhbmRsZUl0ZW1FdmVudChpdGVtRXZlbnQ6IHsgZXZlbnQ6IEV2ZW50OyBpZDogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLml0ZW1FdmVudC5lbWl0KGl0ZW1FdmVudCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQudGFyZ2V0IHx8ICF0aGlzLm1lbnVJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFtBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBBUlJPV19MRUZUX0tFWSwgQVJST1dfUklHSFRfS0VZLCBUQUJfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgIHRoaXMuY2xvc2luZ01lbnUuZW1pdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubWVudUlkKCkgYXMgc3RyaW5nO1xuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkSW5wdXQoZXZlbnQua2V5LCB7XG4gICAgICBtZW51RWxlbWVudDogdGhpcy5lbGVtZW50UmVmLFxuICAgICAgbWVudUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUge3sgaXNPcGVuKCkgPyAnb3BlbicgOiAnY2xvc2VkJyB9fVwiIFtuZ1N0eWxlXT1cIm1lbnVTdHlsZSgpXCI+XG4gIEBpZiAoaGFzSGVhZGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWhlYWRlclwiPlxuICAgICAgQGlmIChoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikge1xuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIihoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikgPz8gbnVsbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgI2hlYWRlckNvbnRlbnQ+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Ryb3Bkb3duLW1lbnUtaGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtY29udGVudFwiPlxuICAgIDx1bCBjbGFzcz1cInJ0ZS1kcm9wZG93bi1pdGVtc1wiIHJvbGU9XCJtZW51XCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm1lbnVJZCgpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0ubGFiZWw7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxydGUtZHJvcGRvd24taXRlbSBbaXRlbV09XCJpdGVtXCIgKGl0ZW1FdmVudCk9XCJoYW5kbGVJdGVtRXZlbnQoJGV2ZW50KVwiIC8+XG4gICAgICB9XG4gICAgPC91bD5cbiAgPC9kaXY+XG4gIEBpZiAoaGFzRm9vdGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWZvb3RlclwiPlxuICAgICAgPHJ0ZS1kaXZpZGVyIC8+XG4gICAgICBAaWYgKGZvb3RlclRlbXBsYXRlKCkgfHwgZm9vdGVyRGlyZWN0aXZlKCk/LnRlbXBsYXRlUmVmKSB7XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiKGZvb3RlclRlbXBsYXRlKCkgfHwgZm9vdGVyRGlyZWN0aXZlKCk/LnRlbXBsYXRlUmVmKSA/PyBudWxsXCI+PC9uZy1jb250YWluZXI+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiAjZm9vdGVyQ29udGVudD5cbiAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZHJvcGRvd24tbWVudS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG4iXX0=
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kcy1ydGUtbGliL3NyYy9saWIvY29tcG9uZW50cy9kcm9wZG93bi9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHMtcnRlLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZHJvcGRvd24vZHJvcGRvd24tbWVudS9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sRUFFTixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDOUYsT0FBTyxFQUNMLGdCQUFnQixFQUNoQix3QkFBd0IsRUFDeEIsY0FBYyxHQUNmLE1BQU0seURBQXlELENBQUM7QUFDakUsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sR0FDUixNQUFNLCtEQUErRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUscUJB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QixNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0EvSVUscUJBQXFCO21HQUFyQixxQkFBcUIsNmpDQXNCUSwyQkFBMkIsa0dBQzNCLDJCQUEyQiwyVUFPNUIscUJBQXFCLGdFQzlFOUQsMDZDQXNDQSx3MkJESVksWUFBWSwyUkFBRSxxQkFBcUIsb0lBQUUsZ0JBQWdCOzs0RkFNcEQscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLG1CQUFtQixXQUNwQixDQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxjQUNwRCxJQUFJLFFBR1YsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUU7OEJBcUgzQyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgY29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgb3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgdmlld0NoaWxkLFxuICB2aWV3Q2hpbGRyZW4sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBEcm9wZG93bk1hbmFnZXIgfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29tcG9uZW50cy9kcm9wZG93bi9Ecm9wZG93bk1hbmFnZXJcIjtcbmltcG9ydCB7XG4gIGdldEF1dG9BbGlnbm1lbnQsXG4gIGdldEF1dG9QbGFjZW1lbnREcm9wZG93bixcbiAgZ2V0Q29vcmRpbmF0ZXMsXG59IGZyb20gXCJAZGVzaWduLXN5c3RlbS1ydGUvY29yZS9jb21wb25lbnRzL3V0aWxzL2F1dG8tcGxhY2VtZW50XCI7XG5pbXBvcnQge1xuICBBUlJPV19ET1dOX0tFWSxcbiAgQVJST1dfVVBfS0VZLFxuICBFU0NBUEVfS0VZLFxuICBUQUJfS0VZLFxufSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvY29uc3RhbnRzL2tleWJvYXJkL2tleWJvYXJkLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9nRXJyb3IsIGxvZ1dhcm4gfSBmcm9tIFwiQGRlc2lnbi1zeXN0ZW0tcnRlL2NvcmUvdXRpbHMvbG9nLWhhbmRsZXJzXCI7XG5cbmltcG9ydCB7IERyb3Bkb3duU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9kcm9wZG93bi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9vdmVybGF5LnNlcnZpY2VcIjtcbmltcG9ydCB7IERpdmlkZXJDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vZGl2aWRlci9kaXZpZGVyLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgRHJvcGRvd25JdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2Ryb3Bkb3duLWl0ZW0vZHJvcGRvd24taXRlbS5jb21wb25lbnRcIjtcbmltcG9ydCB7IERyb3Bkb3duSXRlbUNvbmZpZywgU3VibWVudVJlcXVlc3RFdmVudCB9IGZyb20gXCIuLi9kcm9wZG93bi50eXBlc1wiO1xuaW1wb3J0IHsgZm9jdXNQYXJlbnREcm9wZG93bkZpcnN0RWxlbWVudCB9IGZyb20gXCIuLi9kcm9wZG93bi51dGlsc1wiO1xuXG5pbXBvcnQgeyBEcm9wZG93bk1lbnVGb290ZXJEaXJlY3RpdmUgfSBmcm9tIFwiLi9kcm9wZG93bi1tZW51LWZvb3Rlci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IERyb3Bkb3duTWVudUhlYWRlckRpcmVjdGl2ZSB9IGZyb20gXCIuL2Ryb3Bkb3duLW1lbnUtaGVhZGVyLmRpcmVjdGl2ZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwicnRlLWRyb3Bkb3duLW1lbnVcIixcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRHJvcGRvd25JdGVtQ29tcG9uZW50LCBEaXZpZGVyQ29tcG9uZW50XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGVVcmw6IFwiLi9kcm9wZG93bi1tZW51LmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsOiBcIi4vZHJvcGRvd24tbWVudS5jb21wb25lbnQuc2Nzc1wiLFxuICBob3N0OiB7IFwiW2F0dHIuZGF0YS1tZW51LWlkXVwiOiBcIm1lbnVJZCgpXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VCX01FTlVfT0ZGU0VUID0gNDtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRyb3Bkb3duU2VydmljZSA9IGluamVjdChEcm9wZG93blNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlTZXJ2aWNlID0gaW5qZWN0KE92ZXJsYXlTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpO1xuXG4gIHJlYWRvbmx5IGl0ZW1zID0gaW5wdXQ8RHJvcGRvd25JdGVtQ29uZmlnW10+KFtdKTtcbiAgcmVhZG9ubHkgbWVudUlkID0gaW5wdXQ8c3RyaW5nPigpO1xuXG4gIHJlYWRvbmx5IGl0ZW1FdmVudCA9IG91dHB1dDx7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9PigpO1xuXG4gIHJlYWRvbmx5IHdpZHRoU3R5bGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy53aWR0aCgpICE9PSB1bmRlZmluZWQgPyBgJHt0aGlzLndpZHRoKCl9cHhgIDogdW5kZWZpbmVkKSk7XG4gIHJlYWRvbmx5IGlzT3BlbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgd2lkdGggPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgY2xvc2luZ01lbnUgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBtZW51U3R5bGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgoKSA/IHsgd2lkdGg6IHRoaXMud2lkdGgoKSArIFwicHhcIiwgXCJtYXgtd2lkdGhcIjogdGhpcy53aWR0aCgpICsgXCJweFwiIH0gOiB7fTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGVhZGVyRGlyZWN0aXZlID0gY29udGVudENoaWxkKERyb3Bkb3duTWVudUhlYWRlckRpcmVjdGl2ZSk7XG4gIHJlYWRvbmx5IGZvb3RlckRpcmVjdGl2ZSA9IGNvbnRlbnRDaGlsZChEcm9wZG93bk1lbnVGb290ZXJEaXJlY3RpdmUpO1xuXG4gIHJlYWRvbmx5IGhlYWRlclRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBmb290ZXJUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICByZWFkb25seSBoZWFkZXJDb250ZW50UmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihcImhlYWRlckNvbnRlbnRcIik7XG4gIHJlYWRvbmx5IGZvb3RlckNvbnRlbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KFwiZm9vdGVyQ29udGVudFwiKTtcbiAgcmVhZG9ubHkgaXRlbUNvbXBvbmVudHMgPSB2aWV3Q2hpbGRyZW4oRHJvcGRvd25JdGVtQ29tcG9uZW50KTtcblxuICByZWFkb25seSBoYXNIZWFkZXJDb250ZW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGhhc1RlbXBsYXRlID0gISF0aGlzLmhlYWRlclRlbXBsYXRlKCk7XG4gICAgY29uc3QgaGFzUHJvamVjdGVkQ29udGVudCA9ICEhdGhpcy5oZWFkZXJDb250ZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmNoaWxkcmVuLmxlbmd0aDtcbiAgICByZXR1cm4gaGFzVGVtcGxhdGUgfHwgaGFzUHJvamVjdGVkQ29udGVudDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGFzRm9vdGVyQ29udGVudCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBoYXNUZW1wbGF0ZSA9ICEhdGhpcy5mb290ZXJUZW1wbGF0ZSgpO1xuICAgIGNvbnN0IGhhc1Byb2plY3RlZENvbnRlbnQgPSAhIXRoaXMuZm9vdGVyQ29udGVudFJlZigpPy5uYXRpdmVFbGVtZW50Py5jaGlsZHJlbi5sZW5ndGg7XG4gICAgcmV0dXJuIGhhc1RlbXBsYXRlIHx8IGhhc1Byb2plY3RlZENvbnRlbnQ7XG4gIH0pO1xuXG4gIGdldENoaWxkTWVudUlkKGl0ZW1JbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tZW51SWQoKX06JHtpdGVtSW5kZXggKyAxfWA7XG4gIH1cblxuICBoYW5kbGVJdGVtRXZlbnQoaXRlbUV2ZW50OiB7IGV2ZW50OiBFdmVudDsgaWQ6IHN0cmluZzsgaXRlbT86IERyb3Bkb3duSXRlbUNvbmZpZyB9KTogdm9pZCB7XG4gICAgdGhpcy5pdGVtRXZlbnQuZW1pdChpdGVtRXZlbnQpO1xuICB9XG5cbiAgaGFuZGxlU3VibWVudVJlcXVlc3QoZXZlbnQ6IFN1Ym1lbnVSZXF1ZXN0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCBjaGlsZElkLCB0cmlnZ2VyRWxlbWVudCwgb25DcmVhdGVkIH0gPSBldmVudDtcblxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMub3ZlcmxheVNlcnZpY2UuY3JlYXRlKERyb3Bkb3duTWVudUNvbXBvbmVudCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICBjb21wb25lbnRSZWYuc2V0SW5wdXQoXCJpdGVtc1wiLCBjaGlsZHJlbik7XG4gICAgY29tcG9uZW50UmVmLnNldElucHV0KFwibWVudUlkXCIsIGNoaWxkSWQpO1xuICAgIGNvbXBvbmVudFJlZi5zZXRJbnB1dChcImlzT3BlblwiLCB0cnVlKTtcblxuICAgIGNvbnN0IGhvc3RFbGVtZW50ID0gY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICB0aGlzLmNhbmNlbFBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lKCk7XG4gICAgdGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1Bvc2l0aW9uaW5nRnJhbWVJZCA9IG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWJNZW51SG9zdCA9IGNvbXBvbmVudFJlZi5sb2NhdGlvbj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgIGNvbnN0IG1lbnVFbGVtZW50ID0gc3ViTWVudUhvc3Q/LnF1ZXJ5U2VsZWN0b3IoXCIucnRlLWRyb3Bkb3duLW1lbnVcIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgIGlmICghdHJpZ2dlckVsZW1lbnQgfHwgIW1lbnVFbGVtZW50KSB7XG4gICAgICAgICAgbG9nV2FybihcIkRyb3Bkb3duTWVudUNvbXBvbmVudFwiLCBcIlVuYWJsZSB0byBwb3NpdGlvbiBzdWJtZW51OiByZXF1aXJlZCBET00gZWxlbWVudHMgbm90IGZvdW5kLlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IGdldEF1dG9QbGFjZW1lbnREcm9wZG93bih7XG4gICAgICAgICAgaG9zdEVsZW1lbnQ6IHRyaWdnZXJFbGVtZW50LFxuICAgICAgICAgIGNhc3RlZEVsZW1lbnQ6IG1lbnVFbGVtZW50LFxuICAgICAgICAgIGRlZmF1bHRQb3NpdGlvbjogXCJyaWdodFwiLFxuICAgICAgICAgIG9mZnNldDogRHJvcGRvd25NZW51Q29tcG9uZW50LlNVQl9NRU5VX09GRlNFVCxcbiAgICAgICAgICBoYXNEcm9wZG93blBhcmVudDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEF1dG9BbGlnbm1lbnQodHJpZ2dlckVsZW1lbnQsIG1lbnVFbGVtZW50LCBwb3NpdGlvbik7XG4gICAgICAgIGNvbnN0IGNvb3JkcyA9IGdldENvb3JkaW5hdGVzKFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRyaWdnZXJFbGVtZW50LFxuICAgICAgICAgIG1lbnVFbGVtZW50LFxuICAgICAgICAgIERyb3Bkb3duTWVudUNvbXBvbmVudC5TVUJfTUVOVV9PRkZTRVQsXG4gICAgICAgICAgYWxpZ25tZW50LFxuICAgICAgICApO1xuXG4gICAgICAgIGhvc3RFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIGhvc3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuICAgICAgICBob3N0RWxlbWVudC5zdHlsZS50b3AgPSBgJHtjb29yZHMudG9wfXB4YDtcbiAgICAgICAgaG9zdEVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2Nvb3Jkcy5sZWZ0fXB4YDtcbiAgICAgICAgaG9zdEVsZW1lbnQuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nRXJyb3IoXCJEcm9wZG93bk1lbnVDb21wb25lbnRcIiwgXCJFcnJvciB3aGlsZSBwb3NpdGlvbmluZyBzdWJtZW51OlwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvbkNyZWF0ZWQoeyBjb21wb25lbnRSZWYsIGhvc3RFbGVtZW50IH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jYW5jZWxQZW5kaW5nUG9zaXRpb25pbmdGcmFtZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxQZW5kaW5nUG9zaXRpb25pbmdGcmFtZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnBlbmRpbmdQb3NpdGlvbmluZ0ZyYW1lSWQpO1xuICAgICAgdGhpcy5wZW5kaW5nUG9zaXRpb25pbmdGcmFtZUlkID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwia2V5ZG93blwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQudGFyZ2V0IHx8ICF0aGlzLm1lbnVJZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFtBUlJPV19VUF9LRVksIEFSUk9XX0RPV05fS0VZLCBUQUJfS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgIHRoaXMuY2xvc2luZ01lbnUuZW1pdCgpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnVJZCA9IHRoaXMubWVudUlkKCkgYXMgc3RyaW5nO1xuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gVEFCX0tFWSAmJiBldmVudC5zaGlmdEtleSkge1xuICAgICAgY29uc3QgcGFyZW50TWVudUlkID0gRHJvcGRvd25NYW5hZ2VyLmdldFBhcmVudERyb3Bkb3duSWQobWVudUlkKTtcbiAgICAgIGlmIChwYXJlbnRNZW51SWQpIHtcbiAgICAgICAgZm9jdXNQYXJlbnREcm9wZG93bkZpcnN0RWxlbWVudChtZW51SWQpO1xuICAgICAgICB0aGlzLmNsb3NpbmdNZW51LmVtaXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZHJvcGRvd25TZXJ2aWNlLmhhbmRsZUtleWJvYXJkSW5wdXQoZXZlbnQua2V5LCB7XG4gICAgICBtZW51RWxlbWVudDogdGhpcy5lbGVtZW50UmVmLFxuICAgICAgbWVudUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUge3sgaXNPcGVuKCkgPyAnb3BlbicgOiAnY2xvc2VkJyB9fVwiIFtuZ1N0eWxlXT1cIm1lbnVTdHlsZSgpXCI+XG4gIEBpZiAoaGFzSGVhZGVyQ29udGVudCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cInJ0ZS1kcm9wZG93bi1tZW51LWhlYWRlclwiPlxuICAgICAgQGlmIChoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikge1xuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIihoZWFkZXJUZW1wbGF0ZSgpIHx8IGhlYWRlckRpcmVjdGl2ZSgpPy50ZW1wbGF0ZVJlZikgPz8gbnVsbFwiPjwvbmctY29udGFpbmVyPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgI2hlYWRlckNvbnRlbnQ+XG4gICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Ryb3Bkb3duLW1lbnUtaGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtY29udGVudFwiPlxuICAgIDx1bCBjbGFzcz1cInJ0ZS1kcm9wZG93bi1pdGVtc1wiIHJvbGU9XCJtZW51XCIgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm1lbnVJZCgpXCI+XG4gICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zKCk7IHRyYWNrIGl0ZW0ubGFiZWw7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgIDxydGUtZHJvcGRvd24taXRlbVxuICAgICAgICAgIFtpdGVtXT1cIml0ZW1cIlxuICAgICAgICAgIFttZW51SWRdPVwibWVudUlkKClcIlxuICAgICAgICAgIChpdGVtRXZlbnQpPVwiaGFuZGxlSXRlbUV2ZW50KCRldmVudClcIlxuICAgICAgICAgIChzdWJtZW51UmVxdWVzdCk9XCJoYW5kbGVTdWJtZW51UmVxdWVzdCgkZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIH1cbiAgICA8L3VsPlxuICA8L2Rpdj5cbiAgQGlmIChoYXNGb290ZXJDb250ZW50KCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwicnRlLWRyb3Bkb3duLW1lbnUtZm9vdGVyXCI+XG4gICAgICA8cnRlLWRpdmlkZXIgLz5cbiAgICAgIEBpZiAoZm9vdGVyVGVtcGxhdGUoKSB8fCBmb290ZXJEaXJlY3RpdmUoKT8udGVtcGxhdGVSZWYpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCIoZm9vdGVyVGVtcGxhdGUoKSB8fCBmb290ZXJEaXJlY3RpdmUoKT8udGVtcGxhdGVSZWYpID8/IG51bGxcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2ICNmb290ZXJDb250ZW50PlxuICAgICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltkcm9wZG93bi1tZW51LWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==