UNPKG

kepler.gl

Version:

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

209 lines (206 loc) 38.4 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; exports.getDatasetAttributesFromRasterTile = getDatasetAttributesFromRasterTile; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); 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 _commonUtils = require("@kepler.gl/common-utils"); var _constants = require("@kepler.gl/constants"); var _table = require("@kepler.gl/table"); var _utils = require("@kepler.gl/utils"); var _useFetchRasterTileMetadata = _interopRequireDefault(require("../../hooks/use-fetch-raster-tile-metadata")); var _common = require("../../common"); var _icons = require("../../common/icons"); var _templateObject, _templateObject2, _templateObject3, _templateObject4; // 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; } 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 TilesetInputContainer = _styledComponents["default"].div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n display: grid;\n grid-template-rows: repeat(3, 1fr);\n row-gap: 0px;\n font-size: 12px;\n"]))); var TilesetInputDescription = _styledComponents["default"].div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n text-align: center;\n color: ", ";\n font-size: 11px;\n"])), function (props) { return props.theme.AZURE200; }); var LabelRow = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["\n display: flex;\n align-items: center;\n"]))); function getDatasetAttributesFromRasterTile(_ref) { var name = _ref.name, metadataUrl = _ref.metadataUrl, rasterTileServerUrls = _ref.rasterTileServerUrls; var appConfig = (0, _utils.getApplicationConfig)(); return { name: name, type: _constants.DatasetType.RASTER_TILE, metadata: _objectSpread(_objectSpread({ metadataUrl: metadataUrl }, rasterTileServerUrls ? { rasterTileServerUrls: rasterTileServerUrls } : {}), {}, { // Persist raster server-related application config with the layer rasterServerUseLatestTitiler: appConfig.rasterServerUseLatestTitiler, rasterServerSupportsElevation: appConfig.rasterServerSupportsElevation, rasterServerMaxRetries: appConfig.rasterServerMaxRetries, rasterServerRetryDelay: appConfig.rasterServerRetryDelay, rasterServerServerErrorsToRetry: appConfig.rasterServerServerErrorsToRetry, rasterServerMaxPerServerRequests: appConfig.rasterServerMaxPerServerRequests }) }; } var InfoIconLink = _styledComponents["default"].a(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["\n margin-left: 4px;\n color: ", ";\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n line-height: 0;\n vertical-align: middle;\n opacity: 0.7;\n\n &:hover {\n opacity: 1;\n }\n\n svg {\n display: block;\n }\n"])), function (props) { return props.theme.labelColor; }); var RASTER_TILE_DOCUMENTATION_URL = 'https://docs.kepler.gl/docs/user-guides/c-types-of-layers/n-raster-tile-layer'; var parseMetadataAllowCollections = function parseMetadataAllowCollections(metadata, _ref2) { var metadataUrl = _ref2.metadataUrl, rasterTileType = _ref2.rasterTileType; return rasterTileType === _constants.RasterTileType.PMTILES ? (0, _table.parseVectorMetadata)(metadata, { tileUrl: metadataUrl }) : (0, _table.parseRasterMetadata)(metadata, { allowCollections: true }); }; var RasterTileForm = function RasterTileForm(_ref3) { var setResponse = _ref3.setResponse; var _useState = (0, _react.useState)(''), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), tileName = _useState2[0], setTileName = _useState2[1]; var _useState3 = (0, _react.useState)(false), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), tileNameWasModified = _useState4[0], setTileNameWasModified = _useState4[1]; var _useState5 = (0, _react.useState)(''), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), metadataUrl = _useState6[0], setMetadataUrl = _useState6[1]; var _useState7 = (0, _react.useState)(((0, _utils.getApplicationConfig)().rasterServerUrls || []).join(',')), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), rasterTileServerUrls = _useState8[0], setRasterTileServerUrls = _useState8[1]; // Remove trailing slash to prevent issues with raster tile servers var clearedMetadataUrl = metadataUrl.endsWith('/') ? metadataUrl.slice(0, -1) : metadataUrl; var onTileNameChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setTileNameWasModified(true); setTileName(event.target.value); }, [setTileName]); var onMetadataUrlChange = (0, _react.useCallback)(function (event) { event.preventDefault(); var value = event.target.value; setMetadataUrl(value); if (!tileNameWasModified) { setTileName(value.split('/').filter(Boolean).pop() || ''); } }, [tileNameWasModified]); var onRasterTileServerUrlsChange = (0, _react.useCallback)(function (event) { event.preventDefault(); setRasterTileServerUrls(event.target.value); }, [setRasterTileServerUrls]); var _useFetchJson = (0, _useFetchRasterTileMetadata["default"])({ url: clearedMetadataUrl, rasterTileType: (0, _commonUtils.isPMTilesUrl)(clearedMetadataUrl) ? _constants.RasterTileType.PMTILES : _constants.RasterTileType.STAC, process: parseMetadataAllowCollections }), metadata = _useFetchJson.data, loading = _useFetchJson.loading, metaError = _useFetchJson.error; (0, _react.useEffect)(function () { if (tileName && clearedMetadataUrl) { var pmtilesType = metadata === null || metadata === void 0 ? void 0 : metadata.pmtilesType; if (pmtilesType === _constants.PMTilesType.MVT) { return setResponse({ metadata: metadata, dataset: null, loading: loading, error: new Error('For .pmtiles in mvt format, please use the Vector Tile form.') }); } var error = metaError; // check for raster tile servers for STAC items and collections var rasterTileServers; if (!error // We still need raster tile servers for PMTiles when we plan to use elevation ) { rasterTileServers = rasterTileServerUrls.split(',').map(function (server) { return server.trim(); }).filter(function (server) { return server; }); if (rasterTileServers.length < 1 || !rasterTileServers.every(function (server) { return (0, _commonUtils.validateUrl)(server); })) { if (pmtilesType) { // For raster tiles elevation support is optional // TODO display a warning, but not a blocking error rasterTileServers = []; } else { error = new Error('Provide valid raster tile server urls to support STAC and elevations.'); } } } var dataset = getDatasetAttributesFromRasterTile({ name: tileName, metadataUrl: clearedMetadataUrl, rasterTileServerUrls: rasterTileServers }); setResponse({ metadata: metadata, dataset: dataset, loading: loading, error: error }); } else { setResponse({ metadata: metadata, dataset: null, loading: loading, error: metaError }); } }, [metadata, loading, metaError, tileName, clearedMetadataUrl, rasterTileServerUrls, setResponse]); var showServerInput = (0, _utils.getApplicationConfig)().rasterServerShowServerInput; return /*#__PURE__*/_react["default"].createElement(TilesetInputContainer, null, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tileset-name" }, "Name"), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tileset-name", placeholder: "Name your tileset", value: tileName, onChange: onTileNameChange })), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(LabelRow, null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tile-metadata" }, "Tileset metadata URL"), /*#__PURE__*/_react["default"].createElement(InfoIconLink, { href: RASTER_TILE_DOCUMENTATION_URL, target: "_blank", rel: "noopener noreferrer", "aria-label": "Open Raster Tile Layer documentation" }, /*#__PURE__*/_react["default"].createElement(_icons.Help, { height: "16px" }))), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tile-metadata", placeholder: "Tileset metadata URL", value: metadataUrl !== null && metadataUrl !== void 0 ? metadataUrl : undefined, onChange: onMetadataUrlChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Supports raster .pmtiles. Limited support for STAC Items and Collections.")), showServerInput && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(LabelRow, null, /*#__PURE__*/_react["default"].createElement("label", { htmlFor: "tileset-raster-servers" }, "Raster tile servers"), /*#__PURE__*/_react["default"].createElement(InfoIconLink, { href: RASTER_TILE_DOCUMENTATION_URL, target: "_blank", rel: "noopener noreferrer", "aria-label": "Open Raster Tile Layer documentation" }, /*#__PURE__*/_react["default"].createElement(_icons.Help, { height: "16px" }))), /*#__PURE__*/_react["default"].createElement(_common.InputLight, { id: "tileset-raster-servers", placeholder: "Raster tile servers (separated by commas)", value: rasterTileServerUrls, onChange: onRasterTileServerUrlsChange }), /*#__PURE__*/_react["default"].createElement(TilesetInputDescription, null, "Raster tile server URLs for Cloud Optimized GeoTIFF tilesets and elevation."))); }; var _default = exports["default"] = RasterTileForm; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfc3R5bGVkQ29tcG9uZW50cyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX3RhYmxlIiwiX3V0aWxzIiwiX3VzZUZldGNoUmFzdGVyVGlsZU1ldGFkYXRhIiwiX2NvbW1vbiIsIl9pY29ucyIsIl90ZW1wbGF0ZU9iamVjdCIsIl90ZW1wbGF0ZU9iamVjdDIiLCJfdGVtcGxhdGVPYmplY3QzIiwiX3RlbXBsYXRlT2JqZWN0NCIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIlRpbGVzZXRJbnB1dENvbnRhaW5lciIsInN0eWxlZCIsImRpdiIsIl90YWdnZWRUZW1wbGF0ZUxpdGVyYWwyIiwiVGlsZXNldElucHV0RGVzY3JpcHRpb24iLCJwcm9wcyIsInRoZW1lIiwiQVpVUkUyMDAiLCJMYWJlbFJvdyIsImdldERhdGFzZXRBdHRyaWJ1dGVzRnJvbVJhc3RlclRpbGUiLCJfcmVmIiwibmFtZSIsIm1ldGFkYXRhVXJsIiwicmFzdGVyVGlsZVNlcnZlclVybHMiLCJhcHBDb25maWciLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInR5cGUiLCJEYXRhc2V0VHlwZSIsIlJBU1RFUl9USUxFIiwibWV0YWRhdGEiLCJyYXN0ZXJTZXJ2ZXJVc2VMYXRlc3RUaXRpbGVyIiwicmFzdGVyU2VydmVyU3VwcG9ydHNFbGV2YXRpb24iLCJyYXN0ZXJTZXJ2ZXJNYXhSZXRyaWVzIiwicmFzdGVyU2VydmVyUmV0cnlEZWxheSIsInJhc3RlclNlcnZlclNlcnZlckVycm9yc1RvUmV0cnkiLCJyYXN0ZXJTZXJ2ZXJNYXhQZXJTZXJ2ZXJSZXF1ZXN0cyIsIkluZm9JY29uTGluayIsImxhYmVsQ29sb3IiLCJSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTCIsInBhcnNlTWV0YWRhdGFBbGxvd0NvbGxlY3Rpb25zIiwiX3JlZjIiLCJyYXN0ZXJUaWxlVHlwZSIsIlJhc3RlclRpbGVUeXBlIiwiUE1USUxFUyIsInBhcnNlVmVjdG9yTWV0YWRhdGEiLCJ0aWxlVXJsIiwicGFyc2VSYXN0ZXJNZXRhZGF0YSIsImFsbG93Q29sbGVjdGlvbnMiLCJSYXN0ZXJUaWxlRm9ybSIsIl9yZWYzIiwic2V0UmVzcG9uc2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJ0aWxlTmFtZSIsInNldFRpbGVOYW1lIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJ0aWxlTmFtZVdhc01vZGlmaWVkIiwic2V0VGlsZU5hbWVXYXNNb2RpZmllZCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2V0TWV0YWRhdGFVcmwiLCJfdXNlU3RhdGU3IiwicmFzdGVyU2VydmVyVXJscyIsImpvaW4iLCJfdXNlU3RhdGU4Iiwic2V0UmFzdGVyVGlsZVNlcnZlclVybHMiLCJjbGVhcmVkTWV0YWRhdGFVcmwiLCJlbmRzV2l0aCIsInNsaWNlIiwib25UaWxlTmFtZUNoYW5nZSIsInVzZUNhbGxiYWNrIiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsInZhbHVlIiwib25NZXRhZGF0YVVybENoYW5nZSIsInNwbGl0IiwiQm9vbGVhbiIsInBvcCIsIm9uUmFzdGVyVGlsZVNlcnZlclVybHNDaGFuZ2UiLCJfdXNlRmV0Y2hKc29uIiwidXNlRmV0Y2hKc29uIiwidXJsIiwiaXNQTVRpbGVzVXJsIiwiU1RBQyIsInByb2Nlc3MiLCJkYXRhIiwibG9hZGluZyIsIm1ldGFFcnJvciIsImVycm9yIiwidXNlRWZmZWN0IiwicG10aWxlc1R5cGUiLCJQTVRpbGVzVHlwZSIsIk1WVCIsImRhdGFzZXQiLCJFcnJvciIsInJhc3RlclRpbGVTZXJ2ZXJzIiwibWFwIiwic2VydmVyIiwidHJpbSIsImV2ZXJ5IiwidmFsaWRhdGVVcmwiLCJzaG93U2VydmVySW5wdXQiLCJyYXN0ZXJTZXJ2ZXJTaG93U2VydmVySW5wdXQiLCJjcmVhdGVFbGVtZW50IiwiaHRtbEZvciIsIklucHV0TGlnaHQiLCJpZCIsInBsYWNlaG9sZGVyIiwib25DaGFuZ2UiLCJocmVmIiwicmVsIiwiSGVscCIsImhlaWdodCIsInVuZGVmaW5lZCIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RhbHMvdGlsZXNldHMtbW9kYWxzL3RpbGVzZXQtcmFzdGVyLWZvcm0udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBSZWFjdCwge3VzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcblxuaW1wb3J0IHtQTVRpbGVzTWV0YWRhdGF9IGZyb20gJ0Bsb2FkZXJzLmdsL3BtdGlsZXMnO1xuXG5pbXBvcnQge2lzUE1UaWxlc1VybCwgdmFsaWRhdGVVcmx9IGZyb20gJ0BrZXBsZXIuZ2wvY29tbW9uLXV0aWxzJztcbmltcG9ydCB7RGF0YXNldFR5cGUsIFJhc3RlclRpbGVUeXBlLCBQTVRpbGVzVHlwZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtKc29uT2JqZWN0T3JBcnJheX0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge3BhcnNlUmFzdGVyTWV0YWRhdGEsIHBhcnNlVmVjdG9yTWV0YWRhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtnZXRBcHBsaWNhdGlvbkNvbmZpZ30gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5cbmltcG9ydCB7ZGVmYXVsdCBhcyB1c2VGZXRjaEpzb259IGZyb20gJy4uLy4uL2hvb2tzL3VzZS1mZXRjaC1yYXN0ZXItdGlsZS1tZXRhZGF0YSc7XG5pbXBvcnQge0RhdGFzZXRDcmVhdGlvbkF0dHJpYnV0ZXMsIE1ldGFSZXNwb25zZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dExpZ2h0fSBmcm9tICcuLi8uLi9jb21tb24nO1xuaW1wb3J0IHtIZWxwfSBmcm9tICcuLi8uLi9jb21tb24vaWNvbnMnO1xuXG5jb25zdCBUaWxlc2V0SW5wdXRDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLXJvd3M6IHJlcGVhdCgzLCAxZnIpO1xuICByb3ctZ2FwOiAwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbmA7XG5cbmNvbnN0IFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uID0gc3R5bGVkLmRpdmBcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5BWlVSRTIwMH07XG4gIGZvbnQtc2l6ZTogMTFweDtcbmA7XG5cbmNvbnN0IExhYmVsUm93ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5cbmV4cG9ydCB0eXBlIFJhc3RlclRpbGVzZXRNZXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGFkYXRhVXJsOiBzdHJpbmc7XG4gIHJhc3RlclRpbGVTZXJ2ZXJVcmxzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF0YXNldEF0dHJpYnV0ZXNGcm9tUmFzdGVyVGlsZSh7XG4gIG5hbWUsXG4gIG1ldGFkYXRhVXJsLFxuICByYXN0ZXJUaWxlU2VydmVyVXJsc1xufTogUmFzdGVyVGlsZXNldE1ldGEpOiBEYXRhc2V0Q3JlYXRpb25BdHRyaWJ1dGVzIHtcbiAgY29uc3QgYXBwQ29uZmlnID0gZ2V0QXBwbGljYXRpb25Db25maWcoKTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IERhdGFzZXRUeXBlLlJBU1RFUl9USUxFLFxuICAgIG1ldGFkYXRhOiB7XG4gICAgICBtZXRhZGF0YVVybCxcbiAgICAgIC4uLihyYXN0ZXJUaWxlU2VydmVyVXJscyA/IHtyYXN0ZXJUaWxlU2VydmVyVXJsc30gOiB7fSksXG4gICAgICAvLyBQZXJzaXN0IHJhc3RlciBzZXJ2ZXItcmVsYXRlZCBhcHBsaWNhdGlvbiBjb25maWcgd2l0aCB0aGUgbGF5ZXJcbiAgICAgIHJhc3RlclNlcnZlclVzZUxhdGVzdFRpdGlsZXI6IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJVc2VMYXRlc3RUaXRpbGVyLFxuICAgICAgcmFzdGVyU2VydmVyU3VwcG9ydHNFbGV2YXRpb246IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJTdXBwb3J0c0VsZXZhdGlvbixcbiAgICAgIHJhc3RlclNlcnZlck1heFJldHJpZXM6IGFwcENvbmZpZy5yYXN0ZXJTZXJ2ZXJNYXhSZXRyaWVzLFxuICAgICAgcmFzdGVyU2VydmVyUmV0cnlEZWxheTogYXBwQ29uZmlnLnJhc3RlclNlcnZlclJldHJ5RGVsYXksXG4gICAgICByYXN0ZXJTZXJ2ZXJTZXJ2ZXJFcnJvcnNUb1JldHJ5OiBhcHBDb25maWcucmFzdGVyU2VydmVyU2VydmVyRXJyb3JzVG9SZXRyeSxcbiAgICAgIHJhc3RlclNlcnZlck1heFBlclNlcnZlclJlcXVlc3RzOiBhcHBDb25maWcucmFzdGVyU2VydmVyTWF4UGVyU2VydmVyUmVxdWVzdHNcbiAgICB9XG4gIH07XG59XG5cbnR5cGUgUmFzdGVyVGlsZUZvcm1Qcm9wcyA9IHtcbiAgc2V0UmVzcG9uc2U6IChyZXNwb25zZTogTWV0YVJlc3BvbnNlKSA9PiB2b2lkO1xufTtcblxuY29uc3QgSW5mb0ljb25MaW5rID0gc3R5bGVkLmFgXG4gIG1hcmdpbi1sZWZ0OiA0cHg7XG4gIGNvbG9yOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmxhYmVsQ29sb3J9O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBsaW5lLWhlaWdodDogMDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgb3BhY2l0eTogMC43O1xuXG4gICY6aG92ZXIge1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cblxuICBzdmcge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG5gO1xuXG5jb25zdCBSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTCA9XG4gICdodHRwczovL2RvY3Mua2VwbGVyLmdsL2RvY3MvdXNlci1ndWlkZXMvYy10eXBlcy1vZi1sYXllcnMvbi1yYXN0ZXItdGlsZS1sYXllcic7XG5cbmNvbnN0IHBhcnNlTWV0YWRhdGFBbGxvd0NvbGxlY3Rpb25zID0gKFxuICBtZXRhZGF0YTogSnNvbk9iamVjdE9yQXJyYXkgfCBQTVRpbGVzTWV0YWRhdGEsXG4gIHttZXRhZGF0YVVybCwgcmFzdGVyVGlsZVR5cGV9OiB7bWV0YWRhdGFVcmw6IHN0cmluZzsgcmFzdGVyVGlsZVR5cGU6IFJhc3RlclRpbGVUeXBlfVxuKSA9PiB7XG4gIHJldHVybiByYXN0ZXJUaWxlVHlwZSA9PT0gUmFzdGVyVGlsZVR5cGUuUE1USUxFU1xuICAgID8gcGFyc2VWZWN0b3JNZXRhZGF0YShtZXRhZGF0YSBhcyBQTVRpbGVzTWV0YWRhdGEsIHtcbiAgICAgICAgdGlsZVVybDogbWV0YWRhdGFVcmxcbiAgICAgIH0pXG4gICAgOiBwYXJzZVJhc3Rlck1ldGFkYXRhKG1ldGFkYXRhIGFzIEpzb25PYmplY3RPckFycmF5LCB7YWxsb3dDb2xsZWN0aW9uczogdHJ1ZX0pO1xufTtcblxuY29uc3QgUmFzdGVyVGlsZUZvcm06IFJlYWN0LkZDPFJhc3RlclRpbGVGb3JtUHJvcHM+ID0gKHtzZXRSZXNwb25zZX0pID0+IHtcbiAgY29uc3QgW3RpbGVOYW1lLCBzZXRUaWxlTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCcnKTtcbiAgY29uc3QgW3RpbGVOYW1lV2FzTW9kaWZpZWQsIHNldFRpbGVOYW1lV2FzTW9kaWZpZWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xuICBjb25zdCBbbWV0YWRhdGFVcmwsIHNldE1ldGFkYXRhVXJsXSA9IHVzZVN0YXRlPHN0cmluZz4oJycpO1xuICBjb25zdCBbcmFzdGVyVGlsZVNlcnZlclVybHMsIHNldFJhc3RlclRpbGVTZXJ2ZXJVcmxzXSA9IHVzZVN0YXRlPHN0cmluZz4oXG4gICAgKGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucmFzdGVyU2VydmVyVXJscyB8fCBbXSkuam9pbignLCcpXG4gICk7XG5cbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIHRvIHByZXZlbnQgaXNzdWVzIHdpdGggcmFzdGVyIHRpbGUgc2VydmVyc1xuICBjb25zdCBjbGVhcmVkTWV0YWRhdGFVcmwgPSBtZXRhZGF0YVVybC5lbmRzV2l0aCgnLycpID8gbWV0YWRhdGFVcmwuc2xpY2UoMCwgLTEpIDogbWV0YWRhdGFVcmw7XG5cbiAgY29uc3Qgb25UaWxlTmFtZUNoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZXRUaWxlTmFtZVdhc01vZGlmaWVkKHRydWUpO1xuICAgICAgc2V0VGlsZU5hbWUoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9LFxuICAgIFtzZXRUaWxlTmFtZV1cbiAgKTtcblxuICBjb25zdCBvbk1ldGFkYXRhVXJsQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHt2YWx1ZX0gPSBldmVudC50YXJnZXQ7XG4gICAgICBzZXRNZXRhZGF0YVVybCh2YWx1ZSk7XG5cbiAgICAgIGlmICghdGlsZU5hbWVXYXNNb2RpZmllZCkge1xuICAgICAgICBzZXRUaWxlTmFtZSh2YWx1ZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5wb3AoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbdGlsZU5hbWVXYXNNb2RpZmllZF1cbiAgKTtcblxuICBjb25zdCBvblJhc3RlclRpbGVTZXJ2ZXJVcmxzQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldFJhc3RlclRpbGVTZXJ2ZXJVcmxzKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgfSxcbiAgICBbc2V0UmFzdGVyVGlsZVNlcnZlclVybHNdXG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGRhdGE6IG1ldGFkYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgZXJyb3I6IG1ldGFFcnJvclxuICB9ID0gdXNlRmV0Y2hKc29uKHtcbiAgICB1cmw6IGNsZWFyZWRNZXRhZGF0YVVybCxcbiAgICByYXN0ZXJUaWxlVHlwZTogaXNQTVRpbGVzVXJsKGNsZWFyZWRNZXRhZGF0YVVybCkgPyBSYXN0ZXJUaWxlVHlwZS5QTVRJTEVTIDogUmFzdGVyVGlsZVR5cGUuU1RBQyxcbiAgICBwcm9jZXNzOiBwYXJzZU1ldGFkYXRhQWxsb3dDb2xsZWN0aW9uc1xuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0aWxlTmFtZSAmJiBjbGVhcmVkTWV0YWRhdGFVcmwpIHtcbiAgICAgIGNvbnN0IHBtdGlsZXNUeXBlID0gbWV0YWRhdGE/LnBtdGlsZXNUeXBlO1xuXG4gICAgICBpZiAocG10aWxlc1R5cGUgPT09IFBNVGlsZXNUeXBlLk1WVCkge1xuICAgICAgICByZXR1cm4gc2V0UmVzcG9uc2Uoe1xuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgIGRhdGFzZXQ6IG51bGwsXG4gICAgICAgICAgbG9hZGluZyxcbiAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdGb3IgLnBtdGlsZXMgaW4gbXZ0IGZvcm1hdCwgcGxlYXNlIHVzZSB0aGUgVmVjdG9yIFRpbGUgZm9ybS4nKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGVycm9yID0gbWV0YUVycm9yO1xuXG4gICAgICAvLyBjaGVjayBmb3IgcmFzdGVyIHRpbGUgc2VydmVycyBmb3IgU1RBQyBpdGVtcyBhbmQgY29sbGVjdGlvbnNcbiAgICAgIGxldCByYXN0ZXJUaWxlU2VydmVycztcbiAgICAgIGlmIChcbiAgICAgICAgIWVycm9yXG4gICAgICAgIC8vIFdlIHN0aWxsIG5lZWQgcmFzdGVyIHRpbGUgc2VydmVycyBmb3IgUE1UaWxlcyB3aGVuIHdlIHBsYW4gdG8gdXNlIGVsZXZhdGlvblxuICAgICAgKSB7XG4gICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJzID0gcmFzdGVyVGlsZVNlcnZlclVybHNcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5tYXAoc2VydmVyID0+IHNlcnZlci50cmltKCkpXG4gICAgICAgICAgLmZpbHRlcihzZXJ2ZXIgPT4gc2VydmVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJzLmxlbmd0aCA8IDEgfHxcbiAgICAgICAgICAhcmFzdGVyVGlsZVNlcnZlcnMuZXZlcnkoc2VydmVyID0+IHZhbGlkYXRlVXJsKHNlcnZlcikpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChwbXRpbGVzVHlwZSkge1xuICAgICAgICAgICAgLy8gRm9yIHJhc3RlciB0aWxlcyBlbGV2YXRpb24gc3VwcG9ydCBpcyBvcHRpb25hbFxuICAgICAgICAgICAgLy8gVE9ETyBkaXNwbGF5IGEgd2FybmluZywgYnV0IG5vdCBhIGJsb2NraW5nIGVycm9yXG4gICAgICAgICAgICByYXN0ZXJUaWxlU2VydmVycyA9IFtdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ1Byb3ZpZGUgdmFsaWQgcmFzdGVyIHRpbGUgc2VydmVyIHVybHMgdG8gc3VwcG9ydCBTVEFDIGFuZCBlbGV2YXRpb25zLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBnZXREYXRhc2V0QXR0cmlidXRlc0Zyb21SYXN0ZXJUaWxlKHtcbiAgICAgICAgbmFtZTogdGlsZU5hbWUsXG4gICAgICAgIG1ldGFkYXRhVXJsOiBjbGVhcmVkTWV0YWRhdGFVcmwsXG4gICAgICAgIHJhc3RlclRpbGVTZXJ2ZXJVcmxzOiByYXN0ZXJUaWxlU2VydmVyc1xuICAgICAgfSk7XG5cbiAgICAgIHNldFJlc3BvbnNlKHtcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgIGRhdGFzZXQsXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIGVycm9yXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0UmVzcG9uc2Uoe1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgZGF0YXNldDogbnVsbCxcbiAgICAgICAgbG9hZGluZyxcbiAgICAgICAgZXJyb3I6IG1ldGFFcnJvclxuICAgICAgfSk7XG4gICAgfVxuICB9LCBbXG4gICAgbWV0YWRhdGEsXG4gICAgbG9hZGluZyxcbiAgICBtZXRhRXJyb3IsXG4gICAgdGlsZU5hbWUsXG4gICAgY2xlYXJlZE1ldGFkYXRhVXJsLFxuICAgIHJhc3RlclRpbGVTZXJ2ZXJVcmxzLFxuICAgIHNldFJlc3BvbnNlXG4gIF0pO1xuXG4gIGNvbnN0IHNob3dTZXJ2ZXJJbnB1dCA9IGdldEFwcGxpY2F0aW9uQ29uZmlnKCkucmFzdGVyU2VydmVyU2hvd1NlcnZlcklucHV0O1xuXG4gIHJldHVybiAoXG4gICAgPFRpbGVzZXRJbnB1dENvbnRhaW5lcj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZXNldC1uYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICAgIDxJbnB1dExpZ2h0XG4gICAgICAgICAgaWQ9XCJ0aWxlc2V0LW5hbWVcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiTmFtZSB5b3VyIHRpbGVzZXRcIlxuICAgICAgICAgIHZhbHVlPXt0aWxlTmFtZX1cbiAgICAgICAgICBvbkNoYW5nZT17b25UaWxlTmFtZUNoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPExhYmVsUm93PlxuICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwidGlsZS1tZXRhZGF0YVwiPlRpbGVzZXQgbWV0YWRhdGEgVVJMPC9sYWJlbD5cbiAgICAgICAgICA8SW5mb0ljb25MaW5rXG4gICAgICAgICAgICBocmVmPXtSQVNURVJfVElMRV9ET0NVTUVOVEFUSU9OX1VSTH1cbiAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJPcGVuIFJhc3RlciBUaWxlIExheWVyIGRvY3VtZW50YXRpb25cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxIZWxwIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgIDwvSW5mb0ljb25MaW5rPlxuICAgICAgICA8L0xhYmVsUm93PlxuICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgIGlkPVwidGlsZS1tZXRhZGF0YVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJUaWxlc2V0IG1ldGFkYXRhIFVSTFwiXG4gICAgICAgICAgdmFsdWU9e21ldGFkYXRhVXJsID8/IHVuZGVmaW5lZH1cbiAgICAgICAgICBvbkNoYW5nZT17b25NZXRhZGF0YVVybENoYW5nZX1cbiAgICAgICAgLz5cbiAgICAgICAgPFRpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICAgIFN1cHBvcnRzIHJhc3RlciAucG10aWxlcy4gTGltaXRlZCBzdXBwb3J0IGZvciBTVEFDIEl0ZW1zIGFuZCBDb2xsZWN0aW9ucy5cbiAgICAgICAgPC9UaWxlc2V0SW5wdXREZXNjcmlwdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgICAge3Nob3dTZXJ2ZXJJbnB1dCAmJiAoXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPExhYmVsUm93PlxuICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJ0aWxlc2V0LXJhc3Rlci1zZXJ2ZXJzXCI+UmFzdGVyIHRpbGUgc2VydmVyczwvbGFiZWw+XG4gICAgICAgICAgICA8SW5mb0ljb25MaW5rXG4gICAgICAgICAgICAgIGhyZWY9e1JBU1RFUl9USUxFX0RPQ1VNRU5UQVRJT05fVVJMfVxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIk9wZW4gUmFzdGVyIFRpbGUgTGF5ZXIgZG9jdW1lbnRhdGlvblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxIZWxwIGhlaWdodD1cIjE2cHhcIiAvPlxuICAgICAgICAgICAgPC9JbmZvSWNvbkxpbms+XG4gICAgICAgICAgPC9MYWJlbFJvdz5cbiAgICAgICAgICA8SW5wdXRMaWdodFxuICAgICAgICAgICAgaWQ9XCJ0aWxlc2V0LXJhc3Rlci1zZXJ2ZXJzXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmFzdGVyIHRpbGUgc2VydmVycyAoc2VwYXJhdGVkIGJ5IGNvbW1hcylcIlxuICAgICAgICAgICAgdmFsdWU9e3Jhc3RlclRpbGVTZXJ2ZXJVcmxzfVxuICAgICAgICAgICAgb25DaGFuZ2U9e29uUmFzdGVyVGlsZVNlcnZlclVybHNDaGFuZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8VGlsZXNldElucHV0RGVzY3JpcHRpb24+XG4gICAgICAgICAgICBSYXN0ZXIgdGlsZSBzZXJ2ZXIgVVJMcyBmb3IgQ2xvdWQgT3B0aW1pemVkIEdlb1RJRkYgdGlsZXNldHMgYW5kIGVsZXZhdGlvbi5cbiAgICAgICAgICA8L1RpbGVzZXRJbnB1dERlc2NyaXB0aW9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9UaWxlc2V0SW5wdXRDb250YWluZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSYXN0ZXJUaWxlRm9ybTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsaUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUlBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE1BQUEsR0FBQU4sT0FBQTtBQUVBLElBQUFPLDJCQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBUSxPQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxNQUFBLEdBQUFULE9BQUE7QUFBd0MsSUFBQVUsZUFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQUFBQyxnQkFBQSxFQWpCeEM7QUFDQTtBQUFBLFNBQUFDLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxD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