You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
26 KiB
226 lines
26 KiB
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
import { ChangeDetectionStrategy, Component, ElementRef, ViewEncapsulation, Inject, Optional, Input, HostListener, ChangeDetectorRef, } from '@angular/core';
|
|
import { mixinDisabled, mixinDisableRipple, } from '@angular/material/core';
|
|
import { Subject } from 'rxjs';
|
|
import { DOCUMENT } from '@angular/common';
|
|
import { MAT_MENU_PANEL } from './menu-panel';
|
|
// Boilerplate for applying mixins to MatMenuItem.
|
|
/** @docs-private */
|
|
import * as ɵngcc0 from '@angular/core';
|
|
import * as ɵngcc1 from '@angular/cdk/a11y';
|
|
import * as ɵngcc2 from '@angular/material/core';
|
|
import * as ɵngcc3 from '@angular/common';
|
|
|
|
const _c0 = ["mat-menu-item", ""];
|
|
function MatMenuItem__svg_svg_2_Template(rf, ctx) { if (rf & 1) {
|
|
ɵngcc0.ɵɵnamespaceSVG();
|
|
ɵngcc0.ɵɵelementStart(0, "svg", 2);
|
|
ɵngcc0.ɵɵelement(1, "polygon", 3);
|
|
ɵngcc0.ɵɵelementEnd();
|
|
} }
|
|
const _c1 = ["*"];
|
|
const _MatMenuItemBase = mixinDisableRipple(mixinDisabled(class {
|
|
}));
|
|
/**
|
|
* Single item inside of a `mat-menu`. Provides the menu item styling and accessibility treatment.
|
|
*/
|
|
export class MatMenuItem extends _MatMenuItemBase {
|
|
constructor(_elementRef,
|
|
/**
|
|
* @deprecated `_document` parameter is no longer being used and will be removed.
|
|
* @breaking-change 12.0.0
|
|
*/
|
|
_document, _focusMonitor, _parentMenu,
|
|
/**
|
|
* @deprecated `_changeDetectorRef` to become a required parameter.
|
|
* @breaking-change 14.0.0
|
|
*/
|
|
_changeDetectorRef) {
|
|
// @breaking-change 8.0.0 make `_focusMonitor` and `document` required params.
|
|
super();
|
|
this._elementRef = _elementRef;
|
|
this._focusMonitor = _focusMonitor;
|
|
this._parentMenu = _parentMenu;
|
|
this._changeDetectorRef = _changeDetectorRef;
|
|
/** ARIA role for the menu item. */
|
|
this.role = 'menuitem';
|
|
/** Stream that emits when the menu item is hovered. */
|
|
this._hovered = new Subject();
|
|
/** Stream that emits when the menu item is focused. */
|
|
this._focused = new Subject();
|
|
/** Whether the menu item is highlighted. */
|
|
this._highlighted = false;
|
|
/** Whether the menu item acts as a trigger for a sub-menu. */
|
|
this._triggersSubmenu = false;
|
|
if (_parentMenu && _parentMenu.addItem) {
|
|
_parentMenu.addItem(this);
|
|
}
|
|
}
|
|
/** Focuses the menu item. */
|
|
focus(origin, options) {
|
|
if (this._focusMonitor && origin) {
|
|
this._focusMonitor.focusVia(this._getHostElement(), origin, options);
|
|
}
|
|
else {
|
|
this._getHostElement().focus(options);
|
|
}
|
|
this._focused.next(this);
|
|
}
|
|
ngAfterViewInit() {
|
|
if (this._focusMonitor) {
|
|
// Start monitoring the element so it gets the appropriate focused classes. We want
|
|
// to show the focus style for menu items only when the focus was not caused by a
|
|
// mouse or touch interaction.
|
|
this._focusMonitor.monitor(this._elementRef, false);
|
|
}
|
|
}
|
|
ngOnDestroy() {
|
|
if (this._focusMonitor) {
|
|
this._focusMonitor.stopMonitoring(this._elementRef);
|
|
}
|
|
if (this._parentMenu && this._parentMenu.removeItem) {
|
|
this._parentMenu.removeItem(this);
|
|
}
|
|
this._hovered.complete();
|
|
this._focused.complete();
|
|
}
|
|
/** Used to set the `tabindex`. */
|
|
_getTabIndex() {
|
|
return this.disabled ? '-1' : '0';
|
|
}
|
|
/** Returns the host DOM element. */
|
|
_getHostElement() {
|
|
return this._elementRef.nativeElement;
|
|
}
|
|
/** Prevents the default element actions if it is disabled. */
|
|
// We have to use a `HostListener` here in order to support both Ivy and ViewEngine.
|
|
// In Ivy the `host` bindings will be merged when this class is extended, whereas in
|
|
// ViewEngine they're overwritten.
|
|
// TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.
|
|
// tslint:disable-next-line:no-host-decorator-in-concrete
|
|
_checkDisabled(event) {
|
|
if (this.disabled) {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
}
|
|
}
|
|
/** Emits to the hover stream. */
|
|
// We have to use a `HostListener` here in order to support both Ivy and ViewEngine.
|
|
// In Ivy the `host` bindings will be merged when this class is extended, whereas in
|
|
// ViewEngine they're overwritten.
|
|
// TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.
|
|
// tslint:disable-next-line:no-host-decorator-in-concrete
|
|
_handleMouseEnter() {
|
|
this._hovered.next(this);
|
|
}
|
|
/** Gets the label to be used when determining whether the option should be focused. */
|
|
getLabel() {
|
|
var _a, _b;
|
|
const clone = this._elementRef.nativeElement.cloneNode(true);
|
|
const icons = clone.querySelectorAll('mat-icon, .material-icons');
|
|
// Strip away icons so they don't show up in the text.
|
|
for (let i = 0; i < icons.length; i++) {
|
|
const icon = icons[i];
|
|
(_a = icon.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(icon);
|
|
}
|
|
return ((_b = clone.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '';
|
|
}
|
|
_setHighlighted(isHighlighted) {
|
|
var _a;
|
|
// We need to mark this for check for the case where the content is coming from a
|
|
// `matMenuContent` whose change detection tree is at the declaration position,
|
|
// not the insertion position. See #23175.
|
|
// @breaking-change 14.0.0 Remove null check for `_changeDetectorRef`.
|
|
this._highlighted = isHighlighted;
|
|
(_a = this._changeDetectorRef) === null || _a === void 0 ? void 0 : _a.markForCheck();
|
|
}
|
|
}
|
|
MatMenuItem.ɵfac = function MatMenuItem_Factory(t) { return new (t || MatMenuItem)(ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ElementRef), ɵngcc0.ɵɵdirectiveInject(DOCUMENT), ɵngcc0.ɵɵdirectiveInject(ɵngcc1.FocusMonitor), ɵngcc0.ɵɵdirectiveInject(MAT_MENU_PANEL, 8), ɵngcc0.ɵɵdirectiveInject(ɵngcc0.ChangeDetectorRef)); };
|
|
MatMenuItem.ɵcmp = /*@__PURE__*/ ɵngcc0.ɵɵdefineComponent({ type: MatMenuItem, selectors: [["", "mat-menu-item", ""]], hostAttrs: [1, "mat-focus-indicator"], hostVars: 10, hostBindings: function MatMenuItem_HostBindings(rf, ctx) { if (rf & 1) {
|
|
ɵngcc0.ɵɵlistener("click", function MatMenuItem_click_HostBindingHandler($event) { return ctx._checkDisabled($event); })("mouseenter", function MatMenuItem_mouseenter_HostBindingHandler() { return ctx._handleMouseEnter(); });
|
|
} if (rf & 2) {
|
|
ɵngcc0.ɵɵattribute("role", ctx.role)("tabindex", ctx._getTabIndex())("aria-disabled", ctx.disabled.toString())("disabled", ctx.disabled || null);
|
|
ɵngcc0.ɵɵclassProp("mat-menu-item", true)("mat-menu-item-highlighted", ctx._highlighted)("mat-menu-item-submenu-trigger", ctx._triggersSubmenu);
|
|
} }, inputs: { disabled: "disabled", disableRipple: "disableRipple", role: "role" }, exportAs: ["matMenuItem"], features: [ɵngcc0.ɵɵInheritDefinitionFeature], attrs: _c0, ngContentSelectors: _c1, decls: 3, vars: 3, consts: [["matRipple", "", 1, "mat-menu-ripple", 3, "matRippleDisabled", "matRippleTrigger"], ["class", "mat-menu-submenu-icon", "viewBox", "0 0 5 10", "focusable", "false", 4, "ngIf"], ["viewBox", "0 0 5 10", "focusable", "false", 1, "mat-menu-submenu-icon"], ["points", "0,0 5,5 0,10"]], template: function MatMenuItem_Template(rf, ctx) { if (rf & 1) {
|
|
ɵngcc0.ɵɵprojectionDef();
|
|
ɵngcc0.ɵɵprojection(0);
|
|
ɵngcc0.ɵɵelement(1, "div", 0);
|
|
ɵngcc0.ɵɵtemplate(2, MatMenuItem__svg_svg_2_Template, 2, 0, "svg", 1);
|
|
} if (rf & 2) {
|
|
ɵngcc0.ɵɵadvance(1);
|
|
ɵngcc0.ɵɵproperty("matRippleDisabled", ctx.disableRipple || ctx.disabled)("matRippleTrigger", ctx._getHostElement());
|
|
ɵngcc0.ɵɵadvance(1);
|
|
ɵngcc0.ɵɵproperty("ngIf", ctx._triggersSubmenu);
|
|
} }, directives: [ɵngcc2.MatRipple, ɵngcc3.NgIf], encapsulation: 2, changeDetection: 0 });
|
|
MatMenuItem.ctorParameters = () => [
|
|
{ type: ElementRef },
|
|
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
|
|
{ type: FocusMonitor },
|
|
{ type: undefined, decorators: [{ type: Inject, args: [MAT_MENU_PANEL,] }, { type: Optional }] },
|
|
{ type: ChangeDetectorRef }
|
|
];
|
|
MatMenuItem.propDecorators = {
|
|
role: [{ type: Input }],
|
|
_checkDisabled: [{ type: HostListener, args: ['click', ['$event'],] }],
|
|
_handleMouseEnter: [{ type: HostListener, args: ['mouseenter',] }]
|
|
};
|
|
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && ɵngcc0.ɵsetClassMetadata(MatMenuItem, [{
|
|
type: Component,
|
|
args: [{
|
|
selector: '[mat-menu-item]',
|
|
exportAs: 'matMenuItem',
|
|
inputs: ['disabled', 'disableRipple'],
|
|
host: {
|
|
'[attr.role]': 'role',
|
|
'[class.mat-menu-item]': 'true',
|
|
'[class.mat-menu-item-highlighted]': '_highlighted',
|
|
'[class.mat-menu-item-submenu-trigger]': '_triggersSubmenu',
|
|
'[attr.tabindex]': '_getTabIndex()',
|
|
'[attr.aria-disabled]': 'disabled.toString()',
|
|
'[attr.disabled]': 'disabled || null',
|
|
'class': 'mat-focus-indicator'
|
|
},
|
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
encapsulation: ViewEncapsulation.None,
|
|
template: "<ng-content></ng-content>\n<div class=\"mat-menu-ripple\" matRipple\n [matRippleDisabled]=\"disableRipple || disabled\"\n [matRippleTrigger]=\"_getHostElement()\">\n</div>\n\n<svg\n *ngIf=\"_triggersSubmenu\"\n class=\"mat-menu-submenu-icon\"\n viewBox=\"0 0 5 10\"\n focusable=\"false\"><polygon points=\"0,0 5,5 0,10\"/></svg>\n"
|
|
}]
|
|
}], function () { return [{ type: ɵngcc0.ElementRef }, { type: undefined, decorators: [{
|
|
type: Inject,
|
|
args: [DOCUMENT]
|
|
}] }, { type: ɵngcc1.FocusMonitor }, { type: undefined, decorators: [{
|
|
type: Inject,
|
|
args: [MAT_MENU_PANEL]
|
|
}, {
|
|
type: Optional
|
|
}] }, { type: ɵngcc0.ChangeDetectorRef }]; }, { role: [{
|
|
type: Input
|
|
}],
|
|
/** Prevents the default element actions if it is disabled. */
|
|
// We have to use a `HostListener` here in order to support both Ivy and ViewEngine.
|
|
// In Ivy the `host` bindings will be merged when this class is extended, whereas in
|
|
// ViewEngine they're overwritten.
|
|
// TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.
|
|
// tslint:disable-next-line:no-host-decorator-in-concrete
|
|
_checkDisabled: [{
|
|
type: HostListener,
|
|
args: ['click', ['$event']]
|
|
}],
|
|
/** Emits to the hover stream. */
|
|
// We have to use a `HostListener` here in order to support both Ivy and ViewEngine.
|
|
// In Ivy the `host` bindings will be merged when this class is extended, whereas in
|
|
// ViewEngine they're overwritten.
|
|
// TODO(crisbeto): we move this back into `host` once Ivy is turned on by default.
|
|
// tslint:disable-next-line:no-host-decorator-in-concrete
|
|
_handleMouseEnter: [{
|
|
type: HostListener,
|
|
args: ['mouseenter']
|
|
}] }); })();
|
|
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvbWVudS9tZW51LWl0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUVILE9BQU8sRUFBa0IsWUFBWSxFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFN0UsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUVWLGlCQUFpQixFQUNqQixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxZQUFZLEVBRVosaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2Isa0JBQWtCLEdBQ25CLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFDLGNBQWMsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUUxRCxrREFBa0Q7QUFDbEQsb0JBQW9COzs7Ozs7Ozs7Ozs7OztBQUNwQixNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQztBQUFRLENBQUEsQ0FBQyxDQUFDLENBQUM7QUFFckU7QUFDQTtBQUNBLEdBQUc7QUFtQkgsTUFBTSxPQUFPLFdBQVksU0FBUSxnQkFBZ0I7QUFDL0MsSUFpQkEsWUFDVSxXQUFvQztBQUMvQyxJQUFHO0FBQ0o7QUFDQTtBQUNBLE9BQU87QUFDUCxJQUFzQixTQUFlLEVBQ3pCLGFBQTRCLEVBQ08sV0FBdUM7QUFDckYsSUFBRztBQUNKO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsSUFBWSxrQkFBc0M7QUFDbEQsUUFDSSw4RUFBOEU7QUFDbEYsUUFBSSxLQUFLLEVBQUUsQ0FBQztBQUNaLFFBaEJZLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtBQUFD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bGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtGb2N1c2FibGVPcHRpb24sIEZvY3VzTW9uaXRvciwgRm9jdXNPcmlnaW59IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7Qm9vbGVhbklucHV0fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5qZWN0LFxuICBPcHRpb25hbCxcbiAgSW5wdXQsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ2FuRGlzYWJsZSxcbiAgQ2FuRGlzYWJsZVJpcHBsZSxcbiAgbWl4aW5EaXNhYmxlZCxcbiAgbWl4aW5EaXNhYmxlUmlwcGxlLFxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtNQVRfTUVOVV9QQU5FTCwgTWF0TWVudVBhbmVsfSBmcm9tICcuL21lbnUtcGFuZWwnO1xuXG4vLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdE1lbnVJdGVtLlxuLyoqIEBkb2NzLXByaXZhdGUgKi9cbmNvbnN0IF9NYXRNZW51SXRlbUJhc2UgPSBtaXhpbkRpc2FibGVSaXBwbGUobWl4aW5EaXNhYmxlZChjbGFzcyB7fSkpO1xuXG4vKipcbiAqIFNpbmdsZSBpdGVtIGluc2lkZSBvZiBhIGBtYXQtbWVudWAuIFByb3ZpZGVzIHRoZSBtZW51IGl0ZW0gc3R5bGluZyBhbmQgYWNjZXNzaWJpbGl0eSB0cmVhdG1lbnQuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ1ttYXQtbWVudS1pdGVtXScsXG4gIGV4cG9ydEFzOiAnbWF0TWVudUl0ZW0nLFxuICBpbnB1dHM6IFsnZGlzYWJsZWQnLCAnZGlzYWJsZVJpcHBsZSddLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLnJvbGVdJzogJ3JvbGUnLFxuICAgICdbY2xhc3MubWF0LW1lbnUtaXRlbV0nOiAndHJ1ZScsXG4gICAgJ1tjbGFzcy5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkXSc6ICdfaGlnaGxpZ2h0ZWQnLFxuICAgICdbY2xhc3MubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJdJzogJ190cmlnZ2Vyc1N1Ym1lbnUnLFxuICAgICdbYXR0ci50YWJpbmRleF0nOiAnX2dldFRhYkluZGV4KCknLFxuICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZC50b1N0cmluZygpJyxcbiAgICAnW2F0dHIuZGlzYWJsZWRdJzogJ2Rpc2FibGVkIHx8IG51bGwnLFxuICAgICdjbGFzcyc6ICdtYXQtZm9jdXMtaW5kaWNhdG9yJyxcbiAgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlVXJsOiAnbWVudS1pdGVtLmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRNZW51SXRlbSBleHRlbmRzIF9NYXRNZW51SXRlbUJhc2VcbiAgICBpbXBsZW1lbnRzIEZvY3VzYWJsZU9wdGlvbiwgQ2FuRGlzYWJsZSwgQ2FuRGlzYWJsZVJpcHBsZSwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKiogQVJJQSByb2xlIGZvciB0aGUgbWVudSBpdGVtLiAqL1xuICBASW5wdXQoKSByb2xlOiAnbWVudWl0ZW0nIHwgJ21lbnVpdGVtcmFkaW8nIHwgJ21lbnVpdGVtY2hlY2tib3gnID0gJ21lbnVpdGVtJztcblxuICAvKiogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiB0aGUgbWVudSBpdGVtIGlzIGhvdmVyZWQuICovXG4gIHJlYWRvbmx5IF9ob3ZlcmVkOiBTdWJqZWN0PE1hdE1lbnVJdGVtPiA9IG5ldyBTdWJqZWN0PE1hdE1lbnVJdGVtPigpO1xuXG4gIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIHRoZSBtZW51IGl0ZW0gaXMgZm9jdXNlZC4gKi9cbiAgcmVhZG9ubHkgX2ZvY3VzZWQgPSBuZXcgU3ViamVjdDxNYXRNZW51SXRlbT4oKTtcblxuICAvKiogV2hldGhlciB0aGUgbWVudSBpdGVtIGlzIGhpZ2hsaWdodGVkLiAqL1xuICBfaGlnaGxpZ2h0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogV2hldGhlciB0aGUgbWVudSBpdGVtIGFjdHMgYXMgYSB0cmlnZ2VyIGZvciBhIHN1Yi1tZW51LiAqL1xuICBfdHJpZ2dlcnNTdWJtZW51OiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgYF9kb2N1bWVudGAgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICogQGJyZWFraW5nLWNoYW5nZSAxMi4wLjBcbiAgICAgKi9cbiAgICBASW5qZWN0KERPQ1VNRU5UKSBfZG9jdW1lbnQ/OiBhbnksXG4gICAgcHJpdmF0ZSBfZm9jdXNNb25pdG9yPzogRm9jdXNNb25pdG9yLFxuICAgIEBJbmplY3QoTUFUX01FTlVfUEFORUwpIEBPcHRpb25hbCgpIHB1YmxpYyBfcGFyZW50TWVudT86IE1hdE1lbnVQYW5lbDxNYXRNZW51SXRlbT4sXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgYF9jaGFuZ2VEZXRlY3RvclJlZmAgdG8gYmVjb21lIGEgcmVxdWlyZWQgcGFyYW1ldGVyLlxuICAgICAqIEBicmVha2luZy1jaGFuZ2UgMTQuMC4wXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY/OiBDaGFuZ2VEZXRlY3RvclJlZikge1xuXG4gICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCBtYWtlIGBfZm9jdXNNb25pdG9yYCBhbmQgYGRvY3VtZW50YCByZXF1aXJlZCBwYXJhbXMuXG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChfcGFyZW50TWVudSAmJiBfcGFyZW50TWVudS5hZGRJdGVtKSB7XG4gICAgICBfcGFyZW50TWVudS5hZGRJdGVtKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBGb2N1c2VzIHRoZSBtZW51IGl0ZW0uICovXG4gIGZvY3VzKG9yaWdpbj86IEZvY3VzT3JpZ2luLCBvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2ZvY3VzTW9uaXRvciAmJiBvcmlnaW4pIHtcbiAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLCBvcmlnaW4sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9nZXRIb3N0RWxlbWVudCgpLmZvY3VzKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvY3VzZWQubmV4dCh0aGlzKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5fZm9jdXNNb25pdG9yKSB7XG4gICAgICAvLyBTdGFydCBtb25pdG9yaW5nIHRoZSBlbGVtZW50IHNvIGl0IGdldHMgdGhlIGFwcHJvcHJpYXRlIGZvY3VzZWQgY2xhc3Nlcy4gV2Ugd2FudFxuICAgICAgLy8gdG8gc2hvdyB0aGUgZm9jdXMgc3R5bGUgZm9yIG1lbnUgaXRlbXMgb25seSB3aGVuIHRoZSBmb2N1cyB3YXMgbm90IGNhdXNlZCBieSBhXG4gICAgICAvLyBtb3VzZSBvciB0b3VjaCBpbnRlcmFjdGlvbi5cbiAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5fZm9jdXNNb25pdG9yKSB7XG4gICAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BhcmVudE1lbnUgJiYgdGhpcy5fcGFyZW50TWVudS5yZW1vdmVJdGVtKSB7XG4gICAgICB0aGlzLl9wYXJlbnRNZW51LnJlbW92ZUl0ZW0odGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5faG92ZXJlZC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2ZvY3VzZWQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBVc2VkIHRvIHNldCB0aGUgYHRhYmluZGV4YC4gKi9cbiAgX2dldFRhYkluZGV4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAnLTEnIDogJzAnO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGhvc3QgRE9NIGVsZW1lbnQuICovXG4gIF9nZXRIb3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIC8qKiBQcmV2ZW50cyB0aGUgZGVmYXVsdCBlbGVtZW50IGFjdGlvbnMgaWYgaXQgaXMgZGlzYWJsZWQuICovXG4gIC8vIFdlIGhhdmUgdG8gdXNlIGEgYEhvc3RMaXN0ZW5lcmAgaGVyZSBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLlxuICAvLyBJbiBJdnkgdGhlIGBob3N0YCBiaW5kaW5ncyB3aWxsIGJlIG1lcmdlZCB3aGVuIHRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQsIHdoZXJlYXMgaW5cbiAgLy8gVmlld0VuZ2luZSB0aGV5J3JlIG92ZXJ3cml0dGVuLlxuICAvLyBUT0RPKGNyaXNiZXRvKTogd2UgbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAgb25jZSBJdnkgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ob3N0LWRlY29yYXRvci1pbi1jb25jcmV0ZVxuICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gIF9jaGVja0Rpc2FibGVkKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXRzIHRvIHRoZSBob3ZlciBzdHJlYW0uICovXG4gIC8vIFdlIGhhdmUgdG8gdXNlIGEgYEhvc3RMaXN0ZW5lcmAgaGVyZSBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLlxuICAvLyBJbiBJdnkgdGhlIGBob3N0YCBiaW5kaW5ncyB3aWxsIGJlIG1lcmdlZCB3aGVuIHRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQsIHdoZXJlYXMgaW5cbiAgLy8gVmlld0VuZ2luZSB0aGV5J3JlIG92ZXJ3cml0dGVuLlxuICAvLyBUT0RPKGNyaXNiZXRvKTogd2UgbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAgb25jZSBJdnkgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ob3N0LWRlY29yYXRvci1pbi1jb25jcmV0ZVxuICBASG9zdExpc3RlbmVyKCdtb3VzZWVudGVyJylcbiAgX2hhbmRsZU1vdXNlRW50ZXIoKSB7XG4gICAgdGhpcy5faG92ZXJlZC5uZXh0KHRoaXMpO1xuICB9XG5cbiAgLyoqIEdldHMgdGhlIGxhYmVsIHRvIGJlIHVzZWQgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBvcHRpb24gc2hvdWxkIGJlIGZvY3VzZWQuICovXG4gIGdldExhYmVsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IGljb25zID0gY2xvbmUucXVlcnlTZWxlY3RvckFsbCgnbWF0LWljb24sIC5tYXRlcmlhbC1pY29ucycpO1xuXG4gICAgLy8gU3RyaXAgYXdheSBpY29ucyBzbyB0aGV5IGRvbid0IHNob3cgdXAgaW4gdGhlIHRleHQuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpY29ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaWNvbiA9IGljb25zW2ldO1xuICAgICAgaWNvbi5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChpY29uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmUudGV4dENvbnRlbnQ/LnRyaW0oKSB8fCAnJztcbiAgfVxuXG4gIF9zZXRIaWdobGlnaHRlZChpc0hpZ2hsaWdodGVkOiBib29sZWFuKSB7XG4gICAgLy8gV2UgbmVlZCB0byBtYXJrIHRoaXMgZm9yIGNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgY29udGVudCBpcyBjb21pbmcgZnJvbSBhXG4gICAgLy8gYG1hdE1lbnVDb250ZW50YCB3aG9zZSBjaGFuZ2UgZGV0ZWN0aW9uIHRyZWUgaXMgYXQgdGhlIGRlY2xhcmF0aW9uIHBvc2l0aW9uLFxuICAgIC8vIG5vdCB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uLiBTZWUgIzIzMTc1LlxuICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTQuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgX2NoYW5nZURldGVjdG9yUmVmYC5cbiAgICB0aGlzLl9oaWdobGlnaHRlZCA9IGlzSGlnaGxpZ2h0ZWQ7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWY/Lm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlUmlwcGxlOiBCb29sZWFuSW5wdXQ7XG59XG4iXX0=
|