react-planner-viewer
Version:
react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode
407 lines (326 loc) • 33.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.State = exports.Catalog = exports.CatalogElement = exports.Scene = exports.DefaultLayers = exports.Layer = exports.Item = exports.Area = exports.Hole = exports.Line = exports.Vertex = exports.ElementsSet = exports.DefaultGuides = exports.Guide = undefined;
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; };
var _immutable = require('immutable');
var _constants = require('./constants');
var _snap = require('./utils/snap');
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; }
var safeLoadMapList = function safeLoadMapList(mapList, Model, defaultMap) {
return mapList ? new _immutable.Map(mapList).map(function (m) {
return new Model(m);
}).toMap() : defaultMap || new _immutable.Map();
};
var Guide = exports.Guide = function (_Record) {
_inherits(Guide, _Record);
function Guide() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Guide);
return _possibleConstructorReturn(this, (Guide.__proto__ || Object.getPrototypeOf(Guide)).call(this, _extends({}, json, {
properties: (0, _immutable.fromJS)(json.properties || {})
})));
}
return Guide;
}((0, _immutable.Record)({
id: '',
type: '',
properties: (0, _immutable.Map)()
}, 'Guide'));
var DefaultGuides = exports.DefaultGuides = new _immutable.Map({
'h1': new Guide({
id: 'h1',
type: 'horizontal-streak',
properties: {
step: 20,
colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd']
}
}),
'v1': new Guide({
id: 'v1',
type: 'vertical-streak',
properties: {
step: 20,
colors: ['#808080', '#ddd', '#ddd', '#ddd', '#ddd']
}
})
});
var ElementsSet = exports.ElementsSet = function (_Record2) {
_inherits(ElementsSet, _Record2);
function ElementsSet() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, ElementsSet);
return _possibleConstructorReturn(this, (ElementsSet.__proto__ || Object.getPrototypeOf(ElementsSet)).call(this, {
vertices: new _immutable.List(json.vertices || []),
lines: new _immutable.List(json.lines || []),
holes: new _immutable.List(json.holes || []),
areas: new _immutable.List(json.areas || []),
items: new _immutable.List(json.items || [])
}));
}
return ElementsSet;
}((0, _immutable.Record)({
vertices: new _immutable.List(),
lines: new _immutable.List(),
holes: new _immutable.List(),
areas: new _immutable.List(),
items: new _immutable.List()
}, 'ElementsSet'));
var sharedAttributes = {
id: '',
type: '',
prototype: '',
name: '',
misc: new _immutable.Map(),
selected: false,
properties: new _immutable.Map()
};
var Vertex = exports.Vertex = function (_Record3) {
_inherits(Vertex, _Record3);
function Vertex() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Vertex);
return _possibleConstructorReturn(this, (Vertex.__proto__ || Object.getPrototypeOf(Vertex)).call(this, _extends({}, json, {
lines: new _immutable.List(json.lines || []),
areas: new _immutable.List(json.areas || [])
})));
}
return Vertex;
}((0, _immutable.Record)(_extends({}, sharedAttributes, {
x: -1,
y: -1,
prototype: 'vertices',
lines: new _immutable.List(),
areas: new _immutable.List()
}), 'Vertex'));
var Line = exports.Line = function (_Record4) {
_inherits(Line, _Record4);
function Line() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Line);
return _possibleConstructorReturn(this, (Line.__proto__ || Object.getPrototypeOf(Line)).call(this, _extends({}, json, {
properties: (0, _immutable.fromJS)(json.properties || {}),
vertices: new _immutable.List(json.vertices || []),
holes: new _immutable.List(json.holes || [])
})));
}
return Line;
}((0, _immutable.Record)(_extends({}, sharedAttributes, {
prototype: 'lines',
vertices: new _immutable.List(),
holes: new _immutable.List()
}), 'Line'));
var Hole = exports.Hole = function (_Record5) {
_inherits(Hole, _Record5);
function Hole() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Hole);
return _possibleConstructorReturn(this, (Hole.__proto__ || Object.getPrototypeOf(Hole)).call(this, _extends({}, json, {
properties: (0, _immutable.fromJS)(json.properties || {})
})));
}
return Hole;
}((0, _immutable.Record)(_extends({}, sharedAttributes, {
prototype: 'holes',
offset: -1,
line: ''
}), 'Hole'));
var Area = exports.Area = function (_Record6) {
_inherits(Area, _Record6);
function Area() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Area);
return _possibleConstructorReturn(this, (Area.__proto__ || Object.getPrototypeOf(Area)).call(this, _extends({}, json, {
properties: (0, _immutable.fromJS)(json.properties || {}),
vertices: new _immutable.List(json.vertices || [])
})));
}
return Area;
}((0, _immutable.Record)(_extends({}, sharedAttributes, {
prototype: 'areas',
vertices: new _immutable.List(),
holes: new _immutable.List(),
showHeatMap: false,
heatMapText: '',
heatMapColor: [],
tooltip: {}
}), 'Area'));
var Item = exports.Item = function (_Record7) {
_inherits(Item, _Record7);
function Item() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Item);
return _possibleConstructorReturn(this, (Item.__proto__ || Object.getPrototypeOf(Item)).call(this, _extends({}, json, {
properties: (0, _immutable.fromJS)(json.properties || {})
})));
}
return Item;
}((0, _immutable.Record)(_extends({}, sharedAttributes, {
prototype: 'items',
x: 0,
y: 0,
rotation: 0
}), 'Item'));
var Layer = exports.Layer = function (_Record8) {
_inherits(Layer, _Record8);
function Layer() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Layer);
return _possibleConstructorReturn(this, (Layer.__proto__ || Object.getPrototypeOf(Layer)).call(this, _extends({}, json, {
vertices: safeLoadMapList(json.vertices, Vertex),
lines: safeLoadMapList(json.lines, Line),
holes: safeLoadMapList(json.holes, Hole),
areas: safeLoadMapList(json.areas, Area),
items: safeLoadMapList(json.items, Item),
selected: new ElementsSet(json.selected)
})));
}
return Layer;
}((0, _immutable.Record)({
id: '',
altitude: 0,
order: 0,
opacity: 1,
name: '',
visible: true,
vertices: new _immutable.Map(),
lines: new _immutable.Map(),
holes: new _immutable.Map(),
areas: new _immutable.Map(),
items: new _immutable.Map(),
selected: new ElementsSet()
}, 'Layer'));
var DefaultLayers = exports.DefaultLayers = new _immutable.Map({
'layer-1': new Layer({ id: 'layer-1', name: 'default' })
});
var Scene = exports.Scene = function (_Record9) {
_inherits(Scene, _Record9);
function Scene() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Scene);
var layers = safeLoadMapList(json.layers, Layer, DefaultLayers);
return _possibleConstructorReturn(this, (Scene.__proto__ || Object.getPrototypeOf(Scene)).call(this, _extends({}, json, {
guides: safeLoadMapList(json.guides, Guide, DefaultGuides),
layers: layers,
selectedLayer: layers.first().id,
meta: json.meta ? (0, _immutable.fromJS)(json.meta) : new _immutable.Map()
})));
}
return Scene;
}((0, _immutable.Record)({
unit: 'cm',
layers: new _immutable.Map(),
guides: new _immutable.Map(),
selectedLayer: null,
fontSize: 12,
width: 3000,
height: 2000,
meta: new _immutable.Map() //additional info
}, 'Scene'));
var CatalogElement = exports.CatalogElement = function (_Record10) {
_inherits(CatalogElement, _Record10);
function CatalogElement() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, CatalogElement);
return _possibleConstructorReturn(this, (CatalogElement.__proto__ || Object.getPrototypeOf(CatalogElement)).call(this, _extends({}, json, {
info: (0, _immutable.fromJS)(json.info),
properties: (0, _immutable.fromJS)(json.properties)
})));
}
return CatalogElement;
}((0, _immutable.Record)({
name: '',
prototype: '',
info: new _immutable.Map(),
properties: new _immutable.Map()
}, 'CatalogElement'));
var Catalog = exports.Catalog = function (_Record11) {
_inherits(Catalog, _Record11);
function Catalog() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, Catalog);
var elements = safeLoadMapList(json.elements, CatalogElement);
return _possibleConstructorReturn(this, (Catalog.__proto__ || Object.getPrototypeOf(Catalog)).call(this, {
elements: elements,
ready: !elements.isEmpty()
}));
}
_createClass(Catalog, [{
key: 'factoryElement',
value: function factoryElement(type, options) {
var initialProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (!this.elements.has(type)) {
var catList = this.elements.map(function (element) {
return element.name;
}).toArray();
throw new Error('Element ' + type + ' does not exist in catalog ' + catList);
}
var element = this.elements.get(type);
var properties = element.properties.map(function (value, key) {
return initialProperties[key] || value.get('defaultValue');
});
switch (element.prototype) {
case 'lines':
return new Line(options).merge({ properties: properties });
case 'holes':
return new Hole(options).merge({ properties: properties });
case 'areas':
return new Area(options).merge({ properties: properties });
case 'items':
return new Item(options).merge({ properties: properties });
default:
throw new Error('prototype not valid');
}
}
}]);
return Catalog;
}((0, _immutable.Record)({
ready: false,
page: "root",
path: new _immutable.List(),
elements: new _immutable.Map()
}, 'Catalog'));
var State = exports.State = function (_Record12) {
_inherits(State, _Record12);
function State() {
var json = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
_classCallCheck(this, State);
var scene = new Scene(json.scene);
return _possibleConstructorReturn(this, (State.__proto__ || Object.getPrototypeOf(State)).call(this, _extends({}, json, {
scene: scene,
sceneHistory: json.sceneHistory ? json.sceneHistory : new _immutable.List([scene]),
catalog: new Catalog(json.catalog || {}),
viewer2D: new _immutable.Map(json.viewer2D || {}),
drawingSupport: new _immutable.Map(json.drawingSupport || {}),
draggingSupport: new _immutable.Map(json.draggingSupport || {}),
rotatingSupport: new _immutable.Map(json.rotatingSupport || {}),
misc: json.misc ? (0, _immutable.fromJS)(json.misc) : new _immutable.Map()
})));
}
return State;
}((0, _immutable.Record)({
mode: _constants.MODE_IDLE,
scene: new Scene(),
sceneHistory: new _immutable.List([new Scene()]),
catalog: new Catalog(),
viewer2D: new _immutable.Map(),
mouse: new _immutable.Map({ x: 0, y: 0 }),
zoom: 0,
areasText: new _immutable.Map(),
snapMask: _snap.SNAP_MASK,
snapElements: new _immutable.List(),
activeSnapElement: null,
drawingSupport: new _immutable.Map(),
draggingSupport: new _immutable.Map(),
rotatingSupport: new _immutable.Map(),
errors: new _immutable.List(),
warnings: new _immutable.List(),
clipboardProperties: null,
selectedElementsHistory: new _immutable.List(),
misc: new _immutable.Map() //additional info
}, 'State'));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2RlbHMuanMiXSwibmFtZXMiOlsic2FmZUxvYWRNYXBMaXN0IiwibWFwTGlzdCIsIk1vZGVsIiwiZGVmYXVsdE1hcCIsIm1hcCIsIm0iLCJ0b01hcCIsIkd1aWRlIiwianNvbiIsInByb3BlcnRpZXMiLCJpZCIsInR5cGUiLCJEZWZhdWx0R3VpZGVzIiwic3RlcCIsImNvbG9ycyIsIkVsZW1lbnRzU2V0IiwidmVydGljZXMiLCJsaW5lcyIsImhvbGVzIiwiYXJlYXMiLCJpdGVtcyIsInNoYXJlZEF0dHJpYnV0ZXMiLCJwcm90b3R5cGUiLCJuYW1lIiwibWlzYyIsInNlbGVjdGVkIiwiVmVydGV4IiwieCIsInkiLCJMaW5lIiwiSG9sZSIsIm9mZnNldCIsImxpbmUiLCJBcmVhIiwic2hvd0hlYXRNYXAiLCJoZWF0TWFwVGV4dCIsImhlYXRNYXBDb2xvciIsInRvb2x0aXAiLCJJdGVtIiwicm90YXRpb24iLCJMYXllciIsImFsdGl0dWRlIiwib3JkZXIiLCJvcGFjaXR5IiwidmlzaWJsZSIsIkRlZmF1bHRMYXllcnMiLCJTY2VuZSIsImxheWVycyIsImd1aWRlcyIsInNlbGVjdGVkTGF5ZXIiLCJmaXJzdCIsIm1ldGEiLCJ1bml0IiwiZm9udFNpemUiLCJ3aWR0aCIsImhlaWdodCIsIkNhdGFsb2dFbGVtZW50IiwiaW5mbyIsIkNhdGFsb2ciLCJlbGVtZW50cyIsInJlYWR5IiwiaXNFbXB0eSIsIm9wdGlvbnMiLCJpbml0aWFsUHJvcGVydGllcyIsImhhcyIsImNhdExpc3QiLCJlbGVtZW50IiwidG9BcnJheSIsIkVycm9yIiwiZ2V0IiwidmFsdWUiLCJrZXkiLCJtZXJnZSIsInBhZ2UiLCJwYXRoIiwiU3RhdGUiLCJzY2VuZSIsInNjZW5lSGlzdG9yeSIsImNhdGFsb2ciLCJ2aWV3ZXIyRCIsImRyYXdpbmdTdXBwb3J0IiwiZHJhZ2dpbmdTdXBwb3J0Iiwicm90YXRpbmdTdXBwb3J0IiwibW9kZSIsIm1vdXNlIiwiem9vbSIsImFyZWFzVGV4dCIsInNuYXBNYXNrIiwic25hcEVsZW1lbnRzIiwiYWN0aXZlU25hcEVsZW1lbnQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImNsaXBib2FyZFByb3BlcnRpZXMiLCJzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFJQSxrQkFBa0IsU0FBbEJBLGVBQWtCLENBQUNDLE9BQUQsRUFBVUMsS0FBVixFQUFpQkMsVUFBakIsRUFBZ0M7QUFDcEQsU0FBT0YsVUFDSCxtQkFBUUEsT0FBUixFQUFpQkcsR0FBakIsQ0FBcUI7QUFBQSxXQUFLLElBQUlGLEtBQUosQ0FBVUcsQ0FBVixDQUFMO0FBQUEsR0FBckIsRUFBd0NDLEtBQXhDLEVBREcsR0FFRkgsY0FBYyxvQkFGbkI7QUFHRCxDQUpEOztJQU9hSSxLLFdBQUFBLEs7OztBQUtYLG1CQUF1QjtBQUFBLFFBQVhDLElBQVcsdUVBQUosRUFBSTs7QUFBQTs7QUFBQSxzSEFFaEJBLElBRmdCO0FBR25CQyxrQkFBWSx1QkFBT0QsS0FBS0MsVUFBTCxJQUFtQixFQUExQjtBQUhPO0FBS3RCOzs7RUFWd0IsdUJBQU87QUFDaENDLE1BQUksRUFENEI7QUFFaENDLFFBQU0sRUFGMEI7QUFHaENGLGNBQVk7QUFIb0IsQ0FBUCxFQUl4QixPQUp3QixDOztBQWFwQixJQUFNRyx3Q0FBZ0IsbUJBQVE7QUFDbkMsUUFBTSxJQUFJTCxLQUFKLENBQVU7QUFDZEcsUUFBSSxJQURVO0FBRWRDLFVBQU0sbUJBRlE7QUFHZEYsZ0JBQVk7QUFDVkksWUFBTSxFQURJO0FBRVZDLGNBQVEsQ0FBQyxTQUFELEVBQVksTUFBWixFQUFvQixNQUFwQixFQUE0QixNQUE1QixFQUFvQyxNQUFwQztBQUZFO0FBSEUsR0FBVixDQUQ2QjtBQVNuQyxRQUFNLElBQUlQLEtBQUosQ0FBVTtBQUNkRyxRQUFJLElBRFU7QUFFZEMsVUFBTSxpQkFGUTtBQUdkRixnQkFBWTtBQUNWSSxZQUFNLEVBREk7QUFFVkMs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QS9CLENBUkc7QUFTbkJDLHVCQUFpQixtQkFBUXpFLEtBQUt5RSxlQUFMLElBQXdCLEVBQWhDLENBVEU7QUFVbkJDLHVCQUFpQixtQkFBUTFFLEtBQUswRSxlQUFMLElBQXdCLEVBQWhDLENBVkU7QUFXbkIxRCxZQUFNaEIsS0FBS2dCLElBQUwsR0FBWSx1QkFBT2hCLEtBQUtnQixJQUFaLENBQVosR0FBZ0M7QUFYbkI7QUFhdEI7OztFQWxDd0IsdUJBQU87QUFDaEMyRCw0QkFEZ0M7QUFFaENQLFNBQU8sSUFBSTlCLEtBQUosRUFGeUI7QUFHaEMrQixnQkFBYyxvQkFBUyxDQUFDLElBQUkvQixLQUFKLEVBQUQsQ0FBVCxDQUhrQjtBQUloQ2dDLFdBQVMsSUFBSXBCLE9BQUosRUFKdUI7QUFLaENxQixZQUFVLG9CQUxzQjtBQU1oQ0ssU0FBTyxtQkFBUSxFQUFDekQsR0FBRyxDQUFKLEVBQU9DLEdBQUcsQ0FBVixFQUFSLENBTnlCO0FBT2hDeUQsUUFBTSxDQVAwQjtBQVFoQ0MsYUFBVyxvQkFScUI7QUFTaENDLDJCQVRnQztBQVVoQ0MsZ0JBQWMscUJBVmtCO0FBV2hDQyxxQkFBbUIsSUFYYTtBQVloQ1Qsa0JBQWdCLG9CQVpnQjtBQWFoQ0MsbUJBQWlCLG9CQWJlO0FBY2hDQyxtQkFBaUIsb0JBZGU7QUFlaENRLFVBQVEscUJBZndCO0FBZ0JoQ0MsWUFBVSxxQkFoQnNCO0FBaUJoQ0MsdUJBQXFCLElBakJXO0FBa0JoQ0MsMkJBQXlCLHFCQWxCTztBQW1CaENyRSxRQUFNLG9CQW5CMEIsQ0FtQmQ7QUFuQmMsQ0FBUCxFQW9CeEIsT0FwQndCLEMiLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWNvcmQsIExpc3QsIE1hcCwgZnJvbUpTfSBmcm9tICdpbW11dGFibGUnO1xuaW1wb3J0IHtNT0RFX0lETEUsIE1PREVfMkRfUEFOfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1NOQVBfTUFTS30gZnJvbSAnLi91dGlscy9zbmFwJztcblxubGV0IHNhZmVMb2FkTWFwTGlzdCA9IChtYXBMaXN0LCBNb2RlbCwgZGVmYXVsdE1hcCkgPT4ge1xuICByZXR1cm4gbWFwTGlzdFxuICAgID8gbmV3IE1hcChtYXBMaXN0KS5tYXAobSA9PiBuZXcgTW9kZWwobSkpLnRvTWFwKClcbiAgICA6IChkZWZhdWx0TWFwIHx8IG5ldyBNYXAoKSk7XG59O1xuXG5cbmV4cG9ydCBjbGFzcyBHdWlkZSBleHRlbmRzIFJlY29yZCh7XG4gIGlkOiAnJyxcbiAgdHlwZTogJycsXG4gIHByb3BlcnRpZXM6IE1hcCgpXG59LCAnR3VpZGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBEZWZhdWx0R3VpZGVzID0gbmV3IE1hcCh7XG4gICdoMSc6IG5ldyBHdWlkZSh7XG4gICAgaWQ6ICdoMScsXG4gICAgdHlwZTogJ2hvcml6b250YWwtc3RyZWFrJyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzdGVwOiAyMCxcbiAgICAgIGNvbG9yczogWycjODA4MDgwJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJywgJyNkZGQnXVxuICAgIH1cbiAgfSksXG4gICd2MSc6IG5ldyBHdWlkZSh7XG4gICAgaWQ6ICd2MScsXG4gICAgdHlwZTogJ3ZlcnRpY2FsLXN0cmVhaycsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc3RlcDogMjAsXG4gICAgICBjb2xvcnM6IFsnIzgwODA4MCcsICcjZGRkJywgJyNkZGQnLCAnI2RkZCcsICcjZGRkJ11cbiAgICB9XG4gIH0pXG59KTtcblxuXG5leHBvcnQgY2xhc3MgRWxlbWVudHNTZXQgZXh0ZW5kcyBSZWNvcmQoe1xuICB2ZXJ0aWNlczogbmV3IExpc3QoKSxcbiAgbGluZXM6IG5ldyBMaXN0KCksXG4gIGhvbGVzOiBuZXcgTGlzdCgpLFxuICBhcmVhczogbmV3IExpc3QoKSxcbiAgaXRlbXM6IG5ldyBMaXN0KCksXG59LCAnRWxlbWVudHNTZXQnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIHZlcnRpY2VzOiBuZXcgTGlzdChqc29uLnZlcnRpY2VzIHx8IFtdKSxcbiAgICAgIGxpbmVzOiBuZXcgTGlzdChqc29uLmxpbmVzIHx8IFtdKSxcbiAgICAgIGhvbGVzOiBuZXcgTGlzdChqc29uLmhvbGVzIHx8IFtdKSxcbiAgICAgIGFyZWFzOiBuZXcgTGlzdChqc29uLmFyZWFzIHx8IFtdKSxcbiAgICAgIGl0ZW1zOiBuZXcgTGlzdChqc29uLml0ZW1zIHx8IFtdKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3Qgc2hhcmVkQXR0cmlidXRlcyA9XG57XG4gIGlkOiAnJyxcbiAgdHlwZTogJycsXG4gIHByb3RvdHlwZTogJycsXG4gIG5hbWU6ICcnLFxuICBtaXNjOiBuZXcgTWFwKCksXG4gIHNlbGVjdGVkOiBmYWxzZSxcbiAgcHJvcGVydGllczogbmV3IE1hcCgpLFxufVxuXG5leHBvcnQgY2xhc3MgVmVydGV4IGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgeDogLTEsXG4gIHk6IC0xLFxuICBwcm90b3R5cGU6ICd2ZXJ0aWNlcycsXG4gIGxpbmVzOiBuZXcgTGlzdCgpLFxuICBhcmVhczogbmV3IExpc3QoKVxufSwgJ1ZlcnRleCcpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uanNvbixcbiAgICAgIGxpbmVzOiBuZXcgTGlzdChqc29uLmxpbmVzIHx8IFtdKSxcbiAgICAgIGFyZWFzOiBuZXcgTGlzdChqc29uLmFyZWFzIHx8IFtdKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExpbmUgZXh0ZW5kcyBSZWNvcmQoe1xuICAuLi5zaGFyZWRBdHRyaWJ1dGVzLFxuICBwcm90b3R5cGU6ICdsaW5lcycsXG4gIHZlcnRpY2VzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKVxufSwgJ0xpbmUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KSxcbiAgICAgIHZlcnRpY2VzOiBuZXcgTGlzdChqc29uLnZlcnRpY2VzIHx8IFtdKSxcbiAgICAgIGhvbGVzOiBuZXcgTGlzdChqc29uLmhvbGVzIHx8IFtdKSxcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIb2xlIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnaG9sZXMnLFxuICBvZmZzZXQ6IC0xLFxuICBsaW5lOiAnJ1xufSwgJ0hvbGUnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyZWEgZXh0ZW5kcyBSZWNvcmQoe1xuICAuLi5zaGFyZWRBdHRyaWJ1dGVzLFxuICBwcm90b3R5cGU6ICdhcmVhcycsXG4gIHZlcnRpY2VzOiBuZXcgTGlzdCgpLFxuICBob2xlczogbmV3IExpc3QoKSxcbiAgc2hvd0hlYXRNYXA6IGZhbHNlLFxuICBoZWF0TWFwVGV4dDogJycsXG4gIGhlYXRNYXBDb2xvcjogW10sXG4gIHRvb2x0aXA6IHt9LFxufSwgJ0FyZWEnKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHsgXG4gICAgICAuLi5qc29uLFxuICAgICAgcHJvcGVydGllczogZnJvbUpTKGpzb24ucHJvcGVydGllcyB8fCB7fSksXG4gICAgICB2ZXJ0aWNlczogbmV3IExpc3QoanNvbi52ZXJ0aWNlcyB8fCBbXSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJdGVtIGV4dGVuZHMgUmVjb3JkKHtcbiAgLi4uc2hhcmVkQXR0cmlidXRlcyxcbiAgcHJvdG90eXBlOiAnaXRlbXMnLFxuICB4OiAwLFxuICB5OiAwLFxuICByb3RhdGlvbjogMFxufSwgJ0l0ZW0nKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzIHx8IHt9KVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExheWVyIGV4dGVuZHMgUmVjb3JkKHtcbiAgaWQ6ICcnLFxuICBhbHRpdHVkZTogMCxcbiAgb3JkZXI6IDAsXG4gIG9wYWNpdHk6IDEsXG4gIG5hbWU6ICcnLFxuICB2aXNpYmxlOiB0cnVlLFxuICB2ZXJ0aWNlczogbmV3IE1hcCgpLFxuICBsaW5lczogbmV3IE1hcCgpLFxuICBob2xlczogbmV3IE1hcCgpLFxuICBhcmVhczogbmV3IE1hcCgpLFxuICBpdGVtczogbmV3IE1hcCgpLFxuICBzZWxlY3RlZDogbmV3IEVsZW1lbnRzU2V0KCksXG59LCAnTGF5ZXInKSB7XG4gIGNvbnN0cnVjdG9yKGpzb24gPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICB2ZXJ0aWNlczogc2FmZUxvYWRNYXBMaXN0KGpzb24udmVydGljZXMsIFZlcnRleCksXG4gICAgICBsaW5lczogc2FmZUxvYWRNYXBMaXN0KGpzb24ubGluZXMsIExpbmUpLFxuICAgICAgaG9sZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmhvbGVzLCBIb2xlKSxcbiAgICAgIGFyZWFzOiBzYWZlTG9hZE1hcExpc3QoanNvbi5hcmVhcywgQXJlYSksXG4gICAgICBpdGVtczogc2FmZUxvYWRNYXBMaXN0KGpzb24uaXRlbXMsIEl0ZW0pLFxuICAgICAgc2VsZWN0ZWQ6IG5ldyBFbGVtZW50c1NldChqc29uLnNlbGVjdGVkKVxuICAgIH0pO1xuICB9XG59XG5cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRMYXllcnMgPSBuZXcgTWFwKHtcbiAgJ2xheWVyLTEnOiBuZXcgTGF5ZXIoe2lkOiAnbGF5ZXItMScsIG5hbWU6ICdkZWZhdWx0J30pXG59KTtcblxuXG5leHBvcnQgY2xhc3MgU2NlbmUgZXh0ZW5kcyBSZWNvcmQoe1xuICB1bml0OiAnY20nLFxuICBsYXllcnM6IG5ldyBNYXAoKSxcbiAgZ3VpZGVzOiBuZXcgTWFwKCksXG4gIHNlbGVjdGVkTGF5ZXI6IG51bGwsXG4gIGZvbnRTaXplOiAxMixcbiAgd2lkdGg6IDMwMDAsXG4gIGhlaWdodDogMjAwMCxcbiAgbWV0YTogbmV3IE1hcCgpICAgLy9hZGRpdGlvbmFsIGluZm9cbn0sICdTY2VuZScpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IGxheWVycyA9IHNhZmVMb2FkTWFwTGlzdChqc29uLmxheWVycywgTGF5ZXIsIERlZmF1bHRMYXllcnMpO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBndWlkZXM6IHNhZmVMb2FkTWFwTGlzdChqc29uLmd1aWRlcywgR3VpZGUsIERlZmF1bHRHdWlkZXMpLFxuICAgICAgbGF5ZXJzLFxuICAgICAgc2VsZWN0ZWRMYXllcjogbGF5ZXJzLmZpcnN0KCkuaWQsXG4gICAgICBtZXRhOiBqc29uLm1ldGEgPyBmcm9tSlMoanNvbi5tZXRhKSA6IG5ldyBNYXAoKVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGFsb2dFbGVtZW50IGV4dGVuZHMgUmVjb3JkKHtcbiAgbmFtZTogJycsXG4gIHByb3RvdHlwZTogJycsXG4gIGluZm86IG5ldyBNYXAoKSxcbiAgcHJvcGVydGllczogbmV3IE1hcCgpLFxufSwgJ0NhdGFsb2dFbGVtZW50Jykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5qc29uLFxuICAgICAgaW5mbzogZnJvbUpTKGpzb24uaW5mbyksXG4gICAgICBwcm9wZXJ0aWVzOiBmcm9tSlMoanNvbi5wcm9wZXJ0aWVzKVxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRhbG9nIGV4dGVuZHMgUmVjb3JkKHtcbiAgcmVhZHk6IGZhbHNlLFxuICBwYWdlOiBcInJvb3RcIixcbiAgcGF0aDogbmV3IExpc3QoKSxcbiAgZWxlbWVudHM6IG5ldyBNYXAoKSxcbn0sICdDYXRhbG9nJykge1xuICBjb25zdHJ1Y3Rvcihqc29uID0ge30pIHtcbiAgICBsZXQgZWxlbWVudHMgPSBzYWZlTG9hZE1hcExpc3QoanNvbi5lbGVtZW50cywgQ2F0YWxvZ0VsZW1lbnQpO1xuICAgIHN1cGVyKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcmVhZHk6ICFlbGVtZW50cy5pc0VtcHR5KClcbiAgICB9KVxuICB9XG5cbiAgZmFjdG9yeUVsZW1lbnQodHlwZSwgb3B0aW9ucywgaW5pdGlhbFByb3BlcnRpZXMgPSB7fSkge1xuICAgIGlmICghdGhpcy5lbGVtZW50cy5oYXModHlwZSkpIHtcbiAgICAgIGxldCBjYXRMaXN0ID0gdGhpcy5lbGVtZW50cy5tYXAoZWxlbWVudCA9PiBlbGVtZW50Lm5hbWUpLnRvQXJyYXkoKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCAke3R5cGV9IGRvZXMgbm90IGV4aXN0IGluIGNhdGFsb2cgJHtjYXRMaXN0fWApO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50ID0gdGhpcy5lbGVtZW50cy5nZXQodHlwZSk7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBlbGVtZW50LnByb3BlcnRpZXMubWFwKCh2YWx1ZSwga2V5KSA9PiBpbml0aWFsUHJvcGVydGllc1trZXldIHx8IHZhbHVlLmdldCgnZGVmYXVsdFZhbHVlJykpO1xuXG4gICAgc3dpdGNoIChlbGVtZW50LnByb3RvdHlwZSkge1xuICAgICAgY2FzZSAnbGluZXMnOlxuICAgICAgICByZXR1cm4gbmV3IExpbmUob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnaG9sZXMnOlxuICAgICAgICByZXR1cm4gbmV3IEhvbGUob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnYXJlYXMnOlxuICAgICAgICByZXR1cm4gbmV3IEFyZWEob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgY2FzZSAnaXRlbXMnOlxuICAgICAgICByZXR1cm4gbmV3IEl0ZW0ob3B0aW9ucykubWVyZ2Uoe3Byb3BlcnRpZXN9KTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm90b3R5cGUgbm90IHZhbGlkJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdGF0ZSBleHRlbmRzIFJlY29yZCh7XG4gIG1vZGU6IE1PREVfSURMRSxcbiAgc2NlbmU6IG5ldyBTY2VuZSgpLFxuICBzY2VuZUhpc3Rvcnk6IG5ldyBMaXN0KFtuZXcgU2NlbmUoKV0pLFxuICBjYXRhbG9nOiBuZXcgQ2F0YWxvZygpLFxuICB2aWV3ZXIyRDogbmV3IE1hcCgpLFxuICBtb3VzZTogbmV3IE1hcCh7eDogMCwgeTogMH0pLFxuICB6b29tOiAwLFxuICBhcmVhc1RleHQ6IG5ldyBNYXAoKSxcbiAgc25hcE1hc2s6IFNOQVBfTUFTSyxcbiAgc25hcEVsZW1lbnRzOiBuZXcgTGlzdCgpLFxuICBhY3RpdmVTbmFwRWxlbWVudDogbnVsbCxcbiAgZHJhd2luZ1N1cHBvcnQ6IG5ldyBNYXAoKSxcbiAgZHJhZ2dpbmdTdXBwb3J0OiBuZXcgTWFwKCksXG4gIHJvdGF0aW5nU3VwcG9ydDogbmV3IE1hcCgpLFxuICBlcnJvcnM6IG5ldyBMaXN0KCksXG4gIHdhcm5pbmdzOiBuZXcgTGlzdCgpLFxuICBjbGlwYm9hcmRQcm9wZXJ0aWVzOiBudWxsLFxuICBzZWxlY3RlZEVsZW1lbnRzSGlzdG9yeTogbmV3IExpc3QoKSxcbiAgbWlzYzogbmV3IE1hcCgpICAgLy9hZGRpdGlvbmFsIGluZm9cbn0sICdTdGF0ZScpIHtcbiAgY29uc3RydWN0b3IoanNvbiA9IHt9KSB7XG4gICAgbGV0IHNjZW5lID0gbmV3IFNjZW5lKGpzb24uc2NlbmUpO1xuICAgIHN1cGVyKHtcbiAgICAgIC4uLmpzb24sXG4gICAgICBzY2VuZSxcbiAgICAgIHNjZW5lSGlzdG9yeToganNvbi5zY2VuZUhpc3RvcnkgPyBqc29uLnNjZW5lSGlzdG9yeSA6IG5ldyBMaXN0KFtzY2VuZV0pLFxuICAgICAgY2F0YWxvZzogbmV3IENhdGFsb2coanNvbi5jYXRhbG9nIHx8IHt9KSxcbiAgICAgIHZpZXdlcjJEOiBuZXcgTWFwKGpzb24udmlld2VyMkQgfHwge30pLFxuICAgICAgZHJhd2luZ1N1cHBvcnQ6IG5ldyBNYXAoanNvbi5kcmF3aW5nU3VwcG9ydCB8fCB7fSksXG4gICAgICBkcmFnZ2luZ1N1cHBvcnQ6IG5ldyBNYXAoanNvbi5kcmFnZ2luZ1N1cHBvcnQgfHwge30pLFxuICAgICAgcm90YXRpbmdTdXBwb3J0OiBuZXcgTWFwKGpzb24ucm90YXRpbmdTdXBwb3J0IHx8IHt9KSxcbiAgICAgIG1pc2M6IGpzb24ubWlzYyA/IGZyb21KUyhqc29uLm1pc2MpIDogbmV3IE1hcCgpXG4gICAgfSlcbiAgfVxufVxuXG5cblxuIl19