UNPKG

@readr-media/react-infinite-scroll-list

Version:

The component progressively fetches data when page being scrolled to bottom and renders them.

182 lines (150 loc) 21.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = InfiniteScrollList; var _react = require("react"); var _jsxRuntime = require("react/jsx-runtime"); function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } /** * This component will progressively fetch data and render theme */ function InfiniteScrollList(_ref) { var initialList = _ref.initialList, amountOfElements = _ref.amountOfElements, pageAmount = _ref.pageAmount, pageSize = _ref.pageSize, _ref$isAutoFetch = _ref.isAutoFetch, isAutoFetch = _ref$isAutoFetch === void 0 ? true : _ref$isAutoFetch, fetchListInPage = _ref.fetchListInPage, children = _ref.children, loader = _ref.loader, _ref$hasCustomTrigger = _ref.hasCustomTrigger, hasCustomTrigger = _ref$hasCustomTrigger === void 0 ? false : _ref$hasCustomTrigger; var initialListIsArray = Array.isArray(initialList); var _useState = (0, _react.useState)(!initialListIsArray ? 0 : pageSize), _useState2 = _slicedToArray(_useState, 2), renderSize = _useState2[0], setRenderSize = _useState2[1]; var _useState3 = (0, _react.useState)(initialListIsArray ? _toConsumableArray(initialList) : []), _useState4 = _slicedToArray(_useState3, 2), dataList = _useState4[0], setDataList = _useState4[1]; /** * If initialList is an empty array, it means that no element have been displayed at beginning, * so initialPage needs to be set to 0 to avoid undisplayed elements being skipped. */ var initialPage = initialListIsArray ? 1 : 0; /** * The number of fetches that is sent currently. * State will possibly change when executing function `handleLoadMore` */ var fetchedPage = (0, _react.useRef)(initialPage); var renderList = dataList.slice(0, renderSize); var isLoading = (0, _react.useRef)(false); var _useState5 = (0, _react.useState)(false), _useState6 = _slicedToArray(_useState5, 2), fetchEnded = _useState6[0], setFetchEnded = _useState6[1]; var hasNotFetchedData = (0, _react.useMemo)(function () { if (typeof amountOfElements === 'number' && amountOfElements) { return dataList.length < amountOfElements; } if (typeof pageAmount === 'number' && pageAmount) { return fetchedPage.current < pageAmount; } return true; }, [amountOfElements, dataList.length, pageAmount]); var hasNotRenderedData = (hasNotFetchedData || renderSize < dataList.length) && fetchEnded === false; var isNotEnoughToRender = pageAmount ? fetchedPage.current < pageAmount && dataList.length - renderSize < pageSize : dataList.length - renderSize < pageSize; var handleLoadMore = (0, _react.useCallback)(function () { if (isLoading.current) { return; } var oldRenderSize = renderSize; if (isNotEnoughToRender && hasNotFetchedData) { var newPage = fetchedPage.current + 1; isLoading.current = true; fetchListInPage(newPage).then(function (newList) { if (newList.length === 0) { setFetchEnded(true); } var list = [].concat(_toConsumableArray(dataList), _toConsumableArray(newList)); if (amountOfElements) { setDataList(list.slice(0, amountOfElements)); setRenderSize(Math.min(oldRenderSize + pageSize, amountOfElements)); } else { setDataList(list); setRenderSize(Math.min(oldRenderSize + pageSize, list.length)); } fetchedPage.current = newPage; isLoading.current = false; }); } else { if (amountOfElements) { setRenderSize(Math.min(oldRenderSize + pageSize, amountOfElements)); } else { setRenderSize(Math.min(oldRenderSize + pageSize, dataList.length)); } } }, [fetchListInPage, dataList, amountOfElements, pageSize, renderSize, isNotEnoughToRender, hasNotFetchedData]); var triggerRef = (0, _react.useRef)(null); (0, _react.useEffect)(function () { var callback = function callback(entries, observer) { entries.forEach(function (entry) { if (entry.isIntersecting) { if (hasNotRenderedData) { handleLoadMore(); } else { observer.unobserve(entry.target); } } }); }; var clickHandler = function clickHandler() { if (hasNotRenderedData) { handleLoadMore(); } else { this.removeEventListener('click', clickHandler); } }; var observer = new IntersectionObserver(callback, { root: null, rootMargin: '0px', threshold: 0 }); var triggerElement = triggerRef.current; if (triggerElement) { if (isAutoFetch) { observer.observe(triggerElement); } else { triggerElement.addEventListener('click', clickHandler); } } return function () { if (triggerElement) { if (isAutoFetch) { observer.disconnect(); } else { triggerElement.removeEventListener('click', clickHandler); } } }; }, [handleLoadMore, isAutoFetch, hasNotRenderedData, hasCustomTrigger]); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [children(renderList, hasCustomTrigger ? triggerRef : undefined), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { ref: !hasCustomTrigger ? triggerRef : undefined, children: hasNotRenderedData && loader })] }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJbmZpbml0ZVNjcm9sbExpc3QiLCJpbml0aWFsTGlzdCIsImFtb3VudE9mRWxlbWVudHMiLCJwYWdlQW1vdW50IiwicGFnZVNpemUiLCJpc0F1dG9GZXRjaCIsImZldGNoTGlzdEluUGFnZSIsImNoaWxkcmVuIiwibG9hZGVyIiwiaGFzQ3VzdG9tVHJpZ2dlciIsImluaXRpYWxMaXN0SXNBcnJheSIsIkFycmF5IiwiaXNBcnJheSIsInVzZVN0YXRlIiwicmVuZGVyU2l6ZSIsInNldFJlbmRlclNpemUiLCJkYXRhTGlzdCIsInNldERhdGFMaXN0IiwiaW5pdGlhbFBhZ2UiLCJmZXRjaGVkUGFnZSIsInVzZVJlZiIsInJlbmRlckxpc3QiLCJzbGljZSIsImlzTG9hZGluZyIsImZldGNoRW5kZWQiLCJzZXRGZXRjaEVuZGVkIiwiaGFzTm90RmV0Y2hlZERhdGEiLCJ1c2VNZW1vIiwibGVuZ3RoIiwiY3VycmVudCIsImhhc05vdFJlbmRlcmVkRGF0YSIsImlzTm90RW5vdWdoVG9SZW5kZXIiLCJoYW5kbGVMb2FkTW9yZSIsInVzZUNhbGxiYWNrIiwib2xkUmVuZGVyU2l6ZSIsIm5ld1BhZ2UiLCJ0aGVuIiwibmV3TGlzdCIsImxpc3QiLCJNYXRoIiwibWluIiwidHJpZ2dlclJlZiIsInVzZUVmZmVjdCIsImNhbGxiYWNrIiwiZW50cmllcyIsIm9ic2VydmVyIiwiZm9yRWFjaCIsImVudHJ5IiwiaXNJbnRlcnNlY3RpbmciLCJ1bm9ic2VydmUiLCJ0YXJnZXQiLCJjbGlja0hhbmRsZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJyb290Iiwicm9vdE1hcmdpbiIsInRocmVzaG9sZCIsInRyaWdnZXJFbGVtZW50Iiwib2JzZXJ2ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJkaXNjb25uZWN0IiwidW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vc3JjL2luZmluaXRlLXNjcm9sbC1saXN0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VFZmZlY3QsXG4gIHVzZUNhbGxiYWNrLFxuICB0eXBlIFJlYWN0Tm9kZSxcbiAgdXNlTWVtbyxcbn0gZnJvbSAncmVhY3QnXG5cbnR5cGUgUHJvcHM8VD4gPSB7XG4gIC8qKiBUaGUgaW5pdGlhbCBkYXRhIGxpc3QgdG8gcmVuZGVyICovXG4gIGluaXRpYWxMaXN0PzogVFtdIHwgbnVsbFxuICAvKiogTWF4aW11bSBvZiBpdGVtcyB0byBiZSByZW5kZXJlZCAgKi9cbiAgYW1vdW50T2ZFbGVtZW50cz86IG51bWJlclxuICAvKiogTWF4bWl1bSBvZiBmZXRjaGVzIHRvIGJlIGZpcmVkICovXG4gIHBhZ2VBbW91bnQ/OiBudW1iZXJcbiAgLyoqIFRoZSBhbW91bnQgb2YgaXRlbXMgcGVyIHNjcm9sbCBwYWdlICovXG4gIHBhZ2VTaXplOiBudW1iZXJcbiAgLyoqIFRoZSBmdW5jdGlvbiB0byBmZXRjaCBtb3JlIGRhdGEsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBwYWdlIGlzIHNjcm9sbGVkIHRvIGJvdHRvbSAqL1xuICBmZXRjaExpc3RJblBhZ2U6IChwYWdlOiBudW1iZXIpID0+IFByb21pc2U8VFtdPlxuICAvKiogVGhlIGZ1bmN0aW9uIHRvIHJlbmRlciBkYXRhIGxpc3QgKi9cbiAgY2hpbGRyZW46IChcbiAgICByZW5kZXJMaXN0OiBUW10sXG4gICAgY3VzdG9tVHJpZ2dlclJlZj86IFJlYWN0LlJlZk9iamVjdDxIVE1MRWxlbWVudD5cbiAgKSA9PiBSZWFjdE5vZGVcbiAgLyoqIFRoZSBsb2FkZXIgZWxlbWVudCB0byBkaXNwbGF5IGR1cmluZyBkYXRhIGxvYWRpbmcgKi9cbiAgbG9hZGVyPzogUmVhY3ROb2RlXG4gIC8qKiBXaGV0aGVyIHRoZSBjdXN0b20gdHJpZ2dlciByZWYgd2lsbCBwcm92aWRlZCB0aHJvdWdodCBjaGlsZHJlbiBjYWxsYmFjayB0byBzZXQgdXAgdHJpZ2dlciBwb2ludCAqL1xuICBoYXNDdXN0b21UcmlnZ2VyPzogYm9vbGVhblxuICAvKiogV2hldGhlciBkYXRhIGZldGNoIGlzIGV4ZWN1dGVkIGF0b21hdGljYWxseSAqL1xuICBpc0F1dG9GZXRjaD86IGJvb2xlYW5cbn1cblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCB3aWxsIHByb2dyZXNzaXZlbHkgZmV0Y2ggZGF0YSBhbmQgcmVuZGVyIHRoZW1lXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEluZmluaXRlU2Nyb2xsTGlzdDxUPih7XG4gIGluaXRpYWxMaXN0LFxuICBhbW91bnRPZkVsZW1lbnRzLFxuICBwYWdlQW1vdW50LFxuICBwYWdlU2l6ZSxcbiAgaXNBdXRvRmV0Y2ggPSB0cnVlLFxuICBmZXRjaExpc3RJblBhZ2UsXG4gIGNoaWxkcmVuLFxuICBsb2FkZXIsXG4gIGhhc0N1c3RvbVRyaWdnZXIgPSBmYWxzZSxcbn06IFByb3BzPFQ+KSB7XG4gIGNvbnN0IGluaXRpYWxMaXN0SXNBcnJheSA9IEFycmF5LmlzQXJyYXkoaW5pdGlhbExpc3QpXG4gIGNvbnN0IFtyZW5kZXJTaXplLCBzZXRSZW5kZXJTaXplXSA9IHVzZVN0YXRlKFxuICAgICFpbml0aWFsTGlzdElzQXJyYXkgPyAwIDogcGFnZVNpemVcbiAgKVxuICBjb25zdCBbZGF0YUxpc3QsIHNldERhdGFMaXN0XSA9IHVzZVN0YXRlKFxuICAgIGluaXRpYWxMaXN0SXNBcnJheSA/IFsuLi5pbml0aWFsTGlzdF0gOiBbXVxuICApXG5cbiAgLyoqXG4gICAqIElmIGluaXRpYWxMaXN0IGlzIGFuIGVtcHR5IGFycmF5LCBpdCBtZWFucyB0aGF0IG5vIGVsZW1lbnQgaGF2ZSBiZWVuIGRpc3BsYXllZCBhdCBiZWdpbm5pbmcsXG4gICAqIHNvIGluaXRpYWxQYWdlIG5lZWRzIHRvIGJlIHNldCB0byAwICB0byBhdm9pZCB1bmRpc3BsYXllZCBlbGVtZW50cyBiZWluZyBza2lwcGVkLlxuICAgKi9cbiAgY29uc3QgaW5pdGlhbFBhZ2UgPSBpbml0aWFsTGlzdElzQXJyYXkgPyAxIDogMFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZldGNoZXMgdGhhdCBpcyBzZW50IGN1cnJlbnRseS5cbiAgICogU3RhdGUgd2lsbCBwb3NzaWJseSBjaGFuZ2Ugd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gYGhhbmRsZUxvYWRNb3JlYFxuICAgKi9cbiAgY29uc3QgZmV0Y2hlZFBhZ2UgPSB1c2VSZWYoaW5pdGlhbFBhZ2UpXG4gIGNvbnN0IHJlbmRlckxpc3QgPSBkYXRhTGlzdC5zbGljZSgwLCByZW5kZXJTaXplKVxuICBjb25zdCBpc0xvYWRpbmcgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IFtmZXRjaEVuZGVkLCBzZXRGZXRjaEVuZGVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBoYXNOb3RGZXRjaGVkRGF0YSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgYW1vdW50T2ZFbGVtZW50cyA9PT0gJ251bWJlcicgJiYgYW1vdW50T2ZFbGVtZW50cykge1xuICAgICAgcmV0dXJuIGRhdGFMaXN0Lmxlbmd0aCA8IGFtb3VudE9mRWxlbWVudHNcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBhZ2VBbW91bnQgPT09ICdudW1iZXInICYmIHBhZ2VBbW91bnQpIHtcbiAgICAgIHJldHVybiBmZXRjaGVkUGFnZS5jdXJyZW50IDwgcGFnZUFtb3VudFxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH0sIFthbW91bnRPZkVsZW1lbnRzLCBkYXRhTGlzdC5sZW5ndGgsIHBhZ2VBbW91bnRdKVxuXG4gIGNvbnN0IGhhc05vdFJlbmRlcmVkRGF0YSA9XG4gICAgKGhhc05vdEZldGNoZWREYXRhIHx8IHJlbmRlclNpemUgPCBkYXRhTGlzdC5sZW5ndGgpICYmIGZldGNoRW5kZWQgPT09IGZhbHNlXG5cbiAgY29uc3QgaXNOb3RFbm91Z2hUb1JlbmRlciA9IHBhZ2VBbW91bnRcbiAgICA/IGZldGNoZWRQYWdlLmN1cnJlbnQgPCBwYWdlQW1vdW50ICYmXG4gICAgICBkYXRhTGlzdC5sZW5ndGggLSByZW5kZXJTaXplIDwgcGFnZVNpemVcbiAgICA6IGRhdGFMaXN0Lmxlbmd0aCAtIHJlbmRlclNpemUgPCBwYWdlU2l6ZVxuXG4gIGNvbnN0IGhhbmRsZUxvYWRNb3JlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmIChpc0xvYWRpbmcuY3VycmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgb2xkUmVuZGVyU2l6ZSA9IHJlbmRlclNpemVcblxuICAgIGlmIChpc05vdEVub3VnaFRvUmVuZGVyICYmIGhhc05vdEZldGNoZWREYXRhKSB7XG4gICAgICBjb25zdCBuZXdQYWdlID0gZmV0Y2hlZFBhZ2UuY3VycmVudCArIDFcbiAgICAgIGlzTG9hZGluZy5jdXJyZW50ID0gdHJ1ZVxuICAgICAgZmV0Y2hMaXN0SW5QYWdlKG5ld1BhZ2UpLnRoZW4oKG5ld0xpc3QpID0+IHtcbiAgICAgICAgaWYgKG5ld0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc2V0RmV0Y2hFbmRlZCh0cnVlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdCA9IFsuLi5kYXRhTGlzdCwgLi4ubmV3TGlzdF1cblxuICAgICAgICBpZiAoYW1vdW50T2ZFbGVtZW50cykge1xuICAgICAgICAgIHNldERhdGFMaXN0KGxpc3Quc2xpY2UoMCwgYW1vdW50T2ZFbGVtZW50cykpXG4gICAgICAgICAgc2V0UmVuZGVyU2l6ZShNYXRoLm1pbihvbGRSZW5kZXJTaXplICsgcGFnZVNpemUsIGFtb3VudE9mRWxlbWVudHMpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldERhdGFMaXN0KGxpc3QpXG4gICAgICAgICAgc2V0UmVuZGVyU2l6ZShNYXRoLm1pbihvbGRSZW5kZXJTaXplICsgcGFnZVNpemUsIGxpc3QubGVuZ3RoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZldGNoZWRQYWdlLmN1cnJlbnQgPSBuZXdQYWdlXG4gICAgICAgIGlzTG9hZGluZy5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhbW91bnRPZkVsZW1lbnRzKSB7XG4gICAgICAgIHNldFJlbmRlclNpemUoTWF0aC5taW4ob2xkUmVuZGVyU2l6ZSArIHBhZ2VTaXplLCBhbW91bnRPZkVsZW1lbnRzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFJlbmRlclNpemUoTWF0aC5taW4ob2xkUmVuZGVyU2l6ZSArIHBhZ2VTaXplLCBkYXRhTGlzdC5sZW5ndGgpKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGZldGNoTGlzdEluUGFnZSxcbiAgICBkYXRhTGlzdCxcbiAgICBhbW91bnRPZkVsZW1lbnRzLFxuICAgIHBhZ2VTaXplLFxuICAgIHJlbmRlclNpemUsXG4gICAgaXNOb3RFbm91Z2hUb1JlbmRlcixcbiAgICBoYXNOb3RGZXRjaGVkRGF0YSxcbiAgXSlcblxuICBjb25zdCB0cmlnZ2VyUmVmID0gdXNlUmVmPEhUTUxFbGVtZW50PihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY2FsbGJhY2s6IEludGVyc2VjdGlvbk9ic2VydmVyQ2FsbGJhY2sgPSAoZW50cmllcywgb2JzZXJ2ZXIpID0+IHtcbiAgICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgaWYgKGhhc05vdFJlbmRlcmVkRGF0YSkge1xuICAgICAgICAgICAgaGFuZGxlTG9hZE1vcmUoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZlci51bm9ic2VydmUoZW50cnkudGFyZ2V0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBjbGlja0hhbmRsZXIgPSBmdW5jdGlvbiAodGhpczogSFRNTERpdkVsZW1lbnQpIHtcbiAgICAgIGlmIChoYXNOb3RSZW5kZXJlZERhdGEpIHtcbiAgICAgICAgaGFuZGxlTG9hZE1vcmUoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGNsaWNrSGFuZGxlcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywge1xuICAgICAgcm9vdDogbnVsbCxcbiAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgIH0pXG5cbiAgICBjb25zdCB0cmlnZ2VyRWxlbWVudCA9IHRyaWdnZXJSZWYuY3VycmVudFxuXG4gICAgaWYgKHRyaWdnZXJFbGVtZW50KSB7XG4gICAgICBpZiAoaXNBdXRvRmV0Y2gpIHtcbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0cmlnZ2VyRWxlbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xpY2tIYW5kbGVyKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodHJpZ2dlckVsZW1lbnQpIHtcbiAgICAgICAgaWYgKGlzQXV0b0ZldGNoKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJpZ2dlckVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbGlja0hhbmRsZXIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtoYW5kbGVMb2FkTW9yZSwgaXNBdXRvRmV0Y2gsIGhhc05vdFJlbmRlcmVkRGF0YSwgaGFzQ3VzdG9tVHJpZ2dlcl0pXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2NoaWxkcmVuKHJlbmRlckxpc3QsIGhhc0N1c3RvbVRyaWdnZXIgPyB0cmlnZ2VyUmVmIDogdW5kZWZpbmVkKX1cbiAgICAgIDxkaXZcbiAgICAgICAgcmVmPXtcbiAgICAgICAgICAhaGFzQ3VzdG9tVHJpZ2dlclxuICAgICAgICAgICAgPyAodHJpZ2dlclJlZiBhcyBSZWFjdC5SZWZPYmplY3Q8SFRNTERpdkVsZW1lbnQ+KVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgPlxuICAgICAgICB7aGFzTm90UmVuZGVyZWREYXRhICYmIGxvYWRlcn1cbiAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBO0FBQ0E7QUFDQTtBQUNlLFNBQVNBLGtCQUFULE9BVUY7RUFBQSxJQVRYQyxXQVNXLFFBVFhBLFdBU1c7RUFBQSxJQVJYQyxnQkFRVyxRQVJYQSxnQkFRVztFQUFBLElBUFhDLFVBT1csUUFQWEEsVUFPVztFQUFBLElBTlhDLFFBTVcsUUFOWEEsUUFNVztFQUFBLDRCQUxYQyxXQUtXO0VBQUEsSUFMWEEsV0FLVyxpQ0FMRyxJQUtIO0VBQUEsSUFKWEMsZUFJVyxRQUpYQSxlQUlXO0VBQUEsSUFIWEMsUUFHVyxRQUhYQSxRQUdXO0VBQUEsSUFGWEMsTUFFVyxRQUZYQSxNQUVXO0VBQUEsaUNBRFhDLGdCQUNXO0VBQUEsSUFEWEEsZ0JBQ1csc0NBRFEsS0FDUjtFQUNYLElBQU1DLGtCQUFrQixHQUFHQyxLQUFLLENBQUNDLE9BQU4sQ0FBY1gsV0FBZCxDQUEzQjs7RUFDQSxnQkFBb0MsSUFBQVksZUFBQSxFQUNsQyxDQUFDSCxrQkFBRCxHQUFzQixDQUF0QixHQUEwQk4sUUFEUSxDQUFwQztFQUFBO0VBQUEsSUFBT1UsVUFBUDtFQUFBLElBQW1CQyxhQUFuQjs7RUFHQSxpQkFBZ0MsSUFBQUYsZUFBQSxFQUM5Qkgsa0JBQWtCLHNCQUFPVCxXQUFQLElBQXNCLEVBRFYsQ0FBaEM7RUFBQTtFQUFBLElBQU9lLFFBQVA7RUFBQSxJQUFpQkMsV0FBakI7RUFJQTtBQUNGO0FBQ0E7QUFDQTs7O0VB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