UNPKG

react-film

Version:

React component for showing carousel just like a film strip

233 lines (217 loc) 31.8 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } import "core-js/modules/es.array.iterator.js"; import "core-js/modules/es.object.from-entries.js"; import "core-js/modules/es.array.map.js"; import "core-js/modules/es.object.entries.js"; import "core-js/modules/web.timers.js"; import "core-js/modules/es.object.keys.js"; import "core-js/modules/es.symbol.js"; import "core-js/modules/es.array.filter.js"; import "core-js/modules/es.object.get-own-property-descriptor.js"; import "core-js/modules/es.array.for-each.js"; import "core-js/modules/web.dom-collections.for-each.js"; import "core-js/modules/es.object.get-own-property-descriptors.js"; import "core-js/modules/es.object.define-properties.js"; import "core-js/modules/es.object.define-property.js"; import createEmotion from '@emotion/css/create-instance'; import PropTypes from 'prop-types'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import AutoCenter from './AutoCenter'; import computeScrollLeft from './computeScrollLeft'; import createBasicStyleSet from './createBasicStyleSet'; import createCSSKey from './util/createCSSKey'; import FunctionContext from './FunctionContext'; import getView from './getView'; import InternalContext from './InternalContext'; import LegacyContext from './LegacyContext'; import patchStyleOptions from './patchStyleOptions'; import PropsContext from './PropsContext'; import useAnimateScrollLeft from './hooks/internal/useAnimateScrollLeft'; import useCallbackRefWithSubscribe from './hooks/internal/useCallbackRefWithSubscribe'; import useObserveScrollLeft from './hooks/internal/useObserveScrollLeft'; import ViewContext from './ViewContext'; // We pool the emotion, so we don't create a new set of <style> for every component and reuse as much as we could. var emotionPool = {}; var Composer = function Composer(_ref) { var children = _ref.children, dir = _ref.dir, height = _ref.height, nonce = _ref.nonce, numItems = _ref.numItems, styleOptions = _ref.styleOptions, styleSet = _ref.styleSet; dir = dir === 'ltr' || dir === 'rtl' ? dir : undefined; var patchedStyleOptions = useMemo(function () { return patchStyleOptions(styleOptions); }, [styleOptions]); var patchedStyleSet = useMemo(function () { return styleSet || createBasicStyleSet(patchedStyleOptions); }, [patchedStyleOptions, styleSet]); var styleSetClassNames = useMemo(function () { var emotion = emotionPool[nonce] || (emotionPool[nonce] = createEmotion({ key: "react-film--css-".concat(createCSSKey()), nonce: nonce })); return Object.fromEntries(Object.entries(patchedStyleSet).map(function (_ref2) { var _ref3 = _slicedToArray(_ref2, 2), name = _ref3[0], style = _ref3[1]; return [name, emotion.css(style) + '']; })); }, [nonce, patchedStyleSet]); var _useState = useState(), _useState2 = _slicedToArray(_useState, 2), _ = _useState2[0], forceRender = _useState2[1]; var itemContainerCallbackRefWithSubscribe = useCallbackRefWithSubscribe(); var scrollableCallbackRefWithSubscribe = useCallbackRefWithSubscribe(); var scrollLeftRef = useRef(null); var scrollTimeoutRef = useRef(); useEffect(function () { return function () { return clearTimeout(scrollTimeoutRef.current); }; }, [scrollTimeoutRef]); var scrollTo = useCallback(function (scrollFn) { var view = getView(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current); if (view) { var index = view.index, indexFraction = view.indexFraction; var targetIndex = scrollFn({ index: index, indexFraction: indexFraction }); if (typeof targetIndex === 'number') { scrollLeftRef.current = computeScrollLeft(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, targetIndex); forceRender({}); } } }, [dir, forceRender, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef]); var scrollOneLeft = useCallback(function () { scrollTo(function (_ref4) { var indexFraction = _ref4.indexFraction; return dir === 'rtl' ? Math.floor(indexFraction) + 1 : Math.ceil(indexFraction) - 1; }); }, [dir, scrollTo]); var scrollOneRight = useCallback(function () { scrollTo(function (_ref5) { var indexFraction = _ref5.indexFraction; return dir === 'rtl' ? Math.ceil(indexFraction) - 1 : Math.floor(indexFraction) + 1; }); }, [dir, scrollTo]); var functionContext = useMemo(function () { return { scrollTo: scrollTo, scrollOneLeft: scrollOneLeft, scrollOneRight: scrollOneRight }; }, [scrollTo, scrollOneLeft, scrollOneRight]); var internalContext = useMemo(function () { return { itemContainerCallbackRefWithSubscribe: itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe: scrollableCallbackRefWithSubscribe }; }, [itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe]); var propsContext = useMemo(function () { return { dir: dir, height: height, nonce: nonce, numItems: numItems, styleOptions: patchedStyleOptions, styleSetClassNames: styleSetClassNames }; }, [dir, height, nonce, numItems, patchedStyleOptions, styleSetClassNames]); var _useState3 = useState({ index: 0, indexFraction: 0, scrollBarPercentage: '0%', scrollBarWidth: '0%', scrolling: false }), _useState4 = _slicedToArray(_useState3, 2), viewContext = _useState4[0], setViewContext = _useState4[1]; // This will setViewContext and reset the "scrolling" flag after a period of time. var setViewContext2 = useCallback(function (nextViewContext) { setViewContext(nextViewContext); clearTimeout(scrollTimeoutRef.current); if (nextViewContext.scrolling) { scrollTimeoutRef.current = setTimeout(function () { return setViewContext(_objectSpread(_objectSpread({}, nextViewContext), {}, { scrolling: false })); }, // eslint-disable-next-line no-magic-numbers 500); } }, [scrollTimeoutRef, setViewContext]); var handleScroll = useCallback(function (_ref6) { var scrollBarPercentage = _ref6.fraction, initial = _ref6.initial, scrollBarWidth = _ref6.width; var view = getView(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, scrollLeftRef.current); if (view) { var index = view.index, indexFraction = view.indexFraction; setViewContext2({ index: index, indexFraction: indexFraction, scrolling: !initial, scrollBarPercentage: scrollBarPercentage, scrollBarWidth: scrollBarWidth }); } }, [dir, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef, setViewContext2]); var handleScrollToEnd = useCallback(function () { scrollLeftRef.current = null; forceRender({}); }, [forceRender, scrollLeftRef]); var legacyContext = useMemo(function () { return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, functionContext), internalContext), propsContext), viewContext); }, [functionContext, internalContext, propsContext, viewContext]); useAnimateScrollLeft(typeof scrollLeftRef.current === 'number' && scrollableCallbackRefWithSubscribe.current, scrollLeftRef.current, handleScrollToEnd); useEffect(function () { return scrollableCallbackRefWithSubscribe.subscribe(function (current) { if (current) { current.addEventListener('pointerdown', handleScrollToEnd, { passive: true }); return function () { return current.removeEventListener('pointerdown', handleScrollToEnd); }; } }); }, [handleScrollToEnd, scrollableCallbackRefWithSubscribe]); useObserveScrollLeft(scrollableCallbackRefWithSubscribe, handleScroll); return /*#__PURE__*/React.createElement(PropsContext.Provider, { value: propsContext }, /*#__PURE__*/React.createElement(InternalContext.Provider, { value: internalContext }, /*#__PURE__*/React.createElement(FunctionContext.Provider, { value: functionContext }, /*#__PURE__*/React.createElement(ViewContext.Provider, { value: viewContext }, /*#__PURE__*/React.createElement(LegacyContext.Provider, { value: legacyContext }, children, patchedStyleOptions.autoCenter && /*#__PURE__*/React.createElement(AutoCenter, null)))))); }; Composer.defaultProps = { children: undefined, dir: undefined, height: undefined, nonce: undefined, styleOptions: undefined, styleSet: undefined }; Composer.propTypes = { children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.element), PropTypes.element]), dir: PropTypes.oneOf(['ltr', 'rtl']), height: PropTypes.number, nonce: PropTypes.string, numItems: PropTypes.number.isRequired, styleOptions: PropTypes.any, styleSet: PropTypes.any }; export default Composer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJjcmVhdGVFbW90aW9uIiwiUHJvcFR5cGVzIiwiUmVhY3QiLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIkF1dG9DZW50ZXIiLCJjb21wdXRlU2Nyb2xsTGVmdCIsImNyZWF0ZUJhc2ljU3R5bGVTZXQiLCJjcmVhdGVDU1NLZXkiLCJGdW5jdGlvbkNvbnRleHQiLCJnZXRWaWV3IiwiSW50ZXJuYWxDb250ZXh0IiwiTGVnYWN5Q29udGV4dCIsInBhdGNoU3R5bGVPcHRpb25zIiwiUHJvcHNDb250ZXh0IiwidXNlQW5pbWF0ZVNjcm9sbExlZnQiLCJ1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUiLCJ1c2VPYnNlcnZlU2Nyb2xsTGVmdCIsIlZpZXdDb250ZXh0IiwiZW1vdGlvblBvb2wiLCJDb21wb3NlciIsImNoaWxkcmVuIiwiZGlyIiwiaGVpZ2h0Iiwibm9uY2UiLCJudW1JdGVtcyIsInN0eWxlT3B0aW9ucyIsInN0eWxlU2V0IiwidW5kZWZpbmVkIiwicGF0Y2hlZFN0eWxlT3B0aW9ucyIsInBhdGNoZWRTdHlsZVNldCIsInN0eWxlU2V0Q2xhc3NOYW1lcyIsImVtb3Rpb24iLCJrZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJuYW1lIiwic3R5bGUiLCJjc3MiLCJfIiwiZm9yY2VSZW5kZXIiLCJpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlIiwic2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZSIsInNjcm9sbExlZnRSZWYiLCJzY3JvbGxUaW1lb3V0UmVmIiwiY2xlYXJUaW1lb3V0IiwiY3VycmVudCIsInNjcm9sbFRvIiwic2Nyb2xsRm4iLCJ2aWV3IiwiaW5kZXgiLCJpbmRleEZyYWN0aW9uIiwidGFyZ2V0SW5kZXgiLCJzY3JvbGxPbmVMZWZ0IiwiTWF0aCIsImZsb29yIiwiY2VpbCIsInNjcm9sbE9uZVJpZ2h0IiwiZnVuY3Rpb25Db250ZXh0IiwiaW50ZXJuYWxDb250ZXh0IiwicHJvcHNDb250ZXh0Iiwic2Nyb2xsQmFyUGVyY2VudGFnZSIsInNjcm9sbEJhcldpZHRoIiwic2Nyb2xsaW5nIiwidmlld0NvbnRleHQiLCJzZXRWaWV3Q29udGV4dCIsInNldFZpZXdDb250ZXh0MiIsIm5leHRWaWV3Q29udGV4dCIsInNldFRpbWVvdXQiLCJoYW5kbGVTY3JvbGwiLCJmcmFjdGlvbiIsImluaXRpYWwiLCJ3aWR0aCIsImhhbmRsZVNjcm9sbFRvRW5kIiwibGVnYWN5Q29udGV4dCIsInN1YnNjcmliZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImF1dG9DZW50ZXIiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJhcnJheU9mIiwiZWxlbWVudCIsIm9uZU9mIiwibnVtYmVyIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBT0EsYUFBUCxNQUEwQiw4QkFBMUI7QUFDQSxPQUFPQyxTQUFQLE1BQXNCLFlBQXRCO0FBQ0EsT0FBT0MsS0FBUCxJQUFnQkMsV0FBaEIsRUFBNkJDLFNBQTdCLEVBQXdDQyxPQUF4QyxFQUFpREMsTUFBakQsRUFBeURDLFFBQXpELFFBQXlFLE9BQXpFO0FBRUEsT0FBT0MsVUFBUCxNQUF1QixjQUF2QjtBQUNBLE9BQU9DLGlCQUFQLE1BQThCLHFCQUE5QjtBQUNBLE9BQU9DLG1CQUFQLE1BQWdDLHVCQUFoQztBQUNBLE9BQU9DLFlBQVAsTUFBeUIscUJBQXpCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxPQUFQLE1BQW9CLFdBQXBCO0FBQ0EsT0FBT0MsZUFBUCxNQUE0QixtQkFBNUI7QUFDQSxPQUFPQyxhQUFQLE1BQTBCLGlCQUExQjtBQUNBLE9BQU9DLGlC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USxDQUFDK0QsU0FBVCxHQUFxQjtBQUNuQjlELEVBQUFBLFFBQVEsRUFBRXZCLFNBQVMsQ0FBQ3NGLFNBQVYsQ0FBb0IsQ0FBQ3RGLFNBQVMsQ0FBQ3VGLE9BQVYsQ0FBa0J2RixTQUFTLENBQUN3RixPQUE1QixDQUFELEVBQXVDeEYsU0FBUyxDQUFDd0YsT0FBakQsQ0FBcEIsQ0FEUztBQUVuQmhFLEVBQUFBLEdBQUcsRUFBRXhCLFNBQVMsQ0FBQ3lGLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFoQixDQUZjO0FBR25CaEUsRUFBQUEsTUFBTSxFQUFFekIsU0FBUyxDQUFDMEYsTUFIQztBQUluQmhFLEVBQUFBLEtBQUssRUFBRTFCLFNBQVMsQ0FBQzJGLE1BSkU7QUFLbkJoRSxFQUFBQSxRQUFRLEVBQUUzQixTQUFTLENBQUMwRixNQUFWLENBQWlCRSxVQUxSO0FBTW5CaEUsRUFBQUEsWUFBWSxFQUFFNUIsU0FBUyxDQUFDNkYsR0FOTDtBQU9uQmhFLEVBQUFBLFFBQVEsRUFBRTdCLFNBQVMsQ0FBQzZGO0FBUEQsQ0FBckI7QUFVQSxlQUFldkUsUUFBZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVFbW90aW9uIGZyb20gJ0BlbW90aW9uL2Nzcy9jcmVhdGUtaW5zdGFuY2UnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0b0NlbnRlciBmcm9tICcuL0F1dG9DZW50ZXInO1xuaW1wb3J0IGNvbXB1dGVTY3JvbGxMZWZ0IGZyb20gJy4vY29tcHV0ZVNjcm9sbExlZnQnO1xuaW1wb3J0IGNyZWF0ZUJhc2ljU3R5bGVTZXQgZnJvbSAnLi9jcmVhdGVCYXNpY1N0eWxlU2V0JztcbmltcG9ydCBjcmVhdGVDU1NLZXkgZnJvbSAnLi91dGlsL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgRnVuY3Rpb25Db250ZXh0IGZyb20gJy4vRnVuY3Rpb25Db250ZXh0JztcbmltcG9ydCBnZXRWaWV3IGZyb20gJy4vZ2V0Vmlldyc7XG5pbXBvcnQgSW50ZXJuYWxDb250ZXh0IGZyb20gJy4vSW50ZXJuYWxDb250ZXh0JztcbmltcG9ydCBMZWdhY3lDb250ZXh0IGZyb20gJy4vTGVnYWN5Q29udGV4dCc7XG5pbXBvcnQgcGF0Y2hTdHlsZU9wdGlvbnMgZnJvbSAnLi9wYXRjaFN0eWxlT3B0aW9ucyc7XG5pbXBvcnQgUHJvcHNDb250ZXh0IGZyb20gJy4vUHJvcHNDb250ZXh0JztcbmltcG9ydCB1c2VBbmltYXRlU2Nyb2xsTGVmdCBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZUFuaW1hdGVTY3JvbGxMZWZ0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUnO1xuaW1wb3J0IHVzZU9ic2VydmVTY3JvbGxMZWZ0IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlT2JzZXJ2ZVNjcm9sbExlZnQnO1xuaW1wb3J0IFZpZXdDb250ZXh0IGZyb20gJy4vVmlld0NvbnRleHQnO1xuXG4vLyBXZSBwb29sIHRoZSBlbW90aW9uLCBzbyB3ZSBkb24ndCBjcmVhdGUgYSBuZXcgc2V0IG9mIDxzdHlsZT4gZm9yIGV2ZXJ5IGNvbXBvbmVudCBhbmQgcmV1c2UgYXMgbXVjaCBhcyB3ZSBjb3VsZC5cbmNvbnN0IGVtb3Rpb25Qb29sID0ge307XG5cbmNvbnN0IENvbXBvc2VyID0gKHsgY2hpbGRyZW4sIGRpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQgfSkgPT4ge1xuICBkaXIgPSBkaXIgPT09ICdsdHInIHx8IGRpciA9PT0gJ3J0bCcgPyBkaXIgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlT3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gcGF0Y2hTdHlsZU9wdGlvbnMoc3R5bGVPcHRpb25zKSwgW3N0eWxlT3B0aW9uc10pO1xuICBjb25zdCBwYXRjaGVkU3R5bGVTZXQgPSB1c2VNZW1vKFxuICAgICgpID0+IHN0eWxlU2V0IHx8IGNyZWF0ZUJhc2ljU3R5bGVTZXQocGF0Y2hlZFN0eWxlT3B0aW9ucyksXG4gICAgW3BhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0XVxuICApO1xuXG4gIGNvbnN0IHN0eWxlU2V0Q2xhc3NOYW1lcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgcmVhY3QtZmlsbS0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXRjaGVkU3R5bGVTZXQpLm1hcCgoW25hbWUsIHN0eWxlXSkgPT4gW25hbWUsIGVtb3Rpb24uY3NzKHN0eWxlKSArICcnXSkpO1xuICB9LCBbbm9uY2UsIHBhdGNoZWRTdHlsZVNldF0pO1xuXG4gIGNvbnN0IFtfLCBmb3JjZVJlbmRlcl0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlID0gdXNlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlKCk7XG4gIGNvbnN0IHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgPSB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUoKTtcbiAgY29uc3Qgc2Nyb2xsTGVmdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2Nyb2xsVGltZW91dFJlZiA9IHVzZVJlZigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZW91dFJlZi5jdXJyZW50KSwgW3Njcm9sbFRpbWVvdXRSZWZdKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIHNjcm9sbEZuID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gc2Nyb2xsRm4oeyBpbmRleCwgaW5kZXhGcmFjdGlvbiB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNjcm9sbExlZnRSZWYuY3VycmVudCA9IGNvbXB1dGVTY3JvbGxMZWZ0KFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2RpciwgZm9yY2VSZW5kZXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWZdXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lTGVmdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUbygoeyBpbmRleEZyYWN0aW9uIH0pID0+IChkaXIgPT09ICdydGwnID8gTWF0aC5mbG9vcihpbmRleEZyYWN0aW9uKSArIDEgOiBNYXRoLmNlaWwoaW5kZXhGcmFjdGlvbikgLSAxKSk7XG4gIH0sIFtkaXIsIHNjcm9sbFRvXSk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lUmlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2Nyb2xsVG8oKHsgaW5kZXhGcmFjdGlvbiB9KSA9PiAoZGlyID09PSAncnRsJyA/IE1hdGguY2VpbChpbmRleEZyYWN0aW9uKSAtIDEgOiBNYXRoLmZsb29yKGluZGV4RnJhY3Rpb24pICsgMSkpO1xuICB9LCBbZGlyLCBzY3JvbGxUb10pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNjcm9sbFRvLFxuICAgICAgc2Nyb2xsT25lTGVmdCxcbiAgICAgIHNjcm9sbE9uZVJpZ2h0XG4gICAgfSksXG4gICAgW3Njcm9sbFRvLCBzY3JvbGxPbmVMZWZ0LCBzY3JvbGxPbmVSaWdodF1cbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbENvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLFxuICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZVxuICAgIH0pLFxuICAgIFtpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlXVxuICApO1xuXG4gIGNvbnN0IHByb3BzQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHsgZGlyLCBoZWlnaHQsIG5vbmNlLCBudW1JdGVtcywgc3R5bGVPcHRpb25zOiBwYXRjaGVkU3R5bGVPcHRpb25zLCBzdHlsZVNldENsYXNzTmFtZXMgfSksXG4gICAgW2RpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHBhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0Q2xhc3NOYW1lc11cbiAgKTtcblxuICBjb25zdCBbdmlld0NvbnRleHQsIHNldFZpZXdDb250ZXh0XSA9IHVzZVN0YXRlKHtcbiAgICBpbmRleDogMCxcbiAgICBpbmRleEZyYWN0aW9uOiAwLFxuICAgIHNjcm9sbEJhclBlcmNlbnRhZ2U6ICcwJScsXG4gICAgc2Nyb2xsQmFyV2lkdGg6ICcwJScsXG4gICAgc2Nyb2xsaW5nOiBmYWxzZVxuICB9KTtcblxuICAvLyBUaGlzIHdpbGwgc2V0Vmlld0NvbnRleHQgYW5kIHJlc2V0IHRoZSBcInNjcm9sbGluZ1wiIGZsYWcgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgY29uc3Qgc2V0Vmlld0NvbnRleHQyID0gdXNlQ2FsbGJhY2soXG4gICAgbmV4dFZpZXdDb250ZXh0ID0+IHtcbiAgICAgIHNldFZpZXdDb250ZXh0KG5leHRWaWV3Q29udGV4dCk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAobmV4dFZpZXdDb250ZXh0LnNjcm9sbGluZykge1xuICAgICAgICBzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBzZXRWaWV3Q29udGV4dCh7XG4gICAgICAgICAgICAgIC4uLm5leHRWaWV3Q29udGV4dCxcbiAgICAgICAgICAgICAgc2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzY3JvbGxUaW1lb3V0UmVmLCBzZXRWaWV3Q29udGV4dF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGwgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBmcmFjdGlvbjogc2Nyb2xsQmFyUGVyY2VudGFnZSwgaW5pdGlhbCwgd2lkdGg6IHNjcm9sbEJhcldpZHRoIH0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG5cbiAgICAgICAgc2V0Vmlld0NvbnRleHQyKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpbmRleEZyYWN0aW9uLFxuICAgICAgICAgIHNjcm9sbGluZzogIWluaXRpYWwsXG4gICAgICAgICAgc2Nyb2xsQmFyUGVyY2VudGFnZSxcbiAgICAgICAgICBzY3JvbGxCYXJXaWR0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWYsIHNldFZpZXdDb250ZXh0Ml1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0VuZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgfSwgW2ZvcmNlUmVuZGVyLCBzY3JvbGxMZWZ0UmVmXSk7XG5cbiAgY29uc3QgbGVnYWN5Q29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIC4uLmZ1bmN0aW9uQ29udGV4dCxcbiAgICAgIC4uLmludGVybmFsQ29udGV4dCxcbiAgICAgIC4uLnByb3BzQ29udGV4dCxcbiAgICAgIC4uLnZpZXdDb250ZXh0XG4gICAgfSksXG4gICAgW2Z1bmN0aW9uQ29udGV4dCwgaW50ZXJuYWxDb250ZXh0LCBwcm9wc0NvbnRleHQsIHZpZXdDb250ZXh0XVxuICApO1xuXG4gIHVzZUFuaW1hdGVTY3JvbGxMZWZ0KFxuICAgIHR5cGVvZiBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPT09ICdudW1iZXInICYmIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQsXG4gICAgaGFuZGxlU2Nyb2xsVG9FbmRcbiAgKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuc3Vic2NyaWJlKGN1cnJlbnQgPT4ge1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgcmV0dXJuICgpID0+IGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIFtoYW5kbGVTY3JvbGxUb0VuZCwgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZV1cbiAgKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsTGVmdChzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBoYW5kbGVTY3JvbGwpO1xuXG4gIHJldHVybiAoXG4gICAgPFByb3BzQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvcHNDb250ZXh0fT5cbiAgICAgIDxJbnRlcm5hbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ludGVybmFsQ29udGV4dH0+XG4gICAgICAgIDxGdW5jdGlvbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2Z1bmN0aW9uQ29udGV4dH0+XG4gICAgICAgICAgPFZpZXdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2aWV3Q29udGV4dH0+XG4gICAgICAgICAgICA8TGVnYWN5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17bGVnYWN5Q29udGV4dH0+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAge3BhdGNoZWRTdHlsZU9wdGlvbnMuYXV0b0NlbnRlciAmJiA8QXV0b0NlbnRlciAvPn1cbiAgICAgICAgICAgIDwvTGVnYWN5Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1ZpZXdDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L0Z1bmN0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSW50ZXJuYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUHJvcHNDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuQ29tcG9zZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBkaXI6IHVuZGVmaW5lZCxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIG5vbmNlOiB1bmRlZmluZWQsXG4gIHN0eWxlT3B0aW9uczogdW5kZWZpbmVkLFxuICBzdHlsZVNldDogdW5kZWZpbmVkXG59O1xuXG5Db21wb3Nlci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuZWxlbWVudCksIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGRpcjogUHJvcFR5cGVzLm9uZU9mKFsnbHRyJywgJ3J0bCddKSxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbnVtSXRlbXM6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc3R5bGVPcHRpb25zOiBQcm9wVHlwZXMuYW55LFxuICBzdHlsZVNldDogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zZXI7XG4iXX0=