ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
338 lines • 29.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, Input, Output, EventEmitter, HostListener, ViewContainerRef, ElementRef, Injector, ComponentFactoryResolver, Renderer2, TemplateRef } from '@angular/core';
import { PopoverComponent } from './popover.component';
import { PopoverOptions } from './popover-options.provider';
import { PopoverComponentOptions } from './popover-component-options.provider';
import * as Positioning from '../core/util/position';
export class PopoverDirective {
/**
* @param {?} _viewContainerRef
* @param {?} _elm
* @param {?} _defaultOptions
* @param {?} _cfr
* @param {?} _renderer
*/
constructor(_viewContainerRef, _elm, _defaultOptions, _cfr, _renderer) {
this._viewContainerRef = _viewContainerRef;
this._elm = _elm;
this._defaultOptions = _defaultOptions;
this._cfr = _cfr;
this._renderer = _renderer;
this._eventListeners = [];
this.onVisibleChange = new EventEmitter(true);
this.onSelect = new EventEmitter();
}
/**
* @return {?}
*/
togglePopover() {
if (!this.popover) {
this.showPopover();
}
else {
this.hidePopover();
}
}
/**
* @param {?} placement
* @return {?}
*/
positionMap(placement) {
switch (placement) {
case 'topLeft':
return 'top-left';
case 'topRight':
return 'top-right';
case 'bottomLeft':
return 'bottom-left';
case 'bottomRight':
return 'bottom-right';
case 'leftTop':
return 'left-top';
case 'leftBottom':
return 'left-bottom';
case 'rightTop':
return 'right-top';
case 'rightBottom':
return 'right-bottom';
case 'fullScreen':
case 'landScape':
return 'bottom';
default:
return placement;
}
}
/**
* @return {?}
*/
ngOnInit() { }
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.visible && changes.visible.currentValue) {
setTimeout((/**
* @return {?}
*/
() => {
this.showPopover();
}), 0);
}
else {
setTimeout((/**
* @return {?}
*/
() => {
this.hidePopover();
}), 0);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
this.hidePopover();
}
/**
* @private
* @param {?} event
* @return {?}
*/
onDocumentClick(event) {
if (this.popover &&
!this._elm.nativeElement.contains(event.target) &&
!this.popover.location.nativeElement.contains(event.target)) {
this.hidePopover();
}
}
/**
* @private
* @return {?}
*/
showPopover() {
if (!this.popover) {
setTimeout((/**
* @return {?}
*/
() => {
this._eventListeners = [
this._renderer.listen('document', 'click', (/**
* @param {?} event
* @return {?}
*/
(event) => this.onDocumentClick(event))),
this._renderer.listen('document', 'touchend', (/**
* @param {?} event
* @return {?}
*/
(event) => this.onDocumentClick(event))),
this._renderer.listen('window', 'resize', (/**
* @return {?}
*/
() => this.positionPopover()))
];
}));
/** @type {?} */
const options = new PopoverComponentOptions();
options.placement = this.placement;
Object.assign(options, this._defaultOptions, {
hidePopover: (/**
* @param {?} event
* @return {?}
*/
(event) => {
this.hidePopover();
}),
onAfterViewInit: (/**
* @return {?}
*/
() => {
this.positionPopover();
/** @type {?} */
const children = document.getElementsByClassName('am-popover-inner-wrapper')[0].children;
if (children.length > 0) {
// 首先我们检查它是否包含子节点
for (let i = 0; i < children.length; i++) {
children[i].id = `${i}`;
children[i].addEventListener('click', (/**
* @return {?}
*/
() => {
if (this.onSelect) {
this.onSelect.emit(children[i]);
if (options.autoClose) {
this.hidePopover();
}
}
}), false);
}
}
})
});
/** @type {?} */
const optionalParams = [
'mask',
'showArrow',
'placement',
'appendToBody',
'overlay',
'className',
'autoClose'
];
optionalParams.forEach((/**
* @param {?} param
* @return {?}
*/
param => {
if (typeof this[param] !== 'undefined') {
((/** @type {?} */ (options)))[param] = this[param];
}
}));
/** @type {?} */
const componentFactory = this._cfr.resolveComponentFactory(PopoverComponent);
/** @type {?} */
const childInjector = Injector.create([
{
provide: PopoverComponentOptions,
useValue: options
}
], this._viewContainerRef.parentInjector);
this.popover = this._viewContainerRef.createComponent(componentFactory, this._viewContainerRef.length, childInjector);
if (options.appendToBody) {
document.body.appendChild(this.popover.location.nativeElement);
}
this.onVisibleChange.emit(true);
}
}
/**
* @private
* @return {?}
*/
positionPopover() {
if (this.popover) {
/** @type {?} */
const popoverElement = this.popover.location.nativeElement.children[1];
/** @type {?} */
const popoverPosition = Positioning.getPositionElements(this._elm.nativeElement, popoverElement, this.positionMap(this.placement) || this._defaultOptions.placement, this.appendToBody || this._defaultOptions.appendToBody);
if (this.placement === 'landScape') {
this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`);
this._renderer.setStyle(popoverElement, 'left', `0px`);
this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`);
this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`);
}
else if (this.placement === 'fullScreen') {
this._renderer.setStyle(popoverElement, 'top', `${0}px`);
this._renderer.setStyle(popoverElement, 'left', `0px`);
this._renderer.setStyle(popoverElement, 'width', `${window.innerWidth}px`);
this._renderer.setStyle(popoverElement, 'max-height', `${window.innerHeight - popoverPosition.height}px`);
}
else {
this._renderer.setStyle(popoverElement, 'top', `${popoverPosition.top}px`);
this._renderer.setStyle(popoverElement, 'left', `${popoverPosition.left}px`);
}
}
}
/**
* @private
* @return {?}
*/
hidePopover() {
if (this.popover) {
this.popover.destroy();
delete this.popover;
this.onVisibleChange.emit(false);
this._eventListeners.forEach((/**
* @param {?} fn
* @return {?}
*/
fn => fn()));
this._eventListeners = [];
}
}
}
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[Popover], [nzm-popover]',
providers: [PopoverOptions]
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = () => [
{ type: ViewContainerRef },
{ type: ElementRef },
{ type: PopoverOptions },
{ type: ComponentFactoryResolver },
{ type: Renderer2 }
];
PopoverDirective.propDecorators = {
mask: [{ type: Input }],
showArrow: [{ type: Input }],
visible: [{ type: Input }],
placement: [{ type: Input }],
overlay: [{ type: Input }],
onVisibleChange: [{ type: Output }],
onSelect: [{ type: Output }],
appendToBody: [{ type: Input }],
className: [{ type: Input }],
autoClose: [{ type: Input }],
togglePopover: [{ type: HostListener, args: ['click',] }]
};
if (false) {
/** @type {?} */
PopoverDirective.prototype.popover;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._eventListeners;
/** @type {?} */
PopoverDirective.prototype.mask;
/** @type {?} */
PopoverDirective.prototype.showArrow;
/** @type {?} */
PopoverDirective.prototype.visible;
/** @type {?} */
PopoverDirective.prototype.placement;
/** @type {?} */
PopoverDirective.prototype.overlay;
/** @type {?} */
PopoverDirective.prototype.onVisibleChange;
/** @type {?} */
PopoverDirective.prototype.onSelect;
/** @type {?} */
PopoverDirective.prototype.appendToBody;
/** @type {?} */
PopoverDirective.prototype.className;
/** @type {?} */
PopoverDirective.prototype.autoClose;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._viewContainerRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._elm;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._defaultOptions;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._cfr;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype._renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy16b3Jyby1hbnRkLW1vYmlsZS8iLCJzb3VyY2VzIjpbInBvcG92ZXIvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osWUFBWSxFQUNaLGdCQUFnQixFQUdoQixVQUFVLEVBRVYsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixTQUFTLEVBQ1QsV0FBVyxFQUlaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBTXJELE1BQU0sT0FBTyxnQkFBZ0I7Ozs7Ozs7O0lBbUMzQixZQUNVLGlCQUFtQyxFQUNuQyxJQUFnQixFQUNoQixlQUErQixFQUMvQixJQUE4QixFQUM5QixTQUFvQjtRQUpwQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQTBCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFyQ3RCLG9CQUFlLEdBQXNCLEVBQUUsQ0FBQztRQWFoRCxvQkFBZSxHQUEwQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRSxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUF1QjlDLENBQUM7Ozs7SUFkSixhQUFhO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsSUFBSSxDQUFDLFdB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QUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ3ZEO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxHQUFHLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2FBQzNHO2lCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO2FBQzNHO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO2FBQzlFO1NBQ0Y7SUFDSCxDQUFDOzs7OztJQUVPLFdBQVc7UUFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTzs7OztZQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztTQUMzQjtJQUNILENBQUM7OztZQXBORixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDO2FBQzVCOzs7O1lBckJDLGdCQUFnQjtZQUdoQixVQUFVO1lBV0gsY0FBYztZQVJyQix3QkFBd0I7WUFDeEIsU0FBUzs7O21CQW9CUixLQUFLO3dCQUVMLEtBQUs7c0JBRUwsS0FBSzt3QkFFTCxLQUFLO3NCQUVMLEtBQUs7OEJBRUwsTUFBTTt1QkFFTixNQUFNOzJCQUVOLEtBQUs7d0JBRUwsS0FBSzt3QkFFTCxLQUFLOzRCQUdMLFlBQVksU0FBQyxPQUFPOzs7O0lBekJyQixtQ0FBd0M7Ozs7O0lBRXhDLDJDQUFnRDs7SUFFaEQsZ0NBQ2M7O0lBQ2QscUNBQ21COztJQUNuQixtQ0FDaUI7O0lBQ2pCLHFDQUNrQjs7SUFDbEIsbUNBQzBCOztJQUMxQiwyQ0FDZ0U7O0lBQ2hFLG9DQUNpRDs7SUFDakQsd0NBQ3NCOztJQUN0QixxQ0FDa0I7O0lBQ2xCLHFDQUNtQjs7Ozs7SUFZakIsNkNBQTJDOzs7OztJQUMzQyxnQ0FBd0I7Ozs7O0lBQ3hCLDJDQUF1Qzs7Ozs7SUFDdkMsZ0NBQXNDOzs7OztJQUN0QyxxQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBWaWV3Q29udGFpbmVyUmVmLFxuICBDb21wb25lbnRSZWYsXG4gIE9uRGVzdHJveSxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBJbmplY3RvcixcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnLi9wb3BvdmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQb3BvdmVyT3B0aW9ucyB9IGZyb20gJy4vcG9wb3Zlci1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnRPcHRpb25zIH0gZnJvbSAnLi9wb3BvdmVyLWNvbXBvbmVudC1vcHRpb25zLnByb3ZpZGVyJztcbmltcG9ydCAqIGFzIFBvc2l0aW9uaW5nIGZyb20gJy4uL2NvcmUvdXRpbC9wb3NpdGlvbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tQb3BvdmVyXSwgW256bS1wb3BvdmVyXScsXG4gIHByb3ZpZGVyczogW1BvcG92ZXJPcHRpb25zXVxufSlcbmV4cG9ydCBjbGFzcyBQb3BvdmVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIHBvcG92ZXI6IENvbXBvbmVudFJlZjxQb3BvdmVyQ29tcG9uZW50PjtcblxuICBwcml2YXRlIF9ldmVudExpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBASW5wdXQoKVxuICBtYXNrOiBib29sZWFuO1xuICBASW5wdXQoKVxuICBzaG93QXJyb3c6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHZpc2libGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIHBsYWNlbWVudDogc3RyaW5nO1xuICBASW5wdXQoKVxuICBvdmVybGF5OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAT3V0cHV0KClcbiAgb25WaXNpYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpO1xuICBAT3V0cHV0KClcbiAgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBASW5wdXQoKVxuICBhcHBlbmRUb0JvZHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIGNsYXNzTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKVxuICBhdXRvQ2xvc2U6IGJvb2xlYW47XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICB0b2dnbGVQb3BvdmVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wb3BvdmVyKSB7XG4gICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgX2VsbTogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9kZWZhdWx0T3B0aW9uczogUG9wb3Zlck9wdGlvbnMsXG4gICAgcHJpdmF0ZSBfY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgcG9zaXRpb25NYXAocGxhY2VtZW50KTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHBsYWNlbWVudCkge1xuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgIHJldHVybiAndG9wLWxlZnQnO1xuICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICByZXR1cm4gJ3RvcC1yaWdodCc7XG4gICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgcmV0dXJuICdib3R0b20tbGVmdCc7XG4gICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgIHJldHVybiAnYm90dG9tLXJpZ2h0JztcbiAgICAgIGNhc2UgJ2xlZnRUb3AnOlxuICAgICAgICByZXR1cm4gJ2xlZnQtdG9wJztcbiAgICAgIGNhc2UgJ2xlZnRCb3R0b20nOlxuICAgICAgICByZXR1cm4gJ2xlZnQtYm90dG9tJztcbiAgICAgIGNhc2UgJ3JpZ2h0VG9wJzpcbiAgICAgICAgcmV0dXJuICdyaWdodC10b3AnO1xuICAgICAgY2FzZSAncmlnaHRCb3R0b20nOlxuICAgICAgICByZXR1cm4gJ3JpZ2h0LWJvdHRvbSc7XG4gICAgICBjYXNlICdmdWxsU2NyZWVuJzpcbiAgICAgIGNhc2UgJ2xhbmRTY2FwZSc6XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy52aXNpYmxlICYmIGNoYW5nZXMudmlzaWJsZS5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dQb3BvdmVyKCk7XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMucG9wb3ZlciAmJlxuICAgICAgIXRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgJiZcbiAgICAgICF0aGlzLnBvcG92ZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpXG4gICAgKSB7XG4gICAgICB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93UG9wb3ZlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucG9wb3Zlcikge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW1xuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAnY2xpY2snLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpLFxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3RlbignZG9jdW1lbnQnLCAndG91Y2hlbmQnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLm9uRG9jdW1lbnRDbGljayhldmVudCkpLFxuICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ3Jlc2l6ZScsICgpID0+IHRoaXMucG9zaXRpb25Qb3BvdmVyKCkpXG4gICAgICAgIF07XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IG5ldyBQb3BvdmVyQ29tcG9uZW50T3B0aW9ucygpO1xuICAgICAgb3B0aW9ucy5wbGFjZW1lbnQgPSB0aGlzLnBsYWNlbWVudDtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgdGhpcy5fZGVmYXVsdE9wdGlvbnMsIHtcbiAgICAgICAgaGlkZVBvcG92ZXI6IChldmVudCk6IHZvaWQgPT4ge1xuICAgICAgICAgIHRoaXMuaGlkZVBvcG92ZXIoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25BZnRlclZpZXdJbml0OiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5wb3NpdGlvblBvcG92ZXIoKTtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2FtLXBvcG92ZXItaW5uZXItd3JhcHBlcicpWzBdLmNoaWxkcmVuO1xuICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyDpppblhYjmiJHku6zmo4Dmn6XlroPmmK/lkKbljIXlkKvlrZDoioLngrlcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW5baV0uaWQgPSBgJHtpfWA7XG4gICAgICAgICAgICAgIGNoaWxkcmVuW2ldLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5hdXRvQ2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQb3BvdmVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgb3B0aW9uYWxQYXJhbXM6IEFycmF5PGtleW9mIFBvcG92ZXJEaXJlY3RpdmU+ID0gW1xuICAgICAgICAnbWFzaycsXG4gICAgICAgICdzaG93QXJyb3cnLFxuICAgICAgICAncGxhY2VtZW50JyxcbiAgICAgICAgJ2FwcGVuZFRvQm9keScsXG4gICAgICAgICdvdmVybGF5JyxcbiAgICAgICAgJ2NsYXNzTmFtZScsXG4gICAgICAgICdhdXRvQ2xvc2UnXG4gICAgICBdO1xuICAgICAgb3B0aW9uYWxQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpc1twYXJhbV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgKG9wdGlvbnMgYXMgYW55KVtwYXJhbV0gPSB0aGlzW3BhcmFtXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8UG9wb3ZlckNvbXBvbmVudD4gPSB0aGlzLl9jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoUG9wb3ZlckNvbXBvbmVudCk7XG4gICAgICBjb25zdCBjaGlsZEluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKFxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogUG9wb3ZlckNvbXBvbmVudE9wdGlvbnMsXG4gICAgICAgICAgICB1c2VWYWx1ZTogb3B0aW9uc1xuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5wYXJlbnRJbmplY3RvclxuICAgICAgKTtcbiAgICAgIHRoaXMucG9wb3ZlciA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgICBjb21wb25lbnRGYWN0b3J5LFxuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aCxcbiAgICAgICAgY2hpbGRJbmplY3RvclxuICAgICAgKTtcbiAgICAgIGlmIChvcHRpb25zLmFwcGVuZFRvQm9keSkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucG9wb3Zlci5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub25WaXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvblBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9wb3Zlcikge1xuICAgICAgY29uc3QgcG9wb3ZlckVsZW1lbnQgPSB0aGlzLnBvcG92ZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jaGlsZHJlblsxXTtcbiAgICAgIGNvbnN0IHBvcG92ZXJQb3NpdGlvbiA9IFBvc2l0aW9uaW5nLmdldFBvc2l0aW9uRWxlbWVudHMoXG4gICAgICAgIHRoaXMuX2VsbS5uYXRpdmVFbGVtZW50LFxuICAgICAgICBwb3BvdmVyRWxlbWVudCxcbiAgICAgICAgdGhpcy5wb3NpdGlvbk1hcCh0aGlzLnBsYWNlbWVudCkgfHwgdGhpcy5fZGVmYXVsdE9wdGlvbnMucGxhY2VtZW50LFxuICAgICAgICB0aGlzLmFwcGVuZFRvQm9keSB8fCB0aGlzLl9kZWZhdWx0T3B0aW9ucy5hcHBlbmRUb0JvZHlcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wbGFjZW1lbnQgPT09ICdsYW5kU2NhcGUnKSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAndG9wJywgYCR7cG9wb3ZlclBvc2l0aW9uLnRvcH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ2xlZnQnLCBgMHB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnd2lkdGgnLCBgJHt3aW5kb3cuaW5uZXJXaWR0aH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ21heC1oZWlnaHQnLCBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSBwb3BvdmVyUG9zaXRpb24uaGVpZ2h0fXB4YCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGxhY2VtZW50ID09PSAnZnVsbFNjcmVlbicpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICd0b3AnLCBgJHswfXB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnbGVmdCcsIGAwcHhgKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUocG9wb3ZlckVsZW1lbnQsICd3aWR0aCcsIGAke3dpbmRvdy5pbm5lcldpZHRofXB4YCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAnbWF4LWhlaWdodCcsIGAke3dpbmRvdy5pbm5lckhlaWdodCAtIHBvcG92ZXJQb3NpdGlvbi5oZWlnaHR9cHhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKHBvcG92ZXJFbGVtZW50LCAndG9wJywgYCR7cG9wb3ZlclBvc2l0aW9uLnRvcH1weGApO1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShwb3BvdmVyRWxlbWVudCwgJ2xlZnQnLCBgJHtwb3BvdmVyUG9zaXRpb24ubGVmdH1weGApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlkZVBvcG92ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9wb3Zlcikge1xuICAgICAgdGhpcy5wb3BvdmVyLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLnBvcG92ZXI7XG4gICAgICB0aGlzLm9uVmlzaWJsZUNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IFtdO1xuICAgIH1cbiAgfVxufVxuIl19