kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
637 lines (590 loc) • 64.7 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = exports.SaveMapFactory = exports.SaveExportDropdownFactory = exports.PanelAction = exports.ExportMapFactory = exports.ExportImageFactory = exports.ExportDataFactory = void 0;
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _styledComponents2 = require("../common/styled-components");
var _logo = _interopRequireDefault(require("../common/logo"));
var _icons = require("../common/icons");
var _panelDropdown = _interopRequireDefault(require("./panel-dropdown"));
var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
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 _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 StyledPanelHeader = _styledComponents["default"].div.attrs({
className: 'side-side-panel__header'
})(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px 16px 0 16px;\n"])), function (props) {
return props.theme.sidePanelHeaderBg;
});
var StyledPanelHeaderTop = _styledComponents["default"].div.attrs({
className: 'side-panel__header__top'
})(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n justify-content: space-between;\n margin-bottom: 16px;\n width: 100%;\n"])));
var StyledPanelTopActions = _styledComponents["default"].div.attrs({
className: 'side-panel__header__actions'
})(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n"])));
var StyledPanelAction = _styledComponents["default"].div.attrs({
className: 'side-panel__header__actions'
})(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n align-items: center;\n border-radius: 2px;\n color: ", ";\n display: flex;\n height: 26px;\n justify-content: space-between;\n margin-left: 4px;\n padding: 5px;\n font-weight: bold;\n p {\n display: inline-block;\n margin-right: 6px;\n }\n a {\n height: 20px;\n }\n :hover {\n cursor: pointer;\n background-color: ", ";\n color: ", ";\n a {\n color: ", ";\n }\n }\n"])), function (props) {
return props.active ? props.theme.textColorHl : props.theme.subtextColor;
}, function (props) {
return props.theme.secondaryBtnActBgd;
}, function (props) {
return props.theme.textColorHl;
}, function (props) {
return props.theme.textColorHl;
});
var StyledPanelDropdown = _styledComponents["default"].div(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n box-shadow: ", ";\n font-size: 11px;\n padding: 16px 0;\n position: absolute;\n left: 64px;\n transition: ", ";\n display: flex;\n margin-top: ", ";\n opacity: ", ";\n transform: translateX(calc(-50% + 20px));\n pointer-events: ", ";\n z-index: 1000;\n .save-export-dropdown__inner {\n box-shadow: none;\n background-color: transparent;\n display: flex;\n }\n .save-export-dropdown__item {\n align-items: center;\n border-right: 1px solid ", ";\n color: ", ";\n display: flex;\n flex-direction: column;\n padding: 0 22px;\n :hover {\n cursor: pointer;\n color: ", ";\n }\n &:last-child {\n border-right: 0;\n }\n }\n .save-export-dropdown__title {\n white-space: nowrap;\n margin-top: 4px;\n }\n"])), function (props) {
return props.theme.dropdownListBgd;
}, function (props) {
return props.theme.dropdownListShadow;
}, function (props) {
return props.theme.transitionSlow;
}, function (props) {
return props.show ? '6px' : '20px';
}, function (props) {
return props.show ? 1 : 0;
}, function (props) {
return props.show ? 'all' : 'none';
}, function (props) {
return props.theme.panelHeaderIcon;
}, function (props) {
return props.theme.textColor;
}, function (props) {
return props.theme.textColorHl;
});
var PanelAction = exports.PanelAction = function PanelAction(_ref) {
var item = _ref.item,
onClick = _ref.onClick;
return (/*#__PURE__*/_react["default"].createElement(StyledPanelAction, {
className: "side-panel__panel-header__action",
"data-tip": true,
"data-for": "".concat(item.id, "-action"),
onClick: onClick
}, item.label ? /*#__PURE__*/_react["default"].createElement("p", null, item.label) : null, /*#__PURE__*/_react["default"].createElement("a", {
target: item.blank ? '_blank' : '',
href: item.href
}, /*#__PURE__*/_react["default"].createElement(item.iconComponent, {
height: "20px"
})), item.tooltip ? /*#__PURE__*/_react["default"].createElement(_styledComponents2.Tooltip, {
id: "".concat(item.id, "-action"),
place: "bottom",
delayShow: 500,
effect: "solid"
}, /*#__PURE__*/_react["default"].createElement("span", null, item.tooltip)) : null)
);
};
var PanelItem = function PanelItem(_ref2) {
var onClose = _ref2.onClose,
onClickHandler = _ref2.onClickHandler,
label = _ref2.label,
icon = _ref2.icon;
return (/*#__PURE__*/_react["default"].createElement("div", {
className: "save-export-dropdown__item",
onClick: function onClick(e) {
e.stopPropagation();
onClose();
onClickHandler();
}
}, icon, /*#__PURE__*/_react["default"].createElement("div", {
className: "save-export-dropdown__title"
}, label))
);
};
var ExportImageFactory = exports.ExportImageFactory = function ExportImageFactory() {
var ExportImage = function ExportImage(props) {
return (/*#__PURE__*/_react["default"].createElement(PanelItem, props)
);
};
ExportImage.defaultProps = {
label: 'Export Image',
icon: /*#__PURE__*/_react["default"].createElement(_icons.Picture, null)
};
return ExportImage;
};
var ExportDataFactory = exports.ExportDataFactory = function ExportDataFactory() {
var ExportData = function ExportData(props) {
return (/*#__PURE__*/_react["default"].createElement(PanelItem, props)
);
};
ExportData.defaultProps = {
label: 'Export Data',
icon: /*#__PURE__*/_react["default"].createElement(_icons.Files, null)
};
return ExportData;
};
var ExportMapFactory = exports.ExportMapFactory = function ExportMapFactory() {
var ExportMap = function ExportMap(props) {
return (/*#__PURE__*/_react["default"].createElement(PanelItem, props)
);
};
ExportMap.defaultProps = {
label: 'Export Map',
icon: /*#__PURE__*/_react["default"].createElement(_icons.Map, null)
};
return ExportMap;
};
var SaveMapFactory = exports.SaveMapFactory = function SaveMapFactory() {
var SaveMap = function SaveMap(props) {
return (/*#__PURE__*/_react["default"].createElement(PanelItem, props)
);
};
SaveMap.defaultProps = {
label: 'Save Map',
icon: /*#__PURE__*/_react["default"].createElement(_icons.Share, null)
};
return SaveMap;
};
var SaveExportDropdownFactory = exports.SaveExportDropdownFactory = function SaveExportDropdownFactory(ExportImage, ExportData, ExportMap, SaveMap) {
var SaveExportDropdown = function SaveExportDropdown(_ref3) {
var onExportImage = _ref3.onExportImage,
onExportData = _ref3.onExportData,
onExportConfig = _ref3.onExportConfig,
onExportMap = _ref3.onExportMap,
onSaveMap = _ref3.onSaveMap,
show = _ref3.show,
onClose = _ref3.onClose;
return (/*#__PURE__*/_react["default"].createElement(StyledPanelDropdown, {
show: show,
className: "save-export-dropdown"
}, /*#__PURE__*/_react["default"].createElement(_panelDropdown["default"], {
className: "save-export-dropdown__inner",
show: show,
onClose: onClose
}, /*#__PURE__*/_react["default"].createElement(ExportImage, {
onClickHandler: onExportImage,
onClose: onClose
}), /*#__PURE__*/_react["default"].createElement(ExportData, {
onClickHandler: onExportData,
onClose: onClose
}), /*#__PURE__*/_react["default"].createElement(ExportMap, {
onClickHandler: onExportMap,
onClose: onClose
}), onSaveMap ? /*#__PURE__*/_react["default"].createElement(SaveMap, {
onClickHandler: onSaveMap,
onClose: onClose
}) : null))
);
};
return SaveExportDropdown;
};
SaveExportDropdownFactory.deps = [ExportImageFactory, ExportDataFactory, ExportMapFactory, SaveMapFactory];
PanelHeaderFactory.deps = [SaveExportDropdownFactory];
function PanelHeaderFactory(SaveExportDropdown) {
var _class, _temp;
return _temp = _class = /*#__PURE__*/function (_Component) {
(0, _inherits2["default"])(PanelHeader, _Component);
var _super = _createSuper(PanelHeader);
function PanelHeader() {
(0, _classCallCheck2["default"])(this, PanelHeader);
return _super.apply(this, arguments);
}
(0, _createClass2["default"])(PanelHeader, [{
key: "render",
value: function render() {
var _this$props = this.props,
appName = _this$props.appName,
version = _this$props.version,
actionItems = _this$props.actionItems,
onSaveMap = _this$props.onSaveMap,
onExportImage = _this$props.onExportImage,
onExportData = _this$props.onExportData,
onExportConfig = _this$props.onExportConfig,
onExportMap = _this$props.onExportMap,
visibleDropdown = _this$props.visibleDropdown,
showExportDropdown = _this$props.showExportDropdown,
hideExportDropdown = _this$props.hideExportDropdown;
return (/*#__PURE__*/_react["default"].createElement(StyledPanelHeader, {
className: "side-panel__panel-header"
}, /*#__PURE__*/_react["default"].createElement(StyledPanelHeaderTop, {
className: "side-panel__panel-header__top"
}, /*#__PURE__*/_react["default"].createElement(this.props.logoComponent, {
appName: appName,
version: version
}), /*#__PURE__*/_react["default"].createElement(StyledPanelTopActions, null, actionItems.map(function (item) {
return (/*#__PURE__*/_react["default"].createElement("div", {
className: "side-panel__panel-header__right",
key: item.id,
style: {
position: 'relative'
}
}, /*#__PURE__*/_react["default"].createElement(PanelAction, {
item: item,
onClick: function onClick() {
if (item.dropdownComponent) {
showExportDropdown(item.id);
}
item.onClick();
}
}), item.dropdownComponent ? /*#__PURE__*/_react["default"].createElement(item.dropdownComponent, {
onClose: hideExportDropdown,
show: visibleDropdown === item.id,
onSaveMap: onSaveMap,
onExportData: onExportData,
onExportImage: onExportImage,
onExportConfig: onExportConfig,
onExportMap: onExportMap
}) : null)
);
}))))
);
}
}]);
return PanelHeader;
}(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", {
appName: _propTypes["default"].string,
version: _propTypes["default"].string,
uiState: _propTypes["default"].object,
uiStateActions: _propTypes["default"].object,
logoComponent: _propTypes["default"].oneOfType([_propTypes["default"].element, _propTypes["default"].func]),
actionItems: _propTypes["default"].arrayOf(_propTypes["default"].any)
}), (0, _defineProperty2["default"])(_class, "defaultProps", {
logoComponent: _logo["default"],
actionItems: [{
id: 'save',
iconComponent: _icons.Save,
onClick: function onClick() {},
label: 'Share',
dropdownComponent: SaveExportDropdown
}]
}), _temp;
}
var _default = exports["default"] = PanelHeaderFactory; // import React, {Component} from 'react';
// import styled from 'styled-components';
// import PropTypes from 'prop-types';
// import {Tooltip} from 'components/common/styled-components';
// import KeplerGlLogo from 'components/common/logo';
// import {Save, Files, Share, Picture, Map} from 'components/common/icons';
// import ClickOutsideCloseDropdown from 'components/side-panel/panel-dropdown';
// import Toolbar from 'components/common/toolbar';
// import ToolbarItem from 'components/common/toolbar-item';
// const StyledPanelHeader = styled.div.attrs({
// className: 'side-side-panel__header'
// })`
// background-color: ${props => props.theme.sidePanelHeaderBg};
// padding: 12px 16px 0 16px;
// `;
// const StyledPanelHeaderTop = styled.div.attrs({
// className: 'side-panel__header__top'
// })`
// display: flex;
// justify-content: space-between;
// margin-bottom: 16px;
// width: 100%;
// `;
// const StyledPanelTopActions = styled.div.attrs({
// className: 'side-panel__header__actions'
// })`
// display: flex;
// `;
// const StyledPanelAction = styled.div.attrs({
// className: 'side-panel__header__actions'
// })`
// align-items: center;
// border-radius: 2px;
// color: ${props =>
// props.active ? props.theme.textColorHl : props.theme.subtextColor};
// display: flex;
// height: 26px;
// justify-content: space-between;
// margin-left: 4px;
// padding: 5px;
// font-weight: bold;
// p {
// display: inline-block;
// margin-right: 6px;
// }
// a {
// height: 20px;
// }
// :hover {
// cursor: pointer;
// background-color: ${props => props.theme.secondaryBtnActBgd};
// color: ${props => props.theme.textColorHl};
// a {
// color: ${props => props.theme.textColorHl};
// }
// }
// `;
// // By assigning this style we can position the toolbar in the right place on the screen
// const StyledToolbar = styled(Toolbar)`
// position: absolute;
// left: 64px;
// `;
// // transition: ${props => props.theme.transitionSlow};
// // display: flex;
// // margin-top: ${props => (props.show ? '6px' : '20px')};
// // opacity: ${props => (props.show ? 1 : 0)};
// // transform: translateX(calc(-50% + 20px));
// // pointer-events: ${props => (props.show ? 'all' : 'none')};
// // z-index: 1000;
// // .save-export-dropdown__inner {
// // box-shadow: none;
// // background-color: transparent;
// // display: flex;
// // }
// // .save-export-dropdown__item {
// // align-items: center;
// // border-right: 1px solid ${props => props.theme.panelHeaderIcon};
// // color: ${props => props.theme.textColor};
// // display: flex;
// // flex-direction: column;
// // padding: 0 22px;
// // :hover {
// // cursor: pointer;
// // color: ${props => props.theme.textColorHl};
// // }
// // &:last-child {
// // border-right: 0;
// // }
// // }
// // .save-export-dropdown__title {
// // white-space: nowrap;
// // margin-top: 4px;
// // }
// export const PanelAction = ({item, onClick}) => (
// <StyledPanelAction
// className="side-panel__panel-header__action"
// data-tip
// data-for={`${item.id}-action`}
// onClick={onClick}
// >
// {item.label ? <p>{item.label}</p> : null}
// <a target={item.blank ? '_blank' : ''} href={item.href}>
// <item.iconComponent height="20px" />
// </a>
// {item.tooltip ? (
// <Tooltip
// id={`${item.id}-action`}
// place="bottom"
// delayShow={500}
// effect="solid"
// >
// <span>{item.tooltip}</span>
// </Tooltip>
// ) : null}
// </StyledPanelAction>
// );
// // const PanelItem = ({onClose, onClickHandler, label, icon}) => (
// // <div
// // className="save-export-dropdown__item"
// // onClick={e => {
// // e.stopPropagation();
// // onClose();
// // onClickHandler();
// // }}
// // >
// // {icon}
// // <div className="save-export-dropdown__title">{label}</div>
// // </div>
// // );
// // export const ExportImageFactory = () => {
// // const ExportImage = props => <PanelItem {...props} />;
// export const ExportImageFactory = () => {
// const ExportImage = props => <ToolbarItem {...props} />;
// ExportImage.defaultProps = {
// label: 'Export Image',
// icon: <Picture />
// };
// return ExportImage;
// };
// export const ExportDataFactory = () => {
// // const ExportData = props => <PanelItem {...props} />;
// const ExportData = props => <ToolbarItem {...props} />;
// ExportData.defaultProps = {
// label: 'Export Data',
// icon: <Files />
// };
// return ExportData;
// };
// export const ExportMapFactory = () => {
// // const ExportMap = props => <PanelItem {...props} />;
// const ExportMap = props => <ToolbarItem {...props} />;
// ExportMap.defaultProps = {
// label: 'Export Map',
// icon: <Map />
// };
// return ExportMap;
// };
// export const SaveMapFactory = () => {
// // const SaveMap = props => <PanelItem {...props} />;
// const SaveMap = props => <ToolbarItem {...props} />;
// SaveMap.defaultProps = {
// label: 'Save Map',
// icon: <Share />
// };
// return SaveMap;
// };
// SaveExportDropdownFactory.deps = [
// ExportImageFactory,
// ExportDataFactory,
// ExportMapFactory,
// SaveMapFactory
// ];
// export function SaveExportDropdownFactory(
// ExportImage,
// ExportData,
// ExportMap,
// // SaveMap
// // ) => {
// SaveMap
// ) {
// const SaveExportDropdown = ({
// onExportImage,
// onExportData,
// onExportConfig,
// onExportMap,
// onSaveMap,
// show,
// onClose
// }) => {
// return (
// // <StyledPanelDropdown show={show} className="save-export-dropdown">
// // <ClickOutsideCloseDropdown
// // className="save-export-dropdown__inner"
// // show={show}
// // onClose={onClose}
// // >
// // <ExportImage onClickHandler={onExportImage} onClose={onClose} />
// // <ExportData onClickHandler={onExportData} onClose={onClose} />
// // <ExportMap onClickHandler={onExportMap} onClose={onClose} />
// // {onSaveMap ? (
// // <SaveMap onClickHandler={onSaveMap} onClose={onClose} />
// // ) : null}
// <StyledToolbar
// show={show}
// onClose={onClose}
// className="save-export-dropdown"
// >
// <ClickOutsideCloseDropdown
// className="save-export-dropdown__inner"
// show={show}
// onClose={onClose}
// >
// <ExportImage
// className="export-image"
// onClick={() => {
// onExportImage();
// onClose();
// }}
// />
// <ExportData
// className="export-data"
// onClick={() => {
// onExportData();
// onClose();
// }}
// />
// <ExportMap
// className="export-map"
// onClick={() => {
// onExportMap();
// onClose();
// }}
// />
// {onSaveMap ? (
// <SaveMap
// className="save-map"
// onClick={() => {
// onSaveMap();
// onClose();
// }}
// />
// ) : null}
// </ClickOutsideCloseDropdown>
// </StyledToolbar>
// );
// };
// return SaveExportDropdown;
// }
// PanelHeaderFactory.deps = [SaveExportDropdownFactory];
// function PanelHeaderFactory(SaveExportDropdown) {
// return class PanelHeader extends Component {
// static propTypes = {
// appName: PropTypes.string,
// version: PropTypes.string,
// uiState: PropTypes.object,
// uiStateActions: PropTypes.object,
// logoComponent: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
// actionItems: PropTypes.arrayOf(PropTypes.any)
// };
// static defaultProps = {
// logoComponent: KeplerGlLogo,
// actionItems: [
// {
// id: 'save',
// iconComponent: Save,
// onClick: () => {},
// label: 'Share',
// dropdownComponent: SaveExportDropdown
// }
// ]
// };
// render() {
// const {
// appName,
// version,
// actionItems,
// onSaveMap,
// onExportImage,
// onExportData,
// onExportConfig,
// onExportMap,
// visibleDropdown,
// showExportDropdown,
// hideExportDropdown
// } = this.props;
// return (
// <StyledPanelHeader className="side-panel__panel-header">
// <StyledPanelHeaderTop className="side-panel__panel-header__top">
// <this.props.logoComponent appName={appName} version={version} />
// <StyledPanelTopActions>
// {actionItems.map(item => (
// <div
// className="side-panel__panel-header__right"
// key={item.id}
// style={{position: 'relative'}}
// >
// <PanelAction
// item={item}
// onClick={() => {
// if (item.dropdownComponent) {
// showExportDropdown(item.id);
// }
// item.onClick();
// }}
// />
// {item.dropdownComponent ? (
// <item.dropdownComponent
// onClose={hideExportDropdown}
// show={visibleDropdown === item.id}
// onSaveMap={onSaveMap}
// onExportData={onExportData}
// onExportImage={onExportImage}
// onExportConfig={onExportConfig}
// onExportMap={onExportMap}
// />
// ) : null}
// </div>
// ))}
// </StyledPanelTopActions>
// </StyledPanelHeaderTop>
// </StyledPanelHeader>
// );
// }
// };
// }
// export default PanelHeaderFactory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLmpzIl0sIm5hbWVzIjpbIlN0eWxlZFBhbmVsSGVhZGVyIiwic3R5bGVkIiwiZGl2IiwiYXR0cnMiLCJjbGFzc05hbWUiLCJwcm9wcyIsInRoZW1lIiwic2lkZVBhbmVsSGVhZGVyQmciLCJTdHlsZWRQYW5lbEhlYWRlclRvcCIsIlN0eWxlZFBhbmVsVG9wQWN0aW9ucyIsIlN0eWxlZFBhbmVsQWN0aW9uIiwiYWN0aXZlIiwidGV4dENvbG9ySGwiLCJzdWJ0ZXh0Q29sb3IiLCJzZWNvbmRhcnlCdG5BY3RCZ2QiLCJTdHlsZWRQYW5lbERyb3Bkb3duIiwiZHJvcGRvd25MaXN0QmdkIiwiZHJvcGRvd25MaXN0U2hhZG93IiwidHJhbnNpdGlvblNsb3ciLCJzaG93IiwicGFuZWxIZWFkZXJJY29uIiwidGV4dENvbG9yIiwiUGFuZWxBY3Rpb24iLCJpdGVtIiwib25DbGljayIsImlkIiwibGFiZWwiLCJibGFuayIsImhyZWYiLCJ0b29sdGlwIiwiUGFuZWxJdGVtIiwib25DbG9zZSIsIm9uQ2xpY2tIYW5kbGVyIiwiaWNvbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJFeHBvcnRJbWFnZUZhY3RvcnkiLCJFeHBvcnRJbWFnZSIsImRlZmF1bHRQcm9wcyIsIkV4cG9ydERhdGFGYWN0b3J5IiwiRXhwb3J0RGF0YSIsIkV4cG9ydE1hcEZhY3RvcnkiLCJFeHBvcnRNYXAiLCJTYXZlTWFwRmFjdG9yeSIsIlNhdmVNYXAiLCJTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5IiwiU2F2ZUV4cG9ydERyb3Bkb3duIiwib25FeHBvcnRJbWFnZSIsIm9uRXhwb3J0RGF0YSIsIm9uRXhwb3J0Q29uZmlnIiwib25FeHBvcnRNYXAiLCJvblNhdmVNYXAiLCJkZXBzIiwiUGFuZWxIZWFkZXJGYWN0b3J5IiwiYXBwTmFtZSIsInZlcnNpb24iLCJhY3Rpb25JdGVtcyIsInZpc2libGVEcm9wZG93biIsInNob3dFeHBvcnREcm9wZG93biIsImhpZGVFeHBvcnREcm9wZG93biIsIm1hcCIsInBvc2l0aW9uIiwiZHJvcGRvd25Db21wb25lbnQiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJ1aVN0YXRlIiwib2JqZWN0IiwidWlTdGF0ZUFjdGlvbnMiLCJsb2dvQ29tcG9uZW50Iiwib25lT2ZUeXBlIiwiZWxlbWVudCIsImZ1bmMiLCJhcnJheU9mIiwiYW55IiwiS2VwbGVyR2xMb2dvIiwiaWNvbkNvbXBvbmVudCIsIlNhdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGlCQUFpQixHQUFHQyw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxrSkFHRCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGlCQUFoQjtBQUFBLENBSEosQ0FBdkI7O0FBT0EsSUFBTUMsb0JBQW9CLEdBQUdQLDZCQUFPQyxHQUFQLENBQVdDLEtBQVgsQ0FBaUI7QUFDNUNDLEVBQUFBLFNBQVMsRUFBRTtBQURpQyxDQUFqQixDQUFILHVMQUExQjs7QUFTQSxJQUFNSyxxQkFBcUIsR0FBR1IsNkJBQU9DLEdBQVAsQ0FBV0MsS0FBWCxDQUFpQjtBQUM3Q0MsRUFBQUEsU0FBUyxFQUFFO0FBRGtDLENBQWpCLENBQUgsNEdBQTNCOztBQU1BLElBQU1NLGlCQUFpQixHQUFHVCw2QkFBT0MsR0FBUCxDQUFXQyxLQUFYLENBQWlCO0FBQ3pDQyxFQUFBQSxTQUFTLEVBQUU7QUFEOEIsQ0FBakIsQ0FBSCxxZkFLWixVQUFBQyxLQUFLO0FBQUEsU0FDWkEsS0FBSyxDQUFDTSxNQUFOLEdBQWVOLEtBQUssQ0FBQ0MsS0FBTixDQUFZTSxXQUEzQixHQUF5Q1AsS0FBSyxDQUFDQyxLQUFO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QTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7VG9vbHRpcH0gZnJvbSAnY29tcG9uZW50cy9jb21tb24vc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IEtlcGxlckdsTG9nbyBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9sb2dvJztcbmltcG9ydCB7U2F2ZSwgRmlsZXMsIFNoYXJlLCBQaWN0dXJlLCBNYXB9IGZyb20gJ2NvbXBvbmVudHMvY29tbW9uL2ljb25zJztcbmltcG9ydCBDbGlja091dHNpZGVDbG9zZURyb3Bkb3duIGZyb20gJ2NvbXBvbmVudHMvc2lkZS1wYW5lbC9wYW5lbC1kcm9wZG93bic7XG5cbmNvbnN0IFN0eWxlZFBhbmVsSGVhZGVyID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtc2lkZS1wYW5lbF9faGVhZGVyJ1xufSlgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuc2lkZVBhbmVsSGVhZGVyQmd9O1xuICBwYWRkaW5nOiAxMnB4IDE2cHggMCAxNnB4O1xuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxIZWFkZXJUb3AgPSBzdHlsZWQuZGl2LmF0dHJzKHtcbiAgY2xhc3NOYW1lOiAnc2lkZS1wYW5lbF9faGVhZGVyX190b3AnXG59KWBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICB3aWR0aDogMTAwJTtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbmVsVG9wQWN0aW9ucyA9IHN0eWxlZC5kaXYuYXR0cnMoe1xuICBjbGFzc05hbWU6ICdzaWRlLXBhbmVsX19oZWFkZXJfX2FjdGlvbnMnXG59KWBcbiAgZGlzcGxheTogZmxleDtcbmA7XG5cbmNvbnN0IFN0eWxlZFBhbmVsQWN0aW9uID0gc3R5bGVkLmRpdi5hdHRycyh7XG4gIGNsYXNzTmFtZTogJ3NpZGUtcGFuZWxfX2hlYWRlcl9fYWN0aW9ucydcbn0pYFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGNvbG9yOiAke3Byb3BzID0+XG4gICAgcHJvcHMuYWN0aXZlID8gcHJvcHMudGhlbWUudGV4dENvbG9ySGwgOiBwcm9wcy50aGVtZS5zdWJ0ZXh0Q29sb3J9O1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDI2cHg7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgcGFkZGluZzogNXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICB9XG4gIGEge1xuICAgIGhlaWdodDogMjBweDtcbiAgfVxuICA6aG92ZXIge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnNlY29uZGFyeUJ0bkFjdEJnZH07XG4gICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIGEge1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkUGFuZWxEcm9wZG93biA9IHN0eWxlZC5kaXZgXG4gIGJhY2tncm91bmQtY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuZHJvcGRvd25MaXN0QmdkfTtcbiAgYm94LXNoYWRvdzogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5kcm9wZG93bkxpc3RTaGFkb3d9O1xuICBmb250LXNpemU6IDExcHg7XG4gIHBhZGRpbmc6IDE2cHggMDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiA2NHB4O1xuICB0cmFuc2l0aW9uOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRyYW5zaXRpb25TbG93fTtcbiAgZGlzcGxheTogZmxleDtcbiAgbWFyZ2luLXRvcDogJHtwcm9wcyA9PiAocHJvcHMuc2hvdyA/ICc2cHgnIDogJzIwcHgnKX07XG4gIG9wYWNpdHk6ICR7cHJvcHMgPT4gKHByb3BzLnNob3cgPyAxIDogMCl9O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoY2FsYygtNTAlICsgMjBweCkpO1xuICBwb2ludGVyLWV2ZW50czogJHtwcm9wcyA9PiAocHJvcHMuc2hvdyA/ICdhbGwnIDogJ25vbmUnKX07XG4gIHotaW5kZXg6IDEwMDA7XG4gIC5zYXZlLWV4cG9ydC1kcm9wZG93bl9faW5uZXIge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuICAuc2F2ZS1leHBvcnQtZHJvcGRvd25fX2l0ZW0ge1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEhlYWRlckljb259O1xuICAgIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLnRleHRDb2xvcn07XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIHBhZGRpbmc6IDAgMjJweDtcbiAgICA6aG92ZXIge1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgY29sb3I6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUudGV4dENvbG9ySGx9O1xuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgYm9yZGVyLXJpZ2h0OiAwO1xuICAgIH1cbiAgfVxuICAuc2F2ZS1leHBvcnQtZHJvcGRvd25fX3RpdGxlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgfVxuYDtcblxuZXhwb3J0IGNvbnN0IFBhbmVsQWN0aW9uID0gKHtpdGVtLCBvbkNsaWNrfSkgPT4gKFxuICA8U3R5bGVkUGFuZWxBY3Rpb25cbiAgICBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJfX2FjdGlvblwiXG4gICAgZGF0YS10aXBcbiAgICBkYXRhLWZvcj17YCR7aXRlbS5pZH0tYWN0aW9uYH1cbiAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICA+XG4gICAge2l0ZW0ubGFiZWwgPyA8cD57aXRlbS5sYWJlbH08L3A+IDogbnVsbH1cbiAgICA8YSB0YXJnZXQ9e2l0ZW0uYmxhbmsgPyAnX2JsYW5rJyA6ICcnfSBocmVmPXtpdGVtLmhyZWZ9PlxuICAgICAgPGl0ZW0uaWNvbkNvbXBvbmVudCBoZWlnaHQ9XCIyMHB4XCIgLz5cbiAgICA8L2E+XG4gICAge2l0ZW0udG9vbHRpcCA/IChcbiAgICAgIDxUb29sdGlwXG4gICAgICAgIGlkPXtgJHtpdGVtLmlkfS1hY3Rpb25gfVxuICAgICAgICBwbGFjZT1cImJvdHRvbVwiXG4gICAgICAgIGRlbGF5U2hvdz17NTAwfVxuICAgICAgICBlZmZlY3Q9XCJzb2xpZFwiXG4gICAgICA+XG4gICAgICAgIDxzcGFuPntpdGVtLnRvb2x0aXB9PC9zcGFuPlxuICAgICAgPC9Ub29sdGlwPlxuICAgICkgOiBudWxsfVxuICA8L1N0eWxlZFBhbmVsQWN0aW9uPlxuKTtcblxuY29uc3QgUGFuZWxJdGVtID0gKHtvbkNsb3NlLCBvbkNsaWNrSGFuZGxlciwgbGFiZWwsIGljb259KSA9PiAoXG4gIDxkaXZcbiAgICBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9faXRlbVwiXG4gICAgb25DbGljaz17ZSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgb25DbG9zZSgpO1xuICAgICAgb25DbGlja0hhbmRsZXIoKTtcbiAgICB9fVxuICA+XG4gICAge2ljb259XG4gICAgPGRpdiBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9fdGl0bGVcIj57bGFiZWx9PC9kaXY+XG4gIDwvZGl2PlxuKTtcblxuZXhwb3J0IGNvbnN0IEV4cG9ydEltYWdlRmFjdG9yeSA9ICgpID0+IHtcbiAgY29uc3QgRXhwb3J0SW1hZ2UgPSBwcm9wcyA9PiA8UGFuZWxJdGVtIHsuLi5wcm9wc30gLz47XG4gIEV4cG9ydEltYWdlLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ0V4cG9ydCBJbWFnZScsXG4gICAgaWNvbjogPFBpY3R1cmUgLz5cbiAgfTtcblxuICByZXR1cm4gRXhwb3J0SW1hZ2U7XG59O1xuXG5leHBvcnQgY29uc3QgRXhwb3J0RGF0YUZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IEV4cG9ydERhdGEgPSBwcm9wcyA9PiA8UGFuZWxJdGVtIHsuLi5wcm9wc30gLz47XG4gIEV4cG9ydERhdGEuZGVmYXVsdFByb3BzID0ge1xuICAgIGxhYmVsOiAnRXhwb3J0IERhdGEnLFxuICAgIGljb246IDxGaWxlcyAvPlxuICB9O1xuXG4gIHJldHVybiBFeHBvcnREYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IEV4cG9ydE1hcEZhY3RvcnkgPSAoKSA9PiB7XG4gIGNvbnN0IEV4cG9ydE1hcCA9IHByb3BzID0+IDxQYW5lbEl0ZW0gey4uLnByb3BzfSAvPjtcbiAgRXhwb3J0TWFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ0V4cG9ydCBNYXAnLFxuICAgIGljb246IDxNYXAgLz5cbiAgfTtcblxuICByZXR1cm4gRXhwb3J0TWFwO1xufTtcblxuZXhwb3J0IGNvbnN0IFNhdmVNYXBGYWN0b3J5ID0gKCkgPT4ge1xuICBjb25zdCBTYXZlTWFwID0gcHJvcHMgPT4gPFBhbmVsSXRlbSB7Li4ucHJvcHN9IC8+O1xuICBTYXZlTWFwLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBsYWJlbDogJ1NhdmUgTWFwJyxcbiAgICBpY29uOiA8U2hhcmUgLz5cbiAgfTtcblxuICByZXR1cm4gU2F2ZU1hcDtcbn07XG5cbmV4cG9ydCBjb25zdCBTYXZlRXhwb3J0RHJvcGRvd25GYWN0b3J5ID0gKFxuICBFeHBvcnRJbWFnZSxcbiAgRXhwb3J0RGF0YSxcbiAgRXhwb3J0TWFwLFxuICBTYXZlTWFwXG4pID0+IHtcbiAgY29uc3QgU2F2ZUV4cG9ydERyb3Bkb3duID0gKHtcbiAgICBvbkV4cG9ydEltYWdlLFxuICAgIG9uRXhwb3J0RGF0YSxcbiAgICBvbkV4cG9ydENvbmZpZyxcbiAgICBvbkV4cG9ydE1hcCxcbiAgICBvblNhdmVNYXAsXG4gICAgc2hvdyxcbiAgICBvbkNsb3NlXG4gIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPFN0eWxlZFBhbmVsRHJvcGRvd24gc2hvdz17c2hvd30gY2xhc3NOYW1lPVwic2F2ZS1leHBvcnQtZHJvcGRvd25cIj5cbiAgICAgICAgPENsaWNrT3V0c2lkZUNsb3NlRHJvcGRvd25cbiAgICAgICAgICBjbGFzc05hbWU9XCJzYXZlLWV4cG9ydC1kcm9wZG93bl9faW5uZXJcIlxuICAgICAgICAgIHNob3c9e3Nob3d9XG4gICAgICAgICAgb25DbG9zZT17b25DbG9zZX1cbiAgICAgICAgPlxuICAgICAgICAgIDxFeHBvcnRJbWFnZSBvbkNsaWNrSGFuZGxlcj17b25FeHBvcnRJbWFnZX0gb25DbG9zZT17b25DbG9zZX0gLz5cbiAgICAgICAgICA8RXhwb3J0RGF0YSBvbkNsaWNrSGFuZGxlcj17b25FeHBvcnREYXRhfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgIDxFeHBvcnRNYXAgb25DbGlja0hhbmRsZXI9e29uRXhwb3J0TWFwfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgIHtvblNhdmVNYXAgPyAoXG4gICAgICAgICAgICA8U2F2ZU1hcCBvbkNsaWNrSGFuZGxlcj17b25TYXZlTWFwfSBvbkNsb3NlPXtvbkNsb3NlfSAvPlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L0NsaWNrT3V0c2lkZUNsb3NlRHJvcGRvd24+XG4gICAgICA8L1N0eWxlZFBhbmVsRHJvcGRvd24+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU2F2ZUV4cG9ydERyb3Bkb3duO1xufTtcblxuU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeS5kZXBzID0gW1xuICBFeHBvcnRJbWFnZUZhY3RvcnksXG4gIEV4cG9ydERhdGFGYWN0b3J5LFxuICBFeHBvcnRNYXBGYWN0b3J5LFxuICBTYXZlTWFwRmFjdG9yeVxuXTtcblxuUGFuZWxIZWFkZXJGYWN0b3J5LmRlcHMgPSBbU2F2ZUV4cG9ydERyb3Bkb3duRmFjdG9yeV07XG5cbmZ1bmN0aW9uIFBhbmVsSGVhZGVyRmFjdG9yeShTYXZlRXhwb3J0RHJvcGRvd24pIHtcbiAgcmV0dXJuIGNsYXNzIFBhbmVsSGVhZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgYXBwTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHZlcnNpb246IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICB1aVN0YXRlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgdWlTdGF0ZUFjdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBsb2dvQ29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZWxlbWVudCwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgICAgIGFjdGlvbkl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuYW55KVxuICAgIH07XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgbG9nb0NvbXBvbmVudDogS2VwbGVyR2xMb2dvLFxuICAgICAgYWN0aW9uSXRlbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnc2F2ZScsXG4gICAgICAgICAgaWNvbkNvbXBvbmVudDogU2F2ZSxcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICAgICAgICBsYWJlbDogJ1NoYXJlJyxcbiAgICAgICAgICBkcm9wZG93bkNvbXBvbmVudDogU2F2ZUV4cG9ydERyb3Bkb3duXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgcmVuZGVyKCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBhcHBOYW1lLFxuICAgICAgICB2ZXJzaW9uLFxuICAgICAgICBhY3Rpb25JdGVtcyxcbiAgICAgICAgb25TYXZlTWFwLFxuICAgICAgICBvbkV4cG9ydEltYWdlLFxuICAgICAgICBvbkV4cG9ydERhdGEsXG4gICAgICAgIG9uRXhwb3J0Q29uZmlnLFxuICAgICAgICBvbkV4cG9ydE1hcCxcbiAgICAgICAgdmlzaWJsZURyb3Bkb3duLFxuICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24sXG4gICAgICAgIGhpZGVFeHBvcnREcm9wZG93blxuICAgICAgfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxTdHlsZWRQYW5lbEhlYWRlciBjbGFzc05hbWU9XCJzaWRlLXBhbmVsX19wYW5lbC1oZWFkZXJcIj5cbiAgICAgICAgICA8U3R5bGVkUGFuZWxIZWFkZXJUb3AgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX190b3BcIj5cbiAgICAgICAgICAgIDx0aGlzLnByb3BzLmxvZ29Db21wb25lbnQgYXBwTmFtZT17YXBwTmFtZX0gdmVyc2lvbj17dmVyc2lvbn0gLz5cbiAgICAgICAgICAgIDxTdHlsZWRQYW5lbFRvcEFjdGlvbnM+XG4gICAgICAgICAgICAgIHthY3Rpb25JdGVtcy5tYXAoaXRlbSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwic2lkZS1wYW5lbF9fcGFuZWwtaGVhZGVyX19yaWdodFwiXG4gICAgICAgICAgICAgICAgICBrZXk9e2l0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICBzdHlsZT17e3Bvc2l0aW9uOiAncmVsYXRpdmUnfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8UGFuZWxBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgaXRlbT17aXRlbX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmRyb3Bkb3duQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93RXhwb3J0RHJvcGRvd24oaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub25DbGljaygpO1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIHtpdGVtLmRyb3Bkb3duQ29tcG9uZW50ID8gKFxuICAgICAgICAgICAgICAgICAgICA8aXRlbS5kcm9wZG93bkNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U9e2hpZGVFeHBvcnREcm9wZG93bn1cbiAgICAgICAgICAgICAgICAgICAgICBzaG93PXt2aXNpYmxlRHJvcGRvd24gPT09IGl0ZW0uaWR9XG4gICAgICAgICAgICAgICAgICAgICAgb25TYXZlTWFwPXtvblNhdmVNYXB9XG4gICAgICAgICAgICAgICAgICAgICAgb25FeHBvcnREYXRhPXtvbkV4cG9ydERhdGF9XG4gICAgICAgICAgICAgICAgICAgICAgb25FeHBvcnRJbWFnZT17b25FeHBvcnRJbWFnZX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkV4cG9ydENvbmZpZz17b25FeHB