UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

267 lines (217 loc) 27.4 kB
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; }; }(); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import { PropertyColor, PropertyEnum, PropertyString, PropertyNumber, PropertyLengthMeasure, PropertyToggle, PropertyCheckbox, PropertyHidden, PropertyReadOnly } from './properties/export'; import { UNIT_CENTIMETER } from '../constants'; var Catalog = function () { function Catalog() { var unit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : UNIT_CENTIMETER; _classCallCheck(this, Catalog); this.elements = {}; this.categories = { root: { name: 'root', label: '/', elements: [], categories: [] } }; this.propertyTypes = {}; this.unit = unit; this.registerMultiplePropertyType([['color', PropertyColor, PropertyColor], ['enum', PropertyEnum, PropertyEnum], ['string', PropertyString, PropertyString], ['number', PropertyNumber, PropertyNumber], ['length-measure', PropertyLengthMeasure, PropertyLengthMeasure], ['toggle', PropertyToggle, PropertyToggle], ['checkbox', PropertyCheckbox, PropertyCheckbox], ['hidden', PropertyHidden, PropertyHidden], ['read-only', PropertyReadOnly, PropertyReadOnly]]); } /** @description Get catalog's element * @param {string} type Element's type * @return {?object} Element */ _createClass(Catalog, [{ key: 'getElement', value: function getElement(type) { if (this.hasElement(type)) { return this.elements[type]; } throw new Error('Element ' + type + ' does not exist in catalog'); } /** @description Get catalog category * @param {string} categoryName Name of category * @return {object} Category */ }, { key: 'getCategory', value: function getCategory(categoryName) { if (this.hasCategory(categoryName)) { return this.categories[categoryName]; } throw new Error('Category ' + categoryName + ' does not exist in catalog'); } /** @description Return type of a specfied property * @param {string} type Property type * @return {?object} Property */ }, { key: 'getPropertyType', value: function getPropertyType(type) { if (this.propertyTypes.hasOwnProperty(type)) { return this.propertyTypes[type]; } throw new Error('Element ' + type + ' does not exist in catalog'); } /** @description Register a new element * @param {object} json Element structure * @return {void} */ }, { key: 'registerElement', value: function registerElement(json) { json.properties = json.properties || {}; if (this.validateElement(json)) { this.elements[json.name] = json; this.categories.root.elements.push(this.elements[json.name]); } } /** @description Register multiple elements * @param {array} [elementArray] Array of elements * @return {void} */ }, { key: 'registerMultipleElements', value: function registerMultipleElements(elementArray) { var _this = this; elementArray.forEach(function (el) { return _this.registerElement(el); }); } /** @description Register a new property * @param {string} type Type of property * @param {object} Viewer Property viewer component * @param {object} Editor Property editor component * @return {void} */ }, { key: 'registerPropertyType', value: function registerPropertyType(type, Viewer, Editor) { this.propertyTypes[type] = { type: type, Viewer: Viewer, Editor: Editor }; } /** @description Register multiple property * @param {array} propertyTypeArray Array of properties * @return {void} */ }, { key: 'registerMultiplePropertyType', value: function registerMultiplePropertyType(propertyTypeArray) { var _this2 = this; propertyTypeArray.forEach(function (el) { return _this2.registerPropertyType.apply(_this2, _toConsumableArray(el)); }); } /** @description Validate an element * @param {object} json Element's structure * @return {?boolean} */ }, { key: 'validateElement', value: function validateElement(json) { if (!json.hasOwnProperty('name')) throw new Error('Element not valid'); var name = json.name; if (!json.hasOwnProperty('prototype')) throw new Error('Element ' + name + ' doesn\'t have prototype'); if (!json.hasOwnProperty('info')) throw new Error('Element ' + name + ' doesn\'t have info'); if (!json.info.hasOwnProperty('tag')) throw new Error('Element ' + name + ' doesn\'t have tag'); if (!json.info.hasOwnProperty('group')) throw new Error('Element ' + name + ' doesn\'t have group'); if (!json.info.hasOwnProperty('description')) throw new Error('Element ' + name + ' doesn\'t have description'); if (!json.info.hasOwnProperty('image')) throw new Error('Element ' + name + ' doesn\'t have image'); if (!json.hasOwnProperty('render2D')) throw new Error('Element ' + name + ' doesn\'t have render2D handler'); if (!json.hasOwnProperty('properties')) throw new Error('Element ' + name + ' doesn\'t have properties'); for (var propertyName in json.properties) { var propertyConfigs = json.properties[propertyName]; if (!propertyConfigs.hasOwnProperty('type')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have type'); if (!propertyConfigs.hasOwnProperty('defaultValue')) throw new Error('Element ' + name + ', Property ' + propertyName + ' doesn\'t have defaultValue'); } return true; } /** @description Check if catalog has element * @param {string} type Element's type * @return {boolean} */ }, { key: 'hasElement', value: function hasElement(type) { return this.elements.hasOwnProperty(type); } /** @description Register a new category * @param {string} name Name of category * @param {string} label Label of category * @param {array} [childs] Category's childs * @return {?object} Registered category */ }, { key: 'registerCategory', value: function registerCategory(name, label, childs) { var _this3 = this; if (this.validateCategory(name, label)) { this.categories[name] = { name: name, label: label, categories: [], elements: [] }; this.categories.root.categories.push(this.categories[name]); if (childs && childs.length) { childs.forEach(function (el) { return _this3.addToCategory(name, el); }); } return this.categories[name]; } return null; } /** @description Add an element to the specified category * @param {string} name Name of category * @param {object} child Element's structure * @return {?void} */ }, { key: 'addToCategory', value: function addToCategory(name, child) { if (this.hasElement(child.name)) { this.categories[name].elements.push(child); this.categories.root.elements.splice(this.categories.root.elements.indexOf(child), 1); } else if (this.hasCategory(child.name)) { this.categories[name].categories.push(child); this.categories.root.categories.splice(this.categories.root.categories.indexOf(child), 1); } else { throw new Error('child ' + child + ' is either category nor element'); } } /** @description Check if category contain element * @param {string} categoryName Name of category * @param {string} elementName Name of element * @return {boolean} */ }, { key: 'categoryHasElement', value: function categoryHasElement(categoryName, elementName) { return this.hasCategory(categoryName) && this.categories[categoryName].elements.some(function (el) { return el.name === elementName; }); } /** @description Validate a category * @param {string} name Name of category * @param {string} label Label of category * @return {?boolean} */ }, { key: 'validateCategory', value: function validateCategory(name, label) { if (!name) { throw new Error('Category has undefined name'); } if (name === '') { throw new Error('Category has empty name'); } if (this.hasCategory(name)) { throw new Error('Category has already been registered'); } return true; } /** @description Verify if catalog already contain a category with specified name * @param {string} categoryName Name of category * @return {boolean} */ }, { key: 'hasCategory', value: function hasCategory(categoryName) { return this.categories.hasOwnProperty(categoryName); } }]); return Catalog; }(); export default Catalog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jYXRhbG9nL2NhdGFsb2cuanMiXSwibmFtZXMiOlsiUHJvcGVydHlDb2xvciIsIlByb3BlcnR5RW51bSIsIlByb3BlcnR5U3RyaW5nIiwiUHJvcGVydHlOdW1iZXIiLCJQcm9wZXJ0eUxlbmd0aE1lYXN1cmUiLCJQcm9wZXJ0eVRvZ2dsZSIsIlByb3BlcnR5Q2hlY2tib3giLCJQcm9wZXJ0eUhpZGRlbiIsIlByb3BlcnR5UmVhZE9ubHkiLCJVTklUX0NFTlRJTUVURVIiLCJDYXRhbG9nIiwidW5pdCIsImVsZW1lbnRzIiwiY2F0ZWdvcmllcyIsInJvb3QiLCJuYW1lIiwibGFiZWwiLCJwcm9wZXJ0eVR5cGVzIiwicmVnaXN0ZXJNdWx0aXBsZVByb3BlcnR5VHlwZSIsInR5cGUiLCJoYXNFbGVtZW50IiwiRXJyb3IiLCJjYXRlZ29yeU5hbWUiLCJoYXNDYXRlZ29yeSIsImhhc093blByb3BlcnR5IiwianNvbiIsInByb3BlcnRpZXMiLCJ2YWxpZGF0ZUVsZW1lbnQiLCJwdXNoIiwiZWxlbWVudEFycmF5IiwiZm9yRWFjaCIsInJlZ2lzdGVyRWxlbWVudCIsImVsIiwiVmlld2VyIiwiRWRpdG9yIiwicHJvcGVydHlUeXBlQXJyYXkiLCJyZWdpc3RlclByb3BlcnR5VHlwZSIsImluZm8iLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eUNvbmZpZ3MiLCJjaGlsZHMiLCJ2YWxpZGF0ZUNhdGVnb3J5IiwibGVuZ3RoIiwiYWRkVG9DYXRlZ29yeSIsImNoaWxkIiwic3BsaWNlIiwiaW5kZXhPZiIsImVsZW1lbnROYW1lIiwic29tZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FDRUEsYUFERixFQUVFQyxZQUZGLEVBR0VDLGNBSEYsRUFJRUMsY0FKRixFQUtFQyxxQkFMRixFQU1FQyxjQU5GLEVBT0VDLGdCQVBGLEVBUUVDLGNBUkYsRUFTRUMsZ0JBVEYsUUFVTyxxQkFWUDs7QUFZQSxTQUFRQyxlQUFSLFFBQThCLGNBQTlCOztJQUVxQkMsTztB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aEMsSSxFQUFNQyxLLEVBQU87QUFDNUIsVUFBSSxDQUFDRCxJQUFMLEVBQVc7QUFDVCxjQUFNLElBQUlNLEtBQUosQ0FBVSw2QkFBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJTixTQUFTLEVBQWIsRUFBaUI7QUFDZixjQUFNLElBQUlNLEtBQUosQ0FBVSx5QkFBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJLEtBQUtFLFdBQUwsQ0FBaUJSLElBQWpCLENBQUosRUFBNEI7QUFDMUIsY0FBTSxJQUFJTSxLQUFKLENBQVUsc0NBQVYsQ0FBTjtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNEOztBQUVEOzs7Ozs7O2dDQUlZQyxZLEVBQWM7QUFDeEIsYUFBTyxLQUFLVCxVQUFMLENBQWdCVyxjQUFoQixDQUErQkYsWUFBL0IsQ0FBUDtBQUNEOzs7Ozs7ZUF2TWtCWixPIiwiZmlsZSI6ImNhdGFsb2cuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQcm9wZXJ0eUNvbG9yLFxuICBQcm9wZXJ0eUVudW0sXG4gIFByb3BlcnR5U3RyaW5nLFxuICBQcm9wZXJ0eU51bWJlcixcbiAgUHJvcGVydHlMZW5ndGhNZWFzdXJlLFxuICBQcm9wZXJ0eVRvZ2dsZSxcbiAgUHJvcGVydHlDaGVja2JveCxcbiAgUHJvcGVydHlIaWRkZW4sXG4gIFByb3BlcnR5UmVhZE9ubHlcbn0gZnJvbSAnLi9wcm9wZXJ0aWVzL2V4cG9ydCc7XG5cbmltcG9ydCB7VU5JVF9DRU5USU1FVEVSfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRhbG9nIHtcblxuICBjb25zdHJ1Y3Rvcih1bml0ID0gVU5JVF9DRU5USU1FVEVSKSB7XG4gICAgdGhpcy5lbGVtZW50cyA9IHt9O1xuICAgIHRoaXMuY2F0ZWdvcmllcyA9IHtyb290OiB7bmFtZTogJ3Jvb3QnLCBsYWJlbDogJy8nLCBlbGVtZW50czogW10sIGNhdGVnb3JpZXM6IFtdfX07XG4gICAgdGhpcy5wcm9wZXJ0eVR5cGVzID0ge307XG4gICAgdGhpcy51bml0ID0gdW5pdDtcblxuICAgIHRoaXMucmVnaXN0ZXJNdWx0aXBsZVByb3BlcnR5VHlwZShbXG4gICAgICBbJ2NvbG9yJywgUHJvcGVydHlDb2xvciwgUHJvcGVydHlDb2xvcl0sXG4gICAgICBbJ2VudW0nLCBQcm9wZXJ0eUVudW0sIFByb3BlcnR5RW51bV0sXG4gICAgICBbJ3N0cmluZycsIFByb3BlcnR5U3RyaW5nLCBQcm9wZXJ0eVN0cmluZ10sXG4gICAgICBbJ251bWJlcicsIFByb3BlcnR5TnVtYmVyLCBQcm9wZXJ0eU51bWJlcl0sXG4gICAgICBbJ2xlbmd0aC1tZWFzdXJlJywgUHJvcGVydHlMZW5ndGhNZWFzdXJlLCBQcm9wZXJ0eUxlbmd0aE1lYXN1cmVdLFxuICAgICAgWyd0b2dnbGUnLCBQcm9wZXJ0eVRvZ2dsZSwgUHJvcGVydHlUb2dnbGVdLFxuICAgICAgWydjaGVja2JveCcsIFByb3BlcnR5Q2hlY2tib3gsIFByb3BlcnR5Q2hlY2tib3hdLFxuICAgICAgWydoaWRkZW4nLCBQcm9wZXJ0eUhpZGRlbiwgUHJvcGVydHlIaWRkZW5dLFxuICAgICAgWydyZWFkLW9ubHknLCBQcm9wZXJ0eVJlYWRPbmx5LCBQcm9wZXJ0eVJlYWRPbmx5XVxuICAgIF0pO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBHZXQgY2F0YWxvZydzIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVsZW1lbnQncyB0eXBlXG4gICAqICBAcmV0dXJuIHs/b2JqZWN0fSBFbGVtZW50XG4gICovXG4gIGdldEVsZW1lbnQodHlwZSkge1xuICAgIGlmICh0aGlzLmhhc0VsZW1lbnQodHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzW3R5cGVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHt0eXBlfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIEdldCBjYXRhbG9nIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnlOYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEByZXR1cm4ge29iamVjdH0gQ2F0ZWdvcnlcbiAgKi9cbiAgZ2V0Q2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSB7XG4gICAgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllc1tjYXRlZ29yeU5hbWVdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhdGVnb3J5ICR7Y2F0ZWdvcnlOYW1lfSBkb2VzIG5vdCBleGlzdCBpbiBjYXRhbG9nYCk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJldHVybiB0eXBlIG9mIGEgc3BlY2ZpZWQgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFByb3BlcnR5IHR5cGVcbiAgICogIEByZXR1cm4gez9vYmplY3R9IFByb3BlcnR5XG4gICovXG4gIGdldFByb3BlcnR5VHlwZSh0eXBlKSB7XG4gICAgaWYgKHRoaXMucHJvcGVydHlUeXBlcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcGVydHlUeXBlc1t0eXBlXTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7dHlwZX0gZG9lcyBub3QgZXhpc3QgaW4gY2F0YWxvZ2ApO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBhIG5ldyBlbGVtZW50XG4gICAqICBAcGFyYW0ge29iamVjdH0ganNvbiBFbGVtZW50IHN0cnVjdHVyZVxuICAgKiAgQHJldHVybiB7dm9pZH1cbiAgKi9cbiAgcmVnaXN0ZXJFbGVtZW50KGpzb24pIHtcbiAgICBqc29uLnByb3BlcnRpZXMgPSBqc29uLnByb3BlcnRpZXMgfHwge307XG4gICAgaWYgKHRoaXMudmFsaWRhdGVFbGVtZW50KGpzb24pKSB7XG4gICAgICB0aGlzLmVsZW1lbnRzW2pzb24ubmFtZV0gPSBqc29uO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMucHVzaCh0aGlzLmVsZW1lbnRzW2pzb24ubmFtZV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgbXVsdGlwbGUgZWxlbWVudHNcbiAgICogIEBwYXJhbSB7YXJyYXl9IFtlbGVtZW50QXJyYXldIEFycmF5IG9mIGVsZW1lbnRzXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3Rlck11bHRpcGxlRWxlbWVudHMoZWxlbWVudEFycmF5KSB7XG4gICAgZWxlbWVudEFycmF5LmZvckVhY2goZWwgPT4gdGhpcy5yZWdpc3RlckVsZW1lbnQoZWwpKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIFR5cGUgb2YgcHJvcGVydHlcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBWaWV3ZXIgUHJvcGVydHkgdmlld2VyIGNvbXBvbmVudFxuICAgKiAgQHBhcmFtIHtvYmplY3R9IEVkaXRvciBQcm9wZXJ0eSBlZGl0b3IgY29tcG9uZW50XG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3RlclByb3BlcnR5VHlwZSh0eXBlLCBWaWV3ZXIsIEVkaXRvcikge1xuICAgIHRoaXMucHJvcGVydHlUeXBlc1t0eXBlXSA9IHt0eXBlLCBWaWV3ZXIsIEVkaXRvcn07XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFJlZ2lzdGVyIG11bHRpcGxlIHByb3BlcnR5XG4gICAqICBAcGFyYW0ge2FycmF5fSBwcm9wZXJ0eVR5cGVBcnJheSBBcnJheSBvZiBwcm9wZXJ0aWVzXG4gICAqICBAcmV0dXJuIHt2b2lkfVxuICAqL1xuICByZWdpc3Rlck11bHRpcGxlUHJvcGVydHlUeXBlKHByb3BlcnR5VHlwZUFycmF5KSB7XG4gICAgcHJvcGVydHlUeXBlQXJyYXkuZm9yRWFjaChlbCA9PiB0aGlzLnJlZ2lzdGVyUHJvcGVydHlUeXBlKC4uLmVsKSk7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7b2JqZWN0fSBqc29uIEVsZW1lbnQncyBzdHJ1Y3R1cmVcbiAgICogIEByZXR1cm4gez9ib29sZWFufVxuICAqL1xuICB2YWxpZGF0ZUVsZW1lbnQoanNvbikge1xuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpKSB0aHJvdyBuZXcgRXJyb3IoJ0VsZW1lbnQgbm90IHZhbGlkJyk7XG5cbiAgICBsZXQgbmFtZSA9IGpzb24ubmFtZTtcbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ3Byb3RvdHlwZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgcHJvdG90eXBlYCk7XG5cbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ2luZm8nKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGluZm9gKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgndGFnJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSB0YWdgKTtcbiAgICBpZiAoIWpzb24uaW5mby5oYXNPd25Qcm9wZXJ0eSgnZ3JvdXAnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIGdyb3VwYCk7XG4gICAgaWYgKCFqc29uLmluZm8uaGFzT3duUHJvcGVydHkoJ2Rlc2NyaXB0aW9uJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9IGRvZXNuJ3QgaGF2ZSBkZXNjcmlwdGlvbmApO1xuICAgIGlmICghanNvbi5pbmZvLmhhc093blByb3BlcnR5KCdpbWFnZScpKSB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgJHtuYW1lfSBkb2Vzbid0IGhhdmUgaW1hZ2VgKTtcblxuICAgIGlmICghanNvbi5oYXNPd25Qcm9wZXJ0eSgncmVuZGVyMkQnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHJlbmRlcjJEIGhhbmRsZXJgKTtcbiAgICBpZiAoIWpzb24uaGFzT3duUHJvcGVydHkoJ3Byb3BlcnRpZXMnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0gZG9lc24ndCBoYXZlIHByb3BlcnRpZXNgKTtcblxuICAgIGZvciAobGV0IHByb3BlcnR5TmFtZSBpbiBqc29uLnByb3BlcnRpZXMpIHtcbiAgICAgIGxldCBwcm9wZXJ0eUNvbmZpZ3MgPSBqc29uLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgICAgIGlmICghcHJvcGVydHlDb25maWdzLmhhc093blByb3BlcnR5KCd0eXBlJykpIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke25hbWV9LCBQcm9wZXJ0eSAke3Byb3BlcnR5TmFtZX0gZG9lc24ndCBoYXZlIHR5cGVgKTtcbiAgICAgIGlmICghcHJvcGVydHlDb25maWdzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50ICR7bmFtZX0sIFByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBkb2Vzbid0IGhhdmUgZGVmYXVsdFZhbHVlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGNhdGFsb2cgaGFzIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVsZW1lbnQncyB0eXBlXG4gICAqICBAcmV0dXJuIHtib29sZWFufVxuICAqL1xuICBoYXNFbGVtZW50KHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBlKTtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBuZXcgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgY2F0ZWdvcnlcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBMYWJlbCBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHthcnJheX0gW2NoaWxkc10gQ2F0ZWdvcnkncyBjaGlsZHNcbiAgICogIEByZXR1cm4gez9vYmplY3R9IFJlZ2lzdGVyZWQgY2F0ZWdvcnlcbiAgKi9cbiAgcmVnaXN0ZXJDYXRlZ29yeShuYW1lLCBsYWJlbCwgY2hpbGRzKSB7XG4gICAgaWYgKHRoaXMudmFsaWRhdGVDYXRlZ29yeShuYW1lLCBsYWJlbCkpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllc1tuYW1lXSA9IHtuYW1lLCBsYWJlbCwgY2F0ZWdvcmllczogW10sIGVsZW1lbnRzOiBbXX07XG4gICAgICB0aGlzLmNhdGVnb3JpZXMucm9vdC5jYXRlZ29yaWVzLnB1c2godGhpcy5jYXRlZ29yaWVzW25hbWVdKTtcblxuICAgICAgaWYoY2hpbGRzICYmIGNoaWxkcy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRzLmZvckVhY2goIGVsID0+IHRoaXMuYWRkVG9DYXRlZ29yeSggbmFtZSwgZWwgKSApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYXRlZ29yaWVzW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKiBAZGVzY3JpcHRpb24gQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtvYmplY3R9IGNoaWxkIEVsZW1lbnQncyBzdHJ1Y3R1cmVcbiAgICogIEByZXR1cm4gez92b2lkfVxuICAqL1xuICBhZGRUb0NhdGVnb3J5KG5hbWUsIGNoaWxkKSB7XG4gICAgaWYgKHRoaXMuaGFzRWxlbWVudChjaGlsZC5uYW1lKSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzW25hbWVdLmVsZW1lbnRzLnB1c2goY2hpbGQpO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuZWxlbWVudHMuc3BsaWNlKHRoaXMuY2F0ZWdvcmllcy5yb290LmVsZW1lbnRzLmluZGV4T2YoY2hpbGQpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkoY2hpbGQubmFtZSkpIHtcbiAgICAgIHRoaXMuY2F0ZWdvcmllc1tuYW1lXS5jYXRlZ29yaWVzLnB1c2goY2hpbGQpO1xuICAgICAgdGhpcy5jYXRlZ29yaWVzLnJvb3QuY2F0ZWdvcmllcy5zcGxpY2UodGhpcy5jYXRlZ29yaWVzLnJvb3QuY2F0ZWdvcmllcy5pbmRleE9mKGNoaWxkKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2hpbGQgJHtjaGlsZH0gaXMgZWl0aGVyIGNhdGVnb3J5IG5vciBlbGVtZW50YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiBjYXRlZ29yeSBjb250YWluIGVsZW1lbnRcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lIE5hbWUgb2YgZWxlbWVudFxuICAgKiAgQHJldHVybiB7Ym9vbGVhbn1cbiAgKi9cbiAgY2F0ZWdvcnlIYXNFbGVtZW50KGNhdGVnb3J5TmFtZSwgZWxlbWVudE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNDYXRlZ29yeShjYXRlZ29yeU5hbWUpICYmIHRoaXMuY2F0ZWdvcmllc1tjYXRlZ29yeU5hbWVdLmVsZW1lbnRzLnNvbWUoZWwgPT4gZWwubmFtZSA9PT0gZWxlbWVudE5hbWUpO1xuICB9XG5cbiAgLyoqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZSBhIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGNhdGVnb3J5XG4gICAqICBAcGFyYW0ge3N0cmluZ30gbGFiZWwgTGFiZWwgb2YgY2F0ZWdvcnlcbiAgICogIEByZXR1cm4gez9ib29sZWFufVxuICAqL1xuICB2YWxpZGF0ZUNhdGVnb3J5KG5hbWUsIGxhYmVsKSB7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhdGVnb3J5IGhhcyB1bmRlZmluZWQgbmFtZScpO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIGVtcHR5IG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzQ2F0ZWdvcnkobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2F0ZWdvcnkgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogQGRlc2NyaXB0aW9uIFZlcmlmeSBpZiBjYXRhbG9nIGFscmVhZHkgY29udGFpbiBhIGNhdGVnb3J5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAgICogIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeU5hbWUgTmFtZSBvZiBjYXRlZ29yeVxuICAgKiAgQHJldHVybiB7Ym9vbGVhbn1cbiAgKi9cbiAgaGFzQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5oYXNPd25Qcm9wZXJ0eShjYXRlZ29yeU5hbWUpO1xuICB9XG5cbn1cbiJdfQ==