react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
278 lines (236 loc) • 29.4 kB
JavaScript
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import CatalogItem from './catalog-item';
import CatalogBreadcrumb from './catalog-breadcrumb';
import CatalogPageItem from './catalog-page-item';
import CatalogTurnBackPageItem from './catalog-turn-back-page-item';
import ContentContainer from '../style/content-container';
import ContentTitle from '../style/content-title';
import * as SharedStyle from '../../shared-style';
var containerStyle = {
position: 'fixed',
width: 'calc( 100% - 51px)',
height: 'calc( 100% - 20px)',
backgroundColor: '#FFF',
padding: '1em',
left: 50,
overflowY: 'auto',
overflowX: 'hidden',
zIndex: 10
};
var itemsStyle = {
display: 'grid',
gridTemplateColumns: 'repeat(auto-fit, minmax(14em, 1fr))',
gridGap: '10px',
marginTop: '1em'
};
var searchContainer = {
width: '100%',
height: '3em',
padding: '0.625em',
background: '#f7f7f9',
border: '1px solid #e1e1e8',
cursor: 'pointer',
position: 'relative',
boxShadow: '0 1px 6px 0 rgba(0, 0, 0, 0.11), 0 1px 4px 0 rgba(0, 0, 0, 0.11)',
borderRadius: '2px',
transition: 'all .2s ease-in-out',
WebkitTransition: 'all .2s ease-in-out',
marginBottom: '1em'
};
var searchText = {
width: '8em',
display: 'inline-block'
};
var searchInput = {
width: 'calc( 100% - 10em )',
height: '2em',
margin: '0',
padding: '0 1em',
border: '1px solid #EEE'
};
var historyContainer = _extends({}, searchContainer, {
padding: '0.2em 0.625em'
});
var historyElementStyle = {
width: 'auto',
height: '2em',
lineHeight: '2em',
textAlign: 'center',
borderRadius: '1em',
display: 'inline-block',
cursor: 'pointer',
backgroundColor: SharedStyle.PRIMARY_COLOR.alt,
color: SharedStyle.PRIMARY_COLOR.text_main,
textTransform: 'capitalize',
margin: '0.25em',
padding: '0 1em'
};
var CatalogList = function (_Component) {
_inherits(CatalogList, _Component);
function CatalogList(props, context) {
_classCallCheck(this, CatalogList);
var _this = _possibleConstructorReturn(this, (CatalogList.__proto__ || Object.getPrototypeOf(CatalogList)).call(this, props));
var page = props.state.catalog.page;
var currentCategory = context.catalog.getCategory(page);
var categoriesToDisplay = currentCategory.categories;
var elementsToDisplay = currentCategory.elements.filter(function (element) {
return element.info.visibility ? element.info.visibility.catalog : true;
});
_this.state = {
categories: currentCategory.categories,
elements: elementsToDisplay,
matchString: '',
matchedElements: []
};
return _this;
}
_createClass(CatalogList, [{
key: 'flattenCategories',
value: function flattenCategories(categories) {
var toRet = [];
for (var x = 0; x < categories.length; x++) {
var curr = categories[x];
toRet = toRet.concat(curr.elements);
if (curr.categories.length) toRet = toRet.concat(this.flattenCategories(curr.categories));
}
return toRet;
}
}, {
key: 'matcharray',
value: function matcharray(text) {
var array = this.state.elements.concat(this.flattenCategories(this.state.categories));
var filtered = [];
if (text != '') {
var regexp = new RegExp(text, 'i');
for (var i = 0; i < array.length; i++) {
if (regexp.test(array[i].info.title)) {
filtered.push(array[i]);
}
}
}
this.setState({
matchString: text,
matchedElements: filtered
});
}
}, {
key: 'select',
value: function select(element) {
switch (element.prototype) {
case 'lines':
this.context.linesActions.selectToolDrawingLine(element.name);
break;
case 'items':
this.context.itemsActions.selectToolDrawingItem(element.name);
break;
case 'holes':
this.context.holesActions.selectToolDrawingHole(element.name);
break;
}
this.context.projectActions.pushLastSelectedCatalogElementToHistory(element);
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var page = this.props.state.catalog.page;
var currentCategory = this.context.catalog.getCategory(page);
var categoriesToDisplay = currentCategory.categories;
var elementsToDisplay = currentCategory.elements.filter(function (element) {
return element.info.visibility ? element.info.visibility.catalog : true;
});
var breadcrumbComponent = null;
if (page !== 'root') {
var breadcrumbsNames = [];
this.props.state.catalog.path.forEach(function (pathName) {
breadcrumbsNames.push({
name: _this2.context.catalog.getCategory(pathName).label,
action: function action() {
return projectActions.goBackToCatalogPage(pathName);
}
});
});
breadcrumbsNames.push({ name: currentCategory.label, action: '' });
breadcrumbComponent = React.createElement(CatalogBreadcrumb, { names: breadcrumbsNames });
}
var pathSize = this.props.state.catalog.path.size;
var turnBackButton = pathSize > 0 ? React.createElement(CatalogTurnBackPageItem, { key: pathSize, page: this.context.catalog.categories[this.props.state.catalog.path.get(pathSize - 1)] }) : null;
var selectedHistory = this.props.state.get('selectedElementsHistory');
var selectedHistoryElements = selectedHistory.map(function (el, ind) {
return React.createElement(
'div',
{ key: ind, style: historyElementStyle, title: el.name, onClick: function onClick() {
return _this2.select(el);
} },
el.name
);
});
return React.createElement(
ContentContainer,
{ width: this.props.width, height: this.props.height, style: _extends({}, containerStyle, this.props.style) },
React.createElement(
ContentTitle,
null,
this.context.translator.t('Catalog')
),
breadcrumbComponent,
React.createElement(
'div',
{ style: searchContainer },
React.createElement(
'span',
{ style: searchText },
this.context.translator.t('Search Element')
),
React.createElement('input', { type: 'text', style: searchInput, onChange: function onChange(e) {
_this2.matcharray(e.target.value);
} })
),
selectedHistory.size ? React.createElement(
'div',
{ style: historyContainer },
React.createElement(
'span',
null,
this.context.translator.t('Last Selected')
),
selectedHistoryElements
) : null,
React.createElement(
'div',
{ style: itemsStyle },
this.state.matchString === '' ? [turnBackButton, categoriesToDisplay.map(function (cat) {
return React.createElement(CatalogPageItem, { key: cat.name, page: cat, oldPage: currentCategory });
}), elementsToDisplay.map(function (elem) {
return React.createElement(CatalogItem, { key: elem.name, element: elem });
})] : this.state.matchedElements.map(function (elem) {
return React.createElement(CatalogItem, { key: elem.name, element: elem });
})
)
);
}
}]);
return CatalogList;
}(Component);
export default CatalogList;
CatalogList.propTypes = {
state: PropTypes.object.isRequired,
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
style: PropTypes.object
};
CatalogList.contextTypes = {
catalog: PropTypes.object.isRequired,
translator: PropTypes.object.isRequired,
itemsActions: PropTypes.object.isRequired,
linesActions: PropTypes.object.isRequired,
holesActions: PropTypes.object.isRequired,
projectActions: PropTypes.object.isRequired
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NhdGFsb2ctdmlldy9jYXRhbG9nLWxpc3QuanN4Il0sIm5hbWVzIjpbIlJlYWN0IiwiQ29tcG9uZW50IiwiUHJvcFR5cGVzIiwiQ2F0YWxvZ0l0ZW0iLCJDYXRhbG9nQnJlYWRjcnVtYiIsIkNhdGFsb2dQYWdlSXRlbSIsIkNhdGFsb2dUdXJuQmFja1BhZ2VJdGVtIiwiQ29udGVudENvbnRhaW5lciIsIkNvbnRlbnRUaXRsZSIsIlNoYXJlZFN0eWxlIiwiY29udGFpbmVyU3R5bGUiLCJwb3NpdGlvbiIsIndpZHRoIiwiaGVpZ2h0IiwiYmFja2dyb3VuZENvbG9yIiwicGFkZGluZyIsImxlZnQiLCJvdmVyZmxvd1kiLCJvdmVyZmxvd1giLCJ6SW5kZXgiLCJpdGVtc1N0eWxlIiwiZGlzcGxheSIsImdyaWRUZW1wbGF0ZUNvbHVtbnMiLCJncmlkR2FwIiwibWFyZ2luVG9wIiwic2VhcmNoQ29udGFpbmVyIiwiYmFja2dyb3VuZCIsImJvcmRlciIsImN1cnNvciIsImJveFNoYWRvdyIsImJvcmRlclJhZGl1cyIsInRyYW5zaXRpb24iLCJXZWJraXRUcmFuc2l0aW9uIiwibWFyZ2luQm90dG9tIiwic2VhcmNoVGV4dCIsInNlYXJjaElucHV0IiwibWFyZ2luIiwiaGlzdG9yeUNvbnRhaW5lciIsImhpc3RvcnlFbGVtZW50U3R5bGUiLCJsaW5lSGVpZ2h0IiwidGV4dEFsaWduIiwiUFJJTUFSWV9DT0xPUiIsImFsdCIsImNvbG9yIiwidGV4dF9tYWluIiwidGV4dFRyYW5zZm9ybSIsIkNhdGFsb2dMaXN0IiwicHJvcHMiLCJjb250ZXh0IiwicGFnZSIsInN0YXRlIiwiY2F0YWxvZyIsImN1cnJlbnRDYXRlZ29yeSIsImdldENhdGVnb3J5IiwiY2F0ZWdvcmllc1RvRGlzcGxheSIsImNhdGVnb3JpZXMiLCJlbGVtZW50c1RvRGlzcGxheSIsImVsZW1lbnRzIiwiZmlsdGVyIiwiZWxlbWVudCIsImluZm8iLCJ2aXNpYmlsaXR5IiwibWF0Y2hTdHJpbmciLCJtYXRjaGVkRWxlbWVudHMiLCJ0b1JldCIsIngiLCJsZW5ndGgiLCJjdXJyIiwiY29uY2F0IiwiZmxhdHRlbkNhdGVnb3JpZXMiLCJ0ZXh0IiwiYXJyYXkiLCJmaWx0ZXJlZCIsInJlZ2V4cCIsIlJlZ0V4cCIsImkiLCJ0ZXN0IiwidGl0bGUiLCJwdXNoIiwic2V0U3RhdGUiLCJwcm90b3R5cGUiLCJsaW5lc0FjdGlvbnMiLCJzZWxlY3RUb29sRHJhd2luZ0xpbmUiLCJuYW1lIiwiaXRlbXNBY3Rpb25zIiwic2VsZWN0VG9vbERyYXdpbmdJdGVtIiwiaG9sZXNBY3Rpb25zIiwic2VsZWN0VG9vbERyYXdpbmdIb2xlIiwicHJvamVjdEFjdGlvbnMiLCJwdXNoTGFzdFNlbGVjdGVkQ2F0YWxvZ0VsZW1lbnRUb0hpc3RvcnkiLCJicmVhZGNydW1iQ29tcG9uZW50IiwiYnJlYWRjcnVtYnNOYW1lcyIsInBhdGgiLCJmb3JFYWNoIiwicGF0aE5hbWUiLCJsYWJlbCIsImFjdGlvbiIsImdvQmFja1RvQ2F0YWxvZ1BhZ2UiLCJwYXRoU2l6ZSIsInNpemUiLCJ0dXJuQmFja0J1dHRvbiIsImdldCIsInNlbGVjdGVkSGlzdG9yeSIsInNlbGVjdGVkSGlzdG9yeUVsZW1lbnRzIiwibWFwIiwiZWwiLCJpbmQiLCJzZWxlY3QiLCJzdHlsZSIsInRyYW5zbGF0b3IiLCJ0IiwiZSIsIm1hdGNoYXJyYXkiLCJ0YXJnZXQiLCJ2YWx1ZSIsImNhdCIsImVsZW0iLCJwcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIiwibnVtYmVyIiwiY29udGV4dFR5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxJQUFnQkMsU0FBaEIsUUFBaUMsT0FBakM7QUFDQSxPQUFPQyxTQUFQLE1BQXNCLFlBQXRCO0FBQ0EsT0FBT0MsV0FBUCxNQUF3QixnQkFBeEI7QUFDQSxPQUFPQyxpQkFBUCxNQUE4QixzQkFBOUI7QUFDQSxPQUFPQyxlQUFQLE1BQTRCLHFCQUE1QjtB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dkIsRUFBNkIsU0FBU2lDLElBQXRDLEdBQVI7QUFBQSxXQUEvQjtBQVBKO0FBZEYsT0FERjtBQTJCRDs7OztFQXBJc0NuSCxTOztlQUFwQjZDLFc7OztBQXVJckJBLFlBQVl1RSxTQUFaLEdBQXdCO0FBQ3RCbkUsU0FBT2hELFVBQVVvSCxNQUFWLENBQWlCQyxVQURGO0FBRXRCM0csU0FBT1YsVUFBVXNILE1BQVYsQ0FBaUJELFVBRkY7QUFHdEIxRyxVQUFRWCxVQUFVc0gsTUFBVixDQUFpQkQsVUFISDtBQUl0QlgsU0FBTzFHLFVBQVVvSDtBQUpLLENBQXhCOztBQU9BeEUsWUFBWTJFLFlBQVosR0FBMkI7QUFDekJ0RSxXQUFTakQsVUFBVW9ILE1BQVYsQ0FBaUJDLFVBREQ7QUFFekJWLGNBQVkzRyxVQUFVb0gsTUFBVixDQUFpQkMsVUFGSjtBQUd6Qm5DLGdCQUFjbEYsVUFBVW9ILE1BQVYsQ0FBaUJDLFVBSE47QUFJekJ0QyxnQkFBYy9FLFVBQVVvSCxNQUFWLENBQWlCQyxVQUpOO0FBS3pCakMsZ0JBQWNwRixVQUFVb0gsTUFBVixDQUFpQkMsVUFMTjtBQU16Qi9CLGtCQUFnQnRGLFVBQVVvSCxNQUFWLENBQWlCQztBQU5SLENBQTNCIiwiZmlsZSI6ImNhdGFsb2ctbGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IENhdGFsb2dJdGVtIGZyb20gJy4vY2F0YWxvZy1pdGVtJztcbmltcG9ydCBDYXRhbG9nQnJlYWRjcnVtYiBmcm9tICcuL2NhdGFsb2ctYnJlYWRjcnVtYic7XG5pbXBvcnQgQ2F0YWxvZ1BhZ2VJdGVtIGZyb20gJy4vY2F0YWxvZy1wYWdlLWl0ZW0nO1xuaW1wb3J0IENhdGFsb2dUdXJuQmFja1BhZ2VJdGVtIGZyb20gJy4vY2F0YWxvZy10dXJuLWJhY2stcGFnZS1pdGVtJztcbmltcG9ydCBDb250ZW50Q29udGFpbmVyIGZyb20gJy4uL3N0eWxlL2NvbnRlbnQtY29udGFpbmVyJztcbmltcG9ydCBDb250ZW50VGl0bGUgZnJvbSAnLi4vc3R5bGUvY29udGVudC10aXRsZSc7XG5pbXBvcnQgKiBhcyBTaGFyZWRTdHlsZSBmcm9tICcuLi8uLi9zaGFyZWQtc3R5bGUnO1xuXG5jb25zdCBjb250YWluZXJTdHlsZSA9IHtcbiAgcG9zaXRpb246ICdmaXhlZCcsXG4gIHdpZHRoOidjYWxjKCAxMDAlIC0gNTFweCknLFxuICBoZWlnaHQ6J2NhbGMoIDEwMCUgLSAyMHB4KScsXG4gIGJhY2tncm91bmRDb2xvcjonI0ZGRicsXG4gIHBhZGRpbmc6JzFlbScsXG4gIGxlZnQ6NTAsXG4gIG92ZXJmbG93WTonYXV0bycsXG4gIG92ZXJmbG93WDonaGlkZGVuJyxcbiAgekluZGV4OjEwXG59O1xuXG5jb25zdCBpdGVtc1N0eWxlID0ge1xuICBkaXNwbGF5OiAnZ3JpZCcsXG4gIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICdyZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNGVtLCAxZnIpKScsXG4gIGdyaWRHYXA6ICcxMHB4JyxcbiAgbWFyZ2luVG9wOiAnMWVtJ1xufTtcblxuY29uc3Qgc2VhcmNoQ29udGFpbmVyID0ge1xuICB3aWR0aDogJzEwMCUnLFxuICBoZWlnaHQ6ICczZW0nLFxuICBwYWRkaW5nOiAnMC42MjVlbScsXG4gIGJhY2tncm91bmQ6ICcjZjdmN2Y5JyxcbiAgYm9yZGVyOiAnMXB4IHNvbGlkICNlMWUxZTgnLFxuICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gIGJveFNoYWRvdzogJzAgMXB4IDZweCAwIHJnYmEoMCwgMCwgMCwgMC4xMSksIDAgMXB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xMSknLFxuICBib3JkZXJSYWRpdXM6ICcycHgnLFxuICB0cmFuc2l0aW9uOiAnYWxsIC4ycyBlYXNlLWluLW91dCcsXG4gIFdlYmtpdFRyYW5zaXRpb246ICdhbGwgLjJzIGVhc2UtaW4tb3V0JyxcbiAgbWFyZ2luQm90dG9tOiAnMWVtJ1xufTtcblxuY29uc3Qgc2VhcmNoVGV4dCA9IHtcbiAgd2lkdGg6ICc4ZW0nLFxuICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xufTtcblxuY29uc3Qgc2VhcmNoSW5wdXQgPSB7XG4gIHdpZHRoOiAnY2FsYyggMTAwJSAtIDEwZW0gKScsXG4gIGhlaWdodDogJzJlbScsXG4gIG1hcmdpbjogJzAnLFxuICBwYWRkaW5nOiAnMCAxZW0nLFxuICBib3JkZXI6ICcxcHggc29saWQgI0VFRSdcbn07XG5cbmNvbnN0IGhpc3RvcnlDb250YWluZXIgPSB7XG4gIC4uLnNlYXJjaENvbnRhaW5lcixcbiAgcGFkZGluZzogJzAuMmVtIDAuNjI1ZW0nXG59O1xuXG5jb25zdCBoaXN0b3J5RWxlbWVudFN0eWxlID0ge1xuICB3aWR0aDogJ2F1dG8nLFxuICBoZWlnaHQ6ICcyZW0nLFxuICBsaW5lSGVpZ2h0OiAnMmVtJyxcbiAgdGV4dEFsaWduOidjZW50ZXInLFxuICBib3JkZXJSYWRpdXM6ICcxZW0nLFxuICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgY3Vyc29yOiAncG9pbnRlcicsXG4gIGJhY2tncm91bmRDb2xvcjogU2hhcmVkU3R5bGUuUFJJTUFSWV9DT0xPUi5hbHQsXG4gIGNvbG9yOiBTaGFyZWRTdHlsZS5QUklNQVJZX0NPTE9SLnRleHRfbWFpbixcbiAgdGV4dFRyYW5zZm9ybTogJ2NhcGl0YWxpemUnLFxuICBtYXJnaW46ICcwLjI1ZW0nLFxuICBwYWRkaW5nOiAnMCAxZW0nXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRhbG9nTGlzdCBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocHJvcHMsIGNvbnRleHQpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBsZXQgcGFnZSA9IHByb3BzLnN0YXRlLmNhdGFsb2cucGFnZTtcbiAgICBsZXQgY3VycmVudENhdGVnb3J5ID0gY29udGV4dC5jYXRhbG9nLmdldENhdGVnb3J5KHBhZ2UpO1xuICAgIGxldCBjYXRlZ29yaWVzVG9EaXNwbGF5ID0gY3VycmVudENhdGVnb3J5LmNhdGVnb3JpZXM7XG4gICAgbGV0IGVsZW1lbnRzVG9EaXNwbGF5ID0gY3VycmVudENhdGVnb3J5LmVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaW5mby52aXNpYmlsaXR5ID8gZWxlbWVudC5pbmZvLnZpc2liaWxpdHkuY2F0YWxvZyA6IHRydWUgKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBjYXRlZ29yaWVzOiBjdXJyZW50Q2F0ZWdvcnkuY2F0ZWdvcmllcyxcbiAgICAgIGVsZW1lbnRzOiBlbGVtZW50c1RvRGlzcGxheSxcbiAgICAgIG1hdGNoU3RyaW5nOiAnJyxcbiAgICAgIG1hdGNoZWRFbGVtZW50czogW11cbiAgICB9O1xuICB9XG5cbiAgZmxhdHRlbkNhdGVnb3JpZXMoIGNhdGVnb3JpZXMgKSB7XG4gICAgbGV0IHRvUmV0ID0gW107XG5cbiAgICBmb3IoIGxldCB4ID0gMDsgeCA8IGNhdGVnb3JpZXMubGVuZ3RoOyB4KysgKVxuICAgIHtcbiAgICAgIGxldCBjdXJyID0gY2F0ZWdvcmllc1t4XTtcbiAgICAgIHRvUmV0ID0gdG9SZXQuY29uY2F0KCBjdXJyLmVsZW1lbnRzICk7XG4gICAgICBpZiggY3Vyci5jYXRlZ29yaWVzLmxlbmd0aCApIHRvUmV0ID0gdG9SZXQuY29uY2F0KCB0aGlzLmZsYXR0ZW5DYXRlZ29yaWVzICggY3Vyci5jYXRlZ29yaWVzICkgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZXQ7XG4gIH1cblxuICBtYXRjaGFycmF5KCB0ZXh0ICkge1xuXG4gICAgbGV0IGFycmF5ID0gdGhpcy5zdGF0ZS5lbGVtZW50cy5jb25jYXQoIHRoaXMuZmxhdHRlbkNhdGVnb3JpZXMoIHRoaXMuc3RhdGUuY2F0ZWdvcmllcyApICk7XG5cbiAgICBsZXQgZmlsdGVyZWQgPSBbXTtcblxuICAgIGlmKCB0ZXh0ICE9ICcnICkge1xuICAgICAgbGV0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoIHRleHQsICdpJyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChyZWdleHAudGVzdChhcnJheVtpXS5pbmZvLnRpdGxlKSkge1xuICAgICAgICAgIGZpbHRlcmVkLnB1c2goYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBtYXRjaFN0cmluZzogdGV4dCxcbiAgICAgIG1hdGNoZWRFbGVtZW50czogZmlsdGVyZWRcbiAgICB9KTtcbiAgfTtcblxuICBzZWxlY3QoIGVsZW1lbnQgKSB7XG5cbiAgICBzd2l0Y2ggKGVsZW1lbnQucHJvdG90eXBlKSB7XG4gICAgICBjYXNlICdsaW5lcyc6XG4gICAgICAgIHRoaXMuY29udGV4dC5saW5lc0FjdGlvbnMuc2VsZWN0VG9vbERyYXdpbmdMaW5lKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRlbXMnOlxuICAgICAgICB0aGlzLmNvbnRleHQuaXRlbXNBY3Rpb25zLnNlbGVjdFRvb2xEcmF3aW5nSXRlbShlbGVtZW50Lm5hbWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvbGVzJzpcbiAgICAgICAgdGhpcy5jb250ZXh0LmhvbGVzQWN0aW9ucy5zZWxlY3RUb29sRHJhd2luZ0hvbGUoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LnByb2plY3RBY3Rpb25zLnB1c2hMYXN0U2VsZWN0ZWRDYXRhbG9nRWxlbWVudFRvSGlzdG9yeShlbGVtZW50KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcblxuICAgIGxldCBwYWdlID0gdGhpcy5wcm9wcy5zdGF0ZS5jYXRhbG9nLnBhZ2U7XG4gICAgbGV0IGN1cnJlbnRDYXRlZ29yeSA9IHRoaXMuY29udGV4dC5jYXRhbG9nLmdldENhdGVnb3J5KHBhZ2UpO1xuICAgIGxldCBjYXRlZ29yaWVzVG9EaXNwbGF5ID0gY3VycmVudENhdGVnb3J5LmNhdGVnb3JpZXM7XG4gICAgbGV0IGVsZW1lbnRzVG9EaXNwbGF5ID0gY3VycmVudENhdGVnb3J5LmVsZW1lbnRzLmZpbHRlcihlbGVtZW50ID0+IGVsZW1lbnQuaW5mby52aXNpYmlsaXR5ID8gZWxlbWVudC5pbmZvLnZpc2liaWxpdHkuY2F0YWxvZyA6IHRydWUgKTtcblxuICAgIGxldCBicmVhZGNydW1iQ29tcG9uZW50ID0gbnVsbDtcblxuICAgIGlmIChwYWdlICE9PSAncm9vdCcpIHtcblxuICAgICAgbGV0IGJyZWFkY3J1bWJzTmFtZXMgPSBbXTtcblxuICAgICAgdGhpcy5wcm9wcy5zdGF0ZS5jYXRhbG9nLnBhdGguZm9yRWFjaChwYXRoTmFtZSA9PiB7XG4gICAgICAgIGJyZWFkY3J1bWJzTmFtZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogdGhpcy5jb250ZXh0LmNhdGFsb2cuZ2V0Q2F0ZWdvcnkocGF0aE5hbWUpLmxhYmVsLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4gcHJvamVjdEFjdGlvbnMuZ29CYWNrVG9DYXRhbG9nUGFnZShwYXRoTmFtZSlcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgYnJlYWRjcnVtYnNOYW1lcy5wdXNoKHtuYW1lOiBjdXJyZW50Q2F0ZWdvcnkubGFiZWwsIGFjdGlvbjogJyd9KTtcblxuICAgICAgYnJlYWRjcnVtYkNvbXBvbmVudCA9ICg8Q2F0YWxvZ0JyZWFkY3J1bWIgbmFtZXM9e2JyZWFkY3J1bWJzTmFtZXN9Lz4pO1xuICAgIH1cblxuICAgIGxldCBwYXRoU2l6ZSA9IHRoaXMucHJvcHMuc3RhdGUuY2F0YWxvZy5wYXRoLnNpemU7XG5cbiAgICBsZXQgdHVybkJhY2tCdXR0b24gPSBwYXRoU2l6ZSA+IDAgPyAoXG4gICAgICA8Q2F0YWxvZ1R1cm5CYWNrUGFnZUl0ZW0ga2V5PXtwYXRoU2l6ZX0gcGFnZT17dGhpcy5jb250ZXh0LmNhdGFsb2cuY2F0ZWdvcmllc1t0aGlzLnByb3BzLnN0YXRlLmNhdGFsb2cucGF0aC5nZXQocGF0aFNpemUgLSAxKV19Lz4pIDogbnVsbDtcblxuXG4gICAgbGV0IHNlbGVjdGVkSGlzdG9yeSA9IHRoaXMucHJvcHMuc3RhdGUuZ2V0KCdzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeScpO1xuICAgIGxldCBzZWxlY3RlZEhpc3RvcnlFbGVtZW50cyA9IHNlbGVjdGVkSGlzdG9yeS5tYXAoICggZWwsIGluZCApID0+XG4gICAgICA8ZGl2IGtleT17aW5kfSBzdHlsZT17aGlzdG9yeUVsZW1lbnRTdHlsZX0gdGl0bGU9e2VsLm5hbWV9IG9uQ2xpY2s9eygpID0+IHRoaXMuc2VsZWN0KGVsKSB9PntlbC5uYW1lfTwvZGl2PlxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbnRlbnRDb250YWluZXIgd2lkdGg9e3RoaXMucHJvcHMud2lkdGh9IGhlaWdodD17dGhpcy5wcm9wcy5oZWlnaHR9IHN0eWxlPXt7Li4uY29udGFpbmVyU3R5bGUsIC4uLnRoaXMucHJvcHMuc3R5bGV9fT5cbiAgICAgICAgPENvbnRlbnRUaXRsZT57dGhpcy5jb250ZXh0LnRyYW5zbGF0b3IudCgnQ2F0YWxvZycpfTwvQ29udGVudFRpdGxlPlxuICAgICAgICB7YnJlYWRjcnVtYkNvbXBvbmVudH1cbiAgICAgICAgPGRpdiBzdHlsZT17c2VhcmNoQ29udGFpbmVyfT5cbiAgICAgICAgICA8c3BhbiBzdHlsZT17c2VhcmNoVGV4dH0+e3RoaXMuY29udGV4dC50cmFuc2xhdG9yLnQoJ1NlYXJjaCBFbGVtZW50Jyl9PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPXtzZWFyY2hJbnB1dH0gb25DaGFuZ2U9eyggZSApID0+IHsgdGhpcy5tYXRjaGFycmF5KCBlLnRhcmdldC52YWx1ZSApOyB9IH0vPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgeyBzZWxlY3RlZEhpc3Rvcnkuc2l6ZSA/XG4gICAgICAgICAgPGRpdiBzdHlsZT17aGlzdG9yeUNvbnRhaW5lcn0+XG4gICAgICAgICAgICA8c3Bhbj57dGhpcy5jb250ZXh0LnRyYW5zbGF0b3IudCgnTGFzdCBTZWxlY3RlZCcpfTwvc3Bhbj5cbiAgICAgICAgICAgIHtzZWxlY3RlZEhpc3RvcnlFbGVtZW50c31cbiAgICAgICAgICA8L2Rpdj4gOlxuICAgICAgICAgIG51bGxcbiAgICAgICAgfVxuICAgICAgICA8ZGl2IHN0eWxlPXtpdGVtc1N0eWxlfT5cbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1hdGNoU3RyaW5nID09PSAnJyA/IFtcbiAgICAgICAgICAgICAgdHVybkJhY2tCdXR0b24sXG4gICAgICAgICAgICAgIGNhdGVnb3JpZXNUb0Rpc3BsYXkubWFwKGNhdCA9PiA8Q2F0YWxvZ1BhZ2VJdGVtIGtleT17Y2F0Lm5hbWV9IHBhZ2U9e2NhdH0gb2xkUGFnZT17Y3VycmVudENhdGVnb3J5fS8+KSxcbiAgICAgICAgICAgICAgZWxlbWVudHNUb0Rpc3BsYXkubWFwKGVsZW0gPT4gPENhdGFsb2dJdGVtIGtleT17ZWxlbS5uYW1lfSBlbGVtZW50PXtlbGVtfS8+KVxuICAgICAgICAgICAgXSA6XG4gICAgICAgICAgICB0aGlzLnN0YXRlLm1hdGNoZWRFbGVtZW50cy5tYXAoZWxlbSA9PiA8Q2F0YWxvZ0l0ZW0ga2V5PXtlbGVtLm5hbWV9IGVsZW1lbnQ9e2VsZW19Lz4pXG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvQ29udGVudENvbnRhaW5lcj5cbiAgICApXG4gIH1cbn1cblxuQ2F0YWxvZ0xpc3QucHJvcFR5cGVzID0ge1xuICBzdGF0ZTogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3Rcbn07XG5cbkNhdGFsb2dMaXN0LmNvbnRleHRUeXBlcyA9IHtcbiAgY2F0YWxvZzogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICB0cmFuc2xhdG9yOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGl0ZW1zQWN0aW9uczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBsaW5lc0FjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgaG9sZXNBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIHByb2plY3RBY3Rpb25zOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG4iXX0=