ngx-pluto
Version:
272 lines • 24.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewEncapsulation, Input, ViewChild } from '@angular/core';
import { ViewportRuler } from '@angular/cdk/overlay';
import { CdkDropListGroup, CdkDropList, moveItemInArray } from '../drag-drop/index';
import { Utils } from '../utils';
/**
* 可拖拽图片组件 - 上传多张图片时展示多图并可拖拽改变排列顺序
*
* <example-url>https://stackblitz.com/edit/np-draggable-pics-sample?embed=1&file=src/app/app.component.html</example-url>
*/
var NpDraggablePics = /** @class */ (function () {
function NpDraggablePics(viewportRuler) {
var _this = this;
this.viewportRuler = viewportRuler;
/**
* 包含图片url的图片列表,可选值id(unique)
*/
this.items = [];
this.dropListEnterPredicate = (/**
* @param {?} drag
* @param {?} drop
* @return {?}
*/
function (drag, drop) {
if (drop == _this.placeholder)
return true;
if (drop != _this.activeContainer)
return false;
/** @type {?} */
var phElement = _this.placeholder.element.nativeElement;
/** @type {?} */
var sourceElement = drag.dropContainer.element.nativeElement;
/** @type {?} */
var dropElement = drop.element.nativeElement;
/** @type {?} */
var dragIndex = __indexOf(dropElement.parentElement.children, (_this.source ? phElement : sourceElement));
/** @type {?} */
var dropIndex = __indexOf(dropElement.parentElement.children, dropElement);
if (!_this.source) {
_this.sourceIndex = dragIndex;
_this.source = drag.dropContainer;
phElement.style.width = sourceElement.clientWidth + 'px';
phElement.style.height = sourceElement.clientHeight + 'px';
sourceElement.parentElement.removeChild(sourceElement);
}
_this.targetIndex = dropIndex;
_this.target = drop;
phElement.style.display = '';
dropElement.parentElement.insertBefore(phElement, (dropIndex > dragIndex
? dropElement.nextSibling : dropElement));
_this.placeholder.enter(drag, drag.element.nativeElement.offsetLeft, drag.element.nativeElement.offsetTop);
return false;
});
this.target = null;
this.source = null;
}
/**
* @return {?}
*/
NpDraggablePics.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.items.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) {
if (!item.id) {
item.id = Utils.ID();
}
}));
};
/**
* @return {?}
*/
NpDraggablePics.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var phElement = this.placeholder.element.nativeElement;
phElement.style.display = 'none';
phElement.parentElement.removeChild(phElement);
};
/**
* @param {?} e
* @return {?}
*/
NpDraggablePics.prototype.dragMoved = /**
* @param {?} e
* @return {?}
*/
function (e) {
var _this = this;
if (this.isDisabled) {
return;
}
/** @type {?} */
var point = this.getPointerPositionOnPage(e.event);
this.listGroup._items.forEach((/**
* @param {?} dropList
* @return {?}
*/
function (dropList) {
if (__isInsideDropListClientRect(dropList, point.x, point.y)) {
_this.activeContainer = dropList;
return;
}
}));
};
/**
* @return {?}
*/
NpDraggablePics.prototype.dropListDropped = /**
* @return {?}
*/
function () {
if (!this.target)
return;
/** @type {?} */
var phElement = this.placeholder.element.nativeElement;
/** @type {?} */
var parent = phElement.parentElement;
phElement.style.display = 'none';
parent.removeChild(phElement);
parent.appendChild(phElement);
parent.insertBefore(this.source.element.nativeElement, parent.children[this.sourceIndex]);
this.target = null;
this.source = null;
if (this.sourceIndex != this.targetIndex)
moveItemInArray(this.items, this.sourceIndex, this.targetIndex);
};
/** Determines the point of the page that was touched by the user. */
/**
* Determines the point of the page that was touched by the user.
* @param {?} event
* @return {?}
*/
NpDraggablePics.prototype.getPointerPositionOnPage = /**
* Determines the point of the page that was touched by the user.
* @param {?} event
* @return {?}
*/
function (event) {
// `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
/** @type {?} */
var point = __isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event;
/** @type {?} */
var scrollPosition = this.viewportRuler.getViewportScrollPosition();
return {
x: point.pageX - scrollPosition.left,
y: point.pageY - scrollPosition.top
};
};
/**
* @param {?} item
* @return {?}
*/
NpDraggablePics.prototype.onRemove = /**
* @param {?} item
* @return {?}
*/
function (item) {
/** @type {?} */
var index = this.items.indexOf(item);
if (index > -1) {
this.items.splice(index, 1);
}
};
NpDraggablePics.decorators = [
{ type: Component, args: [{
selector: "np-draggable-pics",
template: "<div class=\"np-draggable-pics-wrapper item-container\" cdkDropListGroup>\r\n <div cdkDropList [cdkDropListEnterPredicate]=\"dropListEnterPredicate\" (cdkDropListDropped)=\"dropListDropped()\">\r\n </div>\r\n <div cdkDropList *ngFor=\"let item of items\" [cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n (cdkDropListDropped)=\"dropListDropped()\">\r\n <div cdkDrag class=\"item-box\" (cdkDragMoved)=\"dragMoved($event);\" [style.width.px]=\"itemWidth\"\r\n [style.height.px]=\"itemHeight\">\r\n <i class=\"fas fa-times-circle\" *ngIf=\"!isDisabled\" (click)=\"onRemove(item)\"></i>\r\n <img [src]=\"item.url\" [style.width.px]=\"itemWidth\" [style.height.px]=\"itemHeight\">\r\n </div>\r\n </div>\r\n</div>\r\n",
host: {
'class': 'host-inline-block'
},
encapsulation: ViewEncapsulation.None,
styles: [".host-inline-block{display:inline-block}.np-draggable-pics-wrapper.item-container{display:flex;flex-wrap:wrap;min-width:600px;padding:10px}.np-draggable-pics-wrapper.item-container .item-box{height:auto;font-size:30pt;cursor:move;display:flex;justify-content:center;align-items:center;text-align:center;border-radius:4px;position:relative;z-index:1;transition:box-shadow .2s cubic-bezier(0,0,.2,1)}.np-draggable-pics-wrapper.item-container .item-box>.fas.fa-times-circle{position:absolute;top:-6px;right:-6px;font-size:16px;cursor:pointer;border-radius:50%}.cdk-drop-list{display:flex;box-sizing:border-box!important;padding-right:10px;padding-bottom:10px}.cdk-drag-preview{border-radius:4px;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12);display:flex;justify-content:center;align-items:center;text-align:center;font-size:30pt;opacity:.8;padding:3px;border:2px dotted gray!important;background-color:transparent!important}.cdk-drag-placeholder{box-sizing:border-box!important;opacity:.2;border:2px dotted gray!important;background-color:#ddd!important}.cdk-drag-animating{transition:transform 250ms cubic-bezier(0,0,.2,1)}"]
}] }
];
/** @nocollapse */
NpDraggablePics.ctorParameters = function () { return [
{ type: ViewportRuler }
]; };
NpDraggablePics.propDecorators = {
listGroup: [{ type: ViewChild, args: [CdkDropListGroup,] }],
placeholder: [{ type: ViewChild, args: [CdkDropList,] }],
items: [{ type: Input }],
itemWidth: [{ type: Input }],
itemHeight: [{ type: Input }],
isDisabled: [{ type: Input }]
};
return NpDraggablePics;
}());
export { NpDraggablePics };
if (false) {
/** @type {?} */
NpDraggablePics.prototype.listGroup;
/** @type {?} */
NpDraggablePics.prototype.placeholder;
/**
* 包含图片url的图片列表,可选值id(unique)
* @type {?}
*/
NpDraggablePics.prototype.items;
/**
* 图片展示宽度
* @type {?}
*/
NpDraggablePics.prototype.itemWidth;
/**
* 图片展示高度
* @type {?}
*/
NpDraggablePics.prototype.itemHeight;
/**
* 是否禁用图片可拖拽删除
* @type {?}
*/
NpDraggablePics.prototype.isDisabled;
/** @type {?} */
NpDraggablePics.prototype.target;
/** @type {?} */
NpDraggablePics.prototype.targetIndex;
/** @type {?} */
NpDraggablePics.prototype.source;
/** @type {?} */
NpDraggablePics.prototype.sourceIndex;
/** @type {?} */
NpDraggablePics.prototype.dragIndex;
/** @type {?} */
NpDraggablePics.prototype.activeContainer;
/** @type {?} */
NpDraggablePics.prototype.dropListEnterPredicate;
/**
* @type {?}
* @private
*/
NpDraggablePics.prototype.viewportRuler;
}
/**
* @param {?} collection
* @param {?} node
* @return {?}
*/
function __indexOf(collection, node) {
return Array.prototype.indexOf.call(collection, node);
}
;
/**
* Determines whether an event is a touch event.
* @param {?} event
* @return {?}
*/
function __isTouchEvent(event) {
return event.type.startsWith('touch');
}
/**
* @param {?} dropList
* @param {?} x
* @param {?} y
* @return {?}
*/
function __isInsideDropListClientRect(dropList, x, y) {
var _a = dropList.element.nativeElement.getBoundingClientRect(), top = _a.top, bottom = _a.bottom, left = _a.left, right = _a.right;
return y >= top && y <= bottom && x >= left && x <= right;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLXBpY3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZHJhZ2dhYmxlLXBpY3MvZHJhZ2dhYmxlLXBpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUF3QixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDMUcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBT2pDO0lBaUNFLHlCQUFvQixhQUE0QjtRQUFoRCxpQkFHQztRQUhtQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTs7OztRQWxCdkMsVUFBSyxHQUF3QyxFQUFFLENBQUM7UUF3RXpELDJCQUFzQjs7Ozs7UUFBRyxVQUFDLElBQWEsRUFBRSxJQUFpQjtZQUN4RCxJQUFJLElBQUksSUFBSSxLQUFJLENBQUMsV0FBVztnQkFDMUIsT0FBTyxJQUFJLENBQUM7WUFFZCxJQUFJLElBQUksSUFBSSxLQUFJLENBQUMsZUFBZTtnQkFDOUIsT0FBTyxLQUFLLENBQUM7O2dCQUVYLFNBQVMsR0FBRyxLQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhOztnQkFDbEQsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWE7O2dCQUN4RCxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhOztnQkFFeEMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7O2dCQUNwRyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztZQUUxRSxJQUFJLENBQUMsS0FBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsS0FBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzdCLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFFakMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7Z0JBQ3pELFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUUzRCxhQUFhLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN4RDtZQUVELEtBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBRW5CLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUM3QixXQUFXLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEdBQUcsU0FBUztnQkFDdEUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFFNUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBQTtRQXRGQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDOzs7O0lBRUQsa0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQSxJQUFJO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUNaLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO2FBQ3RCO1FBQ0gsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQseUNBQWU7OztJQUFmOztZQUNNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1FBRXRELFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUNqQyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDOzs7OztJQUVELG1DQUFTOzs7O0lBQVQsVUFBVSxDQUFjO1FBQXhCLGlCQVlDO1FBWEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU87U0FDUjs7WUFDRyxLQUFLLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsUUFBUTtZQUNwQyxJQUFJLDRCQUE0QixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUQsS0FBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUM7Z0JBQ2hDLE9BQU87YUFDUjtRQUNILENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVELHlDQUFlOzs7SUFBZjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUNkLE9BQU87O1lBRUwsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWE7O1lBQ2xELE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYTtRQUVwQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFakMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFMUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQ3RDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFxQ0QscUVBQXFFOzs7Ozs7SUFDckUsa0RBQXdCOzs7OztJQUF4QixVQUF5QixLQUE4Qjs7O1lBRS9DLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7O1lBQ3JGLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixFQUFFO1FBRXJFLE9BQU87WUFDTCxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSTtZQUNwQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsR0FBRztTQUNwQyxDQUFDO0lBQ0osQ0FBQzs7Ozs7SUFFRCxrQ0FBUTs7OztJQUFSLFVBQVMsSUFBa0M7O1lBQ3JDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOztnQkEzSUYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLHd2QkFBa0M7b0JBRWxDLElBQUksRUFBRTt3QkFDSixPQUFPLEVBQUUsbUJBQW1CO3FCQUM3QjtvQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7aUJBQ3RDOzs7O2dCQWpCUSxhQUFhOzs7NEJBb0JuQixTQUFTLFNBQUMsZ0JBQWdCOzhCQUMxQixTQUFTLFNBQUMsV0FBVzt3QkFHckIsS0FBSzs0QkFHTCxLQUFLOzZCQUdMLEtBQUs7NkJBR0wsS0FBSzs7SUFvSFIsc0JBQUM7Q0FBQSxBQTVJRCxJQTRJQztTQW5JWSxlQUFlOzs7SUFFMUIsb0NBQXNFOztJQUN0RSxzQ0FBaUQ7Ozs7O0lBR2pELGdDQUF5RDs7Ozs7SUFHekQsb0NBQTJCOzs7OztJQUczQixxQ0FBNEI7Ozs7O0lBRzVCLHFDQUE2Qjs7SUFFN0IsaUNBQW9COztJQUNwQixzQ0FBb0I7O0lBQ3BCLGlDQUFvQjs7SUFDcEIsc0NBQW9COztJQUNwQixvQ0FBa0I7O0lBQ2xCLDBDQUFnQjs7SUF3RGhCLGlEQWlDQzs7Ozs7SUF2Rlcsd0NBQW9DOzs7Ozs7O0FBNkdsRCxTQUFTLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSTtJQUNqQyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUFBLENBQUM7Ozs7OztBQUdGLFNBQVMsY0FBYyxDQUFDLEtBQThCO0lBQ3BELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDeEMsQ0FBQzs7Ozs7OztBQUVELFNBQVMsNEJBQTRCLENBQUMsUUFBcUIsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUN6RSxJQUFBLDJEQUFxRixFQUFuRixZQUFHLEVBQUUsa0JBQU0sRUFBRSxjQUFJLEVBQUUsZ0JBQWdFO0lBQzNGLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDZGtEcm9wTGlzdEdyb3VwLCBDZGtEcm9wTGlzdCwgQ2RrRHJhZ01vdmUsIG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJhZyB9IGZyb20gJy4uL2RyYWctZHJvcC9pbmRleCc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIOWPr+aLluaLveWbvueJh+e7hOS7tiAtIOS4iuS8oOWkmuW8oOWbvueJh+aXtuWxleekuuWkmuWbvuW5tuWPr+aLluaLveaUueWPmOaOkuWIl+mhuuW6j1xyXG4gKiBcclxuICogPGV4YW1wbGUtdXJsPmh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9ucC1kcmFnZ2FibGUtcGljcy1zYW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZHJhZ2dhYmxlLXBpY3NgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZHJhZ2dhYmxlLXBpY3MuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RyYWdnYWJsZS1waWNzLnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICAnY2xhc3MnOiAnaG9zdC1pbmxpbmUtYmxvY2snXHJcbiAgfSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOcERyYWdnYWJsZVBpY3MgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAVmlld0NoaWxkKENka0Ryb3BMaXN0R3JvdXApIGxpc3RHcm91cDogQ2RrRHJvcExpc3RHcm91cDxDZGtEcm9wTGlzdD47XHJcbiAgQFZpZXdDaGlsZChDZGtEcm9wTGlzdCkgcGxhY2Vob2xkZXI6IENka0Ryb3BMaXN0O1xyXG5cclxuICAvKirljIXlkKvlm77niYd1cmznmoTlm77niYfliJfooajvvIzlj6/pgInlgLxpZO+8iHVuaXF1Ze+8iSAqL1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBBcnJheTx7IHVybDogc3RyaW5nLCBpZD86IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAvKirlm77niYflsZXnpLrlrr3luqYgKi9cclxuICBASW5wdXQoKSBpdGVtV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgLyoq5Zu+54mH5bGV56S66auY5bqmICovXHJcbiAgQElucHV0KCkgaXRlbUhlaWdodDogbnVtYmVyO1xyXG5cclxuICAvKirmmK/lkKbnpoHnlKjlm77niYflj6/mi5bmi73liKDpmaQgKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICB0YXJnZXQ6IENka0Ryb3BMaXN0O1xyXG4gIHRhcmdldEluZGV4OiBudW1iZXI7XHJcbiAgc291cmNlOiBDZGtEcm9wTGlzdDtcclxuICBzb3VyY2VJbmRleDogbnVtYmVyO1xyXG4gIGRyYWdJbmRleDogbnVtYmVyO1xyXG4gIGFjdGl2ZUNvbnRhaW5lcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyKSB7XHJcbiAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaWYgKCFpdGVtLmlkKSB7XHJcbiAgICAgICAgaXRlbS5pZCA9IFV0aWxzLklEKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgbGV0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHBoRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgcGhFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocGhFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGRyYWdNb3ZlZChlOiBDZGtEcmFnTW92ZSkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnQgPSB0aGlzLmdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShlLmV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmxpc3RHcm91cC5faXRlbXMuZm9yRWFjaChkcm9wTGlzdCA9PiB7XHJcbiAgICAgIGlmIChfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0LCBwb2ludC54LCBwb2ludC55KSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29udGFpbmVyID0gZHJvcExpc3Q7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BMaXN0RHJvcHBlZCgpIHtcclxuICAgIGlmICghdGhpcy50YXJnZXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBsZXQgcGFyZW50ID0gcGhFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocGhFbGVtZW50KTtcclxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5zb3VyY2VJbmRleF0pO1xyXG5cclxuICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuICAgIHRoaXMuc291cmNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5zb3VyY2VJbmRleCAhPSB0aGlzLnRhcmdldEluZGV4KVxyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5pdGVtcywgdGhpcy5zb3VyY2VJbmRleCwgdGhpcy50YXJnZXRJbmRleCk7XHJcbiAgfVxyXG5cclxuICBkcm9wTGlzdEVudGVyUHJlZGljYXRlID0gKGRyYWc6IENka0RyYWcsIGRyb3A6IENka0Ryb3BMaXN0KSA9PiB7XHJcbiAgICBpZiAoZHJvcCA9PSB0aGlzLnBsYWNlaG9sZGVyKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZHJvcCAhPSB0aGlzLmFjdGl2ZUNvbnRhaW5lcilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBzb3VyY2VFbGVtZW50ID0gZHJhZy5kcm9wQ29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBkcm9wRWxlbWVudCA9IGRyb3AuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGxldCBkcmFnSW5kZXggPSBfX2luZGV4T2YoZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgKHRoaXMuc291cmNlID8gcGhFbGVtZW50IDogc291cmNlRWxlbWVudCkpO1xyXG4gICAgbGV0IGRyb3BJbmRleCA9IF9faW5kZXhPZihkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBkcm9wRWxlbWVudCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNvdXJjZSkge1xyXG4gICAgICB0aGlzLnNvdXJjZUluZGV4ID0gZHJhZ0luZGV4O1xyXG4gICAgICB0aGlzLnNvdXJjZSA9IGRyYWcuZHJvcENvbnRhaW5lcjtcclxuXHJcbiAgICAgIHBoRWxlbWVudC5zdHlsZS53aWR0aCA9IHNvdXJjZUVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xyXG4gICAgICBwaEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc291cmNlRWxlbWVudC5jbGllbnRIZWlnaHQgKyAncHgnO1xyXG5cclxuICAgICAgc291cmNlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHNvdXJjZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFyZ2V0SW5kZXggPSBkcm9wSW5kZXg7XHJcbiAgICB0aGlzLnRhcmdldCA9IGRyb3A7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBoRWxlbWVudCwgKGRyb3BJbmRleCA+IGRyYWdJbmRleFxyXG4gICAgICA/IGRyb3BFbGVtZW50Lm5leHRTaWJsaW5nIDogZHJvcEVsZW1lbnQpKTtcclxuXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyLmVudGVyKGRyYWcsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogRGV0ZXJtaW5lcyB0aGUgcG9pbnQgb2YgdGhlIHBhZ2UgdGhhdCB3YXMgdG91Y2hlZCBieSB0aGUgdXNlci4gKi9cclxuICBnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxyXG4gICAgY29uc3QgcG9pbnQgPSBfX2lzVG91Y2hFdmVudChldmVudCkgPyAoZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkgOiBldmVudDtcclxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy52aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBwb2ludC5wYWdlWCAtIHNjcm9sbFBvc2l0aW9uLmxlZnQsXHJcbiAgICAgIHk6IHBvaW50LnBhZ2VZIC0gc2Nyb2xsUG9zaXRpb24udG9wXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25SZW1vdmUoaXRlbTogeyB1cmw6IHN0cmluZywgaWQ/OiBzdHJpbmcgfSkge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19pbmRleE9mKGNvbGxlY3Rpb24sIG5vZGUpIHtcclxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBub2RlKTtcclxufTtcclxuXHJcbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4gKi9cclxuZnVuY3Rpb24gX19pc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XHJcbiAgcmV0dXJuIGV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndG91Y2gnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19pc0luc2lkZURyb3BMaXN0Q2xpZW50UmVjdChkcm9wTGlzdDogQ2RrRHJvcExpc3QsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IGRyb3BMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICByZXR1cm4geSA+PSB0b3AgJiYgeSA8PSBib3R0b20gJiYgeCA+PSBsZWZ0ICYmIHggPD0gcmlnaHQ7XHJcbn1cclxuXHJcblxyXG4iXX0=