@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
469 lines • 47.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: services/drag-drop.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, NgZone } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { DragDropTouch } from '../touch-support/dragdrop-touch';
import { Utils } from '../shared/utils';
var DragDropService = /** @class */ (function () {
function DragDropService(ngZone) {
var _this = this;
this.ngZone = ngZone;
this.dropTargets = [];
this.dropEvent = new Subject();
this.dragEndEvent = new Subject();
this.dragStartEvent = new Subject();
this.subscription = Observable.create().subscribe();
this.dragEmptyImage = new Image();
this.dragItemParentName = '';
this.dragItemChildrenName = '';
this.intersectionObserver = null;
/*协同拖拽需要 */
this.dragElShowHideEvent = new Subject();
this.followMouse4CloneNode = (/**
* @param {?} event
* @return {?}
*/
function (event) {
var _a = _this.dragOffset, offsetLeft = _a.offsetLeft, offsetTop = _a.offsetTop;
var clientX = event.clientX, clientY = event.clientY;
requestAnimationFrame((/**
* @return {?}
*/
function () {
if (!_this.dragCloneNode) {
return;
}
_this.dragCloneNode.style.left = clientX - offsetLeft + 'px';
_this.dragCloneNode.style.top = clientY - offsetTop + 'px';
}));
});
this.touchInstance = DragDropTouch.getInstance();
// service not support OnInit, only support OnDestroy, so write in constructor
// tslint:disable-next-line: max-line-length
this.dragEmptyImage.src = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=='; // safari的img必须要有src
}
/**
* @return {?}
*/
DragDropService.prototype.newSubscription = /**
* @return {?}
*/
function () {
this.subscription.unsubscribe();
return this.subscription = Observable.create().subscribe();
};
/**
* @return {?}
*/
DragDropService.prototype.enableDraggedCloneNodeFollowMouse = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.dragCloneNode) {
this.dragItemContainer = this.draggedEl.parentElement;
if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) {
this.dragPreviewDirective.createPreview();
this.dragCloneNode = this.dragPreviewDirective.getPreviewElement();
this.dragItemContainer = document.body;
}
else {
this.dragCloneNode = this.draggedEl.cloneNode(true);
}
this.dragCloneNode.style.margin = '0';
if (this.dragFollowOptions && this.dragFollowOptions.appendToBody) {
this.dragItemContainer = document.body;
this.copyStyle(this.draggedEl, this.dragCloneNode);
}
if (this.dragItemChildrenName !== '') {
/** @type {?} */
var parentElement = this.dragItemParentName === '' ? this.dragCloneNode : document.querySelector(this.dragItemParentName);
/** @type {?} */
var dragItemChildren = parentElement.querySelectorAll(this.dragItemChildrenName);
this.interceptChildNode(parentElement, dragItemChildren);
}
// 拷贝canvas的内容
/** @type {?} */
var originCanvasArr_1 = this.draggedEl.querySelectorAll('canvas');
/** @type {?} */
var targetCanvasArr = this.dragCloneNode.querySelectorAll('canvas');
[].forEach.call(targetCanvasArr, (/**
* @param {?} canvas
* @param {?} index
* @return {?}
*/
function (canvas, index) {
canvas.getContext('2d').drawImage(originCanvasArr_1[index], 0, 0);
}));
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
document.addEventListener('dragover', _this.followMouse4CloneNode, { capture: true, passive: true });
}));
this.dragCloneNode.style.width = this.dragOffset.width + 'px';
this.dragCloneNode.style.height = this.dragOffset.height + 'px';
if (!(this.dragPreviewDirective
&& this.dragPreviewDirective.dragPreviewTemplate
&& this.dragPreviewDirective.dragPreviewOptions
&& this.dragPreviewDirective.dragPreviewOptions.skipBatchPreview)) {
// 批量拖拽样式
if (this.batchDragging && this.batchDragData && this.batchDragData.length > 1) {
// 创建一个节点容器
/** @type {?} */
var node = document.createElement('div');
node.appendChild(this.dragCloneNode);
node.classList.add('batch-dragged-node');
/* 计数样式定位 */
if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('badge') > -1) {
/** @type {?} */
var badge = document.createElement('div');
badge.innerText = this.batchDragData.length + '';
badge.classList.add('batch-dragged-node-count');
node.style.position = 'relative';
/** @type {?} */
var style = {
position: 'absolute',
right: '5px',
top: '-12px',
height: '24px',
width: '24px',
borderRadius: '12px',
fontSize: '14px',
lineHeight: '24px',
textAlign: 'center',
color: '#fff',
background: ['#5170ff', 'var(--brand-1, #5170ff)']
};
Utils.addElStyles(badge, style);
node.appendChild(badge);
}
/* 层叠感样式定位 */
if (this.batchDragStyle && this.batchDragStyle.length && this.batchDragStyle.indexOf('stack') > -1) {
/** @type {?} */
var stack = 2;
if (this.batchDragData.length === 2) {
stack = 1;
}
for (var i = 0; i < stack; i++) {
/** @type {?} */
var stackNode = this.dragCloneNode.cloneNode(false);
/** @type {?} */
var stackStyle = {
position: 'absolute',
left: -5 * (i + 1) + 'px',
top: -5 * (i + 1) + 'px',
zIndex: -(i + 1) + '',
width: this.dragOffset.width + 'px',
height: this.dragOffset.height + 'px',
background: '#fff',
border: ['1px solid #5170ff', '1px solid var(--brand-1, #5170ff)']
};
Utils.addElStyles(stackNode, stackStyle);
node.appendChild(stackNode);
}
}
this.dragCloneNode = node;
}
}
this.dragCloneNode.classList.add('drag-clone-node');
if (!(this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate)) {
this.dragCloneNode.style.width = this.dragOffset.width + 'px';
this.dragCloneNode.style.height = this.dragOffset.height + 'px';
}
this.dragCloneNode.style.position = 'fixed';
this.dragCloneNode.style.zIndex = '1090';
this.dragCloneNode.style.pointerEvents = 'none';
this.dragCloneNode.style.top = this.dragOffset.top + 'px';
this.dragCloneNode.style.left = this.dragOffset.left + 'px';
this.dragCloneNode.style.willChange = 'left, top';
this.dragItemContainer.appendChild(this.dragCloneNode);
this.ngZone.runOutsideAngular((/**
* @return {?}
*/
function () {
setTimeout((/**
* @return {?}
*/
function () {
if (_this.draggedEl) {
_this.draggedEl.style.display = 'none';
_this.dragElShowHideEvent.next(false);
if (_this.dragOriginPlaceholder) {
_this.dragOriginPlaceholder.style.display = 'block';
}
}
}));
}));
}
};
/**
* @return {?}
*/
DragDropService.prototype.disableDraggedCloneNodeFollowMouse = /**
* @return {?}
*/
function () {
if (this.dragCloneNode) {
document.removeEventListener('dragover', this.followMouse4CloneNode, { capture: true });
this.dragItemContainer.removeChild(this.dragCloneNode);
this.draggedEl.style.display = '';
this.dragElShowHideEvent.next(true);
}
if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) {
this.dragPreviewDirective.destroyPreview();
}
this.dragCloneNode = undefined;
this.dragItemContainer = undefined;
if (this.intersectionObserver) {
this.intersectionObserver.disconnect();
}
};
/**
* @param {?} parentNode
* @param {?} childNodeList
* @return {?}
*/
DragDropService.prototype.interceptChildNode = /**
* @param {?} parentNode
* @param {?} childNodeList
* @return {?}
*/
function (parentNode, childNodeList) {
var _this = this;
/** @type {?} */
var interceptOptions = {
root: parentNode
};
this.intersectionObserver = new IntersectionObserver(this.setChildNodeHide, interceptOptions);
[].forEach.call(childNodeList, (/**
* @param {?} childNode
* @return {?}
*/
function (childNode) {
_this.intersectionObserver.observe(childNode);
}));
};
/**
* @param {?} entries
* @return {?}
*/
DragDropService.prototype.setChildNodeHide = /**
* @param {?} entries
* @return {?}
*/
function (entries) {
entries.forEach((/**
* @param {?} element
* @return {?}
*/
function (element) {
var isIntersecting = element.isIntersecting, childNode = element.target;
if (isIntersecting) {
childNode.style.display = 'block';
}
else {
childNode.style.display = 'none';
}
}));
};
/**
* @param {?=} identity
* @param {?=} order
* @return {?}
*/
DragDropService.prototype.getBatchDragData = /**
* @param {?=} identity
* @param {?=} order
* @return {?}
*/
function (identity, order) {
if (order === void 0) { order = 'draggedElFirst'; }
/** @type {?} */
var result = this.batchDragData.map((/**
* @param {?} dragData
* @return {?}
*/
function (dragData) { return dragData.dragData; }));
if (typeof order === 'function') {
result.sort((/** @type {?} */ (order)));
}
else if (order === 'draggedElFirst') {
/** @type {?} */
var dragData = this.dragData;
if (identity) {
/** @type {?} */
var realDragData = this.batchDragData.filter((/**
* @param {?} dd
* @return {?}
*/
function (dd) { return dd.identity === identity; })).pop().dragData;
dragData = realDragData;
}
result.splice(result.indexOf(dragData), 1);
result.splice(0, 0, dragData);
}
return result;
};
/** usage:
* constructor(..., private dragDropService: DragDropService) {}
* cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); }
*/
/**
* usage:
* constructor(..., private dragDropService: DragDropService) {}
* cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); }
* @return {?}
*/
DragDropService.prototype.cleanBatchDragData = /**
* usage:
* constructor(..., private dragDropService: DragDropService) {}
* cleanBatchDragData() { this.dragDropService.cleanBatchDragData(); }
* @return {?}
*/
function () {
/** @type {?} */
var batchDragData = this.batchDragData;
if (this.batchDragData) {
this.batchDragData
.filter((/**
* @param {?} dragData
* @return {?}
*/
function (dragData) { return dragData.draggable; }))
.map((/**
* @param {?} dragData
* @return {?}
*/
function (dragData) { return dragData.draggable; }))
.forEach((/**
* @param {?} draggable
* @return {?}
*/
function (draggable) { return draggable.batchDraggable.dragData = undefined; }));
this.batchDragData = undefined;
this.batchDragGroup = undefined;
}
return batchDragData;
};
/**
* @param {?} source
* @param {?} target
* @return {?}
*/
DragDropService.prototype.copyStyle = /**
* @param {?} source
* @param {?} target
* @return {?}
*/
function (source, target) {
['id', 'class', 'style', 'draggable'].forEach((/**
* @param {?} att
* @return {?}
*/
function (att) {
target.removeAttribute(att);
}));
// copy style (without transitions)
/** @type {?} */
var computedStyle = getComputedStyle(source);
for (var i = 0; i < computedStyle.length; i++) {
/** @type {?} */
var key = computedStyle[i];
if (key.indexOf('transition') < 0) {
target.style[key] = computedStyle[key];
}
}
target.style.pointerEvents = 'none';
// and repeat for all children
for (var i = 0; i < source.children.length; i++) {
this.copyStyle(source.children[i], target.children[i]);
}
};
DragDropService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
DragDropService.ctorParameters = function () { return [
{ type: NgZone }
]; };
return DragDropService;
}());
export { DragDropService };
if (false) {
/** @type {?} */
DragDropService.prototype.dragData;
/** @type {?} */
DragDropService.prototype.draggedEl;
/** @type {?} */
DragDropService.prototype.draggedElIdentity;
/** @type {?} */
DragDropService.prototype.batchDragData;
/** @type {?} */
DragDropService.prototype.batchDragGroup;
/** @type {?} */
DragDropService.prototype.batchDragStyle;
/** @type {?} */
DragDropService.prototype.batchDragging;
/** @type {?} */
DragDropService.prototype.scope;
/** @type {?} */
DragDropService.prototype.dropTargets;
/** @type {?} */
DragDropService.prototype.dropEvent;
/** @type {?} */
DragDropService.prototype.dragEndEvent;
/** @type {?} */
DragDropService.prototype.dragStartEvent;
/** @type {?} */
DragDropService.prototype.dropOnItem;
/** @type {?} */
DragDropService.prototype.dragFollow;
/** @type {?} */
DragDropService.prototype.dragFollowOptions;
/** @type {?} */
DragDropService.prototype.dropOnOrigin;
/** @type {?} */
DragDropService.prototype.draggedElFollowingMouse;
/** @type {?} */
DragDropService.prototype.dragOffset;
/** @type {?} */
DragDropService.prototype.subscription;
/** @type {?} */
DragDropService.prototype.dragEmptyImage;
/** @type {?} */
DragDropService.prototype.dragCloneNode;
/** @type {?} */
DragDropService.prototype.dragOriginPlaceholder;
/** @type {?} */
DragDropService.prototype.dragItemContainer;
/** @type {?} */
DragDropService.prototype.dragItemParentName;
/** @type {?} */
DragDropService.prototype.dragItemChildrenName;
/** @type {?} */
DragDropService.prototype.intersectionObserver;
/** @type {?} */
DragDropService.prototype.sub;
/** @type {?} */
DragDropService.prototype.dragOriginPlaceholderNextSibling;
/** @type {?} */
DragDropService.prototype.touchInstance;
/** @type {?} */
DragDropService.prototype.dragElShowHideEvent;
/** @type {?} */
DragDropService.prototype.dragSyncGroupDirectives;
/** @type {?} */
DragDropService.prototype.dragPreviewDirective;
/** @type {?} */
DragDropService.prototype.followMouse4CloneNode;
/**
* @type {?}
* @private
*/
DragDropService.prototype.ngZone;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kcmFnZHJvcC8iLCJzb3VyY2VzIjpbInNlcnZpY2VzL2RyYWctZHJvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHeEM7SUFtREUseUJBQW9CLE1BQWM7UUFBbEMsaUJBS0M7UUFMbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXJDbEMsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsY0FBUyxHQUFpQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNsQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFnQnBDLGlCQUFZLEdBQWlCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3RCxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFJN0IsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix5QkFBb0IsR0FBUSxJQUFJLENBQUM7O1FBTWpDLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFnTDdDLDBCQUFxQjs7OztRQUFHLFVBQUMsS0FBSztZQUN0QixJQUFBLHFCQUF5QyxFQUF4QywwQkFBVSxFQUFFLHdCQUE0QjtZQUN4QyxJQUFBLHVCQUFPLEVBQUUsdUJBQU87WUFDdkIscUJBQXFCOzs7WUFBQztnQkFDcEIsSUFBSSxDQUFD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QTZDOztJQUM3QyxrREFBd0I7O0lBRXhCLCtDQUEyQzs7SUE2SzNDLGdEQVFDOzs7OztJQW5MVyxpQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERyYWdEcm9wVG91Y2ggfSBmcm9tICcuLi90b3VjaC1zdXBwb3J0L2RyYWdkcm9wLXRvdWNoJztcclxuaW1wb3J0IHsgRHJhZ2dhYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi8uLi9kaXJlY3RpdmVzL2RyYWdnYWJsZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uL3NoYXJlZC91dGlscyc7XHJcbmltcG9ydCB7IERyYWdQcmV2aWV3RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9kcmFnLXByZXZpZXcuZGlyZWN0aXZlJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERyYWdEcm9wU2VydmljZSB7XHJcbiAgZHJhZ0RhdGE6IGFueTtcclxuICBkcmFnZ2VkRWw6IGFueTtcclxuICBkcmFnZ2VkRWxJZGVudGl0eTogYW55O1xyXG4gIGJhdGNoRHJhZ0RhdGE6IEFycmF5PHtcclxuICAgIGlkZW50aXR5PzogYW55O1xyXG4gICAgZHJhZ2dhYmxlOiBEcmFnZ2FibGVEaXJlY3RpdmU7XHJcbiAgICBkcmFnRGF0YTogYW55O1xyXG4gIH0+O1xyXG4gIGJhdGNoRHJhZ0dyb3VwOiBzdHJpbmc7XHJcbiAgYmF0Y2hEcmFnU3R5bGU6IEFycmF5PHN0cmluZz47XHJcbiAgYmF0Y2hEcmFnZ2luZzogYm9vbGVhbjtcclxuICBzY29wZTogc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcclxuICBkcm9wVGFyZ2V0cyA9IFtdO1xyXG4gIGRyb3BFdmVudDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICBkcmFnRW5kRXZlbnQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgZHJhZ1N0YXJ0RXZlbnQgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgZHJvcE9uSXRlbTogYm9vbGVhbjtcclxuICBkcmFnRm9sbG93OiBib29sZWFuO1xyXG4gIGRyYWdGb2xsb3dPcHRpb25zOiB7XHJcbiAgICBhcHBlbmRUb0JvZHk/OiBib29sZWFuO1xyXG4gIH07XHJcbiAgZHJvcE9uT3JpZ2luOiBib29sZWFuO1xyXG4gIGRyYWdnZWRFbEZvbGxvd2luZ01vdXNlOiBib29sZWFuO1xyXG4gIGRyYWdPZmZzZXQ6IHtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xyXG4gICAgb2Zmc2V0VG9wOiBudW1iZXI7XHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuICAgIGhlaWdodD86IG51bWJlcjtcclxuICB9O1xyXG4gIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gT2JzZXJ2YWJsZS5jcmVhdGUoKS5zdWJzY3JpYmUoKTtcclxuICBkcmFnRW1wdHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gIGRyYWdDbG9uZU5vZGU6IGFueTtcclxuICBkcmFnT3JpZ2luUGxhY2Vob2xkZXI6IGFueTtcclxuICBkcmFnSXRlbUNvbnRhaW5lcjogYW55O1xyXG4gIGRyYWdJdGVtUGFyZW50TmFtZSA9ICcnO1xyXG4gIGRyYWdJdGVtQ2hpbGRyZW5OYW1lID0gJyc7XHJcbiAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6IGFueSA9IG51bGw7XHJcbiAgc3ViO1xyXG4gIGRyYWdPcmlnaW5QbGFjZWhvbGRlck5leHRTaWJsaW5nOiBhbnk7XHJcbiAgdG91Y2hJbnN0YW5jZTtcclxuXHJcbiAgLyrljY/lkIzmi5bmi73pnIDopoEgKi9cclxuICBkcmFnRWxTaG93SGlkZUV2ZW50ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBkcmFnU3luY0dyb3VwRGlyZWN0aXZlcztcclxuICAvKumihOiniOWKn+iDvSAqL1xyXG4gIGRyYWdQcmV2aWV3RGlyZWN0aXZlOiBEcmFnUHJldmlld0RpcmVjdGl2ZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xyXG4gICAgdGhpcy50b3VjaEluc3RhbmNlID0gRHJhZ0Ryb3BUb3VjaC5nZXRJbnN0YW5jZSgpO1xyXG4gICAgLy8gc2VydmljZSBub3Qgc3VwcG9ydCBPbkluaXQsIG9ubHkgc3VwcG9ydCBPbkRlc3Ryb3ksIHNvIHdyaXRlIGluIGNvbnN0cnVjdG9yXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgdGhpcy5kcmFnRW1wdHlJbWFnZS5zcmMgPSAnZGF0YTppbWFnZS9naWY7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFCQ0FZQUFBQWZGY1NKQUFBQURVbEVRVlFJbVdOZ1lHQmdBQUFBQlFBQmg2Rk8xQUFBQUFCSlJVNUVya0pnZ2c9PSc7IC8vIHNhZmFyaeeahGltZ+W/hemhu+imgeaciXNyY1xyXG4gIH1cclxuICBuZXdTdWJzY3JpcHRpb24oKSB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uID0gT2JzZXJ2YWJsZS5jcmVhdGUoKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGVuYWJsZURyYWdnZWRDbG9uZU5vZGVGb2xsb3dNb3VzZSgpIHtcclxuICAgIGlmICghdGhpcy5kcmFnQ2xvbmVOb2RlKSB7XHJcbiAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSB0aGlzLmRyYWdnZWRFbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICBpZiAodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZSAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3VGVtcGxhdGUpIHtcclxuICAgICAgICB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmNyZWF0ZVByZXZpZXcoKTtcclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmdldFByZXZpZXdFbGVtZW50KCk7XHJcbiAgICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lciA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlID0gdGhpcy5kcmFnZ2VkRWwuY2xvbmVOb2RlKHRydWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubWFyZ2luID0gJzAnO1xyXG4gICAgICBpZiAodGhpcy5kcmFnRm9sbG93T3B0aW9ucyAmJiB0aGlzLmRyYWdGb2xsb3dPcHRpb25zLmFwcGVuZFRvQm9keSkge1xyXG4gICAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIHRoaXMuY29weVN0eWxlKHRoaXMuZHJhZ2dlZEVsLCB0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5kcmFnSXRlbUNoaWxkcmVuTmFtZSAhPT0gJycpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5kcmFnSXRlbVBhcmVudE5hbWUgPT09ICcnID8gdGhpcy5kcmFnQ2xvbmVOb2RlIDogZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdJdGVtUGFyZW50TmFtZSk7XHJcbiAgICAgICAgY29uc3QgZHJhZ0l0ZW1DaGlsZHJlbiA9IHBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLmRyYWdJdGVtQ2hpbGRyZW5OYW1lKTtcclxuICAgICAgICB0aGlzLmludGVyY2VwdENoaWxkTm9kZShwYXJlbnRFbGVtZW50LCBkcmFnSXRlbUNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDmi7fotJ1jYW52YXPnmoTlhoXlrrlcclxuICAgICAgY29uc3Qgb3JpZ2luQ2FudmFzQXJyID0gdGhpcy5kcmFnZ2VkRWwucXVlcnlTZWxlY3RvckFsbCgnY2FudmFzJyk7XHJcbiAgICAgIGNvbnN0IHRhcmdldENhbnZhc0FyciA9IHRoaXMuZHJhZ0Nsb25lTm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKTtcclxuICAgICAgW10uZm9yRWFjaC5jYWxsKHRhcmdldENhbnZhc0FyciwgKGNhbnZhcywgaW5kZXgpID0+IHtcclxuICAgICAgICBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKS5kcmF3SW1hZ2Uob3JpZ2luQ2FudmFzQXJyW2luZGV4XSwgMCwgMCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5mb2xsb3dNb3VzZTRDbG9uZU5vZGUsIHtjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUud2lkdGggPSB0aGlzLmRyYWdPZmZzZXQud2lkdGggKyAncHgnO1xyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcblxyXG4gICAgICBpZiAoISh0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlXHJcbiAgICAgICAgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlXHJcbiAgICAgICAgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld09wdGlvbnNcclxuICAgICAgICAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3T3B0aW9ucy5za2lwQmF0Y2hQcmV2aWV3KSkge1xyXG4gICAgICAvLyDmibnph4/mi5bmi73moLflvI9cclxuICAgICAgaWYgKHRoaXMuYmF0Y2hEcmFnZ2luZyAmJiB0aGlzLmJhdGNoRHJhZ0RhdGEgJiYgdGhpcy5iYXRjaERyYWdEYXRhLmxlbmd0aCA+IDEgKSB7XHJcbiAgICAgICAgLy8g5Yib5bu65LiA5Liq6IqC54K55a655ZmoXHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ2JhdGNoLWRyYWdnZWQtbm9kZScpO1xyXG5cclxuICAgICAgICAvKiDorqHmlbDmoLflvI/lrprkvY0gKi9cclxuICAgICAgICBpZiAodGhpcy5iYXRjaERyYWdTdHlsZSAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmxlbmd0aCAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmluZGV4T2YoJ2JhZGdlJykgPiAtMSkge1xyXG4gICAgICAgICAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgIGJhZGdlLmlubmVyVGV4dCA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5sZW5ndGggKyAnJztcclxuICAgICAgICAgIGJhZGdlLmNsYXNzTGlzdC5hZGQoJ2JhdGNoLWRyYWdnZWQtbm9kZS1jb3VudCcpO1xyXG4gICAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XHJcbiAgICAgICAgICBjb25zdCBzdHlsZSA9IHtcclxuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXHJcbiAgICAgICAgICAgIHJpZ2h0OiAnNXB4JyxcclxuICAgICAgICAgICAgdG9wOiAnLTEycHgnLFxyXG4gICAgICAgICAgICBoZWlnaHQ6ICcyNHB4JyxcclxuICAgICAgICAgICAgd2lkdGg6ICcyNHB4JyxcclxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTJweCcsXHJcbiAgICAgICAgICAgIGZvbnRTaXplOiAnMTRweCcsXHJcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6ICcyNHB4JyxcclxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgY29sb3I6ICcjZmZmJyxcclxuICAgICAgICAgICAgYmFja2dyb3VuZDogWycjNTE3MGZmJywgJ3ZhcigtLWJyYW5kLTEsICM1MTcwZmYpJ11cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBVdGlscy5hZGRFbFN0eWxlcyhiYWRnZSwgc3R5bGUpO1xyXG4gICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChiYWRnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiDlsYLlj6DmhJ/moLflvI/lrprkvY0gKi9cclxuICAgICAgICBpZiAodGhpcy5iYXRjaERyYWdTdHlsZSAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmxlbmd0aCAmJiB0aGlzLmJhdGNoRHJhZ1N0eWxlLmluZGV4T2YoJ3N0YWNrJykgPiAtMSkge1xyXG4gICAgICAgICAgbGV0IHN0YWNrID0gMjtcclxuICAgICAgICAgIGlmICh0aGlzLmJhdGNoRHJhZ0RhdGEubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICAgIHN0YWNrID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2s7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja05vZGUgPSB0aGlzLmRyYWdDbG9uZU5vZGUuY2xvbmVOb2RlKGZhbHNlKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tTdHlsZSA9IHtcclxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcclxuICAgICAgICAgICAgICBsZWZ0OiAtNSAqIChpICsgMSApICsgJ3B4JyxcclxuICAgICAgICAgICAgICB0b3A6IC01ICogKGkgKyAxICkgK+OAgCdweCcsXHJcbiAgICAgICAgICAgICAgekluZGV4OiAtIChpICsgMSkgKyAnJyxcclxuICAgICAgICAgICAgICB3aWR0aDogdGhpcy5kcmFnT2Zmc2V0LndpZHRoICsgJ3B4JyxcclxuICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuZHJhZ09mZnNldC5oZWlnaHQgKyAncHgnLFxyXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6ICcjZmZmJyxcclxuICAgICAgICAgICAgICBib3JkZXI6IFsnMXB4IHNvbGlkICM1MTcwZmYnLCAnMXB4IHNvbGlkIHZhcigtLWJyYW5kLTEsICM1MTcwZmYpJ11cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgVXRpbHMuYWRkRWxTdHlsZXMoc3RhY2tOb2RlLCBzdGFja1N0eWxlKTtcclxuICAgICAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdGFja05vZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUgPSBub2RlO1xyXG4gICAgICB9XHJcbiAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLmNsYXNzTGlzdC5hZGQoJ2RyYWctY2xvbmUtbm9kZScpO1xyXG4gICAgICBpZiAoISAodGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZSAmJiB0aGlzLmRyYWdQcmV2aWV3RGlyZWN0aXZlLmRyYWdQcmV2aWV3VGVtcGxhdGUpKSB7XHJcbiAgICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLndpZHRoID0gdGhpcy5kcmFnT2Zmc2V0LndpZHRoICsgJ3B4JztcclxuICAgICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUuaGVpZ2h0ID0gdGhpcy5kcmFnT2Zmc2V0LmhlaWdodCArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnpJbmRleCA9ICcxMDkwJztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS50b3AgPSB0aGlzLmRyYWdPZmZzZXQudG9wICsgJ3B4JztcclxuICAgICAgdGhpcy5kcmFnQ2xvbmVOb2RlLnN0eWxlLmxlZnQgPSB0aGlzLmRyYWdPZmZzZXQubGVmdCArICdweCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS53aWxsQ2hhbmdlID0gJ2xlZnQsIHRvcCc7XHJcbiAgICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kcmFnQ2xvbmVOb2RlKTtcclxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZHJhZ2dlZEVsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ2dlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgICAgIHRoaXMuZHJhZ0VsU2hvd0hpZGVFdmVudC5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ09yaWdpblBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5kcmFnT3JpZ2luUGxhY2Vob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9ICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGlzYWJsZURyYWdnZWRDbG9uZU5vZGVGb2xsb3dNb3VzZSgpIHtcclxuICAgIGlmICh0aGlzLmRyYWdDbG9uZU5vZGUpIHtcclxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmZvbGxvd01vdXNlNENsb25lTm9kZSwge2NhcHR1cmU6IHRydWV9KTtcclxuICAgICAgdGhpcy5kcmFnSXRlbUNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLmRyYWdDbG9uZU5vZGUpO1xyXG4gICAgICB0aGlzLmRyYWdnZWRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgIHRoaXMuZHJhZ0VsU2hvd0hpZGVFdmVudC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUgJiYgdGhpcy5kcmFnUHJldmlld0RpcmVjdGl2ZS5kcmFnUHJldmlld1RlbXBsYXRlKSB7XHJcbiAgICAgIHRoaXMuZHJhZ1ByZXZpZXdEaXJlY3RpdmUuZGVzdHJveVByZXZpZXcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuZHJhZ0Nsb25lTm9kZSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZHJhZ0l0ZW1Db250YWluZXIgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgaWYgKHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbnRlcmNlcHRDaGlsZE5vZGUocGFyZW50Tm9kZSwgY2hpbGROb2RlTGlzdCkge1xyXG4gICAgY29uc3QgaW50ZXJjZXB0T3B0aW9ucyA9IHtcclxuICAgICAgcm9vdDogcGFyZW50Tm9kZVxyXG4gICAgfTtcclxuICAgIHRoaXMuaW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIodGhpcy5zZXRDaGlsZE5vZGVIaWRlLCBpbnRlcmNlcHRPcHRpb25zKTtcclxuICAgIFtdLmZvckVhY2guY2FsbChjaGlsZE5vZGVMaXN0LCBjaGlsZE5vZGUgPT4ge1xyXG4gICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyLm9ic2VydmUoY2hpbGROb2RlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0Q2hpbGROb2RlSGlkZShlbnRyaWVzKSB7XHJcbiAgICBlbnRyaWVzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGNvbnN0IHtpc0ludGVyc2VjdGluZywgdGFyZ2V0OiBjaGlsZE5vZGV9ID0gZWxlbWVudDtcclxuICAgICAgaWYgKGlzSW50ZXJzZWN0aW5nKSB7XHJcbiAgICAgICAgY2hpbGROb2RlLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNoaWxkTm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvbGxvd01vdXNlNENsb25lTm9kZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3Qge29mZnNldExlZnQsIG9mZnNldFRvcH0gPSB0aGlzLmRyYWdPZmZzZXQ7XHJcbiAgICBjb25zdCB7Y2xpZW50WCwgY2xpZW50WX0gPSBldmVudDtcclxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5kcmFnQ2xvbmVOb2RlKSB7IHJldHVybjsgfVxyXG4gICAgICB0aGlzLmRyYWdDbG9uZU5vZGUuc3R5bGUubGVmdCA9ICBjbGllbnRYIC0gb2Zmc2V0TGVmdCArICdweCc7XHJcbiAgICAgIHRoaXMuZHJhZ0Nsb25lTm9kZS5zdHlsZS50b3AgPSAgY2xpZW50WSAtIG9mZnNldFRvcCArICdweCc7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEJhdGNoRHJhZ0RhdGEoaWRlbnRpdHk/LCBvcmRlcjogKChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyKSB8ICdzZWxlY3QnIHwgJ2RyYWdnZWRFbEZpcnN0JyA9ICdkcmFnZ2VkRWxGaXJzdCcpIHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5tYXAoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ0RhdGEpO1xyXG4gICAgaWYgKHR5cGVvZiBvcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICByZXN1bHQuc29ydCg8KChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyKT5vcmRlcik7XHJcbiAgICB9IGVsc2UgaWYgKG9yZGVyID09PSAnZHJhZ2dlZEVsRmlyc3QnKSB7XHJcbiAgICAgIGxldCBkcmFnRGF0YSA9IHRoaXMuZHJhZ0RhdGE7XHJcbiAgICAgIGlmIChpZGVudGl0eSkge1xyXG4gICAgICAgIGNvbnN0IHJlYWxEcmFnRGF0YSA9IHRoaXMuYmF0Y2hEcmFnRGF0YS5maWx0ZXIoZGQgPT4gZGQuaWRlbnRpdHkgPT09IGlkZW50aXR5KS5wb3AoKS5kcmFnRGF0YTtcclxuICAgICAgICBkcmFnRGF0YSA9IHJlYWxEcmFnRGF0YTtcclxuICAgICAgfVxyXG4gICAgICByZXN1bHQuc3BsaWNlKHJlc3VsdC5pbmRleE9mKGRyYWdEYXRhKSwgMSk7XHJcbiAgICAgIHJlc3VsdC5zcGxpY2UoMCwgMCwgZHJhZ0RhdGEpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICAgfVxyXG5cclxuICAgLyoqIHVzYWdlOlxyXG4gICAgKiBjb25zdHJ1Y3RvciguLi4sIHByaXZhdGUgZHJhZ0Ryb3BTZXJ2aWNlOiBEcmFnRHJvcFNlcnZpY2UpIHt9XHJcbiAgICAqIGNsZWFuQmF0Y2hEcmFnRGF0YSgpIHsgdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2xlYW5CYXRjaERyYWdEYXRhKCk7IH1cclxuICAgICovXHJcbiAgIHB1YmxpYyBjbGVhbkJhdGNoRHJhZ0RhdGEoKSB7XHJcbiAgICAgY29uc3QgYmF0Y2hEcmFnRGF0YSA9IHRoaXMuYmF0Y2hEcmFnRGF0YTtcclxuICAgICBpZiAodGhpcy5iYXRjaERyYWdEYXRhKSB7XHJcbiAgICAgIHRoaXMuYmF0Y2hEcmFnRGF0YVxyXG4gICAgICAgIC5maWx0ZXIoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ2dhYmxlKVxyXG4gICAgICAgIC5tYXAoZHJhZ0RhdGEgPT4gZHJhZ0RhdGEuZHJhZ2dhYmxlKVxyXG4gICAgICAgIC5mb3JFYWNoKGRyYWdnYWJsZSA9PiBkcmFnZ2FibGUuYmF0Y2hEcmFnZ2FibGUuZHJhZ0RhdGEgPSB1bmRlZmluZWQpO1xyXG4gICAgICB0aGlzLmJhdGNoRHJhZ0RhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHRoaXMuYmF0Y2hEcmFnR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICAgfVxyXG4gICAgIHJldHVybiBiYXRjaERyYWdEYXRhO1xyXG4gICB9XHJcblxyXG4gICBwdWJsaWMgY29weVN0eWxlKHNvdXJjZSwgdGFyZ2V0KSB7XHJcbiAgICBbJ2lkJywgJ2NsYXNzJywgJ3N0eWxlJywgJ2RyYWdnYWJsZSddLmZvckVhY2goZnVuY3Rpb24gKGF0dCkge1xyXG4gICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjb3B5IHN0eWxlICh3aXRob3V0IHRyYW5zaXRpb25zKVxyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoc291cmNlKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHV0ZWRTdHlsZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSBjb21wdXRlZFN0eWxlW2ldO1xyXG4gICAgICAgIGlmIChrZXkuaW5kZXhPZigndHJhbnNpdGlvbicpIDwgMCkge1xyXG4gICAgICAgICAgdGFyZ2V0LnN0eWxlW2tleV0gPSBjb21wdXRlZFN0eWxlW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRhcmdldC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xyXG4gICAgICAvLyBhbmQgcmVwZWF0IGZvciBhbGwgY2hpbGRyZW5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB0aGlzLmNvcHlTdHlsZShzb3VyY2UuY2hpbGRyZW5baV0sIHRhcmdldC5jaGlsZHJlbltpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuIl19