patternplate-client
Version:
Universal javascript client application for patternplate
140 lines (100 loc) • 14 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of');
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _class;
// import strip from 'strip-indent';
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactRouter = require('@marionebl/react-router');
var _autobindDecorator = require('autobind-decorator');
var _autobindDecorator2 = _interopRequireDefault(_autobindDecorator);
var _queryString = require('query-string');
var _queryString2 = _interopRequireDefault(_queryString);
var _lightbox = require('../lightbox');
var _lightbox2 = _interopRequireDefault(_lightbox);
var _editor = require('../common/editor');
var _editor2 = _interopRequireDefault(_editor);
var _markdown = require('../../containers/markdown');
var _markdown2 = _interopRequireDefault(_markdown);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var ProblemLightbox = (0, _autobindDecorator2.default)(_class = function (_Component) {
(0, _inherits3.default)(ProblemLightbox, _Component);
function ProblemLightbox() {
(0, _classCallCheck3.default)(this, ProblemLightbox);
return (0, _possibleConstructorReturn3.default)(this, (ProblemLightbox.__proto__ || (0, _getPrototypeOf2.default)(ProblemLightbox)).apply(this, arguments));
}
(0, _createClass3.default)(ProblemLightbox, [{
key: 'render',
value: function render() {
var props = this.props;
var issueTemplate = getIssueTemplate(props, true);
var buttons = [_react2.default.createElement(
_reactRouter.Link,
{
key: '0',
to: (0, _extends3.default)({}, props.location, {
query: (0, _extends3.default)({}, props.location.query, {
issue: false
})
}),
title: 'Close this lightbox [esc]',
className: 'button lightbox__button'
},
'Close'
)];
return _react2.default.createElement(
_lightbox2.default,
{
title: 'Report an issue',
backdrop: true,
buttons: buttons
},
_react2.default.createElement(_markdown2.default, {
base: props.base,
className: 'lightbox__instructions',
source: getInstructions(props)
}),
_react2.default.createElement(
'div',
{ className: 'problem-lightbox__preview' },
_react2.default.createElement(_editor2.default, {
className: 'editor problem-lightbox__state',
reaOnly: true,
value: issueTemplate
})
)
);
}
}]);
return ProblemLightbox;
}(_react.Component)) || _class;
exports.default = ProblemLightbox;
function getIssueTemplate(props, includeDetails) {
return '\n- [ ] Provide a brief title of the problem\n- [ ] Describe what you are trying to do\n- [ ] Describe actual behaviour\n- [ ] Describe expected behaviour\n\n## Steps to reproduce\n`[Describe how to produce the bug in the application by manual action]`\n\n## Actual\n`[The faulty behaviour as produced by the steps above]`\n\n## Expected\n`[Result of the steps above that match user expectations and allow usage]`\n\n' + (includeDetails ? getDetails(props) : '') + '\n';
}
function getDetails(props) {
return '\n## Details\n<details id="application-state">\n<summary>Application State</summary>\n```json\n' + props.state + '\n```\n</details>\n<details>\n<summary>Versions</summary>\n<table>\n\t<thead>\n\t\t<tr>\n\t\t\t<th>\n\t\t\t\tSoftware\n\t\t\t</th>\n\t\t\t<th>\n\t\t\t\tVersion\n\t\t\t</th>\n\t\t</tr>\n\t</thead>\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tpatternplate\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.version + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tpatternplate-server\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.serverVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\tpatternplate-client\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.clientVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t' + props.browserName + '\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.browserVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t' + (props.runtimeName ? props.runtimeName : 'Runtime') + '\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.runtimeVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t' + (props.clientOsName ? props.clientOsName : 'OS') + ' (Client)\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.clientOsVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t' + (props.serverOsName ? props.serverOsName : 'OS') + ' (Server)\n\t\t\t</td>\n\t\t\t<th>\n\t\t\t\t' + props.serverOsVersion + '\n\t\t\t</td>\n\t\t</tr>\n\t</tbody>\n</table>\n</details>\n';
}
function getInstructions(props) {
var query = _queryString2.default.stringify({
title: '[v' + props.version + ']',
body: '[Please paste the contents of patternplate issue template here]'
});
return '\n> patternplate issue template, please use for issue reporting :bow:\n\n`[Cmd+A] [Cmd+C]` the markdown below into a new isse at\n[sinnerschrader/patternplate](https://github.com/sinnerschrader/patternplate/issues/new?' + query + ')\n';
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NvdXJjZS9hcHBsaWNhdGlvbi9jb21wb25lbnRzL2NvbnRlbnQvcHJvYmxlbS5qcyJdLCJuYW1lcyI6WyJQcm9ibGVtTGlnaHRib3giLCJwcm9wcyIsImlzc3VlVGVtcGxhdGUiLCJnZXRJc3N1ZVRlbXBsYXRlIiwiYnV0dG9ucyIsImxvY2F0aW9uIiwicXVlcnkiLCJpc3N1ZSIsImJhc2UiLCJnZXRJbnN0cnVjdGlvbnMiLCJpbmNsdWRlRGV0YWlscyIsImdldERldGFpbHMiLCJzdGF0ZSIsInZlcnNpb24iLCJzZXJ2ZXJWZXJzaW9uIiwiY2xpZW50VmVyc2lvbiIsImJyb3dzZXJOYW1lIiwiYnJvd3NlclZlcnNpb24iLCJydW50aW1lTmFtZSIsInJ1bnRpbWVWZXJzaW9uIiwiY2xpZW50T3NOYW1lIiwiY2xpZW50T3NWZXJzaW9uIiwic2VydmVyT3NOYW1lIiwic2VydmVyT3NWZXJzaW9uIiwic3RyaW5naWZ5IiwidGl0bGUiLCJib2R5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBOztBQUhBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFHQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0lBR3FCQSxlOzs7Ozs7Ozs7OzJCQVlYO0FBQUEsT0FDREMsS0FEQyxHQUNRLElBRFIsQ0FDREEsS0FEQzs7QUFFUixPQUFNQyxnQkFBZ0JDLGlCQUFpQkYsS0FBakIsRUFBd0IsSUFBeEIsQ0FBdEI7O0FBRUEsT0FBTUcsVUFBVSxDQUNmO0FBQUE7QUFBQTtBQUNDLFVBQUksR0FETDtBQUVDLG9DQUNJSCxNQUFNSSxRQURWO0FBRUNDLHdDQUNJTCxNQUFNSSxRQUFOLENBQWVDLEtBRG5CO0FBRUNDLGNBQU87QUFGUjtBQUZELE9BRkQ7QUFTQyxZQUFNLDJCQVRQO0FBVUMsZ0JBQVU7QUFWWDtBQUFBO0FBQUEsSUFEZSxDQUFoQjs7QUFpQkEsVUFDQztBQUFBO0FBQUE7QUFDQyxZQUFNLGlCQURQO0FBRUMsbUJBRkQ7QUFHQyxjQUFTSDtBQUhWO0FBS0M7QUFDQyxXQUFNSCxNQUFNTyxJQURiO0FBRUMsZ0JBQVUsd0JBRlg7QUFHQyxhQUFRQyxnQkFBZ0JSLEtBQWhCO0FBSFQsTUFMRDtBQVVDO0FBQUE7QUFBQSxPQUFLLFdBQVUsMkJBQWY7QUFDQztBQUNDLGlCQUFVLGdDQURYO0FBRUMsbUJBRkQ7QUFHQyxhQUFPQztBQUhSO0FBREQ7QUFWRCxJQUREO0FBb0JBOzs7OztrQkFyRG1CRixlOzs7QUF3RHJCLFNBQVNHLGdCQUFULENBQTBCRixLQUExQixFQUFpQ1MsY0FBakMsRUFBaUQ7QUFDaEQsK2FBZUNBLGlCQUFpQkMsV0FBV1YsS0FBWCxDQUFqQixHQUFxQyxFQWZ0QztBQWlCQTs7QUFFRCxTQUFTVSxVQUFULENBQW9CVixLQUFwQixFQUEyQjtBQUMxQiw0R0FLQ0EsTUFBTVcsS0FMUCxxU0EyQktYLE1BQU1ZLE9BM0JYLHNIQW1DS1osTUFBTWEsYUFuQ1gsc0hBMkNLYixNQUFNYyxhQTNDWCxnRUFnREtkLE1BQU1lLFdBaERYLDJDQW1ES2YsTUFBTWdCLGNBbkRYLGlFQXdES2hCLE1BQU1pQixXQUFOLEdBQW9CakIsTUFBTWlCLFdBQTFCLEdBQXdDLFNBeEQ3Qyw0Q0EyREtqQixNQUFNa0IsY0EzRFgsaUVBZ0VLbEIsTUFBTW1CLFlBQU4sR0FBcUJuQixNQUFNbUIsWUFBM0IsR0FBMEMsSUFoRS9DLHFEQW1FS25CLE1BQU1vQixlQW5FWCxpRUF3RUtwQixNQUFNcUIsWUFBTixHQUFxQnJCLE1BQU1xQixZQUEzQixHQUEwQyxJQXhFL0MscURBMkVLckIsTUFBTXNCLGVBM0VYO0FBa0ZBOztBQUVELFNBQVNkLGVBQVQsQ0FBeUJSLEtBQXpCLEVBQWdDO0FBQy9CLEtBQU1LLFFBQVEsc0JBQVlrQixTQUFaLENBQXNCO0FBQ25DQyxnQkFBWXhCLE1BQU1ZLE9BQWxCLE1BRG1DO0FBRW5DYTtBQUZtQyxFQUF0QixDQUFkOztBQUtBLHVPQUl5RnBCLEtBSnpGO0FBTUEiLCJmaWxlIjoicHJvYmxlbS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgUHJvcFR5cGVzIGFzIHR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7TGlua30gZnJvbSAnQG1hcmlvbmVibC9yZWFjdC1yb3V0ZXInO1xuaW1wb3J0IGF1dG9iaW5kIGZyb20gJ2F1dG9iaW5kLWRlY29yYXRvcic7XG4vLyBpbXBvcnQgc3RyaXAgZnJvbSAnc3RyaXAtaW5kZW50JztcblxuaW1wb3J0IHF1ZXJ5U3RyaW5nIGZyb20gJ3F1ZXJ5LXN0cmluZyc7XG5cbmltcG9ydCBMaWdodGJveCBmcm9tICcuLi9saWdodGJveCc7XG5pbXBvcnQgRWRpdG9yIGZyb20gJy4uL2NvbW1vbi9lZGl0b3InO1xuaW1wb3J0IE1hcmtkb3duIGZyb20gJy4uLy4uL2NvbnRhaW5lcnMvbWFya2Rvd24nO1xuXG5AYXV0b2JpbmRcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2JsZW1MaWdodGJveCBleHRlbmRzIENvbXBvbmVudCB7XG5cdHN0YXRpYyBwcm9wVHlwZXMgPSB7XG5cdFx0YmFzZTogdC5zdHJpbmcuaXNSZXF1aXJlZCxcblx0XHRzdGF0ZTogdC5zdHJpbmcuaXNSZXF1aXJlZCxcblx0XHR0aGVtZTogdC5vbmVPZihbJ2RhcmsnLCAnbGlnaHQnXSkuaXNSZXF1aXJlZCxcblx0XHR2ZXJzaW9uOiB0LnN0cmluZy5pc1JlcXVpcmVkLFxuXHRcdHNlcnZlclZlcnNpb246IHQuc3RyaW5nLmlzUmVxdWlyZWQsXG5cdFx0Y2xpZW50VmVyc2lvbjogdC5zdHJpbmcuaXNSZXF1aXJlZCxcblx0XHRicm93c2VyTmFtZTogdC5zdHJpbmcuaXNSZXF1aXJlZCxcblx0XHRicm93c2VyVmVyc2lvbjogdC5zdHJpbmcuaXNSZXF1aXJlZFxuXHR9O1xuXG5cdHJlbmRlcigpIHtcblx0XHRjb25zdCB7cHJvcHN9ID0gdGhpcztcblx0XHRjb25zdCBpc3N1ZVRlbXBsYXRlID0gZ2V0SXNzdWVUZW1wbGF0ZShwcm9wcywgdHJ1ZSk7XG5cblx0XHRjb25zdCBidXR0b25zID0gW1xuXHRcdFx0PExpbmtcblx0XHRcdFx0a2V5PVwiMFwiXG5cdFx0XHRcdHRvPXt7XG5cdFx0XHRcdFx0Li4ucHJvcHMubG9jYXRpb24sXG5cdFx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHRcdC4uLnByb3BzLmxvY2F0aW9uLnF1ZXJ5LFxuXHRcdFx0XHRcdFx0aXNzdWU6IGZhbHNlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9fVxuXHRcdFx0XHR0aXRsZT1cIkNsb3NlIHRoaXMgbGlnaHRib3ggW2VzY11cIlxuXHRcdFx0XHRjbGFzc05hbWU9XCJidXR0b24gbGlnaHRib3hfX2J1dHRvblwiXG5cdFx0XHRcdD5cblx0XHRcdFx0Q2xvc2Vcblx0XHRcdDwvTGluaz5cblx0XHRdO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdDxMaWdodGJveFxuXHRcdFx0XHR0aXRsZT1cIlJlcG9ydCBhbiBpc3N1ZVwiXG5cdFx0XHRcdGJhY2tkcm9wXG5cdFx0XHRcdGJ1dHRvbnM9e2J1dHRvbnN9XG5cdFx0XHRcdD5cblx0XHRcdFx0PE1hcmtkb3duXG5cdFx0XHRcdFx0YmFzZT17cHJvcHMuYmFzZX1cblx0XHRcdFx0XHRjbGFzc05hbWU9XCJsaWdodGJveF9faW5zdHJ1Y3Rpb25zXCJcblx0XHRcdFx0XHRzb3VyY2U9e2dldEluc3RydWN0aW9ucyhwcm9wcyl9XG5cdFx0XHRcdFx0Lz5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJwcm9ibGVtLWxpZ2h0Ym94X19wcmV2aWV3XCI+XG5cdFx0XHRcdFx0PEVkaXRvclxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwiZWRpdG9yIHByb2JsZW0tbGlnaHRib3hfX3N0YXRlXCJcblx0XHRcdFx0XHRcdHJlYU9ubHlcblx0XHRcdFx0XHRcdHZhbHVlPXtpc3N1ZVRlbXBsYXRlfVxuXHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L0xpZ2h0Ym94PlxuXHRcdCk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0SXNzdWVUZW1wbGF0ZShwcm9wcywgaW5jbHVkZURldGFpbHMpIHtcblx0cmV0dXJuIGBcbi0gWyBdIFByb3ZpZGUgYSBicmllZiB0aXRsZSBvZiB0aGUgcHJvYmxlbVxuLSBbIF0gRGVzY3JpYmUgd2hhdCB5b3UgYXJlIHRyeWluZyB0byBkb1xuLSBbIF0gRGVzY3JpYmUgYWN0dWFsIGJlaGF2aW91clxuLSBbIF0gRGVzY3JpYmUgZXhwZWN0ZWQgYmVoYXZpb3VyXG5cbiMjIFN0ZXBzIHRvIHJlcHJvZHVjZVxuXFxgW0Rlc2NyaWJlIGhvdyB0byBwcm9kdWNlIHRoZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIGJ5IG1hbnVhbCBhY3Rpb25dXFxgXG5cbiMjIEFjdHVhbFxuXFxgW1RoZSBmYXVsdHkgYmVoYXZpb3VyIGFzIHByb2R1Y2VkIGJ5IHRoZSBzdGVwcyBhYm92ZV1cXGBcblxuIyMgRXhwZWN0ZWRcblxcYFtSZXN1bHQgb2YgdGhlIHN0ZXBzIGFib3ZlIHRoYXQgbWF0Y2ggdXNlciBleHBlY3RhdGlvbnMgYW5kIGFsbG93IHVzYWdlXVxcYFxuXG4ke2luY2x1ZGVEZXRhaWxzID8gZ2V0RGV0YWlscyhwcm9wcykgOiAnJ31cbmA7XG59XG5cbmZ1bmN0aW9uIGdldERldGFpbHMocHJvcHMpIHtcblx0cmV0dXJuIGBcbiMjIERldGFpbHNcbjxkZXRhaWxzIGlkPVwiYXBwbGljYXRpb24tc3RhdGVcIj5cbjxzdW1tYXJ5PkFwcGxpY2F0aW9uIFN0YXRlPC9zdW1tYXJ5PlxuXFxgXFxgXFxganNvblxuJHtwcm9wcy5zdGF0ZX1cblxcYFxcYFxcYFxuPC9kZXRhaWxzPlxuPGRldGFpbHM+XG48c3VtbWFyeT5WZXJzaW9uczwvc3VtbWFyeT5cbjx0YWJsZT5cblx0PHRoZWFkPlxuXHRcdDx0cj5cblx0XHRcdDx0aD5cblx0XHRcdFx0U29mdHdhcmVcblx0XHRcdDwvdGg+XG5cdFx0XHQ8dGg+XG5cdFx0XHRcdFZlcnNpb25cblx0XHRcdDwvdGg+XG5cdFx0PC90cj5cblx0PC90aGVhZD5cblx0PHRib2R5PlxuXHRcdDx0cj5cblx0XHRcdDx0ZD5cblx0XHRcdFx0cGF0dGVybnBsYXRlXG5cdFx0XHQ8L3RkPlxuXHRcdFx0PHRoPlxuXHRcdFx0XHQke3Byb3BzLnZlcnNpb259XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdFx0PHRyPlxuXHRcdFx0PHRkPlxuXHRcdFx0XHRwYXR0ZXJucGxhdGUtc2VydmVyXG5cdFx0XHQ8L3RkPlxuXHRcdFx0PHRoPlxuXHRcdFx0XHQke3Byb3BzLnNlcnZlclZlcnNpb259XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdFx0PHRyPlxuXHRcdFx0PHRkPlxuXHRcdFx0XHRwYXR0ZXJucGxhdGUtY2xpZW50XG5cdFx0XHQ8L3RkPlxuXHRcdFx0PHRoPlxuXHRcdFx0XHQke3Byb3BzLmNsaWVudFZlcnNpb259XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdFx0PHRyPlxuXHRcdFx0PHRkPlxuXHRcdFx0XHQke3Byb3BzLmJyb3dzZXJOYW1lfVxuXHRcdFx0PC90ZD5cblx0XHRcdDx0aD5cblx0XHRcdFx0JHtwcm9wcy5icm93c2VyVmVyc2lvbn1cblx0XHRcdDwvdGQ+XG5cdFx0PC90cj5cblx0XHQ8dHI+XG5cdFx0XHQ8dGQ+XG5cdFx0XHRcdCR7cHJvcHMucnVudGltZU5hbWUgPyBwcm9wcy5ydW50aW1lTmFtZSA6ICdSdW50aW1lJ31cblx0XHRcdDwvdGQ+XG5cdFx0XHQ8dGg+XG5cdFx0XHRcdCR7cHJvcHMucnVudGltZVZlcnNpb259XG5cdFx0XHQ8L3RkPlxuXHRcdDwvdHI+XG5cdFx0PHRyPlxuXHRcdFx0PHRkPlxuXHRcdFx0XHQke3Byb3BzLmNsaWVudE9zTmFtZSA/IHByb3BzLmNsaWVudE9zTmFtZSA6ICdPUyd9IChDbGllbnQpXG5cdFx0XHQ8L3RkPlxuXHRcdFx0PHRoPlxuXHRcdFx0XHQke3Byb3BzLmNsaWVudE9zVmVyc2lvbn1cblx0XHRcdDwvdGQ+XG5cdFx0PC90cj5cblx0XHQ8dHI+XG5cdFx0XHQ8dGQ+XG5cdFx0XHRcdCR7cHJvcHMuc2VydmVyT3NOYW1lID8gcHJvcHMuc2VydmVyT3NOYW1lIDogJ09TJ30gKFNlcnZlcilcblx0XHRcdDwvdGQ+XG5cdFx0XHQ8dGg+XG5cdFx0XHRcdCR7cHJvcHMuc2VydmVyT3NWZXJzaW9ufVxuXHRcdFx0PC90ZD5cblx0XHQ8L3RyPlxuXHQ8L3Rib2R5PlxuPC90YWJsZT5cbjwvZGV0YWlscz5cbmA7XG59XG5cbmZ1bmN0aW9uIGdldEluc3RydWN0aW9ucyhwcm9wcykge1xuXHRjb25zdCBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnN0cmluZ2lmeSh7XG5cdFx0dGl0bGU6IGBbdiR7cHJvcHMudmVyc2lvbn1dYCxcblx0XHRib2R5OiBgW1BsZWFzZSBwYXN0ZSB0aGUgY29udGVudHMgb2YgcGF0dGVybnBsYXRlIGlzc3VlIHRlbXBsYXRlIGhlcmVdYFxuXHR9KTtcblxuXHRyZXR1cm4gYFxuPiBwYXR0ZXJucGxhdGUgaXNzdWUgdGVtcGxhdGUsIHBsZWFzZSB1c2UgZm9yIGlzc3VlIHJlcG9ydGluZyA6Ym93OlxuXG5cXGBbQ21kK0FdIFtDbWQrQ11cXGAgdGhlIG1hcmtkb3duIGJlbG93IGludG8gYSBuZXcgaXNzZSBhdFxuW3Npbm5lcnNjaHJhZGVyL3BhdHRlcm5wbGF0ZV0oaHR0cHM6Ly9naXRodWIuY29tL3Npbm5lcnNjaHJhZGVyL3BhdHRlcm5wbGF0ZS9pc3N1ZXMvbmV3PyR7cXVlcnl9KVxuYDtcbn1cbiJdfQ==