UNPKG

kepler.gl

Version:

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

175 lines (168 loc) 32.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.GeoArrowTextLayer = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _typed = require("@deck.gl/core/typed"); var _typed2 = require("@deck.gl/layers/typed"); var ga = _interopRequireWildcard(require("@geoarrow/geoarrow-js")); var _constants = require("@kepler.gl/constants"); var _utils = require("../utils/utils"); var _picking = require("../utils/picking"); var _validate = require("../utils/validate"); 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 _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } 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; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project // deck.gl-community // SPDX-License-Identifier: MIT // Copyright (c) vis.gl contributors /** All properties supported by GeoArrowTextLayer */ /** Properties added by GeoArrowTextLayer */ // Remove data and getPosition from the upstream default props var _TextLayer$defaultPro = _typed2.TextLayer.defaultProps, _data = _TextLayer$defaultPro.data, _getPosition = _TextLayer$defaultPro.getPosition, _getText = _TextLayer$defaultPro.getText, _getTextAnchor = _TextLayer$defaultPro.getTextAnchor, _getAlignmentBaseline = _TextLayer$defaultPro.getAlignmentBaseline, _getPixelOffset = _TextLayer$defaultPro.getPixelOffset, _defaultProps = (0, _objectWithoutProperties2["default"])(_TextLayer$defaultPro, ["data", "getPosition", "getText", "getTextAnchor", "getAlignmentBaseline", "getPixelOffset"]); // Default props added by us var ourDefaultProps = { getTextAnchor: 'middle', getAlignmentBaseline: 'center', getPixelOffset: [0, 0], _validate: true }; // @ts-expect-error Type 'Uint8Array' is not assignable to type 'RGBAColor' var defaultProps = _objectSpread(_objectSpread({}, _defaultProps), ourDefaultProps); var GeoArrowTextLayer = exports.GeoArrowTextLayer = /*#__PURE__*/function (_CompositeLayer) { function GeoArrowTextLayer() { (0, _classCallCheck2["default"])(this, GeoArrowTextLayer); return _callSuper(this, GeoArrowTextLayer, arguments); } (0, _inherits2["default"])(GeoArrowTextLayer, _CompositeLayer); return (0, _createClass2["default"])(GeoArrowTextLayer, [{ key: "getPickingInfo", value: function getPickingInfo(params) { return (0, _picking.getPickingInfo)(params, this.props.data); } }, { key: "renderLayers", value: function renderLayers() { var table = this.props.data; if (this.props.getPosition !== undefined) { var geometryColumn = this.props.getPosition; if (geometryColumn !== undefined && ga.vector.isPointVector(geometryColumn)) { return this._renderLayersPoint(geometryColumn); } throw new Error('getPosition should pass in an arrow Vector of Point type'); } else { var pointVector = (0, _utils.getGeometryVector)(table, _constants.GEOARROW_EXTENSIONS.POINT); if (pointVector !== null) { return this._renderLayersPoint(pointVector); } } throw new Error('getPosition not GeoArrow point'); } }, { key: "_renderLayersPoint", value: function _renderLayersPoint(geometryColumn) { var table = this.props.data; if (this.props._validate) { (0, _typed.assert)(ga.vector.isPointVector(geometryColumn)); (0, _validate.validateAccessors)(this.props, table); } // Exclude manually-set accessors var _extractAccessorsFrom = (0, _utils.extractAccessorsFromProps)(this.props, ['getPosition', 'getText']), _extractAccessorsFrom2 = (0, _slicedToArray2["default"])(_extractAccessorsFrom, 2), accessors = _extractAccessorsFrom2[0], otherProps = _extractAccessorsFrom2[1]; var tableOffsets = (0, _picking.computeChunkOffsets)(table.data); var layers = []; for (var recordBatchIdx = 0; recordBatchIdx < table.batches.length; recordBatchIdx++) { var geometryData = geometryColumn.data[recordBatchIdx]; var flatCoordsData = ga.child.getPointChild(geometryData); var flatCoordinateArray = flatCoordsData.values; var textData = this.props.getText.data[recordBatchIdx]; var numLabels = textData.length; var textValues = textData.values; var characterOffsets = textData.valueOffsets; // @ts-expect-error how to properly retrieve batch offset? var batchOffset = geometryColumn._offsets[recordBatchIdx]; var props = _objectSpread(_objectSpread(_objectSpread({}, ourDefaultProps), otherProps), {}, { // used for picking purposes // @ts-expect-error recordBatchIdx: recordBatchIdx, tableOffsets: tableOffsets, id: "".concat(this.props.id, "-geoarrow-text-layer-").concat(recordBatchIdx), data: { data: table.batches[recordBatchIdx], length: geometryData.length, startIndices: characterOffsets, attributes: { // Positions need to be expanded to be one per character! getPosition: { value: (0, _utils.expandArrayToCoords)(flatCoordinateArray, geometryData.type.listSize, characterOffsets, numLabels), size: geometryData.type.listSize }, // TODO: support non-ascii characters getText: { value: textValues // size: 1, } } }, // TODO privide more robust data comparators dataComparator: function dataComparator(d1, d2) { return d1.data === d2.data; }, _subLayerProps: { characters: { dataComparator: function dataComparator(d1, d2) { return d1.data === d2.data; } } } }); for (var _i = 0, _Object$entries = Object.entries(accessors); _i < _Object$entries.length; _i++) { var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2), propName = _Object$entries$_i[0], propInput = _Object$entries$_i[1]; (0, _utils.assignAccessor)({ props: props, propName: propName, propInput: propInput, chunkIdx: recordBatchIdx, geomCoordOffsets: characterOffsets, batchOffset: batchOffset }); } var layer = new _typed2.TextLayer(_objectSpread(_objectSpread({}, this.getSubLayerProps(props)), {}, { // preserve binded accessors, as they are overwriten back by pass-through accessors from extensions getFiltered: props.getFiltered, getFilterValue: props.getFilterValue })); layers.push(layer); } return layers; } }]); }(_typed.CompositeLayer); (0, _defineProperty2["default"])(GeoArrowTextLayer, "defaultProps", defaultProps); (0, _defineProperty2["default"])(GeoArrowTextLayer, "layerName", 'GeoArrowTextLayer'); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZWQiLCJyZXF1aXJlIiwiX3R5cGVkMiIsImdhIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfY29uc3RhbnRzIiwiX3V0aWxzIiwiX3BpY2tpbmciLCJfdmFsaWRhdGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJfY2FsbFN1cGVyIiwibyIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsIl9UZXh0TGF5ZXIkZGVmYXVsdFBybyIsIlRleHRMYXllciIsImRlZmF1bHRQcm9wcyIsIl9kYXRhIiwiZGF0YSIsIl9nZXRQb3NpdGlvbiIsImdldFBvc2l0aW9uIiwiX2dldFRleHQiLCJnZXRUZXh0IiwiX2dldFRleHRBbmNob3IiLCJnZXRUZXh0QW5jaG9yIiwiX2dldEFsaWdubWVudEJhc2VsaW5lIiwiZ2V0QWxpZ25tZW50QmFzZWxpbmUiLCJfZ2V0UGl4ZWxPZmZzZXQiLCJnZXRQaXhlbE9mZnNldCIsIl9kZWZhdWx0UHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwib3VyRGVmYXVsdFByb3BzIiwiR2VvQXJyb3dUZXh0TGF5ZXIiLCJleHBvcnRzIiwiX0NvbXBvc2l0ZUxheWVyIiwiX2NsYXNzQ2FsbENoZWNrMiIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJnZXRQaWNraW5nSW5mbyIsInBhcmFtcyIsInByb3BzIiwicmVuZGVyTGF5ZXJzIiwidGFibGUiLCJ1bmRlZmluZWQiLCJnZW9tZXRyeUNvbHVtbiIsInZlY3RvciIsImlzUG9pbnRWZWN0b3IiLCJfcmVuZGVyTGF5ZXJzUG9pbnQiLCJFcnJvciIsInBvaW50VmVjdG9yIiwiZ2V0R2VvbWV0cnlWZWN0b3IiLCJHRU9BUlJPV19FWFRFTlNJT05TIiwiUE9JTlQiLCJhc3NlcnQiLCJ2YWxpZGF0ZUFjY2Vzc29ycyIsIl9leHRyYWN0QWNjZXNzb3JzRnJvbSIsImV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHMiLCJfZXh0cmFjdEFjY2Vzc29yc0Zyb20yIiwiX3NsaWNlZFRvQXJyYXkyIiwiYWNjZXNzb3JzIiwib3RoZXJQcm9wcyIsInRhYmxlT2Zmc2V0cyIsImNvbXB1dGVDaHVua09mZnNldHMiLCJsYXllcnMiLCJyZWNvcmRCYXRjaElkeCIsImJhdGNoZXMiLCJnZW9tZXRyeURhdGEiLCJmbGF0Q29vcmRzRGF0YSIsImNoaWxkIiwiZ2V0UG9pbnRDaGlsZCIsImZsYXRDb29yZGluYXRlQXJyYXkiLCJ2YWx1ZXMiLCJ0ZXh0RGF0YSIsIm51bUxhYmVscyIsInRleHRWYWx1ZXMiLCJjaGFyYWN0ZXJPZmZzZXRzIiwidmFsdWVPZmZzZXRzIiwiYmF0Y2hPZmZzZXQiLCJfb2Zmc2V0cyIsImlkIiwiY29uY2F0Iiwic3RhcnRJbmRpY2VzIiwiYXR0cmlidXRlcyIsImV4cGFuZEFycmF5VG9Db29yZHMiLCJ0eXBlIiwibGlzdFNpemUiLCJzaXplIiwiZGF0YUNvbXBhcmF0b3IiLCJkMSIsImQyIiwiX3N1YkxheWVyUHJvcHMiLCJjaGFyYWN0ZXJzIiwiX2kiLCJfT2JqZWN0JGVudHJpZXMiLCJlbnRyaWVzIiwiX09iamVjdCRlbnRyaWVzJF9pIiwicHJvcE5hbWUiLCJwcm9wSW5wdXQiLCJhc3NpZ25BY2Nlc3NvciIsImNodW5rSWR4IiwiZ2VvbUNvb3JkT2Zmc2V0cyIsImxheWVyIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsImdldEZpbHRlcmVkIiwiZ2V0RmlsdGVyVmFsdWUiLCJDb21wb3NpdGVMYXllciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllcnMvZ2VvLWFycm93LXRleHQtbGF5ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLy8gZGVjay5nbC1jb21tdW5pdHlcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCAoYykgdmlzLmdsIGNvbnRyaWJ1dG9yc1xuXG5pbXBvcnQge1xuICBDb21wb3NpdGVMYXllcixcbiAgQ29tcG9zaXRlTGF5ZXJQcm9wcyxcbiAgRGVmYXVsdFByb3BzLFxuICBHZXRQaWNraW5nSW5mb1BhcmFtcyxcbiAgTGF5ZXIsXG4gIExheWVyc0xpc3QsXG4gIGFzc2VydFxufSBmcm9tICdAZGVjay5nbC9jb3JlL3R5cGVkJztcbmltcG9ydCB7VGV4dExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMvdHlwZWQnO1xuaW1wb3J0IHR5cGUge1RleHRMYXllclByb3BzfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuaW1wb3J0ICogYXMgYXJyb3cgZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCAqIGFzIGdhIGZyb20gJ0BnZW9hcnJvdy9nZW9hcnJvdy1qcyc7XG5cbmltcG9ydCB7R0VPQVJST1dfRVhURU5TSU9OU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuXG5pbXBvcnQge1xuICBhc3NpZ25BY2Nlc3NvcixcbiAgZXhwYW5kQXJyYXlUb0Nvb3JkcyxcbiAgZXh0cmFjdEFjY2Vzc29yc0Zyb21Qcm9wcyxcbiAgZ2V0R2VvbWV0cnlWZWN0b3Jcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHtHZW9BcnJvd0V4dHJhUGlja2luZ1Byb3BzLCBjb21wdXRlQ2h1bmtPZmZzZXRzLCBnZXRQaWNraW5nSW5mb30gZnJvbSAnLi4vdXRpbHMvcGlja2luZyc7XG5pbXBvcnQge0NvbG9yQWNjZXNzb3IsIEZsb2F0QWNjZXNzb3IsIEdlb0Fycm93UGlja2luZ0luZm8sIEV4dGVuc2lvblByb3BzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3ZhbGlkYXRlQWNjZXNzb3JzfSBmcm9tICcuLi91dGlscy92YWxpZGF0ZSc7XG5cbi8qKiBBbGwgcHJvcGVydGllcyBzdXBwb3J0ZWQgYnkgR2VvQXJyb3dUZXh0TGF5ZXIgKi9cbmV4cG9ydCB0eXBlIEdlb0Fycm93VGV4dExheWVyUHJvcHMgPSBPbWl0PFxuICBUZXh0TGF5ZXJQcm9wczxhcnJvdy5UYWJsZT4sXG4gIC8vIFdlIHJlbW92ZSBiYWNrZ3JvdW5kIGZvciBub3cgYmVjYXVzZSB0aGVyZSBhcmUgc3BlY2lhbCByZXF1aXJlbWVudHMgZm9yXG4gIC8vIHVzaW5nIGJpbmFyeSBhdHRyaWJ1dGVzIHdpdGggYmFja2dyb3VuZFxuICAvLyBodHRwczovL2RlY2suZ2wvZG9jcy9hcGktcmVmZXJlbmNlL2xheWVycy90ZXh0LWxheWVyI3VzZS1iaW5hcnktYXR0cmlidXRlcy13aXRoLWJhY2tncm91bmRcbiAgfCAnYmFja2dyb3VuZCdcbiAgfCAnZGF0YSdcbiAgfCAnZ2V0QmFja2dyb3VuZENvbG9yJ1xuICB8ICdnZXRCb3JkZXJDb2xvcidcbiAgfCAnZ2V0Qm9yZGVyV2lkdGgnXG4gIHwgJ2dldFRleHQnXG4gIHwgJ2dldFBvc2l0aW9uJ1xuICB8ICdnZXRDb2xvcidcbiAgfCAnZ2V0U2l6ZSdcbiAgfCAnZ2V0QW5nbGUnXG4gIHwgJ2dldFRleHRBbmNob3InXG4gIHwgJ2dldEFsaWdubWVudEJhc2VsaW5lJ1xuICB8ICdnZXRQaXhlbE9mZnNldCdcbj4gJlxuICBfR2VvQXJyb3dUZXh0TGF5ZXJQcm9wcyAmXG4gIENvbXBvc2l0ZUxheWVyUHJvcHM7XG5cbi8qKiBQcm9wZXJ0aWVzIGFkZGVkIGJ5IEdlb0Fycm93VGV4dExheWVyICovXG50eXBlIF9HZW9BcnJvd1RleHRMYXllclByb3BzID0ge1xuICBkYXRhOiBhcnJvdy5UYWJsZTtcblxuICAvKiogQmFja2dyb3VuZCBjb2xvciBhY2Nlc3Nvci5cbiAgICogQGRlZmF1bHQgWzI1NSwgMjU1LCAyNTUsIDI1NV1cbiAgICovXG4gIGdldEJhY2tncm91bmRDb2xvcj86IENvbG9yQWNjZXNzb3I7XG4gIC8qKiBCb3JkZXIgY29sb3IgYWNjZXNzb3IuXG4gICAqIEBkZWZhdWx0IFswLCAwLCAwLCAyNTVdXG4gICAqL1xuICBnZXRCb3JkZXJDb2xvcj86IENvbG9yQWNjZXNzb3I7XG4gIC8qKiBCb3JkZXIgd2lkdGggYWNjZXNzb3IuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIGdldEJvcmRlcldpZHRoPzogRmxvYXRBY2Nlc3NvcjtcbiAgLyoqXG4gICAqIExhYmVsIHRleHQgYWNjZXNzb3JcbiAgICovXG4gIGdldFRleHQ6IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PjtcbiAgLyoqXG4gICAqIEFuY2hvciBwb3NpdGlvbiBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0UG9zaXRpb24/OiBnYS52ZWN0b3IuUG9pbnRWZWN0b3I7XG4gIC8qKlxuICAgKiBMYWJlbCBjb2xvciBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCBbMCwgMCwgMCwgMjU1XVxuICAgKi9cbiAgZ2V0Q29sb3I/OiBDb2xvckFjY2Vzc29yO1xuICAvKipcbiAgICogTGFiZWwgc2l6ZSBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCAzMlxuICAgKi9cbiAgZ2V0U2l6ZT86IEZsb2F0QWNjZXNzb3I7XG4gIC8qKlxuICAgKiBMYWJlbCByb3RhdGlvbiBhY2Nlc3NvciwgaW4gZGVncmVlc1xuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBnZXRBbmdsZT86IEZsb2F0QWNjZXNzb3I7XG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIGFsaWdubWVudCBhY2Nlc3NvclxuICAgKiBAZGVmYXVsdCAnbWlkZGxlJ1xuICAgKi9cbiAgZ2V0VGV4dEFuY2hvcj86IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PiB8ICdzdGFydCcgfCAnbWlkZGxlJyB8ICdlbmQnO1xuICAvKipcbiAgICogVmVydGljYWwgYWxpZ25tZW50IGFjY2Vzc29yXG4gICAqIEBkZWZhdWx0ICdjZW50ZXInXG4gICAqL1xuICBnZXRBbGlnbm1lbnRCYXNlbGluZT86IGFycm93LlZlY3RvcjxhcnJvdy5VdGY4PiB8ICd0b3AnIHwgJ2NlbnRlcicgfCAnYm90dG9tJztcbiAgLyoqXG4gICAqIExhYmVsIG9mZnNldCBmcm9tIHRoZSBhbmNob3IgcG9zaXRpb24sIFt4LCB5XSBpbiBwaXhlbHNcbiAgICogQGRlZmF1bHQgWzAsIDBdXG4gICAqL1xuICBnZXRQaXhlbE9mZnNldD86IGFycm93LlZlY3RvcjxhcnJvdy5GaXhlZFNpemVMaXN0PGFycm93LkludD4+IHwgW251bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB2YWxpZGF0ZSB0aGUgYXJyYXlzIHByb3ZpZGVkIChlLmcuIGNodW5rIGxlbmd0aHMpXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIF92YWxpZGF0ZT86IGJvb2xlYW47XG59O1xuXG4vLyBSZW1vdmUgZGF0YSBhbmQgZ2V0UG9zaXRpb24gZnJvbSB0aGUgdXBzdHJlYW0gZGVmYXVsdCBwcm9wc1xuY29uc3Qge1xuICBkYXRhOiBfZGF0YSxcbiAgZ2V0UG9zaXRpb246IF9nZXRQb3NpdGlvbixcbiAgZ2V0VGV4dDogX2dldFRleHQsXG4gIGdldFRleHRBbmNob3I6IF9nZXRUZXh0QW5jaG9yLFxuICBnZXRBbGlnbm1lbnRCYXNlbGluZTogX2dldEFsaWdubWVudEJhc2VsaW5lLFxuICBnZXRQaXhlbE9mZnNldDogX2dldFBpeGVsT2Zmc2V0LFxuICAuLi5fZGVmYXVsdFByb3BzXG59ID0gVGV4dExheWVyLmRlZmF1bHRQcm9wcztcblxuLy8gRGVmYXVsdCBwcm9wcyBhZGRlZCBieSB1c1xuY29uc3Qgb3VyRGVmYXVsdFByb3BzOiBQaWNrPFxuICBHZW9BcnJvd1RleHRMYXllclByb3BzLFxuICAnZ2V0VGV4dEFuY2hvcicgfCAnZ2V0QWxpZ25tZW50QmFzZWxpbmUnIHwgJ2dldFBpeGVsT2Zmc2V0JyB8ICdfdmFsaWRhdGUnXG4+ID0ge1xuICBnZXRUZXh0QW5jaG9yOiAnbWlkZGxlJyxcbiAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICdjZW50ZXInLFxuICBnZXRQaXhlbE9mZnNldDogWzAsIDBdLFxuICBfdmFsaWRhdGU6IHRydWVcbn07XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgVHlwZSAnVWludDhBcnJheScgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnUkdCQUNvbG9yJ1xuY29uc3QgZGVmYXVsdFByb3BzOiBEZWZhdWx0UHJvcHM8R2VvQXJyb3dUZXh0TGF5ZXJQcm9wcz4gPSB7XG4gIC4uLl9kZWZhdWx0UHJvcHMsXG4gIC4uLm91ckRlZmF1bHRQcm9wc1xufTtcblxuZXhwb3J0IGNsYXNzIEdlb0Fycm93VGV4dExheWVyPEV4dHJhUHJvcHMgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IGV4dGVuZHMgQ29tcG9zaXRlTGF5ZXI8XG4gIEdlb0Fycm93VGV4dExheWVyUHJvcHMgJiBFeHRyYVByb3BzXG4+IHtcbiAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdHZW9BcnJvd1RleHRMYXllcic7XG5cbiAgZ2V0UGlja2luZ0luZm8oXG4gICAgcGFyYW1zOiBHZXRQaWNraW5nSW5mb1BhcmFtcyAmIHtcbiAgICAgIHNvdXJjZUxheWVyOiB7cHJvcHM6IEdlb0Fycm93RXh0cmFQaWNraW5nUHJvcHN9O1xuICAgIH1cbiAgKTogR2VvQXJyb3dQaWNraW5nSW5mbyB7XG4gICAgcmV0dXJuIGdldFBpY2tpbmdJbmZvKHBhcmFtcywgdGhpcy5wcm9wcy5kYXRhKTtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuZ2V0UG9zaXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VvbWV0cnlDb2x1bW4gPSB0aGlzLnByb3BzLmdldFBvc2l0aW9uO1xuICAgICAgaWYgKGdlb21ldHJ5Q29sdW1uICE9PSB1bmRlZmluZWQgJiYgZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJMYXllcnNQb2ludChnZW9tZXRyeUNvbHVtbik7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0UG9zaXRpb24gc2hvdWxkIHBhc3MgaW4gYW4gYXJyb3cgVmVjdG9yIG9mIFBvaW50IHR5cGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcG9pbnRWZWN0b3IgPSBnZXRHZW9tZXRyeVZlY3Rvcih0YWJsZSwgR0VPQVJST1dfRVhURU5TSU9OUy5QT0lOVCk7XG4gICAgICBpZiAocG9pbnRWZWN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlckxheWVyc1BvaW50KHBvaW50VmVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFBvc2l0aW9uIG5vdCBHZW9BcnJvdyBwb2ludCcpO1xuICB9XG5cbiAgX3JlbmRlckxheWVyc1BvaW50KGdlb21ldHJ5Q29sdW1uOiBnYS52ZWN0b3IuUG9pbnRWZWN0b3IpOiBMYXllcjxvYmplY3Q+IHwgTGF5ZXJzTGlzdCB8IG51bGwge1xuICAgIGNvbnN0IHtkYXRhOiB0YWJsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgaWYgKHRoaXMucHJvcHMuX3ZhbGlkYXRlKSB7XG4gICAgICBhc3NlcnQoZ2EudmVjdG9yLmlzUG9pbnRWZWN0b3IoZ2VvbWV0cnlDb2x1bW4pKTtcbiAgICAgIHZhbGlkYXRlQWNjZXNzb3JzKHRoaXMucHJvcHMsIHRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBFeGNsdWRlIG1hbnVhbGx5LXNldCBhY2Nlc3NvcnNcbiAgICBjb25zdCBbYWNjZXNzb3JzLCBvdGhlclByb3BzXSA9IGV4dHJhY3RBY2Nlc3NvcnNGcm9tUHJvcHModGhpcy5wcm9wcywgW1xuICAgICAgJ2dldFBvc2l0aW9uJyxcbiAgICAgICdnZXRUZXh0J1xuICAgIF0pO1xuICAgIGNvbnN0IHRhYmxlT2Zmc2V0cyA9IGNvbXB1dGVDaHVua09mZnNldHModGFibGUuZGF0YSk7XG5cbiAgICBjb25zdCBsYXllcnM6IFRleHRMYXllcjxhbnk+W10gPSBbXTtcbiAgICBmb3IgKGxldCByZWNvcmRCYXRjaElkeCA9IDA7IHJlY29yZEJhdGNoSWR4IDwgdGFibGUuYmF0Y2hlcy5sZW5ndGg7IHJlY29yZEJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IGdlb21ldHJ5RGF0YSA9IGdlb21ldHJ5Q29sdW1uLmRhdGFbcmVjb3JkQmF0Y2hJZHhdO1xuICAgICAgY29uc3QgZmxhdENvb3Jkc0RhdGEgPSBnYS5jaGlsZC5nZXRQb2ludENoaWxkKGdlb21ldHJ5RGF0YSk7XG4gICAgICBjb25zdCBmbGF0Q29vcmRpbmF0ZUFycmF5ID0gZmxhdENvb3Jkc0RhdGEudmFsdWVzO1xuXG4gICAgICBjb25zdCB0ZXh0RGF0YSA9IHRoaXMucHJvcHMuZ2V0VGV4dC5kYXRhW3JlY29yZEJhdGNoSWR4XTtcbiAgICAgIGNvbnN0IG51bUxhYmVscyA9IHRleHREYXRhLmxlbmd0aDtcbiAgICAgIGNvbnN0IHRleHRWYWx1ZXMgPSB0ZXh0RGF0YS52YWx1ZXM7XG4gICAgICBjb25zdCBjaGFyYWN0ZXJPZmZzZXRzID0gdGV4dERhdGEudmFsdWVPZmZzZXRzO1xuXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGhvdyB0byBwcm9wZXJseSByZXRyaWV2ZSBiYXRjaCBvZmZzZXQ/XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGdlb21ldHJ5Q29sdW1uLl9vZmZzZXRzW3JlY29yZEJhdGNoSWR4XTtcblxuICAgICAgY29uc3QgcHJvcHM6IFRleHRMYXllclByb3BzPGFueT4gJiBFeHRlbnNpb25Qcm9wcyA9IHtcbiAgICAgICAgLy8gTm90ZTogYmVjYXVzZSB0aGlzIGlzIGEgY29tcG9zaXRlIGxheWVyIGFuZCBub3QgZG9pbmcgdGhlIHJlbmRlcmluZ1xuICAgICAgICAvLyBpdHNlbGYsIHdlIHN0aWxsIGhhdmUgdG8gcGFzcyBpbiBvdXIgZGVmYXVsdFByb3BzXG4gICAgICAgIC4uLm91ckRlZmF1bHRQcm9wcyxcbiAgICAgICAgLi4ub3RoZXJQcm9wcyxcblxuICAgICAgICAvLyB1c2VkIGZvciBwaWNraW5nIHB1cnBvc2VzXG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgcmVjb3JkQmF0Y2hJZHgsXG4gICAgICAgIHRhYmxlT2Zmc2V0cyxcblxuICAgICAgICBpZDogYCR7dGhpcy5wcm9wcy5pZH0tZ2VvYXJyb3ctdGV4dC1sYXllci0ke3JlY29yZEJhdGNoSWR4fWAsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBkYXRhOiB0YWJsZS5iYXRjaGVzW3JlY29yZEJhdGNoSWR4XSxcbiAgICAgICAgICBsZW5ndGg6IGdlb21ldHJ5RGF0YS5sZW5ndGgsXG4gICAgICAgICAgc3RhcnRJbmRpY2VzOiBjaGFyYWN0ZXJPZmZzZXRzLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIC8vIFBvc2l0aW9ucyBuZWVkIHRvIGJlIGV4cGFuZGVkIHRvIGJlIG9uZSBwZXIgY2hhcmFjdGVyIVxuICAgICAgICAgICAgZ2V0UG9zaXRpb246IHtcbiAgICAgICAgICAgICAgdmFsdWU6IGV4cGFuZEFycmF5VG9Db29yZHMoXG4gICAgICAgICAgICAgICAgZmxhdENvb3JkaW5hdGVBcnJheSxcbiAgICAgICAgICAgICAgICBnZW9tZXRyeURhdGEudHlwZS5saXN0U2l6ZSxcbiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJPZmZzZXRzLFxuICAgICAgICAgICAgICAgIG51bUxhYmVsc1xuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzaXplOiBnZW9tZXRyeURhdGEudHlwZS5saXN0U2l6ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbm9uLWFzY2lpIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGdldFRleHQ6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHRleHRWYWx1ZXNcbiAgICAgICAgICAgICAgLy8gc2l6ZTogMSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFRPRE8gcHJpdmlkZSBtb3JlIHJvYnVzdCBkYXRhIGNvbXBhcmF0b3JzXG4gICAgICAgIGRhdGFDb21wYXJhdG9yOiAoZDEsIGQyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGQxLmRhdGEgPT09IGQyLmRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIF9zdWJMYXllclByb3BzOiB7XG4gICAgICAgICAgY2hhcmFjdGVyczoge1xuICAgICAgICAgICAgZGF0YUNvbXBhcmF0b3I6IChkMSwgZDIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGQxLmRhdGEgPT09IGQyLmRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgcHJvcElucHV0XSBvZiBPYmplY3QuZW50cmllcyhhY2Nlc3NvcnMpKSB7XG4gICAgICAgIGFzc2lnbkFjY2Vzc29yKHtcbiAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICBwcm9wSW5wdXQsXG4gICAgICAgICAgY2h1bmtJZHg6IHJlY29yZEJhdGNoSWR4LFxuICAgICAgICAgIGdlb21Db29yZE9mZnNldHM6IGNoYXJhY3Rlck9mZnNldHMsXG4gICAgICAgICAgYmF0Y2hPZmZzZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxheWVyID0gbmV3IFRleHRMYXllcih7XG4gICAgICAgIC4uLnRoaXMuZ2V0U3ViTGF5ZXJQcm9wcyhwcm9wcyksXG4gICAgICAgIC8vIHByZXNlcnZlIGJpbmRlZCBhY2Nlc3NvcnMsIGFzIHRoZXkgYXJlIG92ZXJ3cml0ZW4gYmFjayBieSBwYXNzLXRocm91Z2ggYWNjZXNzb3JzIGZyb20gZXh0ZW5zaW9uc1xuICAgICAgICBnZXRGaWx0ZXJlZDogcHJvcHMuZ2V0RmlsdGVyZWQsXG4gICAgICAgIGdldEZpbHRlclZhbHVlOiBwcm9wcy5nZXRGaWx0ZXJWYWx1ZVxuICAgICAgfSk7XG4gICAgICBsYXllcnMucHVzaChsYXllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxheWVycztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBT0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBU0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBR0EsSUFBQUUsRUFBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksVUFBQSxHQUFBSixPQUFBO0FBRUEsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBTUEsSUFBQU0sUUFBQSxHQUFBTixPQUFBO0FBRUEsSUFBQU8sU0FBQSxHQUFBUCxPQUFBO0FBQW9ELFNBQUFRLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLHlCQUFBQyxDQUFBLFdBQUFBLENB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