@blox/material
Version:
Material Components for Angular
262 lines • 30.9 kB
JavaScript
import { ContentChildren, EventEmitter, forwardRef, Directive, ElementRef, HostBinding, Input, Output, Renderer2, HostListener, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { MDCTabFoundation } from '@material/tab';
import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple';
import { asBoolean } from '../../utils/value.utils';
import { MdcEventRegistry } from '../../utils/mdc.event.registry';
import { MdcTabIndicatorDirective } from './mdc.tab.indicator.directive';
import { takeUntil } from 'rxjs/operators';
import { ReplaySubject, Subject } from 'rxjs';
/**
* Directive for an optional icon when having a tab bar with icons.
* This directive must be used as a child of an `mdcTabContent`, and as a sibbling
* to a following `mdcTabLabel`.
*/
export class MdcTabIconDirective {
constructor() {
/** @internal */
this._cls = true;
/** @internal */
this._ariaHidden = true;
}
}
MdcTabIconDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabIcon]'
},] }
];
MdcTabIconDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab__icon',] }],
_ariaHidden: [{ type: HostBinding, args: ['attr.aria-hidden',] }]
};
/**
* Directive for the text label of a tab.
* This directive must be used as a child of an `mdcTabContent`.
* It can be preceded by an optional `mdcTabIcon`.
*/
export class MdcTabLabelDirective {
constructor() {
/** @internal */
this._cls = true;
}
}
MdcTabLabelDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabLabel]'
},] }
];
MdcTabLabelDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab__text-label',] }]
};
/**
* Directive for the content (label and optional icon of the tab).
* This directive must be used as a child of an `mdcTab`, and
* can contain an (optional) `mdcTabIcon` and an `mdcTabLabel`.
*/
export class MdcTabContentDirective {
constructor(_root) {
this._root = _root;
/** @internal */
this._cls = true;
}
}
MdcTabContentDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTabContent]'
},] }
];
MdcTabContentDirective.ctorParameters = () => [
{ type: ElementRef }
];
MdcTabContentDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab__content',] }]
};
export class AbstractMdcTabDirective extends AbstractMdcRipple {
constructor(_rndr, _root, _registry, doc) {
super(_root, _rndr, _registry, doc);
this._rndr = _rndr;
this._root = _root;
this._registry = _registry;
/** @internal */
this._cls = true;
this.onDestroy$ = new Subject();
/** @internal */
this._active = false;
/** @internal */
this._role = 'tab';
/**
* Event called when the tab is activated.
*/
this.activate = new EventEmitter();
this.activationRequest = new ReplaySubject(1);
/** @internal */
this._adapter = {
addClass: (className) => this._rndr.addClass(this._root.nativeElement, className),
removeClass: (className) => this._rndr.removeClass(this._root.nativeElement, className),
hasClass: (className) => this._root.nativeElement.classList.contains(className),
setAttr: (attr, value) => this._rndr.setAttribute(this._root.nativeElement, attr, value),
activateIndicator: (previousIndicatorClientRect) => { var _a; return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.activate(previousIndicatorClientRect); },
deactivateIndicator: () => { var _a; return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a.deactivate(); },
notifyInteracted: () => this.activationRequest.next(true),
getOffsetLeft: () => this._root.nativeElement.offsetLeft,
getOffsetWidth: () => this._root.nativeElement.offsetWidth,
getContentOffsetLeft: () => this._content._root.nativeElement.offsetLeft,
getContentOffsetWidth: () => this._content._root.nativeElement.offsetWidth,
focus: () => this._root.nativeElement.focus()
};
/** @internal */
this._foundation = null;
}
ngAfterContentInit() {
this.addRippleSurface('mdc-tab__ripple');
this.initRipple();
let initializer = () => {
this.destroyFoundation();
if (this._content && this._indicator)
this.initFoundation();
};
initializer();
this._contents.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer);
this._indicators.changes.pipe(takeUntil(this.onDestroy$)).subscribe(initializer);
}
ngOnDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
this.destroyRipple();
this.destroyFoundation();
}
destroyFoundation() {
let destroy = this._foundation != null;
if (destroy)
this._foundation.destroy();
this._foundation = null;
return destroy;
}
initFoundation() {
this._foundation = new MDCTabFoundation(this._adapter);
this._foundation.init();
if (this._active) {
let clientRect = typeof this._active === 'boolean' ? undefined : this._active;
this._foundation.activate(clientRect);
}
else {
// foundation doesn't initialize these attributes:
this._rndr.setAttribute(this._root.nativeElement, 'aria-selected', 'false');
this._rndr.setAttribute(this._root.nativeElement, 'tabindex', '-1');
}
}
/** @internal */
getRippleStylingElement() {
return this.rippleSurface;
}
/** @internal */
_activate(tabIndex, previousIndicatorClientRect) {
this._active = previousIndicatorClientRect || true;
if (this._foundation)
this._foundation.activate(previousIndicatorClientRect);
this.activate.emit({ tab: this, tabIndex });
}
/** @internal */
_deactivate() {
this._active = false;
if (this._foundation)
this._foundation.deactivate();
}
/** @internal */
_focus() {
this._adapter.focus();
}
/** @internal */
_computeIndicatorClientRect() {
var _a;
return (_a = this._indicator) === null || _a === void 0 ? void 0 : _a._computeContentClientRect();
}
/** @internal */
_computeDimensions() {
var _a;
return (_a = this._foundation) === null || _a === void 0 ? void 0 : _a.computeDimensions();
}
/** @internal */
isActive() {
return !!this._active;
}
/** @internal */
triggerActivation(value = true) {
// Note: this should not set the _active property. It just notifies the tab-bar
// that it wants to be activated. The tab-bar will deactivate the previous tab, and activate
// this one.
this.activationRequest.next(value);
}
/** @internal */
get activationRequest$() {
return this.activationRequest.asObservable();
}
/** @internal */
_onClick() {
if (this._foundation)
this._foundation.handleClick();
}
/** @internal */
get _indicator() {
return this._indicators && this._indicators.length > 0 ? this._indicators.first : null;
}
/** @internal */
get _content() {
return this._contents && this._contents.length > 0 ? this._contents.first : null;
}
}
AbstractMdcTabDirective.decorators = [
{ type: Directive }
];
AbstractMdcTabDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
AbstractMdcTabDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-tab',] }],
_role: [{ type: HostBinding, args: ['attr.role',] }],
_contents: [{ type: ContentChildren, args: [MdcTabContentDirective,] }],
_indicators: [{ type: ContentChildren, args: [MdcTabIndicatorDirective, { descendants: true },] }],
activate: [{ type: Output }],
_onClick: [{ type: HostListener, args: ['click',] }]
};
/**
* Directive for a tab. This directive must be used as a child of <code>mdcTabBar</code>.
* When using tabs in combination with angular routes, add a `routerLink` property, so that
* the `MdcTabRouterDirective` is selected instead of this directive.
*/
export class MdcTabDirective extends AbstractMdcTabDirective {
constructor(rndr, root, registry, doc) {
super(rndr, root, registry, doc);
}
/**
* Input for activating the tab. Assign a truthy value to activate the tab. A falsy value
* will have no effect. In order to deactivate the tab, you must activate another tab.
*/
get active() {
return this.isActive();
}
set active(value) {
this.triggerActivation(asBoolean(value));
}
}
MdcTabDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcTab]:not([routerLink])',
exportAs: 'mdcTab',
providers: [{ provide: AbstractMdcTabDirective, useExisting: forwardRef(() => MdcTabDirective) }]
},] }
];
MdcTabDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcTabDirective.propDecorators = {
active: [{ type: Input }]
};
export const TAB_DIRECTIVES = [MdcTabIconDirective, MdcTabLabelDirective, MdcTabContentDirective, MdcTabDirective];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnRhYi5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90YWIvbWRjLnRhYi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixlQUFlLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUN2RixXQUFXLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQWEsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBaUI5Qzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQUhoQztRQUlJLGdCQUFnQjtRQUM2QixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3pELGdCQUFnQjtRQUNpQixnQkFBVyxHQUFHLElBQUksQ0FBQztJQUN4RCxDQUFDOzs7WUFSQSxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGNBQWM7YUFDM0I7OzttQkFHSSxXQUFXLFNBQUMscUJBQXFCOzBCQUVqQyxXQUFXLFNBQUMsa0JBQWtCOztBQUduQzs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUhqQztRQUlJLGdCQUFnQjtRQUNtQyxTQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25FLENBQUM7OztZQU5BLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTthQUM1Qjs7O21CQUdJLFdBQVcsU0FBQywyQkFBMkI7O0FBRzVDOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sc0JBQXNCO0lBSS9CLFlBQW1CLEtBQWlCO1FBQWpCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFIcEMsZ0JBQWdCO1FBQ2dDLFNBQUksR0FBRyxJQUFJLENBQUM7SUFFckIsQ0FBQzs7O1lBUDNDLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2FBQzlCOzs7WUE3RGdGLFVBQVU7OzttQkFnRXRGLFdBQVcsU0FBQyx3QkFBd0I7O0FBTXpDLE1BQU0sT0FBZ0IsdUJBQXdCLFNBQVEsaUJBQWlCO0lBbUNuRSxZQUFzQixLQUFnQixFQUFTLEtBQWlCLEVBQVksU0FBMkIsRUFBb0IsR0FBUTtRQUMvSCxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBZSxDQUFDLENBQUM7UUFEOUIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVk7UUFBWSxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWxDdkcsZ0JBQWdCO1FBQ3VCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDM0MsZUFBVSxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ2pELGdCQUFnQjtRQUNOLFlBQU8sR0FBeUIsS0FBSyxDQUFDO1FBQ2hELGdCQUFnQjtRQUNVLFVBQUssR0FBRyxLQUFLLENBQUM7UUFLeEM7O1dBRUc7UUFDZ0IsYUFBUSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3JFLHNCQUFpQixHQUFxQixJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUM1RSxnQkFBZ0I7UUFDTixhQUFRLEdBQWtCO1lBQ2hDLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQ2pGLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1lBQ3ZGLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDL0UsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztZQUN4RixpQkFBaUIsRUFBRSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsd0JBQUMsSUFBSSxDQUFDLFVBQVUsMENBQUUsUUFBUSxDQUFDLDJCQUEyQixJQUFDO1lBQzFHLG1CQUFtQixFQUFFLEdBQUcsRUFBRSx3QkFBQyxJQUFJLENBQUMsVUFBVSwwQ0FBRSxVQUFVLEtBQUU7WUFDeEQsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDekQsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDeEQsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDMUQsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVU7WUFDekUscUJBQXFCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDM0UsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtTQUNoRCxDQUFDO1FBQ0YsZ0JBQWdCO1FBQ2hCLGdCQUFXLEdBQTRCLElBQUksQ0FBQztJQUk1QyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLElBQUksV0FBVyxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVU7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUM7UUFDRixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxTQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxXQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO1FBQ3ZDLElBQUksT0FBTztZQUNQLElBQUksQ0FBQyxXQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksVUFBVSxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUM5RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN6QzthQUFNO1lBQ0gsa0RBQWtEO1lBQ2xELElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sdUJBQXVCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVMsQ0FBQyxRQUFnQixFQUFFLDJCQUF3QztRQUNoRSxJQUFJLENBQUMsT0FBTyxHQUFHLDJCQUEyQixJQUFJLElBQUksQ0FBQztRQUNuRCxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixXQUFXO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiwyQkFBMkI7O1FBQ3ZCLGFBQU8sSUFBSSxDQUFDLFVBQVUsMENBQUUseUJBQXlCLEdBQUc7SUFDeEQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7O1FBQ2QsYUFBTyxJQUFJLENBQUMsV0FBVywwQ0FBRSxpQkFBaUIsR0FBRztJQUNqRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFFBQVE7UUFDSixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsaUJBQWlCLENBQUMsUUFBaUIsSUFBSTtRQUNuQywrRUFBK0U7UUFDL0UsNEZBQTRGO1FBQzVGLFlBQVk7UUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSSxrQkFBa0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNPLFFBQVE7UUFDM0IsSUFBSSxJQUFJLENBQUMsV0FBVztZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBWSxVQUFVO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDM0YsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFZLFFBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNyRixDQUFDOzs7WUFySkosU0FBUzs7O1lBcEVpQyxTQUFTO1lBRDZCLFVBQVU7WUFNbEYsZ0JBQWdCOzRDQW1HcUYsTUFBTSxTQUFDLFFBQVE7OzttQkFqQ3hILFdBQVcsU0FBQyxlQUFlO29CQUszQixXQUFXLFNBQUMsV0FBVzt3QkFFdkIsZUFBZSxTQUFDLHNCQUFzQjswQkFFdEMsZUFBZSxTQUFDLHdCQUF3QixFQUFFLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBQzt1QkFJN0QsTUFBTTt1QkF3SE4sWUFBWSxTQUFDLE9BQU87O0FBZ0J6Qjs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsdUJBQXVCO0lBQ3hELFlBQVksSUFBZSxFQUFFLElBQWdCLEVBQUUsUUFBMEIsRUFBb0IsR0FBUTtRQUNqRyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBZSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWEsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxLQUFjO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDOzs7WUFwQkosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSw0QkFBNEI7Z0JBQ3RDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7YUFDbkc7OztZQXJPMEMsU0FBUztZQUQ2QixVQUFVO1lBTWxGLGdCQUFnQjs0Q0FrT3VELE1BQU0sU0FBQyxRQUFROzs7cUJBUTFGLEtBQUs7O0FBV1YsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLFxuICAgIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFJlbmRlcmVyMiwgUXVlcnlMaXN0LCBIb3N0TGlzdGVuZXIsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTURDVGFiRm91bmRhdGlvbiwgTURDVGFiQWRhcHRlciB9IGZyb20gJ0BtYXRlcmlhbC90YWInO1xuaW1wb3J0IHsgQWJzdHJhY3RNZGNSaXBwbGUgfSBmcm9tICcuLi9yaXBwbGUvYWJzdHJhY3QubWRjLnJpcHBsZSc7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcbmltcG9ydCB7IE1kY1RhYkluZGljYXRvckRpcmVjdGl2ZSB9IGZyb20gJy4vbWRjLnRhYi5pbmRpY2F0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJzsgIFxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIGV2ZW50cyBzZW5kIGJ5IHRoZSA8Y29kZT5hY3RpdmF0ZTwvY29kZT4gb3V0cHV0IG9mIGFuXG4gKiBgbWRjVGFiYCBkaXJlY3RpdmUsIG9yIGJ5IHRoZSA8Y29kZT50YWJDaGFuZ2U8L2NvZGU+IG91dHB1dCBvZiBhbiA8Y29kZT5tZGNUYWJCYXI8L2NvZGU+LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1kY1RhYkNoYW5nZSB7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHRhYiB0aGF0IHNlbmRzIHRoZSBldmVudC5cbiAgICAgKi9cbiAgICB0YWI6IEFic3RyYWN0TWRjVGFiRGlyZWN0aXZlLFxuICAgIC8qKlxuICAgICAqIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRoYXQgc2VuZHMgdGhlIGV2ZW50LlxuICAgICAqL1xuICAgIHRhYkluZGV4OiBudW1iZXJcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGFuIG9wdGlvbmFsIGljb24gd2hlbiBoYXZpbmcgYSB0YWIgYmFyIHdpdGggaWNvbnMuXG4gKiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiBhbiBgbWRjVGFiQ29udGVudGAsIGFuZCBhcyBhIHNpYmJsaW5nXG4gKiB0byBhIGZvbGxvd2luZyBgbWRjVGFiTGFiZWxgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiSWNvbkRpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXRhYl9faWNvbicpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oaWRkZW4nKSBfYXJpYUhpZGRlbiA9IHRydWU7XG59XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciB0aGUgdGV4dCBsYWJlbCBvZiBhIHRhYi5cbiAqIFRoaXMgZGlyZWN0aXZlIG11c3QgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGFuIGBtZGNUYWJDb250ZW50YC5cbiAqIEl0IGNhbiBiZSBwcmVjZWRlZCBieSBhbiBvcHRpb25hbCBgbWRjVGFiSWNvbmAuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYkxhYmVsXSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiTGFiZWxEaXJlY3RpdmUge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm1kYy10YWJfX3RleHQtbGFiZWwnKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBjb250ZW50IChsYWJlbCBhbmQgb3B0aW9uYWwgaWNvbiBvZiB0aGUgdGFiKS5cbiAqIFRoaXMgZGlyZWN0aXZlIG11c3QgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGFuIGBtZGNUYWJgLCBhbmRcbiAqIGNhbiBjb250YWluIGFuIChvcHRpb25hbCkgYG1kY1RhYkljb25gIGFuZCBhbiBgbWRjVGFiTGFiZWxgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1ttZGNUYWJDb250ZW50XSdcbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiQ29udGVudERpcmVjdGl2ZSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXRhYl9fY29udGVudCcpIHJlYWRvbmx5IF9jbHMgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIF9yb290OiBFbGVtZW50UmVmKSB7fVxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1kY1RhYkRpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjUmlwcGxlIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtdGFiJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgcHJpdmF0ZSBvbkRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcm90ZWN0ZWQgX2FjdGl2ZTogQ2xpZW50UmVjdCB8IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKSBfcm9sZSA9ICd0YWInO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKE1kY1RhYkNvbnRlbnREaXJlY3RpdmUpIF9jb250ZW50cz86IFF1ZXJ5TGlzdDxNZGNUYWJDb250ZW50RGlyZWN0aXZlPjtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNUYWJJbmRpY2F0b3JEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9pbmRpY2F0b3JzPzogUXVlcnlMaXN0PE1kY1RhYkluZGljYXRvckRpcmVjdGl2ZT47XG4gICAgLyoqXG4gICAgICogRXZlbnQgY2FsbGVkIHdoZW4gdGhlIHRhYiBpcyBhY3RpdmF0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGFjdGl2YXRlOiBFdmVudEVtaXR0ZXI8TWRjVGFiQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBwcml2YXRlIGFjdGl2YXRpb25SZXF1ZXN0OiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByb3RlY3RlZCBfYWRhcHRlcjogTURDVGFiQWRhcHRlciA9IHtcbiAgICAgICAgYWRkQ2xhc3M6IChjbGFzc05hbWUpID0+IHRoaXMuX3JuZHIuYWRkQ2xhc3ModGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50LCBjbGFzc05hbWUpLFxuICAgICAgICByZW1vdmVDbGFzczogKGNsYXNzTmFtZSkgPT4gdGhpcy5fcm5kci5yZW1vdmVDbGFzcyh0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSksXG4gICAgICAgIGhhc0NsYXNzOiAoY2xhc3NOYW1lKSA9PiB0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSksXG4gICAgICAgIHNldEF0dHI6IChhdHRyLCB2YWx1ZSkgPT4gdGhpcy5fcm5kci5zZXRBdHRyaWJ1dGUodGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50LCBhdHRyLCB2YWx1ZSksXG4gICAgICAgIGFjdGl2YXRlSW5kaWNhdG9yOiAocHJldmlvdXNJbmRpY2F0b3JDbGllbnRSZWN0KSA9PiB0aGlzLl9pbmRpY2F0b3I/LmFjdGl2YXRlKHByZXZpb3VzSW5kaWNhdG9yQ2xpZW50UmVjdCksXG4gICAgICAgIGRlYWN0aXZhdGVJbmRpY2F0b3I6ICgpID0+IHRoaXMuX2luZGljYXRvcj8uZGVhY3RpdmF0ZSgpLFxuICAgICAgICBub3RpZnlJbnRlcmFjdGVkOiAoKSA9PiB0aGlzLmFjdGl2YXRpb25SZXF1ZXN0Lm5leHQodHJ1ZSksXG4gICAgICAgIGdldE9mZnNldExlZnQ6ICgpID0+IHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgICAgICBnZXRPZmZzZXRXaWR0aDogKCkgPT4gdGhpcy5fcm9vdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoLFxuICAgICAgICBnZXRDb250ZW50T2Zmc2V0TGVmdDogKCkgPT4gdGhpcy5fY29udGVudCEuX3Jvb3QubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0LFxuICAgICAgICBnZXRDb250ZW50T2Zmc2V0V2lkdGg6ICgpID0+IHRoaXMuX2NvbnRlbnQhLl9yb290Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICAgIGZvY3VzOiAoKSA9PiB0aGlzLl9yb290Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKVxuICAgIH07XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9mb3VuZGF0aW9uOiBNRENUYWJGb3VuZGF0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3JuZHI6IFJlbmRlcmVyMiwgcHVibGljIF9yb290OiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5OiBNZGNFdmVudFJlZ2lzdHJ5LCBASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICBzdXBlcihfcm9vdCwgX3JuZHIsIF9yZWdpc3RyeSwgZG9jIGFzIERvY3VtZW50KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIHRoaXMuYWRkUmlwcGxlU3VyZmFjZSgnbWRjLXRhYl9fcmlwcGxlJyk7XG4gICAgICAgIHRoaXMuaW5pdFJpcHBsZSgpO1xuXG4gICAgICAgIGxldCBpbml0aWFsaXplciA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUZvdW5kYXRpb24oKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jb250ZW50ICYmIHRoaXMuX2luZGljYXRvcilcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRGb3VuZGF0aW9uKCk7XG4gICAgICAgIH07XG4gICAgICAgIGluaXRpYWxpemVyKCk7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRzIS5jaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpLnN1YnNjcmliZShpbml0aWFsaXplcik7XG4gICAgICAgIHRoaXMuX2luZGljYXRvcnMhLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKGluaXRpYWxpemVyKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveVJpcHBsZSgpO1xuICAgICAgICB0aGlzLmRlc3Ryb3lGb3VuZGF0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95Rm91bmRhdGlvbigpIHtcbiAgICAgICAgbGV0IGRlc3Ryb3kgPSB0aGlzLl9mb3VuZGF0aW9uICE9IG51bGw7XG4gICAgICAgIGlmIChkZXN0cm95KVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbiEuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGRlc3Ryb3k7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Rm91bmRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5fZm91bmRhdGlvbiA9IG5ldyBNRENUYWJGb3VuZGF0aW9uKHRoaXMuX2FkYXB0ZXIpO1xuICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmluaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSkge1xuICAgICAgICAgICAgbGV0IGNsaWVudFJlY3QgPSB0eXBlb2YgdGhpcy5fYWN0aXZlID09PSAnYm9vbGVhbicgPyB1bmRlZmluZWQgOiB0aGlzLl9hY3RpdmU7XG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmFjdGl2YXRlKGNsaWVudFJlY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZm91bmRhdGlvbiBkb2Vzbid0IGluaXRpYWxpemUgdGhlc2UgYXR0cmlidXRlczpcbiAgICAgICAgICAgIHRoaXMuX3JuZHIuc2V0QXR0cmlidXRlKHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudCwgJ2FyaWEtc2VsZWN0ZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIHRoaXMuX3JuZHIuc2V0QXR0cmlidXRlKHRoaXMuX3Jvb3QubmF0aXZlRWxlbWVudCwgJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJvdGVjdGVkIGdldFJpcHBsZVN0eWxpbmdFbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yaXBwbGVTdXJmYWNlO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfYWN0aXZhdGUodGFiSW5kZXg6IG51bWJlciwgcHJldmlvdXNJbmRpY2F0b3JDbGllbnRSZWN0PzogQ2xpZW50UmVjdCkge1xuICAgICAgICB0aGlzLl9hY3RpdmUgPSBwcmV2aW91c0luZGljYXRvckNsaWVudFJlY3QgfHwgdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdW5kYXRpb24pXG4gICAgICAgICAgICB0aGlzLl9mb3VuZGF0aW9uLmFjdGl2YXRlKHByZXZpb3VzSW5kaWNhdG9yQ2xpZW50UmVjdCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGUuZW1pdCh7dGFiOiB0aGlzLCB0YWJJbmRleH0pO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfZGVhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5kZWFjdGl2YXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9mb2N1cygpIHtcbiAgICAgICAgdGhpcy5fYWRhcHRlci5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBfY29tcHV0ZUluZGljYXRvckNsaWVudFJlY3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmRpY2F0b3I/Ll9jb21wdXRlQ29udGVudENsaWVudFJlY3QoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIF9jb21wdXRlRGltZW5zaW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvdW5kYXRpb24/LmNvbXB1dGVEaW1lbnNpb25zKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGlzQWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9hY3RpdmU7XG4gICAgfSBcblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0cmlnZ2VyQWN0aXZhdGlvbih2YWx1ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgLy8gTm90ZTogdGhpcyBzaG91bGQgbm90IHNldCB0aGUgX2FjdGl2ZSBwcm9wZXJ0eS4gSXQganVzdCBub3RpZmllcyB0aGUgdGFiLWJhclxuICAgICAgICAvLyB0aGF0IGl0IHdhbnRzIHRvIGJlIGFjdGl2YXRlZC4gVGhlIHRhYi1iYXIgd2lsbCBkZWFjdGl2YXRlIHRoZSBwcmV2aW91cyB0YWIsIGFuZCBhY3RpdmF0ZVxuICAgICAgICAvLyB0aGlzIG9uZS5cbiAgICAgICAgdGhpcy5hY3RpdmF0aW9uUmVxdWVzdC5uZXh0KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgZ2V0IGFjdGl2YXRpb25SZXF1ZXN0JCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGlvblJlcXVlc3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJykgX29uQ2xpY2soKSB7XG4gICAgICAgIGlmICh0aGlzLl9mb3VuZGF0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZm91bmRhdGlvbi5oYW5kbGVDbGljaygpO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwcml2YXRlIGdldCBfaW5kaWNhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kaWNhdG9ycyAmJiB0aGlzLl9pbmRpY2F0b3JzLmxlbmd0aCA+IDAgPyB0aGlzLl9pbmRpY2F0b3JzLmZpcnN0IDogbnVsbDtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHJpdmF0ZSBnZXQgX2NvbnRlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50cyAmJiB0aGlzLl9jb250ZW50cy5sZW5ndGggPiAwID8gdGhpcy5fY29udGVudHMuZmlyc3QgOiBudWxsO1xuICAgIH1cbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGEgdGFiLiBUaGlzIGRpcmVjdGl2ZSBtdXN0IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiA8Y29kZT5tZGNUYWJCYXI8L2NvZGU+LlxuICogV2hlbiB1c2luZyB0YWJzIGluIGNvbWJpbmF0aW9uIHdpdGggYW5ndWxhciByb3V0ZXMsIGFkZCBhIGByb3V0ZXJMaW5rYCBwcm9wZXJ0eSwgc28gdGhhdFxuICogdGhlIGBNZGNUYWJSb3V0ZXJEaXJlY3RpdmVgIGlzIHNlbGVjdGVkIGluc3RlYWQgb2YgdGhpcyBkaXJlY3RpdmUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW21kY1RhYl06bm90KFtyb3V0ZXJMaW5rXSknLFxuICAgIGV4cG9ydEFzOiAnbWRjVGFiJyxcbiAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogQWJzdHJhY3RNZGNUYWJEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1kY1RhYkRpcmVjdGl2ZSkgfV1cbn0pXG5leHBvcnQgY2xhc3MgTWRjVGFiRGlyZWN0aXZlIGV4dGVuZHMgQWJzdHJhY3RNZGNUYWJEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHJuZHI6IFJlbmRlcmVyMiwgcm9vdDogRWxlbWVudFJlZiwgcmVnaXN0cnk6IE1kY0V2ZW50UmVnaXN0cnksIEBJbmplY3QoRE9DVU1FTlQpIGRvYzogYW55KSB7XG4gICAgICAgIHN1cGVyKHJuZHIsIHJvb3QsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElucHV0IGZvciBhY3RpdmF0aW5nIHRoZSB0YWIuIEFzc2lnbiBhIHRydXRoeSB2YWx1ZSB0byBhY3RpdmF0ZSB0aGUgdGFiLiBBIGZhbHN5IHZhbHVlXG4gICAgICogd2lsbCBoYXZlIG5vIGVmZmVjdC4gSW4gb3JkZXIgdG8gZGVhY3RpdmF0ZSB0aGUgdGFiLCB5b3UgbXVzdCBhY3RpdmF0ZSBhbm90aGVyIHRhYi5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBnZXQgYWN0aXZlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FjdGl2ZSgpO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQWN0aXZhdGlvbihhc0Jvb2xlYW4odmFsdWUpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYWN0aXZlOiBib29sZWFuIHwgJyc7XG59XG5cbmV4cG9ydCBjb25zdCBUQUJfRElSRUNUSVZFUyA9IFtNZGNUYWJJY29uRGlyZWN0aXZlLCBNZGNUYWJMYWJlbERpcmVjdGl2ZSwgTWRjVGFiQ29udGVudERpcmVjdGl2ZSwgTWRjVGFiRGlyZWN0aXZlXTtcbiJdfQ==