UNPKG

@greg-md/ng-elevator

Version:

Make a container to elevate on the screen while scrolling with Angular.

280 lines (271 loc) 26.6 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) : typeof define === 'function' && define.amd ? define('@greg-md/ng-elevator', ['exports', '@angular/core', '@angular/common'], factory) : (factory((global['greg-md'] = global['greg-md'] || {}, global['greg-md']['ng-elevator'] = {}),global.ng.core,global.ng.common)); }(this, (function (exports,core,common) { 'use strict'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @param {?} element * @return {?} */ function offset(element) { // Support: IE <=11 only // Running getBoundingClientRect on a // disconnected node in IE throws an error if (!element || !element.getClientRects().length) { return { top: 0, left: 0 }; } var /** @type {?} */ docElem, /** @type {?} */ rect, /** @type {?} */ doc; rect = element.getBoundingClientRect(); // Make sure element is not hidden (display: none) if (rect.width || rect.height) { doc = element.ownerDocument; docElem = doc.documentElement; return { top: rect.top + window.pageYOffset - docElem.clientTop, left: rect.left + window.pageXOffset - docElem.clientLeft }; } // Return zeros for disconnected and hidden elements (gh-2310) return rect; } /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var ElevatorComponent = (function () { function ElevatorComponent(elementRef, renderer, platformId) { this.elementRef = elementRef; this.renderer = renderer; this.platformId = platformId; this.lastPosition = 0; this.marginTop = 0; this.marginBottom = 0; } /** * @return {?} */ ElevatorComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; this.initImagesLoad(); setTimeout(function () { return _this.reloadPositions(true); }); }; /** * @return {?} */ ElevatorComponent.prototype.windowScroll = /** * @return {?} */ function () { this.reloadPositions(); }; /** * @return {?} */ ElevatorComponent.prototype.windowResize = /** * @return {?} */ function () { this.reloadPositions(true); }; /** * @return {?} */ ElevatorComponent.prototype.initImagesLoad = /** * @return {?} */ function () { var _this = this; this.images.forEach(function (img) { var /** @type {?} */ loadUnload = _this.renderer.listen(img, 'load', function () { _this.reloadPositions(true); loadUnload(); }); }); }; /** * @param {?=} keepPositions * @return {?} */ ElevatorComponent.prototype.reloadPositions = /** * @param {?=} keepPositions * @return {?} */ function (keepPositions) { if (keepPositions === void 0) { keepPositions = false; } if (!common.isPlatformBrowser(this.platformId)) { return; } this.reloadYPositions(keepPositions); }; /** * @param {?=} keepPositions * @return {?} */ ElevatorComponent.prototype.reloadYPositions = /** * @param {?=} keepPositions * @return {?} */ function (keepPositions) { if (keepPositions === void 0) { keepPositions = false; } var /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement); var /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop); var /** @type {?} */ elevatorMarginBottom = parseFloat(styles.marginBottom); var /** @type {?} */ elevatorHeight = this.elementRef.nativeElement.offsetHeight + elevatorMarginTop + elevatorMarginBottom; if (elevatorHeight >= this.elementRef.nativeElement.parentNode.clientHeight) { this.setPosition(); return; } var /** @type {?} */ isScrollDown = window.scrollY > this.lastPosition; this.lastPosition = window.scrollY; var /** @type {?} */ elevatorDiff = (window.innerHeight - (elevatorHeight + this.marginTop + this.marginBottom)); var /** @type {?} */ hostPosition = this.elementRef.nativeElement.parentNode.getBoundingClientRect(); var /** @type {?} */ hostTop = (hostPosition.top * -1) + this.marginTop; var /** @type {?} */ hostBottom = (hostPosition.bottom - window.innerHeight) + this.marginBottom; var /** @type {?} */ elevatorPosition = this.elementRef.nativeElement.getBoundingClientRect(); var /** @type {?} */ elevatorTop = (elevatorPosition.top * -1) + elevatorMarginTop + this.marginTop; var /** @type {?} */ elevatorBottom = (elevatorPosition.bottom - window.innerHeight) + elevatorMarginBottom + this.marginBottom; var /** @type {?} */ elevatorWidth = parseFloat(this.elementRef.nativeElement.parentNode.clientWidth) - parseFloat(styles.marginLeft) - parseFloat(styles.marginRight); if (elevatorDiff >= 0 ? hostTop <= 0 : elevatorBottom > 0 && (!this.cssPosition || hostTop <= 0)) { this.setPosition(); } else { if (elevatorDiff >= 0) { if (hostBottom + elevatorDiff <= 0) { this.setPosition('absolute', null, 0, elevatorWidth); } else { this.setPosition('fixed', this.marginTop, null, elevatorWidth); } } else { this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop, null, elevatorWidth); if (isScrollDown || keepPositions) { if (hostBottom <= 0) { this.setPosition('absolute', null, 0, elevatorWidth); } else if (elevatorBottom <= 0) { this.setPosition('fixed', null, this.marginBottom); } } else { if (elevatorTop <= 0) { this.setPosition('fixed', this.marginTop, null, elevatorWidth); } } } } }; /** * @return {?} */ ElevatorComponent.prototype.prepareAbsolutePositions = /** * @return {?} */ function () { var /** @type {?} */ styles = getComputedStyle(this.elementRef.nativeElement); var /** @type {?} */ elevatorMarginTop = parseFloat(styles.marginTop); this.setPosition('absolute', offset(this.elementRef.nativeElement).top - offset(this.elementRef.nativeElement.parentNode).top - elevatorMarginTop); }; /** * @param {?=} position * @param {?=} top * @param {?=} bottom * @param {?=} width * @return {?} */ ElevatorComponent.prototype.setPosition = /** * @param {?=} position * @param {?=} top * @param {?=} bottom * @param {?=} width * @return {?} */ function (position, top, bottom, width) { if (position === void 0) { position = null; } if (top === void 0) { top = null; } if (bottom === void 0) { bottom = null; } if (width === void 0) { width = null; } this.cssPosition = position; this.cssTop = top; this.cssBottom = bottom; this.cssWidth = width; }; ElevatorComponent.decorators = [ { type: core.Component, args: [{ selector: 'greg-elevator', template: '<ng-content></ng-content>', styles: [':host { display: block; }'], changeDetection: core.ChangeDetectionStrategy.OnPush, },] }, ]; /** @nocollapse */ ElevatorComponent.ctorParameters = function () { return [ { type: core.ElementRef }, { type: core.Renderer2 }, { type: String, decorators: [{ type: core.Inject, args: [core.PLATFORM_ID,] }] } ]; }; ElevatorComponent.propDecorators = { marginTop: [{ type: core.Input }], marginBottom: [{ type: core.Input }], cssPosition: [{ type: core.HostBinding, args: ['style.position',] }], cssTop: [{ type: core.HostBinding, args: ['style.top.px',] }], cssBottom: [{ type: core.HostBinding, args: ['style.bottom.px',] }], cssWidth: [{ type: core.HostBinding, args: ['style.width.px',] }], images: [{ type: core.ViewChildren, args: ['img',] }], windowScroll: [{ type: core.HostListener, args: ['window:scroll',] }], windowResize: [{ type: core.HostListener, args: ['window:resize',] }] }; return ElevatorComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ var ElevatorModule = (function () { function ElevatorModule() { } ElevatorModule.decorators = [ { type: core.NgModule, args: [{ imports: [common.CommonModule], declarations: [ElevatorComponent], exports: [ElevatorComponent] },] }, ]; return ElevatorModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ exports.ElevatorComponent = ElevatorComponent; exports.ElevatorModule = ElevatorModule; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlZy1tZC1uZy1lbGV2YXRvci51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL0BncmVnLW1kL25nLWVsZXZhdG9yL2xpYi9lbGV2YXRvci51dGlscy50cyIsIm5nOi8vQGdyZWctbWQvbmctZWxldmF0b3IvbGliL2VsZXZhdG9yLmNvbXBvbmVudC50cyIsIm5nOi8vQGdyZWctbWQvbmctZWxldmF0b3IvbGliL2VsZXZhdG9yLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gb2Zmc2V0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuICAvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG4gIC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpIHtcbiAgICByZXR1cm4ge3RvcDogMCwgbGVmdDogMH07XG4gIH1cblxuICBsZXQgZG9jRWxlbTogSFRNTEVsZW1lbnQsIHJlY3Q6IENsaWVudFJlY3QsIGRvYzogRG9jdW1lbnQ7XG5cbiAgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgLy8gTWFrZSBzdXJlIGVsZW1lbnQgaXMgbm90IGhpZGRlbiAoZGlzcGxheTogbm9uZSlcbiAgaWYgKHJlY3Qud2lkdGggfHwgcmVjdC5oZWlnaHQpIHtcbiAgICBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiByZWN0LnRvcCArIHdpbmRvdy5wYWdlWU9mZnNldCAtIGRvY0VsZW0uY2xpZW50VG9wLFxuICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgd2luZG93LnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0XG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGdoLTIzMTApXG4gIHJldHVybiByZWN0O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgUmVuZGVyZXIyLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0NoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIEluamVjdCxcbiAgUExBVEZPUk1fSURcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7IG9mZnNldCB9IGZyb20gJy4vZWxldmF0b3IudXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncmVnLWVsZXZhdG9yJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0nXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEVsZXZhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIGxhc3RQb3NpdGlvbiA9IDA7XG5cbiAgQElucHV0KCkgbWFyZ2luVG9wID0gMDtcbiAgQElucHV0KCkgbWFyZ2luQm90dG9tID0gMDtcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgY3NzUG9zaXRpb246IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRvcC5weCcpIGNzc1RvcDogbnVtYmVyO1xuXG4gIEBIb3N0QmluZGluZygnc3R5bGUuYm90dG9tLnB4JykgY3NzQm90dG9tOiBudW1iZXI7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS53aWR0aC5weCcpIGNzc1dpZHRoOiBudW1iZXI7XG5cbiAgQFZpZXdDaGlsZHJlbignaW1nJykgaW1hZ2VzOiBRdWVyeUxpc3Q8YW55PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogc3RyaW5nXG4gICkge1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuaW5pdEltYWdlc0xvYWQoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWxvYWRQb3NpdGlvbnModHJ1ZSkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpXG4gIHdpbmRvd1Njcm9sbCgpIHtcbiAgICB0aGlzLnJlbG9hZFBvc2l0aW9ucygpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIHdpbmRvd1Jlc2l6ZSgpIHtcbiAgICB0aGlzLnJlbG9hZFBvc2l0aW9ucyh0cnVlKTtcbiAgfVxuXG4gIGluaXRJbWFnZXNMb2FkKCkge1xuICAgIHRoaXMuaW1hZ2VzLmZvckVhY2goaW1nID0+IHtcbiAgICAgIGNvbnN0IGxvYWRVbmxvYWQgPSB0aGlzLnJlbmRlcmVyLmxpc3RlbihpbWcsICdsb2FkJywgKCkgPT4ge1xuICAgICAgICB0aGlzLnJlbG9hZFBvc2l0aW9ucyh0cnVlKTtcblxuICAgICAgICBsb2FkVW5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbG9hZFBvc2l0aW9ucyhrZWVwUG9zaXRpb25zID0gZmFsc2UpIHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbG9hZFlQb3NpdGlvbnMoa2VlcFBvc2l0aW9ucyk7XG4gIH1cblxuICByZWxvYWRZUG9zaXRpb25zKGtlZXBQb3NpdGlvbnMgPSBmYWxzZSkge1xuICAgIGNvbnN0IHN0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgY29uc3QgZWxldmF0b3JNYXJnaW5Ub3AgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Ub3ApO1xuICAgIGNvbnN0IGVsZXZhdG9yTWFyZ2luQm90dG9tID0gcGFyc2VGbG9hdChzdHlsZXMubWFyZ2luQm90dG9tKTtcblxuICAgIGNvbnN0IGVsZXZhdG9ySGVpZ2h0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgZWxldmF0b3JNYXJnaW5Ub3AgKyBlbGV2YXRvck1hcmdpbkJvdHRvbTtcblxuICAgIGlmIChlbGV2YXRvckhlaWdodCA+PSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlLmNsaWVudEhlaWdodCkge1xuICAgICAgdGhpcy5zZXRQb3NpdGlvbigpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaXNTY3JvbGxEb3duID0gd2luZG93LnNjcm9sbFkgPiB0aGlzLmxhc3RQb3NpdGlvbjtcblxuICAgIHRoaXMubGFzdFBvc2l0aW9uID0gd2luZG93LnNjcm9sbFk7XG5cbiAgICBjb25zdCBlbGV2YXRvckRpZmYgPSAod2luZG93LmlubmVySGVpZ2h0IC0gKGVsZXZhdG9ySGVpZ2h0ICsgdGhpcy5tYXJnaW5Ub3AgKyB0aGlzLm1hcmdpbkJvdHRvbSkpO1xuXG4gICAgY29uc3QgaG9zdFBvc2l0aW9uID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGhvc3RUb3AgPSAoaG9zdFBvc2l0aW9uLnRvcCAqIC0xKSArIHRoaXMubWFyZ2luVG9wO1xuXG4gICAgY29uc3QgaG9zdEJvdHRvbSA9IChob3N0UG9zaXRpb24uYm90dG9tIC0gd2luZG93LmlubmVySGVpZ2h0KSArIHRoaXMubWFyZ2luQm90dG9tO1xuXG4gICAgY29uc3QgZWxldmF0b3JQb3NpdGlvbiA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgZWxldmF0b3JUb3AgPSAoZWxldmF0b3JQb3NpdGlvbi50b3AgKiAtMSkgKyBlbGV2YXRvck1hcmdpblRvcCArIHRoaXMubWFyZ2luVG9wO1xuXG4gICAgY29uc3QgZWxldmF0b3JCb3R0b20gPSAoZWxldmF0b3JQb3NpdGlvbi5ib3R0b20gLSB3aW5kb3cuaW5uZXJIZWlnaHQpICsgZWxldmF0b3JNYXJnaW5Cb3R0b20gKyB0aGlzLm1hcmdpbkJvdHRvbTtcblxuICAgIGNvbnN0IGVsZXZhdG9yV2lkdGggPSBwYXJzZUZsb2F0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUuY2xpZW50V2lkdGgpXG4gICAgICAtIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpbkxlZnQpXG4gICAgICAtIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblJpZ2h0KTtcblxuICAgIGlmIChlbGV2YXRvckRpZmYgPj0gMCA/IGhvc3RUb3AgPD0gMCA6IGVsZXZhdG9yQm90dG9tID4gMCAmJiAoIXRoaXMuY3NzUG9zaXRpb24gfHwgaG9zdFRvcCA8PSAwKSkge1xuICAgICAgdGhpcy5zZXRQb3NpdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWxldmF0b3JEaWZmID49IDApIHtcbiAgICAgICAgaWYgKGhvc3RCb3R0b20gKyBlbGV2YXRvckRpZmYgPD0gMCkge1xuICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24oJ2Fic29sdXRlJywgbnVsbCwgMCwgZWxldmF0b3JXaWR0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbignZml4ZWQnLCB0aGlzLm1hcmdpblRvcCwgbnVsbCwgZWxldmF0b3JXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0UG9zaXRpb24oXG4gICAgICAgICAgJ2Fic29sdXRlJyxcbiAgICAgICAgICBvZmZzZXQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnRvcCAtIG9mZnNldCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlKS50b3AgLSBlbGV2YXRvck1hcmdpblRvcCxcbiAgICAgICAgICBudWxsLFxuICAgICAgICAgIGVsZXZhdG9yV2lkdGhcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaXNTY3JvbGxEb3duIHx8IGtlZXBQb3NpdGlvbnMpIHtcbiAgICAgICAgICBpZiAoaG9zdEJvdHRvbSA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdhYnNvbHV0ZScsIG51bGwsIDAsIGVsZXZhdG9yV2lkdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxldmF0b3JCb3R0b20gPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXRQb3NpdGlvbignZml4ZWQnLCBudWxsLCB0aGlzLm1hcmdpbkJvdHRvbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbGV2YXRvclRvcCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKCdmaXhlZCcsIHRoaXMubWFyZ2luVG9wLCBudWxsLCBlbGV2YXRvcldpZHRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcmVwYXJlQWJzb2x1dGVQb3NpdGlvbnMoKSB7XG4gICAgY29uc3Qgc3R5bGVzID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICBjb25zdCBlbGV2YXRvck1hcmdpblRvcCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCk7XG5cbiAgICB0aGlzLnNldFBvc2l0aW9uKFxuICAgICAgJ2Fic29sdXRlJyxcbiAgICAgIG9mZnNldCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkudG9wIC0gb2Zmc2V0KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGUpLnRvcCAtIGVsZXZhdG9yTWFyZ2luVG9wXG4gICAgKTtcbiAgfVxuXG4gIHNldFBvc2l0aW9uKHBvc2l0aW9uOiBzdHJpbmcgPSBudWxsLCB0b3A6IG51bWJlciA9IG51bGwsIGJvdHRvbTogbnVtYmVyID0gbnVsbCwgd2lkdGg6IG51bWJlciA9IG51bGwpIHtcbiAgICB0aGlzLmNzc1Bvc2l0aW9uID0gcG9zaXRpb247XG4gICAgdGhpcy5jc3NUb3AgPSB0b3A7XG4gICAgdGhpcy5jc3NCb3R0b20gPSBib3R0b207XG4gICAgdGhpcy5jc3NXaWR0aCA9IHdpZHRoO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgRWxldmF0b3JDb21wb25lbnQgfSBmcm9tICcuL2VsZXZhdG9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBkZWNsYXJhdGlvbnM6IFtFbGV2YXRvckNvbXBvbmVudF0sXG4gIGV4cG9ydHM6IFtFbGV2YXRvckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgRWxldmF0b3JNb2R1bGUge1xufVxuIl0sIm5hbWVzIjpbImlzUGxhdGZvcm1Ccm93c2VyIiwiQ29tcG9uZW50IiwiQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kiLCJFbGVtZW50UmVmIiwiUmVuZGVyZXIyIiwiSW5qZWN0IiwiUExBVEZPUk1fSUQiLCJJbnB1dCIsIkhvc3RCaW5kaW5nIiwiVmlld0NoaWxkcmVuIiwiSG9zdExpc3RlbmVyIiwiTmdNb2R1bGUiLCJDb21tb25Nb2R1bGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0JBQXVCLE9BQW9COzs7O1FBSXpDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFO1lBQ2hELE9BQU8sRUFBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQztTQUMxQjtRQUVELHFCQUFJLE9BQW9CLG1CQUFFLElBQWdCLG1CQUFFLEdBQWEsQ0FBQztRQUUxRCxJQUFJLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7O1FBR3ZDLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzdCLEdBQUcsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQzVCLE9BQU8sR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDO1lBRTlCLE9BQU87Z0JBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUztnQkFDdEQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVTthQUMxRCxDQUFDO1NBQ0g7O1FBR0QsT0FBTyxJQUFJLENBQUM7S0FDYjs7Ozs7O0FDekJEO1FBd0NFLDJCQUNVLFlBQ0EsVUFDcUIsVUFBa0I7WUFGdkMsZUFBVSxHQUFWLFVBQVU7WUFDVixhQUFRLEdBQVIsUUFBUTtZQUNhLGVBQVUsR0FBVixVQUFVLENBQVE7Z0NBbEJsQyxDQUFDOzZCQUVLLENBQUM7Z0NBQ0UsQ0FBQztTQWlCeEI7Ozs7UUFFRCwyQ0FBZTs7O1lBQWY7Z0JBQUEsaUJBSUM7Z0JBSEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUV0QixVQUFVLENBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFDO2FBQzlDOzs7O1FBR0Qsd0NBQVk7OztZQURaO2dCQUVFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUN4Qjs7OztRQUdELHdDQUFZOzs7WUFEWjtnQkFFRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCOzs7O1FBRUQsMENBQWM7OztZQUFkO2dCQUFBLGlCQVFDO2dCQVBDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztvQkFDckIscUJBQU0sVUFBVSxHQUFHLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUU7d0JBQ25ELEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBRTNCLFVBQVUsRUFBRSxDQUFDO3FCQUNkLENBQUMsQ0FBQztpQkFDSixDQUFDLENBQUM7YUFDSjs7Ozs7UUFFRCwyQ0FBZTs7OztZQUFmLFVBQWdCLGFBQXFCO2dCQUFyQiw4QkFBQTtvQkFBQSxxQkFBcUI7O2dCQUNuQyxJQUFJLENBQUNBLHdCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDdkMsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdEM7Ozs7O1FBRUQsNENBQWdCOzs7O1lBQWhCLFVBQWlCLGFBQXFCO2dCQUFyQiw4QkFBQTtvQkFBQSxxQkFBcUI7O2dCQUNwQyxxQkFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFL0QscUJBQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkQscUJBQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFN0QscUJBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztnQkFFN0csSUFBSSxjQUFjLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRTtvQkFDM0UsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUVuQixPQUFPO2lCQUNSO2dCQUVELHFCQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBRXhELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFFbkMscUJBQU0sWUFBWSxJQUFJLE1BQU0sQ0FBQyxXQUFXLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBRWxHLHFCQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFFdEYscUJBQU0sT0FBTyxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUV6RCxxQkFBTSxVQUFVLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztnQkFFbEYscUJBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFFL0UscUJBQU0sV0FBVyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBRXJGLHFCQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7Z0JBRWpILHFCQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztzQkFDbEYsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7c0JBQzdCLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRW5DLElBQUksWUFBWSxJQUFJLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxHQUFHLGNBQWMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRTtvQkFDaEcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDTCxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7d0JBQ3JCLElBQUksVUFBVSxHQUFHLFlBQVksSUFBSSxDQUFDLEVBQUU7NEJBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7eUJBQ3REOzZCQUFNOzRCQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3lCQUNoRTtxQkFDRjt5QkFBTTt3QkFDTCxJQUFJLENBQUMsV0FBVyxDQUNkLFVBQVUsRUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsRUFDcEgsSUFBSSxFQUNKLGFBQWEsQ0FDZCxDQUFDO3dCQUVGLElBQUksWUFBWSxJQUFJLGFBQWEsRUFBRTs0QkFDakMsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFO2dDQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDOzZCQUN0RDtpQ0FBTSxJQUFJLGNBQWMsSUFBSSxDQUFDLEVBQUU7Z0NBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7NkJBQ3BEO3lCQUNGOzZCQUFNOzRCQUNMLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTtnQ0FDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7NkJBQ2hFO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7Ozs7UUFFRCxvREFBd0I7OztZQUF4QjtnQkFDRSxxQkFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFL0QscUJBQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFdkQsSUFBSSxDQUFDLFdBQVcsQ0FDZCxVQUFVLEVBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQ3JILENBQUM7YUFDSDs7Ozs7Ozs7UUFFRCx1Q0FBVzs7Ozs7OztZQUFYLFVBQVksUUFBdUIsRUFBRSxHQUFrQixFQUFFLE1BQXFCLEVBQUUsS0FBb0I7Z0JBQXhGLHlCQUFBO29CQUFBLGVBQXVCOztnQkFBRSxvQkFBQTtvQkFBQSxVQUFrQjs7Z0JBQUUsdUJBQUE7b0JBQUEsYUFBcUI7O2dCQUFFLHNCQUFBO29CQUFBLFlBQW9COztnQkFDbEcsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7YUFDdkI7O29CQW5KRkMsY0FBUyxTQUFDO3dCQUNULFFBQVEsRUFBRSxlQUFlO3dCQUN6QixRQUFRLEVBQUUsMkJBQTJCO3dCQUNyQyxNQUFNLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQzt3QkFDckMsZUFBZSxFQUFFQyw0QkFBdUIsQ0FBQyxNQUFNO3FCQUNoRDs7Ozs7d0JBbEJDQyxlQUFVO3dCQUVWQyxjQUFTO3FEQW9DTkMsV0FBTSxTQUFDQyxnQkFBVzs7OztnQ0FoQnBCQyxVQUFLO21DQUNMQSxVQUFLO2tDQUVMQyxnQkFBVyxTQUFDLGdCQUFnQjs2QkFFNUJBLGdCQUFXLFNBQUMsY0FBYztnQ0FFMUJBLGdCQUFXLFNBQUMsaUJBQWlCOytCQUU3QkEsZ0JBQVcsU0FBQyxnQkFBZ0I7NkJBRTVCQyxpQkFBWSxTQUFDLEtBQUs7bUNBZWxCQyxpQkFBWSxTQUFDLGVBQWU7bUNBSzVCQSxpQkFBWSxTQUFDLGVBQWU7O2dDQTFEL0I7Ozs7Ozs7QUNBQTs7OztvQkFLQ0MsYUFBUSxTQUFDO3dCQUNSLE9BQU8sRUFBRSxDQUFDQyxtQkFBWSxDQUFDO3dCQUN2QixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDakMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7cUJBQzdCOzs2QkFURDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9