UNPKG

kepler.gl.geoiq

Version:

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

199 lines (181 loc) 18.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _utils = require("../utils/utils"); var _defaultLayerIcon = _interopRequireDefault(require("./default-layer-icon")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var Widget = exports["default"] = /*#__PURE__*/function () { function Widget() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; (0, _classCallCheck2["default"])(this, Widget); this.id = props.id || (0, _utils.generateHashId)(6); // meta this.meta = {}; // visConfigSettings // this.visConfigSettings = {}; this.config = this.getDefaultWidgetConfig(_objectSpread({}, props)); } (0, _createClass2["default"])(Widget, [{ key: "type", get: function get() { return null; } }, { key: "name", get: function get() { return this.type; } }, { key: "widgetIcon", get: function get() { return _defaultLayerIcon["default"]; } }, { key: "isWidgetAggregated", get: function get() { return false; } }, { key: "requiredLayer", get: function get() { return []; } }, { key: "widgetInfoModal", get: function get() { return null; } }, { key: "widgetAggregatedData", get: function get() { return null; } }, { key: "calculateAggregationData", value: function calculateAggregationData() { return null; } }, { key: "getDefaultWidgetConfig", value: function getDefaultWidgetConfig() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return { categoryField: props.categoryField || null, dataId: props.dataId || null, label: props.label || 'new widget', isVisible: props.isVisible || false, isConfigActive: props.isConfigActive || false, fieldName: null, selectedLayer: props.selectedLayer || null, isCalculating: props.isCalculating || false, bounds: props.bounds || true, aggregatedData: props.aggregatedData || null, aggregationType: props.aggregationType || null }; } }, { key: "updateWidgetConfig", value: function updateWidgetConfig(newConfig) { this.config = _objectSpread(_objectSpread({}, this.config), newConfig); return this; } }, { key: "updateMeta", value: function updateMeta(meta) { this.meta = _objectSpread(_objectSpread({}, this.meta), meta); } }, { key: "assignConfigToWidget", value: function assignConfigToWidget(configToCopy) { var currentConfig = this.config; var copied = this.copyWidgetConfig(currentConfig, configToCopy); this.updateWidgetConfig(copied); } }, { key: "aggregatedDataAffectingProps", get: function get() { // console.log('inside aggregatedDataAffectingProps'); return ['aggregationType', 'fieldName', 'mapState', 'bounds']; } /** * Check whether layer has all columns * * @param {object} widget * @returns {boolean} yes or no */ }, { key: "hasAllValues", value: function hasAllValues() { var aggregationType = this.config.aggregationType; return aggregationType; } }, { key: "isValidToSave", value: function isValidToSave() { return this.type && this.hasAllValues(); } }, { key: "shouldCalculateAggregatedData", value: function shouldCalculateAggregatedData(props) { var _this = this; return props.some(function (p) { return _this.aggregatedDataAffectingProps.includes(p); }); } /* * Recursively copy config over to an empty layer * when received saved config, or copy config over from a different layer type * make sure to only copy over value to existing keys * @param {object} currentConfig - existing config to be override * @param {object} configToCopy - new Config to copy over * @param {string[]} notToDeepMerge - array of properties to not to be deep copied * @param {string[]} notToCopy - array of properties not to copy * @returns {object} - copied config */ }, { key: "copyWidgetConfig", value: function copyWidgetConfig(currentConfig, configToCopy) { var _this2 = this; var copied = {}; Object.keys(currentConfig).forEach(function (key) { if ((0, _utils.isPlainObject)(currentConfig[key]) && (0, _utils.isPlainObject)(configToCopy[key])) { // recursively assign object value copied[key] = _this2.copyWidgetConfig(currentConfig[key], configToCopy[key]); } else if ((0, _utils.notNullorUndefined)(configToCopy[key])) { // copy copied[key] = configToCopy[key]; } else { // keep existing copied[key] = currentConfig[key]; } }); return copied; } /** * Assign a field to layer column, return column config * @param key - Column Key * @param field - Selected field * @returns {{}} - Column config */ }, { key: "assignColumn", value: function assignColumn(key, field) { // field value could be null for optional columns var update = field ? { value: field.name, fieldIdx: field.tableFieldIndex - 1 } : { value: null, fieldIdx: -1 }; return _objectSpread(_objectSpread({}, this.config.columns), {}, (0, _defineProperty2["default"])({}, key, _objectSpread(_objectSpread({}, this.config.columns[key]), update))); } }]); return Widget; }(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aWRnZXRzL2Jhc2Utd2lkZ2V0LmpzIl0sIm5hbWVzIjpbIldpZGdldCIsInByb3BzIiwiaWQiLCJtZXRhIiwiY29uZmlnIiwiZ2V0RGVmYXVsdFdpZGdldENvbmZpZyIsInR5cGUiLCJEZWZhdWx0V2lkZ2V0SWNvbiIsImNhdGVnb3J5RmllbGQiLCJkYXRhSWQiLCJsYWJlbCIsImlzVmlzaWJsZSIsImlzQ29uZmlnQWN0aXZlIiwiZmllbGROYW1lIiwic2VsZWN0ZWRMYXllciIsImlzQ2FsY3VsYXRpbmciLCJib3VuZHMiLCJhZ2dyZWdhdGVkRGF0YSIsImFnZ3JlZ2F0aW9uVHlwZSIsIm5ld0NvbmZpZyIsImNvbmZpZ1RvQ29weSIsImN1cnJlbnRDb25maWciLCJjb3BpZWQiLCJjb3B5V2lkZ2V0Q29uZmlnIiwidXBkYXRlV2lkZ2V0Q29uZmlnIiwiaGFzQWxsVmFsdWVzIiwic29tZSIsInAiLCJhZ2dyZWdhdGVkRGF0YUFmZmVjdGluZ1Byb3BzIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImZpZWxkIiwidXBkYXRlIiwidmFsdWUiLCJuYW1lIiwiZmllbGRJZHgiLCJ0YWJsZUZpZWxkSW5kZXgiLCJjb2x1bW5zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBS0E7Ozs7OztJQUVxQkEsTTtBQUNuQixvQkFBd0I7QUFBQSxRQUFaQyxLQUFZLHVFQUFKLEVBQUk7QUFBQTtBQUN0QixTQUFLQyxFQUFMLEdBQVVELEtBQUssQ0FBQ0MsRUFBTixJQUFZLDJCQUFlLENBQWYsQ0FBdEIsQ0FEc0IsQ0FHdEI7O0FBQ0EsU0FBS0MsSUFBTCxHQUFZLEVBQVosQ0FKc0IsQ0FNdEI7QUFDQTs7QUFFQSxTQUFLQyxNQUFMLEdBQWMsS0FBS0Msc0JBQUwsbUJBQ1RKLEtBRFMsRUFBZDtBQUdEOzs7O1NBQ0QsZUFBVztBQUNULGFBQU8sSUFBUDtBQUNEOzs7U0FDRCxlQUFXO0FBQ1QsYUFBTyxL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R0U7QUFDQTtBQUNBWCxVQUFBQSxNQUFNLENBQUNXLEdBQUQsQ0FBTixHQUFjLE1BQUksQ0FBQ1YsZ0JBQUwsQ0FDWkYsYUFBYSxDQUFDWSxHQUFELENBREQsRUFFWmIsWUFBWSxDQUFDYSxHQUFELENBRkEsQ0FBZDtBQUlELFNBVEQsTUFTTyxJQUFJLCtCQUFtQmIsWUFBWSxDQUFDYSxHQUFELENBQS9CLENBQUosRUFBMkM7QUFDaEQ7QUFDQVgsVUFBQUEsTUFBTSxDQUFDVyxHQUFELENBQU4sR0FBY2IsWUFBWSxDQUFDYSxHQUFELENBQTFCO0FBQ0QsU0FITSxNQUdBO0FBQ0w7QUFDQVgsVUFBQUEsTUFBTSxDQUFDVyxHQUFELENBQU4sR0FBY1osYUFBYSxDQUFDWSxHQUFELENBQTNCO0FBQ0Q7QUFDRixPQWpCRDtBQW1CQSxhQUFPWCxNQUFQO0FBQ0Q7QUFFRDs7Ozs7Ozs7O1dBTUEsc0JBQWFXLEdBQWIsRUFBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCO0FBQ0EsVUFBTUMsTUFBTSxHQUFHRCxLQUFLLEdBQ2hCO0FBQ0VFLFFBQUFBLEtBQUssRUFBRUYsS0FBSyxDQUFDRyxJQURmO0FBRUVDLFFBQUFBLFFBQVEsRUFBRUosS0FBSyxDQUFDSyxlQUFOLEdBQXdCO0FBRnBDLE9BRGdCLEdBS2hCO0FBQUNILFFBQUFBLEtBQUssRUFBRSxJQUFSO0FBQWNFLFFBQUFBLFFBQVEsRUFBRSxDQUFDO0FBQXpCLE9BTEo7QUFPQSw2Q0FDSyxLQUFLbEMsTUFBTCxDQUFZb0MsT0FEakIsNENBRUdQLEdBRkgsa0NBR08sS0FBSzdCLE1BQUwsQ0FBWW9DLE9BQVosQ0FBb0JQLEdBQXBCLENBSFAsR0FJT0UsTUFKUDtBQU9EIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgZ2VuZXJhdGVIYXNoSWQsXG4gIG5vdE51bGxvclVuZGVmaW5lZCxcbiAgaXNQbGFpbk9iamVjdFxufSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgRGVmYXVsdFdpZGdldEljb24gZnJvbSAnLi9kZWZhdWx0LWxheWVyLWljb24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaWRnZXQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZCA9IHByb3BzLmlkIHx8IGdlbmVyYXRlSGFzaElkKDYpO1xuXG4gICAgLy8gbWV0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgLy8gdmlzQ29uZmlnU2V0dGluZ3NcbiAgICAvLyB0aGlzLnZpc0NvbmZpZ1NldHRpbmdzID0ge307XG5cbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuZ2V0RGVmYXVsdFdpZGdldENvbmZpZyh7XG4gICAgICAuLi5wcm9wc1xuICAgIH0pO1xuICB9XG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cbiAgZ2V0IHdpZGdldEljb24oKSB7XG4gICAgcmV0dXJuIERlZmF1bHRXaWRnZXRJY29uO1xuICB9XG4gIGdldCBpc1dpZGdldEFnZ3JlZ2F0ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGdldCByZXF1aXJlZExheWVyKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXQgd2lkZ2V0SW5mb01vZGFsKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCB3aWRnZXRBZ2dyZWdhdGVkRGF0YSgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjYWxjdWxhdGVBZ2dyZWdhdGlvbkRhdGEoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXREZWZhdWx0V2lkZ2V0Q29uZmlnKHByb3BzID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2F0ZWdvcnlGaWVsZDogcHJvcHMuY2F0ZWdvcnlGaWVsZCB8fCBudWxsLFxuICAgICAgZGF0YUlkOiBwcm9wcy5kYXRhSWQgfHwgbnVsbCxcbiAgICAgIGxhYmVsOiBwcm9wcy5sYWJlbCB8fCAnbmV3IHdpZGdldCcsXG4gICAgICBpc1Zpc2libGU6IHByb3BzLmlzVmlzaWJsZSB8fCBmYWxzZSxcbiAgICAgIGlzQ29uZmlnQWN0aXZlOiBwcm9wcy5pc0NvbmZpZ0FjdGl2ZSB8fCBmYWxzZSxcbiAgICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICAgIHNlbGVjdGVkTGF5ZXI6IHByb3BzLnNlbGVjdGVkTGF5ZXIgfHwgbnVsbCxcbiAgICAgIGlzQ2FsY3VsYXRpbmc6IHByb3BzLmlzQ2FsY3VsYXRpbmcgfHwgZmFsc2UsXG4gICAgICBib3VuZHM6IHByb3BzLmJvdW5kcyB8fCB0cnVlLFxuICAgICAgYWdncmVnYXRlZERhdGE6IHByb3BzLmFnZ3JlZ2F0ZWREYXRhIHx8IG51bGwsXG4gICAgICBhZ2dyZWdhdGlvblR5cGU6IHByb3BzLmFnZ3JlZ2F0aW9uVHlwZSB8fCBudWxsXG4gICAgfTtcbiAgfVxuICB1cGRhdGVXaWRnZXRDb25maWcobmV3Q29uZmlnKSB7XG4gICAgdGhpcy5jb25maWcgPSB7Li4udGhpcy5jb25maWcsIC4uLm5ld0NvbmZpZ307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVNZXRhKG1ldGEpIHtcbiAgICB0aGlzLm1ldGEgPSB7Li4udGhpcy5tZXRhLCAuLi5tZXRhfTtcbiAgfVxuXG4gIGFzc2lnbkNvbmZpZ1RvV2lkZ2V0KGNvbmZpZ1RvQ29weSkge1xuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcHlXaWRnZXRDb25maWcoY3VycmVudENvbmZpZywgY29uZmlnVG9Db3B5KTtcblxuICAgIHRoaXMudXBkYXRlV2lkZ2V0Q29uZmlnKGNvcGllZCk7XG4gIH1cblxuICBnZXQgYWdncmVnYXRlZERhdGFBZmZlY3RpbmdQcm9wcygpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnaW5zaWRlIGFnZ3JlZ2F0ZWREYXRhQWZmZWN0aW5nUHJvcHMnKTtcbiAgICByZXR1cm4gWydhZ2dyZWdhdGlvblR5cGUnLCAnZmllbGROYW1lJywgJ21hcFN0YXRlJywgJ2JvdW5kcyddO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgbGF5ZXIgaGFzIGFsbCBjb2x1bW5zXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB3aWRnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHllcyBvciBub1xuICAgKi9cbiAgaGFzQWxsVmFsdWVzKCkge1xuICAgIGNvbnN0IHthZ2dyZWdhdGlvblR5cGV9ID0gdGhpcy5jb25maWc7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0aW9uVHlwZTtcbiAgfVxuXG4gIGlzVmFsaWRUb1NhdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSAmJiB0aGlzLmhhc0FsbFZhbHVlcygpO1xuICB9XG5cbiAgc2hvdWxkQ2FsY3VsYXRlQWdncmVnYXRlZERhdGEocHJvcHMpIHtcbiAgICByZXR1cm4gcHJvcHMuc29tZShwID0+IHRoaXMuYWdncmVnYXRlZERhdGFBZmZlY3RpbmdQcm9wcy5pbmNsdWRlcyhwKSk7XG4gIH1cblxuICAvKlxuICAgKiBSZWN1cnNpdmVseSBjb3B5IGNvbmZpZyBvdmVyIHRvIGFuIGVtcHR5IGxheWVyXG4gICAqIHdoZW4gcmVjZWl2ZWQgc2F2ZWQgY29uZmlnLCBvciBjb3B5IGNvbmZpZyBvdmVyIGZyb20gYSBkaWZmZXJlbnQgbGF5ZXIgdHlwZVxuICAgKiBtYWtlIHN1cmUgdG8gb25seSBjb3B5IG92ZXIgdmFsdWUgdG8gZXhpc3Rpbmcga2V5c1xuICAgKiBAcGFyYW0ge29iamVjdH0gY3VycmVudENvbmZpZyAtIGV4aXN0aW5nIGNvbmZpZyB0byBiZSBvdmVycmlkZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnVG9Db3B5IC0gbmV3IENvbmZpZyB0byBjb3B5IG92ZXJcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbm90VG9EZWVwTWVyZ2UgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIHRvIG5vdCB0byBiZSBkZWVwIGNvcGllZFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBub3RUb0NvcHkgLSBhcnJheSBvZiBwcm9wZXJ0aWVzIG5vdCB0byBjb3B5XG4gICAqIEByZXR1cm5zIHtvYmplY3R9IC0gY29waWVkIGNvbmZpZ1xuICAgKi9cblxuICBjb3B5V2lkZ2V0Q29uZmlnKGN1cnJlbnRDb25maWcsIGNvbmZpZ1RvQ29weSkge1xuICAgIGNvbnN0IGNvcGllZCA9IHt9O1xuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25maWcpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50Q29uZmlnW2tleV0pICYmXG4gICAgICAgIGlzUGxhaW5PYmplY3QoY29uZmlnVG9Db3B5W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgLy8gcmVjdXJzaXZlbHkgYXNzaWduIG9iamVjdCB2YWx1ZVxuICAgICAgICBjb3BpZWRba2V5XSA9IHRoaXMuY29weVdpZGdldENvbmZpZyhcbiAgICAgICAgICBjdXJyZW50Q29uZmlnW2tleV0sXG4gICAgICAgICAgY29uZmlnVG9Db3B5W2tleV1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAobm90TnVsbG9yVW5kZWZpbmVkKGNvbmZpZ1RvQ29weVtrZXldKSkge1xuICAgICAgICAvLyBjb3B5XG4gICAgICAgIGNvcGllZFtrZXldID0gY29uZmlnVG9Db3B5W2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBrZWVwIGV4aXN0aW5nXG4gICAgICAgIGNvcGllZFtrZXldID0gY3VycmVudENvbmZpZ1trZXldO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvcGllZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmaWVsZCB0byBsYXllciBjb2x1bW4sIHJldHVybiBjb2x1bW4gY29uZmlnXG4gICAqIEBwYXJhbSBrZXkgLSBDb2x1bW4gS2V5XG4gICAqIEBwYXJhbSBmaWVsZCAtIFNlbGVjdGVkIGZpZWxkXG4gICAqIEByZXR1cm5zIHt7fX0gLSBDb2x1bW4gY29uZmlnXG4gICAqL1xuICBhc3NpZ25Db2x1bW4oa2V5LCBmaWVsZCkge1xuICAgIC8vIGZpZWxkIHZhbHVlIGNvdWxkIGJlIG51bGwgZm9yIG9wdGlvbmFsIGNvbHVtbnNcbiAgICBjb25zdCB1cGRhdGUgPSBmaWVsZFxuICAgICAgPyB7XG4gICAgICAgICAgdmFsdWU6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgZmllbGRJZHg6IGZpZWxkLnRhYmxlRmllbGRJbmRleCAtIDFcbiAgICAgICAgfVxuICAgICAgOiB7dmFsdWU6IG51bGwsIGZpZWxkSWR4OiAtMX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25maWcuY29sdW1ucyxcbiAgICAgIFtrZXldOiB7XG4gICAgICAgIC4uLnRoaXMuY29uZmlnLmNvbHVtbnNba2V5XSxcbiAgICAgICAgLi4udXBkYXRlXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIl19