ngx-popperjs
Version:
ngx-popperjs is an Angular wrapper for @popperjs
475 lines • 59.5 kB
JavaScript
// tslint:disable:no-input-rename
import { Directive, EventEmitter, Inject, Input, Output } from "@angular/core";
import { NgxPopperjsContentComponent } from "../../components/ngx-popperjs-content/ngx-popperjs-content.component";
import { NgxPopperjsTriggers } from "../../models/ngx-popperjs-triggers.model";
import { NGX_POPPERJS_DEFAULTS } from "../../models/ngx-popperjs-defaults.model";
import { NgxPopperjsUtils } from "../../models/ngx-popperjs-utils.class";
//
import { fromEvent, Subject, takeUntil, timer } from "rxjs";
import * as i0 from "@angular/core";
export class NgxPopperjsDirective {
_changeDetectorRef;
_elementRef;
_vcr;
_popperDefaults;
static baseOptions = {
showDelay: 0,
hideOnClickOutside: true,
hideOnMouseLeave: false,
hideOnScroll: false,
appendTo: undefined,
ariaRole: "popper",
ariaDescribe: "",
styles: {},
trigger: NgxPopperjsTriggers.click
};
set applyClass(newValue) {
if (newValue === this._applyClass) {
return;
}
this._applyClass = newValue;
this._checkExisting("applyClass", newValue);
}
get applyClass() {
return this._applyClass;
}
set hideOnClickOutside(newValue) {
this._hideOnClickOutside = NgxPopperjsUtils.coerceBooleanProperty(newValue);
}
get hideOnClickOutside() {
return this._hideOnClickOutside;
}
set content(newValue) {
if (newValue === this._content) {
return;
}
this._content = newValue;
if (this._popperContent) {
if (typeof newValue === "string") {
this._popperContent.text = newValue;
}
else {
this._popperContent = newValue;
}
}
}
get content() {
return this._content;
}
set flip(newValue) {
this._flip = NgxPopperjsUtils.coerceBooleanProperty(newValue);
this._checkExisting("preventOverflow", this._preventOverflow);
}
get flip() {
return this._flip;
}
set placement(newValue) {
this._placement = newValue;
this._checkExisting("placement", newValue);
}
get placement() {
return this._placement;
}
set preventOverflow(newValue) {
this._preventOverflow = NgxPopperjsUtils.coerceBooleanProperty(newValue);
this._checkExisting("preventOverflow", this._preventOverflow);
}
get preventOverflow() {
return this._preventOverflow;
}
set popperApplyArrowClass(newValue) {
if (newValue === this._applyArrowClass) {
return;
}
this._applyArrowClass = newValue;
if (this._popperContent) {
this._popperContent.popperOptions.applyArrowClass = newValue;
if (!this._shown) {
return;
}
this._popperContent.update();
}
}
get popperApplyArrowClass() {
return this._applyArrowClass;
}
set disabled(newValue) {
if (newValue === this._disabled) {
return;
}
this._disabled = !!newValue;
if (this._shown) {
this.hide();
}
}
get disabled() {
return this._disabled;
}
ariaDescribe;
ariaRole;
boundariesElement;
disableAnimation;
disableStyle;
hideOnMouseLeave;
hideOnScroll;
hideTimeout = 0;
popperAppendTo;
popperOnHidden = new EventEmitter();
popperOnShown = new EventEmitter();
popperOnUpdate = new EventEmitter();
positionFixed;
showDelay;
showOnStart;
showTrigger;
styles;
targetElement;
timeoutAfterShow = 0;
_applyArrowClass;
_applyClass;
_content;
_destroy$ = new Subject();
_disabled;
_flip = !0;
_globalEventListenersCtrl$ = new Subject();
_hideOnClickOutside = true;
_placement;
_popperContent;
_popperContentClass = NgxPopperjsContentComponent;
_popperContentRef;
_preventOverflow = !0;
_scheduledHideTimeoutCtrl$ = new Subject();
_scheduledShowTimeoutCtrl$ = new Subject();
_shown = false;
constructor(_changeDetectorRef, _elementRef, _vcr, _popperDefaults = {}) {
this._changeDetectorRef = _changeDetectorRef;
this._elementRef = _elementRef;
this._vcr = _vcr;
this._popperDefaults = _popperDefaults;
NgxPopperjsDirective.baseOptions = { ...NgxPopperjsDirective.baseOptions, ...this._popperDefaults };
}
static assignDefined(target, ...sources) {
for (const source of sources) {
for (const key of Object.keys(source)) {
const val = source[key];
if (val !== undefined) {
target[key] = val;
}
}
}
return target;
}
applyTriggerListeners() {
switch (this.showTrigger) {
case NgxPopperjsTriggers.click:
this._addListener("click", this.toggle.bind(this));
break;
case NgxPopperjsTriggers.mousedown:
this._addListener("mousedown", this.toggle.bind(this));
break;
case NgxPopperjsTriggers.hover:
this._addListener("mouseenter", this.scheduledShow.bind(this, this.showDelay));
["touchend", "touchcancel", "mouseleave"].forEach((eventName) => {
this._addListener(eventName, this.scheduledHide.bind(this, null, this.hideTimeout));
});
break;
}
if (this.showTrigger !== NgxPopperjsTriggers.hover && this.hideOnMouseLeave) {
["touchend", "touchcancel", "mouseleave"].forEach((eventName) => {
this._addListener(eventName, this.scheduledHide.bind(this, null, this.hideTimeout));
});
}
}
getRefElement() {
return this.targetElement || this._elementRef.nativeElement;
}
hide() {
if (this.disabled) {
return;
}
if (!this._shown) {
this._scheduledShowTimeoutCtrl$.next();
return;
}
this._shown = false;
if (this._popperContentRef) {
this._popperContentRef.instance.hide();
}
else {
this._popperContent.hide();
}
this.popperOnHidden.emit(this);
this._globalEventListenersCtrl$.next();
}
hideOnClickOutsideHandler($event) {
if (this.disabled || !this.hideOnClickOutside || $event.target === this._popperContent.elRef.nativeElement ||
this._popperContent.elRef.nativeElement.contains($event.target)) {
return;
}
this.scheduledHide($event, this.hideTimeout);
}
hideOnScrollHandler($event) {
if (this.disabled || !this.hideOnScroll) {
return;
}
this.scheduledHide($event, this.hideTimeout);
}
ngOnDestroy() {
this._destroy$.next();
this._destroy$.complete();
this._popperContent && this._popperContent.clean();
}
ngOnInit() {
if (typeof this.content === "string") {
this._popperContent = this._constructContent();
this._popperContent.text = this.content;
}
else if (typeof this.content === typeof void 0) {
this._popperContent = this._constructContent();
this._popperContent.text = "";
}
else {
this._popperContent = this.content;
}
const popperRef = this._popperContent;
popperRef.referenceObject = this.getRefElement();
this._setContentProperties(popperRef);
this._setDefaults();
this.applyTriggerListeners();
if (this.showOnStart) {
this.scheduledShow();
}
}
scheduledHide($event = null, delay = this.hideTimeout) {
if (this.disabled) {
return;
}
this._scheduledShowTimeoutCtrl$.next();
timer(delay)
.pipe(takeUntil(this._scheduledHideTimeoutCtrl$), takeUntil(this._destroy$))
.subscribe({
next: () => {
// TODO: check
const toElement = $event ? $event.toElement : null;
const popperContentView = this._popperContent.popperViewRef ? this._popperContent.popperViewRef.nativeElement : false;
if (!popperContentView ||
popperContentView === toElement ||
popperContentView.contains(toElement) ||
(this.content && this.content.isMouseOver)) {
return;
}
this.hide();
this._applyChanges();
}
});
}
scheduledShow(delay = this.showDelay) {
if (this.disabled) {
return;
}
this._scheduledHideTimeoutCtrl$.next();
timer(delay)
.pipe(takeUntil(this._scheduledShowTimeoutCtrl$), takeUntil(this._destroy$))
.subscribe({
next: () => {
this.show();
this._applyChanges();
}
});
}
show() {
if (this._shown) {
this._scheduledHideTimeoutCtrl$.next();
return;
}
this._shown = true;
const popperRef = this._popperContent;
const element = this.getRefElement();
if (popperRef.referenceObject !== element) {
popperRef.referenceObject = element;
}
this._setContentProperties(popperRef);
popperRef.show();
this.popperOnShown.emit(this);
if (this.timeoutAfterShow > 0) {
this.scheduledHide(null, this.timeoutAfterShow);
}
fromEvent(document, "click")
.pipe(takeUntil(this._globalEventListenersCtrl$), takeUntil(this._destroy$))
.subscribe({
next: (e) => this.hideOnClickOutsideHandler(e)
});
fromEvent(this._getScrollParent(this.getRefElement()), "scroll")
.pipe(takeUntil(this._globalEventListenersCtrl$), takeUntil(this._destroy$))
.subscribe({
next: (e) => {
this.hideOnScrollHandler(e);
}
});
}
toggle() {
if (this.disabled) {
return;
}
this._shown ? this.scheduledHide(null, this.hideTimeout) : this.scheduledShow();
}
_addListener(eventName, cb) {
fromEvent(this._elementRef.nativeElement, eventName)
.pipe(takeUntil(this._destroy$))
.subscribe({
next: cb
});
}
_applyChanges() {
this._changeDetectorRef.markForCheck();
this._changeDetectorRef.detectChanges();
}
_checkExisting(key, newValue) {
if (this._popperContent) {
this._popperContent.popperOptions[key] = newValue;
if (!this._shown) {
return;
}
this._popperContent.update();
}
}
_constructContent() {
this._popperContentRef = this._vcr.createComponent(this._popperContentClass);
return this._popperContentRef.instance;
}
_getScrollParent(node) {
const isElement = node instanceof HTMLElement;
const overflowY = isElement && window.getComputedStyle(node).overflowY;
const isScrollable = overflowY !== "visible" && overflowY !== "hidden";
if (!node) {
return null;
}
else if (isScrollable && node.scrollHeight > node.clientHeight) {
return node;
}
return this._getScrollParent(node.parentNode) || document;
}
_onPopperUpdate(event) {
this.popperOnUpdate.emit(event);
}
_setContentProperties(popperRef) {
popperRef.popperOptions = NgxPopperjsDirective.assignDefined(popperRef.popperOptions, NgxPopperjsDirective.baseOptions, {
showDelay: this.showDelay,
disableAnimation: this.disableAnimation,
disableDefaultStyling: this.disableStyle,
placement: this.placement,
boundariesElement: this.boundariesElement,
trigger: this.showTrigger,
positionFixed: this.positionFixed,
ariaDescribe: this.ariaDescribe,
ariaRole: this.ariaRole,
applyClass: this.applyClass,
applyArrowClass: this.popperApplyArrowClass,
hideOnMouseLeave: this.hideOnMouseLeave,
styles: this.styles,
appendTo: this.popperAppendTo,
preventOverflow: this.preventOverflow,
});
popperRef.onUpdate = this._onPopperUpdate.bind(this);
popperRef.onHidden
.pipe(takeUntil(this._destroy$))
.subscribe(this.hide.bind(this));
}
_setDefaults() {
["showDelay", "hideOnScroll", "hideOnMouseLeave", "hideOnClickOutside", "ariaRole", "ariaDescribe"].forEach((key) => {
this[key] = this[key] === void 0 ? NgxPopperjsDirective.baseOptions[key] : this[key];
});
this.showTrigger = this.showTrigger || NgxPopperjsDirective.baseOptions.trigger;
this.styles = this.styles === void 0 ? { ...NgxPopperjsDirective.baseOptions.styles } : this.styles;
}
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgxPopperjsDirective, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: NGX_POPPERJS_DEFAULTS }], target: i0.ɵɵFactoryTarget.Directive });
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.0", type: NgxPopperjsDirective, isStandalone: true, selector: "[popper]", inputs: { applyClass: ["popperApplyClass", "applyClass"], hideOnClickOutside: ["popperHideOnClickOutside", "hideOnClickOutside"], content: ["popper", "content"], flip: ["popperFlip", "flip"], placement: ["popperPlacement", "placement"], preventOverflow: ["popperPreventOverflow", "preventOverflow"], popperApplyArrowClass: "popperApplyArrowClass", disabled: ["popperDisabled", "disabled"], ariaDescribe: ["popperAriaDescribeBy", "ariaDescribe"], ariaRole: ["popperAriaRole", "ariaRole"], boundariesElement: ["popperBoundaries", "boundariesElement"], disableAnimation: ["popperDisableAnimation", "disableAnimation"], disableStyle: ["popperDisableStyle", "disableStyle"], hideOnMouseLeave: ["popperHideOnMouseLeave", "hideOnMouseLeave"], hideOnScroll: ["popperHideOnScroll", "hideOnScroll"], hideTimeout: ["popperTimeout", "hideTimeout"], popperAppendTo: "popperAppendTo", positionFixed: ["popperPositionFixed", "positionFixed"], showDelay: ["popperDelay", "showDelay"], showOnStart: ["popperShowOnStart", "showOnStart"], showTrigger: ["popperTrigger", "showTrigger"], styles: ["popperStyles", "styles"], targetElement: ["popperTarget", "targetElement"], timeoutAfterShow: ["popperTimeoutAfterShow", "timeoutAfterShow"] }, outputs: { popperOnHidden: "popperOnHidden", popperOnShown: "popperOnShown", popperOnUpdate: "popperOnUpdate" }, exportAs: ["popper"], ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0", ngImport: i0, type: NgxPopperjsDirective, decorators: [{
type: Directive,
args: [{
// tslint:disable-next-line:directive-selector
selector: "[popper]",
exportAs: "popper",
standalone: true
}]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
type: Inject,
args: [NGX_POPPERJS_DEFAULTS]
}] }], propDecorators: { applyClass: [{
type: Input,
args: ["popperApplyClass"]
}], hideOnClickOutside: [{
type: Input,
args: ["popperHideOnClickOutside"]
}], content: [{
type: Input,
args: ["popper"]
}], flip: [{
type: Input,
args: ["popperFlip"]
}], placement: [{
type: Input,
args: ["popperPlacement"]
}], preventOverflow: [{
type: Input,
args: ["popperPreventOverflow"]
}], popperApplyArrowClass: [{
type: Input
}], disabled: [{
type: Input,
args: ["popperDisabled"]
}], ariaDescribe: [{
type: Input,
args: ["popperAriaDescribeBy"]
}], ariaRole: [{
type: Input,
args: ["popperAriaRole"]
}], boundariesElement: [{
type: Input,
args: ["popperBoundaries"]
}], disableAnimation: [{
type: Input,
args: ["popperDisableAnimation"]
}], disableStyle: [{
type: Input,
args: ["popperDisableStyle"]
}], hideOnMouseLeave: [{
type: Input,
args: ["popperHideOnMouseLeave"]
}], hideOnScroll: [{
type: Input,
args: ["popperHideOnScroll"]
}], hideTimeout: [{
type: Input,
args: ["popperTimeout"]
}], popperAppendTo: [{
type: Input
}], popperOnHidden: [{
type: Output
}], popperOnShown: [{
type: Output
}], popperOnUpdate: [{
type: Output
}], positionFixed: [{
type: Input,
args: ["popperPositionFixed"]
}], showDelay: [{
type: Input,
args: ["popperDelay"]
}], showOnStart: [{
type: Input,
args: ["popperShowOnStart"]
}], showTrigger: [{
type: Input,
args: ["popperTrigger"]
}], styles: [{
type: Input,
args: ["popperStyles"]
}], targetElement: [{
type: Input,
args: ["popperTarget"]
}], timeoutAfterShow: [{
type: Input,
args: ["popperTimeoutAfterShow"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBvcHBlcmpzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wb3BwZXJqcy9zcmMvbGliL2RpcmVjdGl2ZXMvbmd4LXBvcHBlcmpzL25neC1wb3BwZXJqcy5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLE9BQU8sRUFHSCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBR2pILE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBQ3ZFLEVBQUU7QUFDRixPQUFPLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQVExRCxNQUFNLE9BQU8sb0JBQW9CO0lBc01QO0lBQ0E7SUFDQTtJQUMrQjtJQXZNckQsTUFBTSxDQUFDLFdBQVcsR0FBdUI7UUFDckMsU0FBUyxFQUFFLENBQUM7UUFDWixrQkFBa0IsRUFBRSxJQUFJO1FBQ3hCLGdCQUFnQixFQUFFLEtBQUs7UUFDdkIsWUFBWSxFQUFFLEtBQUs7UUFDbkIsUUFBUSxFQUFFLFNBQVM7UUFDbkIsUUFBUSxFQUFFLFFBQVE7UUFDbEIsWUFBWSxFQUFFLEVBQUU7UUFDaEIsTUFBTSxFQUFFLEVBQUU7UUFDVixPQUFPLEVBQUUsbUJBQW1CLENBQUMsS0FBSztLQUNyQyxDQUFDO0lBRUYsSUFDSSxVQUFVLENBQUMsUUFBZ0I7UUFDM0IsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFdB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QURmLEtBQUs7dUJBQUMsd0JBQXdCO2dCQUkvQixZQUFZO3NCQURYLEtBQUs7dUJBQUMsb0JBQW9CO2dCQUkzQixnQkFBZ0I7c0JBRGYsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBSS9CLFlBQVk7c0JBRFgsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBSTNCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxlQUFlO2dCQUl0QixjQUFjO3NCQURiLEtBQUs7Z0JBSU4sY0FBYztzQkFEYixNQUFNO2dCQUlQLGFBQWE7c0JBRFosTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixLQUFLO3VCQUFDLHFCQUFxQjtnQkFJNUIsU0FBUztzQkFEUixLQUFLO3VCQUFDLGFBQWE7Z0JBSXBCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSTFCLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxlQUFlO2dCQUl0QixNQUFNO3NCQURMLEtBQUs7dUJBQUMsY0FBYztnQkFJckIsYUFBYTtzQkFEWixLQUFLO3VCQUFDLGNBQWM7Z0JBSXJCLGdCQUFnQjtzQkFEZixLQUFLO3VCQUFDLHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOm5vLWlucHV0LXJlbmFtZVxyXG5pbXBvcnQge1xyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnRSZWYsXHJcbiAgICBEaXJlY3RpdmUsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0LFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBWaWV3Q29udGFpbmVyUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL25neC1wb3BwZXJqcy1jb250ZW50L25neC1wb3BwZXJqcy1jb250ZW50LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzT3B0aW9uc30gZnJvbSBcIi4uLy4uL21vZGVscy9uZ3gtcG9wcGVyanMtb3B0aW9ucy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzUGxhY2VtZW50c30gZnJvbSBcIi4uLy4uL21vZGVscy9uZ3gtcG9wcGVyanMtcGxhY2VtZW50cy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzVHJpZ2dlcnN9IGZyb20gXCIuLi8uLi9tb2RlbHMvbmd4LXBvcHBlcmpzLXRyaWdnZXJzLm1vZGVsXCI7XHJcbmltcG9ydCB7TkdYX1BPUFBFUkpTX0RFRkFVTFRTfSBmcm9tIFwiLi4vLi4vbW9kZWxzL25neC1wb3BwZXJqcy1kZWZhdWx0cy5tb2RlbFwiO1xyXG5pbXBvcnQge05neFBvcHBlcmpzVXRpbHN9IGZyb20gXCIuLi8uLi9tb2RlbHMvbmd4LXBvcHBlcmpzLXV0aWxzLmNsYXNzXCI7XHJcbi8vXHJcbmltcG9ydCB7ZnJvbUV2ZW50LCBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogXCJbcG9wcGVyXVwiLFxyXG4gICAgZXhwb3J0QXM6IFwicG9wcGVyXCIsXHJcbiAgICBzdGFuZGFsb25lOiB0cnVlXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hQb3BwZXJqc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICBzdGF0aWMgYmFzZU9wdGlvbnM6IE5neFBvcHBlcmpzT3B0aW9ucyA9IHtcclxuICAgICAgICBzaG93RGVsYXk6IDAsXHJcbiAgICAgICAgaGlkZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLFxyXG4gICAgICAgIGhpZGVPbk1vdXNlTGVhdmU6IGZhbHNlLFxyXG4gICAgICAgIGhpZGVPblNjcm9sbDogZmFsc2UsXHJcbiAgICAgICAgYXBwZW5kVG86IHVuZGVmaW5lZCxcclxuICAgICAgICBhcmlhUm9sZTogXCJwb3BwZXJcIixcclxuICAgICAgICBhcmlhRGVzY3JpYmU6IFwiXCIsXHJcbiAgICAgICAgc3R5bGVzOiB7fSxcclxuICAgICAgICB0cmlnZ2VyOiBOZ3hQb3BwZXJqc1RyaWdnZXJzLmNsaWNrXHJcbiAgICB9O1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckFwcGx5Q2xhc3NcIilcclxuICAgIHNldCBhcHBseUNsYXNzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2FwcGx5Q2xhc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hcHBseUNsYXNzID0gbmV3VmFsdWU7XHJcbiAgICAgICAgdGhpcy5fY2hlY2tFeGlzdGluZyhcImFwcGx5Q2xhc3NcIiwgbmV3VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBhcHBseUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5Q2xhc3M7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uQ2xpY2tPdXRzaWRlXCIpXHJcbiAgICBzZXQgaGlkZU9uQ2xpY2tPdXRzaWRlKG5ld1ZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5faGlkZU9uQ2xpY2tPdXRzaWRlID0gTmd4UG9wcGVyanNVdGlscy5jb2VyY2VCb29sZWFuUHJvcGVydHkobmV3VmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoaWRlT25DbGlja091dHNpZGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZGVPbkNsaWNrT3V0c2lkZTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJcIilcclxuICAgIHNldCBjb250ZW50KG5ld1ZhbHVlOiBzdHJpbmcgfCBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2NvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGVudCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXJDb250ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQudGV4dCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcG9wcGVyQ29udGVudCA9IG5ld1ZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb250ZW50KCk6IHN0cmluZyB8IE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyRmxpcFwiKVxyXG4gICAgc2V0IGZsaXAobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl9mbGlwID0gTmd4UG9wcGVyanNVdGlscy5jb2VyY2VCb29sZWFuUHJvcGVydHkobmV3VmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX2NoZWNrRXhpc3RpbmcoXCJwcmV2ZW50T3ZlcmZsb3dcIiwgdGhpcy5fcHJldmVudE92ZXJmbG93KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZmxpcCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZmxpcDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyUGxhY2VtZW50XCIpXHJcbiAgICBzZXQgcGxhY2VtZW50KG5ld1ZhbHVlOiBOZ3hQb3BwZXJqc1BsYWNlbWVudHMpIHtcclxuICAgICAgICB0aGlzLl9wbGFjZW1lbnQgPSBuZXdWYWx1ZTtcclxuICAgICAgICB0aGlzLl9jaGVja0V4aXN0aW5nKFwicGxhY2VtZW50XCIsIG5ld1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGxhY2VtZW50KCk6IE5neFBvcHBlcmpzUGxhY2VtZW50cyB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wbGFjZW1lbnQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclByZXZlbnRPdmVyZmxvd1wiKVxyXG4gICAgc2V0IHByZXZlbnRPdmVyZmxvdyhuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuX3ByZXZlbnRPdmVyZmxvdyA9IE5neFBvcHBlcmpzVXRpbHMuY29lcmNlQm9vbGVhblByb3BlcnR5KG5ld1ZhbHVlKTtcclxuICAgICAgICB0aGlzLl9jaGVja0V4aXN0aW5nKFwicHJldmVudE92ZXJmbG93XCIsIHRoaXMuX3ByZXZlbnRPdmVyZmxvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZlbnRPdmVyZmxvdygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHJldmVudE92ZXJmbG93O1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgcG9wcGVyQXBwbHlBcnJvd0NsYXNzKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2FwcGx5QXJyb3dDbGFzcykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2FwcGx5QXJyb3dDbGFzcyA9IG5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BwZXJDb250ZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQucG9wcGVyT3B0aW9ucy5hcHBseUFycm93Q2xhc3MgPSBuZXdWYWx1ZTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQudXBkYXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb3BwZXJBcHBseUFycm93Q2xhc3MoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwbHlBcnJvd0NsYXNzO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRpc2FibGVkXCIpXHJcbiAgICBzZXQgZGlzYWJsZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAobmV3VmFsdWUgPT09IHRoaXMuX2Rpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSAhIW5ld1ZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJBcmlhRGVzY3JpYmVCeVwiKVxyXG4gICAgYXJpYURlc2NyaWJlOiBzdHJpbmcgfCB2b2lkO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckFyaWFSb2xlXCIpXHJcbiAgICBhcmlhUm9sZTogc3RyaW5nIHwgdm9pZDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJCb3VuZGFyaWVzXCIpXHJcbiAgICBib3VuZGFyaWVzRWxlbWVudDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRpc2FibGVBbmltYXRpb25cIilcclxuICAgIGRpc2FibGVBbmltYXRpb246IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyRGlzYWJsZVN0eWxlXCIpXHJcbiAgICBkaXNhYmxlU3R5bGU6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uTW91c2VMZWF2ZVwiKVxyXG4gICAgaGlkZU9uTW91c2VMZWF2ZTogYm9vbGVhbiB8IHZvaWQ7XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVySGlkZU9uU2Nyb2xsXCIpXHJcbiAgICBoaWRlT25TY3JvbGw6IGJvb2xlYW4gfCB2b2lkO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclRpbWVvdXRcIilcclxuICAgIGhpZGVUaW1lb3V0OiBudW1iZXIgPSAwO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwb3BwZXJBcHBlbmRUbzogc3RyaW5nO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcG9wcGVyT25IaWRkZW46IEV2ZW50RW1pdHRlcjxOZ3hQb3BwZXJqc0RpcmVjdGl2ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPE5neFBvcHBlcmpzRGlyZWN0aXZlPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcG9wcGVyT25TaG93bjogRXZlbnRFbWl0dGVyPE5neFBvcHBlcmpzRGlyZWN0aXZlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Tmd4UG9wcGVyanNEaXJlY3RpdmU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwb3BwZXJPblVwZGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJQb3NpdGlvbkZpeGVkXCIpXHJcbiAgICBwb3NpdGlvbkZpeGVkOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlckRlbGF5XCIpXHJcbiAgICBzaG93RGVsYXk6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJTaG93T25TdGFydFwiKVxyXG4gICAgc2hvd09uU3RhcnQ6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyVHJpZ2dlclwiKVxyXG4gICAgc2hvd1RyaWdnZXI6IE5neFBvcHBlcmpzVHJpZ2dlcnMgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgQElucHV0KFwicG9wcGVyU3R5bGVzXCIpXHJcbiAgICBzdHlsZXM6IG9iamVjdDtcclxuXHJcbiAgICBASW5wdXQoXCJwb3BwZXJUYXJnZXRcIilcclxuICAgIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIEBJbnB1dChcInBvcHBlclRpbWVvdXRBZnRlclNob3dcIilcclxuICAgIHRpbWVvdXRBZnRlclNob3c6IG51bWJlciA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hcHBseUFycm93Q2xhc3M6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCBfYXBwbHlDbGFzczogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIF9jb250ZW50OiBzdHJpbmcgfCBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQ7XHJcbiAgICBwcm90ZWN0ZWQgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgICBwcm90ZWN0ZWQgX2ZsaXA6IGJvb2xlYW4gPSAhMDtcclxuICAgIHByb3RlY3RlZCBfZ2xvYmFsRXZlbnRMaXN0ZW5lcnNDdHJsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcm90ZWN0ZWQgX2hpZGVPbkNsaWNrT3V0c2lkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcm90ZWN0ZWQgX3BsYWNlbWVudDogTmd4UG9wcGVyanNQbGFjZW1lbnRzO1xyXG4gICAgcHJvdGVjdGVkIF9wb3BwZXJDb250ZW50OiBOZ3hQb3BwZXJqc0NvbnRlbnRDb21wb25lbnQ7XHJcbiAgICBwcm90ZWN0ZWQgX3BvcHBlckNvbnRlbnRDbGFzcyA9IE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudDtcclxuICAgIHByb3RlY3RlZCBfcG9wcGVyQ29udGVudFJlZjogQ29tcG9uZW50UmVmPE5neFBvcHBlcmpzQ29udGVudENvbXBvbmVudD47XHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZlbnRPdmVyZmxvdzogYm9vbGVhbiA9ICEwO1xyXG4gICAgcHJvdGVjdGVkIF9zY2hlZHVsZWRIaWRlVGltZW91dEN0cmwkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByb3RlY3RlZCBfc2NoZWR1bGVkU2hvd1RpbWVvdXRDdHJsJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcm90ZWN0ZWQgX3Nob3duOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3ZjcjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoTkdYX1BPUFBFUkpTX0RFRkFVTFRTKSBwcm90ZWN0ZWQgX3BvcHBlckRlZmF1bHRzOiBOZ3hQb3BwZXJqc09wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIE5neFBvcHBlcmpzRGlyZWN0aXZlLmJhc2VPcHRpb25zID0gey4uLk5neFBvcHBlcmpzRGlyZWN0aXZlLmJhc2VPcHRpb25zLCAuLi50aGlzLl9wb3BwZXJEZWZhdWx0c307XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGFzc2lnbkRlZmluZWQodGFyZ2V0OiBhbnksIC4uLnNvdXJjZXM6IGFueVtdKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBzb3VyY2Vba2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5VHJpZ2dlckxpc3RlbmVycygpIHtcclxuICAgICAgICBzd2l0Y2ggKHRoaXMuc2hvd1RyaWdnZXIpIHtcclxuICAgICAgICAgICAgY2FzZSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmNsaWNrOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMpKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIE5neFBvcHBlcmpzVHJpZ2dlcnMubW91c2Vkb3duOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy50b2dnbGUuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmhvdmVyOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIHRoaXMuc2NoZWR1bGVkU2hvdy5iaW5kKHRoaXMsIHRoaXMuc2hvd0RlbGF5KSk7XHJcbiAgICAgICAgICAgICAgICBbXCJ0b3VjaGVuZFwiLCBcInRvdWNoY2FuY2VsXCIsIFwibW91c2VsZWF2ZVwiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRMaXN0ZW5lcihldmVudE5hbWUsIHRoaXMuc2NoZWR1bGVkSGlkZS5iaW5kKHRoaXMsIG51bGwsIHRoaXMuaGlkZVRpbWVvdXQpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dUcmlnZ2VyICE9PSBOZ3hQb3BwZXJqc1RyaWdnZXJzLmhvdmVyICYmIHRoaXMuaGlkZU9uTW91c2VMZWF2ZSkge1xyXG4gICAgICAgICAgICBbXCJ0b3VjaGVuZFwiLCBcInRvdWNoY2FuY2VsXCIsIFwibW91c2VsZWF2ZVwiXS5mb3JFYWNoKChldmVudE5hbWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZExpc3RlbmVyKGV2ZW50TmFtZSwgdGhpcy5zY2hlZHVsZWRIaWRlLmJpbmQodGhpcywgbnVsbCwgdGhpcy5oaWRlVGltZW91dCkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVmRWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50YXJnZXRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9zaG93bikge1xyXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZWRTaG93VGltZW91dEN0cmwkLm5leHQoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Nob3duID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcHBlckNvbnRlbnRSZWYpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9wcGVyQ29udGVudFJlZi5pbnN0YW5jZS5oaWRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9wb3BwZXJDb250ZW50LmhpZGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wb3BwZXJPbkhpZGRlbi5lbWl0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMuX2dsb2JhbEV2ZW50TGlzdGVuZXJzQ3RybCQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGhpZGVPbkNsaWNrT3V0c2lkZUhhbmRsZXIoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuaGlkZU9uQ2xpY2tPdXRzaWRlIHx8ICRldmVudC50YXJnZXQgPT09IHRoaXMuX3BvcHBlckNvbnRlbnQuZWxSZWYubmF0aXZlRWxlbWVudCB8fFxyXG4gICAgICAgICAgICB0aGlzLl9wb3BwZXJDb250ZW50LmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoJGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNjaGVkdWxlZEhpZGUoJGV2ZW50LCB0aGlzLmhpZGVUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBoaWRlT25TY3JvbGxIYW5kbGVyKCRldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmhpZGVPblNjcm9sbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2NoZWR1bGVkSGlkZSgkZXZlbnQsIHRoaXMuaGlkZVRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgICAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQgJiYgdGhpcy5fcG9wcGVyQ29udGVudC5jbGVhbigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb250ZW50ID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcHBlckNvbnRlbnQgPSB0aGlzL