UNPKG

kepler.gl.geoiq

Version:

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

422 lines (361 loc) 51 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; 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 = _interopRequireWildcard(require("prop-types")); var _reselect = require("reselect"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _lodash = _interopRequireDefault(require("lodash.get")); var _panelHeaderAction = _interopRequireDefault(require("../panel-header-action")); var _fieldSelector = _interopRequireDefault(require("../../common/field-selector")); var _icons = require("../../common/icons"); var _sourceDataSelector = _interopRequireDefault(require("../common/source-data-selector")); var _styledComponents2 = require("../../common/styled-components"); var _filterPanelHeader = _interopRequireDefault(require("./filter-panel-header")); var _newFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/new-filter-panel")); var _timeRangeFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/time-range-filter-panel")); var _singleSelectFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/single-select-filter-panel")); var _multiSelectFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/multi-select-filter-panel")); var _rangeFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/range-filter-panel")); var _polygonFilterPanel = _interopRequireDefault(require("../../filters/filter-panels/polygon-filter-panel")); var _filterUtils = require("../../../utils/filter-utils"); var _defaultSettings = require("../../../constants/default-settings"); var _axios = _interopRequireDefault(require("axios")); var _d3Array = require("d3-array"); var _templateObject, _templateObject2, _templateObject3; 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 StyledFilterPanel = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n margin-bottom: 12px;\n border-radius: 1px;\n .filter-panel__filter {\n margin-top: 24px;\n }\n"]))); var StyledFilterHeader = (0, _styledComponents["default"])(_styledComponents2.StyledPanelHeader)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n cursor: pointer;\n padding: 10px 12px;\n .field-selector {\n width: calc(100% - 58px);\n }\n"]))); var StyledFilterContent = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n background-color: ", ";\n padding: 12px;\n"])), function (props) { return props.theme.panelBackground; }); FilterPanelFactory.deps = [_newFilterPanel["default"], _timeRangeFilterPanel["default"], _singleSelectFilterPanel["default"], _multiSelectFilterPanel["default"], _rangeFilterPanel["default"], _polygonFilterPanel["default"]]; function FilterPanelFactory(NewFilterPanel, TimeRangeFilterPanel, SingleSelectFilterPanel, MultiSelectFilterPanel, RangeFilterPanel, PolygonFilterPanel) { var _FilterPanelComponent, _class, _temp; var FilterPanelComponents = (_FilterPanelComponent = { "default": NewFilterPanel }, (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.timeRange, TimeRangeFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.select, SingleSelectFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.multiSelect, MultiSelectFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.range, RangeFilterPanel), (0, _defineProperty2["default"])(_FilterPanelComponent, _filterUtils.FILTER_TYPES.polygon, PolygonFilterPanel), _FilterPanelComponent); return _temp = _class = /*#__PURE__*/function (_Component) { (0, _inherits2["default"])(FilterPanel, _Component); var _super = _createSuper(FilterPanel); function FilterPanel() { var _this; (0, _classCallCheck2["default"])(this, FilterPanel); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); /* selectors */ // fieldsSelector = props => // (props.filter.dataId && props.datasets[props.filter.dataId].fields) || []; (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "fieldsSelector", function (props) { var datasetId = props.filter.dataId[0]; if (!datasetId) { return []; } return (0, _lodash["default"])(props, ['datasets', datasetId, 'fields'], []); }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "filterSelector", function (props) { return props.filters; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "nameSelector", function (props) { return props.filter.name; }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dataIdSelector", function (props) { return props.filter.dataId[0]; }); // only show current field and field that's not already been used as a filter (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "availableFieldsSelector", (0, _reselect.createSelector)(_this.fieldsSelector, _this.filterSelector, _this.nameSelector, _this.dataIdSelector, function (fields, filters, name, dataId) { return fields.filter(function (f) { return f.type && f.type !== _defaultSettings.ALL_FIELD_TYPES.geojson && (f.name[0] === name[0] || !filters.find(function (d) { return d.name[0] === f.name && d.dataId[0] === dataId; })); }); })); return _this; } (0, _createClass2["default"])(FilterPanel, [{ key: "filterApi", value: function filterApi(idx, value, dataId, datasets, auth, project, setFilterAPI) { var fieldName = value.name; var _datasets$dataId = datasets[dataId], fields = _datasets$dataId.fields, indexName = _datasets$dataId.indexName; var fieldIdx = fields.findIndex(function (f) { return f.name === fieldName; }); var fieldType = fieldName && fields[fieldIdx].type === 'string' ? 'string' : fieldName && fields[fieldIdx].type === 'integer' || fields[fieldIdx].type === 'real' ? 'numeric' : 'datetime'; // const userId = 'uid'; var uid = auth.uid; var isEdit = project.isEdit; // const {setFilterAPI} = this.props; // if fieldType is string inside filter then send string else send numeric var filterAPIData = { fieldName: fieldName, userId: uid, permissionType: isEdit, fieldType: fieldType, indexName: indexName }; var config = { headers: { 'Content-Type': 'application/json' } }; _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/filter/v1.0/fetch"), filterAPIData, config).then(function (result) { var domain; var histogram; var data = result.data.data; // this is written for real and integer fields var domainKeys = Object.keys(data); if (fieldType !== 'string') { histogram = domainKeys.reduce(function (accu, range) { var count = data[range]; var bin = { count: count, x0: Number(range.split('&&')[0]), x1: Number(range.split('&&')[1]) }; accu.push(bin); return accu; }, []); histogram = histogram.sort(function (a, b) { return a.x1 - b.x1; }); domain = [histogram[0].x0, histogram[histogram.length - 1].x1]; } else { domain = domainKeys; } // write data conversion to domain for string type fields setFilterAPI(idx, 'name', value.name, 0, dataId, domain, histogram); }); } }, { key: "render", value: function render() { var _this$props = this.props, filter = _this$props.filter, setFilterAPI = _this$props.setFilterAPI; var type = filter.type, dataId = filter.dataId; var FilterFilterComponent = type && FilterPanelComponents[type] || FilterPanelComponents["default"]; var allAvailableFields = this.availableFieldsSelector(this.props); return (/*#__PURE__*/_react["default"].createElement(StyledFilterPanel, { className: "filter-panel" }, /*#__PURE__*/_react["default"].createElement(FilterFilterComponent, (0, _extends2["default"])({ allAvailableFields: allAvailableFields, dataId: dataId, filterApi: this.filterApi, setFilterAPI: setFilterAPI }, this.props))) ); } }]); return FilterPanel; }(_react.Component), (0, _defineProperty2["default"])(_class, "propTypes", { idx: _propTypes["default"].number, filters: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, filter: _propTypes["default"].object.isRequired, layers: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, setFilter: _propTypes["default"].func.isRequired, removeFilter: _propTypes["default"].func.isRequired, enlargeFilter: _propTypes["default"].func.isRequired, toggleAnimation: _propTypes["default"].func.isRequired, datasets: _propTypes["default"].object, showDatasetTable: _propTypes["default"].func, isAnyFilterAnimating: _propTypes["default"].bool, mapState: _propTypes["default"].object, auth: _propTypes["default"].object.isRequired, project: _propTypes["default"].object.isRequired }), _temp; // render() { // const { // datasets, // enlargeFilter, // filter, // idx, // isAnyFilterAnimating, // removeFilter, // setFilter, // toggleAnimation, // mapState, // auth, // project // } = this.props; // const {name, enlarged, type, dataId} = filter; // const FilterComponent = type && FilterComponents[FILTER_COMPONENTS[type]]; // const allAvailableFields = this.availableFieldsSelector(this.props); // return ( // <StyledFilterPanel className="filter-panel"> // <StyledFilterHeader // className="filter-panel__header" // labelRCGColorValues={datasets[dataId].color} // > // <FieldSelector // inputTheme="secondary" // fields={allAvailableFields} // value={Array.isArray(name) ? name[0] : name} // erasable={false} // onSelect={value => // this.filterApi(idx, value, dataId, datasets, auth, project) // } // /> // <PanelHeaderAction // id={filter.id} // tooltip="delete" // tooltipType="error" // onClick={removeFilter} // hoverColor={'errorColor'} // IconComponent={Trash} // /> // {type === FILTER_TYPES.timeRange && ( // <PanelHeaderAction // id={filter.id} // onClick={enlargeFilter} // tooltip="Time Playback" // IconComponent={Clock} // active={enlarged} // /> // )} // </StyledFilterHeader> // <StyledFilterContent className="filter-panel__content"> // {Object.keys(datasets).length > 1 && ( // <SourceDataSelector // inputTheme="secondary" // datasets={datasets} // disabled={filter.freeze} // dataId={filter.dataId} // onSelect={value => setFilter(idx, 'dataId', value)} // /> // )} // {type && !enlarged && ( // <div className="filter-panel__filter"> // <FilterComponent // filter={filter} // idx={idx} // isAnyFilterAnimating={isAnyFilterAnimating} // toggleAnimation={toggleAnimation} // setFilter={value => // setFilter(idx, 'value', value, 0, mapState, auth, project) // } // /> // </div> // )} // </StyledFilterContent> // </StyledFilterPanel> // ); // } // }; } var _default = exports["default"] = FilterPanelFactory; // import React, { Component } from "react"; // import PropTypes from "prop-types"; // import { createSelector } from "reselect"; // import styled from "styled-components"; // import { FILTER_TYPES } from "utils/filter-utils"; // import { ALL_FIELD_TYPES } from "constants/default-settings"; // import FilterPanelHeaderFactory from "components/side-panel/filter-panel/filter-panel-header"; // import NewFilterPanelFactory from "components/filters/filter-panels/new-filter-panel"; // import TimeRangeFilterPanelFactory from "components/filters/filter-panels/time-range-filter-panel"; // import SingleSelectFilterPanelFactory from "components/filters/filter-panels/single-select-filter-panel"; // import MultiSelectFilterPanelFactory from "components/filters/filter-panels/multi-select-filter-panel"; // import RangeFilterPanelFactory from "components/filters/filter-panels/range-filter-panel"; // import PolygonFilterPanelFactory from "components/filters/filter-panels/polygon-filter-panel"; // const StyledFilterPanel = styled.div` // margin-bottom: 12px; // border-radius: 1px; // .filter-panel__filter { // margin-top: 24px; // } // `; // FilterPanelFactory.deps = [ // FilterPanelHeaderFactory, // NewFilterPanelFactory, // TimeRangeFilterPanelFactory, // SingleSelectFilterPanelFactory, // MultiSelectFilterPanelFactory, // RangeFilterPanelFactory, // PolygonFilterPanelFactory // ]; // function FilterPanelFactory( // FilterPanelHeader, // NewFilterPanel, // TimeRangeFilterPanel, // SingleSelectFilterPanel, // MultiSelectFilterPanel, // RangeFilterPanel, // PolygonFilterPanel // ) { // const FilterPanelComponents = { // default: NewFilterPanel, // [FILTER_TYPES.timeRange]: TimeRangeFilterPanel, // [FILTER_TYPES.select]: SingleSelectFilterPanel, // [FILTER_TYPES.multiSelect]: MultiSelectFilterPanel, // [FILTER_TYPES.range]: RangeFilterPanel, // [FILTER_TYPES.polygon]: PolygonFilterPanel // }; // return class FilterPanel extends Component { // static propTypes = { // idx: PropTypes.number, // filters: PropTypes.arrayOf(PropTypes.any).isRequired, // filter: PropTypes.object.isRequired, // setFilter: PropTypes.func.isRequired, // removeFilter: PropTypes.func.isRequired, // enlargeFilter: PropTypes.func.isRequired, // toggleAnimation: PropTypes.func.isRequired, // datasets: PropTypes.object, // showDatasetTable: PropTypes.func, // isAnyFilterAnimating: PropTypes.bool // }; // /* selectors */ // fieldsSelector = props => // (props.filter.dataId[0] && // props.datasets[props.filter.dataId[0]].fields) || // []; // filterSelector = props => props.filters; // nameSelector = props => props.filter.name; // dataIdSelector = props => props.filter.dataId[0]; // // only show current field and field that's not already been used as a filter // availableFieldsSelector = createSelector( // this.fieldsSelector, // this.filterSelector, // this.nameSelector, // this.dataIdSelector, // (fields, filters, name, dataId) => // fields.filter( // f => // f.type && // f.type !== ALL_FIELD_TYPES.geojson && // (f.name === name || // !filters.find(d => d.name === f.name && d.dataId === dataId)) // ) // ); // render() { // const { filter } = this.props; // const { type } = filter; // const FilterFilterComponent = // (type && FilterPanelComponents[type]) || FilterPanelComponents.default; // const allAvailableFields = this.availableFieldsSelector(this.props); // return ( // <StyledFilterPanel className="filter-panel"> // <FilterFilterComponent // allAvailableFields={allAvailableFields} // {...this.props} // /> // </StyledFilterPanel> // ); // } // }; // } // export default FilterPanelFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NpZGUtcGFuZWwvZmlsdGVyLXBhbmVsL2ZpbHRlci1wYW5lbC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRGaWx0ZXJQYW5lbCIsInN0eWxlZCIsImRpdiIsIlN0eWxlZEZpbHRlckhlYWRlciIsIlN0eWxlZFBhbmVsSGVhZGVyIiwiU3R5bGVkRmlsdGVyQ29udGVudCIsInByb3BzIiwidGhlbWUiLCJwYW5lbEJhY2tncm91bmQiLCJGaWx0ZXJQYW5lbEZhY3RvcnkiLCJkZXBzIiwiTmV3RmlsdGVyUGFuZWxGYWN0b3J5IiwiVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IiwiU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IiwiTXVsdGlTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnkiLCJSYW5nZUZpbHRlclBhbmVsRmFjdG9yeSIsIlBvbHlnb25GaWx0ZXJQYW5lbEZhY3RvcnkiLCJOZXdGaWx0ZXJQYW5lbCIsIlRpbWVSYW5nZUZpbHRlclBhbmVsIiwiU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWwiLCJNdWx0aVNlbGVjdEZpbHRlclBhbmVsIiwiUmFuZ2VGaWx0ZXJQYW5lbCIsIlBvbHlnb25GaWx0ZXJQYW5lbCIsIkZpbHRlclBhbmVsQ29tcG9uZW50cyIsIkZJTFRFUl9UWVBFUyIsInRpbWVSYW5nZSIsInNlbGVjdCIsIm11bHRpU2VsZWN0IiwicmFuZ2UiLCJwb2x5Z29uIiwiZGF0YXNldElkIiwiZmlsdGVyIiwiZGF0YUlkIiwiZmlsdGVycyIsIm5hbWUiLCJmaWVsZHNTZWxlY3RvciIsImZpbHRlclNlbGVjdG9yIiwibmFtZVNlbGVjdG9yIiwiZGF0YUlkU2VsZWN0b3IiLCJmaWVsZHMiLCJmIiwidHlwZSIsIkFMTF9GSUVMRF9UWVBFUyIsImdlb2pzb24iLCJmaW5kIiwiZCIsImlkeCIsInZhbHVlIiwiZGF0YXNldHMiLCJhdXRoIiwicHJvamVjdCIsInNldEZpbHRlckFQSSIsImZpZWxkTmFtZSIsImluZGV4TmFtZSIsImZpZWxkSWR4IiwiZmluZEluZGV4IiwiZmllbGRUeXBlIiwidWlkIiwiaXNFZGl0IiwiZmlsdGVyQVBJRGF0YSIsInVzZXJJZCIsInBlcm1pc3Npb25UeXBlIiwiY29uZmlnIiwiaGVhZGVycyIsImF4aW9zIiwicG9zdCIsIk9OX1BSRU1FU0lTX1VSTCIsInRoZW4iLCJyZXN1bHQiLCJkb21haW4iLCJoaXN0b2dyYW0iLCJkYXRhIiwiZG9tYWluS2V5cyIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2N1IiwiY291bnQiLCJiaW4iLCJ4MCIsIk51bWJlciIsInNwbGl0IiwieDEiLCJwdXNoIiwic29ydCIsImEiLCJiIiwibGVuZ3RoIiwiRmlsdGVyRmlsdGVyQ29tcG9uZW50IiwiYWxsQXZhaWxhYmxlRmllbGRzIiwiYXZhaWxhYmxlRmllbGRzU2VsZWN0b3IiLCJmaWx0ZXJBcGkiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJudW1iZXIiLCJhcnJheU9mIiwiYW55IiwiaXNSZXF1aXJlZCIsIm9iamVjdCIsImxheWVycyIsInNldEZpbHRlciIsImZ1bmMiLCJyZW1vdmVGaWx0ZXIiLCJlbmxhcmdlRmlsdGVyIiwidG9nZ2xlQW5pbWF0aW9uIiwic2hvd0RhdGFzZXRUYWJsZSIsImlzQW55RmlsdGVyQW5pbWF0aW5nIiwiYm9vbCIsIm1hcFN0YXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsaUJBQWlCLEdBQUdDLDZCQUFPQyxHQUFWLDhMQUF2Qjs7QUFRQSxJQUFNQyxrQkFBa0IsR0FBRyxrQ0FBT0Msb0NBQVAsQ0FBSCw4TEFBeEI7O0FBUUEsSUFBTUMsbUJBQW1CLEdBQUdKLDZCQUFPQyxHQUFWLHdJQUNILFVBQUFJLEtBQUs7QUFBQSxTQUFJQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUMsZUFBaEI7QUFBQSxDQURGLENBQXpCOztBQUtBQyxrQkFBa0IsQ0FBQ0MsSUFBbkIsR0FBMEIsQ0FDeEJDLDBCQUR3QixFQUV4QkMsZ0NBRndCLEVBR3hCQyxtQ0FId0IsRUFJeEJDLGtDQUp3QixFQUt4QkMsNEJBTHdCLEVBTXhCQyw4QkFOd0IsQ0FBMUI7O0FBU0EsU0FBU1Asa0JBQVQsQ0FDRVEsY0FERixFQUVFQyxvQkFGRixFQUdFQyx1QkFIRixFQUlFQyxzQkFKRixFQUtFQyxnQkFMRixFQU1FQyxrQkFORixFQU9FO0FBQUE7O0FBQ0EsTUFBTUMscUJBQXFCO0FBQ3pCLGVBQVNOO0FBRGdCLDZEQUV4Qk8sMEJBQWFDLFNBRlcsRUFFQ1Asb0JBRkQsMkRBR3hCTSwwQkFBYUUsTUFIVyxFQUdGUCx1QkFIRSwyREFJeEJLLDBCQUFhRyxXQUpXLEVBSUdQLHNCQUpILDJEQUt4QkksMEJBQWFJLEtBTFcsRUFLSFAsZ0JBTEcsMkRBTXhCRywwQkFBYUssT0FOVyxFQU1EUCxrQkFOQyx5QkFBM0I7QUFTQTtBQUFBOztBQUFBOztBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQWtCRTtBQUNBO0FBQ0E7QUFwQkYseUdBcUJtQixVQUFBaEIsS0FBSyxFQUFJO0FBQ3hCLFlBQU13QixTQUFTLEdBQUd4QixLQUFLLENBQUN5QixNQUFOLENBQWFDLE1BQWIsQ0FBb0IsQ0FBcEIsQ0FBbEI7O0FBQ0EsWUFBSSxDQUFDRixTQUFMLEVBQWdCO0FBQ2QsaUJBQU8sRUFBUDtBQUNEOztBQUNELGVBQU8sd0JBQUl4QixLQUFKLEVBQVcsQ0FBQyxVQUFELEVBQWF3QixTQUFiLEVBQXdCLFFBQXhCLENBQVgsRUFBOEMsRUFBOUMsQ0FBUDtBQUNELE9BM0JIO0FBQUEseUdBNEJtQixVQUFBeEIsS0FBSztBQUFBLGVBQUlBLEtBQUssQ0FBQzJCLE9BQVY7QUFBQSxPQTVCeEI7QUFBQSx1R0E2QmlCLFVBQUEzQixLQUFLO0FBQUEsZUFBSUEsS0FBSyxDQUFDeUIsTUFBTixDQUFhRyxJQUFqQjtBQUFBLE9BN0J0QjtBQUFBLHlHQThCbUIsVUFBQTVCLEtBQUs7QUFBQSxlQUFJQSxLQUFLLENBQUN5QixNQUFOLENBQWFDLE1BQWIsQ0FBb0IsQ0FBcEIsQ0FBSjtBQUFBLE9BOUJ4QjtBQWdDRTtBQWhDRixrSEFpQzRCLDhCQUN4QixNQUFLRyxjQURtQixFQUV4QixNQUFLQyxjQUZtQixFQUd4QixNQUFLQyxZQUhtQixFQUl4QixNQUFLQyxjQUptQixFQUt4QixVQUFDQyxNQUFELEVBQVNOLE9BQVQsRUFBa0JDLElBQWxCLEVBQXdCRixNQUF4QjtBQUFBLGVBQ0VPLE1BQU0sQ0FBQ1IsTUFBUCxDQUNFLFVBQUFTLENBQUM7QUFBQSxpQkFDQ0EsQ0FBQyxDQUFDQyxJQUFGLElBQ0FELENBQUMsQ0FBQ0MsSUFBRixLQUFXQyxpQ0FBZ0JDLE9BRDNCLEtBRUNILENBQUMsQ0FBQ04sSUFBRixDQUFPLENBQVAsTUFBY0EsSUFBSSxDQUFDLENBQUQsQ0FBbEIsSUFDQyxDQUFDRCxPQUFPLENBQUNXLElBQVIsQ0FDQyxVQUFBQyxDQUFDO0FBQUEsbUJBQUlBLENBQUMsQ0FBQ1gsSUFBRixDQUFPLENBQVAsTUFBY00sQ0FBQyxDQUFDTixJQUFoQixJQUF3QlcsQ0FBQyxDQUFDYixNQUFGLENBQVMsQ0FBVCxNQUFnQkEsTUFBNUM7QUFBQSxXQURGLENBSEgsQ0FERDtBQUFBLFNBREgsQ0FERjtBQUFBLE9BTHdCLENBakM1QjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBLGFBa0RFLG1CQUFVYyxHQUFWLEVBQWVDLEtBQWYsRUFBc0JmLE1BQXRCLEVBQThCZ0IsUUFBOUIsRUFBd0NDLElBQXhDLEVBQThDQyxPQUE5QyxFQUF1REMsWUFBdkQsRUFBcUU7QUFDbkUsWUFBTUMsU0FBUyxHQUFHTCxLQUFLLENBQUNiLElBQXhCO0FBQ0EsK0JBQTBCYyxRQUFRLENBQUNoQixNQUFELENBQWxDO0FBQUEsWUFBS08sTUFBTCxvQkFBS0EsTUFBTDtBQUFBLFlBQWFjLFNBQWIsb0JBQWFBLFNBQWI7QUFDQSxZQUFNQyxRQUFRLEdBQUdmLE1BQU0sQ0FBQ2dCLFNBQVAsQ0FBaUIsVUFBQWYsQ0FBQztBQUFBLGlCQUFJQSxDQUFDLENBQUNOLElBQUYsS0FBV2tCLFNBQWY7QUFBQSxTQUFsQixDQUFqQjtBQUNBLFlBQU1JLFNBQVMsR0FDYkosU0FBUyxJQUFJYixNQUFNLENBQUNlLFFBQUQsQ0FBTixDQUFpQmIsSUFBakIsS0FBMEIsUUFBdkMsR0FDSSxRQURKLEdBRUtXLFNBQVMsSUFBSWIsTUFBTSxDQUFDZSxRQUFELENBQU4sQ0FBaUJiLElBQWpCLEtBQTBCLFNBQXhDLElBQ0FGLE1BQU0sQ0FBQ2UsUUFBRCxDQUFOLENBQWlCYixJQUFqQixLQUEwQixNQUQxQixHQUVBLFNBRkEsR0FHQSxVQU5OLENBSm1FLENBV25FOztBQUNBLFlBQU9nQixHQUFQLEdBQWNSLElBQWQsQ0FBT1EsR0FBUDtBQUNBLFlBQU9DLE1BQVAsR0FBaUJSLE9BQWpCLENBQU9RLE1BQVAsQ0FibUUsQ0FlbkU7QUFFQTs7QUFDQSxZQUFNQyxhQUFhLEdBQUc7QUFDcEJQLFVBQUFBLFNBQVMsRUFBVEEsU0FEb0I7QUFFcEJRLFVBQUFBLE1BQU0sRUFBRUgsR0FGWTtBQUdwQkksVUFBQUEsY0FBYyxFQUFFSCxNQUhJO0FBSXBCRixVQUFBQSxTQUFTLEVBQVRBLFNBSm9CO0FBS3BCSCxVQUFBQSxTQUFTLEVBQVRBO0FBTG9CLFNBQXRCO0FBT0EsWUFBTVMsTUFBTSxHQUFHO0FBQ2JDLFVBQUFBLE9BQU8sRUFBRTtBQUNQLDRCQUFnQjtBQURUO0FBREksU0FBZjs7QUFLQUMsMEJBQ0dDLElBREgsV0FFT0MsZ0NBRlAsd0NBR0lQLGFBSEosRUFJSUcsTUFKSixFQU1HSyxJQU5ILENBTVEsVUFBQUMsTUFBTSxFQUFJO0FBQ2QsY0FBSUMsTUFBSjtBQUNBLGNBQUlDLFNBQUo7QUFDQSxjQUFNQyxJQUFJLEdBQUdILE1BQU0sQ0FBQ0csSUFBUCxDQUFZQSxJQUF6QixDQUhjLENBS2Q7O0FBRUEsY0FBTUMsVUFBVSxHQUFHQyxNQUFNLENBQUNDLElBQVAsQ0FBWUgsSUFBWixDQUFuQjs7QUFFQSxjQUFJZixTQUFTLEtBQUssUUFBbEIsRUFBNEI7QUFDMUJjLFlBQUFBLFNBQVMsR0FBR0UsVUFBVSxDQUFDRyxNQUFYLENBQWtCLFVBQUNDLElBQUQsRUFBT2hELEtBQVAsRUFBaUI7QUFDN0Msa0JBQU1pRCxLQUFLLEdBQUdOLElBQUksQ0FBQzNDLEtBQUQsQ0FBbEI7QUFDQSxrQkFBTWtELEdBQUcsR0FBRztBQUNWRCxnQkFBQUEsS0FBSyxFQUFMQSxLQURVO0FBRVZFLGdCQUFBQSxFQUFFLEVBQUVDLE1BQU0sQ0FBQ3BELEtBQUssQ0FBQ3FELEtBQU4sQ0FBWSxJQUFaLEVBQWtCLENBQWxCLENBQUQsQ0FGQTtBQUdWQyxnQkFBQUEsRUFBRSxFQUFFRixNQUFNLENBQUNwRCxLQUFLLENBQUNxRCxLQUFOLENBQVksSUFBWixFQUFrQixDQUFsQixDQUFEO0FBSEEsZUFBWjtBQUtBTCxjQUFBQSxJQUFJLENBQUNPLElBQUwsQ0FBVUwsR0FBVjtBQUNBLHFCQUFPRixJQUFQO0FBQ0QsYUFUVyxFQVNULEVBVFMsQ0FBWjtBQVdBTixZQUFBQSxTQUFTLEdBQUdBLFNBQVMsQ0FBQ2MsSUFBVixDQUFlLFVBQUNDLENBQUQsRUFBSUMsQ0FBSjtBQUFBLHFCQUFVRCxDQUFDLENBQUNILEVBQUYsR0FBT0ksQ0FBQyxDQUFDSixFQUFuQjtBQUFBLGFBQWYsQ0FBWjtBQUNBYixZQUFBQSxNQUFNLEdBQUcsQ0FBQ0MsU0FBUyxDQUFDLENBQUQsQ0FBVCxDQUFhUyxFQUFkLEVBQWtCVCxTQUFTLENBQUNBLFNBQVMsQ0FBQ2lCLE1BQVYsR0FBbUIsQ0FBcEIsQ0FBVCxDQUFnQ0wsRUFBbEQsQ0FBVDtBQUNELFdBZEQsTUFjTztBQUNMYixZQUFBQSxNQUFNLEdBQUdHLFVBQVQ7QUFDRCxXQXpCYSxDQTJCZDs7O0FBRUFyQixVQUFBQSxZQUFZLENBQUNMLEdBQUQsRUFBTSxNQUFOLEVBQWNDLEtBQUssQ0FBQ2IsSUFBcEIsRUFBMEIsQ0FBMUIsRUFBNkJGLE1BQTdCLEVBQXFDcUMsTUFBckMsRUFBNkNDLFNBQTdDLENBQVo7QUFDRCxTQXBDSDtBQXFDRDtBQXJISDtBQUFBO0FBQUEsYUF1SEUsa0JBQVM7QUFDUCwwQkFBK0IsS0FBS2hFLEtBQXBDO0FBQUEsWUFBT3lCLE1BQVAsZUFBT0EsTUFBUDtBQUFBLFlBQWVvQixZQUFmLGVBQWVBLFlBQWY7QUFFQSxZQUFPVixJQUFQLEdBQXVCVixNQUF2QixDQUFPVSxJQUFQO0FBQUEsWUFBYVQsTUFBYixHQUF1QkQsTUFBdkIsQ0FBYUMsTUFBYjtBQUNBLFlBQU13RCxxQkFBcUIsR0FDeEIvQyxJQUFJLElBQUlsQixxQkFBcUIsQ0FBQ2tCLElBQUQsQ0FBOUIsSUFBeUNsQixxQkFBcUIsV0FEaEU7QUFFQSxZQUFNa0Usa0JBQWtCLEdBQUcsS0FBS0MsdUJBQUwsQ0FBNkIsS0FBS3BGLEtBQWxDLENBQTNCO0FBRUEsNkJBQ0UsZ0NBQUMsaUJBQUQ7QUFBbUIsWUFBQSxTQUFTLEVBQUM7QUFBN0IsMEJBQ0UsZ0NBQUMscUJBQUQ7QUFDRSxZQUFBLGtCQUFrQixFQUFFbUYsa0JBRHRCO0FBRUUsWUFBQSxNQUFNLEVBQUV6RCxNQUZWO0FBR0UsWUFBQSxTQUFTLEVBQUUsS0FBSzJELFNBSGxCO0FBSUUsWUFBQSxZQUFZLEVBQUV4QztBQUpoQixhQUtNLEtBQUs3QyxLQUxYLEVBREY7QUFERjtBQVdEO0FBMUlIO0FBQUE7QUFBQSxJQUFpQ3NGLGdCQUFqQyx5REFDcUI7QUFDakI5QyxJQUFBQSxHQUFHLEVBQUUrQyxzQkFBVUMsTUFERTtBQUVqQjdELElBQUFBLE9BQU8sRUFBRTRELHNCQUFVRSxPQUFWLENBQWtCRixzQkFBVUcsR0FBNUIsRUFBaUNDLFVBRnpCO0FBR2pCbEUsSUFBQUEsTUFBTSxFQUFFOEQsc0JBQVVLLE1BQVYsQ0FBaUJELFVBSFI7QUFJakJFLElBQUFBLE1BQU0sRUFBRU4sc0JBQVVFLE9BQVYsQ0FBa0JGLHNCQUFVRyxHQUE1QixFQUFpQ0MsVUFKeEI7QUFLakJHLElBQUFBLFNBQVMsRUFBRVAsc0JBQVVRLElBQVYsQ0FBZUosVUFMVDtBQU1qQkssSUFBQUEsWUFBWSxFQUFFVCxzQkFBVVEsSUFBVixDQUFlSixVQU5aO0FBT2pCTSxJQUFBQSxhQUFhLEVBQUVWLHNCQUFVUSxJQUFWLENBQWVKLFVBUGI7QUFRakJPLElBQUFBLGVBQWUsRUFBRVgsc0JBQVVRLElBQVYsQ0FBZUosVUFSZjtBQVNqQmpELElBQUFBLFFBQVEsRUFBRTZDLHNCQUFVSyxNQVRIO0FBVWpCTyxJQUFBQSxnQkFBZ0IsRUFBRVosc0JBQVVRLElBVlg7QUFXakJLLElBQUFBLG9CQUFvQixFQUFFYixzQkFBVWMsSUFYZjtBQVlqQkMsSUFBQUEsUUFBUSxFQUFFZixzQkFBVUssTUFaSDtBQWFqQmpELElBQUFBLElBQUksRUFBRTRDLHNCQUFVSyxNQUFWLENBQWlCRCxVQWJOO0FBY2pCL0MsSUFBQUEsT0FBTyxFQUFFMkMsc0JBQVVLLE1BQVYsQ0FBaUJEO0FBZFQsR0FEckIsU0FWQSxDQXNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRDs7b0NBRWN4RixrQixFQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7Q29tcG9uZW50fSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzLCB7c3RyaW5nfSBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7Y3JlYXRlU2VsZWN0b3J9IGZyb20gJ3Jlc2VsZWN0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2guZ2V0JztcbmltcG9ydCBQYW5lbEhlYWRlckFjdGlvbiBmcm9tICdjb21wb25lbnRzL3NpZGUtcGFuZWwvcGFuZWwtaGVhZGVyLWFjdGlvbic7XG5pbXBvcnQgRmllbGRTZWxlY3RvciBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9maWVsZC1zZWxlY3Rvcic7XG5pbXBvcnQge1RyYXNoLCBDbG9ja30gZnJvbSAnY29tcG9uZW50cy9jb21tb24vaWNvbnMnO1xuaW1wb3J0IFNvdXJjZURhdGFTZWxlY3RvckZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9zaWRlLXBhbmVsL2NvbW1vbi9zb3VyY2UtZGF0YS1zZWxlY3Rvcic7XG5pbXBvcnQge1N0eWxlZFBhbmVsSGVhZGVyfSBmcm9tICdjb21wb25lbnRzL2NvbW1vbi9zdHlsZWQtY29tcG9uZW50cyc7XG5cbmltcG9ydCBGaWx0ZXJQYW5lbEhlYWRlckZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9zaWRlLXBhbmVsL2ZpbHRlci1wYW5lbC9maWx0ZXItcGFuZWwtaGVhZGVyJztcbmltcG9ydCBOZXdGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9maWx0ZXJzL2ZpbHRlci1wYW5lbHMvbmV3LWZpbHRlci1wYW5lbCc7XG5pbXBvcnQgVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3RpbWUtcmFuZ2UtZmlsdGVyLXBhbmVsJztcbmltcG9ydCBTaW5nbGVTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSAnY29tcG9uZW50cy9maWx0ZXJzL2ZpbHRlci1wYW5lbHMvc2luZ2xlLXNlbGVjdC1maWx0ZXItcGFuZWwnO1xuaW1wb3J0IE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL211bHRpLXNlbGVjdC1maWx0ZXItcGFuZWwnO1xuaW1wb3J0IFJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gJ2NvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3JhbmdlLWZpbHRlci1wYW5lbCc7XG5pbXBvcnQgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeSBmcm9tICdjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9wb2x5Z29uLWZpbHRlci1wYW5lbCc7XG4vLyBpbXBvcnQgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeSBmcm9tICdjb21wb25lbnRzL2ZpbHRlcnMvcG9seWdvbi1maWx0ZXInO1xuaW1wb3J0IHtGSUxURVJfVFlQRVMsIEZJTFRFUl9DT01QT05FTlRTfSBmcm9tICd1dGlscy9maWx0ZXItdXRpbHMnO1xuaW1wb3J0IHtBTExfRklFTERfVFlQRVMsIE9OX1BSRU1FU0lTX1VSTH0gZnJvbSAnY29uc3RhbnRzL2RlZmF1bHQtc2V0dGluZ3MnO1xuXG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHtoaXN0b2dyYW19IGZyb20gJ2QzLWFycmF5JztcblxuY29uc3QgU3R5bGVkRmlsdGVyUGFuZWwgPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICBib3JkZXItcmFkaXVzOiAxcHg7XG4gIC5maWx0ZXItcGFuZWxfX2ZpbHRlciB7XG4gICAgbWFyZ2luLXRvcDogMjRweDtcbiAgfVxuYDtcblxuY29uc3QgU3R5bGVkRmlsdGVySGVhZGVyID0gc3R5bGVkKFN0eWxlZFBhbmVsSGVhZGVyKWBcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gIC5maWVsZC1zZWxlY3RvciB7XG4gICAgd2lkdGg6IGNhbGMoMTAwJSAtIDU4cHgpO1xuICB9XG5gO1xuXG5jb25zdCBTdHlsZWRGaWx0ZXJDb250ZW50ID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5wYW5lbEJhY2tncm91bmR9O1xuICBwYWRkaW5nOiAxMnB4O1xuYDtcblxuRmlsdGVyUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4gIE5ld0ZpbHRlclBhbmVsRmFjdG9yeSxcbiAgVGltZVJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5LFxuICBTaW5nbGVTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnksXG4gIE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5LFxuICBSYW5nZUZpbHRlclBhbmVsRmFjdG9yeSxcbiAgUG9seWdvbkZpbHRlclBhbmVsRmFjdG9yeVxuXTtcblxuZnVuY3Rpb24gRmlsdGVyUGFuZWxGYWN0b3J5KFxuICBOZXdGaWx0ZXJQYW5lbCxcbiAgVGltZVJhbmdlRmlsdGVyUGFuZWwsXG4gIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuICBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuICBSYW5nZUZpbHRlclBhbmVsLFxuICBQb2x5Z29uRmlsdGVyUGFuZWxcbikge1xuICBjb25zdCBGaWx0ZXJQYW5lbENvbXBvbmVudHMgPSB7XG4gICAgZGVmYXVsdDogTmV3RmlsdGVyUGFuZWwsXG4gICAgW0ZJTFRFUl9UWVBFUy50aW1lUmFuZ2VdOiBUaW1lUmFuZ2VGaWx0ZXJQYW5lbCxcbiAgICBbRklMVEVSX1RZUEVTLnNlbGVjdF06IFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMubXVsdGlTZWxlY3RdOiBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMucmFuZ2VdOiBSYW5nZUZpbHRlclBhbmVsLFxuICAgIFtGSUxURVJfVFlQRVMucG9seWdvbl06IFBvbHlnb25GaWx0ZXJQYW5lbFxuICB9O1xuXG4gIHJldHVybiBjbGFzcyBGaWx0ZXJQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4gICAgICBmaWx0ZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgIGxheWVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFueSkuaXNSZXF1aXJlZCxcbiAgICAgIHNldEZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIHJlbW92ZUZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICAgIGVubGFyZ2VGaWx0ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICB0b2dnbGVBbmltYXRpb246IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuICAgICAgbWFwU3RhdGU6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgICBhdXRoOiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gICAgICBwcm9qZWN0OiBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWRcbiAgICB9O1xuXG4gICAgLyogc2VsZWN0b3JzICovXG4gICAgLy8gZmllbGRzU2VsZWN0b3IgPSBwcm9wcyA9PlxuICAgIC8vICAgKHByb3BzLmZpbHRlci5kYXRhSWQgJiYgcHJvcHMuZGF0YXNldHNbcHJvcHMuZmlsdGVyLmRhdGFJZF0uZmllbGRzKSB8fCBbXTtcbiAgICBmaWVsZHNTZWxlY3RvciA9IHByb3BzID0+IHtcbiAgICAgIGNvbnN0IGRhdGFzZXRJZCA9IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG4gICAgICBpZiAoIWRhdGFzZXRJZCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0KHByb3BzLCBbJ2RhdGFzZXRzJywgZGF0YXNldElkLCAnZmllbGRzJ10sIFtdKTtcbiAgICB9O1xuICAgIGZpbHRlclNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZmlsdGVycztcbiAgICBuYW1lU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXIubmFtZTtcbiAgICBkYXRhSWRTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG5cbiAgICAvLyBvbmx5IHNob3cgY3VycmVudCBmaWVsZCBhbmQgZmllbGQgdGhhdCdzIG5vdCBhbHJlYWR5IGJlZW4gdXNlZCBhcyBhIGZpbHRlclxuICAgIGF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4gICAgICB0aGlzLmZpZWxkc1NlbGVjdG9yLFxuICAgICAgdGhpcy5maWx0ZXJTZWxlY3RvcixcbiAgICAgIHRoaXMubmFtZVNlbGVjdG9yLFxuICAgICAgdGhpcy5kYXRhSWRTZWxlY3RvcixcbiAgICAgIChmaWVsZHMsIGZpbHRlcnMsIG5hbWUsIGRhdGFJZCkgPT5cbiAgICAgICAgZmllbGRzLmZpbHRlcihcbiAgICAgICAgICBmID0+XG4gICAgICAgICAgICBmLnR5cGUgJiZcbiAgICAgICAgICAgIGYudHlwZSAhPT0gQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24gJiZcbiAgICAgICAgICAgIChmLm5hbWVbMF0gPT09IG5hbWVbMF0gfHxcbiAgICAgICAgICAgICAgIWZpbHRlcnMuZmluZChcbiAgICAgICAgICAgICAgICBkID0+IGQubmFtZVswXSA9PT0gZi5uYW1lICYmIGQuZGF0YUlkWzBdID09PSBkYXRhSWRcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICBmaWx0ZXJBcGkoaWR4LCB2YWx1ZSwgZGF0YUlkLCBkYXRhc2V0cywgYXV0aCwgcHJvamVjdCwgc2V0RmlsdGVyQVBJKSB7XG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgdmFyIHtmaWVsZHMsIGluZGV4TmFtZX0gPSBkYXRhc2V0c1tkYXRhSWRdO1xuICAgICAgY29uc3QgZmllbGRJZHggPSBmaWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBmaWVsZE5hbWUpO1xuICAgICAgY29uc3QgZmllbGRUeXBlID1cbiAgICAgICAgZmllbGROYW1lICYmIGZpZWxkc1tmaWVsZElkeF0udHlwZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/ICdzdHJpbmcnXG4gICAgICAgICAgOiAoZmllbGROYW1lICYmIGZpZWxkc1tmaWVsZElkeF0udHlwZSA9PT0gJ2ludGVnZXInKSB8fFxuICAgICAgICAgICAgZmllbGRzW2ZpZWxkSWR4XS50eXBlID09PSAncmVhbCdcbiAgICAgICAgICA/ICdudW1lcmljJ1xuICAgICAgICAgIDogJ2RhdGV0aW1lJztcbiAgICAgIC8vIGNvbnN0IHVzZXJJZCA9ICd1aWQnO1xuICAgICAgY29uc3Qge3VpZH0gPSBhdXRoO1xuICAgICAgY29uc3Qge2lzRWRpdH0gPSBwcm9qZWN0O1xuXG4gICAgICAvLyBjb25zdCB7c2V0RmlsdGVyQVBJfSA9IHRoaXMucHJvcHM7XG5cbiAgICAgIC8vIGlmIGZpZWxkVHlwZSBpcyBzdHJpbmcgaW5zaWRlIGZpbHRlciB0aGVuIHNlbmQgc3RyaW5nIGVsc2Ugc2VuZCBudW1lcmljXG4gICAgICBjb25zdCBmaWx0ZXJBUElEYXRhID0ge1xuICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgIHVzZXJJZDogdWlkLFxuICAgICAgICBwZXJtaXNzaW9uVHlwZTogaXNFZGl0LFxuICAgICAgICBmaWVsZFR5cGUsXG4gICAgICAgIGluZGV4TmFtZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGF4aW9zXG4gICAgICAgIC5wb3N0KFxuICAgICAgICAgIGAke09OX1BSRU1FU0lTX1VSTH0vZ2VvaXF1dGlsaXRpZXMvZmlsdGVyL3YxLjAvZmV0Y2hgLFxuICAgICAgICAgIGZpbHRlckFQSURhdGEsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICB2YXIgZG9tYWluO1xuICAgICAgICAgIHZhciBoaXN0b2dyYW07XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmRhdGE7XG5cbiAgICAgICAgICAvLyB0aGlzIGlzIHdyaXR0ZW4gZm9yIHJlYWwgYW5kIGludGVnZXIgZmllbGRzXG5cbiAgICAgICAgICBjb25zdCBkb21haW5LZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG5cbiAgICAgICAgICBpZiAoZmllbGRUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaGlzdG9ncmFtID0gZG9tYWluS2V5cy5yZWR1Y2UoKGFjY3UsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZGF0YVtyYW5nZV07XG4gICAgICAgICAgICAgIGNvbnN0IGJpbiA9IHtcbiAgICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgICB4MDogTnVtYmVyKHJhbmdlLnNwbGl0KCcmJicpWzBdKSxcbiAgICAgICAgICAgICAgICB4MTogTnVtYmVyKHJhbmdlLnNwbGl0KCcmJicpWzFdKVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBhY2N1LnB1c2goYmluKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGFjY3U7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIGhpc3RvZ3JhbSA9IGhpc3RvZ3JhbS5zb3J0KChhLCBiKSA9PiBhLngxIC0gYi54MSk7XG4gICAgICAgICAgICBkb21haW4gPSBbaGlzdG9ncmFtWzBdLngwLCBoaXN0b2dyYW1baGlzdG9ncmFtLmxlbmd0aCAtIDFdLngxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluS2V5cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB3cml0ZSBkYXRhIGNvbnZlcnNpb24gdG8gZG9tYWluIGZvciBzdHJpbmcgdHlwZSBmaWVsZHNcblxuICAgICAgICAgIHNldEZpbHRlckFQSShpZHgsICduYW1lJywgdmFsdWUubmFtZSwgMCwgZGF0YUlkLCBkb21haW4sIGhpc3RvZ3JhbSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgIGNvbnN0IHtmaWx0ZXIsIHNldEZpbHRlckFQSX0gPSB0aGlzLnByb3BzO1xuXG4gICAgICBjb25zdCB7dHlwZSwgZGF0YUlkfSA9IGZpbHRlcjtcbiAgICAgIGNvbnN0IEZpbHRlckZpbHRlckNvbXBvbmVudCA9XG4gICAgICAgICh0eXBlICYmIEZpbHRlclBhbmVsQ29tcG9uZW50c1t0eXBlXSkgfHwgRmlsdGVyUGFuZWxDb21wb25lbnRzLmRlZmF1bHQ7XG4gICAgICBjb25zdCBhbGxBdmFpbGFibGVGaWVsZHMgPSB0aGlzLmF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8U3R5bGVkRmlsdGVyUGFuZWwgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsXCI+XG4gICAgICAgICAgPEZpbHRlckZpbHRlckNvbXBvbmVudFxuICAgICAgICAgICAgYWxsQXZhaWxhYmxlRmllbGRzPXthbGxBdmFpbGFibGVGaWVsZHN9XG4gICAgICAgICAgICBkYXRhSWQ9e2RhdGFJZH1cbiAgICAgICAgICAgIGZpbHRlckFwaT17dGhpcy5maWx0ZXJBcGl9XG4gICAgICAgICAgICBzZXRGaWx0ZXJBUEk9e3NldEZpbHRlckFQSX1cbiAgICAgICAgICAgIHsuLi50aGlzLnByb3BzfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU3R5bGVkRmlsdGVyUGFuZWw+XG4gICAgICApO1xuICAgIH1cbiAgfTtcbiAgLy8gICByZW5kZXIoKSB7XG4gIC8vICAgICBjb25zdCB7XG4gIC8vICAgICAgIGRhdGFzZXRzLFxuICAvLyAgICAgICBlbmxhcmdlRmlsdGVyLFxuICAvLyAgICAgICBmaWx0ZXIsXG4gIC8vICAgICAgIGlkeCxcbiAgLy8gICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmcsXG4gIC8vICAgICAgIHJlbW92ZUZpbHRlcixcbiAgLy8gICAgICAgc2V0RmlsdGVyLFxuICAvLyAgICAgICB0b2dnbGVBbmltYXRpb24sXG4gIC8vICAgICAgIG1hcFN0YXRlLFxuICAvLyAgICAgICBhdXRoLFxuICAvLyAgICAgICBwcm9qZWN0XG4gIC8vICAgICB9ID0gdGhpcy5wcm9wcztcbiAgLy8gICAgIGNvbnN0IHtuYW1lLCBlbmxhcmdlZCwgdHlwZSwgZGF0YUlkfSA9IGZpbHRlcjtcbiAgLy8gICAgIGNvbnN0IEZpbHRlckNvbXBvbmVudCA9IHR5cGUgJiYgRmlsdGVyQ29tcG9uZW50c1tGSUxURVJfQ09NUE9ORU5UU1t0eXBlXV07XG4gIC8vICAgICBjb25zdCBhbGxBdmFpbGFibGVGaWVsZHMgPSB0aGlzLmF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yKHRoaXMucHJvcHMpO1xuXG4gIC8vICAgICByZXR1cm4gKFxuICAvLyAgICAgICA8U3R5bGVkRmlsdGVyUGFuZWwgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsXCI+XG4gIC8vICAgICAgICAgPFN0eWxlZEZpbHRlckhlYWRlclxuICAvLyAgICAgICAgICAgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsX19oZWFkZXJcIlxuICAvLyAgICAgICAgICAgbGFiZWxSQ0dDb2xvclZhbHVlcz17ZGF0YXNldHNbZGF0YUlkXS5jb2xvcn1cbiAgLy8gICAgICAgICA+XG4gIC8vICAgICAgICAgICA8RmllbGRTZWxlY3RvclxuICAvLyAgICAgICAgICAgICBpbnB1dFRoZW1lPVwic2Vjb25kYXJ5XCJcbiAgLy8gICAgICAgICAgICAgZmllbGRzPXthbGxBdmFpbGFibGVGaWVsZHN9XG4gIC8vICAgICAgICAgICAgIHZhbHVlPXtBcnJheS5pc0FycmF5KG5hbWUpID8gbmFtZVswXSA6IG5hbWV9XG4gIC8vICAgICAgICAgICAgIGVyYXNhYmxlPXtmYWxzZX1cbiAgLy8gICAgICAgICAgICAgb25TZWxlY3Q9e3ZhbHVlID0+XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJBcGkoaWR4LCB2YWx1ZSwgZGF0YUlkLCBkYXRhc2V0cywgYXV0aCwgcHJvamVjdClcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAvLyAgICAgICAgICAgICBpZD17ZmlsdGVyLmlkfVxuICAvLyAgICAgICAgICAgICB0b29sdGlwPVwiZGVsZXRlXCJcbiAgLy8gICAgICAgICAgICAgdG9vbHRpcFR5cGU9XCJlcnJvclwiXG4gIC8vICAgICAgICAgICAgIG9uQ2xpY2s9e3JlbW92ZUZpbHRlcn1cbiAgLy8gICAgICAgICAgICAgaG92ZXJDb2xvcj17J2Vycm9yQ29sb3InfVxuICAvLyAgICAgICAgICAgICBJY29uQ29tcG9uZW50PXtUcmFzaH1cbiAgLy8gICAgICAgICAgIC8+XG4gIC8vICAgICAgICAgICB7dHlwZSA9PT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSAmJiAoXG4gIC8vICAgICAgICAgICAgIDxQYW5lbEhlYWRlckFjdGlvblxuICAvLyAgICAgICAgICAgICAgIGlkPXtmaWx0ZXIuaWR9XG4gIC8vICAgICAgICAgICAgICAgb25DbGljaz17ZW5sYXJnZUZpbHRlcn1cbiAgLy8gICAgICAgICAgICAgICB0b29sdGlwPVwiVGltZSBQbGF5YmFja1wiXG4gIC8vICAgICAgICAgICAgICAgSWNvbkNvbXBvbmVudD17Q2xvY2t9XG4gIC8vICAgICAgICAgICAgICAgYWN0aXZlPXtlbmxhcmdlZH1cbiAgLy8gICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICl9XG4gIC8vICAgICAgICAgPC9TdHlsZWRGaWx0ZXJIZWFkZXI+XG4gIC8vICAgICAgICAgPFN0eWxlZEZpbHRlckNvbnRlbnQgY2xhc3NOYW1lPVwiZmlsdGVyLXBhbmVsX19jb250ZW50XCI+XG4gIC8vICAgICAgICAgICB7T2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCA+IDEgJiYgKFxuICAvLyAgICAgICAgICAgICA8U291cmNlRGF0YVNlbGVjdG9yXG4gIC8vICAgICAgICAgICAgICAgaW5wdXRUaGVtZT1cInNlY29uZGFyeVwiXG4gIC8vICAgICAgICAgICAgICAgZGF0YXNldHM9e2RhdGFzZXRzfVxuICAvLyAgICAgICAgICAgICAgIGRpc2FibGVkPXtmaWx0ZXIuZnJlZXplfVxuICAvLyAgICAgICAgICAgICAgIGRhdGFJZD17ZmlsdGVyLmRhdGFJZH1cbiAgLy8gICAgICAgICAgICAgICBvblNlbGVjdD17dmFsdWUgPT4gc2V0RmlsdGVyKGlkeCwgJ2RhdGFJZCcsIHZhbHVlKX1cbiAgLy8gICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICl9XG4gIC8vICAgICAgICAgICB7dHlwZSAmJiAhZW5sYXJnZWQgJiYgKFxuICAvLyAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZpbHRlci1wYW5lbF9fZmlsdGVyXCI+XG4gIC8vICAgICAgICAgICAgICAgPEZpbHRlckNvbXBvbmVudFxuICAvLyAgICAgICAgICAgICAgICAgZmlsdGVyPXtmaWx0ZXJ9XG4gIC8vICAgICAgICAgICAgICAgICBpZHg9e2lkeH1cbiAgLy8gICAgICAgICAgICAgICAgIGlzQW55RmlsdGVyQW5pbWF0aW5nPXtpc0FueUZpbHRlckFuaW1hdGluZ31cbiAgLy8gICAgICAgICAgICAgICAgIHRvZ2dsZUFuaW1hdGlvbj17dG9nZ2xlQW5pbWF0aW9ufVxuICAvLyAgICAgICAgICAgICAgICAgc2V0RmlsdGVyPXt2YWx1ZSA9PlxuICAvLyAgICAgICAgICAgICAgICAgICBzZXRGaWx0ZXIoaWR4LCAndmFsdWUnLCB2YWx1ZSwgMCwgbWFwU3RhdGUsIGF1dGgsIHByb2plY3QpXG4gIC8vICAgICAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgICAgLz5cbiAgLy8gICAgICAgICAgICAgPC9kaXY+XG4gIC8vICAgICAgICAgICApfVxuICAvLyAgICAgICAgIDwvU3R5bGVkRmlsdGVyQ29udGVudD5cbiAgLy8gICAgICAgPC9TdHlsZWRGaWx0ZXJQYW5lbD5cbiAgLy8gICAgICk7XG4gIC8vICAgfVxuICAvLyB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJQYW5lbEZhY3Rvcnk7XG4vLyBpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCI7XG4vLyBpbXBvcnQgUHJvcFR5cGVzIGZyb20gXCJwcm9wLXR5cGVzXCI7XG4vLyBpbXBvcnQgeyBjcmVhdGVTZWxlY3RvciB9IGZyb20gXCJyZXNlbGVjdFwiO1xuLy8gaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbi8vIGltcG9ydCB7IEZJTFRFUl9UWVBFUyB9IGZyb20gXCJ1dGlscy9maWx0ZXItdXRpbHNcIjtcbi8vIGltcG9ydCB7IEFMTF9GSUVMRF9UWVBFUyB9IGZyb20gXCJjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5nc1wiO1xuXG4vLyBpbXBvcnQgRmlsdGVyUGFuZWxIZWFkZXJGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL3NpZGUtcGFuZWwvZmlsdGVyLXBhbmVsL2ZpbHRlci1wYW5lbC1oZWFkZXJcIjtcbi8vIGltcG9ydCBOZXdGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL25ldy1maWx0ZXItcGFuZWxcIjtcbi8vIGltcG9ydCBUaW1lUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3RpbWUtcmFuZ2UtZmlsdGVyLXBhbmVsXCI7XG4vLyBpbXBvcnQgU2luZ2xlU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9zaW5nbGUtc2VsZWN0LWZpbHRlci1wYW5lbFwiO1xuLy8gaW1wb3J0IE11bHRpU2VsZWN0RmlsdGVyUGFuZWxGYWN0b3J5IGZyb20gXCJjb21wb25lbnRzL2ZpbHRlcnMvZmlsdGVyLXBhbmVscy9tdWx0aS1zZWxlY3QtZmlsdGVyLXBhbmVsXCI7XG4vLyBpbXBvcnQgUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3JhbmdlLWZpbHRlci1wYW5lbFwiO1xuLy8gaW1wb3J0IFBvbHlnb25GaWx0ZXJQYW5lbEZhY3RvcnkgZnJvbSBcImNvbXBvbmVudHMvZmlsdGVycy9maWx0ZXItcGFuZWxzL3BvbHlnb24tZmlsdGVyLXBhbmVsXCI7XG5cbi8vIGNvbnN0IFN0eWxlZEZpbHRlclBhbmVsID0gc3R5bGVkLmRpdmBcbi8vICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbi8vICAgYm9yZGVyLXJhZGl1czogMXB4O1xuXG4vLyAgIC5maWx0ZXItcGFuZWxfX2ZpbHRlciB7XG4vLyAgICAgbWFyZ2luLXRvcDogMjRweDtcbi8vICAgfVxuLy8gYDtcblxuLy8gRmlsdGVyUGFuZWxGYWN0b3J5LmRlcHMgPSBbXG4vLyAgIEZpbHRlclBhbmVsSGVhZGVyRmFjdG9yeSxcbi8vICAgTmV3RmlsdGVyUGFuZWxGYWN0b3J5LFxuLy8gICBUaW1lUmFuZ2VGaWx0ZXJQYW5lbEZhY3RvcnksXG4vLyAgIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsRmFjdG9yeSxcbi8vICAgTXVsdGlTZWxlY3RGaWx0ZXJQYW5lbEZhY3RvcnksXG4vLyAgIFJhbmdlRmlsdGVyUGFuZWxGYWN0b3J5LFxuLy8gICBQb2x5Z29uRmlsdGVyUGFuZWxGYWN0b3J5XG4vLyBdO1xuXG4vLyBmdW5jdGlvbiBGaWx0ZXJQYW5lbEZhY3RvcnkoXG4vLyAgIEZpbHRlclBhbmVsSGVhZGVyLFxuLy8gICBOZXdGaWx0ZXJQYW5lbCxcbi8vICAgVGltZVJhbmdlRmlsdGVyUGFuZWwsXG4vLyAgIFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICBSYW5nZUZpbHRlclBhbmVsLFxuLy8gICBQb2x5Z29uRmlsdGVyUGFuZWxcbi8vICkge1xuLy8gICBjb25zdCBGaWx0ZXJQYW5lbENvbXBvbmVudHMgPSB7XG4vLyAgICAgZGVmYXVsdDogTmV3RmlsdGVyUGFuZWwsXG4vLyAgICAgW0ZJTFRFUl9UWVBFUy50aW1lUmFuZ2VdOiBUaW1lUmFuZ2VGaWx0ZXJQYW5lbCxcbi8vICAgICBbRklMVEVSX1RZUEVTLnNlbGVjdF06IFNpbmdsZVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMubXVsdGlTZWxlY3RdOiBNdWx0aVNlbGVjdEZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMucmFuZ2VdOiBSYW5nZUZpbHRlclBhbmVsLFxuLy8gICAgIFtGSUxURVJfVFlQRVMucG9seWdvbl06IFBvbHlnb25GaWx0ZXJQYW5lbFxuLy8gICB9O1xuXG4vLyAgIHJldHVybiBjbGFzcyBGaWx0ZXJQYW5lbCBleHRlbmRzIENvbXBvbmVudCB7XG4vLyAgICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbi8vICAgICAgIGlkeDogUHJvcFR5cGVzLm51bWJlcixcbi8vICAgICAgIGZpbHRlcnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4vLyAgICAgICBmaWx0ZXI6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbi8vICAgICAgIHNldEZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbi8vICAgICAgIHJlbW92ZUZpbHRlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbi8vICAgICAgIGVubGFyZ2VGaWx0ZXI6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4vLyAgICAgICB0b2dnbGVBbmltYXRpb246IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4vLyAgICAgICBkYXRhc2V0czogUHJvcFR5cGVzLm9iamVjdCxcbi8vICAgICAgIHNob3dEYXRhc2V0VGFibGU6IFByb3BUeXBlcy5mdW5jLFxuLy8gICAgICAgaXNBbnlGaWx0ZXJBbmltYXRpbmc6IFByb3BUeXBlcy5ib29sXG4vLyAgICAgfTtcblxuLy8gICAgIC8qIHNlbGVjdG9ycyAqL1xuLy8gICAgIGZpZWxkc1NlbGVjdG9yID0gcHJvcHMgPT5cbi8vICAgICAgIChwcm9wcy5maWx0ZXIuZGF0YUlkWzBdICYmXG4vLyAgICAgICAgIHByb3BzLmRhdGFzZXRzW3Byb3BzLmZpbHRlci5kYXRhSWRbMF1dLmZpZWxkcykgfHxcbi8vICAgICAgIFtdO1xuLy8gICAgIGZpbHRlclNlbGVjdG9yID0gcHJvcHMgPT4gcHJvcHMuZmlsdGVycztcbi8vICAgICBuYW1lU2VsZWN0b3IgPSBwcm9wcyA9PiBwcm9wcy5maWx0ZXIubmFtZTtcbi8vICAgICBkYXRhSWRTZWxlY3RvciA9IHByb3BzID0+IHByb3BzLmZpbHRlci5kYXRhSWRbMF07XG5cbi8vICAgICAvLyBvbmx5IHNob3cgY3VycmVudCBmaWVsZCBhbmQgZmllbGQgdGhhdCdzIG5vdCBhbHJlYWR5IGJlZW4gdXNlZCBhcyBhIGZpbHRlclxuLy8gICAgIGF2YWlsYWJsZUZpZWxkc1NlbGVjdG9yID0gY3JlYXRlU2VsZWN0b3IoXG4vLyAgICAgICB0aGlzLmZpZWxkc1NlbGVjdG9yLFxuLy8gICAgICAgdGhpcy5maWx0ZXJTZWxlY3Rvcixcbi8vICAgICAgIHRoaXMubmFtZVNlbGVjdG9yLFxuLy8gICAgICAgdGhpcy5kYXRhSWRTZWxlY3Rvcixcbi8vICAgICAgIChmaWVsZHMsIGZpbHRlcnMsIG5hbWUsIGRhdGFJZCkgPT5cbi8vICAgICAgICAgZmllbGRzLmZpbHRlcihcbi8vICAgICAgICAgICBmID0+XG4vLyAgICAgICAgICAgICBmLnR5cGUgJiZcbi8vICAgICAgICAgICAgIGYudHlwZSAhPT0gQUxMX0ZJRUxEX1RZUEVTLmdlb2pzb24gJiZcbi8vICAgICAgICAgICAgIChmLm5hbWUgPT09IG5hbWUgfHxcbi8vICAgICAgICAgICAgICAgIWZpbHRlcn