kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
217 lines (172 loc) • 24.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = PlotContainerFactory;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reselect = require("reselect");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _reactMapGl = require("react-map-gl");
var _lodash = _interopRequireDefault(require("lodash.debounce"));
var _notificationsUtils = require("../utils/notifications-utils");
var _mapContainer = _interopRequireDefault(require("./map-container"));
var _exportImageUtils = require("../utils/export-image-utils");
var _mapboxGlStyleEditor = require("../utils/map-style-utils/mapbox-gl-style-editor");
var _templateObject;
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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 propTypes = {
width: _propTypes["default"].number.isRequired,
height: _propTypes["default"].number.isRequired,
exportImageSetting: _propTypes["default"].object.isRequired,
addNotification: _propTypes["default"].func.isRequired,
mapFields: _propTypes["default"].object.isRequired
};
PlotContainerFactory.deps = [_mapContainer["default"]]; // Remove mapbox logo in exported map, because it contains non-ascii characters
var StyledPlotContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n .mapboxgl-ctrl-bottom-left,\n .mapboxgl-ctrl-bottom-right {\n display: none;\n }\n"])));
var deckGlProps = {
glOptions: {
preserveDrawingBuffer: true,
useDevicePixels: false
}
};
function PlotContainerFactory(MapContainer) {
var PlotContainer = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(PlotContainer, _Component);
var _super = _createSuper(PlotContainer);
function PlotContainer(_props) {
var _this;
(0, _classCallCheck2["default"])(this, PlotContainer);
_this = _super.call(this, _props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "plottingAreaRef", (0, _react.createRef)());
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "mapStyleSelector", function (props) {
return props.mapFields.mapStyle;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "resolutionSelector", function (props) {
return props.exportImageSetting.resolution;
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "scaledMapStyleSelector", (0, _reselect.createSelector)(_this.mapStyleSelector, _this.resolutionSelector, function (mapStyle, resolution) {
return _objectSpread(_objectSpread({}, mapStyle), {}, {
bottomMapStyle: (0, _mapboxGlStyleEditor.scaleMapStyleByResolution)(mapStyle.bottomMapStyle, resolution),
topMapStyle: (0, _mapboxGlStyleEditor.scaleMapStyleByResolution)(mapStyle.topMapStyle, resolution)
});
}));
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_onMapRender", function (map) {
if (map.isStyleLoaded()) {
_this._retrieveNewScreenshot();
}
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_retrieveNewScreenshot", function () {
if (_this.plottingAreaRef.current) {
_this.props.startExportingImage();
var filter = function filter(node) {
return node.className !== 'mapboxgl-control-container';
};
(0, _exportImageUtils.convertToPng)(_this.plottingAreaRef.current, {
filter: filter
}).then(function (dataUri) {
_this.props.setExportImageDataUri(dataUri);
})["catch"](function (err) {
_this.props.setExportImageError(err);
_this.props.addNotification((0, _notificationsUtils.exportImageError)({
err: err
}));
});
}
});
_this._onMapRender = (0, _lodash["default"])(_this._onMapRender, 500);
return _this;
}
(0, _createClass2["default"])(PlotContainer, [{
key: "componentWillMount",
value: function componentWillMount() {
this.props.startExportingImage();
}
}, {
key: "componentWillReceiveProps",
value: function componentWillReceiveProps(newProps) {
var _this2 = this;
// re-fetch the new screenshot only when ratio legend or resolution changes
var checks = ['ratio', 'resolution', 'legend'];
var shouldRetrieveScreenshot = checks.some(function (item) {
return _this2.props.exportImageSetting[item] !== newProps.exportImageSetting[item];
});
if (shouldRetrieveScreenshot) {
this._retrieveNewScreenshot();
}
}
}, {
key: "render",
value: function render() {
var _this$props = this.props,
width = _this$props.width,
height = _this$props.height,
exportImageSetting = _this$props.exportImageSetting,
mapFields = _this$props.mapFields;
var ratio = exportImageSetting.ratio,
resolution = exportImageSetting.resolution,
legend = exportImageSetting.legend;
var exportImageSize = (0, _exportImageUtils.calculateExportImageSize)({
width: width,
height: height,
ratio: ratio,
resolution: resolution
});
var mapProps = _objectSpread(_objectSpread({}, mapFields), {}, {
mapStyle: this.scaledMapStyleSelector(this.props),
// override viewport based on export settings
mapState: _objectSpread(_objectSpread(_objectSpread({}, mapFields.mapState), exportImageSize), {}, {
zoom: mapFields.mapState.zoom + exportImageSize.zoomOffset
}),
mapControls: {
// override map legend visibility
mapLegend: {
show: legend,
active: true
}
},
MapComponent: _reactMapGl.StaticMap
});
return (/*#__PURE__*/_react["default"].createElement(StyledPlotContainer, {
style: {
position: 'absolute',
top: -9999,
left: -9999
}
}, /*#__PURE__*/_react["default"].createElement("div", {
ref: this.plottingAreaRef,
style: {
width: exportImageSize.width,
height: exportImageSize.height
}
}, /*#__PURE__*/_react["default"].createElement(MapContainer, (0, _extends2["default"])({
index: 0,
onMapRender: this._onMapRender,
isExport: true,
deckGlProps: deckGlProps
}, mapProps))))
);
}
}]);
return PlotContainer;
}(_react.Component);
PlotContainer.propsTypes = propTypes;
return PlotContainer;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL3Bsb3QtY29udGFpbmVyLmpzIl0sIm5hbWVzIjpbInByb3BUeXBlcyIsIndpZHRoIiwiUHJvcFR5cGVzIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImhlaWdodCIsImV4cG9ydEltYWdlU2V0dGluZyIsIm9iamVjdCIsImFkZE5vdGlmaWNhdGlvbiIsImZ1bmMiLCJtYXBGaWVsZHMiLCJQbG90Q29udGFpbmVyRmFjdG9yeSIsImRlcHMiLCJNYXBDb250YWluZXJGYWN0b3J5IiwiU3R5bGVkUGxvdENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsImRlY2tHbFByb3BzIiwiZ2xPcHRpb25zIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwidXNlRGV2aWNlUGl4ZWxzIiwiTWFwQ29udGFpbmVyIiwiUGxvdENvbnRhaW5lciIsInByb3BzIiwibWFwU3R5bGUiLCJyZXNvbHV0aW9uIiwibWFwU3R5bGVTZWxlY3RvciIsInJlc29sdXRpb25TZWxlY3RvciIsImJvdHRvbU1hcFN0eWxlIiwidG9wTWFwU3R5bGUiLCJtYXAiLCJpc1N0eWxlTG9hZGVkIiwiX3JldHJpZXZlTmV3U2NyZWVuc2hvdCIsInBsb3R0aW5nQXJlYVJlZiIsImN1cnJlbnQiLCJzdGFydEV4cG9ydGluZ0ltYWdlIiwiZmlsdGVyIiwibm9kZSIsImNsYXNzTmFtZSIsInRoZW4iLCJkYXRhVXJpIiwic2V0RXhwb3J0SW1hZ2VEYXRhVXJpIiwiZXJyIiwic2V0RXhwb3J0SW1hZ2VFcnJvciIsIl9vbk1hcFJlbmRlciIsIm5ld1Byb3BzIiwiY2hlY2tzIiwic2hvdWxkUmV0cmlldmVTY3JlZW5zaG90Iiwic29tZSIsIml0ZW0iLCJyYXRpbyIsImxlZ2VuZCIsImV4cG9ydEltYWdlU2l6ZSIsIm1hcFByb3BzIiwic2NhbGVkTWFwU3R5bGVTZWxlY3RvciIsIm1hcFN0YXRlIiwiem9vbSIsInpvb21PZmZzZXQiLCJtYXBDb250cm9scyIsIm1hcExlZ2VuZCIsInNob3ciLCJhY3RpdmUiLCJNYXBDb21wb25lbnQiLCJTdGF0aWNNYXAiLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJDb21wb25lbnQiLCJwcm9wc1R5cGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFNBQVMsR0FBRztBQUNoQkMsRUFBQUEsS0FBSyxFQUFFQyxzQkFBVUMsTUFBVixDQUFpQkMsVUFEUjtBQUVoQkMsRUFBQUEsTUFBTSxFQUFFSCxzQkFBVUMsTUFBVixDQUFpQkMsVUFGVDtBQUdoQkUsRUFBQUEsa0JBQWtCLEVBQUVKLHNCQUFVSyxNQUFWLENBQWlCSCxVQUhyQjtBQUloQkksRUFBQUEsZUFBZSxFQUFFTixzQkFBVU8sSUFBVixDQUFlTCxVQUpoQjtBQUtoQk0sRUFBQUEsU0FBUyxFQUFFUixzQkFBVUssTUFBVixDQUFpQkg7QUFMWixDQUFsQjtBQVFBTyxvQkFBb0IsQ0FBQ0MsSUFBckIsR0FBNEIsQ0FBQ0Msd0JBQUQsQ0FBNUIsQyxDQUVBOztBQUNBLElBQU1DLG1CQUFtQixHQUFHQyw2QkFBT0MsR0FBVixpTEFBekI7O0FBT0EsSUFBTUMsV0FBVyxHQUFHO0FBQ2xCQyxFQUFBQSxTQUFTLEVBQUU7QUFDVEMsSUFBQUEscUJBQXFCLEVBQUUsSUFEZDtBQUVUQyxJQUFBQSxlQUFlLEVBQUU7QUFGUjtBQURPLENBQXBCOztBQU9lLFNBQVNULG9CQUFULENBQThCVSxZQUE5QixFQUE0QztBQUFBLE1BQ25EQyxhQURtRDtBQUFBOztBQUFBOztBQUV2RCwyQkFBWUMsTUFBWixFQUFtQjtBQUFBOztBQUFBO0FBQ2pCLGdDQUFNQSxNQUFOO0FBRGlCLDBHQXNCRCx1QkF0QkM7QUFBQSwyR0F3QkEsVUFBQUEsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQ2IsU0FBTixDQUFnQmMsUUFBcEI7QUFBQSxPQXhCTDtB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RjtBQURGO0FBcUJEO0FBbEhzRDtBQUFBO0FBQUEsSUFDN0JjLGdCQUQ2Qjs7QUFxSHpEN0MsRUFBQUEsYUFBYSxDQUFDOEMsVUFBZCxHQUEyQnBFLFNBQTNCO0FBQ0EsU0FBT3NCLGFBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbi8vIGxpYnJhcmllc1xuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50LCBjcmVhdGVSZWZ9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge2NyZWF0ZVNlbGVjdG9yfSBmcm9tICdyZXNlbGVjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7U3RhdGljTWFwfSBmcm9tICdyZWFjdC1tYXAtZ2wnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5pbXBvcnQge2V4cG9ydEltYWdlRXJyb3J9IGZyb20gJ3V0aWxzL25vdGlmaWNhdGlvbnMtdXRpbHMnO1xuaW1wb3J0IE1hcENvbnRhaW5lckZhY3RvcnkgZnJvbSAnLi9tYXAtY29udGFpbmVyJztcbmltcG9ydCB7Y2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplLCBjb252ZXJ0VG9Qbmd9IGZyb20gJ3V0aWxzL2V4cG9ydC1pbWFnZS11dGlscyc7XG5pbXBvcnQge3NjYWxlTWFwU3R5bGVCeVJlc29sdXRpb259IGZyb20gJ3V0aWxzL21hcC1zdHlsZS11dGlscy9tYXBib3gtZ2wtc3R5bGUtZWRpdG9yJztcblxuY29uc3QgcHJvcFR5cGVzID0ge1xuICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgZXhwb3J0SW1hZ2VTZXR0aW5nOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGFkZE5vdGlmaWNhdGlvbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgbWFwRmllbGRzOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cblBsb3RDb250YWluZXJGYWN0b3J5LmRlcHMgPSBbTWFwQ29udGFpbmVyRmFjdG9yeV07XG5cbi8vIFJlbW92ZSBtYXBib3ggbG9nbyBpbiBleHBvcnRlZCBtYXAsIGJlY2F1c2UgaXQgY29udGFpbnMgbm9uLWFzY2lpIGNoYXJhY3RlcnNcbmNvbnN0IFN0eWxlZFBsb3RDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICAubWFwYm94Z2wtY3RybC1ib3R0b20tbGVmdCxcbiAgLm1hcGJveGdsLWN0cmwtYm90dG9tLXJpZ2h0IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5gO1xuXG5jb25zdCBkZWNrR2xQcm9wcyA9IHtcbiAgZ2xPcHRpb25zOiB7XG4gICAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLFxuICAgIHVzZURldmljZVBpeGVsczogZmFsc2VcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUGxvdENvbnRhaW5lckZhY3RvcnkoTWFwQ29udGFpbmVyKSB7XG4gIGNsYXNzIFBsb3RDb250YWluZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICBzdXBlcihwcm9wcyk7XG4gICAgICB0aGlzLl9vbk1hcFJlbmRlciA9IGRlYm91bmNlKHRoaXMuX29uTWFwUmVuZGVyLCA1MDApO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgIHRoaXMucHJvcHMuc3RhcnRFeHBvcnRpbmdJbWFnZSgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMpIHtcbiAgICAgIC8vIHJlLWZldGNoIHRoZSBuZXcgc2NyZWVuc2hvdCBvbmx5IHdoZW4gcmF0aW8gbGVnZW5kIG9yIHJlc29sdXRpb24gY2hhbmdlc1xuICAgICAgY29uc3QgY2hlY2tzID0gWydyYXRpbycsICdyZXNvbHV0aW9uJywgJ2xlZ2VuZCddO1xuICAgICAgY29uc3Qgc2hvdWxkUmV0cmlldmVTY3JlZW5zaG90ID0gY2hlY2tzLnNvbWUoXG4gICAgICAgIGl0ZW0gPT5cbiAgICAgICAgICB0aGlzLnByb3BzLmV4cG9ydEltYWdlU2V0dGluZ1tpdGVtXSAhPT1cbiAgICAgICAgICBuZXdQcm9wcy5leHBvcnRJbWFnZVNldHRpbmdbaXRlbV1cbiAgICAgICk7XG4gICAgICBpZiAoc2hvdWxkUmV0cmlldmVTY3JlZW5zaG90KSB7XG4gICAgICAgIHRoaXMuX3JldHJpZXZlTmV3U2NyZWVuc2hvdCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBsb3R0aW5nQXJlYVJlZiA9IGNyZWF0ZVJlZigpO1xuXG4gICAgbWFwU3R5bGVTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLm1hcEZpZWxkcy5tYXBTdHlsZTtcbiAgICByZXNvbHV0aW9uU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5leHBvcnRJbWFnZVNldHRpbmcucmVzb2x1dGlvbjtcbiAgICBzY2FsZWRNYXBTdHlsZVNlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLm1hcFN0eWxlU2VsZWN0b3IsXG4gICAgICB0aGlzLnJlc29sdXRpb25TZWxlY3RvcixcbiAgICAgIChtYXBTdHlsZSwgcmVzb2x1dGlvbikgPT4gKHtcbiAgICAgICAgLi4ubWFwU3R5bGUsXG4gICAgICAgIGJvdHRvbU1hcFN0eWxlOiBzY2FsZU1hcFN0eWxlQnlSZXNvbHV0aW9uKFxuICAgICAgICAgIG1hcFN0eWxlLmJvdHRvbU1hcFN0eWxlLFxuICAgICAgICAgIHJlc29sdXRpb25cbiAgICAgICAgKSxcbiAgICAgICAgdG9wTWFwU3R5bGU6IHNjYWxlTWFwU3R5bGVCeVJlc29sdXRpb24obWFwU3R5bGUudG9wTWFwU3R5bGUsIHJlc29sdXRpb24pXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBfb25NYXBSZW5kZXIgPSBtYXAgPT4ge1xuICAgICAgaWYgKG1hcC5pc1N0eWxlTG9hZGVkKCkpIHtcbiAgICAgICAgdGhpcy5fcmV0cmlldmVOZXdTY3JlZW5zaG90KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9yZXRyaWV2ZU5ld1NjcmVlbnNob3QgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wbG90dGluZ0FyZWFSZWYuY3VycmVudCkge1xuICAgICAgICB0aGlzLnByb3BzLnN0YXJ0RXhwb3J0aW5nSW1hZ2UoKTtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gbm9kZSA9PiBub2RlLmNsYXNzTmFtZSAhPT0gJ21hcGJveGdsLWNvbnRyb2wtY29udGFpbmVyJztcblxuICAgICAgICBjb252ZXJ0VG9QbmcodGhpcy5wbG90dGluZ0FyZWFSZWYuY3VycmVudCwge2ZpbHRlcn0pXG4gICAgICAgICAgLnRoZW4oZGF0YVVyaSA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnNldEV4cG9ydEltYWdlRGF0YVVyaShkYXRhVXJpKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRFeHBvcnRJbWFnZUVycm9yKGVycik7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmFkZE5vdGlmaWNhdGlvbihleHBvcnRJbWFnZUVycm9yKHtlcnJ9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0LCBleHBvcnRJbWFnZVNldHRpbmcsIG1hcEZpZWxkc30gPSB0aGlzLnByb3BzO1xuICAgICAgY29uc3Qge3JhdGlvLCByZXNvbHV0aW9uLCBsZWdlbmR9ID0gZXhwb3J0SW1hZ2VTZXR0aW5nO1xuICAgICAgY29uc3QgZXhwb3J0SW1hZ2VTaXplID0gY2FsY3VsYXRlRXhwb3J0SW1hZ2VTaXplKHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgcmF0aW8sXG4gICAgICAgIHJlc29sdXRpb25cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtYXBQcm9wcyA9IHtcbiAgICAgICAgLi4ubWFwRmllbGRzLFxuICAgICAgICBtYXBTdHlsZTogdGhpcy5zY2FsZWRNYXBTdHlsZVNlbGVjdG9yKHRoaXMucHJvcHMpLFxuXG4gICAgICAgIC8vIG92ZXJyaWRlIHZpZXdwb3J0IGJhc2VkIG9uIGV4cG9ydCBzZXR0aW5nc1xuICAgICAgICBtYXBTdGF0ZToge1xuICAgICAgICAgIC4uLm1hcEZpZWxkcy5tYXBTdGF0ZSxcbiAgICAgICAgICAuLi5leHBvcnRJbWFnZVNpemUsXG4gICAgICAgICAgem9vbTogbWFwRmllbGRzLm1hcFN0YXRlLnpvb20gKyBleHBvcnRJbWFnZVNpemUuem9vbU9mZnNldFxuICAgICAgICB9LFxuICAgICAgICBtYXBDb250cm9sczoge1xuICAgICAgICAgIC8vIG92ZXJyaWRlIG1hcCBsZWdlbmQgdmlzaWJpbGl0eVxuICAgICAgICAgIG1hcExlZ2VuZDoge1xuICAgICAgICAgICAgc2hvdzogbGVnZW5kLFxuICAgICAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBNYXBDb21wb25lbnQ6IFN0YXRpY01hcFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFN0eWxlZFBsb3RDb250YWluZXJcbiAgICAgICAgICBzdHlsZT17e3Bvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6IC05OTk5LCBsZWZ0OiAtOTk5OX19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICByZWY9e3RoaXMucGxvdHRpbmdBcmVhUmVmfVxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6IGV4cG9ydEltYWdlU2l6ZS53aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBleHBvcnRJbWFnZVNpemUuaGVpZ2h0XG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxNYXBDb250YWluZXJcbiAgICAgICAgICAgICAgaW5kZXg9ezB9XG4gICAgICAgICAgICAgIG9uTWFwUmVuZGVyPXt0aGlzLl9vbk1hcFJlbmRlcn1cbiAgICAgICAgICAgICAgaXNFeHBvcnRcbiAgICAgICAgICAgICAgZGVja0dsUHJvcHM9e2RlY2tHbFByb3BzfVxuICAgICAgICAgICAgICB7Li4ubWFwUHJvcHN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L1N0eWxlZFBsb3RDb250YWluZXI+XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIFBsb3RDb250YWluZXIucHJvcHNUeXBlcyA9IHByb3BUeXBlcztcbiAgcmV0dXJuIFBsb3RDb250YWluZXI7XG59XG4iXX0=