@asadi/angular-date-components
Version:
`Angular Date Components` is a comprehensive angular library of date-related components designed to meet the needs of applications that require localization based on various calendar systems. While the package currently includes two powerful components (S
192 lines • 36.9 kB
JavaScript
import { Subject } from "rxjs";
import { Interactions } from "./Interactions";
export class FlatEventBuilder {
constructor() {
this._data = [];
this._tvc = null;
this._options = null;
this._renderer = null;
this.eventHeight = 40;
this.eventSelectSubject = new Subject();
this.eventClearSubject = new Subject();
this.eventSelectionStream = this.eventSelectSubject.asObservable();
this.heightUpdateStrategy = (eventsCount) => {
return `${Math.max(eventsCount * (this.eventHeight + 5) + 50, 70)}px`;
};
}
set data(data) {
data = Array.isArray(data) ? data : [];
this._data = data;
this.buildEvents();
}
get data() {
return this._data;
}
init(renderer, tvc, options) {
this._tvc = tvc;
this._options = options;
this._renderer = renderer;
this.buildEvents();
}
clearEvents() {
if (this._tvc == null)
return;
const rowsCount = this._tvc.rowsCount();
this.eventClearSubject.next();
for (let i = 0; i < rowsCount; i++) {
this._tvc.row(i).clearEvents();
}
}
buildEvents() {
if (this._tvc == null)
return;
this.clearEvents();
const events = this.data;
const rowsCount = this._tvc.rowsCount();
for (let i = 0; i < rowsCount; i++) {
const row = this._tvc.row(i);
if (row.isSticky)
continue;
const rowEvents = events.filter(e => e.rowStart <= i && e.rowEnd >= i);
if (rowEvents.length == 0) {
const height = this.heightUpdateStrategy(0);
row.setHeight(height);
continue;
}
let rowMaxStack = 0;
for (const e of rowEvents) {
const attributes = this.calculateAttributes(e, row, rowMaxStack);
if (attributes.width == '0%')
continue;
if (attributes.level + 1 > rowMaxStack) {
rowMaxStack = attributes.level + 1;
const height = this.heightUpdateStrategy(rowMaxStack);
row.setHeight(height);
}
this.buildEvent(e, attributes, row);
}
}
}
calculateAttributes(event, row, maxStackSize) {
if (this._options == null || this._tvc == null) {
throw new Error("required options are not provided");
}
const direction = this._options.direction;
const horizontalOffset = this.horizontalOffset(event, row);
const width = this.width(event, row);
const level = this.level(event, row, maxStackSize);
const attributes = {
backgroundColor: event.data.bgColor,
left: direction === 'rtl' ? 'unset' : `${horizontalOffset}`,
right: direction === 'rtl' ? `${horizontalOffset}` : 'unset',
textAlign: direction === 'rtl' ? 'right' : 'left',
level: level,
width: width,
classList: ['table-event']
};
if (event.rowStart == row.index && event.columnStart != null) {
attributes.classList.push('event-start-day');
}
if (event.rowEnd == row.index && event.columnEnd != null) {
attributes.classList.push('event-end-day');
}
return attributes;
}
horizontalOffset(event, row) {
const offsetX = event.rowStart != row.index || event.columnStart == null ? 0 : event.offsetX;
const columnStart = event.columnStart == null || row.index != event.rowStart ? 0 : event.columnStart;
const cellWidth = row.width / row.cells.length;
return `${cellWidth * (offsetX + columnStart) + row.horizontalOffset}px`;
}
width(event, row) {
const offsetX = row.index == event.rowStart && event.columnStart != null ? event.offsetX : 0;
const columnStart = event.columnStart == null || row.index != event.rowStart ? 0 : event.columnStart;
const fractionX = row.index == event.rowEnd && event.columnEnd != null ? event.fractionX : 1;
const columnEnd = event.columnEnd == null || row.index != event.rowEnd ? (row.cells.length - 1) : event.columnEnd;
const cellWidth = columnEnd - columnStart - offsetX + fractionX;
return (row.width / row.cells.length) * cellWidth + 'px';
}
level(event, row, maxStackSize) {
const previousViewEvents = row.attachedEvents;
const previousEventIds = previousViewEvents.map((viewEvent) => {
return viewEvent.getAttribute('id');
});
const previousEvents = this.data.filter(item => previousEventIds.includes(item.data.id.toString()));
let selfStart = event.columnStart == null ? event.offsetX + event.overlapTolerance : event.columnStart + event.offsetX + event.overlapTolerance;
if (row.index != event.rowStart) {
selfStart = 0;
}
let selfEnd = event.columnEnd == null ? (row.cells.length + event.fractionX - event.overlapTolerance - 1) : event.columnEnd + event.fractionX - event.overlapTolerance;
if (row.index != event.rowEnd) {
selfEnd = row.cells.length;
}
const collisionneurEvents = previousEvents.filter(e => {
if (e.columnStart == null && e.columnEnd == null) {
return true;
}
let eventStart = e.columnStart == null ? e.offsetX : (e.columnStart + e.offsetX);
if (e.rowStart != row.index) {
eventStart = 0;
}
let eventEnd = e.columnEnd == null ? row.cells.length + e.fractionX - 1 : e.columnEnd + e.fractionX;
if (e.rowEnd != row.index) {
eventEnd = row.cells.length;
}
return (selfStart >= eventStart && selfStart <= eventEnd) ||
(selfEnd >= eventStart && selfEnd <= eventEnd) ||
(selfStart < eventStart && selfEnd > eventEnd);
});
const collisionneurViewEvents = previousViewEvents.filter((viewEvent) => collisionneurEvents.map((e) => e.data.id.toString()).includes(viewEvent.getAttribute('id')));
var level = 0;
for (let i = 0; i <= maxStackSize; i++) {
const isLevelFilled = collisionneurViewEvents.map((viewEvent) => viewEvent.getAttribute('level')).includes(i.toString());
if (!isLevelFilled) {
level = i;
break;
}
}
return level;
}
buildEvent(event, attributes, row) {
if (this._renderer == null) {
throw new Error("options are not provided");
}
const eventElRef = this._renderer.createElement('div');
this._renderer.appendChild(eventElRef, this._renderer.createText(event.data.title));
this._renderer.setStyle(eventElRef, 'background-color', attributes.backgroundColor);
this._renderer.setStyle(eventElRef, 'left', attributes.left);
this._renderer.setStyle(eventElRef, 'right', attributes.right);
this._renderer.setStyle(eventElRef, 'top', `${attributes.level * (this.eventHeight + 5) + 25}px`);
this._renderer.setStyle(eventElRef, 'width', `${attributes.width}`);
this._renderer.setStyle(eventElRef, 'height', `${this.eventHeight}px`);
this._renderer.setStyle(eventElRef, 'text-align', attributes.textAlign);
this._renderer.setAttribute(eventElRef, 'id', event.data.id.toString());
this._renderer.setAttribute(eventElRef, 'level', attributes.level.toString());
this._renderer.setAttribute(eventElRef, 'row-index', row.index.toString());
attributes.classList.forEach((className) => {
this._renderer.addClass(eventElRef, className);
});
if (event.data.isClickable) {
Interactions.click(eventElRef, this.eventClearSubject.asObservable()).subscribe((e) => {
this.eventSelectSubject.next({ dom: eventElRef, event: event, jsEvent: e });
});
this._renderer.setStyle(eventElRef, 'cursor', 'pointer');
}
if (event.data.tooltip) {
const tooltipRef = this._renderer.createElement('div');
this._renderer.addClass(tooltipRef, 'tooltip');
this._renderer.setAttribute(tooltipRef, 'id', event.data.id.toString());
this._renderer.appendChild(tooltipRef, this._renderer.createText(event.data.tooltip));
Interactions.tooltip(eventElRef, 300, this.eventClearSubject.asObservable(), this._tvc?.scrollableContainer).subscribe(e => {
if (e.state === 'hide') {
row.clearTooltips();
}
else {
row.attachTooltip(tooltipRef, e.coordinates);
}
});
}
row.attachEvent(eventElRef);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdC1ldmVudC1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXNhZGkvYW5ndWxhci1kYXRlLWNvbXBvbmVudHMvY29yZS9zcmMvZmxhdC1ldmVudC1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTlDLE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFFWSxVQUFLLEdBQXFCLEVBQUUsQ0FBQztRQUM3QixTQUFJLEdBQTZCLElBQUksQ0FBQztRQUN0QyxhQUFRLEdBQXVCLElBQUksQ0FBQztRQUNwQyxjQUFTLEdBQXFCLElBQUksQ0FBQztRQUVuQyxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQix1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztRQUM5RCxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBR3ZDLHlCQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQW9GL0QseUJBQW9CLEdBQUcsQ0FBQyxXQUFtQixFQUFFLEVBQUU7WUFDbkQsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztRQUMxRSxDQUFDLENBQUE7SUFpTUwsQ0FBQztJQXJSRyxJQUFJLElBQUksQ0FBQyxJQUFzQjtRQUUzQixJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7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SUFDaEMsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVuZGVyZXIyIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQURDSU9wdGlvbnMsIEFEQ0lUYWJsZUV2ZW50LCBBRENJVGFibGVFdmVudEF0dHJpYnV0ZXMsIEFEQ0lUYWJsZUV2ZW50U2VsZWN0RXZlbnQsIEFEQ0lUYWJsZVZpZXdDVFJMIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IEFEQ1RhYmxlUm93VG9vbHMgfSBmcm9tIFwiLi91dGlscy90YWJsZS12aWV3LXJvdy50b29sc1wiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgSW50ZXJhY3Rpb25zIH0gZnJvbSBcIi4vSW50ZXJhY3Rpb25zXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmxhdEV2ZW50QnVpbGRlciBcclxue1xyXG4gICAgcHJpdmF0ZSBfZGF0YTogQURDSVRhYmxlRXZlbnRbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBfdHZjOiBBRENJVGFibGVWaWV3Q1RSTCB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfb3B0aW9uczogQURDSU9wdGlvbnMgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIGV2ZW50SGVpZ2h0ID0gNDA7XHJcbiAgICBwcml2YXRlIGV2ZW50U2VsZWN0U3ViamVjdCA9IG5ldyBTdWJqZWN0PEFEQ0lUYWJsZUV2ZW50U2VsZWN0RXZlbnQ+KCk7XHJcbiAgICBwcml2YXRlIGV2ZW50Q2xlYXJTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcblxyXG4gICAgcmVhZG9ubHkgZXZlbnRTZWxlY3Rpb25TdHJlYW0gPSB0aGlzLmV2ZW50U2VsZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBzZXQgZGF0YShkYXRhOiBBRENJVGFibGVFdmVudFtdKVxyXG4gICAge1xyXG4gICAgICAgIGRhdGEgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtdO1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG5cclxuICAgICAgICB0aGlzLmJ1aWxkRXZlbnRzKCk7XHJcbiAgICB9XHJcbiAgICBnZXQgZGF0YSgpOiBBRENJVGFibGVFdmVudFtdXHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChcclxuICAgICAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHR2YzogQURDSVRhYmxlVmlld0NUUkwsXHJcbiAgICAgICAgb3B0aW9uczogQURDSU9wdGlvbnNcclxuICAgIClcclxuICAgIHtcclxuICAgICAgICB0aGlzLl90dmMgPSB0dmM7XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSByZW5kZXJlcjtcclxuXHJcbiAgICAgICAgdGhpcy5idWlsZEV2ZW50cygpO1xyXG4gICAgfVxyXG5cclxuICBjbGVhckV2ZW50cygpOiB2b2lkIFxyXG4gIHtcclxuICAgIGlmKHRoaXMuX3R2YyA9PSBudWxsKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IHJvd3NDb3VudCA9IHRoaXMuX3R2Yy5yb3dzQ291bnQoKTtcclxuXHJcbiAgICB0aGlzLmV2ZW50Q2xlYXJTdWJqZWN0Lm5leHQoKTtcclxuXHJcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgcm93c0NvdW50OyBpKyspXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5fdHZjLnJvdyhpKS5jbGVhckV2ZW50cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgICBidWlsZEV2ZW50cygpOiB2b2lkXHJcbiAgICB7XHJcbiAgICAgICBpZih0aGlzLl90dmMgPT0gbnVsbCkgcmV0dXJuO1xyXG4gICAgICAgXHJcbiAgICAgICB0aGlzLmNsZWFyRXZlbnRzKCk7ICAgXHJcbiAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLmRhdGE7XHJcbiAgICAgICBjb25zdCByb3dzQ291bnQgPSB0aGlzLl90dmMucm93c0NvdW50KCk7XHJcblxyXG4gICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHJvd3NDb3VudDsgaSsrKVxyXG4gICAgICAge1xyXG4gICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX3R2Yy5yb3coaSk7XHJcblxyXG4gICAgICAgICAgIGlmKHJvdy5pc1N0aWNreSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgIGNvbnN0IHJvd0V2ZW50cyA9IGV2ZW50cy5maWx0ZXIoZSA9PiBlLnJvd1N0YXJ0IDw9IGkgJiYgZS5yb3dFbmQgPj0gaSk7XHJcbiAgICAgICAgICAgICBcclxuICAgICAgICAgICBpZihyb3dFdmVudHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodFVwZGF0ZVN0cmF0ZWd5KDApO1xyXG4gICAgICAgICAgICAgICByb3cuc2V0SGVpZ2h0KGhlaWdodCk7ICAgXHJcbiAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgIH0gICBcclxuXHJcbiAgICAgICAgICAgbGV0IHJvd01heFN0YWNrID0gMDsgICAgIFxyXG5cclxuICAgICAgICAgICBmb3IoY29uc3QgZSBvZiByb3dFdmVudHMpXHJcbiAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5jYWxjdWxhdGVBdHRyaWJ1dGVzKGUsIHJvdywgcm93TWF4U3RhY2spO1xyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgaWYoYXR0cmlidXRlcy53aWR0aCA9PSAnMCUnKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgICAgIGlmKGF0dHJpYnV0ZXMubGV2ZWwgKyAxID4gcm93TWF4U3RhY2spXHJcbiAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgIHJvd01heFN0YWNrID0gYXR0cmlidXRlcy5sZXZlbCArIDE7XHJcbiAgICAgICAgICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmhlaWdodFVwZGF0ZVN0cmF0ZWd5KHJvd01heFN0YWNrKTtcclxuICAgICAgICAgICAgICAgICAgIHJvdy5zZXRIZWlnaHQoaGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgdGhpcy5idWlsZEV2ZW50KGUsIGF0dHJpYnV0ZXMsIHJvdyk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGVpZ2h0VXBkYXRlU3RyYXRlZ3kgPSAoZXZlbnRzQ291bnQ6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBgJHtNYXRoLm1heChldmVudHNDb3VudCAqICh0aGlzLmV2ZW50SGVpZ2h0ICsgNSkgKyA1MCwgNzApfXB4YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUF0dHJpYnV0ZXMoZXZlbnQ6IEFEQ0lUYWJsZUV2ZW50LCByb3c6IEFEQ1RhYmxlUm93VG9vbHMsIG1heFN0YWNrU2l6ZTogbnVtYmVyKTogQURDSVRhYmxlRXZlbnRBdHRyaWJ1dGVzXHJcbiAgICB7XHJcbiAgICAgICAgaWYodGhpcy5fb3B0aW9ucyA9PSBudWxsIHx8IHRoaXMuX3R2YyA9PSBudWxsKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVxdWlyZWQgb3B0aW9ucyBhcmUgbm90IHByb3ZpZGVkXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5fb3B0aW9ucy5kaXJlY3Rpb247XHJcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbE9mZnNldCA9IHRoaXMuaG9yaXpvbnRhbE9mZnNldChldmVudCwgcm93KTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMud2lkdGgoZXZlbnQsIHJvdyk7XHJcbiAgICAgICAgY29uc3QgbGV2ZWwgPSB0aGlzLmxldmVsKGV2ZW50LCByb3csIG1heFN0YWNrU2l6ZSk7XHJcbiAgICBcclxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBRENJVGFibGVFdmVudEF0dHJpYnV0ZXMgPSBcclxuICAgICAgICB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGV2ZW50LmRhdGEuYmdDb2xvcixcclxuICAgICAgICAgIGxlZnQ6IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyAndW5zZXQnIDogYCR7aG9yaXpvbnRhbE9mZnNldH1gLFxyXG4gICAgICAgICAgcmlnaHQ6IGRpcmVjdGlvbiA9PT0gJ3J0bCcgPyBgJHtob3Jpem9udGFsT2Zmc2V0fWAgOiAndW5zZXQnLFxyXG4gICAgICAgICAgdGV4dEFsaWduOiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ3JpZ2h0JyA6ICdsZWZ0JyxcclxuICAgICAgICAgIGxldmVsOiBsZXZlbCxcclxuICAgICAgICAgIHdpZHRoOiB3aWR0aCxcclxuICAgICAgICAgIGNsYXNzTGlzdDogWyd0YWJsZS1ldmVudCddXHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgaWYoZXZlbnQucm93U3RhcnQgPT0gcm93LmluZGV4ICYmIGV2ZW50LmNvbHVtblN0YXJ0ICE9IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYXR0cmlidXRlcy5jbGFzc0xpc3QucHVzaCgnZXZlbnQtc3RhcnQtZGF5Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgaWYoZXZlbnQucm93RW5kID09IHJvdy5pbmRleCAmJiBldmVudC5jb2x1bW5FbmQgIT0gbnVsbClcclxuICAgICAgICB7XHJcbiAgICAgICAgICBhdHRyaWJ1dGVzLmNsYXNzTGlzdC5wdXNoKCdldmVudC1lbmQtZGF5JylcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhvcml6b250YWxPZmZzZXQoZXZlbnQ6IEFEQ0lUYWJsZUV2ZW50LCByb3c6IEFEQ1RhYmxlUm93VG9vbHMpOiBzdHJpbmdcclxuICAgIHtcclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gZXZlbnQucm93U3RhcnQgIT0gcm93LmluZGV4IHx8IGV2ZW50LmNvbHVtblN0YXJ0ID09IG51bGwgPyAwIDogZXZlbnQub2Zmc2V0WDtcclxuICAgICAgICBjb25zdCBjb2x1bW5TdGFydCA9IGV2ZW50LmNvbHVtblN0YXJ0ID09IG51bGwgfHwgcm93LmluZGV4ICE9IGV2ZW50LnJvd1N0YXJ0ID8gMCA6IGV2ZW50LmNvbHVtblN0YXJ0O1xyXG5cclxuICAgICAgICBjb25zdCBjZWxsV2lkdGggPSByb3cud2lkdGggLyByb3cuY2VsbHMubGVuZ3RoO1xyXG5cclxuICAgICAgICByZXR1cm4gYCR7Y2VsbFdpZHRoICogKG9mZnNldFggKyBjb2x1bW5TdGFydCkgKyByb3cuaG9yaXpvbnRhbE9mZnNldH1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB3aWR0aChldmVudDogQURDSVRhYmxlRXZlbnQsIHJvdzogQURDVGFibGVSb3dUb29scyk6IHN0cmluZ1xyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSByb3cuaW5kZXggPT0gZXZlbnQucm93U3RhcnQgJiYgZXZlbnQuY29sdW1uU3RhcnQgIT0gbnVsbCA/IGV2ZW50Lm9mZnNldFggOiAwO1xyXG4gICAgICAgIGNvbnN0IGNvbHVtblN0YXJ0ID0gZXZlbnQuY29sdW1uU3RhcnQgPT0gbnVsbCB8fCByb3cuaW5kZXggIT0gZXZlbnQucm93U3RhcnQgPyAwIDogZXZlbnQuY29sdW1uU3RhcnQ7XHJcbiAgICAgICAgY29uc3QgZnJhY3Rpb25YID0gcm93LmluZGV4ID09IGV2ZW50LnJvd0VuZCAmJiBldmVudC5jb2x1bW5FbmQgIT0gbnVsbCA/IGV2ZW50LmZyYWN0aW9uWCA6IDE7XHJcbiAgICAgICAgY29uc3QgY29sdW1uRW5kID0gZXZlbnQuY29sdW1uRW5kID09IG51bGwgfHwgcm93LmluZGV4ICE9IGV2ZW50LnJvd0VuZCAgPyAocm93LmNlbGxzLmxlbmd0aCAtIDEpIDogZXZlbnQuY29sdW1uRW5kO1xyXG5cclxuICAgICAgICBjb25zdCBjZWxsV2lkdGggPSBjb2x1bW5FbmQgLSBjb2x1bW5TdGFydCAtIG9mZnNldFggKyBmcmFjdGlvblg7XHJcblxyXG4gICAgICAgIHJldHVybiAocm93LndpZHRoIC8gcm93LmNlbGxzLmxlbmd0aCkgKiBjZWxsV2lkdGggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGV2ZWwoZXZlbnQ6IEFEQ0lUYWJsZUV2ZW50LCByb3c6IEFEQ1RhYmxlUm93VG9vbHMsIG1heFN0YWNrU2l6ZTogbnVtYmVyKTogbnVtYmVyXHJcbiAgICB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWaWV3RXZlbnRzID0gcm93LmF0dGFjaGVkRXZlbnRzO1xyXG5cclxuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50SWRzID0gcHJldmlvdXNWaWV3RXZlbnRzLm1hcCgodmlld0V2ZW50OiBIVE1MRWxlbWVudCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB2aWV3RXZlbnQuZ2V0QXR0cmlidXRlKCdpZCcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50cyA9IHRoaXMuZGF0YS5maWx0ZXIoaXRlbSA9PiBwcmV2aW91c0V2ZW50SWRzLmluY2x1ZGVzKGl0ZW0uZGF0YS5pZC50b1N0cmluZygpKSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHNlbGZTdGFydCA9IGV2ZW50LmNvbHVtblN0YXJ0ID09IG51bGwgPyBldmVudC5vZmZzZXRYICsgZXZlbnQub3ZlcmxhcFRvbGVyYW5jZSA6IGV2ZW50LmNvbHVtblN0YXJ0ICsgZXZlbnQub2Zmc2V0WCArIGV2ZW50Lm92ZXJsYXBUb2xlcmFuY2U7XHJcblxyXG4gICAgICAgIGlmKHJvdy5pbmRleCAhPSBldmVudC5yb3dTdGFydClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlbGZTdGFydCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc2VsZkVuZCA9IGV2ZW50LmNvbHVtbkVuZCA9PSBudWxsID8gKHJvdy5jZWxscy5sZW5ndGggKyBldmVudC5mcmFjdGlvblggLSBldmVudC5vdmVybGFwVG9sZXJhbmNlIC0gMSkgOiBldmVudC5jb2x1bW5FbmQgKyBldmVudC5mcmFjdGlvblggLSBldmVudC5vdmVybGFwVG9sZXJhbmNlO1xyXG5cclxuICAgICAgICBpZihyb3cuaW5kZXggIT0gZXZlbnQucm93RW5kKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgc2VsZkVuZCA9IHJvdy5jZWxscy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb2xsaXNpb25uZXVyRXZlbnRzID0gcHJldmlvdXNFdmVudHMuZmlsdGVyKGUgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYoZS5jb2x1bW5TdGFydCA9PSBudWxsICYmIGUuY29sdW1uRW5kID09IG51bGwpXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgZXZlbnRTdGFydCA9IGUuY29sdW1uU3RhcnQgPT0gbnVsbCA/IGUub2Zmc2V0WCA6IChlLmNvbHVtblN0YXJ0ICsgZS5vZmZzZXRYKTtcclxuXHJcbiAgICAgICAgICAgIGlmKGUucm93U3RhcnQgIT0gcm93LmluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBldmVudFN0YXJ0ID0gMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGV2ZW50RW5kID0gZS5jb2x1bW5FbmQgPT0gbnVsbCA/IHJvdy5jZWxscy5sZW5ndGggKyBlLmZyYWN0aW9uWCAtIDEgOiBlLmNvbHVtbkVuZCArIGUuZnJhY3Rpb25YO1xyXG5cclxuICAgICAgICAgICAgaWYoZS5yb3dFbmQgIT0gcm93LmluZGV4KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBldmVudEVuZCA9IHJvdy5jZWxscy5sZW5ndGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoc2VsZlN0YXJ0ID49IGV2ZW50U3RhcnQgJiYgc2VsZlN0YXJ0IDw9IGV2ZW50RW5kKSB8fFxyXG4gICAgICAgICAgICAoc2VsZkVuZCA+PSBldmVudFN0YXJ0ICYmIHNlbGZFbmQgPD0gZXZlbnRFbmQpIHx8XHJcbiAgICAgICAgICAgIChzZWxmU3RhcnQgPCBldmVudFN0YXJ0ICYmIHNlbGZFbmQgPiBldmVudEVuZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY29sbGlzaW9ubmV1clZpZXdFdmVudHMgPSBwcmV2aW91c1ZpZXdFdmVudHMuZmlsdGVyKCh2aWV3RXZlbnQ6IEhUTUxFbGVtZW50KSA9PiBcclxuICAgICAgICAgICAgY29sbGlzaW9ubmV1ckV2ZW50cy5tYXAoKGUpID0+IGUuZGF0YS5pZC50b1N0cmluZygpKS5pbmNsdWRlcyh2aWV3RXZlbnQuZ2V0QXR0cmlidXRlKCdpZCcpISlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB2YXIgbGV2ZWwgPSAwO1xyXG5cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDw9IG1heFN0YWNrU2l6ZTsgaSsrKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgY29uc3QgaXNMZXZlbEZpbGxlZCA9IGNvbGxpc2lvbm5ldXJWaWV3RXZlbnRzLm1hcCgodmlld0V2ZW50OiBIVE1MRWxlbWVudCkgPT4gdmlld0V2ZW50LmdldEF0dHJpYnV0ZSgnbGV2ZWwnKSkuaW5jbHVkZXMoaS50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFpc0xldmVsRmlsbGVkKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsZXZlbCA9IGk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxldmVsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRFdmVudChldmVudDogQURDSVRhYmxlRXZlbnQsIGF0dHJpYnV0ZXM6IEFEQ0lUYWJsZUV2ZW50QXR0cmlidXRlcywgcm93OiBBRENUYWJsZVJvd1Rvb2xzKTogdm9pZFxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuX3JlbmRlcmVyID09IG51bGwpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb25zIGFyZSBub3QgcHJvdmlkZWRcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBldmVudEVsUmVmOiBIVE1MRWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChldmVudEVsUmVmLCB0aGlzLl9yZW5kZXJlci5jcmVhdGVUZXh0KGV2ZW50LmRhdGEudGl0bGUpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZXZlbnRFbFJlZiwgJ2JhY2tncm91bmQtY29sb3InLCBhdHRyaWJ1dGVzLmJhY2tncm91bmRDb2xvcik7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZXZlbnRFbFJlZiwgJ2xlZnQnLCBhdHRyaWJ1dGVzLmxlZnQpO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGV2ZW50RWxSZWYsICdyaWdodCcsIGF0dHJpYnV0ZXMucmlnaHQpO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGV2ZW50RWxSZWYsICd0b3AnLCBgJHthdHRyaWJ1dGVzLmxldmVsICogKHRoaXMuZXZlbnRIZWlnaHQgKyA1KSArIDI1fXB4YCk7XHJcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUoZXZlbnRFbFJlZiwgJ3dpZHRoJywgYCR7YXR0cmlidXRlcy53aWR0aH1gKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShldmVudEVsUmVmLCAnaGVpZ2h0JywgYCR7dGhpcy5ldmVudEhlaWdodH1weGApO1xyXG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGV2ZW50RWxSZWYsICd0ZXh0LWFsaWduJywgYXR0cmlidXRlcy50ZXh0QWxpZ24pO1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZXZlbnRFbFJlZiwgJ2lkJywgZXZlbnQuZGF0YS5pZC50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZXZlbnRFbFJlZiwgJ2xldmVsJywgYXR0cmlidXRlcy5sZXZlbC50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUoZXZlbnRFbFJlZiwgJ3Jvdy1pbmRleCcsIHJvdy5pbmRleC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgYXR0cmlidXRlcy5jbGFzc0xpc3QuZm9yRWFjaCgoY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIhLmFkZENsYXNzKGV2ZW50RWxSZWYsIGNsYXNzTmFtZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGlmKGV2ZW50LmRhdGEuaXNDbGlja2FibGUpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBJbnRlcmFjdGlvbnMuY2xpY2soZXZlbnRFbFJlZiwgdGhpcy5ldmVudENsZWFyU3ViamVjdC5hc09ic2VydmFibGUoKSkuc3Vic2NyaWJlKChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50U2VsZWN0U3ViamVjdC5uZXh0KHtkb206IGV2ZW50RWxSZWYsIGV2ZW50OiBldmVudCwganNFdmVudDogZX0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFN0eWxlKGV2ZW50RWxSZWYsICdjdXJzb3InLCAncG9pbnRlcicpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmKGV2ZW50LmRhdGEudG9vbHRpcClcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvb2x0aXBSZWYgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKHRvb2x0aXBSZWYsICd0b29sdGlwJyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUodG9vbHRpcFJlZiwgJ2lkJywgZXZlbnQuZGF0YS5pZC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQodG9vbHRpcFJlZiwgdGhpcy5fcmVuZGVyZXIuY3JlYXRlVGV4dChldmVudC5kYXRhLnRvb2x0aXApKTtcclxuXHJcbiAgICAgICAgICAgIEludGVyYWN0aW9ucy50b29sdGlwKGV2ZW50RWxSZWYsIDMwMCwgdGhpcy5ldmVudENsZWFyU3ViamVjdC5hc09ic2VydmFibGUoKSwgdGhpcy5fdHZjPy5zY3JvbGxhYmxlQ29udGFpbmVyKS5zdWJzY3JpYmUoZSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYoZS5zdGF0ZSA9PT0gJ2hpZGUnKVxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvdy5jbGVhclRvb2x0aXBzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm93LmF0dGFjaFRvb2x0aXAodG9vbHRpcFJlZiwgZS5jb29yZGluYXRlcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG5cclxuICAgICAgICByb3cuYXR0YWNoRXZlbnQoZXZlbnRFbFJlZik7XHJcbiAgICB9XHJcbn0iXX0=