UNPKG

kepler.gl

Version:

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

189 lines (186 loc) 33.8 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 _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _imagePreview = _interopRequireDefault(require("../common/image-preview")); var _constants = require("@kepler.gl/constants"); var _styledComponents2 = require("../common/styled-components"); var _switch = _interopRequireDefault(require("../common/switch")); var _reactIntl = require("react-intl"); var _localization = require("@kepler.gl/localization"); var _templateObject; // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var ImageOptionList = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n flex-direction: column;\n gap: 16px;\n width: 250px;\n\n .image-option-section {\n .image-option-section-title {\n font-weight: 500;\n font-size: 14px;\n }\n }\n\n .button-list {\n display: flex;\n flex-direction: row;\n padding: 8px 0px;\n flex-wrap: wrap;\n gap: 4px;\n }\n\n .resolution-dropdown {\n padding: 0px;\n margin-top: 8px;\n margin-bottom: 8px;\n\n select {\n width: 100%;\n padding: 6px 12px;\n border: 1px solid #d3d3d3;\n border-radius: 2px;\n font-size: 14px;\n cursor: pointer;\n background-color: white;\n font-family: inherit;\n appearance: none;\n height: 32px;\n\n &:hover {\n border-color: #999;\n background-color: #f9f9f9;\n }\n\n &:focus {\n outline: none;\n border-color: #0066cc;\n box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1);\n }\n\n &:disabled {\n background-color: #f5f5f5;\n color: #999;\n cursor: not-allowed;\n }\n }\n }\n\n input {\n margin-right: 8px;\n }\n"]))); // Define resolution options for each ratio as constants var SCREEN_RESOLUTION_OPTIONS = [_constants.OneXResolutionOption, _constants.TwoXResolutionOption]; var FOUR_BY_THREE_RESOLUTION_OPTIONS = [_constants.Resolution1024x768Option, _constants.Resolution1280x960Option, _constants.Resolution1600x1200Option, _constants.Resolution1920x1440Option]; var SIXTEEN_BY_NINE_RESOLUTION_OPTIONS = [_constants.Resolution1280x720Option, _constants.Resolution1600x900Option, _constants.Resolution1920x1080Option, _constants.Resolution2560x1440Option]; var ExportImageModalFactory = function ExportImageModalFactory() { var ExportImageModal = function ExportImageModal(_ref) { var mapW = _ref.mapW, mapH = _ref.mapH, exportImage = _ref.exportImage, onUpdateImageSetting = _ref.onUpdateImageSetting, cleanupExportImage = _ref.cleanupExportImage, intl = _ref.intl; var legend = exportImage.legend, ratio = exportImage.ratio, resolution = exportImage.resolution; // Filter resolutions based on selected ratio var filteredResolutions = (0, _react.useMemo)(function () { if (ratio === _constants.EXPORT_IMG_RATIOS.SCREEN) { return SCREEN_RESOLUTION_OPTIONS; } else if (ratio === _constants.EXPORT_IMG_RATIOS.FOUR_BY_THREE) { return FOUR_BY_THREE_RESOLUTION_OPTIONS; } else if (ratio === _constants.EXPORT_IMG_RATIOS.SIXTEEN_BY_NINE) { return SIXTEEN_BY_NINE_RESOLUTION_OPTIONS; } // For CUSTOM, don't show resolution options return []; }, [ratio]); (0, _react.useEffect)(function () { onUpdateImageSetting({ exporting: true }); return cleanupExportImage; }, [onUpdateImageSetting, cleanupExportImage]); (0, _react.useEffect)(function () { if (mapH !== exportImage.mapH || mapW !== exportImage.mapW) { onUpdateImageSetting({ mapH: mapH, mapW: mapW }); } }, [mapH, mapW, exportImage, onUpdateImageSetting]); (0, _react.useEffect)(function () { // Keep resolution in sync with the selected ratio and available options. // If the current resolution is not available for this ratio, reset it to the first option. if (!filteredResolutions || !filteredResolutions.length) { return; } var isValidResolution = Boolean(resolution) && filteredResolutions.some(function (op) { return op.id === resolution; }); if (!isValidResolution) { onUpdateImageSetting({ resolution: filteredResolutions[0].id }); } }, [ratio, filteredResolutions, resolution, onUpdateImageSetting]); return /*#__PURE__*/_react["default"].createElement(_styledComponents2.StyledModalContent, { className: "export-image-modal" }, /*#__PURE__*/_react["default"].createElement(ImageOptionList, null, /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section" }, /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.exportImage.ratioTitle' })), /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.exportImage.ratioDescription' }), /*#__PURE__*/_react["default"].createElement("div", { className: "button-list", id: "export-image-modal__option_ratio" }, _constants.EXPORT_IMG_RATIO_OPTIONS.filter(function (op) { return !op.hidden; }).map(function (op) { return /*#__PURE__*/_react["default"].createElement(_styledComponents2.SelectionButton, { key: op.id, selected: ratio === op.id, onClick: function onClick() { return onUpdateImageSetting({ ratio: op.id }); } }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: op.label }), ratio === op.id && /*#__PURE__*/_react["default"].createElement(_styledComponents2.CheckMark, null)); }))), ratio !== _constants.EXPORT_IMG_RATIOS.CUSTOM && /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section" }, /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section-title", id: "export-image-modal__resolution-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.exportImage.resolutionTitle' })), /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.exportImage.resolutionDescription' }), ratio === _constants.EXPORT_IMG_RATIOS.SCREEN ? /*#__PURE__*/_react["default"].createElement("div", { className: "button-list", id: "export-image-modal__option_resolution" }, filteredResolutions.map(function (op) { return /*#__PURE__*/_react["default"].createElement(_styledComponents2.SelectionButton, { key: op.id, selected: resolution === op.id, onClick: function onClick() { return op.available && onUpdateImageSetting({ resolution: op.id }); } }, op.label, resolution === op.id && /*#__PURE__*/_react["default"].createElement(_styledComponents2.CheckMark, null)); })) : /*#__PURE__*/_react["default"].createElement("div", { className: "resolution-dropdown", id: "export-image-modal__option_resolution" }, /*#__PURE__*/_react["default"].createElement("select", { value: resolution || '', "aria-labelledby": "export-image-modal__resolution-title", onChange: function onChange(e) { var value = e.target.value; // Only update if a valid resolution is selected if (value && filteredResolutions.some(function (op) { return op.id === value; })) { // Type-safe: we've verified the value exists in filteredResolutions onUpdateImageSetting({ resolution: value }); } // If empty string selected, optionally reset to first available resolution else if (!value && filteredResolutions.length > 0) { onUpdateImageSetting({ resolution: filteredResolutions[0].id }); } } }, /*#__PURE__*/_react["default"].createElement("option", { value: "" }, intl.formatMessage({ id: 'modal.exportImage.resolutionPlaceholder' })), filteredResolutions.map(function (op) { return /*#__PURE__*/_react["default"].createElement("option", { key: op.id, value: op.id, disabled: !op.available }, op.label); })))), /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section" }, /*#__PURE__*/_react["default"].createElement("div", { className: "image-option-section-title" }, /*#__PURE__*/_react["default"].createElement(_localization.FormattedMessage, { id: 'modal.exportImage.mapLegendTitle' })), /*#__PURE__*/_react["default"].createElement(_switch["default"], { type: "checkbox", id: "add-map-legend", checked: legend, label: intl.formatMessage({ id: 'modal.exportImage.mapLegendAdd' }), onChange: function onChange() { return onUpdateImageSetting({ legend: !legend }); } }))), /*#__PURE__*/_react["default"].createElement(_imagePreview["default"], { exportImage: exportImage })); }; return (0, _reactIntl.injectIntl)(ExportImageModal); }; var _default = exports["default"] = ExportImageModalFactory; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfaW1hZ2VQcmV2aWV3IiwiX2NvbnN0YW50cyIsIl9zdHlsZWRDb21wb25lbnRzMiIsIl9zd2l0Y2giLCJfcmVhY3RJbnRsIiwiX2xvY2FsaXphdGlvbiIsIl90ZW1wbGF0ZU9iamVjdCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkltYWdlT3B0aW9uTGlzdCIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiU0NSRUVOX1JFU09MVVRJT05fT1BUSU9OUyIsIk9uZVhSZXNvbHV0aW9uT3B0aW9uIiwiVHdvWFJlc29sdXRpb25PcHRpb24iLCJGT1VSX0JZX1RIUkVFX1JFU09MVVRJT05fT1BUSU9OUyIsIlJlc29sdXRpb24xMDI0eDc2OE9wdGlvbiIsIlJlc29sdXRpb24xMjgweDk2ME9wdGlvbiIsIlJlc29sdXRpb24xNjAweDEyMDBPcHRpb24iLCJSZXNvbHV0aW9uMTkyMHgxNDQwT3B0aW9uIiwiU0lYVEVFTl9CWV9OSU5FX1JFU09MVVRJT05fT1BUSU9OUyIsIlJlc29sdXRpb24xMjgweDcyME9wdGlvbiIsIlJlc29sdXRpb24xNjAweDkwME9wdGlvbiIsIlJlc29sdXRpb24xOTIweDEwODBPcHRpb24iLCJSZXNvbHV0aW9uMjU2MHgxNDQwT3B0aW9uIiwiRXhwb3J0SW1hZ2VNb2RhbEZhY3RvcnkiLCJFeHBvcnRJbWFnZU1vZGFsIiwiX3JlZiIsIm1hcFciLCJtYXBIIiwiZXhwb3J0SW1hZ2UiLCJvblVwZGF0ZUltYWdlU2V0dGluZyIsImNsZWFudXBFeHBvcnRJbWFnZSIsImludGwiLCJsZWdlbmQiLCJyYXRpbyIsInJlc29sdXRpb24iLCJmaWx0ZXJlZFJlc29sdXRpb25zIiwidXNlTWVtbyIsIkVYUE9SVF9JTUdfUkFUSU9TIiwiU0NSRUVOIiwiRk9VUl9CWV9USFJFRSIsIlNJWFRFRU5fQllfTklORSIsInVzZUVmZmVjdCIsImV4cG9ydGluZyIsImxlbmd0aCIsImlzVmFsaWRSZXNvbHV0aW9uIiwiQm9vbGVhbiIsInNvbWUiLCJvcCIsImlkIiwiY3JlYXRlRWxlbWVudCIsIlN0eWxlZE1vZGFsQ29udGVudCIsImNsYXNzTmFtZSIsIkZvcm1hdHRlZE1lc3NhZ2UiLCJFWFBPUlRfSU1HX1JBVElPX09QVElPTlMiLCJmaWx0ZXIiLCJoaWRkZW4iLCJtYXAiLCJTZWxlY3Rpb25CdXR0b24iLCJrZXkiLCJzZWxlY3RlZCIsIm9uQ2xpY2siLCJsYWJlbCIsIkNoZWNrTWFyayIsIkNVU1RPTSIsImF2YWlsYWJsZSIsInZhbHVlIiwib25DaGFuZ2UiLCJ0YXJnZXQiLCJmb3JtYXRNZXNzYWdlIiwiZGlzYWJsZWQiLCJ0eXBlIiwiY2hlY2tlZCIsImluamVjdEludGwiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kYWxzL2V4cG9ydC1pbWFnZS1tb2RhbC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFJlYWN0LCB7dXNlRWZmZWN0LCB1c2VNZW1vfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBJbWFnZVByZXZpZXcgZnJvbSAnLi4vY29tbW9uL2ltYWdlLXByZXZpZXcnO1xuaW1wb3J0IHtTZXRFeHBvcnRJbWFnZVNldHRpbmdVcGRhdGVyQWN0aW9ufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5pbXBvcnQge1xuICBFWFBPUlRfSU1HX1JBVElPX09QVElPTlMsXG4gIEVYUE9SVF9JTUdfUkFUSU9TLFxuICBPbmVYUmVzb2x1dGlvbk9wdGlvbixcbiAgVHdvWFJlc29sdXRpb25PcHRpb24sXG4gIFJlc29sdXRpb24xMDI0eDc2OE9wdGlvbixcbiAgUmVzb2x1dGlvbjEyODB4OTYwT3B0aW9uLFxuICBSZXNvbHV0aW9uMTYwMHgxMjAwT3B0aW9uLFxuICBSZXNvbHV0aW9uMTkyMHgxNDQwT3B0aW9uLFxuICBSZXNvbHV0aW9uMTI4MHg3MjBPcHRpb24sXG4gIFJlc29sdXRpb24xNjAweDkwME9wdGlvbixcbiAgUmVzb2x1dGlvbjE5MjB4MTA4ME9wdGlvbixcbiAgUmVzb2x1dGlvbjI1NjB4MTQ0ME9wdGlvblxufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7RXhwb3J0UmVzb2x1dGlvbk9wdGlvbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUge0V4cG9ydEltYWdlfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7U3R5bGVkTW9kYWxDb250ZW50LCBTZWxlY3Rpb25CdXR0b24sIENoZWNrTWFya30gZnJvbSAnLi4vY29tbW9uL3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi4vY29tbW9uL3N3aXRjaCc7XG5pbXBvcnQge2luamVjdEludGwsIEludGxTaGFwZX0gZnJvbSAncmVhY3QtaW50bCc7XG5pbXBvcnQge0Zvcm1hdHRlZE1lc3NhZ2V9IGZyb20gJ0BrZXBsZXIuZ2wvbG9jYWxpemF0aW9uJztcblxuY29uc3QgSW1hZ2VPcHRpb25MaXN0ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxNnB4O1xuICB3aWR0aDogMjUwcHg7XG5cbiAgLmltYWdlLW9wdGlvbi1zZWN0aW9uIHtcbiAgICAuaW1hZ2Utb3B0aW9uLXNlY3Rpb24tdGl0bGUge1xuICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB9XG4gIH1cblxuICAuYnV0dG9uLWxpc3Qge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBwYWRkaW5nOiA4cHggMHB4O1xuICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICBnYXA6IDRweDtcbiAgfVxuXG4gIC5yZXNvbHV0aW9uLWRyb3Bkb3duIHtcbiAgICBwYWRkaW5nOiAwcHg7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDhweDtcblxuICAgIHNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2QzZDNkMztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xuICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgaGVpZ2h0OiAzMnB4O1xuXG4gICAgICAmOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjOTk5O1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5O1xuICAgICAgfVxuXG4gICAgICAmOmZvY3VzIHtcbiAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiAjMDA2NmNjO1xuICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAzcHggcmdiYSgwLCAxMDIsIDIwNCwgMC4xKTtcbiAgICAgIH1cblxuICAgICAgJjpkaXNhYmxlZCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG4gICAgICAgIGNvbG9yOiAjOTk5O1xuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlucHV0IHtcbiAgICBtYXJnaW4tcmlnaHQ6IDhweDtcbiAgfVxuYDtcblxuLy8gRGVmaW5lIHJlc29sdXRpb24gb3B0aW9ucyBmb3IgZWFjaCByYXRpbyBhcyBjb25zdGFudHNcbmNvbnN0IFNDUkVFTl9SRVNPTFVUSU9OX09QVElPTlMgPSBbT25lWFJlc29sdXRpb25PcHRpb24sIFR3b1hSZXNvbHV0aW9uT3B0aW9uXTtcblxuY29uc3QgRk9VUl9CWV9USFJFRV9SRVNPTFVUSU9OX09QVElPTlMgPSBbXG4gIFJlc29sdXRpb24xMDI0eDc2OE9wdGlvbixcbiAgUmVzb2x1dGlvbjEyODB4OTYwT3B0aW9uLFxuICBSZXNvbHV0aW9uMTYwMHgxMjAwT3B0aW9uLFxuICBSZXNvbHV0aW9uMTkyMHgxNDQwT3B0aW9uXG5dO1xuXG5jb25zdCBTSVhURUVOX0JZX05JTkVfUkVTT0xVVElPTl9PUFRJT05TID0gW1xuICBSZXNvbHV0aW9uMTI4MHg3MjBPcHRpb24sXG4gIFJlc29sdXRpb24xNjAweDkwME9wdGlvbixcbiAgUmVzb2x1dGlvbjE5MjB4MTA4ME9wdGlvbixcbiAgUmVzb2x1dGlvbjI1NjB4MTQ0ME9wdGlvblxuXTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRJbWFnZU1vZGFsUHJvcHMge1xuICBleHBvcnRJbWFnZTogRXhwb3J0SW1hZ2U7XG4gIG1hcFc6IG51bWJlcjtcbiAgbWFwSDogbnVtYmVyO1xuICBvblVwZGF0ZUltYWdlU2V0dGluZzogKHBheWxvYWQ6IFNldEV4cG9ydEltYWdlU2V0dGluZ1VwZGF0ZXJBY3Rpb25bJ3BheWxvYWQnXSkgPT4gdm9pZDtcbiAgY2xlYW51cEV4cG9ydEltYWdlOiAoKSA9PiB2b2lkO1xuICBpbnRsOiBJbnRsU2hhcGU7XG59XG5cbmNvbnN0IEV4cG9ydEltYWdlTW9kYWxGYWN0b3J5ID0gKCkgPT4ge1xuICBjb25zdCBFeHBvcnRJbWFnZU1vZGFsOiBSZWFjdC5GQzxFeHBvcnRJbWFnZU1vZGFsUHJvcHM+ID0gKHtcbiAgICBtYXBXLFxuICAgIG1hcEgsXG4gICAgZXhwb3J0SW1hZ2UsXG4gICAgb25VcGRhdGVJbWFnZVNldHRpbmcsXG4gICAgY2xlYW51cEV4cG9ydEltYWdlLFxuICAgIGludGxcbiAgfSkgPT4ge1xuICAgIGNvbnN0IHtsZWdlbmQsIHJhdGlvLCByZXNvbHV0aW9ufSA9IGV4cG9ydEltYWdlO1xuXG4gICAgLy8gRmlsdGVyIHJlc29sdXRpb25zIGJhc2VkIG9uIHNlbGVjdGVkIHJhdGlvXG4gICAgY29uc3QgZmlsdGVyZWRSZXNvbHV0aW9ucyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgaWYgKHJhdGlvID09PSBFWFBPUlRfSU1HX1JBVElPUy5TQ1JFRU4pIHtcbiAgICAgICAgcmV0dXJuIFNDUkVFTl9SRVNPTFVUSU9OX09QVElPTlM7XG4gICAgICB9IGVsc2UgaWYgKHJhdGlvID09PSBFWFBPUlRfSU1HX1JBVElPUy5GT1VSX0JZX1RIUkVFKSB7XG4gICAgICAgIHJldHVybiBGT1VSX0JZX1RIUkVFX1JFU09MVVRJT05fT1BUSU9OUztcbiAgICAgIH0gZWxzZSBpZiAocmF0aW8gPT09IEVYUE9SVF9JTUdfUkFUSU9TLlNJWFRFRU5fQllfTklORSkge1xuICAgICAgICByZXR1cm4gU0lYVEVFTl9CWV9OSU5FX1JFU09MVVRJT05fT1BUSU9OUztcbiAgICAgIH1cbiAgICAgIC8vIEZvciBDVVNUT00sIGRvbid0IHNob3cgcmVzb2x1dGlvbiBvcHRpb25zXG4gICAgICByZXR1cm4gW107XG4gICAgfSwgW3JhdGlvXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmcoe1xuICAgICAgICBleHBvcnRpbmc6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNsZWFudXBFeHBvcnRJbWFnZTtcbiAgICB9LCBbb25VcGRhdGVJbWFnZVNldHRpbmcsIGNsZWFudXBFeHBvcnRJbWFnZV0pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIGlmIChtYXBIICE9PSBleHBvcnRJbWFnZS5tYXBIIHx8IG1hcFcgIT09IGV4cG9ydEltYWdlLm1hcFcpIHtcbiAgICAgICAgb25VcGRhdGVJbWFnZVNldHRpbmcoe1xuICAgICAgICAgIG1hcEgsXG4gICAgICAgICAgbWFwV1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCBbbWFwSCwgbWFwVywgZXhwb3J0SW1hZ2UsIG9uVXBkYXRlSW1hZ2VTZXR0aW5nXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gS2VlcCByZXNvbHV0aW9uIGluIHN5bmMgd2l0aCB0aGUgc2VsZWN0ZWQgcmF0aW8gYW5kIGF2YWlsYWJsZSBvcHRpb25zLlxuICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcmVzb2x1dGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHJhdGlvLCByZXNldCBpdCB0byB0aGUgZmlyc3Qgb3B0aW9uLlxuICAgICAgaWYgKCFmaWx0ZXJlZFJlc29sdXRpb25zIHx8ICFmaWx0ZXJlZFJlc29sdXRpb25zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzVmFsaWRSZXNvbHV0aW9uID1cbiAgICAgICAgQm9vbGVhbihyZXNvbHV0aW9uKSAmJiBmaWx0ZXJlZFJlc29sdXRpb25zLnNvbWUob3AgPT4gb3AuaWQgPT09IHJlc29sdXRpb24pO1xuXG4gICAgICBpZiAoIWlzVmFsaWRSZXNvbHV0aW9uKSB7XG4gICAgICAgIG9uVXBkYXRlSW1hZ2VTZXR0aW5nKHtyZXNvbHV0aW9uOiBmaWx0ZXJlZFJlc29sdXRpb25zWzBdLmlkfSk7XG4gICAgICB9XG4gICAgfSwgW3JhdGlvLCBmaWx0ZXJlZFJlc29sdXRpb25zLCByZXNvbHV0aW9uLCBvblVwZGF0ZUltYWdlU2V0dGluZ10pO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxTdHlsZWRNb2RhbENvbnRlbnQgY2xhc3NOYW1lPVwiZXhwb3J0LWltYWdlLW1vZGFsXCI+XG4gICAgICAgIDxJbWFnZU9wdGlvbkxpc3Q+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZS1vcHRpb24tc2VjdGlvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZS1vcHRpb24tc2VjdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmV4cG9ydEltYWdlLnJhdGlvVGl0bGUnfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmV4cG9ydEltYWdlLnJhdGlvRGVzY3JpcHRpb24nfSAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJidXR0b24tbGlzdFwiIGlkPVwiZXhwb3J0LWltYWdlLW1vZGFsX19vcHRpb25fcmF0aW9cIj5cbiAgICAgICAgICAgICAge0VYUE9SVF9JTUdfUkFUSU9fT1BUSU9OUy5maWx0ZXIob3AgPT4gIW9wLmhpZGRlbikubWFwKG9wID0+IChcbiAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQnV0dG9uXG4gICAgICAgICAgICAgICAgICBrZXk9e29wLmlkfVxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9e3JhdGlvID09PSBvcC5pZH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uVXBkYXRlSW1hZ2VTZXR0aW5nKHtyYXRpbzogb3AuaWR9KX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17b3AubGFiZWx9IC8+XG4gICAgICAgICAgICAgICAgICB7cmF0aW8gPT09IG9wLmlkICYmIDxDaGVja01hcmsgLz59XG4gICAgICAgICAgICAgICAgPC9TZWxlY3Rpb25CdXR0b24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAge3JhdGlvICE9PSBFWFBPUlRfSU1HX1JBVElPUy5DVVNUT00gJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbWFnZS1vcHRpb24tc2VjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlLW9wdGlvbi1zZWN0aW9uLXRpdGxlXCIgaWQ9XCJleHBvcnQtaW1hZ2UtbW9kYWxfX3Jlc29sdXRpb24tdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmV4cG9ydEltYWdlLnJlc29sdXRpb25UaXRsZSd9IC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSBpZD17J21vZGFsLmV4cG9ydEltYWdlLnJlc29sdXRpb25EZXNjcmlwdGlvbid9IC8+XG4gICAgICAgICAgICAgIHtyYXRpbyA9PT0gRVhQT1JUX0lNR19SQVRJT1MuU0NSRUVOID8gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYnV0dG9uLWxpc3RcIiBpZD1cImV4cG9ydC1pbWFnZS1tb2RhbF9fb3B0aW9uX3Jlc29sdXRpb25cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFJlc29sdXRpb25zLm1hcChvcCA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e29wLmlkfVxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtyZXNvbHV0aW9uID09PSBvcC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvcC5hdmFpbGFibGUgJiYgb25VcGRhdGVJbWFnZVNldHRpbmcoe3Jlc29sdXRpb246IG9wLmlkfSl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7b3AubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAge3Jlc29sdXRpb24gPT09IG9wLmlkICYmIDxDaGVja01hcmsgLz59XG4gICAgICAgICAgICAgICAgICAgIDwvU2VsZWN0aW9uQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZXNvbHV0aW9uLWRyb3Bkb3duXCIgaWQ9XCJleHBvcnQtaW1hZ2UtbW9kYWxfX29wdGlvbl9yZXNvbHV0aW9uXCI+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtyZXNvbHV0aW9uIHx8ICcnfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9XCJleHBvcnQtaW1hZ2UtbW9kYWxfX3Jlc29sdXRpb24tdGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBpZiBhIHZhbGlkIHJlc29sdXRpb24gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgZmlsdGVyZWRSZXNvbHV0aW9ucy5zb21lKG9wID0+IG9wLmlkID09PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGUtc2FmZTogd2UndmUgdmVyaWZpZWQgdGhlIHZhbHVlIGV4aXN0cyBpbiBmaWx0ZXJlZFJlc29sdXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZUltYWdlU2V0dGluZyh7cmVzb2x1dGlvbjogdmFsdWUgYXMgRXhwb3J0UmVzb2x1dGlvbk9wdGlvbn0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBlbXB0eSBzdHJpbmcgc2VsZWN0ZWQsIG9wdGlvbmFsbHkgcmVzZXQgdG8gZmlyc3QgYXZhaWxhYmxlIHJlc29sdXRpb25cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghdmFsdWUgJiYgZmlsdGVyZWRSZXNvbHV0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblVwZGF0ZUltYWdlU2V0dGluZyh7cmVzb2x1dGlvbjogZmlsdGVyZWRSZXNvbHV0aW9uc1swXS5pZH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgIHtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuZXhwb3J0SW1hZ2UucmVzb2x1dGlvblBsYWNlaG9sZGVyJ30pfVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUmVzb2x1dGlvbnMubWFwKG9wID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3AuaWR9IHZhbHVlPXtvcC5pZH0gZGlzYWJsZWQ9eyFvcC5hdmFpbGFibGV9PlxuICAgICAgICAgICAgICAgICAgICAgICAge29wLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlLW9wdGlvbi1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlLW9wdGlvbi1zZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIGlkPXsnbW9kYWwuZXhwb3J0SW1hZ2UubWFwTGVnZW5kVGl0bGUnfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8U3dpdGNoXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgIGlkPVwiYWRkLW1hcC1sZWdlbmRcIlxuICAgICAgICAgICAgICBjaGVja2VkPXtsZWdlbmR9XG4gICAgICAgICAgICAgIGxhYmVsPXtpbnRsLmZvcm1hdE1lc3NhZ2Uoe2lkOiAnbW9kYWwuZXhwb3J0SW1hZ2UubWFwTGVnZW5kQWRkJ30pfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KCkgPT4gb25VcGRhdGVJbWFnZVNldHRpbmcoe2xlZ2VuZDogIWxlZ2VuZH0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9JbWFnZU9wdGlvbkxpc3Q+XG4gICAgICAgIDxJbWFnZVByZXZpZXcgZXhwb3J0SW1hZ2U9e2V4cG9ydEltYWdlfSAvPlxuICAgICAgPC9TdHlsZWRNb2RhbENvbnRlbnQ+XG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gaW5qZWN0SW50bChFeHBvcnRJbWFnZU1vZGFsKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydEltYWdlTW9kYWxGYWN0b3J5O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxpQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsYUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBR0EsSUFBQUksVUFBQSxHQUFBSixPQUFBO0FBZ0JBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxP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Q0Y7SUFBRSxnQkFFRjFFLE1BQUEsWUFBQTJFLGFBQUE7TUFBUWdCLEtBQUssRUFBQztJQUFFLEdBQ2JsQyxJQUFJLENBQUNxQyxhQUFhLENBQUM7TUFBQ3BCLEVBQUUsRUFBRTtJQUF5QyxDQUFDLENBQzdELENBQUMsRUFDUmIsbUJBQW1CLENBQUNxQixHQUFHLENBQUMsVUFBQVQsRUFBRTtNQUFBLG9CQUN6QnpFLE1BQUEsWUFBQTJFLGFBQUE7UUFBUVMsR0FBRyxFQUFFWCxFQUFFLENBQUNDLEVBQUc7UUFBQ2lCLEtBQUssRUFBRWxCLEVBQUUsQ0FBQ0MsRUFBRztRQUFDcUIsUUFBUSxFQUFFLENBQUN0QixFQUFFLENBQUNpQjtNQUFVLEdBQ3ZEakIsRUFBRSxDQUFDYyxLQUNFLENBQUM7SUFBQSxDQUNWLENBQ0ssQ0FDTCxDQUVKLENBQ04sZUFDRHZGLE1BQUEsWUFBQTJFLGFBQUE7TUFBS0UsU0FBUyxFQUFDO0lBQXNCLGdCQUNuQzdFLE1BQUEsWUFBQTJFLGFBQUE7TUFBS0UsU0FBUyxFQUFDO0lBQTRCLGdCQUN6QzdFLE1BQUEsWUFBQTJFLGFBQUEsQ0FBQ2pFLGFBQUEsQ0FBQW9FLGdCQUFnQjtNQUFDSixFQUFFLEVBQUU7SUFBbUMsQ0FBRSxDQUN4RCxDQUFDLGVBQ04xRSxNQUFBLFlBQUEyRSxhQUFBLENBQUNuRSxPQUFBLFdBQU07TUFDTHdGLElBQUksRUFBQyxVQUFVO01BQ2Z0QixFQUFFLEVBQUMsZ0JBQWdCO01BQ25CdUIsT0FBTyxFQUFFdkMsTUFBTztNQUNoQjZCLEtBQUssRUFBRTlCLElBQUksQ0FBQ3FDLGFBQWEsQ0FBQztRQUFDcEIsRUFBRSxFQUFFO01BQWdDLENBQUMsQ0FBRTtNQUNsRWtCLFFBQVEsRUFBRSxTQUFWQSxRQUFRQSxDQUFBO1FBQUEsT0FBUXJDLG9CQUFvQixDQUFDO1VBQUNHLE1BQU0sRUFBRSxDQUFDQTtRQUFNLENBQUMsQ0FBQztNQUFBO0lBQUMsQ0FDekQsQ0FDRSxDQUNVLENBQUMsZUFDbEIxRCxNQUFBLFlBQUEyRSxhQUFBLENBQUN0RSxhQUFBLFdBQVk7TUFBQ2lELFdBQVcsRUFBRUE7SUFBWSxDQUFFLENBQ3ZCLENBQUM7RUFFekIsQ0FBQztFQUVELE9BQU8sSUFBQTRDLHFCQUFVLEVBQUNoRCxnQkFBZ0IsQ0FBQztBQUNyQyxDQUFDO0FBQUMsSUFBQWlELFFBQUEsR0FBQUMsT0FBQSxjQUVhbkQsdUJBQXVCIiwiaWdub3JlTGlzdCI6W119