react-timesheet
Version:
Time Sheet Component for React
215 lines (175 loc) • 16.6 kB
JavaScript
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"react-timesheet":[function(require,module,exports){
var React = require('react');
/**
* Timesheet Bubble
*/
var Bubble = function(wMonth, min, start, end) {
this.min = min;
this.start = start;
this.end = end;
this.widthMonth = wMonth;
};
/**
* Format month number
*/
Bubble.prototype.formatMonth = function(num) {
num = parseInt(num, 10);
return num >= 10 ? num : '0' + num;
};
/**
* Calculate starting offset for bubble
*/
Bubble.prototype.getStartOffset = function() {
return (this.widthMonth/12) * (12 * (this.start.getFullYear() - this.min) + this.start.getMonth());
};
/**
* Get count of full years from start to end
*/
Bubble.prototype.getFullYears = function() {
return ((this.end && this.end.getFullYear()) || this.start.getFullYear()) - this.start.getFullYear();
};
/**
* Get count of all months in Timesheet Bubble
*/
Bubble.prototype.getMonths = function() {
var fullYears = this.getFullYears();
var months = 0;
if (!this.end) {
months += !this.start.hasMonth ? 12 : 1;
} else {
if (!this.end.hasMonth) {
months += 12 - (this.start.hasMonth ? this.start.getMonth() : 0);
months += 12 * (fullYears-1 > 0 ? fullYears-1 : 0);
} else {
months += this.end.getMonth() + 1;
months += 12 - (this.start.hasMonth ? this.start.getMonth() : 0);
months += 12 * (fullYears-1);
}
}
return months;
};
/**
* Get bubble's width in pixel
*/
Bubble.prototype.getWidth = function() {
return (this.widthMonth/12) * this.getMonths();
};
/**
* Get the bubble's label
*/
Bubble.prototype.getDateLabel = function() {
return [
(this.start.hasMonth ? this.formatMonth(this.start.getMonth() + 1) + '/' : '' ) + this.start.getFullYear(),
(this.end ? '-' + ((this.end.hasMonth ? this.formatMonth(this.end.getMonth() + 1) + '/' : '' ) + this.end.getFullYear()) : '')
].join('');
};
/**
* Parse data string
*/
function parseDate(date) {
if (date.indexOf('/') === -1) {
date = new Date(parseInt(date, 10), 0, 1);
date.hasMonth = false;
} else {
date = date.split('/');
date = new Date(parseInt(date[1], 10), parseInt(date[0], 10)-1, 1);
date.hasMonth = true;
}
return date;
};
var TimeSheet = React.createClass({displayName: "TimeSheet",
propTypes: {
data: React.PropTypes.array.isRequired,
min: React.PropTypes.number,
max: React.PropTypes.number,
theme: React.PropTypes.string
},
getDefaultProps: function(){
return {
className: 'timesheet'
}
},
parse: function(data, min, max) {
var ret = [];
for (var n = 0, m = data.length; n<m; n++) {
var beg = parseDate(data[n][0]);
var end = data[n].length === 4 ? parseDate(data[n][1]) : null;
var lbl = data[n].length === 4 ? data[n][2] : data[n][1];
var cat = data[n][3] || 'default';
if(!min){
min = beg.getFullYear();
max = min;
}
if (beg.getFullYear() < min) {
min = beg.getFullYear();
}
if (end && end.getFullYear() > max) {
max = end.getFullYear();
} else if (beg.getFullYear() > max) {
max = beg.getFullYear();
}
ret.push({start: beg, end: end, label: lbl, type: cat});
}
return {
data: ret,
year: {
min: min,
max: max
}
};
},
componentDidMount: function() {
var widthMonth = this.refs.year.getDOMNode().offsetWidth;
this.setState({
widthMonth: widthMonth
});
},
getLists: function(data, year){
var lists = [];
var widthMonth = this.state && this.state.widthMonth;
if(!widthMonth) return lists;
for (var i = 0, l = data.length; i < l; i++) {
var cur = data[i];
var bubble = new Bubble(widthMonth, year.min, cur.start, cur.end);
var style = {
marginLeft: bubble.getStartOffset() + 'px',
width: bubble.getWidth() + 'px'
};
var className = 'bubble bubble-' + (cur.type || 'default');
var duration = cur.end ? Math.round((cur.end-cur.start)/1000/60/60/24/39) : '';
var date = bubble.getDateLabel();
var label = cur.label;
var line = [
React.createElement("span", {style: style, className: className, "data-duration": duration}),
React.createElement("span", {className: "date"}, date),
React.createElement("span", {className: "label"}, label)
];
lists.push(React.createElement("li", null, line));
}
return lists;
},
render: function() {
var result = this.parse(this.props.data, this.props.min, this.props.max);
var data = result.data;
var year = result.year;
var sections = [];
for (var c = year.min; c <= year.max; c++) {
sections.push(React.createElement("section", {ref: "year"}, c));
}
var lists = this.getLists(data, year);
var className = this.props.className + " " + (this.props.theme || '');
return (
React.createElement("div", {className: className},
React.createElement("div", {className: "scale"},
sections
),
React.createElement("ul", {className: "data"},
lists
)
)
);
}
});
module.exports = TimeSheet;
},{"react":false}]},{},[])
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvVGltZVNoZWV0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwidmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxuLyoqXG4gKiBUaW1lc2hlZXQgQnViYmxlXG4gKi9cbnZhciBCdWJibGUgPSBmdW5jdGlvbih3TW9udGgsIG1pbiwgc3RhcnQsIGVuZCkge1xuICAgIHRoaXMubWluID0gbWluO1xuICAgIHRoaXMuc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLmVuZCA9IGVuZDtcbiAgICB0aGlzLndpZHRoTW9udGggPSB3TW9udGg7XG59O1xuXG4vKipcbiAqIEZvcm1hdCBtb250aCBudW1iZXJcbiAqL1xuQnViYmxlLnByb3RvdHlwZS5mb3JtYXRNb250aCA9IGZ1bmN0aW9uKG51bSkge1xuICAgIG51bSA9IHBhcnNlSW50KG51bSwgMTApO1xuXG4gICAgcmV0dXJuIG51bSA+PSAxMCA/IG51bSA6ICcwJyArIG51bTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHN0YXJ0aW5nIG9mZnNldCBmb3IgYnViYmxlXG4gKi9cbkJ1YmJsZS5wcm90b3R5cGUuZ2V0U3RhcnRPZmZzZXQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKHRoaXMud2lkdGhNb250aC8xMikgKiAoMTIgKiAodGhpcy5zdGFydC5nZXRGdWxsWWVhcigpIC0gdGhpcy5taW4pICsgdGhpcy5zdGFydC5nZXRNb250aCgpKTtcbn07XG5cbi8qKlxuICogR2V0IGNvdW50IG9mIGZ1bGwgeWVhcnMgZnJvbSBzdGFydCB0byBlbmRcbiAqL1xuQnViYmxlLnByb3RvdHlwZS5nZXRGdWxsWWVhcnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKCh0aGlzLmVuZCAmJiB0aGlzLmVuZC5nZXRGdWxsWWVhcigpKSB8fCB0aGlzLnN0YXJ0LmdldEZ1bGxZZWFyKCkpIC0gdGhpcy5zdGFydC5nZXRGdWxsWWVhcigpO1xufTtcblxuLyoqXG4gKiBHZXQgY291bnQgb2YgYWxsIG1vbnRocyBpbiBUaW1lc2hlZXQgQnViYmxlXG4gKi9cbkJ1YmJsZS5wcm90b3R5cGUuZ2V0TW9udGhzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZ1bGxZZWFycyA9IHRoaXMuZ2V0RnVsbFllYXJzKCk7XG4gICAgdmFyIG1vbnRocyA9IDA7XG5cbiAgICBpZiAoIXRoaXMuZW5kKSB7XG4gICAgICAgIG1vbnRocyArPSAhdGhpcy5zdGFydC5oYXNNb250aCA/IDEyIDogMTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXRoaXMuZW5kLmhhc01vbnRoKSB7XG4gICAgICAgICAgICBtb250aHMgKz0gMTIgLSAodGhpcy5zdGFydC5oYXNNb250aCA/IHRoaXMuc3RhcnQuZ2V0TW9udGgoKSA6IDApO1xuICAgICAgICAgICAgbW9udGhzICs9IDEyICogKGZ1bGxZZWFycy0xID4gMCA/IGZ1bGxZZWFycy0xIDogMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtb250aHMgKz0gdGhpcy5lbmQuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgICAgICBtb250aHMgKz0gMTIgLSAodGhpcy5zdGFydC5oYXNNb250aCA/IHRoaXMuc3RhcnQuZ2V0TW9udGgoKSA6IDApO1xuICAgICAgICAgICAgbW9udGhzICs9IDEyICogKGZ1bGxZZWFycy0xKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtb250aHM7XG59O1xuXG4vKipcbiAqIEdldCBidWJibGUncyB3aWR0aCBpbiBwaXhlbFxuICovXG5CdWJibGUucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICh0aGlzLndpZHRoTW9udGgvMTIpICogdGhpcy5nZXRNb250aHMoKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBidWJibGUncyBsYWJlbFxuICovXG5CdWJibGUucHJvdG90eXBlLmdldERhdGVMYWJlbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbXG4gICAgICAgICAgICAodGhpcy5zdGFydC5oYXNNb250aCA/IHRoaXMuZm9ybWF0TW9udGgodGhpcy5zdGFydC5nZXRNb250aCgpICsgMSkgKyAnLycgOiAnJyApICsgdGhpcy5zdGFydC5nZXRGdWxsWWVhcigpLFxuICAgICAgICAodGhpcy5lbmQgPyAnLScgKyAoKHRoaXMuZW5kLmhhc01vbnRoID8gdGhpcy5mb3JtYXRNb250aCh0aGlzLmVuZC5nZXRNb250aCgpICsgMSkgKyAnLycgOiAnJyApICsgdGhpcy5lbmQuZ2V0RnVsbFllYXIoKSkgOiAnJylcbiAgICBdLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBkYXRhIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZURhdGUoZGF0ZSkge1xuICAgIGlmIChkYXRlLmluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGRhdGUsIDEwKSwgMCwgMSk7XG4gICAgICAgIGRhdGUuaGFzTW9udGggPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlID0gZGF0ZS5zcGxpdCgnLycpO1xuICAgICAgICBkYXRlID0gbmV3IERhdGUocGFyc2VJbnQoZGF0ZVsxXSwgMTApLCBwYXJzZUludChkYXRlWzBdLCAxMCktMSwgMSk7XG4gICAgICAgIGRhdGUuaGFzTW9udGggPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xufTtcblxuXG52YXIgVGltZVNoZWV0ID0gUmVhY3QuY3JlYXRlQ2xhc3Moe2Rpc3BsYXlOYW1lOiBcIlRpbWVTaGVldFwiLFxuICAgIHByb3BUeXBlczoge1xuICAgICAgICBkYXRhOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgICAgICAgbWluOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgICAgICBtYXg6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgICAgIHRoZW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gICAgfSxcblxuICAgIGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RpbWVzaGVldCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZTogZnVuY3Rpb24oZGF0YSwgbWluLCBtYXgpIHtcbiAgICAgICAgdmFyIHJldCA9IFtdO1xuXG4gICAgICAgIGZvciAodmFyIG4gPSAwLCBtID0gZGF0YS5sZW5ndGg7IG48bTsgbisrKSB7XG4gICAgICAgICAgICB2YXIgYmVnID0gcGFyc2VEYXRlKGRhdGFbbl1bMF0pO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGRhdGFbbl0ubGVuZ3RoID09PSA0ID8gcGFyc2VEYXRlKGRhdGFbbl1bMV0pIDogbnVsbDtcbiAgICAgICAgICAgIHZhciBsYmwgPSBkYXRhW25dLmxlbmd0aCA9PT0gNCA/IGRhdGFbbl1bMl0gOiBkYXRhW25dWzFdO1xuICAgICAgICAgICAgdmFyIGNhdCA9IGRhdGFbbl1bM10gfHwgJ2RlZmF1bHQnO1xuXG4gICAgICAgICAgICBpZighbWluKXtcbiAgICAgICAgICAgICAgICBtaW4gPSBiZWcuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICBtYXggPSBtaW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChiZWcuZ2V0RnVsbFllYXIoKSA8IG1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IGJlZy5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kICYmIGVuZC5nZXRGdWxsWWVhcigpID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gZW5kLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJlZy5nZXRGdWxsWWVhcigpID4gbWF4KSB7XG4gICAgICAgICAgICAgICAgbWF4ID0gYmVnLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldC5wdXNoKHtzdGFydDogYmVnLCBlbmQ6IGVuZCwgbGFiZWw6IGxibCwgdHlwZTogY2F0fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogcmV0LFxuICAgICAgICAgICAgeWVhcjoge1xuICAgICAgICAgICAgICAgIG1pbjogbWluLFxuICAgICAgICAgICAgICAgIG1heDogbWF4XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHdpZHRoTW9udGggPSB0aGlzLnJlZnMueWVhci5nZXRET01Ob2RlKCkub2Zmc2V0V2lkdGg7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB3aWR0aE1vbnRoOiB3aWR0aE1vbnRoXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRMaXN0czogZnVuY3Rpb24oZGF0YSwgeWVhcil7XG5cbiAgICAgICAgdmFyIGxpc3RzID0gW107XG4gICAgICAgIHZhciB3aWR0aE1vbnRoID0gdGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLndpZHRoTW9udGg7XG4gICAgICAgIGlmKCF3aWR0aE1vbnRoKSByZXR1cm4gbGlzdHM7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBkYXRhLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgdmFyIGN1ciA9IGRhdGFbaV07XG4gICAgICAgICAgICB2YXIgYnViYmxlID0gbmV3IEJ1YmJsZSh3aWR0aE1vbnRoLCB5ZWFyLm1pbiwgY3VyLnN0YXJ0LCBjdXIuZW5kKTtcblxuICAgICAgICAgICAgdmFyIHN0eWxlID0ge1xuICAgICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGJ1YmJsZS5nZXRTdGFydE9mZnNldCgpICsgJ3B4JyxcbiAgICAgICAgICAgICAgICB3aWR0aDogYnViYmxlLmdldFdpZHRoKCkgKyAncHgnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gJ2J1YmJsZSBidWJibGUtJyArIChjdXIudHlwZSB8fCAnZGVmYXVsdCcpO1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gY3VyLmVuZCA/IE1hdGgucm91bmQoKGN1ci5lbmQtY3VyLnN0YXJ0KS8xMDAwLzYwLzYwLzI0LzM5KSA6ICcnO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSBidWJibGUuZ2V0RGF0ZUxhYmVsKCk7XG4gICAgICAgICAgICB2YXIgbGFiZWwgPSBjdXIubGFiZWw7XG5cbiAgICAgICAgICAgIHZhciBsaW5lID0gW1xuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZTogc3R5bGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lLCBcImRhdGEtZHVyYXRpb25cIjogZHVyYXRpb259KSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImRhdGVcIn0sIGRhdGUpLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibGFiZWxcIn0sIGxhYmVsKVxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgbGlzdHMucHVzaChSZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwgbnVsbCwgbGluZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxpc3RzO1xuICAgIH0sXG5cbiAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlKHRoaXMucHJvcHMuZGF0YSwgdGhpcy5wcm9wcy5taW4sIHRoaXMucHJvcHMubWF4KTtcbiAgICAgICAgdmFyIGRhdGEgPSByZXN1bHQuZGF0YTtcbiAgICAgICAgdmFyIHllYXIgPSByZXN1bHQueWVhcjtcblxuICAgICAgICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgYyA9IHllYXIubWluOyBjIDw9IHllYXIubWF4OyBjKyspIHtcbiAgICAgICAgICAgIHNlY3Rpb25zLnB1c2goUmVhY3QuY3JlYXRlRWxlbWVudChcInNlY3Rpb25cIiwge3JlZjogXCJ5ZWFyXCJ9LCBjKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGlzdHMgPSB0aGlzLmdldExpc3RzKGRhdGEsIHllYXIpO1xuICAgICAgICB2YXIgY2xhc3NOYW1lID0gdGhpcy5wcm9wcy5jbGFzc05hbWUgKyBcIiBcIiArICh0aGlzLnByb3BzLnRoZW1lIHx8ICcnKTtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjbGFzc05hbWV9LCBcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2NhbGVcIn0sIFxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uc1xuICAgICAgICAgICAgICAgICksIFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ1bFwiLCB7Y2xhc3NOYW1lOiBcImRhdGFcIn0sIFxuICAgICAgICAgICAgICAgICAgICBsaXN0c1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBUaW1lU2hlZXQ7XG4iXX0=