UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

526 lines 42.1 kB
/** * @fileoverview added by tsickle * Generated from: popper/popper.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, Renderer2, ViewChild, } from '@angular/core'; import Popper from 'popper.js'; var PopperComponent = /** @class */ (function () { function PopperComponent(el, renderer, ngZone, changeDetectorRef) { var _this = this; this.el = el; this.renderer = renderer; this.ngZone = ngZone; this.changeDetectorRef = changeDetectorRef; this.fluidPopper = true; this.appendTo = 'body'; this.popper = null; this._isOpen = false; this.directionAnimationTransformOrigin = { 'top': '0 100%', 'bottom': '0 0' }; this.openChange = new EventEmitter(); this.onDocumentClick = (/** * @param {?} $event * @return {?} */ function ($event) { if (!!_this.appendTo && _this.popperContainer.nativeElement !== $event.target && !_this.popperContainer.nativeElement.contains($event.target)) { _this.open = false; } else if (!_this.appendTo && _this.open && !_this.el.nativeElement.contains($event.target)) { _this.open = false; } }); this.blockEvent = (/** * @param {?} $event * @return {?} */ function ($event) { $event.preventDefault(); $event.stopPropagation(); }); } Object.defineProperty(PopperComponent.prototype, "open", { get: /** * @return {?} */ function () { return this._isOpen; }, set: /** * @param {?} value * @return {?} */ function (value) { var _this = this; if (this._isOpen === value) { return; } this.animate = true; if (!!value) { this.show(); } else { this.close(); } this._isOpen = value; PopperComponent.nextTick((/** * @return {?} */ function () { _this.openChange.emit(value); _this.setBlurListener(); })); }, enumerable: true, configurable: true }); /** * @param {?} fn * @return {?} */ PopperComponent.nextTick = /** * @param {?} fn * @return {?} */ function (fn) { var _this = this; // Force to run fn after current data changed. setTimeout((/** * @return {?} */ function () { return fn.bind(_this)(); })); }; /** * @return {?} */ PopperComponent.prototype.show = /** * @return {?} */ function () { var e_1, _a; // Append to selector or original parent. if (!!this.appendTo) { if (this.fluidPopper) { /** @type {?} */ var popperWidth = this.popperActivator.nativeElement && this.popperActivator.nativeElement.offsetWidth; /** @type {?} */ var firstEle = this.popperContainer.nativeElement.firstElementChild; if (firstEle.classList.contains('devui-search-container')) { try { for (var _b = tslib_1.__values(this.popperContainer.nativeElement.children), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; child.style.width = popperWidth + "px"; } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } else { firstEle.style.width = popperWidth + "px"; } } this.attachPopperContainerToSelector(this.appendTo); } else { this.attachPopperContainerToNode(this.popperParent); } this.popper = this.createPopper(); this.renderer.setStyle(this.popperContainer.nativeElement, 'display', 'block'); }; /** * @private * @return {?} */ PopperComponent.prototype.close = /** * @private * @return {?} */ function () { /** @type {?} */ var popperContainer = this.popperContainer.nativeElement; this.setTransition('close'); // For IE 11/Edge if (popperContainer.style.transform.match(/scale3d\(1, 1, 1\)/)) { // Replace transform open state with close state this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform.replace('scale3d(1, 1, 1)', 'scale3d(1, 0, 1)')); } else { // perspective(1px) solves pixel shift caused by webkit transform this.renderer.setStyle(popperContainer, 'transform', popperContainer.style.transform + " scale3d(1, 0, 1) perspective(1px)"); } // Set container to transparent this.renderer.setStyle(popperContainer, 'opacity', 0); // Can't use bind(this) since it calls itself /** @type {?} */ var that = this; /** @type {?} */ var handler = (/** * @param {?} e * @return {?} */ function (e) { if (!that.open && that.popper) { // Set final state of container to invisible that.renderer.setStyle(popperContainer, 'display', 'none'); that.animate = false; // Remove transition that.setTransition(); that.popper.destroy(); that.popper = null; that.detachPopperContainer(); } e.currentTarget.removeEventListener(e.type, handler); }); this.popperContainer.nativeElement.addEventListener('transitionend', handler); }; /** * @return {?} */ PopperComponent.prototype.setBlurListener = /** * @return {?} */ function () { var _this = this; this.ngZone.runOutsideAngular((/** * @return {?} */ function () { if (_this.open) { document.addEventListener('click', _this.onDocumentClick); _this.popperContainer.nativeElement.addEventListener('click', _this.blockEvent); } else { document.removeEventListener('click', _this.onDocumentClick); _this.popperContainer.nativeElement.removeEventListener('click', _this.blockEvent); } })); }; /** * @private * @param {?} data * @return {?} */ PopperComponent.prototype.applyTransitionStyle = /** * @private * @param {?} data * @return {?} */ function (data) { var _this = this; /** @type {?} */ var optionsContainer = this.popperContainer.nativeElement; this.updateContainerTransitionDirection(data.flipped); if (this.animate) { // perspective(1px) solves pixel shift caused by webkit transform this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform + " scale3d(1, 0, 1) perspective(1px)"); // Set container init state to transparent as beginning of the transition. this.renderer.setStyle(optionsContainer, 'opacity', 0); PopperComponent.nextTick((/** * @return {?} */ function () { _this.setTransition('open'); /** @type {?} */ var that = _this; /** @type {?} */ var handler = (/** * @param {?} e * @return {?} */ function (e) { // remove transition that.setTransition(); e.currentTarget.removeEventListener(e.type, handler); }); optionsContainer.addEventListener('transitionend', handler); _this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform.replace('scale3d(1, 0, 1)', 'scale3d(1, 1, 1)')); _this.renderer.setStyle(optionsContainer, 'opacity', 1); _this.animate = false; })); } else { // handle popper re-rendering, incoming transform doesn't have scale info this.renderer.setStyle(optionsContainer, 'transform', optionsContainer.style.transform + (this.open ? ' scale3d(1, 1, 1)' : ' scale3d(1, 0, 1)') + ' perspective(1px)'); } }; /** * @private * @param {?} flipped * @return {?} */ PopperComponent.prototype.updateContainerTransitionDirection = /** * @private * @param {?} flipped * @return {?} */ function (flipped) { /** @type {?} */ var direction = flipped ? 'top' : 'bottom'; if (this.popperDirection !== direction) { this.popperDirection = direction; this.setTransitionOrigin(); } }; /** * @private * @return {?} */ PopperComponent.prototype.setTransitionOrigin = /** * @private * @return {?} */ function () { if (this.popperContainer.nativeElement) { this.renderer.setStyle(this.popperContainer.nativeElement, 'transform-origin', this.directionAnimationTransformOrigin[this.popperDirection]); } }; /** * @private * @return {?} */ PopperComponent.prototype.createPopper = /** * @private * @return {?} */ function () { return new Popper(this.popperActivator.nativeElement, this.popperContainer.nativeElement, (/** @type {?} */ ({ placement: 'bottom-start', modifiers: { preventOverflow: { // Do not stick to the window edge escapeWithReference: true, }, applyReactStyle: { enabled: true, // Apply extra transition and transform to popper fn: this.applyTransitionStyle.bind(this), }, offset: { // Set vertical offset 5px offset: '0, 5px' } }, positionFixed: !!this.appendTo }))); }; /** * @private * @param {?=} command * @return {?} */ PopperComponent.prototype.setTransition = /** * @private * @param {?=} command * @return {?} */ function (command) { if (command === void 0) { command = null; } /** @type {?} */ var popperContainer = this.popperContainer.nativeElement; if (this.animate && command) { if (command === 'open') { this.renderer.setStyle(popperContainer, 'transition', 'transform .2s cubic-bezier(0.23, 1, 0.32, 1)'); } else if (command === 'close') { popperContainer.style.transition = 'all .15s cubic-bezier(0.755, 0.05, 0.855, 0.06)'; } } else { this.renderer.setStyle(popperContainer, 'transition', null); } }; /** * @return {?} */ PopperComponent.prototype.update = /** * @return {?} */ function () { var _this = this; PopperComponent.nextTick((/** * @return {?} */ function () { if (_this.popper) { _this.popper.update(); } })); }; /** * @return {?} */ PopperComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { // Close popper this.open = false; }; /** * @private * @return {?} */ PopperComponent.prototype.detachPopperContainer = /** * @private * @return {?} */ function () { // Cache popper's parent and popper node. this.popperParent = this.popperContainer.nativeElement.parentNode; this.popperNode = this.popperContainer.nativeElement; if (this.popperParent && this.popperNode) { this.popperParent.removeChild(this.popperNode); } }; /** * @private * @param {?} nodeParent * @return {?} */ PopperComponent.prototype.attachPopperContainerToNode = /** * @private * @param {?} nodeParent * @return {?} */ function (nodeParent) { if (nodeParent && this.popperNode) { this.popperParent = nodeParent; this.popperParent.appendChild(this.popperNode); } }; /** * @private * @param {?} targetSelector * @return {?} */ PopperComponent.prototype.attachPopperContainerToSelector = /** * @private * @param {?} targetSelector * @return {?} */ function (targetSelector) { /** @type {?} */ var nodeParent = document.querySelector(targetSelector); this.attachPopperContainerToNode(nodeParent); }; /** * @return {?} */ PopperComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { // Detach popper container once view initialized. this.detachPopperContainer(); }; PopperComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'popper-component', template: "<div class=\"popper\">\r\n <div class=\"popper-activator\" #popperActivator>\r\n <ng-content select=\"[popper-activator]\"></ng-content>\r\n </div>\r\n <div class=\"popper-container\" #popperContainer [ngClass]=\"{ fluid: fluidPopper && !appendTo }\">\r\n <ng-content select=\"[popper-prepend]\"></ng-content>\r\n <div class=\"popper-container-scrollable devui-scrollbar\">\r\n <ng-content select=\"[popper-container]\"></ng-content>\r\n </div>\r\n <ng-content select=\"[popper-append]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: [".popper{position:relative;width:100%}.popper .popper-activator{width:100%}.popper-container{display:none;z-index:1051;position:absolute;box-shadow:0 4px 8px 0 rgba(41,48,64,.2);background:#fff;border:none;backface-visibility:hidden;-webkit-backface-visibility:hidden}.popper-container .popper-container-scrollable{max-height:300px;min-height:40px;width:100%;overflow-y:auto;overflow-x:auto}.popper-container.fluid{width:100%}:host{display:block}"] }] } ]; /** @nocollapse */ PopperComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 }, { type: NgZone }, { type: ChangeDetectorRef } ]; }; PopperComponent.propDecorators = { open: [{ type: Input }], fluidPopper: [{ type: Input }], appendTo: [{ type: Input }], openChange: [{ type: Output }], popperActivator: [{ type: ViewChild, args: ['popperActivator', { static: true },] }], popperContainer: [{ type: ViewChild, args: ['popperContainer', { static: true },] }] }; return PopperComponent; }()); export { PopperComponent }; if (false) { /** @type {?} */ PopperComponent.prototype.fluidPopper; /** @type {?} */ PopperComponent.prototype.appendTo; /** * @type {?} * @protected */ PopperComponent.prototype.popper; /** * @type {?} * @protected */ PopperComponent.prototype._isOpen; /** * @type {?} * @protected */ PopperComponent.prototype.animate; /** * @type {?} * @protected */ PopperComponent.prototype.popperDirection; /** * @type {?} * @protected */ PopperComponent.prototype.directionAnimationTransformOrigin; /** * @type {?} * @protected */ PopperComponent.prototype.popperNode; /** * @type {?} * @protected */ PopperComponent.prototype.popperParent; /** @type {?} */ PopperComponent.prototype.openChange; /** @type {?} */ PopperComponent.prototype.popperActivator; /** @type {?} */ PopperComponent.prototype.popperContainer; /** @type {?} */ PopperComponent.prototype.onDocumentClick; /** * @type {?} * @private */ PopperComponent.prototype.blockEvent; /** * @type {?} * @protected */ PopperComponent.prototype.el; /** * @type {?} * @protected */ PopperComponent.prototype.renderer; /** * @type {?} * @protected */ PopperComponent.prototype.ngZone; /** * @type {?} * @protected */ PopperComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3V0aWxzLyIsInNvdXJjZXMiOlsicG9wcGVyL3BvcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEVBQ1QsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sTUFBdUIsTUFBTSxXQUFXLENBQUM7QUFFaEQ7SUE2REUseUJBQXNCLEVBQWMsRUFBWSxRQUFtQixFQUFZLE1BQWMsRUFDdkUsaUJBQW9DO1FBRDFELGlCQUVDO1FBRnFCLE9BQUUsR0FBRixFQUFFLENBQVk7UUFBWSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUN2RSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBbkNqRCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixhQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ2pCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFDdEIsWUFBTyxHQUFRLEtBQUssQ0FBQztRQUdyQixzQ0FBaUMsR0FBRztZQUM1QyxLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUM7UUFJUSxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVExQyxvQkFBZTs7OztRQUFHLFVBQUMsTUFBa0I7WUFDbkMsSUFBSSxDQUFDLENBQUMsS0FBSSxDQUFDLFFBQVEsSUFBSSxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsTUFBTTtnQkFDekUsQ0FBQyxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUM3RCxLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzthQUNuQjtpQkFBTSxJQUFJLENBQUMsS0FBSSxDQUFDLFFBQVEsSUFBSSxLQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEYsS0FBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7YUFDbkI7UUFDSCxDQUFDLEVBQUE7UUFDTyxlQUFVOzs7O1FBQUcsVUFBQyxNQUFrQjtZQUN0QyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzNCLENBQUMsRUFBQTtJQUlELENBQUM7SUF2REQsc0JBQUksaUNBQUk7Ozs7UUFBUjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDOzs7OztRQUVELFVBQWtCLEtBQUs7WUFBdkIsaUJBY0M7WUFiQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFO2dCQUFFLE9BQU87YUFBRTtZQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2I7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2Q7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUVyQixlQUFlLENBQUMsUUFBUTs7O1lBQUM7Z0JBQ3ZCLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixLQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsQ0FBQyxFQUFDLENBQUM7UUFDTCxDQUFDOzs7T0FoQkE7Ozs7O0lBa0NNLHdCQUFROzs7O0lBQWYsVUFBZ0IsRUFBRTtRQUFsQixpQkFHQztRQUZDLDhDQUE4QztRQUM5QyxVQUFVOzs7UUFBQyxjQUFNLE9BQUEsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsRUFBRSxFQUFmLENBQWUsRUFBQyxDQUFDO0lBQ3BDLENBQUM7Ozs7SUFrQkQsOEJBQUk7OztJQUFKOztRQUNFLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTs7b0JBQ2QsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVc7O29CQUNsRyxRQUFRLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCO2dCQUN0RSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7O3dCQUN6RCxLQUFvQixJQUFBLEtBQUEsaUJBQUEsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFBLGdCQUFBLDRCQUFFOzRCQUE1RCxJQUFNLEtBQUssV0FBQTs0QkFDZCxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBTSxXQUFXLE9BQUksQ0FBQzt5QkFDeEM7Ozs7Ozs7OztpQkFDRjtxQkFBTTtvQkFDTCxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBTSxXQUFXLE9BQUksQ0FBQztpQkFDM0M7YUFDRjtZQUNELElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakYsQ0FBQzs7Ozs7SUFFTywrQkFBSzs7OztJQUFiOztZQUNRLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWE7UUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixpQkFBaUI7UUFDakIsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUMvRCxnREFBZ0Q7WUFDaEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFdBQVcsRUFDakQsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztTQUNwRjthQUFNO1lBQ0wsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxXQUFXLEVBQ2pELGVBQWUsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLG9DQUFvQyxDQUFDLENBQUM7U0FDM0U7UUFDRCwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQzs7O1lBR2hELElBQUksR0FBRyxJQUFJOztZQUNYLE9BQU87Ozs7UUFBRyxVQUFVLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDN0IsNENBQTRDO2dCQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsb0JBQW9CO2dCQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2dCQUNuQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQzthQUM5QjtZQUNELENBQUMsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUE7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEYsQ0FBQzs7OztJQUVELHlDQUFlOzs7SUFBZjtRQUFBLGlCQVVDO1FBVEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUI7OztRQUFDO1lBQzVCLElBQUksS0FBSSxDQUFDLElBQUksRUFBRTtnQkFDYixRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDekQsS0FBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUMvRTtpQkFBTTtnQkFDTCxRQUFRLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDNUQsS0FBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUNsRjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sOENBQW9COzs7OztJQUE1QixVQUE2QixJQUFpQjtRQUE5QyxpQkE2QkM7O1lBNUJPLGdCQUFnQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYTtRQUMzRCxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixpRUFBaUU7WUFDakUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxFQUNsRCxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLG9DQUFvQyxDQUFDLENBQUM7WUFDM0UsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RCxlQUFlLENBQUMsUUFBUTs7O1lBQUM7Z0JBQ3ZCLEtBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7O29CQUNyQixJQUFJLEdBQUcsS0FBSTs7b0JBQ1gsT0FBTzs7OztnQkFBRyxVQUFVLENBQUM7b0JBQ3pCLG9CQUFvQjtvQkFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUNyQixDQUFDLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQTtnQkFFRCxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzVELEtBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFDbEQsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUNwRixLQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLENBQUMsRUFBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLHlFQUF5RTtZQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQ2xELGdCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3JIO0lBQ0gsQ0FBQzs7Ozs7O0lBRU8sNERBQWtDOzs7OztJQUExQyxVQUEyQyxPQUFnQjs7WUFDbkQsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRO1FBQzVDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7WUFDakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUI7SUFDSCxDQUFDOzs7OztJQUVPLDZDQUFtQjs7OztJQUEzQjtRQUNFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUU7WUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQzNFLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Ozs7O0lBRU8sc0NBQVk7Ozs7SUFBcEI7UUFDRSxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLG1CQUFBO1lBQ3hGLFNBQVMsRUFBRSxjQUFjO1lBQ3pCLFNBQVMsRUFBRTtnQkFDVCxlQUFlLEVBQUU7O29CQUVmLG1CQUFtQixFQUFFLElBQUk7aUJBRTFCO2dCQUNELGVBQWUsRUFBRTtvQkFDZixPQUFPLEVBQUUsSUFBSTs7b0JBRWIsRUFBRSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2lCQUN6QztnQkFDRCxNQUFNLEVBQUU7O29CQUVOLE1BQU0sRUFBRSxRQUFRO2lCQUNqQjthQUNGO1lBQ0QsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTtTQUMvQixFQUFpQixDQUFDLENBQUM7SUFDdEIsQ0FBQzs7Ozs7O0lBRU8sdUNBQWE7Ozs7O0lBQXJCLFVBQXNCLE9BQWM7UUFBZCx3QkFBQSxFQUFBLGNBQWM7O1lBQzVCLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWE7UUFDMUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sRUFBRTtZQUMzQixJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsOENBQThDLENBQUMsQ0FBQzthQUN2RztpQkFBTSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7Z0JBQzlCLGVBQWUsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLGlEQUFpRCxDQUFDO2FBQ3RGO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0Q7SUFDSCxDQUFDOzs7O0lBRU0sZ0NBQU07OztJQUFiO1FBQUEsaUJBSUM7UUFIQyxlQUFlLENBQUMsUUFBUTs7O1FBQUM7WUFDdkIsSUFBSSxLQUFJLENBQUMsTUFBTSxFQUFFO2dCQUFFLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7YUFBRTtRQUM1QyxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxxQ0FBVzs7O0lBQVg7UUFDRSxlQUFlO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFFTywrQ0FBcUI7Ozs7SUFBN0I7UUFDRSx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDbEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUNyRCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDOzs7Ozs7SUFFTyxxREFBMkI7Ozs7O0lBQW5DLFVBQW9DLFVBQVU7UUFDNUMsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDOzs7Ozs7SUFFTyx5REFBK0I7Ozs7O0lBQXZDLFVBQXdDLGNBQWM7O1lBQzlDLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQztRQUN6RCxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7OztJQUdELHlDQUFlOzs7SUFBZjtRQUNFLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDOztnQkE1UEYsU0FBUyxTQUFDOztvQkFFVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixrakJBQXNDOztpQkFFdkM7Ozs7Z0JBaEJDLFVBQVU7Z0JBTVYsU0FBUztnQkFIVCxNQUFNO2dCQUxOLGlCQUFpQjs7O3VCQXlCaEIsS0FBSzs4QkFlTCxLQUFLOzJCQUNMLEtBQUs7NkJBWUwsTUFBTTtrQ0FDTixTQUFTLFNBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2tDQUM3QyxTQUFTLFNBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFOztJQW1OaEQsc0JBQUM7Q0FBQSxBQTdQRCxJQTZQQztTQXZQWSxlQUFlOzs7SUFxQjFCLHNDQUE0Qjs7SUFDNUIsbUNBQTJCOzs7OztJQUMzQixpQ0FBZ0M7Ozs7O0lBQ2hDLGtDQUErQjs7Ozs7SUFDL0Isa0NBQTJCOzs7OztJQUMzQiwwQ0FBa0M7Ozs7O0lBQ2xDLDREQUdFOzs7OztJQUNGLHFDQUFxQjs7Ozs7SUFDckIsdUNBQXVCOztJQUV2QixxQ0FBMEM7O0lBQzFDLDBDQUE0RTs7SUFDNUUsMENBQTRFOztJQU01RSwwQ0FPQzs7Ozs7SUFDRCxxQ0FHQzs7Ozs7SUFFVyw2QkFBd0I7Ozs7O0lBQUUsbUNBQTZCOzs7OztJQUFFLGlDQUF3Qjs7Ozs7SUFDakYsNENBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBOZ1pvbmUsXHJcbiAgT25EZXN0cm95LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgUG9wcGVyLCB7UG9wcGVyT3B0aW9uc30gZnJvbSAncG9wcGVyLmpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3BvcHBlci1jb21wb25lbnQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3BwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogW2AuL3BvcHBlci5jb21wb25lbnQuc2Nzc2BdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUG9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgZ2V0IG9wZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG9wZW4odmFsdWUpIHtcclxuICAgIGlmICh0aGlzLl9pc09wZW4gPT09IHZhbHVlKSB7IHJldHVybjsgfVxyXG4gICAgdGhpcy5hbmltYXRlID0gdHJ1ZTtcclxuICAgIGlmICghIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2hvdygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5faXNPcGVuID0gdmFsdWU7XHJcblxyXG4gICAgUG9wcGVyQ29tcG9uZW50Lm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xyXG4gICAgICB0aGlzLnNldEJsdXJMaXN0ZW5lcigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGZsdWlkUG9wcGVyID0gdHJ1ZTtcclxuICBASW5wdXQoKSBhcHBlbmRUbyA9ICdib2R5JztcclxuICBwcm90ZWN0ZWQgcG9wcGVyOiBQb3BwZXIgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfaXNPcGVuOiBhbnkgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgYW5pbWF0ZTogYm9vbGVhbjtcclxuICBwcm90ZWN0ZWQgcG9wcGVyRGlyZWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIGRpcmVjdGlvbkFuaW1hdGlvblRyYW5zZm9ybU9yaWdpbiA9IHtcclxuICAgICd0b3AnOiAnMCAxMDAlJyxcclxuICAgICdib3R0b20nOiAnMCAwJ1xyXG4gIH07XHJcbiAgcHJvdGVjdGVkIHBvcHBlck5vZGU7XHJcbiAgcHJvdGVjdGVkIHBvcHBlclBhcmVudDtcclxuXHJcbiAgQE91dHB1dCgpIG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZCgncG9wcGVyQWN0aXZhdG9yJywgeyBzdGF0aWM6IHRydWUgfSkgcG9wcGVyQWN0aXZhdG9yOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3BvcHBlckNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIHBvcHBlckNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuXHJcbiAgc3RhdGljIG5leHRUaWNrKGZuKSB7XHJcbiAgICAvLyBGb3JjZSB0byBydW4gZm4gYWZ0ZXIgY3VycmVudCBkYXRhIGNoYW5nZWQuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IGZuLmJpbmQodGhpcykoKSk7XHJcbiAgfVxyXG4gIG9uRG9jdW1lbnRDbGljayA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmICghIXRoaXMuYXBwZW5kVG8gJiYgdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudCAhPT0gJGV2ZW50LnRhcmdldCAmJlxyXG4gICAgICAhdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuYXBwZW5kVG8gJiYgdGhpcy5vcGVuICYmICF0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoJGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByaXZhdGUgYmxvY2tFdmVudCA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGVsOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJvdGVjdGVkIG5nWm9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIHNob3coKSB7XHJcbiAgICAvLyBBcHBlbmQgdG8gc2VsZWN0b3Igb3Igb3JpZ2luYWwgcGFyZW50LlxyXG4gICAgaWYgKCEhdGhpcy5hcHBlbmRUbykge1xyXG4gICAgICBpZiAodGhpcy5mbHVpZFBvcHBlcikge1xyXG4gICAgICAgIGNvbnN0IHBvcHBlcldpZHRoID0gdGhpcy5wb3BwZXJBY3RpdmF0b3IubmF0aXZlRWxlbWVudCAmJiB0aGlzLnBvcHBlckFjdGl2YXRvci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0RWxlID0gIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XHJcbiAgICAgICAgaWYgKGZpcnN0RWxlLmNsYXNzTGlzdC5jb250YWlucygnZGV2dWktc2VhcmNoLWNvbnRhaW5lcicpKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgY2hpbGQuc3R5bGUud2lkdGggPSBgJHtwb3BwZXJXaWR0aH1weGA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZpcnN0RWxlLnN0eWxlLndpZHRoID0gYCR7cG9wcGVyV2lkdGh9cHhgO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvU2VsZWN0b3IodGhpcy5hcHBlbmRUbyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZSh0aGlzLnBvcHBlclBhcmVudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHBlciA9IHRoaXMuY3JlYXRlUG9wcGVyKCk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsICdkaXNwbGF5JywgJ2Jsb2NrJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsb3NlKCkge1xyXG4gICAgY29uc3QgcG9wcGVyQ29udGFpbmVyID0gdGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuc2V0VHJhbnNpdGlvbignY2xvc2UnKTtcclxuICAgIC8vIEZvciBJRSAxMS9FZGdlXHJcbiAgICBpZiAocG9wcGVyQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybS5tYXRjaCgvc2NhbGUzZFxcKDEsIDEsIDFcXCkvKSkge1xyXG4gICAgICAvLyBSZXBsYWNlIHRyYW5zZm9ybSBvcGVuIHN0YXRlIHdpdGggY2xvc2Ugc3RhdGVcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0ucmVwbGFjZSgnc2NhbGUzZCgxLCAxLCAxKScsICdzY2FsZTNkKDEsIDAsIDEpJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcGVyc3BlY3RpdmUoMXB4KSBzb2x2ZXMgcGl4ZWwgc2hpZnQgY2F1c2VkIGJ5IHdlYmtpdCB0cmFuc2Zvcm1cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICd0cmFuc2Zvcm0nLFxyXG4gICAgICAgIHBvcHBlckNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyBgIHNjYWxlM2QoMSwgMCwgMSkgcGVyc3BlY3RpdmUoMXB4KWApO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGNvbnRhaW5lciB0byB0cmFuc3BhcmVudFxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICdvcGFjaXR5JywgMCk7XHJcblxyXG4gICAgLy8gQ2FuJ3QgdXNlIGJpbmQodGhpcykgc2luY2UgaXQgY2FsbHMgaXRzZWxmXHJcbiAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoIXRoYXQub3BlbiAmJiB0aGF0LnBvcHBlcikge1xyXG4gICAgICAgIC8vIFNldCBmaW5hbCBzdGF0ZSBvZiBjb250YWluZXIgdG8gaW52aXNpYmxlXHJcbiAgICAgICAgdGhhdC5yZW5kZXJlci5zZXRTdHlsZShwb3BwZXJDb250YWluZXIsICdkaXNwbGF5JywgJ25vbmUnKTtcclxuICAgICAgICB0aGF0LmFuaW1hdGUgPSBmYWxzZTtcclxuICAgICAgICAvLyBSZW1vdmUgdHJhbnNpdGlvblxyXG4gICAgICAgIHRoYXQuc2V0VHJhbnNpdGlvbigpO1xyXG4gICAgICAgIHRoYXQucG9wcGVyLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGF0LnBvcHBlciA9IG51bGw7XHJcbiAgICAgICAgdGhhdC5kZXRhY2hQb3BwZXJDb250YWluZXIoKTtcclxuICAgICAgfVxyXG4gICAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIGhhbmRsZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHNldEJsdXJMaXN0ZW5lcigpIHtcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMub3Blbikge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmJsb2NrRXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkRvY3VtZW50Q2xpY2spO1xyXG4gICAgICAgIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmJsb2NrRXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlUcmFuc2l0aW9uU3R5bGUoZGF0YTogUG9wcGVyLkRhdGEpIHtcclxuICAgIGNvbnN0IG9wdGlvbnNDb250YWluZXIgPSB0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy51cGRhdGVDb250YWluZXJUcmFuc2l0aW9uRGlyZWN0aW9uKGRhdGEuZmxpcHBlZCk7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlKSB7XHJcbiAgICAgIC8vIHBlcnNwZWN0aXZlKDFweCkgc29sdmVzIHBpeGVsIHNoaWZ0IGNhdXNlZCBieSB3ZWJraXQgdHJhbnNmb3JtXHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgb3B0aW9uc0NvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm0gKyBgIHNjYWxlM2QoMSwgMCwgMSkgcGVyc3BlY3RpdmUoMXB4KWApO1xyXG4gICAgICAvLyBTZXQgY29udGFpbmVyIGluaXQgc3RhdGUgdG8gdHJhbnNwYXJlbnQgYXMgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2l0aW9uLlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKG9wdGlvbnNDb250YWluZXIsICdvcGFjaXR5JywgMCk7XHJcbiAgICAgIFBvcHBlckNvbXBvbmVudC5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uKCdvcGVuJyk7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAvLyByZW1vdmUgdHJhbnNpdGlvblxyXG4gICAgICAgICAgdGhhdC5zZXRUcmFuc2l0aW9uKCk7XHJcbiAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsIGhhbmRsZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIG9wdGlvbnNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUob3B0aW9uc0NvbnRhaW5lciwgJ3RyYW5zZm9ybScsXHJcbiAgICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybS5yZXBsYWNlKCdzY2FsZTNkKDEsIDAsIDEpJywgJ3NjYWxlM2QoMSwgMSwgMSknKSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAnb3BhY2l0eScsIDEpO1xyXG4gICAgICAgIHRoaXMuYW5pbWF0ZSA9IGZhbHNlO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGhhbmRsZSBwb3BwZXIgcmUtcmVuZGVyaW5nLCBpbmNvbWluZyB0cmFuc2Zvcm0gZG9lc24ndCBoYXZlIHNjYWxlIGluZm9cclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShvcHRpb25zQ29udGFpbmVyLCAndHJhbnNmb3JtJyxcclxuICAgICAgICBvcHRpb25zQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSArICh0aGlzLm9wZW4gPyAnIHNjYWxlM2QoMSwgMSwgMSknIDogJyBzY2FsZTNkKDEsIDAsIDEpJykgKyAnIHBlcnNwZWN0aXZlKDFweCknKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGFpbmVyVHJhbnNpdGlvbkRpcmVjdGlvbihmbGlwcGVkOiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSBmbGlwcGVkID8gJ3RvcCcgOiAnYm90dG9tJztcclxuICAgIGlmICh0aGlzLnBvcHBlckRpcmVjdGlvbiAhPT0gZGlyZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyRGlyZWN0aW9uID0gZGlyZWN0aW9uO1xyXG4gICAgICB0aGlzLnNldFRyYW5zaXRpb25PcmlnaW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VHJhbnNpdGlvbk9yaWdpbigpIHtcclxuICAgIGlmICh0aGlzLnBvcHBlckNvbnRhaW5lci5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5wb3BwZXJDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybS1vcmlnaW4nLFxyXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uQW5pbWF0aW9uVHJhbnNmb3JtT3JpZ2luW3RoaXMucG9wcGVyRGlyZWN0aW9uXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVBvcHBlcigpIHtcclxuICAgIHJldHVybiBuZXcgUG9wcGVyKHRoaXMucG9wcGVyQWN0aXZhdG9yLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgcGxhY2VtZW50OiAnYm90dG9tLXN0YXJ0JyxcclxuICAgICAgbW9kaWZpZXJzOiB7XHJcbiAgICAgICAgcHJldmVudE92ZXJmbG93OiB7XHJcbiAgICAgICAgICAvLyBEbyBub3Qgc3RpY2sgdG8gdGhlIHdpbmRvdyBlZGdlXHJcbiAgICAgICAgICBlc2NhcGVXaXRoUmVmZXJlbmNlOiB0cnVlLFxyXG4gICAgICAgICAgLy8gYm91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFwcGx5UmVhY3RTdHlsZToge1xyXG4gICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgIC8vIEFwcGx5IGV4dHJhIHRyYW5zaXRpb24gYW5kIHRyYW5zZm9ybSB0byBwb3BwZXJcclxuICAgICAgICAgIGZuOiB0aGlzLmFwcGx5VHJhbnNpdGlvblN0eWxlLmJpbmQodGhpcyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvZmZzZXQ6IHtcclxuICAgICAgICAgIC8vIFNldCB2ZXJ0aWNhbCBvZmZzZXQgNXB4XHJcbiAgICAgICAgICBvZmZzZXQ6ICcwLCA1cHgnXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBwb3NpdGlvbkZpeGVkOiAhIXRoaXMuYXBwZW5kVG9cclxuICAgIH0gYXMgUG9wcGVyT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFRyYW5zaXRpb24oY29tbWFuZCA9IG51bGwpIHtcclxuICAgIGNvbnN0IHBvcHBlckNvbnRhaW5lciA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5hbmltYXRlICYmIGNvbW1hbmQpIHtcclxuICAgICAgaWYgKGNvbW1hbmQgPT09ICdvcGVuJykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gLjJzIGN1YmljLWJlemllcigwLjIzLCAxLCAwLjMyLCAxKScpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT09ICdjbG9zZScpIHtcclxuICAgICAgICBwb3BwZXJDb250YWluZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdhbGwgLjE1cyBjdWJpYy1iZXppZXIoMC43NTUsIDAuMDUsIDAuODU1LCAwLjA2KSc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocG9wcGVyQ29udGFpbmVyLCAndHJhbnNpdGlvbicsIG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZSgpIHtcclxuICAgIFBvcHBlckNvbXBvbmVudC5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBvcHBlcikgeyB0aGlzLnBvcHBlci51cGRhdGUoKTsgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIC8vIENsb3NlIHBvcHBlclxyXG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRldGFjaFBvcHBlckNvbnRhaW5lcigpIHtcclxuICAgIC8vIENhY2hlIHBvcHBlcidzIHBhcmVudCBhbmQgcG9wcGVyIG5vZGUuXHJcbiAgICB0aGlzLnBvcHBlclBhcmVudCA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgIHRoaXMucG9wcGVyTm9kZSA9IHRoaXMucG9wcGVyQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5wb3BwZXJQYXJlbnQgJiYgdGhpcy5wb3BwZXJOb2RlKSB7XHJcbiAgICAgIHRoaXMucG9wcGVyUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMucG9wcGVyTm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZShub2RlUGFyZW50KSB7XHJcbiAgICBpZiAobm9kZVBhcmVudCAmJiB0aGlzLnBvcHBlck5vZGUpIHtcclxuICAgICAgdGhpcy5wb3BwZXJQYXJlbnQgPSBub2RlUGFyZW50O1xyXG4gICAgICB0aGlzLnBvcHBlclBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLnBvcHBlck5vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hQb3BwZXJDb250YWluZXJUb1NlbGVjdG9yKHRhcmdldFNlbGVjdG9yKSB7XHJcbiAgICBjb25zdCBub2RlUGFyZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXRTZWxlY3Rvcik7XHJcbiAgICB0aGlzLmF0dGFjaFBvcHBlckNvbnRhaW5lclRvTm9kZShub2RlUGFyZW50KTtcclxuICB9XHJcblxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAvLyBEZXRhY2ggcG9wcGVyIGNvbnRhaW5lciBvbmNlIHZpZXcgaW5pdGlhbGl6ZWQuXHJcbiAgICB0aGlzLmRldGFjaFBvcHBlckNvbnRhaW5lcigpO1xyXG4gIH1cclxufVxyXG4iXX0=