ngx-mat-lib
Version:
A bunch of utilities and components to use in your Angular 7+ apps!
418 lines (417 loc) • 43.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
// tslint:disable:member-ordering
import * as tslib_1 from "tslib";
import { Component, ViewEncapsulation, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef, NgZone, ViewChild, Input, Optional, ContentChildren, QueryList, forwardRef, Directive, Inject, Attribute, } from "@angular/core";
import { ANIMATION_MODULE_TYPE } from "@angular/platform-browser/animations";
import { Directionality } from "@angular/cdk/bidi";
import { coerceBooleanProperty } from "@angular/cdk/coercion";
import { ViewportRuler } from "@angular/cdk/overlay";
import { FocusMonitor } from "@angular/cdk/a11y";
import { Platform } from "@angular/cdk/platform";
import { mixinDisableRipple, MAT_RIPPLE_GLOBAL_OPTIONS, RippleRenderer, mixinTabIndex, mixinDisabled, } from "@angular/material/core";
import { XmatInkBarDirective } from "./xmat-ink-bar.directive";
import { XmatPaginatedTabHeaderDirective } from "./xmat-paginated-tab-header";
import { takeUntil, startWith } from "rxjs/operators";
/**
* Base class with all of the `MatTabNav` functionality.
* \@docs-private
* @abstract
*/
var _XmatTabNavBase = /** @class */ (function (_super) {
tslib_1.__extends(_XmatTabNavBase, _super);
function _XmatTabNavBase(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, /**
* @deprecated @breaking-change 9.0.0 `platform` parameter to become required.
*/
platform, animationMode) {
var _this = _super.call(this, elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) || this;
_this._disableRipple = false;
/**
* Theme color of the nav bar.
*/
_this.color = "primary";
return _this;
}
Object.defineProperty(_XmatTabNavBase.prototype, "backgroundColor", {
/** Background color of the tab nav. */
get: /**
* Background color of the tab nav.
* @return {?}
*/
function () {
return this._backgroundColor;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var classList = this._elementRef.nativeElement.classList;
classList.remove("mat-background-" + this.backgroundColor);
if (value) {
classList.add("mat-background-" + value);
}
this._backgroundColor = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(_XmatTabNavBase.prototype, "disableRipple", {
/** Whether the ripple effect is disabled or not. */
get: /**
* Whether the ripple effect is disabled or not.
* @return {?}
*/
function () {
return this._disableRipple;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disableRipple = coerceBooleanProperty(value);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
_XmatTabNavBase.prototype._itemSelected = /**
* @return {?}
*/
function () {
// noop
};
/**
* @return {?}
*/
_XmatTabNavBase.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
// We need this to run before the `changes` subscription in parent to ensure that the
// selectedIndex is up-to-date by the time the super class starts looking for it.
this._items.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(function () {
_this.updateActiveLink();
});
_super.prototype.ngAfterContentInit.call(this);
};
/**
* Notifies the component that the active link has been changed.
* @breaking-change 8.0.0 `element` parameter to be removed.
*/
/**
* Notifies the component that the active link has been changed.
* \@breaking-change 8.0.0 `element` parameter to be removed.
* @param {?=} _element
* @return {?}
*/
_XmatTabNavBase.prototype.updateActiveLink = /**
* Notifies the component that the active link has been changed.
* \@breaking-change 8.0.0 `element` parameter to be removed.
* @param {?=} _element
* @return {?}
*/
function (_element) {
if (!this._items) {
return;
}
/** @type {?} */
var items = this._items.toArray();
for (var i = 0; i < items.length; i++) {
if (items[i].active) {
this.selectedIndex = i;
this._changeDetectorRef.markForCheck();
return;
}
}
// The ink bar should hide itself if no items are active.
this.selectedIndex = -1;
this._inkBar.hide();
};
/** @nocollapse */
_XmatTabNavBase.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Directionality, decorators: [{ type: Optional }] },
{ type: NgZone },
{ type: ChangeDetectorRef },
{ type: ViewportRuler },
{ type: Platform, decorators: [{ type: Optional }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }
]; };
_XmatTabNavBase.propDecorators = {
backgroundColor: [{ type: Input }],
disableRipple: [{ type: Input }],
color: [{ type: Input }]
};
return _XmatTabNavBase;
}(XmatPaginatedTabHeaderDirective));
export { _XmatTabNavBase };
if (false) {
/**
* Query list of all tab links of the tab navigation.
* @type {?}
*/
_XmatTabNavBase.prototype._items;
/** @type {?} */
_XmatTabNavBase.prototype._backgroundColor;
/** @type {?} */
_XmatTabNavBase.prototype._disableRipple;
/**
* Theme color of the nav bar.
* @type {?}
*/
_XmatTabNavBase.prototype.color;
}
var XmatTabNavComponent = /** @class */ (function (_super) {
tslib_1.__extends(XmatTabNavComponent, _super);
function XmatTabNavComponent(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, /**
* @deprecated @breaking-change 9.0.0 `platform` parameter to become required.
*/
platform, animationMode) {
return _super.call(this, elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode) || this;
}
XmatTabNavComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: "[xmat-tab-nav-bar]",
// tslint:disable-next-line:use-input-property-decorator
inputs: ["color", "disableRipple"],
template: "<div class=\"mat-tab-header-pagination mat-tab-header-pagination-before mat-elevation-z4\"\n #previousPaginator\n aria-hidden=\"true\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-tab-header-pagination-chevron\"></div>\n</div>\n\n<div class=\"mat-tab-link-container\" #tabListContainer (keydown)=\"_handleKeydown($event)\">\n <div class=\"mat-tab-list\" #tabList (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-tab-links\">\n <ng-content></ng-content>\n </div>\n <xmat-ink-bar></xmat-ink-bar>\n </div>\n</div>\n\n<div class=\"mat-tab-header-pagination mat-tab-header-pagination-after mat-elevation-z4\"\n #nextPaginator\n aria-hidden=\"true\"\n mat-ripple [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n (mousedown)=\"_handlePaginatorPress('after')\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-tab-header-pagination-chevron\"></div>\n</div>\n",
// host: {"class": "mat-tab-nav-bar"},
host: {
"class": "mat-tab-nav-bar mat-tab-header",
"[class.mat-tab-header-pagination-controls-enabled]": "_showPaginationControls",
"[class.mat-tab-header-rtl]": "_getLayoutDirection() == \"rtl\"",
"[class.mat-primary]": "color !== \"warn\" && color !== \"accent\"",
"[class.mat-accent]": "color === \"accent\"",
"[class.mat-warn]": "color === \"warn\"",
},
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [".mat-tab-header{display:-webkit-box;display:flex;overflow:hidden;position:relative;flex-shrink:0}.mat-tab-header-pagination{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;display:none;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:transparent;touch-action:none}.mat-tab-header-pagination-controls-enabled .mat-tab-header-pagination{display:-webkit-box;display:flex}.mat-tab-header-pagination-before,.mat-tab-header-rtl .mat-tab-header-pagination-after{padding-left:4px}.mat-tab-header-pagination-before .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-after .mat-tab-header-pagination-chevron{-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.mat-tab-header-pagination-after,.mat-tab-header-rtl .mat-tab-header-pagination-before{padding-right:4px}.mat-tab-header-pagination-after .mat-tab-header-pagination-chevron,.mat-tab-header-rtl .mat-tab-header-pagination-before .mat-tab-header-pagination-chevron{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.mat-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;content:'';height:8px;width:8px}.mat-tab-header-pagination-disabled{box-shadow:none;cursor:default}.mat-tab-list{-webkit-box-flex:1;flex-grow:1;position:relative;-webkit-transition:-webkit-transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1);transition:transform .5s cubic-bezier(.35,0,.25,1),-webkit-transform .5s cubic-bezier(.35,0,.25,1)}.mat-tab-links{display:-webkit-box;display:flex}[mat-align-tabs=center] .mat-tab-links{-webkit-box-pack:center;justify-content:center}[mat-align-tabs=end] .mat-tab-links{-webkit-box-pack:end;justify-content:flex-end}.mat-ink-bar{position:absolute;bottom:0;height:2px;-webkit-transition:.5s cubic-bezier(.35,0,.25,1);transition:.5s cubic-bezier(.35,0,.25,1)}._mat-animation-noopable.mat-ink-bar{-webkit-transition:none;transition:none;-webkit-animation:none;animation:none}.mat-tab-group-inverted-header .mat-ink-bar{bottom:auto;top:0}@media (-ms-high-contrast:active){.mat-ink-bar{outline:solid 2px;height:0}}.mat-tab-link-container{display:-webkit-box;display:flex;-webkit-box-flex:1;flex-grow:1;overflow:hidden;z-index:1}.mat-tab-link{height:48px;padding:0 24px;cursor:pointer;box-sizing:border-box;opacity:.6;min-width:160px;text-align:center;display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;white-space:nowrap;vertical-align:top;text-decoration:none;position:relative;overflow:hidden;-webkit-tap-highlight-color:transparent}.mat-tab-link:focus{outline:0}.mat-tab-link:focus:not(.mat-tab-disabled){opacity:1}.mat-tab-link.mat-tab-disabled{cursor:default;pointer-events:none}.mat-tab-link .mat-tab-label-content{display:-webkit-inline-box;display:inline-flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;white-space:nowrap}@media (-ms-high-contrast:active){.mat-tab-link:focus{outline:dotted 2px}.mat-tab-link.mat-tab-disabled{opacity:.5}.mat-tab-link{opacity:1}}[mat-stretch-tabs] .mat-tab-link{flex-basis:0;-webkit-box-flex:1;flex-grow:1}@media (max-width:599px){.mat-tab-link{min-width:72px}}"]
}] }
];
/** @nocollapse */
XmatTabNavComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: Directionality, decorators: [{ type: Optional }] },
{ type: NgZone },
{ type: ChangeDetectorRef },
{ type: ViewportRuler },
{ type: Platform, decorators: [{ type: Optional }] },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }
]; };
XmatTabNavComponent.propDecorators = {
_items: [{ type: ContentChildren, args: [forwardRef(function () { return XmatTabLinkDirective; }), { descendants: true },] }],
_inkBar: [{ type: ViewChild, args: [XmatInkBarDirective,] }],
_tabListContainer: [{ type: ViewChild, args: ["tabListContainer",] }],
_tabList: [{ type: ViewChild, args: ["tabList",] }],
_nextPaginator: [{ type: ViewChild, args: ["nextPaginator",] }],
_previousPaginator: [{ type: ViewChild, args: ["previousPaginator",] }]
};
return XmatTabNavComponent;
}(_XmatTabNavBase));
export { XmatTabNavComponent };
if (false) {
/** @type {?} */
XmatTabNavComponent.prototype._items;
/** @type {?} */
XmatTabNavComponent.prototype._inkBar;
/** @type {?} */
XmatTabNavComponent.prototype._tabListContainer;
/** @type {?} */
XmatTabNavComponent.prototype._tabList;
/** @type {?} */
XmatTabNavComponent.prototype._nextPaginator;
/** @type {?} */
XmatTabNavComponent.prototype._previousPaginator;
}
var XmatTabLinkMixinBase = /** @class */ (function () {
function XmatTabLinkMixinBase() {
}
return XmatTabLinkMixinBase;
}());
/** @type {?} */
var _XmatTabLinkMixinBase = mixinTabIndex(mixinDisableRipple(mixinDisabled(XmatTabLinkMixinBase)));
/**
* Base class with all of the `MatTabLink` functionality.
*/
var _XmatTabLinkBase = /** @class */ (function (_super) {
tslib_1.__extends(_XmatTabLinkBase, _super);
function _XmatTabLinkBase(_tabNavBar, elementRef, globalRippleOptions, tabIndex, _focusMonitor, animationMode) {
var _this = _super.call(this) || this;
_this._tabNavBar = _tabNavBar;
_this.elementRef = elementRef;
_this._focusMonitor = _focusMonitor;
/**
* Whether the tab link is active or not.
*/
_this._isActive = false;
_this.rippleConfig = globalRippleOptions || {};
// tslint:disable-next-line:radix
_this.tabIndex = parseInt(tabIndex) || 0;
if (animationMode === "NoopAnimations") {
_this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };
}
_focusMonitor.monitor(elementRef);
return _this;
}
Object.defineProperty(_XmatTabLinkBase.prototype, "active", {
/** Whether the link is active. */
get: /**
* Whether the link is active.
* @return {?}
*/
function () {
return this._isActive;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this._isActive) {
this._isActive = value;
this._tabNavBar.updateActiveLink(this.elementRef);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(_XmatTabLinkBase.prototype, "rippleDisabled", {
/**
* Whether ripples are disabled on interaction.
* @docs-private
*/
get: /**
* Whether ripples are disabled on interaction.
* \@docs-private
* @return {?}
*/
function () {
return this.disabled || this.disableRipple || this._tabNavBar.disableRipple ||
!!this.rippleConfig.disabled;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
_XmatTabLinkBase.prototype.focus = /**
* @return {?}
*/
function () {
this.elementRef.nativeElement.focus();
};
/**
* @return {?}
*/
_XmatTabLinkBase.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this._focusMonitor.stopMonitoring(this.elementRef);
};
/** @nocollapse */
_XmatTabLinkBase.ctorParameters = function () { return [
{ type: _XmatTabNavBase },
{ type: ElementRef },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] },
{ type: String, decorators: [{ type: Attribute, args: ["tabindex",] }] },
{ type: FocusMonitor },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }
]; };
_XmatTabLinkBase.propDecorators = {
active: [{ type: Input }]
};
return _XmatTabLinkBase;
}(_XmatTabLinkMixinBase));
export { _XmatTabLinkBase };
if (false) {
/**
* Whether the tab link is active or not.
* @type {?}
*/
_XmatTabLinkBase.prototype._isActive;
/**
* Ripple configuration for ripples that are launched on pointer down. The ripple config
* is set to the global ripple options since we don't have any configurable options for
* the tab link ripples.
* \@docs-private
* @type {?}
*/
_XmatTabLinkBase.prototype.rippleConfig;
/** @type {?} */
_XmatTabLinkBase.prototype._tabNavBar;
/** @type {?} */
_XmatTabLinkBase.prototype.elementRef;
/** @type {?} */
_XmatTabLinkBase.prototype._focusMonitor;
}
/**
* Link inside of a `mat-tab-nav-bar`.
*/
var XmatTabLinkDirective = /** @class */ (function (_super) {
tslib_1.__extends(XmatTabLinkDirective, _super);
function XmatTabLinkDirective(tabNavBar, elementRef, ngZone, platform, globalRippleOptions, tabIndex, focusMonitor, animationMode) {
var _this = _super.call(this, tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode) || this;
_this._tabLinkRipple = new RippleRenderer(_this, ngZone, elementRef, platform);
_this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement);
return _this;
}
/**
* @return {?}
*/
XmatTabLinkDirective.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
_super.prototype.ngOnDestroy.call(this);
this._tabLinkRipple._removeTriggerEvents();
};
XmatTabLinkDirective.decorators = [
{ type: Directive, args: [{
selector: "[xmat-tab-link], [xmatTabLink]",
exportAs: "xmatTabLink",
// tslint:disable-next-line:use-input-property-decorator
inputs: ["disabled", "disableRipple", "tabIndex"],
host: {
"class": "mat-tab-link",
"[attr.aria-current]": "active ? \"page\" : null",
"[attr.aria-disabled]": "disabled",
"[attr.tabIndex]": "tabIndex",
"[class.mat-tab-disabled]": "disabled",
"[class.mat-tab-label-active]": "active",
}
},] }
];
/** @nocollapse */
XmatTabLinkDirective.ctorParameters = function () { return [
{ type: XmatTabNavComponent },
{ type: ElementRef },
{ type: NgZone },
{ type: Platform },
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [MAT_RIPPLE_GLOBAL_OPTIONS,] }] },
{ type: String, decorators: [{ type: Attribute, args: ["tabindex",] }] },
{ type: FocusMonitor },
{ type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] }
]; };
return XmatTabLinkDirective;
}(_XmatTabLinkBase));
export { XmatTabLinkDirective };
if (false) {
/**
* Reference to the RippleRenderer for the tab-link.
* @type {?}
*/
XmatTabLinkDirective.prototype._tabLinkRipple;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieG1hdC1uYXYtYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tYXQtbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMveG1hdC1uYXYtYmFyL3htYXQtbmF2LWJhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUEsT0FBTyxFQUNILFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsUUFBUSxFQUdSLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUVWLFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBa0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUtILGtCQUFrQixFQUtsQix5QkFBeUIsRUFFekIsY0FBYyxFQUNkLGFBQWEsRUFFYixhQUFhLEdBRWhCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFDLCtCQUErQixFQUE2QixNQUFNLDZCQUE2QixDQUFDO0FBRXhHLE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7SUFPTiwyQ0FBK0I7SUF3Q3pFLHlCQUFZLFVBQXNC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QztvQkFDUCxRQUFRLEVBQUUsZ0NBQWdDO29CQUMxQyxRQUFRLEVBQUUsYUFBYTs7b0JBRXZCLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDO29CQUNqRCxJQUFJLEVBQUU7d0JBQ0YsT0FBTyxFQUFFLGNBQWM7d0JBQ3ZCLHFCQUFxQixFQUFFLDBCQUEwQjt3QkFDakQsc0JBQXNCLEVBQUUsVUFBVTt3QkFDbEMsaUJBQWlCLEVBQUUsVUFBVTt3QkFDN0IsMEJBQTBCLEVBQUUsVUFBVTt3QkFDdEMsOEJBQThCLEVBQUUsUUFBUTtxQkFDM0M7aUJBQ0o7Ozs7Z0JBTWtCLG1CQUFtQjtnQkExUmxDLFVBQVU7Z0JBQ1YsTUFBTTtnQkFtQkYsUUFBUTtnREF3UVAsUUFBUSxZQUFJLE1BQU0sU0FBQyx5QkFBeUI7NkNBQzVDLFNBQVMsU0FBQyxVQUFVO2dCQTFRckIsWUFBWTs2Q0EyUVgsUUFBUSxZQUFJLE1BQU0sU0FBQyxxQkFBcUI7OytCQXJTakQ7RUE0UjBDLGdCQUFnQjtTQUE3QyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTptZW1iZXItb3JkZXJpbmdcblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBOZ1pvbmUsXG4gICAgVmlld0NoaWxkLFxuICAgIElucHV0LFxuICAgIE9wdGlvbmFsLFxuICAgIE9uRGVzdHJveSxcbiAgICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBRdWVyeUxpc3QsXG4gICAgZm9yd2FyZFJlZixcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBJbmplY3QsXG4gICAgQXR0cmlidXRlLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtBTklNQVRJT05fTU9EVUxFX1RZUEV9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnNcIjtcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gXCJAYW5ndWxhci9jZGsvYmlkaVwiO1xuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gXCJAYW5ndWxhci9jZGsvY29lcmNpb25cIjtcbmltcG9ydCB7Vmlld3BvcnRSdWxlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9vdmVybGF5XCI7XG5pbXBvcnQge0ZvY3VzTW9uaXRvciwgRm9jdXNhYmxlT3B0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2ExMXlcIjtcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gXCJAYW5ndWxhci9jZGsvcGxhdGZvcm1cIjtcbmltcG9ydCB7XG4gICAgVGhlbWVQYWxldHRlLFxuICAgIENhbkNvbG9yLFxuICAgIENhbkRpc2FibGVSaXBwbGUsXG4gICAgQ2FuRGlzYWJsZVJpcHBsZUN0b3IsXG4gICAgbWl4aW5EaXNhYmxlUmlwcGxlLFxuICAgIFJpcHBsZVRhcmdldCxcbiAgICBDYW5EaXNhYmxlLFxuICAgIEhhc1RhYkluZGV4LFxuICAgIFJpcHBsZUdsb2JhbE9wdGlvbnMsXG4gICAgTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUyxcbiAgICBSaXBwbGVDb25maWcsXG4gICAgUmlwcGxlUmVuZGVyZXIsXG4gICAgbWl4aW5UYWJJbmRleCxcbiAgICBDYW5EaXNhYmxlQ3RvcixcbiAgICBtaXhpbkRpc2FibGVkLFxuICAgIEhhc1RhYkluZGV4Q3Rvcixcbn0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcbi8vXG5pbXBvcnQge1htYXRJbmtCYXJEaXJlY3RpdmV9IGZyb20gXCIuL3htYXQtaW5rLWJhci5kaXJlY3RpdmVcIjtcbmltcG9ydCB7WG1hdFBhZ2luYXRlZFRhYkhlYWRlckRpcmVjdGl2ZSwgWG1hdFBhZ2luYXRlZFRhYkhlYWRlckl0ZW19IGZyb20gXCIuL3htYXQtcGFnaW5hdGVkLXRhYi1oZWFkZXJcIjtcbi8vXG5pbXBvcnQge3Rha2VVbnRpbCwgc3RhcnRXaXRofSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuLyoqXG4gKiBCYXNlIGNsYXNzIHdpdGggYWxsIG9mIHRoZSBgTWF0VGFiTmF2YCBmdW5jdGlvbmFsaXR5LlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bmFtaW5nLWNvbnZlbnRpb24gY2xhc3MtbmFtZVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIF9YbWF0VGFiTmF2QmFzZSBleHRlbmRzIFhtYXRQYWdpbmF0ZWRUYWJIZWFkZXJEaXJlY3RpdmVcbiAgICBpbXBsZW1lbnRzIEFmdGVyQ29udGVudENoZWNrZWQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgICAvKiogUXVlcnkgbGlzdCBvZiBhbGwgdGFiIGxpbmtzIG9mIHRoZSB0YWIgbmF2aWdhdGlvbi4gKi9cbiAgICBhYnN0cmFjdCBfaXRlbXM6IFF1ZXJ5TGlzdDxYbWF0UGFnaW5hdGVkVGFiSGVhZGVySXRlbSAmIHsgYWN0aXZlOiBib29sZWFuIH0+O1xuXG4gICAgLyoqIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRhYiBuYXYuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgYmFja2dyb3VuZENvbG9yKCk6IFRoZW1lUGFsZXR0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgc2V0IGJhY2tncm91bmRDb2xvcih2YWx1ZTogVGhlbWVQYWxldHRlKSB7XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoYG1hdC1iYWNrZ3JvdW5kLSR7dGhpcy5iYWNrZ3JvdW5kQ29sb3J9YCk7XG5cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGBtYXQtYmFja2dyb3VuZC0ke3ZhbHVlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOiBUaGVtZVBhbGV0dGU7XG5cbiAgICAvKiogV2hldGhlciB0aGUgcmlwcGxlIGVmZmVjdCBpcyBkaXNhYmxlZCBvciBub3QuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGU7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVSaXBwbGUodmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlUmlwcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlUmlwcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogVGhlbWUgY29sb3Igb2YgdGhlIG5hdiBiYXIuICovXG4gICAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZSA9IFwicHJpbWFyeVwiO1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBkaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHBsYXRmb3JtPzogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9pdGVtU2VsZWN0ZWQoKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBydW4gYmVmb3JlIHRoZSBgY2hhbmdlc2Agc3Vic2NyaXB0aW9uIGluIHBhcmVudCB0byBlbnN1cmUgdGhhdCB0aGVcbiAgICAgICAgLy8gc2VsZWN0ZWRJbmRleCBpcyB1cC10by1kYXRlIGJ5IHRoZSB0aW1lIHRoZSBzdXBlciBjbGFzcyBzdGFydHMgbG9va2luZyBmb3IgaXQuXG4gICAgICAgIHRoaXMuX2l0ZW1zLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVMaW5rKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vdGlmaWVzIHRoZSBjb21wb25lbnQgdGhhdCB0aGUgYWN0aXZlIGxpbmsgaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDguMC4wIGBlbGVtZW50YCBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICB1cGRhdGVBY3RpdmVMaW5rKF9lbGVtZW50PzogRWxlbWVudFJlZikge1xuICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaXRlbXNbaV0uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5rIGJhciBzaG91bGQgaGlkZSBpdHNlbGYgaWYgbm8gaXRlbXMgYXJlIGFjdGl2ZS5cbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gLTE7XG4gICAgICAgIHRoaXMuX2lua0Jhci5oaWRlKCk7XG4gICAgfVxufVxuXG5cbkBDb21wb25lbnQoe1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogXCJbeG1hdC10YWItbmF2LWJhcl1cIixcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dXNlLWlucHV0LXByb3BlcnR5LWRlY29yYXRvclxuICAgIGlucHV0czogW1wiY29sb3JcIiwgXCJkaXNhYmxlUmlwcGxlXCJdLFxuICAgIHRlbXBsYXRlVXJsOiBcInhtYXQtbmF2LWJhci5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wieG1hdC1uYXYtYmFyLmNvbXBvbmVudC5zY3NzXCJdLFxuICAgIC8vIGhvc3Q6IHtcImNsYXNzXCI6IFwibWF0LXRhYi1uYXYtYmFyXCJ9LFxuICAgIGhvc3Q6IHtcbiAgICAgICAgXCJjbGFzc1wiOiBcIm1hdC10YWItbmF2LWJhciBtYXQtdGFiLWhlYWRlclwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNvbnRyb2xzLWVuYWJsZWRdXCI6IFwiX3Nob3dQYWdpbmF0aW9uQ29udHJvbHNcIixcbiAgICAgICAgXCJbY2xhc3MubWF0LXRhYi1oZWFkZXItcnRsXVwiOiBcIl9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSBcXFwicnRsXFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtcHJpbWFyeV1cIjogXCJjb2xvciAhPT0gXFxcIndhcm5cXFwiICYmIGNvbG9yICE9PSBcXFwiYWNjZW50XFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtYWNjZW50XVwiOiBcImNvbG9yID09PSBcXFwiYWNjZW50XFxcIlwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtd2Fybl1cIjogXCJjb2xvciA9PT0gXFxcIndhcm5cXFwiXCIsXG4gICAgfSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBYbWF0VGFiTmF2Q29tcG9uZW50IGV4dGVuZHMgX1htYXRUYWJOYXZCYXNlXG4gICAgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkLCBBZnRlckNvbnRlbnRJbml0LCBDYW5Db2xvciwgQ2FuRGlzYWJsZVJpcHBsZSwgT25EZXN0cm95IHtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBYbWF0VGFiTGlua0RpcmVjdGl2ZSksIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9pdGVtczogUXVlcnlMaXN0PFhtYXRUYWJMaW5rRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKFhtYXRJbmtCYXJEaXJlY3RpdmUpIF9pbmtCYXI6IFhtYXRJbmtCYXJEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZChcInRhYkxpc3RDb250YWluZXJcIikgX3RhYkxpc3RDb250YWluZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcInRhYkxpc3RcIikgX3RhYkxpc3Q6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZChcIm5leHRQYWdpbmF0b3JcIikgX25leHRQYWdpbmF0b3I6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoXCJwcmV2aW91c1BhZ2luYXRvclwiKSBfcHJldmlvdXNQYWdpbmF0b3I6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBkaXI6IERpcmVjdGlvbmFsaXR5LFxuICAgICAgICAgICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHBsYXRmb3JtPzogUGxhdGZvcm0sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgZGlyLCBuZ1pvbmUsIGNoYW5nZURldGVjdG9yUmVmLCB2aWV3cG9ydFJ1bGVyLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7XG4gICAgfVxufVxuXG5cbi8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0VGFiTGluay5cbmNsYXNzIFhtYXRUYWJMaW5rTWl4aW5CYXNlIHtcbn1cblxuY29uc3QgX1htYXRUYWJMaW5rTWl4aW5CYXNlOlxuICAgIEhhc1RhYkluZGV4Q3RvciAmIENhbkRpc2FibGVSaXBwbGVDdG9yICYgQ2FuRGlzYWJsZUN0b3IgJiB0eXBlb2YgWG1hdFRhYkxpbmtNaXhpbkJhc2UgPVxuICAgIG1peGluVGFiSW5kZXgobWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoWG1hdFRhYkxpbmtNaXhpbkJhc2UpKSk7XG5cbi8qKiBCYXNlIGNsYXNzIHdpdGggYWxsIG9mIHRoZSBgTWF0VGFiTGlua2AgZnVuY3Rpb25hbGl0eS4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lIG5hbWluZy1jb252ZW50aW9uXG5leHBvcnQgY2xhc3MgX1htYXRUYWJMaW5rQmFzZSBleHRlbmRzIF9YbWF0VGFiTGlua01peGluQmFzZSBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ2FuRGlzYWJsZSxcbiAgICBDYW5EaXNhYmxlUmlwcGxlLCBIYXNUYWJJbmRleCwgUmlwcGxlVGFyZ2V0LCBGb2N1c2FibGVPcHRpb24ge1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIHRhYiBsaW5rIGlzIGFjdGl2ZSBvciBub3QuICovXG4gICAgcHJvdGVjdGVkIF9pc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxpbmsgaXMgYWN0aXZlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICAgIH1cblxuICAgIHNldCBhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuX3RhYk5hdkJhci51cGRhdGVBY3RpdmVMaW5rKHRoaXMuZWxlbWVudFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSaXBwbGUgY29uZmlndXJhdGlvbiBmb3IgcmlwcGxlcyB0aGF0IGFyZSBsYXVuY2hlZCBvbiBwb2ludGVyIGRvd24uIFRoZSByaXBwbGUgY29uZmlnXG4gICAgICogaXMgc2V0IHRvIHRoZSBnbG9iYWwgcmlwcGxlIG9wdGlvbnMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgY29uZmlndXJhYmxlIG9wdGlvbnMgZm9yXG4gICAgICogdGhlIHRhYiBsaW5rIHJpcHBsZXMuXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHJpcHBsZUNvbmZpZzogUmlwcGxlQ29uZmlnICYgUmlwcGxlR2xvYmFsT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgcmlwcGxlcyBhcmUgZGlzYWJsZWQgb24gaW50ZXJhY3Rpb24uXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIGdldCByaXBwbGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmlwcGxlIHx8IHRoaXMuX3RhYk5hdkJhci5kaXNhYmxlUmlwcGxlIHx8XG4gICAgICAgICAgICAhIXRoaXMucmlwcGxlQ29uZmlnLmRpc2FibGVkO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIF90YWJOYXZCYXI6IF9YbWF0VGFiTmF2QmFzZSwgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUykgZ2xvYmFsUmlwcGxlT3B0aW9uczogUmlwcGxlR2xvYmFsT3B0aW9ucyB8IG51bGwsXG4gICAgICAgIEBBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB0YWJJbmRleDogc3RyaW5nLCBwcml2YXRlIF9mb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUpIGFuaW1hdGlvbk1vZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJpcHBsZUNvbmZpZyA9IGdsb2JhbFJpcHBsZU9wdGlvbnMgfHwge307XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyYWRpeFxuICAgICAgICB0aGlzLnRhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgpIHx8IDA7XG5cbiAgICAgICAgaWYgKGFuaW1hdGlvbk1vZGUgPT09IFwiTm9vcEFuaW1hdGlvbnNcIikge1xuICAgICAgICAgICAgdGhpcy5yaXBwbGVDb25maWcuYW5pbWF0aW9uID0ge2VudGVyRHVyYXRpb246IDAsIGV4aXREdXJhdGlvbjogMH07XG4gICAgICAgIH1cblxuICAgICAgICBfZm9jdXNNb25pdG9yLm1vbml0b3IoZWxlbWVudFJlZik7XG4gICAgfVxuXG4gICAgZm9jdXMoKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLmVsZW1lbnRSZWYpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMaW5rIGluc2lkZSBvZiBhIGBtYXQtdGFiLW5hdi1iYXJgLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbeG1hdC10YWItbGlua10sIFt4bWF0VGFiTGlua11cIixcbiAgICBleHBvcnRBczogXCJ4bWF0VGFiTGlua1wiLFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1c2UtaW5wdXQtcHJvcGVydHktZGVjb3JhdG9yXG4gICAgaW5wdXRzOiBbXCJkaXNhYmxlZFwiLCBcImRpc2FibGVSaXBwbGVcIiwgXCJ0YWJJbmRleFwiXSxcbiAgICBob3N0OiB7XG4gICAgICAgIFwiY2xhc3NcIjogXCJtYXQtdGFiLWxpbmtcIixcbiAgICAgICAgXCJbYXR0ci5hcmlhLWN1cnJlbnRdXCI6IFwiYWN0aXZlID8gXFxcInBhZ2VcXFwiIDogbnVsbFwiLFxuICAgICAgICBcIlthdHRyLmFyaWEtZGlzYWJsZWRdXCI6IFwiZGlzYWJsZWRcIixcbiAgICAgICAgXCJbYXR0ci50YWJJbmRleF1cIjogXCJ0YWJJbmRleFwiLFxuICAgICAgICBcIltjbGFzcy5tYXQtdGFiLWRpc2FibGVkXVwiOiBcImRpc2FibGVkXCIsXG4gICAgICAgIFwiW2NsYXNzLm1hdC10YWItbGFiZWwtYWN0aXZlXVwiOiBcImFjdGl2ZVwiLFxuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgWG1hdFRhYkxpbmtEaXJlY3RpdmUgZXh0ZW5kcyBfWG1hdFRhYkxpbmtCYXNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgICAvKiogUmVmZXJlbmNlIHRvIHRoZSBSaXBwbGVSZW5kZXJlciBmb3IgdGhlIHRhYi1saW5rLiAqL1xuICAgIHByaXZhdGUgX3RhYkxpbmtSaXBwbGU6IFJpcHBsZVJlbmRlcmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRhYk5hdkJhcjogWG1hdFRhYk5hdkNvbXBvbmVudCwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TKSBnbG9iYWxSaXBwbGVPcHRpb25zOiBSaXBwbGVHbG9iYWxPcHRpb25zIHwgbnVsbCxcbiAgICAgICAgQEF0dHJpYnV0ZShcInRhYmluZGV4XCIpIHRhYkluZGV4OiBzdHJpbmcsIGZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSkgYW5pbWF0aW9uTW9kZT86IHN0cmluZykge1xuICAgICAgICBzdXBlcih0YWJOYXZCYXIsIGVsZW1lbnRSZWYsIGdsb2JhbFJpcHBsZU9wdGlvbnMsIHRhYkluZGV4LCBmb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlID0gbmV3IFJpcHBsZVJlbmRlcmVyKHRoaXMsIG5nWm9uZSwgZWxlbWVudFJlZiwgcGxhdGZvcm0pO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlLnNldHVwVHJpZ2dlckV2ZW50cyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgICAgICB0aGlzLl90YWJMaW5rUmlwcGxlLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCk7XG4gICAgfVxufVxuIl19