UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

256 lines (214 loc) 25.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.scenegraphVisConfigs = exports.scenegraphRequiredColumns = exports.scenegraphPosResolver = exports.scenegraphPosAccessor = exports.scenegraphOptionalColumns = exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _meshLayers = require("@deck.gl/mesh-layers"); var _core = require("@loaders.gl/core"); var _addons = require("@luma.gl/addons"); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _scenegraphLayerIcon = _interopRequireDefault(require("./scenegraph-layer-icon")); var _scenegraphInfoModal = _interopRequireDefault(require("./scenegraph-info-modal")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var scenegraphRequiredColumns = exports.scenegraphRequiredColumns = ['lat', 'lng']; var scenegraphOptionalColumns = exports.scenegraphOptionalColumns = ['altitude']; function fetch(url, _ref) { var propName = _ref.propName, layer = _ref.layer; if (propName === 'scenegraph') { return (0, _core.load)(url, _addons.GLTFScenegraphLoader, layer.getLoadOptions()); } return fetch(url).then(function (response) { return response.json(); }); } var scenegraphPosAccessor = exports.scenegraphPosAccessor = function scenegraphPosAccessor(_ref2) { var lat = _ref2.lat, lng = _ref2.lng, altitude = _ref2.altitude; return function (d) { return [// lng d.data[lng.fieldIdx], // lat d.data[lat.fieldIdx], // altitude altitude && altitude.fieldIdx > -1 ? d.data[altitude.fieldIdx] : 0]; }; }; var scenegraphPosResolver = exports.scenegraphPosResolver = function scenegraphPosResolver(_ref3) { var lat = _ref3.lat, lng = _ref3.lng, altitude = _ref3.altitude; return "".concat(lat.fieldIdx, "-").concat(lng.fieldIdx, "-").concat(altitude ? altitude.fieldIdx : 'z'); }; var scenegraphVisConfigs = exports.scenegraphVisConfigs = { opacity: 'opacity', colorRange: 'colorRange', // sizeScale: 'sizeScale', angleX: 'angleX', angleY: 'angleY', angleZ: 'angleZ' }; var DEFAULT_MODEL = 'https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Duck/glTF-Binary/Duck.glb'; var DEFAULT_TRANSITION = [0, 0, 0]; var DEFAULT_SCALE = [1, 1, 1]; var DEFAULT_COLOR = [255, 255, 255, 255]; var ScenegraphLayer = exports["default"] = /*#__PURE__*/function (_Layer) { (0, _inherits2["default"])(ScenegraphLayer, _Layer); var _super = _createSuper(ScenegraphLayer); function ScenegraphLayer(props) { var _this; (0, _classCallCheck2["default"])(this, ScenegraphLayer); _this = _super.call(this, props); _this.registerVisConfig(scenegraphVisConfigs); _this.getPosition = (0, _lodash["default"])(scenegraphPosAccessor, scenegraphPosResolver); // prepare layer info modal _this._layerInfoModal = (0, _scenegraphInfoModal["default"])(); return _this; } (0, _createClass2["default"])(ScenegraphLayer, [{ key: "type", get: function get() { return '3D'; } }, { key: "requiredLayerColumns", get: function get() { return scenegraphRequiredColumns; } }, { key: "optionalColumns", get: function get() { return scenegraphOptionalColumns; } }, { key: "columnPairs", get: function get() { return this.defaultPointColumnPairs; } }, { key: "layerIcon", get: function get() { return _scenegraphLayerIcon["default"]; } }, { key: "layerInfoModal", get: function get() { return { id: 'scenegraphInfo', template: this._layerInfoModal, modalProps: { title: 'How to use Scenegraph' } }; } }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData) { var opt = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; var columns = this.config.columns; var getPosition = this.getPosition(columns); if (!oldLayerData || oldLayerData.getPosition !== getPosition) { this.updateLayerMeta(allData, getPosition); } var data; if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getPosition === getPosition) { data = oldLayerData.data; } else { data = filteredIndex.reduce(function (accu, index) { var pos = getPosition({ data: allData[index] }); // if doesn't have point lat or lng, do not add the point // deck.gl can't handle position = null if (!pos.every(Number.isFinite)) { return accu; } accu.push({ index: index, data: allData[index] }); return accu; }, []); } return { data: data, getPosition: getPosition }; } }, { key: "updateLayerMeta", value: function updateLayerMeta(allData, getPosition) { var bounds = this.getPointsBounds(allData, function (d) { return getPosition({ data: d }); }); this.updateMeta({ bounds: bounds }); } }, { key: "renderLayer", value: function renderLayer(_ref4) { var data = _ref4.data, idx = _ref4.idx, objectHovered = _ref4.objectHovered, mapState = _ref4.mapState, interactionConfig = _ref4.interactionConfig, layerInteraction = _ref4.layerInteraction; var layerProps = _objectSpread({ radiusMinPixels: 1, radiusScale: this.getRadiusScaleByZoom(mapState) }, this.config.visConfig.fixedRadius ? {} : { radiusMaxPixels: 500 }); var _this$config$visConfi = this.config.visConfig, _this$config$visConfi2 = _this$config$visConfi.sizeScale, sizeScale = _this$config$visConfi2 === void 0 ? 1 : _this$config$visConfi2, _this$config$visConfi3 = _this$config$visConfi.angleX, angleX = _this$config$visConfi3 === void 0 ? 0 : _this$config$visConfi3, _this$config$visConfi4 = _this$config$visConfi.angleY, angleY = _this$config$visConfi4 === void 0 ? 0 : _this$config$visConfi4, _this$config$visConfi5 = _this$config$visConfi.angleZ, angleZ = _this$config$visConfi5 === void 0 ? 90 : _this$config$visConfi5; return [new _meshLayers.ScenegraphLayer(_objectSpread(_objectSpread(_objectSpread(_objectSpread({}, layerProps), data), layerInteraction), {}, { id: this.id, idx: idx, opacity: this.config.visConfig.opacity, fetch: fetch, scenegraph: this.config.visConfig.scenegraph || DEFAULT_MODEL, sizeScale: sizeScale, getTranslation: DEFAULT_TRANSITION, getScale: DEFAULT_SCALE, getOrientation: [angleX, angleY, angleZ], getColor: DEFAULT_COLOR, // picking pickable: true, // parameters parameters: { depthTest: true, blend: false }, // update triggers updateTriggers: { getOrientation: { angleX: angleX, angleY: angleY, angleZ: angleZ } } }))]; } }]); return ScenegraphLayer; }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvc2NlbmVncmFwaC1sYXllci9zY2VuZWdyYXBoLWxheWVyLmpzIl0sIm5hbWVzIjpbInNjZW5lZ3JhcGhSZXF1aXJlZENvbHVtbnMiLCJzY2VuZWdyYXBoT3B0aW9uYWxDb2x1bW5zIiwiZmV0Y2giLCJ1cmwiLCJwcm9wTmFtZSIsImxheWVyIiwiR0xURlNjZW5lZ3JhcGhMb2FkZXIiLCJnZXRMb2FkT3B0aW9ucyIsInRoZW4iLCJyZXNwb25zZSIsImpzb24iLCJzY2VuZWdyYXBoUG9zQWNjZXNzb3IiLCJsYXQiLCJsbmciLCJhbHRpdHVkZSIsImQiLCJkYXRhIiwiZmllbGRJZHgiLCJzY2VuZWdyYXBoUG9zUmVzb2x2ZXIiLCJzY2VuZWdyYXBoVmlzQ29uZmlncyIsIm9wYWNpdHkiLCJjb2xvclJhbmdlIiwic2l6ZVNjYWxlIiwiYW5nbGVYIiwiYW5nbGVZIiwiYW5nbGVaIiwiREVGQVVMVF9NT0RFTCIsIkRFRkFVTFRfVFJBTlNJVElPTiIsIkRFRkFVTFRfU0NBTEUiLCJERUZBVUxUX0NPTE9SIiwiU2NlbmVncmFwaExheWVyIiwicHJvcHMiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldFBvc2l0aW9uIiwiX2xheWVySW5mb01vZGFsIiwiZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMiLCJTY2VuZWdyYXBoTGF5ZXJJY29uIiwiaWQiLCJ0ZW1wbGF0ZSIsIm1vZGFsUHJvcHMiLCJ0aXRsZSIsIl8iLCJhbGxEYXRhIiwiZmlsdGVyZWRJbmRleCIsIm9sZExheWVyRGF0YSIsIm9wdCIsImNvbHVtbnMiLCJjb25maWciLCJ1cGRhdGVMYXllck1ldGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJwdXNoIiwiYm91bmRzIiwiZ2V0UG9pbnRzQm91bmRzIiwidXBkYXRlTWV0YSIsImlkeCIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwibGF5ZXJJbnRlcmFjdGlvbiIsImxheWVyUHJvcHMiLCJyYWRpdXNNaW5QaXhlbHMiLCJyYWRpdXNTY2FsZSIsImdldFJhZGl1c1NjYWxlQnlab29tIiwidmlzQ29uZmlnIiwiZml4ZWRSYWRpdXMiLCJyYWRpdXNNYXhQaXhlbHMiLCJEZWNrU2NlbmVncmFwaExheWVyIiwic2NlbmVncmFwaCIsImdldFRyYW5zbGF0aW9uIiwiZ2V0U2NhbGUiLCJnZXRPcmllbnRhdGlvbiIsImdldENvbG9yIiwicGlja2FibGUiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiYmxlbmQiLCJ1cGRhdGVUcmlnZ2VycyIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFTyxJQUFNQSx5QkFBeUIsdUNBQUcsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFsQztBQUNBLElBQU1DLHlCQUF5Qix1Q0FBRyxDQUFDLFVBQUQsQ0FBbEM7O0FBRVAsU0FBU0MsS0FBVCxDQUFlQyxHQUFmLFFBQXVDO0FBQUEsTUFBbEJDLFFBQWtCLFFBQWxCQSxRQUFrQjtBQUFBLE1BQVJDLEtBQVEsUUFBUkEsS0FBUTs7QUFDckMsTUFBSUQsUUFBUSxLQUFLLFlBQWpCLEVBQStCO0FBQzdCLFdBQU8sZ0JBQUtELEdBQUwsRUFBVUcsNEJBQVYsRUFBZ0NELEtBQUssQ0FBQ0UsY0FBTixFQUFoQyxDQUFQO0FBQ0Q7O0FBRUQsU0FBT0wsS0FBSyxDQUFDQyxHQUFELENBQUwsQ0FBV0ssSUFBWCxDQUFnQixVQUFBQyxRQUFRO0FBQUEsV0FBSUEsUUFBUSxDQUFDQyxJQUFULEVBQUo7QUFBQSxHQUF4QixDQUFQO0FBQ0Q7O0FBRU0sSUFBTUMscUJBQXFCLG1DQUFHLFNBQXhCQSxxQkFBd0I7QUFBQSxNQUFFQyxHQUFGLFNBQUVBLEdBQUY7QUFBQSxNQUFPQyxHQUFQLFNBQU9BLEdBQVA7QUFBQSxNQUFZQyxR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QVUsRUFBRSxLQUFLM0IsTUFBTCxDQUFZdUIsU0FBWixDQUFzQkksVUFBdEIsSUFBb0NoRCxhQVZsRDtBQVlFSixRQUFBQSxTQUFTLEVBQVRBLFNBWkY7QUFhRXFELFFBQUFBLGNBQWMsRUFBRWhELGtCQWJsQjtBQWNFaUQsUUFBQUEsUUFBUSxFQUFFaEQsYUFkWjtBQWVFaUQsUUFBQUEsY0FBYyxFQUFFLENBQUN0RCxNQUFELEVBQVNDLE1BQVQsRUFBaUJDLE1BQWpCLENBZmxCO0FBZ0JFcUQsUUFBQUEsUUFBUSxFQUFFakQsYUFoQlo7QUFrQkU7QUFDQWtELFFBQUFBLFFBQVEsRUFBRSxJQW5CWjtBQXFCRTtBQUNBQyxRQUFBQSxVQUFVLEVBQUU7QUFBQ0MsVUFBQUEsU0FBUyxFQUFFLElBQVo7QUFBa0JDLFVBQUFBLEtBQUssRUFBRTtBQUF6QixTQXRCZDtBQXdCRTtBQUNBQyxRQUFBQSxjQUFjLEVBQUU7QUFDZE4sVUFBQUEsY0FBYyxFQUFFO0FBQUN0RCxZQUFBQSxNQUFNLEVBQU5BLE1BQUQ7QUFBU0MsWUFBQUEsTUFBTSxFQUFOQSxNQUFUO0FBQWlCQyxZQUFBQSxNQUFNLEVBQU5BO0FBQWpCO0FBREY7QUF6QmxCLFNBREssQ0FBUDtBQStCRDs7O0VBekkwQzJELHFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtTY2VuZWdyYXBoTGF5ZXIgYXMgRGVja1NjZW5lZ3JhcGhMYXllcn0gZnJvbSAnQGRlY2suZ2wvbWVzaC1sYXllcnMnO1xuaW1wb3J0IHtsb2FkfSBmcm9tICdAbG9hZGVycy5nbC9jb3JlJztcbmltcG9ydCB7R0xURlNjZW5lZ3JhcGhMb2FkZXJ9IGZyb20gJ0BsdW1hLmdsL2FkZG9ucyc7XG5cbmltcG9ydCBMYXllciBmcm9tICcuLi9iYXNlLWxheWVyJztcbmltcG9ydCBtZW1vaXplIGZyb20gJ2xvZGFzaC5tZW1vaXplJztcbmltcG9ydCBTY2VuZWdyYXBoTGF5ZXJJY29uIGZyb20gJy4vc2NlbmVncmFwaC1sYXllci1pY29uJztcbmltcG9ydCBTY2VuZWdyYXBoSW5mb01vZGFsRmFjdG9yeSBmcm9tICcuL3NjZW5lZ3JhcGgtaW5mby1tb2RhbCc7XG5cbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoUmVxdWlyZWRDb2x1bW5zID0gWydsYXQnLCAnbG5nJ107XG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaE9wdGlvbmFsQ29sdW1ucyA9IFsnYWx0aXR1ZGUnXTtcblxuZnVuY3Rpb24gZmV0Y2godXJsLCB7cHJvcE5hbWUsIGxheWVyfSkge1xuICBpZiAocHJvcE5hbWUgPT09ICdzY2VuZWdyYXBoJykge1xuICAgIHJldHVybiBsb2FkKHVybCwgR0xURlNjZW5lZ3JhcGhMb2FkZXIsIGxheWVyLmdldExvYWRPcHRpb25zKCkpO1xuICB9XG5cbiAgcmV0dXJuIGZldGNoKHVybCkudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpO1xufVxuXG5leHBvcnQgY29uc3Qgc2NlbmVncmFwaFBvc0FjY2Vzc29yID0gKHtsYXQsIGxuZywgYWx0aXR1ZGV9KSA9PiBkID0+IFtcbiAgLy8gbG5nXG4gIGQuZGF0YVtsbmcuZmllbGRJZHhdLFxuICAvLyBsYXRcbiAgZC5kYXRhW2xhdC5maWVsZElkeF0sXG4gIC8vIGFsdGl0dWRlXG4gIGFsdGl0dWRlICYmIGFsdGl0dWRlLmZpZWxkSWR4ID4gLTEgPyBkLmRhdGFbYWx0aXR1ZGUuZmllbGRJZHhdIDogMFxuXTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lZ3JhcGhQb3NSZXNvbHZlciA9ICh7bGF0LCBsbmcsIGFsdGl0dWRlfSkgPT5cbiAgYCR7bGF0LmZpZWxkSWR4fS0ke2xuZy5maWVsZElkeH0tJHthbHRpdHVkZSA/IGFsdGl0dWRlLmZpZWxkSWR4IDogJ3onfWA7XG5cbmV4cG9ydCBjb25zdCBzY2VuZWdyYXBoVmlzQ29uZmlncyA9IHtcbiAgb3BhY2l0eTogJ29wYWNpdHknLFxuICBjb2xvclJhbmdlOiAnY29sb3JSYW5nZScsXG4gIC8vXG4gIHNpemVTY2FsZTogJ3NpemVTY2FsZScsXG4gIGFuZ2xlWDogJ2FuZ2xlWCcsXG4gIGFuZ2xlWTogJ2FuZ2xlWScsXG4gIGFuZ2xlWjogJ2FuZ2xlWidcbn07XG5cbmNvbnN0IERFRkFVTFRfTU9ERUwgPVxuICAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0tocm9ub3NHcm91cC9nbFRGLVNhbXBsZS1Nb2RlbHMvbWFzdGVyLzIuMC9EdWNrL2dsVEYtQmluYXJ5L0R1Y2suZ2xiJztcbmNvbnN0IERFRkFVTFRfVFJBTlNJVElPTiA9IFswLCAwLCAwXTtcbmNvbnN0IERFRkFVTFRfU0NBTEUgPSBbMSwgMSwgMV07XG5jb25zdCBERUZBVUxUX0NPTE9SID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lZ3JhcGhMYXllciBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyVmlzQ29uZmlnKHNjZW5lZ3JhcGhWaXNDb25maWdzKTtcbiAgICB0aGlzLmdldFBvc2l0aW9uID0gbWVtb2l6ZShzY2VuZWdyYXBoUG9zQWNjZXNzb3IsIHNjZW5lZ3JhcGhQb3NSZXNvbHZlcik7XG5cbiAgICAvLyBwcmVwYXJlIGxheWVyIGluZm8gbW9kYWxcbiAgICB0aGlzLl9sYXllckluZm9Nb2RhbCA9IFNjZW5lZ3JhcGhJbmZvTW9kYWxGYWN0b3J5KCk7XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJzNEJztcbiAgfVxuXG4gIGdldCByZXF1aXJlZExheWVyQ29sdW1ucygpIHtcbiAgICByZXR1cm4gc2NlbmVncmFwaFJlcXVpcmVkQ29sdW1ucztcbiAgfVxuXG4gIGdldCBvcHRpb25hbENvbHVtbnMoKSB7XG4gICAgcmV0dXJuIHNjZW5lZ3JhcGhPcHRpb25hbENvbHVtbnM7XG4gIH1cblxuICBnZXQgY29sdW1uUGFpcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFBvaW50Q29sdW1uUGFpcnM7XG4gIH1cblxuICBnZXQgbGF5ZXJJY29uKCkge1xuICAgIHJldHVybiBTY2VuZWdyYXBoTGF5ZXJJY29uO1xuICB9XG5cbiAgZ2V0IGxheWVySW5mb01vZGFsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogJ3NjZW5lZ3JhcGhJbmZvJyxcbiAgICAgIHRlbXBsYXRlOiB0aGlzLl9sYXllckluZm9Nb2RhbCxcbiAgICAgIG1vZGFsUHJvcHM6IHtcbiAgICAgICAgdGl0bGU6ICdIb3cgdG8gdXNlIFNjZW5lZ3JhcGgnXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZvcm1hdExheWVyRGF0YShfLCBhbGxEYXRhLCBmaWx0ZXJlZEluZGV4LCBvbGRMYXllckRhdGEsIG9wdCA9IHt9KSB7XG4gICAgY29uc3Qge2NvbHVtbnN9ID0gdGhpcy5jb25maWc7XG5cbiAgICBjb25zdCBnZXRQb3NpdGlvbiA9IHRoaXMuZ2V0UG9zaXRpb24oY29sdW1ucyk7XG5cbiAgICBpZiAoIW9sZExheWVyRGF0YSB8fCBvbGRMYXllckRhdGEuZ2V0UG9zaXRpb24gIT09IGdldFBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxheWVyTWV0YShhbGxEYXRhLCBnZXRQb3NpdGlvbik7XG4gICAgfVxuXG4gICAgbGV0IGRhdGE7XG4gICAgaWYgKFxuICAgICAgb2xkTGF5ZXJEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZGF0YSAmJlxuICAgICAgb3B0LnNhbWVEYXRhICYmXG4gICAgICBvbGRMYXllckRhdGEuZ2V0UG9zaXRpb24gPT09IGdldFBvc2l0aW9uXG4gICAgKSB7XG4gICAgICBkYXRhID0gb2xkTGF5ZXJEYXRhLmRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGEgPSBmaWx0ZXJlZEluZGV4LnJlZHVjZSgoYWNjdSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zID0gZ2V0UG9zaXRpb24oe2RhdGE6IGFsbERhdGFbaW5kZXhdfSk7XG5cbiAgICAgICAgLy8gaWYgZG9lc24ndCBoYXZlIHBvaW50IGxhdCBvciBsbmcsIGRvIG5vdCBhZGQgdGhlIHBvaW50XG4gICAgICAgIC8vIGRlY2suZ2wgY2FuJ3QgaGFuZGxlIHBvc2l0aW9uID0gbnVsbFxuICAgICAgICBpZiAoIXBvcy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgIH1cblxuICAgICAgICBhY2N1LnB1c2goe1xuICAgICAgICAgIGluZGV4LFxuICAgICAgICAgIGRhdGE6IGFsbERhdGFbaW5kZXhdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBhY2N1O1xuICAgICAgfSwgW10pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhLFxuICAgICAgZ2V0UG9zaXRpb25cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlTGF5ZXJNZXRhKGFsbERhdGEsIGdldFBvc2l0aW9uKSB7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRQb2ludHNCb3VuZHMoYWxsRGF0YSwgZCA9PiBnZXRQb3NpdGlvbih7ZGF0YTogZH0pKTtcbiAgICB0aGlzLnVwZGF0ZU1ldGEoe2JvdW5kc30pO1xuICB9XG5cbiAgcmVuZGVyTGF5ZXIoe1xuICAgIGRhdGEsXG4gICAgaWR4LFxuICAgIG9iamVjdEhvdmVyZWQsXG4gICAgbWFwU3RhdGUsXG4gICAgaW50ZXJhY3Rpb25Db25maWcsXG4gICAgbGF5ZXJJbnRlcmFjdGlvblxuICB9KSB7XG4gICAgY29uc3QgbGF5ZXJQcm9wcyA9IHtcbiAgICAgIHJhZGl1c01pblBpeGVsczogMSxcbiAgICAgIHJhZGl1c1NjYWxlOiB0aGlzLmdldFJhZGl1c1NjYWxlQnlab29tKG1hcFN0YXRlKSxcbiAgICAgIC4uLih0aGlzLmNvbmZpZy52aXNDb25maWcuZml4ZWRSYWRpdXMgPyB7fSA6IHtyYWRpdXNNYXhQaXhlbHM6IDUwMH0pXG4gICAgfTtcblxuICAgIGNvbnN0IHtcbiAgICAgIHZpc0NvbmZpZzoge3NpemVTY2FsZSA9IDEsIGFuZ2xlWCA9IDAsIGFuZ2xlWSA9IDAsIGFuZ2xlWiA9IDkwfVxuICAgIH0gPSB0aGlzLmNvbmZpZztcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgRGVja1NjZW5lZ3JhcGhMYXllcih7XG4gICAgICAgIC4uLmxheWVyUHJvcHMsXG4gICAgICAgIC4uLmRhdGEsXG4gICAgICAgIC4uLmxheWVySW50ZXJhY3Rpb24sXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBpZHgsXG4gICAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuXG4gICAgICAgIGZldGNoLFxuXG4gICAgICAgIHNjZW5lZ3JhcGg6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5zY2VuZWdyYXBoIHx8IERFRkFVTFRfTU9ERUwsXG5cbiAgICAgICAgc2l6ZVNjYWxlLFxuICAgICAgICBnZXRUcmFuc2xhdGlvbjogREVGQVVMVF9UUkFOU0lUSU9OLFxuICAgICAgICBnZXRTY2FsZTogREVGQVVMVF9TQ0FMRSxcbiAgICAgICAgZ2V0T3JpZW50YXRpb246IFthbmdsZVgsIGFuZ2xlWSwgYW5nbGVaXSxcbiAgICAgICAgZ2V0Q29sb3I6IERFRkFVTFRfQ09MT1IsXG5cbiAgICAgICAgLy8gcGlja2luZ1xuICAgICAgICBwaWNrYWJsZTogdHJ1ZSxcblxuICAgICAgICAvLyBwYXJhbWV0ZXJzXG4gICAgICAgIHBhcmFtZXRlcnM6IHtkZXB0aFRlc3Q6IHRydWUsIGJsZW5kOiBmYWxzZX0sXG5cbiAgICAgICAgLy8gdXBkYXRlIHRyaWdnZXJzXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgZ2V0T3JpZW50YXRpb246IHthbmdsZVgsIGFuZ2xlWSwgYW5nbGVafVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIF07XG4gIH1cbn1cbiJdfQ==