carbon-components-angular
Version:
Next generation components
214 lines • 22.4 kB
JavaScript
import { Component, HostBinding, Input, Output, EventEmitter, HostListener, ContentChild, Optional } from "@angular/core";
import { Subscription } from "rxjs";
import { ContextMenuComponent } from "./context-menu.component";
import * as i0 from "@angular/core";
import * as i1 from "./context-menu-selection.service";
import * as i2 from "@angular/common";
import * as i3 from "carbon-components-angular/icon";
export class ContextMenuItemComponent {
constructor(elementRef, contextMenuSelectionService) {
this.elementRef = elementRef;
this.contextMenuSelectionService = contextMenuSelectionService;
this.optionClass = true;
this.role = "menuitem";
this.tabindex = -1;
this.ariaHasPopup = null;
this.ariaExpanded = null;
this.label = "";
this.info = "";
this.type = null;
this.checked = false;
this.icon = "";
this.value = "";
this.checkedChange = new EventEmitter();
this.hasChildren = false;
this.selectable = false;
this.subscriptions = new Subscription();
}
get ariaChecked() {
return this.type === "checkbox" ?
(this.checked ? true : false) : null;
}
ngOnInit() {
switch (this.type) {
case "checkbox": {
this.role = "menuitemcheckbox";
this.selectable = true;
break;
}
case "radio": {
this.role = "menuitemradio";
this.selectable = true;
break;
}
default: {
this.role = "menuitem";
}
}
if (this.type && this.contextMenuSelectionService && this.value) {
const { selectionObservable } = this.contextMenuSelectionService;
const subscription = selectionObservable.subscribe((value) => {
if (this.type === "radio") {
this.handleSelection(value === this.value);
}
if (this.type === "checkbox") {
this.handleSelection(value.includes(this.value));
}
});
this.subscriptions.add(subscription);
}
}
ngAfterContentInit() {
if (this.childContextMenu) {
this.hasChildren = true;
this.ariaHasPopup = true;
this.ariaExpanded = false;
}
}
handleClick(event) {
event.stopPropagation();
if (this.hasChildren) {
this.openSubMenu();
this.childContextMenu.focusMenu();
}
if (this.type) {
this.handleSelection(!this.checked);
}
if (this.contextMenuSelectionService) {
if (this.type === "radio") {
this.contextMenuSelectionService.selectRadio(this.value);
}
if (this.type === "checkbox") {
this.contextMenuSelectionService.selectCheckbox(this.value);
}
}
}
handleSelection(selected) {
this.checked = selected;
this.checkedChange.emit(this.checked);
}
openSubMenu() {
if (this.childContextMenu) {
this.childContextMenu.open = true;
this.ariaExpanded = true;
const dimensions = this.elementRef.nativeElement.getBoundingClientRect();
this.childContextMenu.position.left = dimensions.left + dimensions.width;
// subtract 4px to account for margins
this.childContextMenu.position.top = dimensions.top - 4;
}
}
closeSubMenu() {
if (this.childContextMenu) {
this.childContextMenu.open = false;
this.ariaExpanded = false;
}
}
handleMouseOver() {
this.openSubMenu();
}
handleMouseOut() {
this.closeSubMenu();
}
handleFocus() {
this.tabindex = 0;
if (this.hasChildren && this.ariaExpanded) {
this.closeSubMenu();
}
}
handleBlur() {
this.tabindex = -1;
}
focusItem() {
this.elementRef.nativeElement.focus();
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
}
}
ContextMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, deps: [{ token: i0.ElementRef }, { token: i1.ContextMenuSelectionService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
ContextMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ContextMenuItemComponent, selector: "cds-context-menu-item, ibm-context-menu-item", inputs: { label: "label", info: "info", type: "type", checked: "checked", icon: "icon", value: "value" }, outputs: { checkedChange: "checkedChange" }, host: { listeners: { "keydown.enter": "handleClick($event)", "keydown.space": "handleClick($event)", "click": "handleClick($event)", "mouseover": "handleMouseOver()", "mouseout": "handleMouseOut()", "focus": "handleFocus()", "blur": "handleBlur()" }, properties: { "class.cds--menu-item": "this.optionClass", "attr.role": "this.role", "attr.tabindex": "this.tabindex", "attr.aria-haspopup": "this.ariaHasPopup", "attr.aria-expanded": "this.ariaExpanded", "attr.aria-checked": "this.ariaChecked" } }, queries: [{ propertyName: "childContextMenu", first: true, predicate: ContextMenuComponent, descendants: true, static: true }], ngImport: i0, template: `
<div class="cds--menu-item__icon">
<svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg>
<svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg>
</div>
<div class="cds--menu-item__label" [title]="label">{{label}}</div>
<div class="cds--menu-item__shortcut">
<ng-container *ngIf="info">{{info}}</ng-container>
<svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg>
</div>
<ng-content></ng-content>
`, isInline: true, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ContextMenuItemComponent, decorators: [{
type: Component,
args: [{ selector: "cds-context-menu-item, ibm-context-menu-item", template: `
<div class="cds--menu-item__icon">
<svg *ngIf="selectable && checked" cdsIcon="checkmark" size="16"></svg>
<svg *ngIf="!selectable && icon" [cdsIcon]="icon" size="16"></svg>
</div>
<div class="cds--menu-item__label" [title]="label">{{label}}</div>
<div class="cds--menu-item__shortcut">
<ng-container *ngIf="info">{{info}}</ng-container>
<svg *ngIf="hasChildren" cdsIcon="caret--right" size="16"></svg>
</div>
<ng-content></ng-content>
`, styles: [":host{grid-template-columns:1rem 1fr max-content}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ContextMenuSelectionService, decorators: [{
type: Optional
}] }]; }, propDecorators: { optionClass: [{
type: HostBinding,
args: ["class.cds--menu-item"]
}], role: [{
type: HostBinding,
args: ["attr.role"]
}], tabindex: [{
type: HostBinding,
args: ["attr.tabindex"]
}], ariaHasPopup: [{
type: HostBinding,
args: ["attr.aria-haspopup"]
}], ariaExpanded: [{
type: HostBinding,
args: ["attr.aria-expanded"]
}], ariaChecked: [{
type: HostBinding,
args: ["attr.aria-checked"]
}], label: [{
type: Input
}], info: [{
type: Input
}], type: [{
type: Input
}], checked: [{
type: Input
}], icon: [{
type: Input
}], value: [{
type: Input
}], checkedChange: [{
type: Output
}], childContextMenu: [{
type: ContentChild,
args: [ContextMenuComponent, { static: true }]
}], handleClick: [{
type: HostListener,
args: ["keydown.enter", ["$event"]]
}, {
type: HostListener,
args: ["keydown.space", ["$event"]]
}, {
type: HostListener,
args: ["click", ["$event"]]
}], handleMouseOver: [{
type: HostListener,
args: ["mouseover"]
}], handleMouseOut: [{
type: HostListener,
args: ["mouseout"]
}], handleFocus: [{
type: HostListener,
args: ["focus"]
}], handleBlur: [{
type: HostListener,
args: ["blur"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1tZW51LWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbnRleHQtbWVudS9jb250ZXh0LW1lbnUtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBSVIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7QUFzQmhFLE1BQU0sT0FBTyx3QkFBd0I7SUF5QnBDLFlBQ1csVUFBc0IsRUFDViwyQkFBd0Q7UUFEcEUsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUExQjFDLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFNBQUksR0FBRyxVQUFVLENBQUM7UUFDZCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVCxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU05QyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFNBQUksR0FBZ0MsSUFBSSxDQUFDO1FBQ3pDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFVBQUssR0FBRyxFQUFFLENBQUM7UUFDVixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdEQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUdYLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUt2QyxDQUFD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LFVBQVU7Z0JBTXhCLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxPQUFPO2dCQVNyQixVQUFVO3NCQURULFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SG9zdEJpbmRpbmcsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0RWxlbWVudFJlZixcblx0SG9zdExpc3RlbmVyLFxuXHRDb250ZW50Q2hpbGQsXG5cdE9wdGlvbmFsLFxuXHRPbkluaXQsXG5cdEFmdGVyQ29udGVudEluaXQsXG5cdE9uRGVzdHJveVxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IENvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZSB9IGZyb20gXCIuL2NvbnRleHQtbWVudS1zZWxlY3Rpb24uc2VydmljZVwiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVDb21wb25lbnQgfSBmcm9tIFwiLi9jb250ZXh0LW1lbnUuY29tcG9uZW50XCI7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtY29udGV4dC1tZW51LWl0ZW0sIGlibS1jb250ZXh0LW1lbnUtaXRlbVwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLW1lbnUtaXRlbV9faWNvblwiPlxuXHRcdFx0PHN2ZyAqbmdJZj1cInNlbGVjdGFibGUgJiYgY2hlY2tlZFwiIGNkc0ljb249XCJjaGVja21hcmtcIiBzaXplPVwiMTZcIj48L3N2Zz5cblx0XHRcdDxzdmcgKm5nSWY9XCIhc2VsZWN0YWJsZSAmJiBpY29uXCIgW2Nkc0ljb25dPVwiaWNvblwiIHNpemU9XCIxNlwiPjwvc3ZnPlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLW1lbnUtaXRlbV9fbGFiZWxcIiBbdGl0bGVdPVwibGFiZWxcIj57e2xhYmVsfX08L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1tZW51LWl0ZW1fX3Nob3J0Y3V0XCI+XG5cdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaW5mb1wiPnt7aW5mb319PC9uZy1jb250YWluZXI+XG5cdFx0XHQ8c3ZnICpuZ0lmPVwiaGFzQ2hpbGRyZW5cIiBjZHNJY29uPVwiY2FyZXQtLXJpZ2h0XCIgc2l6ZT1cIjE2XCI+PC9zdmc+XG5cdFx0PC9kaXY+XG5cdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRgLFxuXHRzdHlsZXM6IFtgXG5cdFx0Omhvc3Qge1xuXHRcdFx0Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxcmVtIDFmciBtYXgtY29udGVudDtcblx0XHR9XG5cdGBdXG59KVxuZXhwb3J0IGNsYXNzIENvbnRleHRNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1tZW51LWl0ZW1cIikgb3B0aW9uQ2xhc3MgPSB0cnVlO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLnJvbGVcIikgcm9sZSA9IFwibWVudWl0ZW1cIjtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci50YWJpbmRleFwiKSB0YWJpbmRleCA9IC0xO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtaGFzcG9wdXBcIikgYXJpYUhhc1BvcHVwID0gbnVsbDtcblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5hcmlhLWV4cGFuZGVkXCIpIGFyaWFFeHBhbmRlZCA9IG51bGw7XG5cdEBIb3N0QmluZGluZyhcImF0dHIuYXJpYS1jaGVja2VkXCIpIGdldCBhcmlhQ2hlY2tlZCgpIHtcblx0XHRyZXR1cm4gdGhpcy50eXBlID09PSBcImNoZWNrYm94XCIgP1xuXHRcdFx0KHRoaXMuY2hlY2tlZCA/IHRydWUgOiBmYWxzZSkgOiBudWxsO1xuXHR9XG5cblx0QElucHV0KCkgbGFiZWwgPSBcIlwiO1xuXHRASW5wdXQoKSBpbmZvID0gXCJcIjtcblx0QElucHV0KCkgdHlwZTogbnVsbCB8IFwiY2hlY2tib3hcIiB8IFwicmFkaW9cIiA9IG51bGw7XG5cdEBJbnB1dCgpIGNoZWNrZWQgPSBmYWxzZTtcblx0QElucHV0KCkgaWNvbiA9IFwiXCI7XG5cdEBJbnB1dCgpIHZhbHVlID0gXCJcIjtcblx0QE91dHB1dCgpIGNoZWNrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cblx0aGFzQ2hpbGRyZW4gPSBmYWxzZTtcblx0c2VsZWN0YWJsZSA9IGZhbHNlO1xuXG5cdEBDb250ZW50Q2hpbGQoQ29udGV4dE1lbnVDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pIGNoaWxkQ29udGV4dE1lbnU6IENvbnRleHRNZW51Q29tcG9uZW50O1xuXHRwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG5cdFx0QE9wdGlvbmFsKCkgcHJvdGVjdGVkIGNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZTogQ29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlXG5cdCkgeyB9XG5cblx0bmdPbkluaXQoKSB7XG5cdFx0c3dpdGNoICh0aGlzLnR5cGUpIHtcblx0XHRcdGNhc2UgXCJjaGVja2JveFwiOiB7XG5cdFx0XHRcdHRoaXMucm9sZSA9IFwibWVudWl0ZW1jaGVja2JveFwiO1xuXHRcdFx0XHR0aGlzLnNlbGVjdGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJyYWRpb1wiOiB7XG5cdFx0XHRcdHRoaXMucm9sZSA9IFwibWVudWl0ZW1yYWRpb1wiO1xuXHRcdFx0XHR0aGlzLnNlbGVjdGFibGUgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0dGhpcy5yb2xlID0gXCJtZW51aXRlbVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0aGlzLnR5cGUgJiYgdGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2UgJiYgdGhpcy52YWx1ZSkge1xuXHRcdFx0Y29uc3QgeyBzZWxlY3Rpb25PYnNlcnZhYmxlIH0gPSB0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZTtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNlbGVjdGlvbk9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcInJhZGlvXCIpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVNlbGVjdGlvbih2YWx1ZSA9PT0gdGhpcy52YWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodGhpcy50eXBlID09PSBcImNoZWNrYm94XCIpIHtcblx0XHRcdFx0XHR0aGlzLmhhbmRsZVNlbGVjdGlvbih2YWx1ZS5pbmNsdWRlcyh0aGlzLnZhbHVlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWJzY3JpcHRpb24pO1xuXHRcdH1cblx0fVxuXG5cdG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblx0XHRpZiAodGhpcy5jaGlsZENvbnRleHRNZW51KSB7XG5cdFx0XHR0aGlzLmhhc0NoaWxkcmVuID0gdHJ1ZTtcblx0XHRcdHRoaXMuYXJpYUhhc1BvcHVwID0gdHJ1ZTtcblx0XHRcdHRoaXMuYXJpYUV4cGFuZGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImtleWRvd24uZW50ZXJcIiwgW1wiJGV2ZW50XCJdKVxuXHRASG9zdExpc3RlbmVyKFwia2V5ZG93bi5zcGFjZVwiLCBbXCIkZXZlbnRcIl0pXG5cdEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiLCBbXCIkZXZlbnRcIl0pXG5cdGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50ICYgS2V5Ym9hcmRFdmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGlmICh0aGlzLmhhc0NoaWxkcmVuKSB7XG5cdFx0XHR0aGlzLm9wZW5TdWJNZW51KCk7XG5cdFx0XHR0aGlzLmNoaWxkQ29udGV4dE1lbnUuZm9jdXNNZW51KCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudHlwZSkge1xuXHRcdFx0dGhpcy5oYW5kbGVTZWxlY3Rpb24oIXRoaXMuY2hlY2tlZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29udGV4dE1lbnVTZWxlY3Rpb25TZXJ2aWNlKSB7XG5cdFx0XHRpZiAodGhpcy50eXBlID09PSBcInJhZGlvXCIpIHtcblx0XHRcdFx0dGhpcy5jb250ZXh0TWVudVNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0UmFkaW8odGhpcy52YWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuXHRcdFx0XHR0aGlzLmNvbnRleHRNZW51U2VsZWN0aW9uU2VydmljZS5zZWxlY3RDaGVja2JveCh0aGlzLnZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRoYW5kbGVTZWxlY3Rpb24oc2VsZWN0ZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmNoZWNrZWQgPSBzZWxlY3RlZDtcblx0XHR0aGlzLmNoZWNrZWRDaGFuZ2UuZW1pdCh0aGlzLmNoZWNrZWQpO1xuXHR9XG5cblx0b3BlblN1Yk1lbnUoKSB7XG5cdFx0aWYgKHRoaXMuY2hpbGRDb250ZXh0TWVudSkge1xuXHRcdFx0dGhpcy5jaGlsZENvbnRleHRNZW51Lm9wZW4gPSB0cnVlO1xuXHRcdFx0dGhpcy5hcmlhRXhwYW5kZWQgPSB0cnVlO1xuXHRcdFx0Y29uc3QgZGltZW5zaW9ucyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdFx0dGhpcy5jaGlsZENvbnRleHRNZW51LnBvc2l0aW9uLmxlZnQgPSBkaW1lbnNpb25zLmxlZnQgKyBkaW1lbnNpb25zLndpZHRoO1xuXHRcdFx0Ly8gc3VidHJhY3QgNHB4IHRvIGFjY291bnQgZm9yIG1hcmdpbnNcblx0XHRcdHRoaXMuY2hpbGRDb250ZXh0TWVudS5wb3NpdGlvbi50b3AgPSBkaW1lbnNpb25zLnRvcCAtIDQ7XG5cdFx0fVxuXHR9XG5cblx0Y2xvc2VTdWJNZW51KCkge1xuXHRcdGlmICh0aGlzLmNoaWxkQ29udGV4dE1lbnUpIHtcblx0XHRcdHRoaXMuY2hpbGRDb250ZXh0TWVudS5vcGVuID0gZmFsc2U7XG5cdFx0XHR0aGlzLmFyaWFFeHBhbmRlZCA9IGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJtb3VzZW92ZXJcIilcblx0aGFuZGxlTW91c2VPdmVyKCkge1xuXHRcdHRoaXMub3BlblN1Yk1lbnUoKTtcblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJtb3VzZW91dFwiKVxuXHRoYW5kbGVNb3VzZU91dCgpIHtcblx0XHR0aGlzLmNsb3NlU3ViTWVudSgpO1xuXHR9XG5cblx0QEhvc3RMaXN0ZW5lcihcImZvY3VzXCIpXG5cdGhhbmRsZUZvY3VzKCkge1xuXHRcdHRoaXMudGFiaW5kZXggPSAwO1xuXHRcdGlmICh0aGlzLmhhc0NoaWxkcmVuICYmIHRoaXMuYXJpYUV4cGFuZGVkKSB7XG5cdFx0XHR0aGlzLmNsb3NlU3ViTWVudSgpO1xuXHRcdH1cblx0fVxuXG5cdEBIb3N0TGlzdGVuZXIoXCJibHVyXCIpXG5cdGhhbmRsZUJsdXIoKSB7XG5cdFx0dGhpcy50YWJpbmRleCA9IC0xO1xuXHR9XG5cblx0Zm9jdXNJdGVtKCkge1xuXHRcdHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpIHtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcblx0fVxufVxuIl19