UNPKG

ngx-amap

Version:

[![npm](https://img.shields.io/npm/v/ngx-amap.svg)][npm-badge-url] [![npm](https://img.shields.io/npm/dm/ngx-amap.svg)][npm-badge-url] [![Build Status](https://travis-ci.org/xieziyu/ngx-amap.svg?branch=master)][ci-url]

526 lines 39.8 kB
/** * @fileoverview added by tsickle * Generated from: directives/amap-marker/amap-marker.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Directive, Input, Output, EventEmitter, ContentChildren, QueryList, NgZone, } from '@angular/core'; import { zip } from 'rxjs'; import { AmapMarkerService } from './amap-marker.service'; import { LoggerService } from '../../shared/logger/logger.service'; import { AMapOverlay, OverlayOptions } from '../../base/amap-overlay'; import { EventBinderService } from '../../shared/event-binder.service'; import { getOptions, ChangeFilter } from '../../utils'; import { PixelService } from '../../shared/pixel.service'; import { IconService } from '../../shared/icon.service'; import { MarkerLabelService } from '../../shared/marker-label.service'; import { AmapInfoWindowComponent } from '../../components/amap-info-window/amap-info-window.component'; import { AMapService } from '../../shared/amap.service'; /** @type {?} */ const TAG = 'amap-marker'; /** @type {?} */ const ALL_OPTIONS = [ ...OverlayOptions, 'position', 'anchor', 'offset', 'icon', 'content', 'topWhenClick', 'raiseOnDrag', 'visible', 'zIndex', 'angle', 'autoRotation', 'animation', 'shadow', 'title', 'shape', 'label', ]; export class AmapMarkerDirective extends AMapOverlay { /** * @param {?} os * @param {?} binder * @param {?} amaps * @param {?} pixels * @param {?} icons * @param {?} mlabels * @param {?} logger * @param {?} ngZone */ constructor(os, binder, amaps, pixels, icons, mlabels, logger, ngZone) { super(os, binder); this.os = os; this.binder = binder; this.amaps = amaps; this.pixels = pixels; this.icons = icons; this.mlabels = mlabels; this.logger = logger; this.ngZone = ngZone; /** * 额外: 是否隐藏 */ this.hidden = false; /** * 额外: 是否包含在点聚合中 */ this.inCluster = false; /** * 额外: 点击时是否显示信息窗体 */ this.openInfoWindow = true; // amap-marker events: this.naReady = new EventEmitter(); // amap info window: this.infoWindowComponent = new QueryList(); this.inited = false; /** @type {?} */ const target = this.os.get(); this.naMouseOut = this.binder.bindEvent(target, 'mouseout'); this.naDragStart = this.binder.bindEvent(target, 'dragstart'); this.naDragging = this.binder.bindEvent(target, 'dragging'); this.naDragEnd = this.binder.bindEvent(target, 'dragend'); this.naMoving = this.binder.bindEvent(target, 'moving'); this.naMoveEnd = this.binder.bindEvent(target, 'moveend'); this.naMoveAlong = this.binder.bindEvent(target, 'movealong'); } /** * @return {?} */ ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } this.os.destroy(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { /** @type {?} */ const filter = ChangeFilter.of(changes); /** @type {?} */ const marker = this.get(); if (!this.inited) { // do not draw marker when no poistion defined. if (!this.position) { return; } this.amaps.get().subscribe((/** * @return {?} */ () => { this.logger.d(TAG, 'initializing ...'); // bind info window events: this.subscription = this.binder.bindEvent(marker, 'click').subscribe((/** * @return {?} */ () => { if (this.openInfoWindow) { this.infoWindowComponent.forEach((/** * @param {?} w * @return {?} */ w => w.open())); } })); /** @type {?} */ const options = getOptions(this, ALL_OPTIONS); if (this.icon) { options.icon = this.icons.create(this.icon); } if (this.shadow) { options.shadow = this.icons.create(this.shadow); } if (this.label) { options.label = this.mlabels.create(this.label); } if (this.offset) { options.offset = this.pixels.create(this.offset); } this.logger.d(TAG, 'options:', options); this.os.create(options, !this.inCluster).subscribe((/** * @param {?} m * @return {?} */ m => { this.ngZone.run((/** * @return {?} */ () => this.naReady.emit(m))); this.logger.d(TAG, 'marker is ready.'); })); this.inited = true; this.updateInfoWindow(); this.updateInfoWindowPosition(); })); } else { zip(filter.has('icon'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setIcon(this.icons.create(v)))); zip(filter.has('shadow'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setShadow(this.icons.create(v)))); zip(filter.has('label'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setLabel(this.mlabels.create(v)))); zip(filter.has('title'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setTitle(v))); zip(filter.has('content'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setContent(v))); zip(filter.has('extData'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setExtData(v))); zip(filter.has('clickable'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setClickable(!!v))); zip(filter.has('draggable'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setDraggable(!!v))); zip(filter.has('visible'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => (v ? m.show() : m.hide()))); zip(filter.has('cursor'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setCursor(v))); zip(filter.has('animation'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setAnimation(v))); zip(filter.has('angle'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setAngle(v))); zip(filter.has('zIndex'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setzIndex(v))); zip(filter.has('shape'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setShape(v))); zip(filter.notEmpty('offset'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setOffset(this.pixels.create(v)))); zip(filter.notEmpty('position'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setPosition(v))); } zip(filter.has('isTop'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => m.setTop(!!v))); zip(filter.has('hidden'), marker).subscribe((/** * @param {?} __0 * @return {?} */ ([v, m]) => (v ? m.hide() : m.show()))); } /** * @return {?} */ ngAfterContentInit() { this.updateInfoWindow(); this.infoWindowComponent.changes.subscribe((/** * @return {?} */ () => this.updateInfoWindow())); } /** * @private * @return {?} */ updateInfoWindow() { if (this.infoWindowComponent && this.inited) { if (this.infoWindowComponent.length > 1) { this.logger.e(TAG, 'Expected no more than 1 info window.'); return; } /** @type {?} */ const marker = this.os.get(); this.infoWindowComponent.forEach((/** * @param {?} component * @return {?} */ component => { component.hostMarker = marker; })); } } /** * @private * @return {?} */ updateInfoWindowPosition() { if (this.infoWindowComponent && this.inited) { this.infoWindowComponent.forEach((/** * @param {?} component * @return {?} */ component => { component.toggleOpen(); })); } } /** * 获取已创建的 AMap.Marker 对象 * @return {?} */ get() { return this.os.get(); } } AmapMarkerDirective.decorators = [ { type: Directive, args: [{ selector: 'amap-marker', exportAs: 'marker', providers: [AmapMarkerService], },] } ]; /** @nocollapse */ AmapMarkerDirective.ctorParameters = () => [ { type: AmapMarkerService }, { type: EventBinderService }, { type: AMapService }, { type: PixelService }, { type: IconService }, { type: MarkerLabelService }, { type: LoggerService }, { type: NgZone } ]; AmapMarkerDirective.propDecorators = { position: [{ type: Input }], anchor: [{ type: Input }], offset: [{ type: Input }], icon: [{ type: Input }], content: [{ type: Input }], topWhenClick: [{ type: Input }], raiseOnDrag: [{ type: Input }], visible: [{ type: Input }], zIndex: [{ type: Input }], angle: [{ type: Input }], autoRotation: [{ type: Input }], animation: [{ type: Input }], shadow: [{ type: Input }], title: [{ type: Input }], shape: [{ type: Input }], label: [{ type: Input }], isTop: [{ type: Input }], hidden: [{ type: Input }], inCluster: [{ type: Input }], openInfoWindow: [{ type: Input }], naReady: [{ type: Output }], naMouseOut: [{ type: Output }], naDragStart: [{ type: Output }], naDragging: [{ type: Output }], naDragEnd: [{ type: Output }], naMoving: [{ type: Output }], naMoveEnd: [{ type: Output }], naMoveAlong: [{ type: Output }], infoWindowComponent: [{ type: ContentChildren, args: [AmapInfoWindowComponent,] }] }; if (false) { /** * 点标记在地图上显示的位置 * @type {?} */ AmapMarkerDirective.prototype.position; /** * 标记锚点 * @type {?} */ AmapMarkerDirective.prototype.anchor; /** * 点标记显示位置偏移量 * @type {?} */ AmapMarkerDirective.prototype.offset; /** * 需在点标记中显示的图标 * @type {?} */ AmapMarkerDirective.prototype.icon; /** * 点标记显示内容 * @type {?} */ AmapMarkerDirective.prototype.content; /** * 鼠标点击时marker是否置顶 * @type {?} */ AmapMarkerDirective.prototype.topWhenClick; /** * 拖拽点标记时是否开启点标记离开地图的效果 * @type {?} */ AmapMarkerDirective.prototype.raiseOnDrag; /** * 点标记是否可见 * @type {?} */ AmapMarkerDirective.prototype.visible; /** * 点标记的叠加顺序 * @type {?} */ AmapMarkerDirective.prototype.zIndex; /** * 点标记的旋转角度 * @type {?} */ AmapMarkerDirective.prototype.angle; /** * 是否自动旋转 * @type {?} */ AmapMarkerDirective.prototype.autoRotation; /** * 点标记的动画效果 * @type {?} */ AmapMarkerDirective.prototype.animation; /** * 点标记阴影 * @type {?} */ AmapMarkerDirective.prototype.shadow; /** * 鼠标滑过点标记时的文字提示 * @type {?} */ AmapMarkerDirective.prototype.title; /** * 可点击区域 * @type {?} */ AmapMarkerDirective.prototype.shape; /** * 文本标注 * @type {?} */ AmapMarkerDirective.prototype.label; /** * 额外: 是否置顶 * @type {?} */ AmapMarkerDirective.prototype.isTop; /** * 额外: 是否隐藏 * @type {?} */ AmapMarkerDirective.prototype.hidden; /** * 额外: 是否包含在点聚合中 * @type {?} */ AmapMarkerDirective.prototype.inCluster; /** * 额外: 点击时是否显示信息窗体 * @type {?} */ AmapMarkerDirective.prototype.openInfoWindow; /** @type {?} */ AmapMarkerDirective.prototype.naReady; /** @type {?} */ AmapMarkerDirective.prototype.naMouseOut; /** @type {?} */ AmapMarkerDirective.prototype.naDragStart; /** @type {?} */ AmapMarkerDirective.prototype.naDragging; /** @type {?} */ AmapMarkerDirective.prototype.naDragEnd; /** @type {?} */ AmapMarkerDirective.prototype.naMoving; /** @type {?} */ AmapMarkerDirective.prototype.naMoveEnd; /** @type {?} */ AmapMarkerDirective.prototype.naMoveAlong; /** @type {?} */ AmapMarkerDirective.prototype.infoWindowComponent; /** * @type {?} * @private */ AmapMarkerDirective.prototype.inited; /** * @type {?} * @private */ AmapMarkerDirective.prototype.subscription; /** * @type {?} * @protected */ AmapMarkerDirective.prototype.os; /** * @type {?} * @protected */ AmapMarkerDirective.prototype.binder; /** * @type {?} * @private */ AmapMarkerDirective.prototype.amaps; /** * @type {?} * @private */ AmapMarkerDirective.prototype.pixels; /** * @type {?} * @private */ AmapMarkerDirective.prototype.icons; /** * @type {?} * @private */ AmapMarkerDirective.prototype.mlabels; /** * @type {?} * @private */ AmapMarkerDirective.prototype.logger; /** * @type {?} * @private */ AmapMarkerDirective.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1hcC1tYXJrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFtYXAvIiwic291cmNlcyI6WyJkaXJlY3RpdmVzL2FtYXAtbWFya2VyL2FtYXAtbWFya2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLE1BQU0sRUFDTixZQUFZLEVBR1osZUFBZSxFQUNmLFNBQVMsRUFFVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7O01BRWxELEdBQUcsR0FBRyxhQUFhOztNQUNuQixXQUFXLEdBQUc7SUFDbEIsR0FBRyxjQUFjO0lBQ2pCLFVBQVU7SUFDVixRQUFRO0lBQ1IsUUFBUTtJQUNSLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGFBQWE7SUFDYixTQUFT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Q0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNuQyxDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUM5RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBTSxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFNLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDL0UsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7WUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVUsU0FBUyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUM7WUFDN0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsUUFBUSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUNoRixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBcUIsV0FBVyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1RSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNsQixDQUFDO1lBQ0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztZQUM5RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBUyxRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ2hGLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFtQixPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1lBQ3hGLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFzQixRQUFRLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQy9FLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbkMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFxQixVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2hGLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQ2pCLENBQUM7U0FDSDtRQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO1FBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFVLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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OztJQUN2QywwQ0FBeUM7O0lBR3pDLGtEQUMrRDs7Ozs7SUFFL0QscUNBQXVCOzs7OztJQUN2QiwyQ0FBbUM7Ozs7O0lBR2pDLGlDQUErQjs7Ozs7SUFDL0IscUNBQW9DOzs7OztJQUNwQyxvQ0FBMEI7Ozs7O0lBQzFCLHFDQUE0Qjs7Ozs7SUFDNUIsb0NBQTBCOzs7OztJQUMxQixzQ0FBbUM7Ozs7O0lBQ25DLHFDQUE2Qjs7Ozs7SUFDN0IscUNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25DaGFuZ2VzLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgTmdab25lLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHppcCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBbWFwTWFya2VyU2VydmljZSB9IGZyb20gJy4vYW1hcC1tYXJrZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xvZ2dlci9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBTWFwT3ZlcmxheSwgT3ZlcmxheU9wdGlvbnMgfSBmcm9tICcuLi8uLi9iYXNlL2FtYXAtb3ZlcmxheSc7XG5pbXBvcnQgeyBFdmVudEJpbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvZXZlbnQtYmluZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0T3B0aW9ucywgQ2hhbmdlRmlsdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgSVBpeGVsLCBJSWNvbiwgSU1hcmtlckxhYmVsIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBQaXhlbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGl4ZWwuc2VydmljZSc7XG5pbXBvcnQgeyBJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9pY29uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFya2VyTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hcmtlci1sYWJlbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFtYXBJbmZvV2luZG93Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9hbWFwLWluZm8td2luZG93L2FtYXAtaW5mby13aW5kb3cuY29tcG9uZW50JztcbmltcG9ydCB7IEFNYXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FtYXAuc2VydmljZSc7XG5cbmNvbnN0IFRBRyA9ICdhbWFwLW1hcmtlcic7XG5jb25zdCBBTExfT1BUSU9OUyA9IFtcbiAgLi4uT3ZlcmxheU9wdGlvbnMsXG4gICdwb3NpdGlvbicsXG4gICdhbmNob3InLFxuICAnb2Zmc2V0JyxcbiAgJ2ljb24nLFxuICAnY29udGVudCcsXG4gICd0b3BXaGVuQ2xpY2snLFxuICAncmFpc2VPbkRyYWcnLFxuICAndmlzaWJsZScsXG4gICd6SW5kZXgnLFxuICAnYW5nbGUnLFxuICAnYXV0b1JvdGF0aW9uJyxcbiAgJ2FuaW1hdGlvbicsXG4gICdzaGFkb3cnLFxuICAndGl0bGUnLFxuICAnc2hhcGUnLFxuICAnbGFiZWwnLFxuXTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnYW1hcC1tYXJrZXInLFxuICBleHBvcnRBczogJ21hcmtlcicsXG4gIHByb3ZpZGVyczogW0FtYXBNYXJrZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgQW1hcE1hcmtlckRpcmVjdGl2ZSBleHRlbmRzIEFNYXBPdmVybGF5PEFNYXAuTWFya2VyPlxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcbiAgLy8gLS0tLSBNYXJrZXIgT3B0aW9ucyAtLS0tXG4gIC8qKlxuICAgKiDngrnmoIforrDlnKjlnLDlm77kuIrmmL7npLrnmoTkvY3nva5cbiAgICovXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBBTWFwLkxvY2F0aW9uVmFsdWU7XG4gIC8qKlxuICAgKiDmoIforrDplJrngrlcbiAgICovXG4gIEBJbnB1dCgpIGFuY2hvcjogQU1hcC5NYXJrZXIuQW5jaG9yO1xuICAvKipcbiAgICog54K55qCH6K6w5pi+56S65L2N572u5YGP56e76YePXG4gICAqL1xuICBASW5wdXQoKSBvZmZzZXQ6IEFNYXAuUGl4ZWwgfCBJUGl4ZWw7XG4gIC8qKlxuICAgKiDpnIDlnKjngrnmoIforrDkuK3mmL7npLrnmoTlm77moIdcbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZyB8IEFNYXAuSWNvbiB8IElJY29uO1xuICAvKipcbiAgICog54K55qCH6K6w5pi+56S65YaF5a65XG4gICAqL1xuICBASW5wdXQoKSBjb250ZW50OiBzdHJpbmcgfCBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIOm8oOagh+eCueWHu+aXtm1hcmtlcuaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgdG9wV2hlbkNsaWNrOiBib29sZWFuO1xuICAvKipcbiAgICog5ouW5ou954K55qCH6K6w5pe25piv5ZCm5byA5ZCv54K55qCH6K6w56a75byA5Zyw5Zu+55qE5pWI5p6cXG4gICAqL1xuICBASW5wdXQoKSByYWlzZU9uRHJhZzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOaYr+WQpuWPr+ingVxuICAgKi9cbiAgQElucHV0KCkgdmlzaWJsZTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWPoOWKoOmhuuW6j1xuICAgKi9cbiAgQElucHV0KCkgekluZGV4OiBudW1iZXI7XG4gIC8qKlxuICAgKiDngrnmoIforrDnmoTml4vovazop5LluqZcbiAgICovXG4gIEBJbnB1dCgpIGFuZ2xlOiBudW1iZXI7XG4gIC8qKlxuICAgKiDmmK/lkKboh6rliqjml4vovaxcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9Sb3RhdGlvbjogYm9vbGVhbjtcbiAgLyoqXG4gICAqIOeCueagh+iusOeahOWKqOeUu+aViOaenFxuICAgKi9cbiAgQElucHV0KCkgYW5pbWF0aW9uOiBBTWFwLkFuaW1hdGlvbk5hbWU7XG4gIC8qKlxuICAgKiDngrnmoIforrDpmLTlvbFcbiAgICovXG4gIEBJbnB1dCgpIHNoYWRvdzogQU1hcC5JY29uIHwgc3RyaW5nIHwgSUljb247XG4gIC8qKlxuICAgKiDpvKDmoIfmu5Hov4fngrnmoIforrDml7bnmoTmloflrZfmj5DnpLpcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiDlj6/ngrnlh7vljLrln59cbiAgICovXG4gIEBJbnB1dCgpIHNoYXBlOiBBTWFwLk1hcmtlclNoYXBlO1xuICAvKipcbiAgICog5paH5pys5qCH5rOoXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogQU1hcC5NYXJrZXIuTGFiZWwgfCBJTWFya2VyTGFiZWw7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpue9rumhtlxuICAgKi9cbiAgQElucHV0KCkgaXNUb3A6IGJvb2xlYW47XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpumakOiXj1xuICAgKi9cbiAgQElucHV0KCkgaGlkZGVuID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOaYr+WQpuWMheWQq+WcqOeCueiBmuWQiOS4rVxuICAgKi9cbiAgQElucHV0KCkgaW5DbHVzdGVyID0gZmFsc2U7XG4gIC8qKlxuICAgKiDpop3lpJY6IOeCueWHu+aXtuaYr+WQpuaYvuekuuS/oeaBr+eql+S9k1xuICAgKi9cbiAgQElucHV0KCkgb3BlbkluZm9XaW5kb3cgPSB0cnVlO1xuXG4gIC8vIGFtYXAtbWFya2VyIGV2ZW50czpcbiAgQE91dHB1dCgpIG5hUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBuYU1vdXNlT3V0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hRHJhZ2dpbmc6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCkgbmFEcmFnRW5kOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92aW5nOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgpIG5hTW92ZUVuZDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoKSBuYU1vdmVBbG9uZzogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gYW1hcCBpbmZvIHdpbmRvdzpcbiAgQENvbnRlbnRDaGlsZHJlbihBbWFwSW5mb1dpbmRvd0NvbXBvbmVudClcbiAgaW5mb1dpbmRvd0NvbXBvbmVudCA9IG5ldyBRdWVyeUxpc3Q8QW1hcEluZm9XaW5kb3dDb21wb25lbnQ+KCk7XG5cbiAgcHJpdmF0ZSBpbml0ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgb3M6IEFtYXBNYXJrZXJTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBiaW5kZXI6IEV2ZW50QmluZGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFtYXBzOiBBTWFwU2VydmljZSxcbiAgICBwcml2YXRlIHBpeGVsczogUGl4ZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvbnM6IEljb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWxhYmVsczogTWFya2VyTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICkge1xuICAgIHN1cGVyKG9zLCBiaW5kZXIpO1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMub3MuZ2V0KCk7XG4gICAgdGhpcy5uYU1vdXNlT3V0ID0gdGhpcy5iaW5kZXIuYmluZEV2ZW50KHRhcmdldCwgJ21vdXNlb3V0Jyk7XG4gICAgdGhpcy5uYURyYWdTdGFydCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnc3RhcnQnKTtcbiAgICB0aGlzLm5hRHJhZ2dpbmcgPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQodGFyZ2V0LCAnZHJhZ2dpbmcnKTtcbiAgICB0aGlzLm5hRHJhZ0VuZCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdkcmFnZW5kJyk7XG4gICAgdGhpcy5uYU1vdmluZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZpbmcnKTtcbiAgICB0aGlzLm5hTW92ZUVuZCA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZlZW5kJyk7XG4gICAgdGhpcy5uYU1vdmVBbG9uZyA9IHRoaXMuYmluZGVyLmJpbmRFdmVudCh0YXJnZXQsICdtb3ZlYWxvbmcnKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5vcy5kZXN0cm95KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgY29uc3QgZmlsdGVyID0gQ2hhbmdlRmlsdGVyLm9mKGNoYW5nZXMpO1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKCF0aGlzLmluaXRlZCkge1xuICAgICAgLy8gZG8gbm90IGRyYXcgbWFya2VyIHdoZW4gbm8gcG9pc3Rpb24gZGVmaW5lZC5cbiAgICAgIGlmICghdGhpcy5wb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmFtYXBzLmdldCgpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnaW5pdGlhbGl6aW5nIC4uLicpO1xuICAgICAgICAvLyBiaW5kIGluZm8gd2luZG93IGV2ZW50czpcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSB0aGlzLmJpbmRlci5iaW5kRXZlbnQobWFya2VyLCAnY2xpY2snKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9wZW5JbmZvV2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuZm9yRWFjaCh3ID0+IHcub3BlbigpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0T3B0aW9uczxBTWFwLk1hcmtlci5PcHRpb25zPih0aGlzLCBBTExfT1BUSU9OUyk7XG4gICAgICAgIGlmICh0aGlzLmljb24pIHtcbiAgICAgICAgICBvcHRpb25zLmljb24gPSB0aGlzLmljb25zLmNyZWF0ZSh0aGlzLmljb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRvdykge1xuICAgICAgICAgIG9wdGlvbnMuc2hhZG93ID0gdGhpcy5pY29ucy5jcmVhdGUodGhpcy5zaGFkb3cpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICAgICAgb3B0aW9ucy5sYWJlbCA9IHRoaXMubWxhYmVscy5jcmVhdGUodGhpcy5sYWJlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub2Zmc2V0KSB7XG4gICAgICAgICAgb3B0aW9ucy5vZmZzZXQgPSB0aGlzLnBpeGVscy5jcmVhdGUodGhpcy5vZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmQoVEFHLCAnb3B0aW9uczonLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5vcy5jcmVhdGUob3B0aW9ucywgIXRoaXMuaW5DbHVzdGVyKS5zdWJzY3JpYmUobSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMubmFSZWFkeS5lbWl0KG0pKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kKFRBRywgJ21hcmtlciBpcyByZWFkeS4nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVJbmZvV2luZG93KCk7XG4gICAgICAgIHRoaXMudXBkYXRlSW5mb1dpbmRvd1Bvc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uIHwgSUljb24+KCdpY29uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0SWNvbih0aGlzLmljb25zLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nIHwgQU1hcC5JY29uPignc2hhZG93JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0U2hhZG93KHRoaXMuaWNvbnMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlci5MYWJlbCB8IElNYXJrZXJMYWJlbD4oJ2xhYmVsJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0TGFiZWwodGhpcy5tbGFiZWxzLmNyZWF0ZSh2KSksXG4gICAgICApO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPigndGl0bGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUaXRsZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxhbnk+KCdjb250ZW50JyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q29udGVudCh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxhbnk+KCdleHREYXRhJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0RXh0RGF0YSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignY2xpY2thYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q2xpY2thYmxlKCEhdikpO1xuICAgICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2RyYWdnYWJsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldERyYWdnYWJsZSghIXYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPGJvb2xlYW4+KCd2aXNpYmxlJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+ICh2ID8gbS5zaG93KCkgOiBtLmhpZGUoKSkpO1xuICAgICAgemlwKGZpbHRlci5oYXM8c3RyaW5nPignY3Vyc29yJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+IG0uc2V0Q3Vyc29yKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPEFNYXAuQW5pbWF0aW9uTmFtZT4oJ2FuaW1hdGlvbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PlxuICAgICAgICBtLnNldEFuaW1hdGlvbih2KSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxudW1iZXI+KCdhbmdsZScpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldEFuZ2xlKHYpKTtcbiAgICAgIHppcChmaWx0ZXIuaGFzPG51bWJlcj4oJ3pJbmRleCcpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiBtLnNldHpJbmRleCh2KSk7XG4gICAgICB6aXAoZmlsdGVyLmhhczxBTWFwLk1hcmtlclNoYXBlPignc2hhcGUnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRTaGFwZSh2KSk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuUGl4ZWwgfCBJUGl4ZWw+KCdvZmZzZXQnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT5cbiAgICAgICAgbS5zZXRPZmZzZXQodGhpcy5waXhlbHMuY3JlYXRlKHYpKSxcbiAgICAgICk7XG4gICAgICB6aXAoZmlsdGVyLm5vdEVtcHR5PEFNYXAuTG9jYXRpb25WYWx1ZT4oJ3Bvc2l0aW9uJyksIG1hcmtlcikuc3Vic2NyaWJlKChbdiwgbV0pID0+XG4gICAgICAgIG0uc2V0UG9zaXRpb24odiksXG4gICAgICApO1xuICAgIH1cbiAgICB6aXAoZmlsdGVyLmhhczxib29sZWFuPignaXNUb3AnKSwgbWFya2VyKS5zdWJzY3JpYmUoKFt2LCBtXSkgPT4gbS5zZXRUb3AoISF2KSk7XG4gICAgemlwKGZpbHRlci5oYXM8Ym9vbGVhbj4oJ2hpZGRlbicpLCBtYXJrZXIpLnN1YnNjcmliZSgoW3YsIG1dKSA9PiAodiA/IG0uaGlkZSgpIDogbS5zaG93KCkpKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZUluZm9XaW5kb3coKTtcbiAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVJbmZvV2luZG93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmZvV2luZG93KCkge1xuICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQgJiYgdGhpcy5pbml0ZWQpIHtcbiAgICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLmxvZ2dlci5lKFRBRywgJ0V4cGVjdGVkIG5vIG1vcmUgdGhhbiAxIGluZm8gd2luZG93LicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMub3MuZ2V0KCk7XG4gICAgICB0aGlzLmluZm9XaW5kb3dDb21wb25lbnQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICBjb21wb25lbnQuaG9zdE1hcmtlciA9IG1hcmtlcjtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5mb1dpbmRvd1Bvc2l0aW9uKCkge1xuICAgIGlmICh0aGlzLmluZm9XaW5kb3dDb21wb25lbnQgJiYgdGhpcy5pbml0ZWQpIHtcbiAgICAgIHRoaXMuaW5mb1dpbmRvd0NvbXBvbmVudC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC50b2dnbGVPcGVuKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6I635Y+W5bey5Yib5bu655qEIEFNYXAuTWFya2VyIOWvueixoVxuICAgKi9cbiAgZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLm9zLmdldCgpO1xuICB9XG59XG4iXX0=