ngx-pluto
Version:
248 lines • 23.5 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>
*/
export class NpDraggablePics {
/**
* @param {?} viewportRuler
*/
constructor(viewportRuler) {
this.viewportRuler = viewportRuler;
/**
* 包含图片url的图片列表,可选值id(unique)
*/
this.items = [];
this.dropListEnterPredicate = (/**
* @param {?} drag
* @param {?} drop
* @return {?}
*/
(drag, drop) => {
if (drop == this.placeholder)
return true;
if (drop != this.activeContainer)
return false;
/** @type {?} */
let phElement = this.placeholder.element.nativeElement;
/** @type {?} */
let sourceElement = drag.dropContainer.element.nativeElement;
/** @type {?} */
let dropElement = drop.element.nativeElement;
/** @type {?} */
let dragIndex = __indexOf(dropElement.parentElement.children, (this.source ? phElement : sourceElement));
/** @type {?} */
let 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 {?}
*/
ngOnInit() {
this.items.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
if (!item.id) {
item.id = Utils.ID();
}
}));
}
/**
* @return {?}
*/
ngAfterViewInit() {
/** @type {?} */
let phElement = this.placeholder.element.nativeElement;
phElement.style.display = 'none';
phElement.parentElement.removeChild(phElement);
}
/**
* @param {?} e
* @return {?}
*/
dragMoved(e) {
if (this.isDisabled) {
return;
}
/** @type {?} */
let point = this.getPointerPositionOnPage(e.event);
this.listGroup._items.forEach((/**
* @param {?} dropList
* @return {?}
*/
dropList => {
if (__isInsideDropListClientRect(dropList, point.x, point.y)) {
this.activeContainer = dropList;
return;
}
}));
}
/**
* @return {?}
*/
dropListDropped() {
if (!this.target)
return;
/** @type {?} */
let phElement = this.placeholder.element.nativeElement;
/** @type {?} */
let 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.
* @param {?} event
* @return {?}
*/
getPointerPositionOnPage(event) {
// `touches` will be empty for start/end events so we have to fall back to `changedTouches`.
/** @type {?} */
const point = __isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event;
/** @type {?} */
const scrollPosition = this.viewportRuler.getViewportScrollPosition();
return {
x: point.pageX - scrollPosition.left,
y: point.pageY - scrollPosition.top
};
}
/**
* @param {?} item
* @return {?}
*/
onRemove(item) {
/** @type {?} */
let 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 = () => [
{ 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 }]
};
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) {
const { top, bottom, left, right } = dropList.element.nativeElement.getBoundingClientRect();
return y >= top && y <= bottom && x >= left && x <= right;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLXBpY3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZHJhZ2dhYmxlLXBpY3MvZHJhZ2dhYmxlLXBpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUF3QixTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDekgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQWUsZUFBZSxFQUFXLE1BQU0sb0JBQW9CLENBQUM7QUFDMUcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBZ0JqQyxNQUFNLE9BQU8sZUFBZTs7OztJQXdCMUIsWUFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7Ozs7UUFsQnZDLFVBQUssR0FBd0MsRUFBRSxDQUFDO1FBd0V6RCwyQkFBc0I7Ozs7O1FBQUcsQ0FBQyxJQUFhLEVBQUUsSUFBaUIsRUFBRSxFQUFFO1lBQzVELElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXO2dCQUMxQixPQUFPLElBQUksQ0FBQztZQUVkLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxlQUFlO2dCQUM5QixPQUFPLEtBQUssQ0FBQzs7Z0JBRVgsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWE7O2dCQUNsRCxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsYUFBYTs7Z0JBQ3hELFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWE7O2dCQUV4QyxTQUFTLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENB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QUFDLHFCQUFxQixFQUFFO0lBQzNGLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBWaWV3cG9ydFJ1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBDZGtEcm9wTGlzdEdyb3VwLCBDZGtEcm9wTGlzdCwgQ2RrRHJhZ01vdmUsIG1vdmVJdGVtSW5BcnJheSwgQ2RrRHJhZyB9IGZyb20gJy4uL2RyYWctZHJvcC9pbmRleCc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIOWPr+aLluaLveWbvueJh+e7hOS7tiAtIOS4iuS8oOWkmuW8oOWbvueJh+aXtuWxleekuuWkmuWbvuW5tuWPr+aLluaLveaUueWPmOaOkuWIl+mhuuW6j1xyXG4gKiBcclxuICogPGV4YW1wbGUtdXJsPmh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9ucC1kcmFnZ2FibGUtcGljcy1zYW1wbGU/ZW1iZWQ9MSZmaWxlPXNyYy9hcHAvYXBwLmNvbXBvbmVudC5odG1sPC9leGFtcGxlLXVybD5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBgbnAtZHJhZ2dhYmxlLXBpY3NgLFxyXG4gIHRlbXBsYXRlVXJsOiAnZHJhZ2dhYmxlLXBpY3MuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJ2RyYWdnYWJsZS1waWNzLnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICAnY2xhc3MnOiAnaG9zdC1pbmxpbmUtYmxvY2snXHJcbiAgfSxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOcERyYWdnYWJsZVBpY3MgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBAVmlld0NoaWxkKENka0Ryb3BMaXN0R3JvdXApIGxpc3RHcm91cDogQ2RrRHJvcExpc3RHcm91cDxDZGtEcm9wTGlzdD47XHJcbiAgQFZpZXdDaGlsZChDZGtEcm9wTGlzdCkgcGxhY2Vob2xkZXI6IENka0Ryb3BMaXN0O1xyXG5cclxuICAvKirljIXlkKvlm77niYd1cmznmoTlm77niYfliJfooajvvIzlj6/pgInlgLxpZO+8iHVuaXF1Ze+8iSAqL1xyXG4gIEBJbnB1dCgpIGl0ZW1zOiBBcnJheTx7IHVybDogc3RyaW5nLCBpZD86IHN0cmluZyB9PiA9IFtdO1xyXG5cclxuICAvKirlm77niYflsZXnpLrlrr3luqYgKi9cclxuICBASW5wdXQoKSBpdGVtV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgLyoq5Zu+54mH5bGV56S66auY5bqmICovXHJcbiAgQElucHV0KCkgaXRlbUhlaWdodDogbnVtYmVyO1xyXG5cclxuICAvKirmmK/lkKbnpoHnlKjlm77niYflj6/mi5bmi73liKDpmaQgKi9cclxuICBASW5wdXQoKSBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG5cclxuICB0YXJnZXQ6IENka0Ryb3BMaXN0O1xyXG4gIHRhcmdldEluZGV4OiBudW1iZXI7XHJcbiAgc291cmNlOiBDZGtEcm9wTGlzdDtcclxuICBzb3VyY2VJbmRleDogbnVtYmVyO1xyXG4gIGRyYWdJbmRleDogbnVtYmVyO1xyXG4gIGFjdGl2ZUNvbnRhaW5lcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyKSB7XHJcbiAgICB0aGlzLnRhcmdldCA9IG51bGw7XHJcbiAgICB0aGlzLnNvdXJjZSA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgaWYgKCFpdGVtLmlkKSB7XHJcbiAgICAgICAgaXRlbS5pZCA9IFV0aWxzLklEKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgbGV0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIHBoRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgcGhFbGVtZW50LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQocGhFbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGRyYWdNb3ZlZChlOiBDZGtEcmFnTW92ZSkge1xyXG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgcG9pbnQgPSB0aGlzLmdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShlLmV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmxpc3RHcm91cC5faXRlbXMuZm9yRWFjaChkcm9wTGlzdCA9PiB7XHJcbiAgICAgIGlmIChfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0LCBwb2ludC54LCBwb2ludC55KSkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlQ29udGFpbmVyID0gZHJvcExpc3Q7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRyb3BMaXN0RHJvcHBlZCgpIHtcclxuICAgIGlmICghdGhpcy50YXJnZXQpXHJcbiAgICAgIHJldHVybjtcclxuXHJcbiAgICBsZXQgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBsZXQgcGFyZW50ID0gcGhFbGVtZW50LnBhcmVudEVsZW1lbnQ7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQocGhFbGVtZW50KTtcclxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5zb3VyY2UuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBwYXJlbnQuY2hpbGRyZW5bdGhpcy5zb3VyY2VJbmRleF0pO1xyXG5cclxuICAgIHRoaXMudGFyZ2V0ID0gbnVsbDtcclxuICAgIHRoaXMuc291cmNlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5zb3VyY2VJbmRleCAhPSB0aGlzLnRhcmdldEluZGV4KVxyXG4gICAgICBtb3ZlSXRlbUluQXJyYXkodGhpcy5pdGVtcywgdGhpcy5zb3VyY2VJbmRleCwgdGhpcy50YXJnZXRJbmRleCk7XHJcbiAgfVxyXG5cclxuICBkcm9wTGlzdEVudGVyUHJlZGljYXRlID0gKGRyYWc6IENka0RyYWcsIGRyb3A6IENka0Ryb3BMaXN0KSA9PiB7XHJcbiAgICBpZiAoZHJvcCA9PSB0aGlzLnBsYWNlaG9sZGVyKVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBpZiAoZHJvcCAhPSB0aGlzLmFjdGl2ZUNvbnRhaW5lcilcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGxldCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBzb3VyY2VFbGVtZW50ID0gZHJhZy5kcm9wQ29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIGxldCBkcm9wRWxlbWVudCA9IGRyb3AuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgIGxldCBkcmFnSW5kZXggPSBfX2luZGV4T2YoZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgKHRoaXMuc291cmNlID8gcGhFbGVtZW50IDogc291cmNlRWxlbWVudCkpO1xyXG4gICAgbGV0IGRyb3BJbmRleCA9IF9faW5kZXhPZihkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBkcm9wRWxlbWVudCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNvdXJjZSkge1xyXG4gICAgICB0aGlzLnNvdXJjZUluZGV4ID0gZHJhZ0luZGV4O1xyXG4gICAgICB0aGlzLnNvdXJjZSA9IGRyYWcuZHJvcENvbnRhaW5lcjtcclxuXHJcbiAgICAgIHBoRWxlbWVudC5zdHlsZS53aWR0aCA9IHNvdXJjZUVsZW1lbnQuY2xpZW50V2lkdGggKyAncHgnO1xyXG4gICAgICBwaEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gc291cmNlRWxlbWVudC5jbGllbnRIZWlnaHQgKyAncHgnO1xyXG5cclxuICAgICAgc291cmNlRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHNvdXJjZUVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFyZ2V0SW5kZXggPSBkcm9wSW5kZXg7XHJcbiAgICB0aGlzLnRhcmdldCA9IGRyb3A7XHJcblxyXG4gICAgcGhFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBoRWxlbWVudCwgKGRyb3BJbmRleCA+IGRyYWdJbmRleFxyXG4gICAgICA/IGRyb3BFbGVtZW50Lm5leHRTaWJsaW5nIDogZHJvcEVsZW1lbnQpKTtcclxuXHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyLmVudGVyKGRyYWcsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQsIGRyYWcuZWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKiogRGV0ZXJtaW5lcyB0aGUgcG9pbnQgb2YgdGhlIHBhZ2UgdGhhdCB3YXMgdG91Y2hlZCBieSB0aGUgdXNlci4gKi9cclxuICBnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcbiAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxyXG4gICAgY29uc3QgcG9pbnQgPSBfX2lzVG91Y2hFdmVudChldmVudCkgPyAoZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkgOiBldmVudDtcclxuICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy52aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB4OiBwb2ludC5wYWdlWCAtIHNjcm9sbFBvc2l0aW9uLmxlZnQsXHJcbiAgICAgIHk6IHBvaW50LnBhZ2VZIC0gc2Nyb2xsUG9zaXRpb24udG9wXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25SZW1vdmUoaXRlbTogeyB1cmw6IHN0cmluZywgaWQ/OiBzdHJpbmcgfSkge1xyXG4gICAgbGV0IGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5pdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gX19pbmRleE9mKGNvbGxlY3Rpb24sIG5vZGUpIHtcclxuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBub2RlKTtcclxufTtcclxuXHJcbi8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4gKi9cclxuZnVuY3Rpb24gX19pc1RvdWNoRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogZXZlbnQgaXMgVG91Y2hFdmVudCB7XHJcbiAgcmV0dXJuIGV2ZW50LnR5cGUuc3RhcnRzV2l0aCgndG91Y2gnKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX19pc0luc2lkZURyb3BMaXN0Q2xpZW50UmVjdChkcm9wTGlzdDogQ2RrRHJvcExpc3QsIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgY29uc3QgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSA9IGRyb3BMaXN0LmVsZW1lbnQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICByZXR1cm4geSA+PSB0b3AgJiYgeSA8PSBib3R0b20gJiYgeCA+PSBsZWZ0ICYmIHggPD0gcmlnaHQ7XHJcbn1cclxuXHJcblxyXG4iXX0=