UNPKG

kepler.gl

Version:

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

151 lines (148 loc) 23.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = useLegendPosition; exports.useCalcLegendPosition = useCalcLegendPosition; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = require("react"); 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 var MARGIN = { left: 10, top: 10, right: 10, bottom: 30 }; var DEFAULT_POSITION = { x: MARGIN.right, y: MARGIN.bottom, anchorX: 'right', anchorY: 'bottom' }; var MIN_CONTENT_HEIGHT = 100; function useCalcLegendPosition(_ref) { var legendContentRef = _ref.legendContentRef, isSidePanelShown = _ref.isSidePanelShown, sidePanelWidth = _ref.sidePanelWidth; return (0, _react.useCallback)(function () { var _legendContentRef$cur; var root = (_legendContentRef$cur = legendContentRef.current) === null || _legendContentRef$cur === void 0 ? void 0 : _legendContentRef$cur.closest('.kepler-gl'); var legendContent = legendContentRef.current; if (!legendContent || !(root instanceof HTMLElement)) { return DEFAULT_POSITION; } var legendRect = legendContent.getBoundingClientRect(); var mapRootBounds = root.getBoundingClientRect(); var leftSidebarOffset = isSidePanelShown ? sidePanelWidth : 0; var leftOffset = Math.max(MARGIN.left, legendRect.left - mapRootBounds.left - leftSidebarOffset); var rightOffset = Math.max(MARGIN.right, mapRootBounds.right - legendRect.right); var topOffset = Math.max(MARGIN.top, legendRect.top); var bottomOffset = Math.max(MARGIN.bottom, mapRootBounds.bottom - legendRect.bottom); return _objectSpread(_objectSpread({}, leftOffset < rightOffset ? { x: leftOffset + leftSidebarOffset, anchorX: 'left' } : { x: rightOffset, anchorX: 'right' }), topOffset < bottomOffset ? { y: topOffset, anchorY: 'top' } : { y: bottomOffset, anchorY: 'bottom' }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isSidePanelShown, sidePanelWidth]); } /** * Returns a function that calculates the anchored position of the map legend * that is being dragged. */ function useLegendPosition(_ref2) { var _settings$position, _settings$contentHeig, _theme$sidePanel; var legendContentRef = _ref2.legendContentRef, isSidePanelShown = _ref2.isSidePanelShown, settings = _ref2.settings, onChangeSettings = _ref2.onChangeSettings, theme = _ref2.theme; var pos = (_settings$position = settings === null || settings === void 0 ? void 0 : settings.position) !== null && _settings$position !== void 0 ? _settings$position : DEFAULT_POSITION; var contentHeight = (_settings$contentHeig = settings === null || settings === void 0 ? void 0 : settings.contentHeight) !== null && _settings$contentHeig !== void 0 ? _settings$contentHeig : -1; var positionStyles = (0, _react.useMemo)(function () { return (0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, pos.anchorX, pos.x), pos.anchorY, pos.y); }, [pos]); var startHeightRef = (0, _react.useRef)(0); var sidePanelWidth = ((_theme$sidePanel = theme.sidePanel) === null || _theme$sidePanel === void 0 ? void 0 : _theme$sidePanel.width) || 0; var calcPosition = useCalcLegendPosition({ legendContentRef: legendContentRef, isSidePanelShown: isSidePanelShown, sidePanelWidth: sidePanelWidth }); var updatePosition = (0, _react.useCallback)(function () { return onChangeSettings({ position: calcPosition() }); }, [calcPosition, onChangeSettings]); var startResize = (0, _react.useCallback)(function () { var _legendContentRef$cur2; var content = (_legendContentRef$cur2 = legendContentRef.current) === null || _legendContentRef$cur2 === void 0 ? void 0 : _legendContentRef$cur2.querySelector('.map-control__panel-content'); if (content instanceof HTMLElement) { startHeightRef.current = content.offsetHeight; } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); var resize = (0, _react.useCallback)(function (deltaY) { var _legendContentRef$cur3; var root = (_legendContentRef$cur3 = legendContentRef.current) === null || _legendContentRef$cur3 === void 0 ? void 0 : _legendContentRef$cur3.closest('.kepler-gl'); var legendContent = legendContentRef.current; if (root instanceof HTMLElement && legendContent) { var legendRect = legendContent.getBoundingClientRect(); var nextHeight = Math.min(root.offsetHeight - legendRect.top - 100, Math.max(MIN_CONTENT_HEIGHT, startHeightRef.current + deltaY)); onChangeSettings({ contentHeight: nextHeight }); if (contentHeight > 0 && pos.anchorY === 'bottom') { onChangeSettings({ position: _objectSpread(_objectSpread({}, pos), {}, { y: pos.y - (nextHeight - contentHeight) }) }); } } }, // eslint-disable-next-line react-hooks/exhaustive-deps [contentHeight, pos, onChangeSettings]); // Shift when side panel is shown/hidden var posRef = (0, _react.useRef)(pos); posRef.current = pos; (0, _react.useEffect)(function () { var currentPos = posRef.current; if (currentPos.anchorX === 'left') { if (isSidePanelShown) { if (currentPos.x <= sidePanelWidth + MARGIN.left) { onChangeSettings({ position: _objectSpread(_objectSpread({}, currentPos), {}, { x: sidePanelWidth + MARGIN.left }) }); } } else { onChangeSettings({ position: _objectSpread(_objectSpread({}, currentPos), {}, { x: Math.max(MARGIN.left, currentPos.x - sidePanelWidth) }) }); } } }, [isSidePanelShown, onChangeSettings, sidePanelWidth]); return { positionStyles: positionStyles, updatePosition: updatePosition, contentHeight: contentHeight, startResize: startResize, resize: resize }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJNQVJHSU4iLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJERUZBVUxUX1BPU0lUSU9OIiwieCIsInkiLCJhbmNob3JYIiwiYW5jaG9yWSIsIk1JTl9DT05URU5UX0hFSUdIVCIsInVzZUNhbGNMZWdlbmRQb3NpdGlvbiIsIl9yZWYiLCJsZWdlbmRDb250ZW50UmVmIiwiaXNTaWRlUGFuZWxTaG93biIsInNpZGVQYW5lbFdpZHRoIiwidXNlQ2FsbGJhY2siLCJfbGVnZW5kQ29udGVudFJlZiRjdXIiLCJyb290IiwiY3VycmVudCIsImNsb3Nlc3QiLCJsZWdlbmRDb250ZW50IiwiSFRNTEVsZW1lbnQiLCJsZWdlbmRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibWFwUm9vdEJvdW5kcyIsImxlZnRTaWRlYmFyT2Zmc2V0IiwibGVmdE9mZnNldCIsIk1hdGgiLCJtYXgiLCJyaWdodE9mZnNldCIsInRvcE9mZnNldCIsImJvdHRvbU9mZnNldCIsInVzZUxlZ2VuZFBvc2l0aW9uIiwiX3JlZjIiLCJfc2V0dGluZ3MkcG9zaXRpb24iLCJfc2V0dGluZ3MkY29udGVudEhlaWciLCJfdGhlbWUkc2lkZVBhbmVsIiwic2V0dGluZ3MiLCJvbkNoYW5nZVNldHRpbmdzIiwidGhlbWUiLCJwb3MiLCJwb3NpdGlvbiIsImNvbnRlbnRIZWlnaHQiLCJwb3NpdGlvblN0eWxlcyIsInVzZU1lbW8iLCJzdGFydEhlaWdodFJlZiIsInVzZVJlZiIsInNpZGVQYW5lbCIsIndpZHRoIiwiY2FsY1Bvc2l0aW9uIiwidXBkYXRlUG9zaXRpb24iLCJzdGFydFJlc2l6ZSIsIl9sZWdlbmRDb250ZW50UmVmJGN1cjIiLCJjb250ZW50IiwicXVlcnlTZWxlY3RvciIsIm9mZnNldEhlaWdodCIsInJlc2l6ZSIsImRlbHRhWSIsIl9sZWdlbmRDb250ZW50UmVmJGN1cjMiLCJuZXh0SGVpZ2h0IiwibWluIiwicG9zUmVmIiwidXNlRWZmZWN0IiwiY3VycmVudFBvcyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2UtbGVnZW5kLXBvc2l0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7dXNlTWVtbywgdXNlUmVmLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0fSBmcm9tICdyZWFjdCc7XG5cbmV4cG9ydCB0eXBlIE1hcExlZ2VuZENvbnRyb2xTZXR0aW5ncyA9IHtcbiAgcG9zaXRpb246IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICAgIGFuY2hvclg6ICdsZWZ0JyB8ICdyaWdodCc7XG4gICAgYW5jaG9yWTogJ3RvcCcgfCAnYm90dG9tJztcbiAgfTtcbiAgY29udGVudEhlaWdodDogbnVtYmVyO1xufTtcblxudHlwZSBQYXJhbXMgPSB7XG4gIGxlZ2VuZENvbnRlbnRSZWY6IFJlYWN0Lk11dGFibGVSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgaXNTaWRlUGFuZWxTaG93bjogYm9vbGVhbjtcbiAgc2V0dGluZ3M6IE1hcExlZ2VuZENvbnRyb2xTZXR0aW5ncztcbiAgb25DaGFuZ2VTZXR0aW5nczogKHNldHRpbmdzOiBQYXJ0aWFsPE1hcExlZ2VuZENvbnRyb2xTZXR0aW5ncz4pID0+IHZvaWQ7XG4gIHRoZW1lOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxudHlwZSBSZXR1cm5UeXBlID0ge1xuICBwb3NpdGlvblN0eWxlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHVwZGF0ZVBvc2l0aW9uOiAoKSA9PiB2b2lkO1xuICBjb250ZW50SGVpZ2h0OiBudW1iZXI7XG4gIHN0YXJ0UmVzaXplOiAoKSA9PiB2b2lkO1xuICByZXNpemU6IChkZWx0YVk6IG51bWJlcikgPT4gdm9pZDtcbn07XG5cbmNvbnN0IE1BUkdJTiA9IHtcbiAgbGVmdDogMTAsXG4gIHRvcDogMTAsXG4gIHJpZ2h0OiAxMCxcbiAgYm90dG9tOiAzMFxufTtcbmNvbnN0IERFRkFVTFRfUE9TSVRJT046IE1hcExlZ2VuZENvbnRyb2xTZXR0aW5nc1sncG9zaXRpb24nXSA9IHtcbiAgeDogTUFSR0lOLnJpZ2h0LFxuICB5OiBNQVJHSU4uYm90dG9tLFxuICBhbmNob3JYOiAncmlnaHQnLFxuICBhbmNob3JZOiAnYm90dG9tJ1xufTtcbmNvbnN0IE1JTl9DT05URU5UX0hFSUdIVCA9IDEwMDtcblxuZXhwb3J0IHR5cGUgVXNlQ2FsY0xlZ2VuZFBvc2l0aW9uUHJvcHMgPSB7XG4gIGxlZ2VuZENvbnRlbnRSZWY6IFJlYWN0Lk11dGFibGVSZWZPYmplY3Q8SFRNTEVsZW1lbnQgfCBudWxsPjtcbiAgaXNTaWRlUGFuZWxTaG93bjogYm9vbGVhbjtcbiAgc2lkZVBhbmVsV2lkdGg6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxjTGVnZW5kUG9zaXRpb24oe1xuICBsZWdlbmRDb250ZW50UmVmLFxuICBpc1NpZGVQYW5lbFNob3duLFxuICBzaWRlUGFuZWxXaWR0aFxufTogVXNlQ2FsY0xlZ2VuZFBvc2l0aW9uUHJvcHMpIHtcbiAgcmV0dXJuIHVzZUNhbGxiYWNrKCgpOiBNYXBMZWdlbmRDb250cm9sU2V0dGluZ3NbJ3Bvc2l0aW9uJ10gPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBsZWdlbmRDb250ZW50UmVmLmN1cnJlbnQ/LmNsb3Nlc3QoJy5rZXBsZXItZ2wnKTtcbiAgICBjb25zdCBsZWdlbmRDb250ZW50ID0gbGVnZW5kQ29udGVudFJlZi5jdXJyZW50O1xuICAgIGlmICghbGVnZW5kQ29udGVudCB8fCAhKHJvb3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBERUZBVUxUX1BPU0lUSU9OO1xuICAgIH1cbiAgICBjb25zdCBsZWdlbmRSZWN0ID0gbGVnZW5kQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtYXBSb290Qm91bmRzID0gcm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0U2lkZWJhck9mZnNldCA9IGlzU2lkZVBhbmVsU2hvd24gPyBzaWRlUGFuZWxXaWR0aCA6IDA7XG5cbiAgICBjb25zdCBsZWZ0T2Zmc2V0ID0gTWF0aC5tYXgoXG4gICAgICBNQVJHSU4ubGVmdCxcbiAgICAgIGxlZ2VuZFJlY3QubGVmdCAtIG1hcFJvb3RCb3VuZHMubGVmdCAtIGxlZnRTaWRlYmFyT2Zmc2V0XG4gICAgKTtcbiAgICBjb25zdCByaWdodE9mZnNldCA9IE1hdGgubWF4KE1BUkdJTi5yaWdodCwgbWFwUm9vdEJvdW5kcy5yaWdodCAtIGxlZ2VuZFJlY3QucmlnaHQpO1xuXG4gICAgY29uc3QgdG9wT2Zmc2V0ID0gTWF0aC5tYXgoTUFSR0lOLnRvcCwgbGVnZW5kUmVjdC50b3ApO1xuICAgIGNvbnN0IGJvdHRvbU9mZnNldCA9IE1hdGgubWF4KE1BUkdJTi5ib3R0b20sIG1hcFJvb3RCb3VuZHMuYm90dG9tIC0gbGVnZW5kUmVjdC5ib3R0b20pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihsZWZ0T2Zmc2V0IDwgcmlnaHRPZmZzZXRcbiAgICAgICAgPyB7eDogbGVmdE9mZnNldCArIGxlZnRTaWRlYmFyT2Zmc2V0LCBhbmNob3JYOiAnbGVmdCd9XG4gICAgICAgIDoge3g6IHJpZ2h0T2Zmc2V0LCBhbmNob3JYOiAncmlnaHQnfSksXG4gICAgICAuLi4odG9wT2Zmc2V0IDwgYm90dG9tT2Zmc2V0XG4gICAgICAgID8ge3k6IHRvcE9mZnNldCwgYW5jaG9yWTogJ3RvcCd9XG4gICAgICAgIDoge3k6IGJvdHRvbU9mZnNldCwgYW5jaG9yWTogJ2JvdHRvbSd9KVxuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbaXNTaWRlUGFuZWxTaG93biwgc2lkZVBhbmVsV2lkdGhdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYWxjdWxhdGVzIHRoZSBhbmNob3JlZCBwb3NpdGlvbiBvZiB0aGUgbWFwIGxlZ2VuZFxuICogdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VMZWdlbmRQb3NpdGlvbih7XG4gIGxlZ2VuZENvbnRlbnRSZWYsXG4gIGlzU2lkZVBhbmVsU2hvd24sXG4gIHNldHRpbmdzLFxuICBvbkNoYW5nZVNldHRpbmdzLFxuICB0aGVtZVxufTogUGFyYW1zKTogUmV0dXJuVHlwZSB7XG4gIGNvbnN0IHBvcyA9IHNldHRpbmdzPy5wb3NpdGlvbiA/PyBERUZBVUxUX1BPU0lUSU9OO1xuICBjb25zdCBjb250ZW50SGVpZ2h0ID0gc2V0dGluZ3M/LmNvbnRlbnRIZWlnaHQgPz8gLTE7XG4gIGNvbnN0IHBvc2l0aW9uU3R5bGVzID0gdXNlTWVtbygoKSA9PiAoe1twb3MuYW5jaG9yWF06IHBvcy54LCBbcG9zLmFuY2hvclldOiBwb3MueX0pLCBbcG9zXSk7XG4gIGNvbnN0IHN0YXJ0SGVpZ2h0UmVmID0gdXNlUmVmKDApO1xuICBjb25zdCBzaWRlUGFuZWxXaWR0aCA9IHRoZW1lLnNpZGVQYW5lbD8ud2lkdGggfHwgMDtcblxuICBjb25zdCBjYWxjUG9zaXRpb24gPSB1c2VDYWxjTGVnZW5kUG9zaXRpb24oe1xuICAgIGxlZ2VuZENvbnRlbnRSZWYsXG4gICAgaXNTaWRlUGFuZWxTaG93bixcbiAgICBzaWRlUGFuZWxXaWR0aFxuICB9KTtcbiAgY29uc3QgdXBkYXRlUG9zaXRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiBvbkNoYW5nZVNldHRpbmdzKHtwb3NpdGlvbjogY2FsY1Bvc2l0aW9uKCl9KSxcbiAgICBbY2FsY1Bvc2l0aW9uLCBvbkNoYW5nZVNldHRpbmdzXVxuICApO1xuXG4gIGNvbnN0IHN0YXJ0UmVzaXplID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBsZWdlbmRDb250ZW50UmVmLmN1cnJlbnQ/LnF1ZXJ5U2VsZWN0b3IoJy5tYXAtY29udHJvbF9fcGFuZWwtY29udGVudCcpO1xuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIHN0YXJ0SGVpZ2h0UmVmLmN1cnJlbnQgPSBjb250ZW50Lm9mZnNldEhlaWdodDtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG4gIGNvbnN0IHJlc2l6ZSA9IHVzZUNhbGxiYWNrKFxuICAgIGRlbHRhWSA9PiB7XG4gICAgICBjb25zdCByb290ID0gbGVnZW5kQ29udGVudFJlZi5jdXJyZW50Py5jbG9zZXN0KCcua2VwbGVyLWdsJyk7XG4gICAgICBjb25zdCBsZWdlbmRDb250ZW50ID0gbGVnZW5kQ29udGVudFJlZi5jdXJyZW50O1xuICAgICAgaWYgKHJvb3QgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBsZWdlbmRDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IGxlZ2VuZFJlY3QgPSBsZWdlbmRDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBuZXh0SGVpZ2h0ID0gTWF0aC5taW4oXG4gICAgICAgICAgcm9vdC5vZmZzZXRIZWlnaHQgLSBsZWdlbmRSZWN0LnRvcCAtIDEwMCxcbiAgICAgICAgICBNYXRoLm1heChNSU5fQ09OVEVOVF9IRUlHSFQsIHN0YXJ0SGVpZ2h0UmVmLmN1cnJlbnQgKyBkZWx0YVkpXG4gICAgICAgICk7XG4gICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe2NvbnRlbnRIZWlnaHQ6IG5leHRIZWlnaHR9KTtcbiAgICAgICAgaWYgKGNvbnRlbnRIZWlnaHQgPiAwICYmIHBvcy5hbmNob3JZID09PSAnYm90dG9tJykge1xuICAgICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe3Bvc2l0aW9uOiB7Li4ucG9zLCB5OiBwb3MueSAtIChuZXh0SGVpZ2h0IC0gY29udGVudEhlaWdodCl9fSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbY29udGVudEhlaWdodCwgcG9zLCBvbkNoYW5nZVNldHRpbmdzXVxuICApO1xuXG4gIC8vIFNoaWZ0IHdoZW4gc2lkZSBwYW5lbCBpcyBzaG93bi9oaWRkZW5cbiAgY29uc3QgcG9zUmVmID0gdXNlUmVmKHBvcyk7XG4gIHBvc1JlZi5jdXJyZW50ID0gcG9zO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBwb3NSZWYuY3VycmVudDtcbiAgICBpZiAoY3VycmVudFBvcy5hbmNob3JYID09PSAnbGVmdCcpIHtcbiAgICAgIGlmIChpc1NpZGVQYW5lbFNob3duKSB7XG4gICAgICAgIGlmIChjdXJyZW50UG9zLnggPD0gc2lkZVBhbmVsV2lkdGggKyBNQVJHSU4ubGVmdCkge1xuICAgICAgICAgIG9uQ2hhbmdlU2V0dGluZ3Moe3Bvc2l0aW9uOiB7Li4uY3VycmVudFBvcywgeDogc2lkZVBhbmVsV2lkdGggKyBNQVJHSU4ubGVmdH19KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25DaGFuZ2VTZXR0aW5ncyh7XG4gICAgICAgICAgcG9zaXRpb246IHsuLi5jdXJyZW50UG9zLCB4OiBNYXRoLm1heChNQVJHSU4ubGVmdCwgY3VycmVudFBvcy54IC0gc2lkZVBhbmVsV2lkdGgpfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtpc1NpZGVQYW5lbFNob3duLCBvbkNoYW5nZVNldHRpbmdzLCBzaWRlUGFuZWxXaWR0aF0pO1xuXG4gIHJldHVybiB7cG9zaXRpb25TdHlsZXMsIHVwZGF0ZVBvc2l0aW9uLCBjb250ZW50SGVpZ2h0LCBzdGFydFJlc2l6ZSwgcmVzaXplfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQThELFNBQUFDLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIsQ0FBQSxVQUFBQyxDQUFBLFdBQUFXLFNBQUEsQ0FBQVosQ0FBQSxJQUFBWSxTQUFBLENBQUFaLENBQUEsUUFBQUEsQ0FBQSxPQUFBRixPQUFBLENBQUFJLE1BQUEsQ0FBQUQsQ0FBQSxPQUFBYSxPQUFBLFdBQUFkLENBQUEsUUFBQWUsZ0JBQUEsYUFBQWhCLENBQUEsRUFBQUMsQ0FBQSxFQUFBQyxDQUFBLENBQUFELENBQUEsU0FBQUUsTUFBQSxD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