ngx-explorer-dnd
Version:
## _Drag & Drop in Angular like in a desktop explorer!_
217 lines • 26.7 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, EventEmitter, HostListener, Inject, Input, Output, } from '@angular/core';
import { EXPLORER_DND_CONTAINER, } from './ngx-explorer-container.directive';
import { extendStyles } from '../core/css-helper';
import * as i0 from "@angular/core";
import * as i1 from "./ngx-explorer-container.directive";
export class NgxDragSelectionDirective {
//#endregion
constructor(_document, _parentDrag) {
this._document = _document;
this._parentDrag = _parentDrag;
/** The current x position of the selection div. */
this.startX = 0;
/** The current y position of the selection div. */
this.startY = 0;
/**
* The initial x position of the selection div.
* Will be used to handle negative x position.
*/
this.initialX = 0;
/**
* The initial y position of the selection div.
* Will be used to handle negative y position.
*/
this.initialY = 0;
/**
* Will be used to set current selected elements to check has
* the current selected elements changed to before.
*/
this.selectedElements = new Set();
/** The current x position from the fired event. */
this.currentX = 0;
/** the current y position from the fired event. */
this.currentY = 0;
/** The current calculated width of the selection div. */
this.currentWidth = 0;
/** The current calculated height of the selection div. */
this.currentHeight = 0;
/** Will be true if selection in progress. */
this.selectingInProgress = false;
/** Sets whether ngx-drag-selection can be used. */
this.selectionAllowed = true;
/** Event emitted when the selected elements are changed. */
this.selectedElementsChange = new EventEmitter();
}
//#region Helper
/** Checks if a registered element of type `ngx-explorer-item` inside the selection div rect. */
checkIfElementInsideRect(rect, selectionBorder) {
if (((selectionBorder.x >= rect.x &&
selectionBorder.x <= rect.x + rect.width) ||
(selectionBorder.x <= rect.x &&
selectionBorder.x + selectionBorder.width >= rect.x)) &&
((selectionBorder.y >= rect.y &&
selectionBorder.y <= rect.y + rect.height) ||
(selectionBorder.y <= rect.y &&
selectionBorder.y + selectionBorder.height >= rect.y))) {
return true;
}
else {
return false;
}
}
/** Checks whether the selected elements have changed. */
checkIfSelectedElementsChanged(items) {
let changed = false;
for (let item of items) {
if (!this.selectedElements.has(item)) {
// data has changed...
changed = true;
}
}
if (!changed) {
if (this.selectedElements.size !== items.length)
changed = true;
}
if (changed)
// Changed? So "reset" selectedElements
this.selectedElements = new Set(items);
return changed;
}
/** Creates the selection div into document.body. */
createSelectionDiv() {
if (this.selectionDivElement) {
this.selectionDiv = this.selectionDivElement;
extendStyles(this.selectionDiv.style, {
display: 'none',
position: 'fixed',
top: '0',
left: '0',
width: '0px',
height: '0px',
});
}
else {
this.selectionDiv = document.createElement('div');
extendStyles(this.selectionDiv.style, {
display: 'none',
position: 'fixed',
opacity: '0.5',
top: '0',
left: '0',
'border-style': 'solid',
'border-radius': '6px',
'border-width': '0',
'border-color': '#7a7afa',
'background-color': '#add8e6',
width: '0px',
height: '0px',
});
}
this._document.body.appendChild(this.selectionDiv);
}
/** On `mousemove` this will set the current position and width of the selection div. */
setSelectionDivPosition(mouseX, mouseY) {
this.currentX = mouseX;
this.currentY = mouseY;
this.currentWidth = this.currentX - this.startX;
this.currentHeight = this.currentY - this.startY;
if (this.initialX >= this.currentX) {
this.currentWidth = this.initialX - this.currentX;
this.startX = this.currentX;
}
if (this.initialY >= this.currentY) {
this.currentHeight = this.initialY - this.currentY;
this.startY = this.currentY;
}
// div is not visible on start
if (this.selectionDiv.style.display === 'none') {
this.selectionDiv.style.display = 'unset';
}
extendStyles(this.selectionDiv.style, {
left: this.startX + 'px',
top: this.startY + 'px',
width: this.currentWidth + 'px',
height: this.currentHeight + 'px',
});
}
//#region HostListener
onMouseDown(ev) {
if (!this.selectionAllowed) {
ev.preventDefault();
return;
}
if (!this.selectingInProgress) {
this.startX = ev.x;
this.startY = ev.y;
this.initialX = this.startX;
this.initialY = this.startY;
this.selectingInProgress = true;
this.createSelectionDiv();
this.setSelectionDivPosition(this.startX, this.startY);
}
}
onMouseMove(ev) {
if (!this.selectingInProgress || !this.selectionAllowed) {
ev.preventDefault();
return;
}
this.setSelectionDivPosition(ev.clientX, ev.clientY);
if (this._parentDrag) {
const data = this._parentDrag.getElementsInsideSelectionDiv(this.startX, this.startY, this.currentWidth, this.currentHeight);
const result = [];
if (data.length > 0) {
for (let _data of data) {
const fileFolderComponent = _data.getHostComponent();
if (fileFolderComponent) {
result.push(fileFolderComponent);
}
}
}
if (this.checkIfSelectedElementsChanged(result.map((data) => {
return data.__ngContext__;
}))) {
this.selectedElementsChange.emit({
count: result.length,
data: result,
});
}
}
}
onMouseUp(ev) {
if (this.selectingInProgress) {
this.selectingInProgress = false;
this._document.body.removeChild(this.selectionDiv);
}
}
}
NgxDragSelectionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: NgxDragSelectionDirective, deps: [{ token: DOCUMENT }, { token: EXPLORER_DND_CONTAINER }], target: i0.ɵɵFactoryTarget.Directive });
NgxDragSelectionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.1", type: NgxDragSelectionDirective, selector: "[ngxDragSelection]", inputs: { selectionAllowed: "selectionAllowed", selectionDivElement: "selectionDivElement" }, outputs: { selectedElementsChange: "selectedElementsChange" }, host: { listeners: { "document:mousedown": "onMouseDown($event)", "document:mousemove": "onMouseMove($event)", "document:mouseup": "onMouseUp($event)" } }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: NgxDragSelectionDirective, decorators: [{
type: Directive,
args: [{
selector: '[ngxDragSelection]',
}]
}], ctorParameters: function () { return [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.NgxExplorerContainerDirective, decorators: [{
type: Inject,
args: [EXPLORER_DND_CONTAINER]
}] }]; }, propDecorators: { selectionAllowed: [{
type: Input
}], selectionDivElement: [{
type: Input
}], selectedElementsChange: [{
type: Output
}], onMouseDown: [{
type: HostListener,
args: ['document:mousedown', ['$event']]
}], onMouseMove: [{
type: HostListener,
args: ['document:mousemove', ['$event']]
}], onMouseUp: [{
type: HostListener,
args: ['document:mouseup', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRyYWctc2VsZWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHBsb3Jlci1kbmQvc3JjL2xpYi9kaXJlY3RpdmVzL25neC1kcmFnLXNlbGVjdGlvbi5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsc0JBQXNCLEdBRXZCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7QUFNbEQsTUFBTSxPQUFPLHlCQUF5QjtJQWdLcEMsWUFBWTtJQUVaLFlBQzRCLFNBQW1CLEVBRXJDLFdBQTJDO1FBRnpCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFFckMsZ0JBQVcsR0FBWCxXQUFXLENBQWdDO1FBcEtyRCxtREFBbUQ7UUFDM0MsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUUzQixtREFBbUQ7UUFDM0MsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUUzQjs7O1dBR0c7UUFDSyxhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBRTdCOzs7V0FHRztRQUNLLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0I7OztXQUdHO1FBQ0sscUJBQWdCLEdBQWdCLElBQUksR0FBRyxFQUFVLENBQUM7UUFFMUQsbURBQW1EO1FBQzNDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0IsbURBQW1EO1FBQzNDLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFFN0IseURBQXlEO1FBQ2pELGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRWpDLDBEQUEwRDtRQUNsRCxrQkFBYSxHQUFXLENBQUMs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VSx5QkFBeUIsa0JBbUsxQixRQUFRLGFBQ1Isc0JBQXNCOzBHQXBLckIseUJBQXlCOzJGQUF6Qix5QkFBeUI7a0JBSHJDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtpQkFDL0I7OzBCQW9LSSxNQUFNOzJCQUFDLFFBQVE7OzBCQUNmLE1BQU07MkJBQUMsc0JBQXNCOzRDQXhIdkIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFHSSxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBd0hQLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFvQjlDLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkF5QzlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBFWFBMT1JFUl9ETkRfQ09OVEFJTkVSLFxuICBOZ3hFeHBsb3JlckNvbnRhaW5lckRpcmVjdGl2ZSxcbn0gZnJvbSAnLi9uZ3gtZXhwbG9yZXItY29udGFpbmVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBleHRlbmRTdHlsZXMgfSBmcm9tICcuLi9jb3JlL2Nzcy1oZWxwZXInO1xuaW1wb3J0IHsgRmlsZUZvbGRlciB9IGZyb20gJy4uL2NvcmUvZmlsZS1mb2xkZXInO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4RHJhZ1NlbGVjdGlvbl0nLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hEcmFnU2VsZWN0aW9uRGlyZWN0aXZlIHtcbiAgLyoqIFRoZSBjdXJyZW50IHggcG9zaXRpb24gb2YgdGhlIHNlbGVjdGlvbiBkaXYuICovXG4gIHByaXZhdGUgc3RhcnRYOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBUaGUgY3VycmVudCB5IHBvc2l0aW9uIG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBwcml2YXRlIHN0YXJ0WTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgeCBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0aW9uIGRpdi5cbiAgICogV2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBuZWdhdGl2ZSB4IHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsWDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgeSBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0aW9uIGRpdi5cbiAgICogV2lsbCBiZSB1c2VkIHRvIGhhbmRsZSBuZWdhdGl2ZSB5IHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsWTogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogV2lsbCBiZSB1c2VkIHRvIHNldCBjdXJyZW50IHNlbGVjdGVkIGVsZW1lbnRzIHRvIGNoZWNrIGhhc1xuICAgKiB0aGUgY3VycmVudCBzZWxlY3RlZCBlbGVtZW50cyBjaGFuZ2VkIHRvIGJlZm9yZS5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0ZWRFbGVtZW50czogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAvKiogVGhlIGN1cnJlbnQgeCBwb3NpdGlvbiBmcm9tIHRoZSBmaXJlZCBldmVudC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WDogbnVtYmVyID0gMDtcblxuICAvKiogdGhlIGN1cnJlbnQgeSBwb3NpdGlvbiBmcm9tIHRoZSBmaXJlZCBldmVudC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WTogbnVtYmVyID0gMDtcblxuICAvKiogVGhlIGN1cnJlbnQgY2FsY3VsYXRlZCB3aWR0aCBvZiB0aGUgc2VsZWN0aW9uIGRpdi4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50V2lkdGg6IG51bWJlciA9IDA7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGNhbGN1bGF0ZWQgaGVpZ2h0IG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBwcml2YXRlIGN1cnJlbnRIZWlnaHQ6IG51bWJlciA9IDA7XG5cbiAgLyoqIFdpbGwgYmUgdHJ1ZSBpZiBzZWxlY3Rpb24gaW4gcHJvZ3Jlc3MuICovXG4gIHByaXZhdGUgc2VsZWN0aW5nSW5Qcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUaGUgc2VsZWN0aW9uIGJvcmRlciBjcmVhdGVkIGJ5IHRoaXMgZGlyZWN0aXZlLiAqL1xuICBwcml2YXRlIHNlbGVjdGlvbkRpdiE6IEhUTUxFbGVtZW50O1xuXG4gIC8qKiBTZXRzIHdoZXRoZXIgbmd4LWRyYWctc2VsZWN0aW9uIGNhbiBiZSB1c2VkLiAgKi9cbiAgQElucHV0KCkgc2VsZWN0aW9uQWxsb3dlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqIFNldCBhIGN1c3RvbSBzZWxlY3Rpb24gZGl2IGBIVE1MRWxlbWVudGAuICovXG4gIEBJbnB1dCgpIHNlbGVjdGlvbkRpdkVsZW1lbnQhOiBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgYXJlIGNoYW5nZWQuICovXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEVsZW1lbnRzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8e1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgZGF0YTogRmlsZUZvbGRlcltdO1xuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvLyNyZWdpb24gSGVscGVyXG4gIC8qKiBDaGVja3MgaWYgYSByZWdpc3RlcmVkIGVsZW1lbnQgb2YgdHlwZSBgbmd4LWV4cGxvcmVyLWl0ZW1gIGluc2lkZSB0aGUgc2VsZWN0aW9uIGRpdiByZWN0LiAqL1xuICBjaGVja0lmRWxlbWVudEluc2lkZVJlY3QoXG4gICAgcmVjdDogYW55LFxuICAgIHNlbGVjdGlvbkJvcmRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICAoKHNlbGVjdGlvbkJvcmRlci54ID49IHJlY3QueCAmJlxuICAgICAgICBzZWxlY3Rpb25Cb3JkZXIueCA8PSByZWN0LnggKyByZWN0LndpZHRoKSB8fFxuICAgICAgICAoc2VsZWN0aW9uQm9yZGVyLnggPD0gcmVjdC54ICYmXG4gICAgICAgICAgc2VsZWN0aW9uQm9yZGVyLnggKyBzZWxlY3Rpb25Cb3JkZXIud2lkdGggPj0gcmVjdC54KSkgJiZcbiAgICAgICgoc2VsZWN0aW9uQm9yZGVyLnkgPj0gcmVjdC55ICYmXG4gICAgICAgIHNlbGVjdGlvbkJvcmRlci55IDw9IHJlY3QueSArIHJlY3QuaGVpZ2h0KSB8fFxuICAgICAgICAoc2VsZWN0aW9uQm9yZGVyLnkgPD0gcmVjdC55ICYmXG4gICAgICAgICAgc2VsZWN0aW9uQm9yZGVyLnkgKyBzZWxlY3Rpb25Cb3JkZXIuaGVpZ2h0ID49IHJlY3QueSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgaGF2ZSBjaGFuZ2VkLiAgKi9cbiAgY2hlY2tJZlNlbGVjdGVkRWxlbWVudHNDaGFuZ2VkKGl0ZW1zOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRFbGVtZW50cy5oYXMoaXRlbSkpIHtcbiAgICAgICAgLy8gZGF0YSBoYXMgY2hhbmdlZC4uLlxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZWQpIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkRWxlbWVudHMuc2l6ZSAhPT0gaXRlbXMubGVuZ3RoKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZClcbiAgICAgIC8vIENoYW5nZWQ/IFNvIFwicmVzZXRcIiBzZWxlY3RlZEVsZW1lbnRzXG4gICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBuZXcgU2V0KGl0ZW1zKTtcblxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgdGhlIHNlbGVjdGlvbiBkaXYgaW50byBkb2N1bWVudC5ib2R5LiAqL1xuICBjcmVhdGVTZWxlY3Rpb25EaXYoKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uRGl2RWxlbWVudCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25EaXYgPSB0aGlzLnNlbGVjdGlvbkRpdkVsZW1lbnQ7XG5cbiAgICAgIGV4dGVuZFN0eWxlcyh0aGlzLnNlbGVjdGlvbkRpdi5zdHlsZSwge1xuICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICB3aWR0aDogJzBweCcsXG4gICAgICAgIGhlaWdodDogJzBweCcsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3Rpb25EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuc2VsZWN0aW9uRGl2LnN0eWxlLCB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIG9wYWNpdHk6ICcwLjUnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAnYm9yZGVyLXN0eWxlJzogJ3NvbGlkJyxcbiAgICAgICAgJ2JvcmRlci1yYWRpdXMnOiAnNnB4JyxcbiAgICAgICAgJ2JvcmRlci13aWR0aCc6ICcwJyxcbiAgICAgICAgJ2JvcmRlci1jb2xvcic6ICcjN2E3YWZhJyxcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAnI2FkZDhlNicsXG4gICAgICAgIHdpZHRoOiAnMHB4JyxcbiAgICAgICAgaGVpZ2h0OiAnMHB4JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5zZWxlY3Rpb25EaXYpO1xuICB9XG5cbiAgLyoqIE9uIGBtb3VzZW1vdmVgIHRoaXMgd2lsbCBzZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHdpZHRoIG9mIHRoZSBzZWxlY3Rpb24gZGl2LiAqL1xuICBzZXRTZWxlY3Rpb25EaXZQb3NpdGlvbihtb3VzZVg6IG51bWJlciwgbW91c2VZOiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRYID0gbW91c2VYO1xuICAgIHRoaXMuY3VycmVudFkgPSBtb3VzZVk7XG4gICAgdGhpcy5jdXJyZW50V2lkdGggPSB0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gdGhpcy5jdXJyZW50WSAtIHRoaXMuc3RhcnRZO1xuICAgIGlmICh0aGlzLmluaXRpYWxYID49IHRoaXMuY3VycmVudFgpIHtcbiAgICAgIHRoaXMuY3VycmVudFdpZHRoID0gdGhpcy5pbml0aWFsWCAtIHRoaXMuY3VycmVudFg7XG4gICAgICB0aGlzLnN0YXJ0WCA9IHRoaXMuY3VycmVudFg7XG4gICAgfVxuICAgIGlmICh0aGlzLmluaXRpYWxZID49IHRoaXMuY3VycmVudFkpIHtcbiAgICAgIHRoaXMuY3VycmVudEhlaWdodCA9IHRoaXMuaW5pdGlhbFkgLSB0aGlzLmN1cnJlbnRZO1xuICAgICAgdGhpcy5zdGFydFkgPSB0aGlzLmN1cnJlbnRZO1xuICAgIH1cblxuICAgIC8vIGRpdiBpcyBub3QgdmlzaWJsZSBvbiBzdGFydFxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkRpdi5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uRGl2LnN0eWxlLmRpc3BsYXkgPSAndW5zZXQnO1xuICAgIH1cbiAgICBleHRlbmRTdHlsZXModGhpcy5zZWxlY3Rpb25EaXYuc3R5bGUsIHtcbiAgICAgIGxlZnQ6IHRoaXMuc3RhcnRYICsgJ3B4JyxcbiAgICAgIHRvcDogdGhpcy5zdGFydFkgKyAncHgnLFxuICAgICAgd2lkdGg6IHRoaXMuY3VycmVudFdpZHRoICsgJ3B4JyxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0ICsgJ3B4JyxcbiAgICB9KTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogRG9jdW1lbnQsXG4gICAgQEluamVjdChFWFBMT1JFUl9ETkRfQ09OVEFJTkVSKVxuICAgIHByaXZhdGUgX3BhcmVudERyYWc/OiBOZ3hFeHBsb3JlckNvbnRhaW5lckRpcmVjdGl2ZVxuICApIHt9XG5cbiAgLy8jcmVnaW9uIEhvc3RMaXN0ZW5lclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBvbk1vdXNlRG93bihldjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGlvbkFsbG93ZWQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGluZ0luUHJvZ3Jlc3MpIHtcbiAgICAgIHRoaXMuc3RhcnRYID0gZXYueDtcbiAgICAgIHRoaXMuc3RhcnRZID0gZXYueTtcbiAgICAgIHRoaXMuaW5pdGlhbFggPSB0aGlzLnN0YXJ0WDtcbiAgICAgIHRoaXMuaW5pdGlhbFkgPSB0aGlzLnN0YXJ0WTtcblxuICAgICAgdGhpcy5zZWxlY3RpbmdJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHRoaXMuY3JlYXRlU2VsZWN0aW9uRGl2KCk7XG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkRpdlBvc2l0aW9uKHRoaXMuc3RhcnRYLCB0aGlzLnN0YXJ0WSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZU1vdmUoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RpbmdJblByb2dyZXNzIHx8ICF0aGlzLnNlbGVjdGlvbkFsbG93ZWQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0U2VsZWN0aW9uRGl2UG9zaXRpb24oZXYuY2xpZW50WCwgZXYuY2xpZW50WSk7XG5cbiAgICBpZiAodGhpcy5fcGFyZW50RHJhZykge1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX3BhcmVudERyYWcuZ2V0RWxlbWVudHNJbnNpZGVTZWxlY3Rpb25EaXYoXG4gICAgICAgIHRoaXMuc3RhcnRYLFxuICAgICAgICB0aGlzLnN0YXJ0WSxcbiAgICAgICAgdGhpcy5jdXJyZW50V2lkdGgsXG4gICAgICAgIHRoaXMuY3VycmVudEhlaWdodFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogRmlsZUZvbGRlcltdID0gW107XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IF9kYXRhIG9mIGRhdGEpIHtcbiAgICAgICAgICBjb25zdCBmaWxlRm9sZGVyQ29tcG9uZW50ID0gX2RhdGEuZ2V0SG9zdENvbXBvbmVudCgpO1xuICAgICAgICAgIGlmIChmaWxlRm9sZGVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChmaWxlRm9sZGVyQ29tcG9uZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNoZWNrSWZTZWxlY3RlZEVsZW1lbnRzQ2hhbmdlZChcbiAgICAgICAgICByZXN1bHQubWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGRhdGEgYXMgYW55KS5fX25nQ29udGV4dF9fO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRWxlbWVudHNDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY291bnQ6IHJlc3VsdC5sZW5ndGgsXG4gICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2OiBhbnkpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RpbmdJblByb2dyZXNzKSB7XG4gICAgICB0aGlzLnNlbGVjdGluZ0luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5zZWxlY3Rpb25EaXYpO1xuICAgIH1cbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiJdfQ==