UNPKG

react-film

Version:

React component for showing carousel just like a film strip

289 lines (232 loc) 33.3 kB
"use strict"; require("core-js/modules/es.object.keys.js"); require("core-js/modules/es.symbol.js"); require("core-js/modules/es.array.filter.js"); require("core-js/modules/es.object.get-own-property-descriptor.js"); require("core-js/modules/es.array.for-each.js"); require("core-js/modules/web.dom-collections.for-each.js"); require("core-js/modules/es.object.get-own-property-descriptors.js"); require("core-js/modules/es.object.define-properties.js"); require("core-js/modules/es.object.define-property.js"); require("core-js/modules/es.object.to-string.js"); require("core-js/modules/es.string.iterator.js"); require("core-js/modules/es.weak-map.js"); require("core-js/modules/web.dom-collections.iterator.js"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); require("core-js/modules/es.array.iterator.js"); require("core-js/modules/es.object.from-entries.js"); require("core-js/modules/es.array.map.js"); require("core-js/modules/es.object.entries.js"); require("core-js/modules/web.timers.js"); var _createInstance = _interopRequireDefault(require("@emotion/css/create-instance")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireWildcard(require("react")); var _AutoCenter = _interopRequireDefault(require("./AutoCenter")); var _computeScrollLeft = _interopRequireDefault(require("./computeScrollLeft")); var _createBasicStyleSet = _interopRequireDefault(require("./createBasicStyleSet")); var _createCSSKey = _interopRequireDefault(require("./util/createCSSKey")); var _FunctionContext = _interopRequireDefault(require("./FunctionContext")); var _getView = _interopRequireDefault(require("./getView")); var _InternalContext = _interopRequireDefault(require("./InternalContext")); var _LegacyContext = _interopRequireDefault(require("./LegacyContext")); var _patchStyleOptions = _interopRequireDefault(require("./patchStyleOptions")); var _PropsContext = _interopRequireDefault(require("./PropsContext")); var _useAnimateScrollLeft = _interopRequireDefault(require("./hooks/internal/useAnimateScrollLeft")); var _useCallbackRefWithSubscribe = _interopRequireDefault(require("./hooks/internal/useCallbackRefWithSubscribe")); var _useObserveScrollLeft = _interopRequireDefault(require("./hooks/internal/useObserveScrollLeft")); var _ViewContext = _interopRequireDefault(require("./ViewContext")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } 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) { (0, _defineProperty2["default"])(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; } // 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 = (0, _react.useMemo)(function () { return (0, _patchStyleOptions["default"])(styleOptions); }, [styleOptions]); var patchedStyleSet = (0, _react.useMemo)(function () { return styleSet || (0, _createBasicStyleSet["default"])(patchedStyleOptions); }, [patchedStyleOptions, styleSet]); var styleSetClassNames = (0, _react.useMemo)(function () { var emotion = emotionPool[nonce] || (emotionPool[nonce] = (0, _createInstance["default"])({ key: "react-film--css-".concat((0, _createCSSKey["default"])()), nonce: nonce })); return Object.fromEntries(Object.entries(patchedStyleSet).map(function (_ref2) { var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2), name = _ref3[0], style = _ref3[1]; return [name, emotion.css(style) + '']; })); }, [nonce, patchedStyleSet]); var _useState = (0, _react.useState)(), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), _ = _useState2[0], forceRender = _useState2[1]; var itemContainerCallbackRefWithSubscribe = (0, _useCallbackRefWithSubscribe["default"])(); var scrollableCallbackRefWithSubscribe = (0, _useCallbackRefWithSubscribe["default"])(); var scrollLeftRef = (0, _react.useRef)(null); var scrollTimeoutRef = (0, _react.useRef)(); (0, _react.useEffect)(function () { return function () { return clearTimeout(scrollTimeoutRef.current); }; }, [scrollTimeoutRef]); var scrollTo = (0, _react.useCallback)(function (scrollFn) { var view = (0, _getView["default"])(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 = (0, _computeScrollLeft["default"])(dir, scrollableCallbackRefWithSubscribe.current, itemContainerCallbackRefWithSubscribe.current, targetIndex); forceRender({}); } } }, [dir, forceRender, itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe, scrollLeftRef]); var scrollOneLeft = (0, _react.useCallback)(function () { scrollTo(function (_ref4) { var indexFraction = _ref4.indexFraction; return dir === 'rtl' ? Math.floor(indexFraction) + 1 : Math.ceil(indexFraction) - 1; }); }, [dir, scrollTo]); var scrollOneRight = (0, _react.useCallback)(function () { scrollTo(function (_ref5) { var indexFraction = _ref5.indexFraction; return dir === 'rtl' ? Math.ceil(indexFraction) - 1 : Math.floor(indexFraction) + 1; }); }, [dir, scrollTo]); var functionContext = (0, _react.useMemo)(function () { return { scrollTo: scrollTo, scrollOneLeft: scrollOneLeft, scrollOneRight: scrollOneRight }; }, [scrollTo, scrollOneLeft, scrollOneRight]); var internalContext = (0, _react.useMemo)(function () { return { itemContainerCallbackRefWithSubscribe: itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe: scrollableCallbackRefWithSubscribe }; }, [itemContainerCallbackRefWithSubscribe, scrollableCallbackRefWithSubscribe]); var propsContext = (0, _react.useMemo)(function () { return { dir: dir, height: height, nonce: nonce, numItems: numItems, styleOptions: patchedStyleOptions, styleSetClassNames: styleSetClassNames }; }, [dir, height, nonce, numItems, patchedStyleOptions, styleSetClassNames]); var _useState3 = (0, _react.useState)({ index: 0, indexFraction: 0, scrollBarPercentage: '0%', scrollBarWidth: '0%', scrolling: false }), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), viewContext = _useState4[0], setViewContext = _useState4[1]; // This will setViewContext and reset the "scrolling" flag after a period of time. var setViewContext2 = (0, _react.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 = (0, _react.useCallback)(function (_ref6) { var scrollBarPercentage = _ref6.fraction, initial = _ref6.initial, scrollBarWidth = _ref6.width; var view = (0, _getView["default"])(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 = (0, _react.useCallback)(function () { scrollLeftRef.current = null; forceRender({}); }, [forceRender, scrollLeftRef]); var legacyContext = (0, _react.useMemo)(function () { return _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, functionContext), internalContext), propsContext), viewContext); }, [functionContext, internalContext, propsContext, viewContext]); (0, _useAnimateScrollLeft["default"])(typeof scrollLeftRef.current === 'number' && scrollableCallbackRefWithSubscribe.current, scrollLeftRef.current, handleScrollToEnd); (0, _react.useEffect)(function () { return scrollableCallbackRefWithSubscribe.subscribe(function (current) { if (current) { current.addEventListener('pointerdown', handleScrollToEnd, { passive: true }); return function () { return current.removeEventListener('pointerdown', handleScrollToEnd); }; } }); }, [handleScrollToEnd, scrollableCallbackRefWithSubscribe]); (0, _useObserveScrollLeft["default"])(scrollableCallbackRefWithSubscribe, handleScroll); return /*#__PURE__*/_react["default"].createElement(_PropsContext["default"].Provider, { value: propsContext }, /*#__PURE__*/_react["default"].createElement(_InternalContext["default"].Provider, { value: internalContext }, /*#__PURE__*/_react["default"].createElement(_FunctionContext["default"].Provider, { value: functionContext }, /*#__PURE__*/_react["default"].createElement(_ViewContext["default"].Provider, { value: viewContext }, /*#__PURE__*/_react["default"].createElement(_LegacyContext["default"].Provider, { value: legacyContext }, children, patchedStyleOptions.autoCenter && /*#__PURE__*/_react["default"].createElement(_AutoCenter["default"], null)))))); }; Composer.defaultProps = { children: undefined, dir: undefined, height: undefined, nonce: undefined, styleOptions: undefined, styleSet: undefined }; Composer.propTypes = { children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].element), _propTypes["default"].element]), dir: _propTypes["default"].oneOf(['ltr', 'rtl']), height: _propTypes["default"].number, nonce: _propTypes["default"].string, numItems: _propTypes["default"].number.isRequired, styleOptions: _propTypes["default"].any, styleSet: _propTypes["default"].any }; var _default = Composer; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJlbW90aW9uUG9vbCIsIkNvbXBvc2VyIiwiY2hpbGRyZW4iLCJkaXIiLCJoZWlnaHQiLCJub25jZSIsIm51bUl0ZW1zIiwic3R5bGVPcHRpb25zIiwic3R5bGVTZXQiLCJ1bmRlZmluZWQiLCJwYXRjaGVkU3R5bGVPcHRpb25zIiwicGF0Y2hlZFN0eWxlU2V0Iiwic3R5bGVTZXRDbGFzc05hbWVzIiwiZW1vdGlvbiIsImtleSIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsIm1hcCIsIm5hbWUiLCJzdHlsZSIsImNzcyIsIl8iLCJmb3JjZVJlbmRlciIsIml0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUiLCJzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlIiwic2Nyb2xsTGVmdFJlZiIsInNjcm9sbFRpbWVvdXRSZWYiLCJjbGVhclRpbWVvdXQiLCJjdXJyZW50Iiwic2Nyb2xsVG8iLCJzY3JvbGxGbiIsInZpZXciLCJpbmRleCIsImluZGV4RnJhY3Rpb24iLCJ0YXJnZXRJbmRleCIsInNjcm9sbE9uZUxlZnQiLCJNYXRoIiwiZmxvb3IiLCJjZWlsIiwic2Nyb2xsT25lUmlnaHQiLCJmdW5jdGlvbkNvbnRleHQiLCJpbnRlcm5hbENvbnRleHQiLCJwcm9wc0NvbnRleHQiLCJzY3JvbGxCYXJQZXJjZW50YWdlIiwic2Nyb2xsQmFyV2lkdGgiLCJzY3JvbGxpbmciLCJ2aWV3Q29udGV4dCIsInNldFZpZXdDb250ZXh0Iiwic2V0Vmlld0NvbnRleHQyIiwibmV4dFZpZXdDb250ZXh0Iiwic2V0VGltZW91dCIsImhhbmRsZVNjcm9sbCIsImZyYWN0aW9uIiwiaW5pdGlhbCIsIndpZHRoIiwiaGFuZGxlU2Nyb2xsVG9FbmQiLCJsZWdhY3lDb250ZXh0Iiwic3Vic2NyaWJlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhc3NpdmUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYXV0b0NlbnRlciIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsIm9uZU9mVHlwZSIsImFycmF5T2YiLCJlbGVtZW50Iiwib25lT2YiLCJudW1iZXIiLCJzdHJpbmciLCJpc1JlcXVpcmVkIiwiYW55Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsV0FBVyxHQUFHLEVBQXBCOztBQUVBLElBQU1DLFFBQVEsR0FBRyxTQUFYQSxRQUFXLE9BQXdFO0FBQUEsTUFBckVDLFFBQXFFLFFBQXJFQSxRQUFxRTtBQUFBLE1BQTNEQyxHQUEyRCxRQUEzREEsR0FBMkQ7QUFBQSxNQUF0REMsTUFBc0QsUUFBdERBLE1BQXNEO0FBQUEsTUFBOUNDLEtBQThDLFFBQTlDQSxLQUE4QztBQUFBLE1BQXZDQyxRQUF1QyxRQUF2Q0EsUUFBdUM7QUFBQSxNQUE3QkMsWUFBNkIsUUFBN0JBLFlBQTZCO0FBQUEsTUFBZkMsUUFBZSxRQUFmQSxRQUFlO0FBQ3ZGTCxFQUFBQSxHQUFHLEdBQUdBLEdBQUcsS0FBSyxLQUFSLElBQWlCQSxHQUFHLEtBQUssS0FBekIsR0FBaUNBLEdBQWpDLEdBQXVDTSxTQUE3QztBQUVBLE1BQU1DLG1CQUFtQixHQUFHLG9CQUFRO0FBQUEsV0FBTSxtQ0FBa0JILFlBQWxCLENBQU47QUFBQSxHQUFSLEVBQStDLENBQUNBLFlBQUQsQ0FBL0MsQ0FBNUI7QUFDQSxNQUFNSSxlQUFlLEdBQUcsb0JBQ3RCO0FBQUEsV0FBTUgsUUFBUSxJQUFJLHFDQUFvQkUsbUJBQXBCLENBQWxCO0FBQUEsR0FEc0IsRUFFdEIsQ0FBQ0EsbUJBQUQsRUFBc0JGLFFBQXRCLENBRnNCLENBQXhCO0FBS0EsTUFBTUksa0JBQWtCLEdBQUcsb0JBQVEsWUFBTTtBQUN2QyxRQUFNQyxPQUFPLEdBQ1hiLFdBQVcsQ0FBQ0ssS0FBRCxDQUFYLEtBQXVCTCxXQUFXLENBQUNLLEtBQUQsQ0FBWCxHQUFxQixnQ0FBYztBQUFFUyxNQUFBQSxHQUFHLDRCQUFxQiwrQkFBckIsQ0FBTDtBQUE0Q1QsTUFBQUEsS0FBSyxFQUFMQTtBQUE1QyxLQUFkLENBQTVDLENBREY7QUFHQSxXQUFPVSxNQUFNLENBQUNDLFdBQVAsQ0FBbUJELE1BQU0sQ0FBQ0UsT0FBUCxDQUFlTixlQUFmLEVBQWdDTyxHQUFoQyxDQUFvQztBQUFBO0FBQUEsVUFBRUMsSUFBRjtBQUFBLFVBQVFDLEtBQVI7O0FBQUEsYUFBbUIsQ0FBQ0QsSUFBRCxFQUFPTixPQUFPLENBQUNRLEdBQVIsQ0FBWUQsS0FBWixJQUFxQixFQUE1QixDQUFuQjtBQUFBLEtBQXBDLENBQW5CLENBQVA7QUFDRCxHQUwwQixFQUt4QixDQUFDZixLQUFELEVBQVFNLGVBQVIsQ0FMd0IsQ0FBM0I7O0FBT0Esa0JBQXlCLHNCQUF6QjtBQUFBO0FBQUEsTUFBT1csQ0FBUDtBQUFBLE1BQVVDLFdBQVY7O0FBQ0EsTUFBTUMscUNBQXFDLEdBQUcsOENBQTlDO0FBQ0EsTUFBTUMsa0NBQWtDLEdBQUcsOENBQTNDO0FBQ0EsTUFBTUMsYUFBYSxHQUFHLG1CQUFPLElBQVAsQ0FBdEI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxvQkFBekI7QUFFQSx3QkFBVTtBQUFBLFdBQU07QUFBQSxhQUFNQyxZQUFZLENBQUNELGdCQUFnQixDQUFDRSxPQUFsQixDQUFsQjtBQUFBLEtBQU47QUFBQSxHQUFWLEVBQThELENBQUNGLGdCQUFELENBQTlEO0FBRUEsTUFBTUcsUUFBUSxHQUFHLHdCQUNmLFVBQUFDLFFBQVEsRUFBSTtBQUNWLFFBQU1DLElBQUksR0FBRyx5QkFDWDdCLEdBRFcsRUFFWHNCLGtDQUFrQyxDQUFDSSxPQUZ4QixFQUdYTCxxQ0FBcUMsQ0FBQ0ssT0FIM0IsRUFJWEgsYUFBYSxDQUFDRyxPQUpILENBQWI7O0FBT0EsUUFBSUcsSUFBSixFQUFVO0FBQ1IsVUFBUUMsS0FBUixHQUFpQ0QsSUFBakMsQ0FBUUMsS0FBUjtBQUFBLFVBQWVDLGFBQWYsR0FBaUNGLElBQWpDLENBQWVFLGFBQWY7QUFDQSxVQUFNQyxXQUFXLEdBQUdKLFFBQVEsQ0FBQztBQUFFRSxRQUFBQSxLQUFLLEVBQUxBLEtBQUY7QUFBU0MsUUFBQUEsYUFBYSxFQUFiQTtBQUFULE9BQUQsQ0FBNUI7O0FBRUEsVUFBSSxPQUFPQyxXQUFQLEtBQXVCLFFBQTNCLEVBQXFDO0FBQ25DVCxRQUFBQSxhQUFhLENBQUNHLE9BQWQsR0FBd0IsbUNBQ3RCMUIsR0FEc0IsRUFFdEJzQixrQ0FBa0MsQ0FBQ0ksT0FGYixFQUd0QkwscUNBQXFDLENBQUNLLE9BSGhCLEVBSXRCTSxXQUpzQixDQUF4QjtBQU1BWixRQUFBQSxXQUFXLENBQUMsRUFBRCxDQUFYO0FBQ0Q7QUFDRjtBQUNGLEdBdkJjLEVBd0JmLENBQUNwQixHQUFELEVBQU1vQixXQUFOLEVBQW1CQyxxQ0FBbkIsRUFBMERDLGtDQUExRCxFQUE4RkMsYUFBOUYsQ0F4QmUsQ0FBakI7QUEyQkEsTUFBTVUsYUFBYSxHQUFHLHdCQUFZLFlBQU07QUFDdENOLElBQUFBLFFBQVEsQ0FBQztBQUFBLFVBQUdJLGFBQUgsU0FBR0EsYUFBSDtBQUFBLGFBQXdCL0IsR0FBRyxLQUFLLEtBQVIsR0FBZ0JrQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0osYUFBWCxJQUE0QixDQUE1QyxHQUFnREcsSUFBSSxDQUFDRSxJQUFMLENBQVVMLGFBQVYsSUFBMkIsQ0FBbkc7QUFBQSxLQUFELENBQVI7QUFDRCxHQUZxQixFQUVuQixDQUFDL0IsR0FBRCxFQUFNMkIsUUFBTixDQUZtQixDQUF0QjtBQUlBLE1BQU1VLGNBQWMsR0FBRyx3QkFBWSxZQUFNO0FBQ3ZDVixJQUFBQSxRQUFRLENBQUM7QUFBQSxVQUFHSSxhQUFILFNBQUdBLGFBQUg7QUFBQSxhQUF3Qi9CLEdBQUcsS0FBSyxLQUFSLEdBQWdCa0MsSUFBSSxDQUFDRSxJQUFMLENBQVVMLGFBQVYsSUFBMkIsQ0FBM0MsR0FBK0NHLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixhQUFYLElBQTRCLENBQW5HO0FBQUEsS0FBRCxDQUFSO0FBQ0QsR0FGc0IsRUFFcEIsQ0FBQy9CLEdBQUQsRUFBTTJCLFFBQU4sQ0FGb0IsQ0FBdkI7QUFJQSxNQUFNVyxlQUFlLEdBQUcsb0JBQ3RCO0FBQUEsV0FBTztBQUNMWCxNQUFBQSxRQUFRLEVBQVJBLFFBREs7QUFFTE0sTUFBQUEsYUFBYSxFQUFiQSxhQUZLO0FBR0xJLE1BQUFBLGNBQWMsRUFBZEE7QUFISyxLQUFQO0FBQUEsR0FEc0IsRUFNdEIsQ0FBQ1YsUUFBRCxFQUFXTSxhQUFYLEVBQTBCSSxjQUExQixDQU5zQixDQUF4QjtBQVNBLE1BQU1FLGVBQWUsR0FBRyxvQkFDdEI7QUFBQSxXQUFPO0FBQ0xsQixNQUFBQSxxQ0FBcUMsRUFBckNBLHFDQURLO0FBRUxDLE1BQUFBLGtDQUFrQyxFQUFsQ0E7QUFGSyxLQUFQO0FBQUEsR0FEc0IsRUFLdEIsQ0FBQ0QscUNBQUQsRUFBd0NDLGtDQUF4QyxDQUxzQixDQUF4QjtBQVFBLE1BQU1rQixZQUFZLEdBQUcsb0JBQ25CO0FBQUEsV0FBTztBQUFFeEMsTUFBQUEsR0FBRyxFQUFIQSxHQUFGO0FBQU9DLE1BQUFBLE1BQU0sRUFBTkEsTUFBUDtBQUFlQyxNQUFBQSxLQUFLLEVBQUxBLEtBQWY7QUFBc0JDLE1BQUFBLFFBQVEsRUFBUkEsUUFBdEI7QUFBZ0NDLE1BQUFBLFlBQVksRUFBRUcsbUJBQTlDO0FBQW1FRSxNQUFBQSxrQkFBa0IsRUFBbEJBO0FBQW5FLEtBQVA7QUFBQSxHQURtQixFQUVuQixDQUFDVCxHQUFELEVBQU1DLE1BQU4sRUFBY0MsS0FBZCxFQUFxQkMsUUFBckIsRUFBK0JJLG1CQUEvQixFQUFvREUsa0JBQXBELENBRm1CLENBQXJCOztBQUtBLG1CQUFzQyxxQkFBUztBQUM3Q3FCLElBQUFBLEtBQUssRUFBRSxDQURzQztBQUU3Q0MsSUFBQUEsYUFBYSxFQUFFLENBRjhCO0FBRzdDVSxJQUFBQSxtQkFBbUIsRUFBRSxJQUh3QjtBQUk3Q0MsSUFBQUEsY0FBYyxFQUFFLElBSjZCO0FBSzdDQyxJQUFBQSxTQUFTLEVBQUU7QUFMa0MsR0FBVCxDQUF0QztBQUFBO0FBQUEsTUFBT0MsV0FBUDtBQUFBLE1BQW9CQyxjQUFwQixpQkFqRnVGLENBeUZ2Rjs7O0FBQ0EsTUFBTUMsZUFBZSxHQUFHLHdCQUN0QixVQUFBQyxlQUFlLEVBQUk7QUFDakJGLElBQUFBLGNBQWMsQ0FBQ0UsZUFBRCxDQUFkO0FBRUF0QixJQUFBQSxZQUFZLENBQUNELGdCQUFnQixDQUFDRSxPQUFsQixDQUFaOztBQUVBLFFBQUlxQixlQUFlLENBQUNKLFNBQXBCLEVBQStCO0FBQzdCbkIsTUFBQUEsZ0JBQWdCLENBQUNFLE9BQWpCLEdBQTJCc0IsVUFBVSxDQUNuQztBQUFBLGVBQ0VILGNBQWMsaUNBQ1RFLGVBRFM7QUFFWkosVUFBQUEsU0FBUyxFQUFFO0FBRkMsV0FEaEI7QUFBQSxPQURtQyxFQU1uQztBQUNBLFNBUG1DLENBQXJDO0FBU0Q7QUFDRixHQWpCcUIsRUFrQnRCLENBQUNuQixnQkFBRCxFQUFtQnFCLGNBQW5CLENBbEJzQixDQUF4QjtBQXFCQSxNQUFNSSxZQUFZLEdBQUcsd0JBQ25CLGlCQUF1RTtBQUFBLFFBQTFEUixtQkFBMEQsU0FBcEVTLFFBQW9FO0FBQUEsUUFBckNDLE9BQXFDLFNBQXJDQSxPQUFxQztBQUFBLFFBQXJCVCxjQUFxQixTQUE1QlUsS0FBNEI7QUFDckUsUUFBTXZCLElBQUksR0FBRyx5QkFDWDdCLEdBRFcsRUFFWHNCLGtDQUFrQyxDQUFDSSxPQUZ4QixFQUdYTCxxQ0FBcUMsQ0FBQ0ssT0FIM0IsRUFJWEgsYUFBYSxDQUFDRyxPQUpILENBQWI7O0FBT0EsUUFBSUcsSUFBSixFQUFVO0FBQ1IsVUFBUUMsS0FBUixHQUFpQ0QsSUFBakMsQ0FBUUMsS0FBUjtBQUFBLFVBQWVDLGFBQWYsR0FBaUNGLElBQWpDLENBQWVFLGFBQWY7QUFFQWUsTUFBQUEsZUFBZSxDQUFDO0FBQ2RoQixRQUFBQSxLQUFLLEVBQUxBLEtBRGM7QUFFZEMsUUFBQUEsYUFBYSxFQUFiQSxhQUZjO0FBR2RZLFFBQUFBLFNBQVMsRUFBRSxDQUFDUSxPQUhFO0FBSWRWLFFBQUFBLG1CQUFtQixFQUFuQkEsbUJBSmM7QUFLZEMsUUFBQUEsY0FBYyxFQUFkQTtBQUxjLE9BQUQsQ0FBZjtBQU9EO0FBQ0YsR0FwQmtCLEVBcUJuQixDQUFDMUMsR0FBRCxFQUFNcUIscUNBQU4sRUFBNkNDLGtDQUE3QyxFQUFpRkMsYUFBakYsRUFBZ0d1QixlQUFoRyxDQXJCbUIsQ0FBckI7QUF3QkEsTUFBTU8saUJBQWlCLEdBQUcsd0JBQVksWUFBTTtBQUMxQzlCLElBQUFBLGFBQWEsQ0FBQ0csT0FBZCxHQUF3QixJQUF4QjtBQUNBTixJQUFBQSxXQUFXLENBQUMsRUFBRCxDQUFYO0FBQ0QsR0FIeUIsRUFHdkIsQ0FBQ0EsV0FBRCxFQUFjRyxhQUFkLENBSHVCLENBQTFCO0FBS0EsTUFBTStCLGFBQWEsR0FBRyxvQkFDcEI7QUFBQSx1RUFDS2hCLGVBREwsR0FFS0MsZUFGTCxHQUdLQyxZQUhMLEdBSUtJLFdBSkw7QUFBQSxHQURvQixFQU9wQixDQUFDTixlQUFELEVBQWtCQyxlQUFsQixFQUFtQ0MsWUFBbkMsRUFBaURJLFdBQWpELENBUG9CLENBQXRCO0FBVUEsd0NBQ0UsT0FBT3JCLGFBQWEsQ0FBQ0csT0FBckIsS0FBaUMsUUFBakMsSUFBNkNKLGtDQUFrQyxDQUFDSSxPQURsRixFQUVFSCxhQUFhLENBQUNHLE9BRmhCLEVBR0UyQixpQkFIRjtBQU1BLHdCQUNFO0FBQUEsV0FDRS9CLGtDQUFrQyxDQUFDaUMsU0FBbkMsQ0FBNkMsVUFBQTdCLE9BQU8sRUFBSTtBQUN0RCxVQUFJQSxPQUFKLEVBQWE7QUFDWEEsUUFBQUEsT0FBTyxDQUFDOEIsZ0JBQVIsQ0FBeUIsYUFBekIsRUFBd0NILGlCQUF4QyxFQUEyRDtBQUFFSSxVQUFBQSxPQUFPLEVBQUU7QUFBWCxTQUEzRDtBQUVBLGVBQU87QUFBQSxpQkFBTS9CLE9BQU8sQ0FBQ2dDLG1CQUFSLENBQTRCLGFBQTVCLEVBQTJDTCxpQkFBM0MsQ0FBTjtBQUFBLFNBQVA7QUFDRDtBQUNGLEtBTkQsQ0FERjtBQUFBLEdBREYsRUFTRSxDQUFDQSxpQkFBRCxFQUFvQi9CLGtDQUFwQixDQVRGO0FBWUEsd0NBQXFCQSxrQ0FBckIsRUFBeUQyQixZQUF6RDtBQUVBLHNCQUNFLGdDQUFDLHdCQUFELENBQWMsUUFBZDtBQUF1QixJQUFBLEtBQUssRUFBRVQ7QUFBOUIsa0JBQ0UsZ0NBQUMsMkJBQUQsQ0FBaUIsUUFBakI7QUFBMEIsSUFBQSxLQUFLLEVBQUVEO0FBQWpDLGtCQUNFLGdDQUFDLDJCQUFELENBQWlCLFFBQWpCO0FBQTBCLElBQUEsS0FBSyxFQUFFRDtBQUFqQyxrQkFDRSxnQ0FBQyx1QkFBRCxDQUFhLFFBQWI7QUFBc0IsSUFBQSxLQUFLLEVBQUVNO0FBQTdCLGtCQUNFLGdDQUFDLHlCQUFELENBQWUsUUFBZjtBQUF3QixJQUFBLEtBQUssRUFBRVU7QUFBL0IsS0FDR3ZELFFBREgsRUFFR1EsbUJBQW1CLENBQUNvRCxVQUFwQixpQkFBa0MsZ0NBQUMsc0JBQUQsT0FGckMsQ0FERixDQURGLENBREYsQ0FERixDQURGO0FBY0QsQ0F4TEQ7O0FBMExBN0QsUUFBUSxDQUFDOEQsWUFBVCxHQUF3QjtBQUN0QjdELEVBQUFBLFFBQVEsRUFBRU8sU0FEWTtBQUV0Qk4sRUFBQUEsR0FBRyxFQUFFTSxTQUZpQjtBQUd0QkwsRUFBQUEsTUFBTSxFQUFFSyxTQUhjO0FBSXRCSixFQUFBQSxLQUFLLEVBQUVJLFNBSmU7QUFLdEJGLEVBQUFBLFlBQVksRUFBRUUsU0FMUTtBQU10QkQsRUFBQUEsUUFBUSxFQUFFQztBQU5ZLENBQXhCO0FBU0FSLFFBQVEsQ0FBQytELFNBQVQsR0FBcUI7QUFDbkI5RCxFQUFBQSxRQUFRLEVBQUUrRCxzQkFBVUMsU0FBVixDQUFvQixDQUFDRCxzQkFBVUUsT0FBVixDQUFrQkYsc0JBQVVHLE9BQTVCLENBQUQsRUFBdUNILHNCQUFVRyxPQUFqRCxDQUFwQixDQURTO0FBRW5CakUsRUFBQUEsR0FBRyxFQUFFOEQsc0JBQVVJLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELEVBQVEsS0FBUixDQUFoQixDQUZjO0FBR25CakUsRUFBQUEsTUFBTSxFQUFFNkQsc0JBQVVLLE1BSEM7QUFJbkJqRSxFQUFBQSxLQUFLLEVBQUU0RCxzQkFBVU0sTUFKRTtBQUtuQmpFLEVBQUFBLFFBQVEsRUFBRTJELHNCQUFVSyxNQUFWLENBQWlCRSxVQUxSO0FBTW5CakUsRUFBQUEsWUFBWSxFQUFFMEQsc0JBQVVRLEdBTkw7QUFPbkJqRSxFQUFBQSxRQUFRLEVBQUV5RCxzQkFBVVE7QUFQRCxDQUFyQjtlQVVleEUsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcmVhdGVFbW90aW9uIGZyb20gJ0BlbW90aW9uL2Nzcy9jcmVhdGUtaW5zdGFuY2UnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0b0NlbnRlciBmcm9tICcuL0F1dG9DZW50ZXInO1xuaW1wb3J0IGNvbXB1dGVTY3JvbGxMZWZ0IGZyb20gJy4vY29tcHV0ZVNjcm9sbExlZnQnO1xuaW1wb3J0IGNyZWF0ZUJhc2ljU3R5bGVTZXQgZnJvbSAnLi9jcmVhdGVCYXNpY1N0eWxlU2V0JztcbmltcG9ydCBjcmVhdGVDU1NLZXkgZnJvbSAnLi91dGlsL2NyZWF0ZUNTU0tleSc7XG5pbXBvcnQgRnVuY3Rpb25Db250ZXh0IGZyb20gJy4vRnVuY3Rpb25Db250ZXh0JztcbmltcG9ydCBnZXRWaWV3IGZyb20gJy4vZ2V0Vmlldyc7XG5pbXBvcnQgSW50ZXJuYWxDb250ZXh0IGZyb20gJy4vSW50ZXJuYWxDb250ZXh0JztcbmltcG9ydCBMZWdhY3lDb250ZXh0IGZyb20gJy4vTGVnYWN5Q29udGV4dCc7XG5pbXBvcnQgcGF0Y2hTdHlsZU9wdGlvbnMgZnJvbSAnLi9wYXRjaFN0eWxlT3B0aW9ucyc7XG5pbXBvcnQgUHJvcHNDb250ZXh0IGZyb20gJy4vUHJvcHNDb250ZXh0JztcbmltcG9ydCB1c2VBbmltYXRlU2Nyb2xsTGVmdCBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZUFuaW1hdGVTY3JvbGxMZWZ0JztcbmltcG9ydCB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUnO1xuaW1wb3J0IHVzZU9ic2VydmVTY3JvbGxMZWZ0IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlT2JzZXJ2ZVNjcm9sbExlZnQnO1xuaW1wb3J0IFZpZXdDb250ZXh0IGZyb20gJy4vVmlld0NvbnRleHQnO1xuXG4vLyBXZSBwb29sIHRoZSBlbW90aW9uLCBzbyB3ZSBkb24ndCBjcmVhdGUgYSBuZXcgc2V0IG9mIDxzdHlsZT4gZm9yIGV2ZXJ5IGNvbXBvbmVudCBhbmQgcmV1c2UgYXMgbXVjaCBhcyB3ZSBjb3VsZC5cbmNvbnN0IGVtb3Rpb25Qb29sID0ge307XG5cbmNvbnN0IENvbXBvc2VyID0gKHsgY2hpbGRyZW4sIGRpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHN0eWxlT3B0aW9ucywgc3R5bGVTZXQgfSkgPT4ge1xuICBkaXIgPSBkaXIgPT09ICdsdHInIHx8IGRpciA9PT0gJ3J0bCcgPyBkaXIgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcGF0Y2hlZFN0eWxlT3B0aW9ucyA9IHVzZU1lbW8oKCkgPT4gcGF0Y2hTdHlsZU9wdGlvbnMoc3R5bGVPcHRpb25zKSwgW3N0eWxlT3B0aW9uc10pO1xuICBjb25zdCBwYXRjaGVkU3R5bGVTZXQgPSB1c2VNZW1vKFxuICAgICgpID0+IHN0eWxlU2V0IHx8IGNyZWF0ZUJhc2ljU3R5bGVTZXQocGF0Y2hlZFN0eWxlT3B0aW9ucyksXG4gICAgW3BhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0XVxuICApO1xuXG4gIGNvbnN0IHN0eWxlU2V0Q2xhc3NOYW1lcyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGVtb3Rpb24gPVxuICAgICAgZW1vdGlvblBvb2xbbm9uY2VdIHx8IChlbW90aW9uUG9vbFtub25jZV0gPSBjcmVhdGVFbW90aW9uKHsga2V5OiBgcmVhY3QtZmlsbS0tY3NzLSR7Y3JlYXRlQ1NTS2V5KCl9YCwgbm9uY2UgfSkpO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhwYXRjaGVkU3R5bGVTZXQpLm1hcCgoW25hbWUsIHN0eWxlXSkgPT4gW25hbWUsIGVtb3Rpb24uY3NzKHN0eWxlKSArICcnXSkpO1xuICB9LCBbbm9uY2UsIHBhdGNoZWRTdHlsZVNldF0pO1xuXG4gIGNvbnN0IFtfLCBmb3JjZVJlbmRlcl0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlID0gdXNlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlKCk7XG4gIGNvbnN0IHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUgPSB1c2VDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUoKTtcbiAgY29uc3Qgc2Nyb2xsTGVmdFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3Qgc2Nyb2xsVGltZW91dFJlZiA9IHVzZVJlZigpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZW91dFJlZi5jdXJyZW50KSwgW3Njcm9sbFRpbWVvdXRSZWZdKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIHNjcm9sbEZuID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG4gICAgICAgIGNvbnN0IHRhcmdldEluZGV4ID0gc2Nyb2xsRm4oeyBpbmRleCwgaW5kZXhGcmFjdGlvbiB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldEluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHNjcm9sbExlZnRSZWYuY3VycmVudCA9IGNvbXB1dGVTY3JvbGxMZWZ0KFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICAgICAgdGFyZ2V0SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2RpciwgZm9yY2VSZW5kZXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWZdXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lTGVmdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUbygoeyBpbmRleEZyYWN0aW9uIH0pID0+IChkaXIgPT09ICdydGwnID8gTWF0aC5mbG9vcihpbmRleEZyYWN0aW9uKSArIDEgOiBNYXRoLmNlaWwoaW5kZXhGcmFjdGlvbikgLSAxKSk7XG4gIH0sIFtkaXIsIHNjcm9sbFRvXSk7XG5cbiAgY29uc3Qgc2Nyb2xsT25lUmlnaHQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2Nyb2xsVG8oKHsgaW5kZXhGcmFjdGlvbiB9KSA9PiAoZGlyID09PSAncnRsJyA/IE1hdGguY2VpbChpbmRleEZyYWN0aW9uKSAtIDEgOiBNYXRoLmZsb29yKGluZGV4RnJhY3Rpb24pICsgMSkpO1xuICB9LCBbZGlyLCBzY3JvbGxUb10pO1xuXG4gIGNvbnN0IGZ1bmN0aW9uQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIHNjcm9sbFRvLFxuICAgICAgc2Nyb2xsT25lTGVmdCxcbiAgICAgIHNjcm9sbE9uZVJpZ2h0XG4gICAgfSksXG4gICAgW3Njcm9sbFRvLCBzY3JvbGxPbmVMZWZ0LCBzY3JvbGxPbmVSaWdodF1cbiAgKTtcblxuICBjb25zdCBpbnRlcm5hbENvbnRleHQgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLFxuICAgICAgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZVxuICAgIH0pLFxuICAgIFtpdGVtQ29udGFpbmVyQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlXVxuICApO1xuXG4gIGNvbnN0IHByb3BzQ29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHsgZGlyLCBoZWlnaHQsIG5vbmNlLCBudW1JdGVtcywgc3R5bGVPcHRpb25zOiBwYXRjaGVkU3R5bGVPcHRpb25zLCBzdHlsZVNldENsYXNzTmFtZXMgfSksXG4gICAgW2RpciwgaGVpZ2h0LCBub25jZSwgbnVtSXRlbXMsIHBhdGNoZWRTdHlsZU9wdGlvbnMsIHN0eWxlU2V0Q2xhc3NOYW1lc11cbiAgKTtcblxuICBjb25zdCBbdmlld0NvbnRleHQsIHNldFZpZXdDb250ZXh0XSA9IHVzZVN0YXRlKHtcbiAgICBpbmRleDogMCxcbiAgICBpbmRleEZyYWN0aW9uOiAwLFxuICAgIHNjcm9sbEJhclBlcmNlbnRhZ2U6ICcwJScsXG4gICAgc2Nyb2xsQmFyV2lkdGg6ICcwJScsXG4gICAgc2Nyb2xsaW5nOiBmYWxzZVxuICB9KTtcblxuICAvLyBUaGlzIHdpbGwgc2V0Vmlld0NvbnRleHQgYW5kIHJlc2V0IHRoZSBcInNjcm9sbGluZ1wiIGZsYWcgYWZ0ZXIgYSBwZXJpb2Qgb2YgdGltZS5cbiAgY29uc3Qgc2V0Vmlld0NvbnRleHQyID0gdXNlQ2FsbGJhY2soXG4gICAgbmV4dFZpZXdDb250ZXh0ID0+IHtcbiAgICAgIHNldFZpZXdDb250ZXh0KG5leHRWaWV3Q29udGV4dCk7XG5cbiAgICAgIGNsZWFyVGltZW91dChzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQpO1xuXG4gICAgICBpZiAobmV4dFZpZXdDb250ZXh0LnNjcm9sbGluZykge1xuICAgICAgICBzY3JvbGxUaW1lb3V0UmVmLmN1cnJlbnQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+XG4gICAgICAgICAgICBzZXRWaWV3Q29udGV4dCh7XG4gICAgICAgICAgICAgIC4uLm5leHRWaWV3Q29udGV4dCxcbiAgICAgICAgICAgICAgc2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgICA1MDBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtzY3JvbGxUaW1lb3V0UmVmLCBzZXRWaWV3Q29udGV4dF1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGwgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBmcmFjdGlvbjogc2Nyb2xsQmFyUGVyY2VudGFnZSwgaW5pdGlhbCwgd2lkdGg6IHNjcm9sbEJhcldpZHRoIH0pID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBnZXRWaWV3KFxuICAgICAgICBkaXIsXG4gICAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICAgICAgaXRlbUNvbnRhaW5lckNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZS5jdXJyZW50LFxuICAgICAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnRcbiAgICAgICk7XG5cbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGluZGV4RnJhY3Rpb24gfSA9IHZpZXc7XG5cbiAgICAgICAgc2V0Vmlld0NvbnRleHQyKHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpbmRleEZyYWN0aW9uLFxuICAgICAgICAgIHNjcm9sbGluZzogIWluaXRpYWwsXG4gICAgICAgICAgc2Nyb2xsQmFyUGVyY2VudGFnZSxcbiAgICAgICAgICBzY3JvbGxCYXJXaWR0aFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXIsIGl0ZW1Db250YWluZXJDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUsIHNjcm9sbExlZnRSZWYsIHNldFZpZXdDb250ZXh0Ml1cbiAgKTtcblxuICBjb25zdCBoYW5kbGVTY3JvbGxUb0VuZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgIGZvcmNlUmVuZGVyKHt9KTtcbiAgfSwgW2ZvcmNlUmVuZGVyLCBzY3JvbGxMZWZ0UmVmXSk7XG5cbiAgY29uc3QgbGVnYWN5Q29udGV4dCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIC4uLmZ1bmN0aW9uQ29udGV4dCxcbiAgICAgIC4uLmludGVybmFsQ29udGV4dCxcbiAgICAgIC4uLnByb3BzQ29udGV4dCxcbiAgICAgIC4uLnZpZXdDb250ZXh0XG4gICAgfSksXG4gICAgW2Z1bmN0aW9uQ29udGV4dCwgaW50ZXJuYWxDb250ZXh0LCBwcm9wc0NvbnRleHQsIHZpZXdDb250ZXh0XVxuICApO1xuXG4gIHVzZUFuaW1hdGVTY3JvbGxMZWZ0KFxuICAgIHR5cGVvZiBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQgPT09ICdudW1iZXInICYmIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuY3VycmVudCxcbiAgICBzY3JvbGxMZWZ0UmVmLmN1cnJlbnQsXG4gICAgaGFuZGxlU2Nyb2xsVG9FbmRcbiAgKTtcblxuICB1c2VFZmZlY3QoXG4gICAgKCkgPT5cbiAgICAgIHNjcm9sbGFibGVDYWxsYmFja1JlZldpdGhTdWJzY3JpYmUuc3Vic2NyaWJlKGN1cnJlbnQgPT4ge1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgIGN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCwgeyBwYXNzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgcmV0dXJuICgpID0+IGN1cnJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCBoYW5kbGVTY3JvbGxUb0VuZCk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIFtoYW5kbGVTY3JvbGxUb0VuZCwgc2Nyb2xsYWJsZUNhbGxiYWNrUmVmV2l0aFN1YnNjcmliZV1cbiAgKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsTGVmdChzY3JvbGxhYmxlQ2FsbGJhY2tSZWZXaXRoU3Vic2NyaWJlLCBoYW5kbGVTY3JvbGwpO1xuXG4gIHJldHVybiAoXG4gICAgPFByb3BzQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvcHNDb250ZXh0fT5cbiAgICAgIDxJbnRlcm5hbENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ludGVybmFsQ29udGV4dH0+XG4gICAgICAgIDxGdW5jdGlvbkNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2Z1bmN0aW9uQ29udGV4dH0+XG4gICAgICAgICAgPFZpZXdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2aWV3Q29udGV4dH0+XG4gICAgICAgICAgICA8TGVnYWN5Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17bGVnYWN5Q29udGV4dH0+XG4gICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgICAge3BhdGNoZWRTdHlsZU9wdGlvbnMuYXV0b0NlbnRlciAmJiA8QXV0b0NlbnRlciAvPn1cbiAgICAgICAgICAgIDwvTGVnYWN5Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgICA8L1ZpZXdDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICA8L0Z1bmN0aW9uQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSW50ZXJuYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvUHJvcHNDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuQ29tcG9zZXIuZGVmYXVsdFByb3BzID0ge1xuICBjaGlsZHJlbjogdW5kZWZpbmVkLFxuICBkaXI6IHVuZGVmaW5lZCxcbiAgaGVpZ2h0OiB1bmRlZmluZWQsXG4gIG5vbmNlOiB1bmRlZmluZWQsXG4gIHN0eWxlT3B0aW9uczogdW5kZWZpbmVkLFxuICBzdHlsZVNldDogdW5kZWZpbmVkXG59O1xuXG5Db21wb3Nlci5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuZWxlbWVudCksIFByb3BUeXBlcy5lbGVtZW50XSksXG4gIGRpcjogUHJvcFR5cGVzLm9uZU9mKFsnbHRyJywgJ3J0bCddKSxcbiAgaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgbnVtSXRlbXM6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgc3R5bGVPcHRpb25zOiBQcm9wVHlwZXMuYW55LFxuICBzdHlsZVNldDogUHJvcFR5cGVzLmFueVxufTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9zZXI7XG4iXX0=