UNPKG

ngx-pluto

Version:
408 lines 37.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, Renderer2, TemplateRef } from '@angular/core'; import { Overlay, OverlayPositionBuilder } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { NpTooltip } from './tooltip.component'; /** @type {?} */ const OFFSET = 4; /** * Tooltip提示文本 * * <example-url>https://stackblitz.com/edit/np-tooltip-sample?embed=1&file=src/app/app.component.html</example-url> */ export class NpTooltipDirective { /** * @param {?} overlay * @param {?} overlayPositionBuilder * @param {?} elementRef * @param {?} renderer */ constructor(overlay, overlayPositionBuilder, elementRef, renderer) { this.overlay = overlay; this.overlayPositionBuilder = overlayPositionBuilder; this.elementRef = elementRef; this.renderer = renderer; /** * 显示提示文本 */ this.text = ''; /** * 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本 */ this.position = 'top'; /** * 提示文本背景色 */ this.bgColor = 'rgba(73, 89, 106, .7)'; /** * 提示文本水平方向X轴位移 */ this.offsetX = null; /** * 提示文本垂直方向Y轴位移 */ this.offsetY = null; /** * 是否展示提示文本指向箭头,默认展示 */ this.showArrow = true; /** * 触发方式,默认为鼠标hover */ this.trigger = 'hover'; this.withPositions = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetX: 0, offsetY: -2 * OFFSET }; } /** * @return {?} */ ngOnInit() { this.initWithPositions(); /** @type {?} */ const positionStrategy = this.overlayPositionBuilder .flexibleConnectedTo(this.elementRef) .withPositions([this.withPositions]); this.overlayRef = this.overlay.create({ positionStrategy, hasBackdrop: this.trigger === 'click' }); this.overlayRef.backdropClick().subscribe((/** * @param {?} res * @return {?} */ res => { this.hide(); })); } /** * @return {?} */ ngAfterViewInit() { /** @type {?} */ let overlayElement; if (this.trigger === 'hover') { this.renderer.listen(this.elementRef.nativeElement, 'mouseenter', (/** * @return {?} */ () => this.delayEnterLeave(true, true, 0.15))); this.renderer.listen(this.elementRef.nativeElement, 'mouseleave', (/** * @return {?} */ () => { this.delayEnterLeave(true, false, 0.1); if (this.overlayRef && !overlayElement) { // NOTE: we bind events under "mouseleave" due to the overlayRef is only created after the overlay was completely shown up overlayElement = this.overlayRef.overlayElement; this.renderer.listen(overlayElement, 'mouseenter', (/** * @return {?} */ () => this.delayEnterLeave(false, true))); this.renderer.listen(overlayElement, 'mouseleave', (/** * @return {?} */ () => this.delayEnterLeave(false, false))); } })); } else if (this.trigger === 'click') { this.renderer.listen(this.elementRef.nativeElement, 'click', (/** * @param {?} e * @return {?} */ (e) => { e.preventDefault(); this.show(); })); } } /** * @private * @return {?} */ initWithPositions() { switch (this.position) { case 'top': this.withPositions = { originX: 'center', originY: 'top', overlayX: 'center', overlayY: 'bottom', offsetX: this.offsetX === null ? 0 : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'right': this.withPositions = { originX: 'end', originY: 'center', overlayX: 'start', overlayY: 'center', offsetX: this.offsetX === null ? 2 * OFFSET : this.offsetX, offsetY: this.offsetY === null ? 0 : this.offsetY }; break; case 'bottom': this.withPositions = { originX: 'center', originY: 'bottom', overlayX: 'center', overlayY: 'top', offsetX: this.offsetX === null ? 0 : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; case 'left': this.withPositions = { originX: 'start', originY: 'center', overlayX: 'end', overlayY: 'center', offsetX: this.offsetX === null ? -2 * OFFSET : this.offsetX, offsetY: this.offsetY === null ? 0 : this.offsetY }; break; case 'topLeft': this.withPositions = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom', offsetX: this.offsetX === null ? OFFSET : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'topRight': this.withPositions = { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'bottom', offsetX: this.offsetX === null ? -OFFSET : this.offsetX, offsetY: this.offsetY === null ? -2 * OFFSET : this.offsetY }; break; case 'bottomLeft': this.withPositions = { originX: 'start', originY: 'bottom', overlayX: 'end', overlayY: 'top', offsetX: this.offsetX === null ? OFFSET : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; case 'bottomRight': this.withPositions = { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'top', offsetX: this.offsetX === null ? -OFFSET : this.offsetX, offsetY: this.offsetY === null ? 2 * OFFSET : this.offsetY }; break; default: break; } if (this.position === 'top') { this.elementRef.nativeElement.classList.add('arrow-bottom'); } } /** * @private * @return {?} */ buildArrow() { if (!this.overlayRef || !this.overlayRef.hostElement) { return; } /** @type {?} */ let arrowPosition; switch (this.position) { case 'top': arrowPosition = 'arrow-bottom'; break; case 'right': arrowPosition = 'arrow-left'; break; case 'bottom': arrowPosition = 'arrow-top'; break; case 'left': arrowPosition = 'arrow-right'; break; case 'topLeft': arrowPosition = 'arrow-bottomRight'; break; case 'topRight': arrowPosition = 'arrow-bottomLeft'; break; case 'bottomLeft': arrowPosition = 'arrow-topRight'; break; case 'bottomRight': arrowPosition = 'arrow-topLeft'; break; default: break; } /** @type {?} */ let tooltipTag = this.overlayRef.hostElement.getElementsByTagName('np-tooltip')[0]; if (tooltipTag) { tooltipTag.classList.add(arrowPosition); } } /** * @private * @param {?} isOrigin * @param {?} isEnter * @param {?=} delay * @return {?} */ delayEnterLeave(isOrigin, isEnter, delay = -1) { if (this.delayTimer) { // Clear timer during the delay time window.clearTimeout(this.delayTimer); this.delayTimer = null; } else if (delay > 0) { this.delayTimer = window.setTimeout((/** * @return {?} */ () => { this.delayTimer = null; isEnter ? this.show() : this.hide(); }), delay * 1000); } else { isEnter && isOrigin ? this.show() : this.hide(); // [Compatible] The "isOrigin" is used due to the tooltip will not hide immediately (may caused by the fade-out animation) } } /** * @return {?} */ show() { if (this.overlayRef.hasAttached()) { return; } /** @type {?} */ const tooltipRef = this.overlayRef.attach(new ComponentPortal(NpTooltip)); if (this.text) { tooltipRef.instance.text = this.text; } if (this.template) { tooltipRef.instance.template = this.template; } tooltipRef.instance.bgColor = this.bgColor; if (this.showArrow) { this.buildArrow(); } } /** * @return {?} */ hide() { if (this.overlayRef.hasAttached) { this.overlayRef.detach(); } } } NpTooltipDirective.decorators = [ { type: Directive, args: [{ selector: '[npTooltip]' },] } ]; /** @nocollapse */ NpTooltipDirective.ctorParameters = () => [ { type: Overlay }, { type: OverlayPositionBuilder }, { type: ElementRef }, { type: Renderer2 } ]; NpTooltipDirective.propDecorators = { text: [{ type: Input, args: ['npTooltip',] }], template: [{ type: Input }], position: [{ type: Input }], bgColor: [{ type: Input }], offsetX: [{ type: Input }], offsetY: [{ type: Input }], showArrow: [{ type: Input }], trigger: [{ type: Input }] }; if (false) { /** * 显示提示文本 * @type {?} */ NpTooltipDirective.prototype.text; /** * 支持自定义模板ng-template展示提示文本 * @type {?} */ NpTooltipDirective.prototype.template; /** * 支持上、右、下、左、上左、上右、下左、下右8个方向展示提示文本,默认展示上方提示文本 * @type {?} */ NpTooltipDirective.prototype.position; /** * 提示文本背景色 * @type {?} */ NpTooltipDirective.prototype.bgColor; /** * 提示文本水平方向X轴位移 * @type {?} */ NpTooltipDirective.prototype.offsetX; /** * 提示文本垂直方向Y轴位移 * @type {?} */ NpTooltipDirective.prototype.offsetY; /** * 是否展示提示文本指向箭头,默认展示 * @type {?} */ NpTooltipDirective.prototype.showArrow; /** * 触发方式,默认为鼠标hover * @type {?} */ NpTooltipDirective.prototype.trigger; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlayRef; /** * @type {?} * @private */ NpTooltipDirective.prototype.withPositions; /** * @type {?} * @private */ NpTooltipDirective.prototype.delayTimer; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlay; /** * @type {?} * @private */ NpTooltipDirective.prototype.overlayPositionBuilder; /** * @type {?} * @private */ NpTooltipDirective.prototype.elementRef; /** @type {?} */ NpTooltipDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHRpcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvdG9vbHRpcC90b29sdGlwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsVUFBVSxFQUFnQixLQUFLLEVBQVUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6SCxPQUFPLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7TUFFMUMsTUFBTSxHQUFHLENBQUM7Ozs7OztBQVFoQixNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7O0lBOEIzQixZQUFvQixPQUFnQixFQUN4QixzQkFBOEMsRUFDOUMsVUFBc0IsRUFDdkIsUUFBbUI7UUFIVixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ3hCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFXOzs7O1FBOUJWLFNBQUksR0FBRyxFQUFFLENBQUM7Ozs7UUFJckIsYUFBUSxHQUFzQixLQUFLLENBQUM7Ozs7UUFFcEMsWUFBTyxHQUFXLHVCQUF1QixDQUFDOzs7O1FBRTFDLFlBQU8sR0FBVyxJQUFJLENBQUM7Ozs7UUFFdkIsWUFBTyxHQUFXLElBQUksQ0FBQzs7OztRQUV2QixjQUFTLEdBQVksSUFBSSxDQUFDOzs7O1FBRTFCLFlBQU8sR0FBc0IsT0FBTyxDQUFDO1FBR3RDLGtCQUFhLEdBQVE7WUFDekIsT0FBTyxFQUFFLFFBQVE7WUFDakIsT0FBTyxFQUFFLEtBQUs7WUFDZCxRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsUUFBUTtZ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QUNBLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7OztZQW5QSixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFOzs7O1lBWDdCLE9BQU87WUFBRSxzQkFBc0I7WUFETixVQUFVO1lBQStCLFNBQVM7OzttQkFnQi9FLEtBQUssU0FBQyxXQUFXO3VCQUVqQixLQUFLO3VCQUVMLEtBQUs7c0JBRUwsS0FBSztzQkFFTCxLQUFLO3NCQUVMLEtBQUs7d0JBRUwsS0FBSztzQkFFTCxLQUFLOzs7Ozs7O0lBZE4sa0NBQThCOzs7OztJQUU5QixzQ0FBb0M7Ozs7O0lBRXBDLHNDQUE2Qzs7Ozs7SUFFN0MscUNBQW1EOzs7OztJQUVuRCxxQ0FBZ0M7Ozs7O0lBRWhDLHFDQUFnQzs7Ozs7SUFFaEMsdUNBQW1DOzs7OztJQUVuQyxxQ0FBOEM7Ozs7O0lBRTlDLHdDQUErQjs7Ozs7SUFDL0IsMkNBT0U7Ozs7O0lBQ0Ysd0NBQW1COzs7OztJQUVQLHFDQUF3Qjs7Ozs7SUFDaEMsb0RBQXNEOzs7OztJQUN0RCx3Q0FBOEI7O0lBQzlCLHNDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XHJcbmltcG9ydCB7IE5wVG9vbHRpcCB9IGZyb20gJy4vdG9vbHRpcC5jb21wb25lbnQnO1xyXG5cclxuY29uc3QgT0ZGU0VUID0gNDtcclxuXHJcbi8qKlxyXG4qIFRvb2x0aXDmj5DnpLrmlofmnKxcclxuKiBcclxuKiA8ZXhhbXBsZS11cmw+aHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L25wLXRvb2x0aXAtc2FtcGxlP2VtYmVkPTEmZmlsZT1zcmMvYXBwL2FwcC5jb21wb25lbnQuaHRtbDwvZXhhbXBsZS11cmw+XHJcbiovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tucFRvb2x0aXBdJyB9KVxyXG5leHBvcnQgY2xhc3MgTnBUb29sdGlwRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKirmmL7npLrmj5DnpLrmlofmnKwgKi9cclxuICAgIEBJbnB1dCgnbnBUb29sdGlwJykgdGV4dCA9ICcnO1xyXG4gICAgLyoq5pSv5oyB6Ieq5a6a5LmJ5qih5p2/bmctdGVtcGxhdGXlsZXnpLrmj5DnpLrmlofmnKwgKi9cclxuICAgIEBJbnB1dCgpIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gICAgLyoq5pSv5oyB5LiK44CB5Y+z44CB5LiL44CB5bem44CB5LiK5bem44CB5LiK5Y+z44CB5LiL5bem44CB5LiL5Y+zOOS4quaWueWQkeWxleekuuaPkOekuuaWh+acrO+8jOm7mOiupOWxleekuuS4iuaWueaPkOekuuaWh+acrCAqL1xyXG4gICAgQElucHV0KCkgcG9zaXRpb246IE5wVG9vbHRpcFBvc2l0aW9uID0gJ3RvcCc7XHJcbiAgICAvKirmj5DnpLrmlofmnKzog4zmma/oibIgKi9cclxuICAgIEBJbnB1dCgpIGJnQ29sb3I6IHN0cmluZyA9ICdyZ2JhKDczLCA4OSwgMTA2LCAuNyknO1xyXG4gICAgLyoq5o+Q56S65paH5pys5rC05bmz5pa55ZCRWOi9tOS9jeenuyAqL1xyXG4gICAgQElucHV0KCkgb2Zmc2V0WDogbnVtYmVyID0gbnVsbDtcclxuICAgIC8qKuaPkOekuuaWh+acrOWeguebtOaWueWQkVnovbTkvY3np7sgKi9cclxuICAgIEBJbnB1dCgpIG9mZnNldFk6IG51bWJlciA9IG51bGw7XHJcbiAgICAvKirmmK/lkKblsZXnpLrmj5DnpLrmlofmnKzmjIflkJHnrq3lpLTvvIzpu5jorqTlsZXnpLogKi9cclxuICAgIEBJbnB1dCgpIHNob3dBcnJvdzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvKirop6blj5HmlrnlvI/vvIzpu5jorqTkuLrpvKDmoIdob3ZlciAqL1xyXG4gICAgQElucHV0KCkgdHJpZ2dlcjogJ2hvdmVyJyB8ICdjbGljaycgPSAnaG92ZXInO1xyXG5cclxuICAgIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZjtcclxuICAgIHByaXZhdGUgd2l0aFBvc2l0aW9uczogYW55ID0ge1xyXG4gICAgICAgIG9yaWdpblg6ICdjZW50ZXInLFxyXG4gICAgICAgIG9yaWdpblk6ICd0b3AnLFxyXG4gICAgICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcclxuICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScsXHJcbiAgICAgICAgb2Zmc2V0WDogMCxcclxuICAgICAgICBvZmZzZXRZOiAtMiAqIE9GRlNFVFxyXG4gICAgfTtcclxuICAgIHByaXZhdGUgZGVsYXlUaW1lcjtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXHJcbiAgICAgICAgcHJpdmF0ZSBvdmVybGF5UG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBwdWJsaWMgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW5pdFdpdGhQb3NpdGlvbnMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVBvc2l0aW9uQnVpbGRlclxyXG4gICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLmVsZW1lbnRSZWYpXHJcbiAgICAgICAgICAgIC53aXRoUG9zaXRpb25zKFt0aGlzLndpdGhQb3NpdGlvbnNdKTtcclxuXHJcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZSh7IHBvc2l0aW9uU3RyYXRlZ3ksIGhhc0JhY2tkcm9wOiB0aGlzLnRyaWdnZXIgPT09ICdjbGljaycgfSk7XHJcbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIGxldCBvdmVybGF5RWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy50cmlnZ2VyID09PSAnaG92ZXInKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VlbnRlcicsICgpID0+IHRoaXMuZGVsYXlFbnRlckxlYXZlKHRydWUsIHRydWUsIDAuMTUpKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxheUVudGVyTGVhdmUodHJ1ZSwgZmFsc2UsIDAuMSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmICYmICFvdmVybGF5RWxlbWVudCkgeyAvLyBOT1RFOiB3ZSBiaW5kIGV2ZW50cyB1bmRlciBcIm1vdXNlbGVhdmVcIiBkdWUgdG8gdGhlIG92ZXJsYXlSZWYgaXMgb25seSBjcmVhdGVkIGFmdGVyIHRoZSBvdmVybGF5IHdhcyBjb21wbGV0ZWx5IHNob3duIHVwXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheUVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4ob3ZlcmxheUVsZW1lbnQsICdtb3VzZWVudGVyJywgKCkgPT4gdGhpcy5kZWxheUVudGVyTGVhdmUoZmFsc2UsIHRydWUpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3RlbihvdmVybGF5RWxlbWVudCwgJ21vdXNlbGVhdmUnLCAoKSA9PiB0aGlzLmRlbGF5RW50ZXJMZWF2ZShmYWxzZSwgZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaWdnZXIgPT09ICdjbGljaycpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFdpdGhQb3NpdGlvbnMoKSB7XHJcbiAgICAgICAgc3dpdGNoICh0aGlzLnBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG92ZXJsYXlZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRYOiB0aGlzLm9mZnNldFggPT09IG51bGwgPyAwIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdjZW50ZXInLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IC0yICogT0ZGU0VUIDogdGhpcy5vZmZzZXRYLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFk6IHRoaXMub2Zmc2V0WSA9PT0gbnVsbCA/IDAgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndG9wTGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAtMiAqIE9GRlNFVCA6IHRoaXMub2Zmc2V0WVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BSaWdodCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IC1PRkZTRVQgOiB0aGlzLm9mZnNldFgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogdGhpcy5vZmZzZXRZID09PSBudWxsID8gLTIgKiBPRkZTRVQgOiB0aGlzLm9mZnNldFlcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhQb3NpdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnLFxyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFg6IHRoaXMub2Zmc2V0WCA9PT0gbnVsbCA/IE9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud2l0aFBvc2l0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnZW5kJyxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JyxcclxuICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WDogdGhpcy5vZmZzZXRYID09PSBudWxsID8gLU9GRlNFVCA6IHRoaXMub2Zmc2V0WCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiB0aGlzLm9mZnNldFkgPT09IG51bGwgPyAyICogT0ZGU0VUIDogdGhpcy5vZmZzZXRZXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAndG9wJykge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhcnJvdy1ib3R0b20nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZEFycm93KCkge1xyXG4gICAgICAgIGlmICghdGhpcy5vdmVybGF5UmVmIHx8ICF0aGlzLm92ZXJsYXlSZWYuaG9zdEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGFycm93UG9zaXRpb246IHN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHRoaXMucG9zaXRpb24pIHtcclxuICAgICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctYm90dG9tJ1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctbGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy10b3AnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RvcExlZnQnOlxyXG4gICAgICAgICAgICAgICAgYXJyb3dQb3NpdGlvbiA9ICdhcnJvdy1ib3R0b21SaWdodCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0b3BSaWdodCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LWJvdHRvbUxlZnQnXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnYm90dG9tTGVmdCc6XHJcbiAgICAgICAgICAgICAgICBhcnJvd1Bvc2l0aW9uID0gJ2Fycm93LXRvcFJpZ2h0J1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcclxuICAgICAgICAgICAgICAgIGFycm93UG9zaXRpb24gPSAnYXJyb3ctdG9wTGVmdCdcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdG9vbHRpcFRhZyA9IHRoaXMub3ZlcmxheVJlZi5ob3N0RWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbnAtdG9vbHRpcCcpWzBdO1xyXG4gICAgICAgIGlmICh0b29sdGlwVGFnKSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBUYWcuY2xhc3NMaXN0LmFkZChhcnJvd1Bvc2l0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWxheUVudGVyTGVhdmUoaXNPcmlnaW46IGJvb2xlYW4sIGlzRW50ZXI6IGJvb2xlYW4sIGRlbGF5OiBudW1iZXIgPSAtMSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmRlbGF5VGltZXIpIHsgLy8gQ2xlYXIgdGltZXIgZHVyaW5nIHRoZSBkZWxheSB0aW1lXHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5kZWxheVRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWVyID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGF5VGltZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaXNFbnRlciA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgIH0sIGRlbGF5ICogMTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXNFbnRlciAmJiBpc09yaWdpbiA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7IC8vIFtDb21wYXRpYmxlXSBUaGUgXCJpc09yaWdpblwiIGlzIHVzZWQgZHVlIHRvIHRoZSB0b29sdGlwIHdpbGwgbm90IGhpZGUgaW1tZWRpYXRlbHkgKG1heSBjYXVzZWQgYnkgdGhlIGZhZGUtb3V0IGFuaW1hdGlvbilcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2hvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdG9vbHRpcFJlZjogQ29tcG9uZW50UmVmPE5wVG9vbHRpcD5cclxuICAgICAgICAgICAgPSB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBDb21wb25lbnRQb3J0YWwoTnBUb29sdGlwKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRleHQpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFJlZi5pbnN0YW5jZS50ZXh0ID0gdGhpcy50ZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdG9vbHRpcFJlZi5pbnN0YW5jZS50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0b29sdGlwUmVmLmluc3RhbmNlLmJnQ29sb3IgPSB0aGlzLmJnQ29sb3I7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBcnJvdykge1xyXG4gICAgICAgICAgICB0aGlzLmJ1aWxkQXJyb3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5vdmVybGF5UmVmLmhhc0F0dGFjaGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2goKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIE5wVG9vbHRpcFBvc2l0aW9uID0gJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAndG9wTGVmdCcgfCAndG9wUmlnaHQnIHwgJ2JvdHRvbUxlZnQnIHwgJ2JvdHRvbVJpZ2h0JzsiXX0=