@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
324 lines • 34 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: sticky.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, HostListener, ElementRef, HostBinding } from '@angular/core';
export class StickyComponent {
/**
* @param {?} el
*/
constructor(el) {
this.el = el;
this.hostPosition = 'relative';
this.statusChange = new EventEmitter();
this._prevStatus = undefined;
this._status = 'normal';
// 用于监听是否是横向滚动
this.THROTTLE_DELAY = 16;
this.THROTTLE_TRIGGER = 100;
this.throttle = (/**
* @return {?}
*/
() => {
/** @type {?} */
const fn = this.scrollAndResizeHock;
/** @type {?} */
const time = Date.now();
if (this.scrollTimer) {
clearTimeout(this.scrollTimer);
}
if (!this.scrollPreStart) {
this.scrollPreStart = time;
}
if (time - this.scrollPreStart > this.THROTTLE_TRIGGER) {
fn();
this.scrollPreStart = null;
this.scrollTimer = null;
}
else {
this.scrollTimer = setTimeout((/**
* @return {?}
*/
() => {
fn();
this.scrollPreStart = null;
this.scrollTimer = null;
}), this.THROTTLE_DELAY);
}
});
this.scrollAndResizeHock = (/**
* @return {?}
*/
() => {
if (this.container.getBoundingClientRect().left - (this.containerLeft || 0) !== 0) {
this.status = 'stay';
this.containerLeft = this.container.getBoundingClientRect().left;
}
else {
this.scrollHandler();
}
});
this.scrollHandler = (/**
* @return {?}
*/
() => {
/** @type {?} */
const computedStyle = window.getComputedStyle(this.container);
if (this.parentNode.getBoundingClientRect().top > (this.view && this.view.top || 0)) {
this.status = 'normal'; // 全局滑动(container!==parentNode)时候增加预判
}
else if (this.container.getBoundingClientRect().top
+ parseInt(computedStyle.paddingTop, 10)
+ parseInt(computedStyle.borderTopWidth, 10)
>= (this.view && this.view.top || 0)) {
this.status = 'normal';
}
else if (this.container.getBoundingClientRect().bottom
- parseInt(computedStyle.paddingBottom, 10)
- parseInt(computedStyle.borderBottomWidth, 10)
- this.wrapper.nativeElement.getBoundingClientRect().height
< (this.view && this.view.top || 0) + (this.view && this.view.bottom || 0)) {
this.status = 'remain';
}
else if ((this.container.getBoundingClientRect().top + parseInt(computedStyle.paddingTop, 10) < (this.view && this.view.top || 0))) {
this.status = 'follow';
}
});
}
/**
* @param {?} status
* @return {?}
*/
set status(status) {
if (status !== this._status) {
this._prevStatus = this._status;
this._status = status;
this.statusProcess(this._status);
}
}
/**
* @return {?}
*/
get status() {
return this._status;
}
/**
* @return {?}
*/
ngOnInit() {
this.parentNode = this.el.nativeElement.parentNode;
if (!this.container) {
this.container = this.parentNode;
}
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.scrollTarget = this.scrollTarget || window; // window有scroll事件,document.documentElement没有scroll事件
this.scrollTarget.addEventListener('scroll', this.throttle);
this.initScrollStatus(this.scrollTarget);
}
/**
* @return {?}
*/
ngOnDestroy() {
this.scrollTarget.removeEventListener('scroll', this.throttle);
}
/**
* @param {?} status
* @return {?}
*/
statusProcess(status) {
switch (status) {
case 'normal':
this.wrapper.nativeElement.style.top = 'auto';
this.wrapper.nativeElement.style.left = 'auto';
this.wrapper.nativeElement.style.position = 'static';
break;
case 'follow':
this.wrapper.nativeElement.style.top = (this.view && this.view.top || 0) + 'px';
this.wrapper.nativeElement.style.left = this.wrapper.nativeElement.getBoundingClientRect().left + 'px';
this.wrapper.nativeElement.style.position = 'fixed';
break;
case 'stay':
this.wrapper.nativeElement.style.top =
this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px';
this.wrapper.nativeElement.style.left = 'auto';
this.wrapper.nativeElement.style.position = 'relative';
break;
case 'remain':
if (this.wrapper.nativeElement.style.position !== 'fixed' || this.wrapper.nativeElement.style.position !== 'absolute') {
this.wrapper.nativeElement.style.top =
this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'top') + 'px';
this.wrapper.nativeElement.style.left = 'auto';
this.wrapper.nativeElement.style.position = 'absolute'; // 要先转为absolute再计算,否则如果处于非fixed影响计算
}
this.wrapper.nativeElement.style.top =
this.calculateRemainPosition(this.wrapper.nativeElement, this.parentNode, this.container) + 'px';
this.wrapper.nativeElement.style.left =
this.calculateRelativePosition(this.wrapper.nativeElement, this.parentNode, 'left') + 'px';
this.wrapper.nativeElement.style.position = 'relative';
break;
default:
break;
}
}
/**
* @param {?} element
* @param {?} relativeElement
* @param {?} direction
* @return {?}
*/
calculateRelativePosition(element, relativeElement, direction) {
/** @type {?} */
const key = {
'left': ['left', 'Left'],
'top': ['top', 'Top']
};
if (window && window.getComputedStyle) {
/** @type {?} */
const computedStyle = window.getComputedStyle(relativeElement);
return element.getBoundingClientRect()[key[direction][0]]
- relativeElement.getBoundingClientRect()[key[direction][0]]
- parseInt(computedStyle['padding' + key[direction][1]], 10)
- parseInt(computedStyle['border' + key[direction][1] + 'Width'], 10);
}
}
/**
* @param {?} element
* @param {?} relativeElement
* @param {?} container
* @return {?}
*/
calculateRemainPosition(element, relativeElement, container) {
if (window && window.getComputedStyle) {
/** @type {?} */
const computedStyle = window.getComputedStyle(container);
/** @type {?} */
const result = container.getBoundingClientRect().height
- element.getBoundingClientRect().height
+ container.getBoundingClientRect().top
- relativeElement.getBoundingClientRect().top
- parseInt(computedStyle['paddingTop'], 10)
- parseInt(computedStyle['borderTopWidth'], 10)
- parseInt(computedStyle['paddingBottom'], 10)
- parseInt(computedStyle['borderBottomWidth'], 10);
return result < 0 ? 0 : result;
}
}
/**
* @param {?} target
* @return {?}
*/
initScrollStatus(target) {
/** @type {?} */
const scrollTargets = target === window ? [document.documentElement, document.body] : [target];
/** @type {?} */
let flag = false;
scrollTargets.forEach((/**
* @param {?} scrollTarget
* @return {?}
*/
scrollTarget => {
if (scrollTarget.scrollTop && scrollTarget.scrollTop > 0) {
flag = true;
}
}));
if (flag) {
setTimeout(this.scrollHandler);
}
}
/**
* 提供给业务自己触发
* 用法:
* 1.捕获所有sticky:```\@ViewChildren(StickyComponent) stickies;```
* 2.触发刷新:当需要手动触发更新的时候,比如订阅数据返回后页面高度发生变化可以调用 ```stickies.forEach(sticky => sticky.recalculatePosition());```
* 慎用,少用, 使用太多会影响性能。
* @return {?}
*/
recalculatePosition() {
this.initScrollStatus(this.scrollTarget);
}
}
StickyComponent.decorators = [
{ type: Component, args: [{
selector: 'd-sticky',
template: `
<div #stickyWrapper [style.zIndex]="zIndex">
<ng-content></ng-content>
</div>
`
}] }
];
/** @nocollapse */
StickyComponent.ctorParameters = () => [
{ type: ElementRef }
];
StickyComponent.propDecorators = {
hostPosition: [{ type: HostBinding, args: ['style.position',] }],
zIndex: [{ type: Input }],
container: [{ type: Input }],
view: [{ type: Input }],
scrollTarget: [{ type: Input }],
statusChange: [{ type: Output }],
wrapper: [{ type: ViewChild, args: ['stickyWrapper', { static: true },] }],
throttle: [{ type: HostListener, args: ['window:resize',] }]
};
if (false) {
/** @type {?} */
StickyComponent.prototype.hostPosition;
/** @type {?} */
StickyComponent.prototype.zIndex;
/** @type {?} */
StickyComponent.prototype.container;
/** @type {?} */
StickyComponent.prototype.view;
/** @type {?} */
StickyComponent.prototype.scrollTarget;
/** @type {?} */
StickyComponent.prototype.statusChange;
/** @type {?} */
StickyComponent.prototype.wrapper;
/** @type {?} */
StickyComponent.prototype._prevStatus;
/** @type {?} */
StickyComponent.prototype._status;
/** @type {?} */
StickyComponent.prototype.parentNode;
/** @type {?} */
StickyComponent.prototype.containerLeft;
/**
* @type {?}
* @private
*/
StickyComponent.prototype.THROTTLE_DELAY;
/**
* @type {?}
* @private
*/
StickyComponent.prototype.THROTTLE_TRIGGER;
/**
* @type {?}
* @private
*/
StickyComponent.prototype.scrollPreStart;
/**
* @type {?}
* @private
*/
StickyComponent.prototype.scrollTimer;
/** @type {?} */
StickyComponent.prototype.throttle;
/** @type {?} */
StickyComponent.prototype.scrollAndResizeHock;
/** @type {?} */
StickyComponent.prototype.scrollHandler;
/**
* @type {?}
* @private
*/
StickyComponent.prototype.el;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RpY2t5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL3N0aWNreS8iLCJzb3VyY2VzIjpbInN0aWNreS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQzVFLFVBQVUsRUFBNkIsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBYTdFLE1BQU0sT0FBTyxlQUFlOzs7O0lBa0N4QixZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQWpDSCxpQkFBWSxHQUFHLFVBQVUsQ0FBQztRQVMvQyxpQkFBWSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3hFLGdCQUFXLEdBQWlCLFNBQVMsQ0FBQztRQUN0QyxZQUFPLEdBQWlCLFFBQVEsQ0FBQzs7UUFlekIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO1FBNkQvQixhQUFROzs7UUFBRyxHQUFHLEVBQUU7O2tCQUNOLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1COztrQkFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3BELEVBQUUsRUFBRSxDQUFDO2dCQUNMLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMzQixJQUFJLENBQUMsV0FBVyxHQUFH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SUFDeEIsb0NBQTRCOztJQUM1QiwrQkFHRTs7SUFDRix1Q0FBc0I7O0lBRXRCLHVDQUF3RTs7SUFDeEUsa0NBQXNEOztJQUV0RCxzQ0FBc0M7O0lBQ3RDLGtDQUFpQzs7SUFZakMscUNBQVc7O0lBQ1gsd0NBQWM7Ozs7O0lBRWQseUNBQTRCOzs7OztJQUM1QiwyQ0FBK0I7Ozs7O0lBQy9CLHlDQUF1Qjs7Ozs7SUFDdkIsc0NBQW9COztJQTBEcEIsbUNBcUJDOztJQUNELDhDQU9DOztJQUVELHdDQW9CQzs7Ozs7SUEzR1csNkJBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsXHJcbiAgICBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0ICwgT25EZXN0cm95LCBIb3N0QmluZGluZ30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5leHBvcnQgdHlwZSBTdGlja3lTdGF0dXMgPSAgJ25vcm1hbCcgfCAnZm9sbG93JyB8ICdzdGF5JyB8ICdyZW1haW4nO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2Qtc3RpY2t5JyxcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgICAgPGRpdiAjc3RpY2t5V3JhcHBlciBbc3R5bGUuekluZGV4XT1cInpJbmRleFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgYCxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBTdGlja3lDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgaG9zdFBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgIEBJbnB1dCgpIHpJbmRleDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgY29udGFpbmVyOiBFbGVtZW50OyAvLyDpu5jorqTlgLzniLblrrnlmahcclxuICAgIEBJbnB1dCgpIHZpZXc6IHtcclxuICAgICAgICB0b3A/OiBudW1iZXIsXHJcbiAgICAgICAgYm90dG9tPzogbnVtYmVyLFxyXG4gICAgfTtcclxuICAgIEBJbnB1dCgpIHNjcm9sbFRhcmdldDtcclxuXHJcbiAgICBAT3V0cHV0KCkgc3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8U3RpY2t5U3RhdHVzPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIEBWaWV3Q2hpbGQoJ3N0aWNreVdyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB3cmFwcGVyO1xyXG5cclxuICAgIF9wcmV2U3RhdHVzOiBTdGlja3lTdGF0dXMgPSB1bmRlZmluZWQ7XHJcbiAgICBfc3RhdHVzOiBTdGlja3lTdGF0dXMgPSAnbm9ybWFsJztcclxuICAgIHNldCBzdGF0dXMoc3RhdHVzOiBTdGlja3lTdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzICE9PSB0aGlzLl9zdGF0dXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldlN0YXR1cyA9IHRoaXMuX3N0YXR1cztcclxuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1c1Byb2Nlc3ModGhpcy5fc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc3RhdHVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyZW50Tm9kZTtcclxuICAgIGNvbnRhaW5lckxlZnQ7IC8vIOeUqOS6juebkeWQrOaYr+WQpuaYr+aoquWQkea7muWKqFxyXG5cclxuICAgIHByaXZhdGUgVEhST1RUTEVfREVMQVkgPSAxNjtcclxuICAgIHByaXZhdGUgVEhST1RUTEVfVFJJR0dFUiA9IDEwMDtcclxuICAgIHByaXZhdGUgc2Nyb2xsUHJlU3RhcnQ7XHJcbiAgICBwcml2YXRlIHNjcm9sbFRpbWVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZTtcclxuICAgICAgICBpZiAoICF0aGlzLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMucGFyZW50Tm9kZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gdGhpcy5zY3JvbGxUYXJnZXQgfHwgd2luZG93OyAvLyB3aW5kb3fmnIlzY3JvbGzkuovku7bvvIxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnTmsqHmnIlzY3JvbGzkuovku7ZcclxuICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnRocm90dGxlKTtcclxuICAgICAgICB0aGlzLmluaXRTY3JvbGxTdGF0dXModGhpcy5zY3JvbGxUYXJnZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXR1c1Byb2Nlc3Moc3RhdHVzKSB7XHJcbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcclxuICAgICAgICAgICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ZvbGxvdyc6XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSAodGhpcy52aWV3ICYmIHRoaXMudmlldy50b3AgfHwgMCApICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdzdGF5JzpcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAndG9wJykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdyZW1haW4nOlxyXG4gICAgICAgICAgICAgICAgaWYgKCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gJ2ZpeGVkJyB8fCB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gJ2Fic29sdXRlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAndG9wJykgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOyAvLyDopoHlhYjovazkuLphYnNvbHV0ZeWGjeiuoeeul++8jOWQpuWImeWmguaenOWkhOS6jumdnmZpeGVk5b2x5ZON6K6h566XXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVtYWluUG9zaXRpb24odGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQsIHRoaXMucGFyZW50Tm9kZSwgdGhpcy5jb250YWluZXIpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbih0aGlzLndyYXBwZXIubmF0aXZlRWxlbWVudCwgdGhpcy5wYXJlbnROb2RlLCAnbGVmdCcpICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIHRoaXMud3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnKVxyXG4gICAgdGhyb3R0bGUgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm4gPSB0aGlzLnNjcm9sbEFuZFJlc2l6ZUhvY2s7XHJcbiAgICAgICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGltZXIpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2Nyb2xsVGltZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsUHJlU3RhcnQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxQcmVTdGFydCA9IHRpbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aW1lIC0gdGhpcy5zY3JvbGxQcmVTdGFydCA+IHRoaXMuVEhST1RUTEVfVFJJR0dFUikge1xyXG4gICAgICAgICAgICBmbigpO1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm4oKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsUHJlU3RhcnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XHJcbiAgICAgICAgICAgIH0sIHRoaXMuVEhST1RUTEVfREVMQVkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNjcm9sbEFuZFJlc2l6ZUhvY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSAodGhpcy5jb250YWluZXJMZWZ0IHx8IDApICAhPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdzdGF5JztcclxuICAgICAgICAgICAgdGhpcy5jb250YWluZXJMZWZ0ID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEhhbmRsZXIoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsSGFuZGxlciA9ICgpID0+IHtcclxuICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNvbnRhaW5lcik7XHJcbiAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA+ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdub3JtYWwnOyAgIC8vIOWFqOWxgOa7keWKqO+8iGNvbnRhaW5lciE9PXBhcmVudE5vZGXvvInml7blgJnlop7liqDpooTliKRcclxuICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKVxyXG4gICAgICAgICAgICsgcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwgMTApXHJcbiAgICAgICAgICAgICAgID49ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSkge1xyXG4gICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ25vcm1hbCc7XHJcbiAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbVxyXG4gICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tLCAxMClcclxuICAgICAgICAgICAtIHBhcnNlSW50KGNvbXB1dGVkU3R5bGUuYm9yZGVyQm90dG9tV2lkdGgsIDEwKVxyXG4gICAgICAgICAgIC0gdGhpcy53cmFwcGVyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgIDwgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcudG9wIHx8IDApICsgKHRoaXMudmlldyAmJiB0aGlzLnZpZXcuYm90dG9tIHx8IDApXHJcbiAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ3JlbWFpbic7XHJcbiAgICAgICB9IGVsc2UgaWYgKCh0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBwYXJzZUludChjb21wdXRlZFN0eWxlLnBhZGRpbmdUb3AsIDEwKSA8ICh0aGlzLnZpZXcgJiYgdGhpcy52aWV3LnRvcCB8fCAwKSlcclxuICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgdGhpcy5zdGF0dXMgPSAnZm9sbG93JztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY2FsY3VsYXRlUmVsYXRpdmVQb3NpdGlvbihlbGVtZW50LCByZWxhdGl2ZUVsZW1lbnQsIGRpcmVjdGlvbikge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IHtcclxuICAgICAgICAgICAgJ2xlZnQnOiBbJ2xlZnQnLCAnTGVmdCddLFxyXG4gICAgICAgICAgICAndG9wJzogWyd0b3AnLCAnVG9wJ11cclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHJlbGF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2tleVtkaXJlY3Rpb25dWzBdXVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcmVsYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2tleVtkaXJlY3Rpb25dWzBdXVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsncGFkZGluZycgKyBrZXlbZGlyZWN0aW9uXVsxXV0sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyJyArIGtleVtkaXJlY3Rpb25dWzFdICsgJ1dpZHRoJ10sIDEwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjYWxjdWxhdGVSZW1haW5Qb3NpdGlvbihlbGVtZW50LCByZWxhdGl2ZUVsZW1lbnQsIGNvbnRhaW5lcikge1xyXG4gICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmdldENvbXB1dGVkU3R5bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcclxuICAgICAgICAgICAgICAgICAgICAtIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgKyBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLSByZWxhdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nVG9wJ10sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyVG9wV2lkdGgnXSwgMTApXHJcbiAgICAgICAgICAgICAgICAgICAgLSBwYXJzZUludChjb21wdXRlZFN0eWxlWydwYWRkaW5nQm90dG9tJ10sIDEwKVxyXG4gICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZVsnYm9yZGVyQm90dG9tV2lkdGgnXSwgMTApO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IDwgMCA/IDAgOiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRTY3JvbGxTdGF0dXModGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFRhcmdldHMgPSB0YXJnZXQgPT09IHdpbmRvdyA/IFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGRvY3VtZW50LmJvZHldIDogW3RhcmdldF07XHJcbiAgICAgIGxldCBmbGFnID0gZmFsc2U7XHJcbiAgICAgIHNjcm9sbFRhcmdldHMuZm9yRWFjaChzY3JvbGxUYXJnZXQgPT4ge1xyXG4gICAgICAgIGlmIChzY3JvbGxUYXJnZXQuc2Nyb2xsVG9wICYmIHNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPiAwKSB7XHJcbiAgICAgICAgICAgIGZsYWcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCh0aGlzLnNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5o+Q5L6b57uZ5Lia5Yqh6Ieq5bex6Kem5Y+RXHJcbiAgICAgKiDnlKjms5XvvJpcclxuICAgICAqIDEu5o2V6I635omA5pyJc3RpY2t577yaYGBgQFZpZXdDaGlsZHJlbihTdGlja3lDb21wb25lbnQpIHN0aWNraWVzO2BgYFxyXG4gICAgICogMi7op6blj5HliLfmlrDvvJrlvZPpnIDopoHmiYvliqjop6blj5Hmm7TmlrDnmoTml7blgJnvvIzmr5TlpoLorqLpmIXmlbDmja7ov5Tlm57lkI7pobXpnaLpq5jluqblj5HnlJ/lj5jljJblj6/ku6XosIPnlKggYGBgc3RpY2tpZXMuZm9yRWFjaChzdGlja3kgPT4gc3RpY2t5LnJlY2FsY3VsYXRlUG9zaXRpb24oKSk7YGBgXHJcbiAgICAgKiDmhY7nlKjvvIzlsJHnlKjvvIwg5L2/55So5aSq5aSa5Lya5b2x5ZON5oCn6IO944CCXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWNhbGN1bGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgICB0aGlzLmluaXRTY3JvbGxTdGF0dXModGhpcy5zY3JvbGxUYXJnZXQpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==