UNPKG

kepler.gl.geoiq

Version:

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

317 lines (249 loc) 28.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); 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 _styledComponents = _interopRequireDefault(require("styled-components")); var _uploadButton = _interopRequireDefault(require("./upload-button")); var _icons = require("../icons"); var _loadingSpinner = _interopRequireDefault(require("../loading-spinner")); var _utils = require("../../../utils/utils"); function _templateObject8() { var data = (0, _taggedTemplateLiteral2["default"])(["\n position: absolute;\n bottom: 0;\n padding: 10px 30px;\n"]); _templateObject8 = function _templateObject8() { return data; }; return data; } function _templateObject7() { var data = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: center;\n align-items: center;\n"]); _templateObject7 = function _templateObject7() { return data; }; return data; } function _templateObject6() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .filter-upload__input {\n visibility: hidden;\n height: 0;\n position: absolute;\n }\n\n .file-drop {\n position: relative;\n }\n\n .file-upload__message {\n color: ", ";\n font-size: 14px;\n margin-bottom: 12px;\n }\n"]); _templateObject6 = function _templateObject6() { return data; }; return data; } function _templateObject5() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n margin-bottom: 60px;\n\n .file-type-row {\n margin-bottom: 26px;\n }\n"]); _templateObject5 = function _templateObject5() { return data; }; return data; } function _templateObject4() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n font-size: 20px;\n height: 36px;\n"]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = (0, _taggedTemplateLiteral2["default"])(["\n background-color: white;\n border-radius: 4px;\n border-style: dashed;\n border-width: 1px;\n border-color: ", ";\n height: 414px;\n padding-top: 60px;\n text-align: center;\n width: 100%;\n\n .file-upload-or {\n color: ", ";\n padding-right: 4px;\n }\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteral2["default"])(["\n color: ", ";\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n margin-top: 10px;\n color: ", ";\n"]); _templateObject = function _templateObject() { return data; }; return data; } var FileDrop = typeof document !== 'undefined' ? require('react-file-drop') : null; // File.type is not reliable if the OS does not have a // registered mapping for the extension. // NOTE: Shapefiles must be in a compressed format since // it requires multiple files to be present. var defaultValidFileExt = ['csv', // 'tar.gz', // 'tgz', // 'zip', // 'gpx', // 'kml', 'json', 'geojson']; var MESSAGE = ' Drag & Drop Your File(s) Here'; var CHROME_MSG = '*Chrome user: Limit file size to 250mb, if need to upload larger file, try Safari'; var DISCLAIMER = '*Kepler.gl is a client-side application with no server backend. Data lives only on your machine/browser. ' + 'No information or map data is sent to any server.'; var CONFIG_UPLOAD_MESSAGE = 'Upload data files or upload a saved map via previously exported single Json of both config and data'; var fileIconColor = '#D3D8E0'; var WarningMsg = _styledComponents["default"].span(_templateObject(), function (props) { return props.theme.errorColor; }); var PositiveMsg = _styledComponents["default"].span(_templateObject2(), function (props) { return props.theme.primaryBtnActBgd; }); var StyledFileDrop = _styledComponents["default"].div(_templateObject3(), function (props) { return props.theme.subtextColorLT; }, function (props) { return props.theme.linkBtnColor; }); var MsgWrapper = _styledComponents["default"].div(_templateObject4(), function (props) { return props.theme.modalTitleColor; }); var StyledDragNDropIcon = _styledComponents["default"].div(_templateObject5(), fileIconColor); var StyledFileUpload = _styledComponents["default"].div(_templateObject6(), function (props) { return props.theme.textColorLT; }); var StyledMessage = _styledComponents["default"].div(_templateObject7()); var StyledDisclaimer = StyledMessage.extend(_templateObject8()); var FileUpload = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(FileUpload, _Component); function FileUpload() { var _getPrototypeOf2; var _this; (0, _classCallCheck2["default"])(this, FileUpload); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = (0, _possibleConstructorReturn2["default"])(this, (_getPrototypeOf2 = (0, _getPrototypeOf3["default"])(FileUpload)).call.apply(_getPrototypeOf2, [this].concat(args))); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "state", { dragOver: false, files: [], errorFiles: [] }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_isValidFileType", function (filename) { var validFileExt = _this.props.validFileExt; var fileExt = validFileExt.find(function (ext) { return filename.endsWith(ext); }); return Boolean(fileExt); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_handleFileDrop", function (files, e) { if (e) { e.stopPropagation(); } var nextState = { files: [], errorFiles: [], dragOver: false }; for (var i = 0; i < files.length; i++) { var file = files[i]; if (file && _this._isValidFileType(file.name)) { nextState.files.push(file); } else { nextState.errorFiles.push(file.name); } } _this.setState(nextState, function () { return nextState.files.length ? _this.props.onFileUpload(nextState.files) : null; }); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_toggleDragState", function (newState) { _this.setState({ dragOver: newState }); }); return _this; } (0, _createClass2["default"])(FileUpload, [{ key: "_renderMessage", value: function _renderMessage() { var _this$state = this.state, errorFiles = _this$state.errorFiles, files = _this$state.files; if (errorFiles.length) { return _react["default"].createElement(WarningMsg, null, "File ".concat(errorFiles.join(', '), " is not supported.")); } if (!files.length) { return null; } return _react["default"].createElement(StyledMessage, { className: "file-uploader__message" }, _react["default"].createElement("div", null, "Uploading..."), _react["default"].createElement(PositiveMsg, null, "".concat(files.map(function (f) { return f.name; }).join(' and '), "...")), _react["default"].createElement(_loadingSpinner["default"], { size: 20 })); } }, { key: "render", value: function render() { var _this2 = this; var _this$state2 = this.state, dragOver = _this$state2.dragOver, files = _this$state2.files; var validFileExt = this.props.validFileExt; return _react["default"].createElement(StyledFileUpload, { className: "file-uploader", innerRef: function innerRef(cmp) { return _this2.frame = cmp; } }, _react["default"].createElement("input", { className: "filter-upload__input", type: "file", onChange: this._onChange }), FileDrop ? _react["default"].createElement(FileDrop, { frame: this.frame, targetAlwaysVisible: true, onDragOver: function onDragOver() { return _this2._toggleDragState(true); }, onDragLeave: function onDragLeave() { return _this2._toggleDragState(false); }, onDrop: this._handleFileDrop }, _react["default"].createElement("div", { className: "file-upload__message" }, CONFIG_UPLOAD_MESSAGE), _react["default"].createElement(StyledFileDrop, { dragOver: dragOver }, _react["default"].createElement("div", { style: { opacity: dragOver ? 0.5 : 1 } }, _react["default"].createElement(StyledDragNDropIcon, null, _react["default"].createElement("div", { className: "file-type-row" }, validFileExt.map(function (ext) { return _react["default"].createElement(_icons.FileType, { key: ext, ext: ext, height: "50px", fontSize: "9px" }); })), _react["default"].createElement(_icons.DragNDrop, { height: "44px" })), _react["default"].createElement("div", null, this._renderMessage())), !files.length ? _react["default"].createElement("div", null, _react["default"].createElement(MsgWrapper, null, MESSAGE), _react["default"].createElement("span", { className: "file-upload-or" }, "or"), _react["default"].createElement(_uploadButton["default"], { onUpload: this._handleFileDrop }, "browse your files")) : null, _react["default"].createElement(StyledDisclaimer, null, DISCLAIMER))) : null, _react["default"].createElement(WarningMsg, null, (0, _utils.isChrome)() ? CHROME_MSG : '')); } }]); return FileUpload; }(_react.Component); exports["default"] = FileUpload; (0, _defineProperty2["default"])(FileUpload, "defaultProps", { validFileExt: defaultValidFileExt }); (0, _defineProperty2["default"])(FileUpload, "propTypes", { onFileUpload: _propTypes["default"].func.isRequired, validFileExt: _propTypes["default"].arrayOf(_propTypes["default"].string) }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9maWxlLXVwbG9hZGVyL2ZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbIkZpbGVEcm9wIiwiZG9jdW1lbnQiLCJyZXF1aXJlIiwiZGVmYXVsdFZhbGlkRmlsZUV4dCIsIk1FU1NBR0UiLCJDSFJPTUVfTVNHIiwiRElTQ0xBSU1FUiIsIkNPTkZJR19VUExPQURfTUVTU0FHRSIsImZpbGVJY29uQ29sb3IiLCJXYXJuaW5nTXNnIiwic3R5bGVkIiwic3BhbiIsInByb3BzIiwidGhlbWUiLCJlcnJvckNvbG9yIiwiUG9zaXRpdmVNc2ciLCJwcmltYXJ5QnRuQWN0QmdkIiwiU3R5bGVkRmlsZURyb3AiLCJkaXYiLCJzdWJ0ZXh0Q29sb3JMVCIsImxpbmtCdG5Db2xvciIsIk1zZ1dyYXBwZXIiLCJtb2RhbFRpdGxlQ29sb3IiLCJTdHlsZWREcmFnTkRyb3BJY29uIiwiU3R5bGVkRmlsZVVwbG9hZCIsInRleHRDb2xvckxUIiwiU3R5bGVkTWVzc2FnZSIsIlN0eWxlZERpc2NsYWltZXIiLCJleHRlbmQiLCJGaWxlVXBsb2FkIiwiZHJhZ092ZXIiLCJmaWxlcyIsImVycm9yRmlsZXMiLCJmaWxlbmFtZSIsInZhbGlkRmlsZUV4dCIsImZpbGVFeHQiLCJmaW5kIiwiZXh0IiwiZW5kc1dpdGgiLCJCb29sZWFuIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsIm5leHRTdGF0ZSIsImkiLCJsZW5ndGgiLCJmaWxlIiwiX2lzVmFsaWRGaWxlVHlwZSIsIm5hbWUiLCJwdXNoIiwic2V0U3RhdGUiLCJvbkZpbGVVcGxvYWQiLCJuZXdTdGF0ZSIsInN0YXRlIiwiam9pbiIsIm1hcCIsImYiLCJjbXAiLCJmcmFtZSIsIl9vbkNoYW5nZSIsIl90b2dnbGVEcmFnU3RhdGUiLCJfaGFuZGxlRmlsZURyb3AiLCJvcGFjaXR5IiwiX3JlbmRlck1lc3NhZ2UiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJmdW5jIiwiaXNSZXF1aXJlZCIsImFycmF5T2YiLCJzdHJpbmciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFFBQVEsR0FDWixPQUFPQyxRQUFQLEtBQW9CLFdBQXBCLEdBQWtDQyxPQUFPLENBQUMsaUJBQUQsQ0FBekMsR0FBK0QsSUFEakUsQyxDQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQU1DLG1CQUFtQixHQUFHLENBQzFCLEtBRDBCLEVBRTFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQVAwQixFQVExQixTQVIwQixDQUE1QjtBQVdBLElBQU1DLE9BQU8sR0FBRyxnQ0FBaEI7QUFDQSxJQUFNQyxVQUFVLEdBQ2QsbUZBREY7QUFFQSxJQUFNQyxVQUFVLEdBQ2QsOEdBQ0EsbURBRkY7QUFHQSxJQUFNQyxxQkFBcUIsR0FDekIscUdBREY7QUFHQSxJQUFNQyxhQUFhLEdBQUcsU0FBdEI7O0FBRUEsSUFBTUMsVUFBVSxHQUFHQyw2QkFBT0MsSUFBVixvQkFFTCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLFVBQWhCO0FBQUEsQ0FGQSxDQUFoQjs7QUFLQSxJQUFNQyxXQUFXLEdBQUdMLDZCQUFPQyxJQUFWLHFCQUNOLFVBQUFDLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUcsZ0JBQWhCO0FBQUEsQ0FEQyxDQUFqQjs7QUFJQSxJQUFNQyxjQUFjLEdBQUdQLDZCQUFPUSxHQUFWLHFCQUtGLFVBQUFOLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWU0sY0FBaEI7QUFBQSxDQUxILEVBWVAsVUFBQVAsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZTyxZQUFoQjtBQUFBLENBWkUsQ0FBcEI7O0FBaUJBLElBQU1DLFVBQVUsR0FBR1gsNkJBQU9RLEdBQVYscUJBQ0wsVUFBQU4sS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZUyxlQUFoQjtBQUFBLENBREEsQ0FBaEI7O0FBTUEsSUFBTUMsbUJBQW1CLEdBQUdiLDZCQUFPUSxHQUFWLHFCQUNkVixhQURjLENBQXpCOztBQVNBLElBQU1nQixnQkFBZ0IsR0FBR2QsNkJBQU9RLEdBQVYscUJBWVQsVUFBQU4sS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZWSxXQUFoQjtBQUFBLENBWkksQ0FBdEI7O0FBa0JBLElBQU1DLGFBQWEsR0FBR2hCLDZCQUFPUSxHQUFWLG9CQUFuQjs7QUFNQSxJQUFNUyxnQkFBZ0IsR0FBR0QsYUFBYSxDQUFDRSxNQUFqQixvQkFBdEI7O0lBTXFCQyxVOzs7Ozs7Ozs7Ozs7Ozs7Ozs4RkFVWDtBQUNOQyxNQUFBQSxRQUFRLEVBQUUsS0FESjtBQUVOQyxNQUFBQSxLQUFLLEVBQUUsRUFGRDtBQUdOQyxNQUFBQSxVQUFVLEVBQUU7QUFITixLO3lHQU1XLFVBQUFDLFFBQVEsRUFBSTtBQUFBLFVBQ3RCQyxZQURzQixHQUNOLE1BQUt0QixLQURDLENBQ3RCc0IsWUFEc0I7QUFFN0IsVUFBTUMsT0FBTyxHQUFHRCxZQUFZLENBQUNFLElBQWIsQ0FBa0IsVUFBQUMsR0FBRztBQUFBLGVBQUlKLFFBQVEsQ0FBQ0ssUUFBVCxDQUFrQkQsR0FBbEIsQ0FBSjtBQUFBLE9BQXJCLENBQWhCO0FBRUEsYUFBT0UsT0FBTyxDQUFDSixPQUFELENBQWQ7QUFDRCxLO3dHQUVpQixVQUFDSixLQUFELEVBQVFTLENBQVIsRUFBYztBQUM5QixVQUFJQSxDQUFKLEVBQU87QUFDTEEsUUFBQUEsQ0FBQyxDQUFDQyxlQUFGO0FBQ0Q7O0FBRUQsVUFBTUMsU0FBUyxHQUFHO0FBQUNYLFFBQUFBLEtBQUssRUFBRSxFQUFSO0FBQVlDLFFBQUFBLFVBQVUsRUFBRSxFQUF4QjtBQUE0QkYsUUFBQUEsUUFBUSxFQUFFO0FBQXRDLE9BQWxCOztBQUNBLFdBQUssSUFBSWEsQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMsR0FBR1osS0FBSyxDQUFDYSxNQUExQixFQUFrQ0QsQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxZQUFNRSxJQUFJLEdBQUdkLEtBQUssQ0FBQ1ksQ0FBRCxDQUFsQjs7QUFFQSxZQUFJRSxJQUFJLElBQUksTUFBS0MsZ0JBQUwsQ0FBc0JELElBQUksQ0FBQ0UsSUFBM0IsQ0FBWixFQUE4QztBQUM1Q0wsVUFBQUEsU0FBUyxDQUFDWCxLQUFWLENBQWdCaUIsSUFBaEIsQ0FBcUJILElBQXJCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xILFVBQUFBLFNBQVMsQ0FBQ1YsVUFBVixDQUFxQmdCLElBQXJCLENBQTBCSCxJQUFJLENBQUNFLElBQS9CO0FBQ0Q7QUFDRjs7QUFFRCxZQUFLRSxRQUFMLENBQWNQLFNBQWQsRUFBeUI7QUFBQSxlQUN2QkEsU0FBUyxDQUFDWCxLQUFWLENBQWdCYSxNQUFoQixHQUF5QixNQUFLaEMsS0FBTCxDQUFXc0MsWUFBWCxDQUF3QlIsU0FBUyxDQUFDWCxLQUFsQyxDQUF6QixHQUFvRSxJQUQ3QztBQUFBLE9BQXpCO0FBR0QsSzt5R0FFa0IsVUFBQW9CLFFBQVEsRUFBSTtBQUM3QixZQUFLRixRQUFMLENBQWM7QUFBQ25CLFFBQUFBLFFBQVEsRUFBRXFCO0FBQVgsT0FBZDtBQUNELEs7Ozs7OztxQ0FFZ0I7QUFBQSx3QkFDYSxLQUFLQyxLQURsQjtBQUFBLFVBQ1JwQixVQURRLGVBQ1JBLFVBRFE7QUFBQSxVQUNJRCxLQURKLGVBQ0lBLEtBREo7O0FBR2YsVUFBSUMsVUFBVSxDQUFDWSxNQUFmLEVBQXVCO0FBQ3JCLGVBQ0UsZ0NBQUMsVUFBRCx1QkFDV1osVUFBVSxDQUFDcUIsSUFBWCxDQUFnQixJQUFoQixDQURYLHdCQURGO0FBS0Q7O0FBRUQsVUFBSSxDQUFDdEIsS0FBSyxDQUFDYSxNQUFYLEVBQW1CO0FBQ2pCLGVBQU8sSUFBUDtBQUNEOztBQUVELGFBQ0UsZ0NBQUMsYUFBRDtBQUFlLFFBQUEsU0FBUyxFQUFDO0FBQXpCLFNBQ0UsNERBREYsRUFFRSxnQ0FBQyxXQUFELGtCQUNNYixLQUFLLENBQUN1QixHQUFOLENBQVUsVUFBQUMsQ0FBQztBQUFBLGVBQUlBLENBQUMsQ0FBQ1IsSUFBTjtBQUFBLE9BQVgsRUFBdUJNLElBQXZCLENBQTRCLE9BQTVCLENBRE4sU0FGRixFQUtFLGdDQUFDLDBCQUFEO0FBQWdCLFFBQUEsSUFBSSxFQUFFO0FBQXRCLFFBTEYsQ0FERjtBQVNEOzs7NkJBRVE7QUFBQTs7QUFBQSx5QkFDbUIsS0FBS0QsS0FEeEI7QUFBQSxVQUNBdEIsUUFEQSxnQkFDQUEsUUFEQTtBQUFBLFVBQ1VDLEtBRFYsZ0JBQ1VBLEtBRFY7QUFBQSxVQUVBRyxZQUZBLEdBRWdCLEtBQUt0QixLQUZyQixDQUVBc0IsWUFGQTtBQUdQLGFBQ0UsZ0NBQUMsZ0JBQUQ7QUFDRSxRQUFBLFNBQVMsRUFBQyxlQURaO0FBRUUsUUFBQSxRQUFRLEVBQUUsa0JBQUFzQixHQUFHO0FBQUEsaUJBQUssTUFBSSxDQUFDQyxLQUFMLEdBQWFELEdBQWxCO0FBQUE7QUFGZixTQUlFO0FBQ0UsUUFBQSxTQUFTLEVBQUMsc0JBRFo7QUFFRSxRQUFBLElBQUksRUFBQyxNQUZQO0FBR0UsUUFBQSxRQUFRLEVBQUUsS0FBS0U7QUFIakIsUUFKRixFQVNHMUQsUUFBUSxHQUNQLGdDQUFDLFFBQUQ7QUFDRSxRQUFBLEtBQUssRUFBRSxLQUFLeUQsS0FEZDtBQUVFLFFBQUEsbUJBQW1CLE1BRnJCO0FBR0UsUUFBQSxVQUFVLEVBQUU7QUFBQSxpQkFBTSxNQUFJLENBQUNFLGdCQUFMLENBQXNCLElBQXRCLENBQU47QUFBQSxTQUhkO0FBSUUsUUFBQSxXQUFXLEVBQUU7QUFBQSxpQkFBTSxNQUFJLENBQUNBLGdCQUFMLENBQXNCLEtBQXRCLENBQU47QUFBQSxTQUpmO0FBS0UsUUFBQSxNQUFNLEVBQUUsS0FBS0M7QUFMZixTQU9FO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixTQUF1Q3JELHFCQUF2QyxDQVBGLEVBUUUsZ0NBQUMsY0FBRDtBQUFnQixRQUFBLFFBQVEsRUFBRXVCO0FBQTFCLFNBQ0U7QUFBSyxRQUFBLEtBQUssRUFBRTtBQUFDK0IsVUFBQUEsT0FBTyxFQUFFL0IsUUFBUSxHQUFHLEdBQUgsR0FBUztBQUEzQjtBQUFaLFNBQ0UsZ0NBQUMsbUJBQUQsUUFDRTtBQUFLLFFBQUEsU0FBUyxFQUFDO0FBQWYsU0FDR0ksWUFBWSxDQUFDb0IsR0FBYixDQUFpQixVQUFBakIsR0FBRztBQUFBLGVBQ25CLGdDQUFDLGVBQUQ7QUFDRSxVQUFBLEdBQUcsRUFBRUEsR0FEUDtBQUVFLFVBQUEsR0FBRyxFQUFFQSxHQUZQO0FBR0UsVUFBQSxNQUFNLEVBQUMsTUFIVDtBQUlFLFVBQUEsUUFBUSxFQUFDO0FBSlgsVUFEbUI7QUFBQSxPQUFwQixDQURILENBREYsRUFXRSxnQ0FBQyxnQkFBRDtBQUFXLFFBQUEsTUFBTSxFQUFDO0FBQWxCLFFBWEYsQ0FERixFQWNFLDZDQUFNLEtBQUt5QixjQUFMLEVBQU4sQ0FkRixDQURGLEVBaUJHLENBQUMvQixLQUFLLENBQUNhLE1BQVAsR0FDQyw2Q0FDRSxnQ0FBQyxVQUFELFFBQWF4QyxPQUFiLENBREYsRUFFRTtBQUFNLFFBQUEsU0FBUyxFQUFDO0FBQWhCLGNBRkYsRUFHRSxnQ0FBQyx3QkFBRDtBQUFjLFFBQUEsUUFBUSxFQUFFLEtBQUt3RDtBQUE3Qiw2QkFIRixDQURELEdBUUcsSUF6Qk4sRUEwQkUsZ0NBQUMsZ0JBQUQsUUFBbUJ0RCxVQUFuQixDQTFCRixDQVJGLENBRE8sR0FzQ0wsSUEvQ04sRUFpREUsZ0NBQUMsVUFBRCxRQUFhLHlCQUFhRCxVQUFiLEdBQTBCLEVBQXZDLENBakRGLENBREY7QUFxREQ7OztFQWxJcUMwRCxnQjs7O2lDQUFuQmxDLFUsa0JBQ0c7QUFDcEJLLEVBQUFBLFlBQVksRUFBRS9CO0FBRE0sQztpQ0FESDBCLFUsZUFLQTtBQUNqQnFCLEVBQUFBLFlBQVksRUFBRWMsc0JBQVVDLElBQVYsQ0FBZUMsVUFEWjtBQUVqQmhDLEVBQUFBLFlBQVksRUFBRThCLHNCQUFVRyxPQUFWLENBQWtCSCxzQkFBVUksTUFBNUI7QUFGRyxDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDE5IFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHN0eWxlZCBmcm9tICdzdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBVcGxvYWRCdXR0b24gZnJvbSAnLi91cGxvYWQtYnV0dG9uJztcbmltcG9ydCB7RmlsZVR5cGUsIERyYWdORHJvcH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IExvYWRpbmdTcGlubmVyIGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2xvYWRpbmctc3Bpbm5lcic7XG5pbXBvcnQge2lzQ2hyb21lfSBmcm9tICd1dGlscy91dGlscyc7XG5cbmNvbnN0IEZpbGVEcm9wID1cbiAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyA/IHJlcXVpcmUoJ3JlYWN0LWZpbGUtZHJvcCcpIDogbnVsbDtcblxuLy8gRmlsZS50eXBlIGlzIG5vdCByZWxpYWJsZSBpZiB0aGUgT1MgZG9lcyBub3QgaGF2ZSBhXG4vLyByZWdpc3RlcmVkIG1hcHBpbmcgZm9yIHRoZSBleHRlbnNpb24uXG4vLyBOT1RFOiBTaGFwZWZpbGVzIG11c3QgYmUgaW4gYSBjb21wcmVzc2VkIGZvcm1hdCBzaW5jZVxuLy8gaXQgcmVxdWlyZXMgbXVsdGlwbGUgZmlsZXMgdG8gYmUgcHJlc2VudC5cbmNvbnN0IGRlZmF1bHRWYWxpZEZpbGVFeHQgPSBbXG4gICdjc3YnLFxuICAvLyAndGFyLmd6JyxcbiAgLy8gJ3RneicsXG4gIC8vICd6aXAnLFxuICAvLyAnZ3B4JyxcbiAgLy8gJ2ttbCcsXG4gICdqc29uJyxcbiAgJ2dlb2pzb24nXG5dO1xuXG5jb25zdCBNRVNTQUdFID0gJyBEcmFnICYgRHJvcCBZb3VyIEZpbGUocykgSGVyZSc7XG5jb25zdCBDSFJPTUVfTVNHID1cbiAgJypDaHJvbWUgdXNlcjogTGltaXQgZmlsZSBzaXplIHRvIDI1MG1iLCBpZiBuZWVkIHRvIHVwbG9hZCBsYXJnZXIgZmlsZSwgdHJ5IFNhZmFyaSc7XG5jb25zdCBESVNDTEFJTUVSID1cbiAgJypLZXBsZXIuZ2wgaXMgYSBjbGllbnQtc2lkZSBhcHBsaWNhdGlvbiB3aXRoIG5vIHNlcnZlciBiYWNrZW5kLiBEYXRhIGxpdmVzIG9ubHkgb24geW91ciBtYWNoaW5lL2Jyb3dzZXIuICcgK1xuICAnTm8gaW5mb3JtYXRpb24gb3IgbWFwIGRhdGEgaXMgc2VudCB0byBhbnkgc2VydmVyLic7XG5jb25zdCBDT05GSUdfVVBMT0FEX01FU1NBR0UgPVxuICAnVXBsb2FkIGRhdGEgZmlsZXMgb3IgdXBsb2FkIGEgc2F2ZWQgbWFwIHZpYSBwcmV2aW91c2x5IGV4cG9ydGVkIHNpbmdsZSBKc29uIG9mIGJvdGggY29uZmlnIGFuZCBkYXRhJztcblxuY29uc3QgZmlsZUljb25Db2xvciA9ICcjRDNEOEUwJztcblxuY29uc3QgV2FybmluZ01zZyA9IHN0eWxlZC5zcGFuYFxuICBtYXJnaW4tdG9wOiAxMHB4O1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5lcnJvckNvbG9yfTtcbmA7XG5cbmNvbnN0IFBvc2l0aXZlTXNnID0gc3R5bGVkLnNwYW5gXG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnByaW1hcnlCdG5BY3RCZ2R9O1xuYDtcblxuY29uc3QgU3R5bGVkRmlsZURyb3AgPSBzdHlsZWQuZGl2YFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3JkZXItc3R5bGU6IGRhc2hlZDtcbiAgYm9yZGVyLXdpZHRoOiAxcHg7XG4gIGJvcmRlci1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3JMVH07XG4gIGhlaWdodDogNDE0cHg7XG4gIHBhZGRpbmctdG9wOiA2MHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xuXG4gIC5maWxlLXVwbG9hZC1vciB7XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUubGlua0J0bkNvbG9yfTtcbiAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7XG4gIH1cbmA7XG5cbmNvbnN0IE1zZ1dyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5tb2RhbFRpdGxlQ29sb3J9O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGhlaWdodDogMzZweDtcbmA7XG5cbmNvbnN0IFN0eWxlZERyYWdORHJvcEljb24gPSBzdHlsZWQuZGl2YFxuICBjb2xvcjogJHtmaWxlSWNvbkNvbG9yfTtcbiAgbWFyZ2luLWJvdHRvbTogNjBweDtcblxuICAuZmlsZS10eXBlLXJvdyB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjZweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRmlsZVVwbG9hZCA9IHN0eWxlZC5kaXZgXG4gIC5maWx0ZXItdXBsb2FkX19pbnB1dCB7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGhlaWdodDogMDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cblxuICAuZmlsZS1kcm9wIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAuZmlsZS11cGxvYWRfX21lc3NhZ2Uge1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvckxUfTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkTWVzc2FnZSA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkRGlzY2xhaW1lciA9IFN0eWxlZE1lc3NhZ2UuZXh0ZW5kYFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGJvdHRvbTogMDtcbiAgcGFkZGluZzogMTBweCAzMHB4O1xuYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZVVwbG9hZCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsaWRGaWxlRXh0OiBkZWZhdWx0VmFsaWRGaWxlRXh0XG4gIH07XG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBvbkZpbGVVcGxvYWQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgdmFsaWRGaWxlRXh0OiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKVxuICB9O1xuXG4gIHN0YXRlID0ge1xuICAgIGRyYWdPdmVyOiBmYWxzZSxcbiAgICBmaWxlczogW10sXG4gICAgZXJyb3JGaWxlczogW11cbiAgfTtcblxuICBfaXNWYWxpZEZpbGVUeXBlID0gZmlsZW5hbWUgPT4ge1xuICAgIGNvbnN0IHt2YWxpZEZpbGVFeHR9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBmaWxlRXh0ID0gdmFsaWRGaWxlRXh0LmZpbmQoZXh0ID0+IGZpbGVuYW1lLmVuZHNXaXRoKGV4dCkpO1xuXG4gICAgcmV0dXJuIEJvb2xlYW4oZmlsZUV4dCk7XG4gIH07XG5cbiAgX2hhbmRsZUZpbGVEcm9wID0gKGZpbGVzLCBlKSA9PiB7XG4gICAgaWYgKGUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFN0YXRlID0ge2ZpbGVzOiBbXSwgZXJyb3JGaWxlczogW10sIGRyYWdPdmVyOiBmYWxzZX07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzW2ldO1xuXG4gICAgICBpZiAoZmlsZSAmJiB0aGlzLl9pc1ZhbGlkRmlsZVR5cGUoZmlsZS5uYW1lKSkge1xuICAgICAgICBuZXh0U3RhdGUuZmlsZXMucHVzaChmaWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTdGF0ZS5lcnJvckZpbGVzLnB1c2goZmlsZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgKCkgPT5cbiAgICAgIG5leHRTdGF0ZS5maWxlcy5sZW5ndGggPyB0aGlzLnByb3BzLm9uRmlsZVVwbG9hZChuZXh0U3RhdGUuZmlsZXMpIDogbnVsbFxuICAgICk7XG4gIH07XG5cbiAgX3RvZ2dsZURyYWdTdGF0ZSA9IG5ld1N0YXRlID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtkcmFnT3ZlcjogbmV3U3RhdGV9KTtcbiAgfTtcblxuICBfcmVuZGVyTWVzc2FnZSgpIHtcbiAgICBjb25zdCB7ZXJyb3JGaWxlcywgZmlsZXN9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGlmIChlcnJvckZpbGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFdhcm5pbmdNc2c+XG4gICAgICAgICAge2BGaWxlICR7ZXJyb3JGaWxlcy5qb2luKCcsICcpfSBpcyBub3Qgc3VwcG9ydGVkLmB9XG4gICAgICAgIDwvV2FybmluZ01zZz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8U3R5bGVkTWVzc2FnZSBjbGFzc05hbWU9XCJmaWxlLXVwbG9hZGVyX19tZXNzYWdlXCI+XG4gICAgICAgIDxkaXY+VXBsb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDxQb3NpdGl2ZU1zZz5cbiAgICAgICAgICB7YCR7ZmlsZXMubWFwKGYgPT4gZi5uYW1lKS5qb2luKCcgYW5kICcpfS4uLmB9XG4gICAgICAgIDwvUG9zaXRpdmVNc2c+XG4gICAgICAgIDxMb2FkaW5nU3Bpbm5lciBzaXplPXsyMH0gLz5cbiAgICAgIDwvU3R5bGVkTWVzc2FnZT5cbiAgICApO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtkcmFnT3ZlciwgZmlsZXN9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB7dmFsaWRGaWxlRXh0fSA9IHRoaXMucHJvcHM7XG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRGaWxlVXBsb2FkXG4gICAgICAgIGNsYXNzTmFtZT1cImZpbGUtdXBsb2FkZXJcIlxuICAgICAgICBpbm5lclJlZj17Y21wID0+ICh0aGlzLmZyYW1lID0gY21wKX1cbiAgICAgID5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZmlsdGVyLXVwbG9hZF9faW5wdXRcIlxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5fb25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICAgIHtGaWxlRHJvcCA/IChcbiAgICAgICAgICA8RmlsZURyb3BcbiAgICAgICAgICAgIGZyYW1lPXt0aGlzLmZyYW1lfVxuICAgICAgICAgICAgdGFyZ2V0QWx3YXlzVmlzaWJsZVxuICAgICAgICAgICAgb25EcmFnT3Zlcj17KCkgPT4gdGhpcy5fdG9nZ2xlRHJhZ1N0YXRlKHRydWUpfVxuICAgICAgICAgICAgb25EcmFnTGVhdmU9eygpID0+IHRoaXMuX3RvZ2dsZURyYWdTdGF0ZShmYWxzZSl9XG4gICAgICAgICAgICBvbkRyb3A9e3RoaXMuX2hhbmRsZUZpbGVEcm9wfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsZS11cGxvYWRfX21lc3NhZ2VcIj57Q09ORklHX1VQTE9BRF9NRVNTQUdFfTwvZGl2PlxuICAgICAgICAgICAgPFN0eWxlZEZpbGVEcm9wIGRyYWdPdmVyPXtkcmFnT3Zlcn0+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tvcGFjaXR5OiBkcmFnT3ZlciA/IDAuNSA6IDF9fT5cbiAgICAgICAgICAgICAgICA8U3R5bGVkRHJhZ05Ecm9wSWNvbj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmlsZS10eXBlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICB7dmFsaWRGaWxlRXh0Lm1hcChleHQgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxGaWxlVHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICBleHQ9e2V4dH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjUwcHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9XCI5cHhcIlxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8RHJhZ05Ecm9wIGhlaWdodD1cIjQ0cHhcIiAvPlxuICAgICAgICAgICAgICAgIDwvU3R5bGVkRHJhZ05Ecm9wSWNvbj5cbiAgICAgICAgICAgICAgICA8ZGl2Pnt0aGlzLl9yZW5kZXJNZXNzYWdlKCl9PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB7IWZpbGVzLmxlbmd0aCA/IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPE1zZ1dyYXBwZXI+e01FU1NBR0V9PC9Nc2dXcmFwcGVyPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZmlsZS11cGxvYWQtb3JcIj5vcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxVcGxvYWRCdXR0b24gb25VcGxvYWQ9e3RoaXMuX2hhbmRsZUZpbGVEcm9wfT5cbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlIHlvdXIgZmlsZXNcbiAgICAgICAgICAgICAgICAgIDwvVXBsb2FkQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgICAgPFN0eWxlZERpc2NsYWltZXI+e0RJU0NMQUlNRVJ9PC9TdHlsZWREaXNjbGFpbWVyPlxuICAgICAgICAgICAgPC9TdHlsZWRGaWxlRHJvcD5cbiAgICAgICAgICA8L0ZpbGVEcm9wPlxuICAgICAgICApIDogbnVsbH1cblxuICAgICAgICA8V2FybmluZ01zZz57aXNDaHJvbWUoKSA/IENIUk9NRV9NU0cgOiAnJ308L1dhcm5pbmdNc2c+XG4gICAgICA8L1N0eWxlZEZpbGVVcGxvYWQ+XG4gICAgKTtcbiAgfVxufVxuIl19