{"version":3,"file":"js/application-300aee48a286ddd6f2dd.js","sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/channels sync _channel\\.js$","webpack:///./app/javascript/channels/attendance_channel.js","webpack:///./app/javascript/channels/consumer.js","webpack:///./app/javascript/channels/index.js","webpack:///./app/javascript/components sync ^\\.\\/.*$","webpack:///./app/javascript/components/App.js","webpack:///./app/javascript/components/Root.js","webpack:///./app/javascript/components/about/AboutUs.js","webpack:///./app/javascript/components/expo/Booth.js","webpack:///./app/javascript/components/expo/BoothFiles.js","webpack:///./app/javascript/components/expo/Expo.js","webpack:///./app/javascript/components/expo/SortPromoFiles.js","webpack:///./app/javascript/components/expo/VideoPlayer.js","webpack:///./app/javascript/components/helpers/Ajax.js","webpack:///./app/javascript/components/helpers/ColorTools.js","webpack:///./app/javascript/components/helpers/CurrentEvent.js","webpack:///./app/javascript/components/helpers/DateGroup.js","webpack:///./app/javascript/components/helpers/DynamicCSS.js","webpack:///./app/javascript/components/helpers/EventAssets.js","webpack:///./app/javascript/components/helpers/EventPages.js","webpack:///./app/javascript/components/helpers/FontTools.js","webpack:///./app/javascript/components/helpers/HashTools.js","webpack:///./app/javascript/components/helpers/TimeCounter.js","webpack:///./app/javascript/components/helpers/YoutubeLinkParser.js","webpack:///./app/javascript/components/intro/Intro.js","webpack:///./app/javascript/components/intro/IntroHero.js","webpack:///./app/javascript/components/intro/IntroMovie.js","webpack:///./app/javascript/components/library/Book.js","webpack:///./app/javascript/components/library/Library.js","webpack:///./app/javascript/components/navigation/MainNavigation.js","webpack:///./app/javascript/components/navigation/Menu.js","webpack:///./app/javascript/components/shared/PageTitle.js","webpack:///./app/javascript/components/shared/Tags.js","webpack:///./app/javascript/components/speakers/Speakers.js","webpack:///./app/javascript/components/sponsors/Sponsors.js","webpack:///./app/javascript/components/stream/CommentButtonPanel.js","webpack:///./app/javascript/components/stream/DateTimePanel.js","webpack:///./app/javascript/components/stream/Lecture.js","webpack:///./app/javascript/components/stream/SegmentLinePanel.js","webpack:///./app/javascript/components/stream/Stream.js","webpack:///./app/javascript/components/stream/StreamInfo.js","webpack:///./app/javascript/components/stream/StreamServiceInfo.js","webpack:///./app/javascript/components/stream/StreamVideo.js","webpack:///./app/javascript/components/stream/comments/Comments.js","webpack:///./app/javascript/components/stream/comments/Form.js","webpack:///./app/javascript/components/stream/comments/Input.js","webpack:///./app/javascript/components/stream/comments/Item.js","webpack:///./app/javascript/components/stream/comments/List.js","webpack:///./app/javascript/components/stream/comments/Submit.js","webpack:///./app/javascript/components/timeline/CalendarPanel.js","webpack:///./app/javascript/components/timeline/CentralPanel.js","webpack:///./app/javascript/components/timeline/LecturePanel.js","webpack:///./app/javascript/components/timeline/Timeline.js","webpack:///./app/javascript/fonts/icomoon.eot","webpack:///./app/javascript/fonts/icomoon.svg","webpack:///./app/javascript/fonts/icomoon.ttf","webpack:///./app/javascript/fonts/icomoon.woff","webpack:///./app/javascript/images sync ^\\.\\/.*$","webpack:///./app/javascript/images/booth.png","webpack:///./app/javascript/images/close-menu.svg","webpack:///./app/javascript/images/icon-pdf.svg","webpack:///./app/javascript/images/icon-ppt.svg","webpack:///./app/javascript/images/icon-word.svg","webpack:///./app/javascript/packs/application.js","webpack:///./app/javascript/src/animations.scss?0716","webpack:///./app/javascript/src/application.scss?9fb7","webpack:///./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./node_modules/@babel/runtime/helpers/esm/extends.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack:///./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/@bundled-es-modules/pdfjs-dist/build/pdf.js","webpack:///./node_modules/@mikecousins/react-pdf/dist/react-pdf.esm.js","webpack:///./node_modules/@n8tb1t/use-scroll-position/lib/index.js","webpack:///./node_modules/@n8tb1t/use-scroll-position/lib/useIsomorphicLayoutEffect.js","webpack:///./node_modules/@n8tb1t/use-scroll-position/lib/useScrollPosition.js","webpack:///./node_modules/@popperjs/core/lib/createPopper.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack:///./node_modules/@popperjs/core/lib/enums.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack:///./node_modules/@popperjs/core/lib/popper-base.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack:///./node_modules/@popperjs/core/lib/utils/debounce.js","webpack:///./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack:///./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack:///./node_modules/@popperjs/core/lib/utils/format.js","webpack:///./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack:///./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack:///./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack:///./node_modules/@popperjs/core/lib/utils/uniqueBy.js","webpack:///./node_modules/@popperjs/core/lib/utils/validateModifiers.js","webpack:///./node_modules/@popperjs/core/lib/utils/within.js","webpack:///./node_modules/@rails/actioncable/app/assets/javascripts/action_cable.js","webpack:///./node_modules/@rails/activestorage/app/assets/javascripts/activestorage.js","webpack:///./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js","webpack:///./node_modules/@restart/hooks/esm/useCallbackRef.js","webpack:///./node_modules/@restart/hooks/esm/useCommittedRef.js","webpack:///./node_modules/@restart/hooks/esm/useEventCallback.js","webpack:///./node_modules/@restart/hooks/esm/useForceUpdate.js","webpack:///./node_modules/@restart/hooks/esm/useMergedRefs.js","webpack:///./node_modules/@restart/hooks/esm/useMounted.js","webpack:///./node_modules/@restart/hooks/esm/usePrevious.js","webpack:///./node_modules/@restart/hooks/esm/useSafeState.js","webpack:///./node_modules/@restart/hooks/esm/useTimeout.js","webpack:///./node_modules/@restart/hooks/esm/useUpdateEffect.js","webpack:///./node_modules/@restart/hooks/esm/useUpdatedRef.js","webpack:///./node_modules/@restart/hooks/esm/useWillUnmount.js","webpack:///./node_modules/classnames/index.js","webpack:///./app/javascript/src/animations.scss","webpack:///./app/javascript/src/application.scss","webpack:///./node_modules/css-loader/dist/runtime/api.js","webpack:///./node_modules/css-loader/dist/runtime/getUrl.js","webpack:///./node_modules/dom-helpers/esm/activeElement.js","webpack:///./node_modules/dom-helpers/esm/addClass.js","webpack:///./node_modules/dom-helpers/esm/addEventListener.js","webpack:///./node_modules/dom-helpers/esm/camelize.js","webpack:///./node_modules/dom-helpers/esm/canUseDOM.js","webpack:///./node_modules/dom-helpers/esm/contains.js","webpack:///./node_modules/dom-helpers/esm/css.js","webpack:///./node_modules/dom-helpers/esm/getComputedStyle.js","webpack:///./node_modules/dom-helpers/esm/hasClass.js","webpack:///./node_modules/dom-helpers/esm/hyphenate.js","webpack:///./node_modules/dom-helpers/esm/hyphenateStyle.js","webpack:///./node_modules/dom-helpers/esm/isDocument.js","webpack:///./node_modules/dom-helpers/esm/isTransform.js","webpack:///./node_modules/dom-helpers/esm/isWindow.js","webpack:///./node_modules/dom-helpers/esm/listen.js","webpack:///./node_modules/dom-helpers/esm/matches.js","webpack:///./node_modules/dom-helpers/esm/ownerDocument.js","webpack:///./node_modules/dom-helpers/esm/ownerWindow.js","webpack:///./node_modules/dom-helpers/esm/querySelectorAll.js","webpack:///./node_modules/dom-helpers/esm/removeClass.js","webpack:///./node_modules/dom-helpers/esm/removeEventListener.js","webpack:///./node_modules/dom-helpers/esm/scrollbarSize.js","webpack:///./node_modules/dom-helpers/esm/transitionEnd.js","webpack:///./node_modules/history/esm/history.js","webpack:///./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/mini-create-react-context/dist/esm/index.js","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./node_modules/moment/locale/af.js","webpack:///./node_modules/moment/locale/ar-dz.js","webpack:///./node_modules/moment/locale/ar-kw.js","webpack:///./node_modules/moment/locale/ar-ly.js","webpack:///./node_modules/moment/locale/ar-ma.js","webpack:///./node_modules/moment/locale/ar-sa.js","webpack:///./node_modules/moment/locale/ar-tn.js","webpack:///./node_modules/moment/locale/ar.js","webpack:///./node_modules/moment/locale/az.js","webpack:///./node_modules/moment/locale/be.js","webpack:///./node_modules/moment/locale/bg.js","webpack:///./node_modules/moment/locale/bm.js","webpack:///./node_modules/moment/locale/bn-bd.js","webpack:///./node_modules/moment/locale/bn.js","webpack:///./node_modules/moment/locale/bo.js","webpack:///./node_modules/moment/locale/br.js","webpack:///./node_modules/moment/locale/bs.js","webpack:///./node_modules/moment/locale/ca.js","webpack:///./node_modules/moment/locale/cs.js","webpack:///./node_modules/moment/locale/cv.js","webpack:///./node_modules/moment/locale/cy.js","webpack:///./node_modules/moment/locale/da.js","webpack:///./node_modules/moment/locale/de-at.js","webpack:///./node_modules/moment/locale/de-ch.js","webpack:///./node_modules/moment/locale/de.js","webpack:///./node_modules/moment/locale/dv.js","webpack:///./node_modules/moment/locale/el.js","webpack:///./node_modules/moment/locale/en-au.js","webpack:///./node_modules/moment/locale/en-ca.js","webpack:///./node_modules/moment/locale/en-gb.js","webpack:///./node_modules/moment/locale/en-ie.js","webpack:///./node_modules/moment/locale/en-il.js","webpack:///./node_modules/moment/locale/en-in.js","webpack:///./node_modules/moment/locale/en-nz.js","webpack:///./node_modules/moment/locale/en-sg.js","webpack:///./node_modules/moment/locale/eo.js","webpack:///./node_modules/moment/locale/es-do.js","webpack:///./node_modules/moment/locale/es-mx.js","webpack:///./node_modules/moment/locale/es-us.js","webpack:///./node_modules/moment/locale/es.js","webpack:///./node_modules/moment/locale/et.js","webpack:///./node_modules/moment/locale/eu.js","webpack:///./node_modules/moment/locale/fa.js","webpack:///./node_modules/moment/locale/fi.js","webpack:///./node_modules/moment/locale/fil.js","webpack:///./node_modules/moment/locale/fo.js","webpack:///./node_modules/moment/locale/fr-ca.js","webpack:///./node_modules/moment/locale/fr-ch.js","webpack:///./node_modules/moment/locale/fr.js","webpack:///./node_modules/moment/locale/fy.js","webpack:///./node_modules/moment/locale/ga.js","webpack:///./node_modules/moment/locale/gd.js","webpack:///./node_modules/moment/locale/gl.js","webpack:///./node_modules/moment/locale/gom-deva.js","webpack:///./node_modules/moment/locale/gom-latn.js","webpack:///./node_modules/moment/locale/gu.js","webpack:///./node_modules/moment/locale/he.js","webpack:///./node_modules/moment/locale/hi.js","webpack:///./node_modules/moment/locale/hr.js","webpack:///./node_modules/moment/locale/hu.js","webpack:///./node_modules/moment/locale/hy-am.js","webpack:///./node_modules/moment/locale/id.js","webpack:///./node_modules/moment/locale/is.js","webpack:///./node_modules/moment/locale/it-ch.js","webpack:///./node_modules/moment/locale/it.js","webpack:///./node_modules/moment/locale/ja.js","webpack:///./node_modules/moment/locale/jv.js","webpack:///./node_modules/moment/locale/ka.js","webpack:///./node_modules/moment/locale/kk.js","webpack:///./node_modules/moment/locale/km.js","webpack:///./node_modules/moment/locale/kn.js","webpack:///./node_modules/moment/locale/ko.js","webpack:///./node_modules/moment/locale/ku.js","webpack:///./node_modules/moment/locale/ky.js","webpack:///./node_modules/moment/locale/lb.js","webpack:///./node_modules/moment/locale/lo.js","webpack:///./node_modules/moment/locale/lt.js","webpack:///./node_modules/moment/locale/lv.js","webpack:///./node_modules/moment/locale/me.js","webpack:///./node_modules/moment/locale/mi.js","webpack:///./node_modules/moment/locale/mk.js","webpack:///./node_modules/moment/locale/ml.js","webpack:///./node_modules/moment/locale/mn.js","webpack:///./node_modules/moment/locale/mr.js","webpack:///./node_modules/moment/locale/ms-my.js","webpack:///./node_modules/moment/locale/ms.js","webpack:///./node_modules/moment/locale/mt.js","webpack:///./node_modules/moment/locale/my.js","webpack:///./node_modules/moment/locale/nb.js","webpack:///./node_modules/moment/locale/ne.js","webpack:///./node_modules/moment/locale/nl-be.js","webpack:///./node_modules/moment/locale/nl.js","webpack:///./node_modules/moment/locale/nn.js","webpack:///./node_modules/moment/locale/oc-lnc.js","webpack:///./node_modules/moment/locale/pa-in.js","webpack:///./node_modules/moment/locale/pl.js","webpack:///./node_modules/moment/locale/pt-br.js","webpack:///./node_modules/moment/locale/pt.js","webpack:///./node_modules/moment/locale/ro.js","webpack:///./node_modules/moment/locale/ru.js","webpack:///./node_modules/moment/locale/sd.js","webpack:///./node_modules/moment/locale/se.js","webpack:///./node_modules/moment/locale/si.js","webpack:///./node_modules/moment/locale/sk.js","webpack:///./node_modules/moment/locale/sl.js","webpack:///./node_modules/moment/locale/sq.js","webpack:///./node_modules/moment/locale/sr-cyrl.js","webpack:///./node_modules/moment/locale/sr.js","webpack:///./node_modules/moment/locale/ss.js","webpack:///./node_modules/moment/locale/sv.js","webpack:///./node_modules/moment/locale/sw.js","webpack:///./node_modules/moment/locale/ta.js","webpack:///./node_modules/moment/locale/te.js","webpack:///./node_modules/moment/locale/tet.js","webpack:///./node_modules/moment/locale/tg.js","webpack:///./node_modules/moment/locale/th.js","webpack:///./node_modules/moment/locale/tk.js","webpack:///./node_modules/moment/locale/tl-ph.js","webpack:///./node_modules/moment/locale/tlh.js","webpack:///./node_modules/moment/locale/tr.js","webpack:///./node_modules/moment/locale/tzl.js","webpack:///./node_modules/moment/locale/tzm-latn.js","webpack:///./node_modules/moment/locale/tzm.js","webpack:///./node_modules/moment/locale/ug-cn.js","webpack:///./node_modules/moment/locale/uk.js","webpack:///./node_modules/moment/locale/ur.js","webpack:///./node_modules/moment/locale/uz-latn.js","webpack:///./node_modules/moment/locale/uz.js","webpack:///./node_modules/moment/locale/vi.js","webpack:///./node_modules/moment/locale/x-pseudo.js","webpack:///./node_modules/moment/locale/yo.js","webpack:///./node_modules/moment/locale/zh-cn.js","webpack:///./node_modules/moment/locale/zh-hk.js","webpack:///./node_modules/moment/locale/zh-mo.js","webpack:///./node_modules/moment/locale/zh-tw.js","webpack:///./node_modules/moment/moment.js","webpack:///./node_modules/object-assign/index.js","webpack:///./node_modules/prop-types-extra/lib/all.js","webpack:///./node_modules/prop-types-extra/lib/isRequiredForA11y.js","webpack:///./node_modules/prop-types-extra/lib/utils/createChainableTypeChecker.js","webpack:///./node_modules/prop-types/checkPropTypes.js","webpack:///./node_modules/prop-types/factoryWithTypeCheckers.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./node_modules/react-bootstrap/esm/AbstractNav.js","webpack:///./node_modules/react-bootstrap/esm/AbstractNavItem.js","webpack:///./node_modules/react-bootstrap/esm/Accordion.js","webpack:///./node_modules/react-bootstrap/esm/AccordionCollapse.js","webpack:///./node_modules/react-bootstrap/esm/AccordionContext.js","webpack:///./node_modules/react-bootstrap/esm/AccordionToggle.js","webpack:///./node_modules/react-bootstrap/esm/Alert.js","webpack:///./node_modules/react-bootstrap/esm/Badge.js","webpack:///./node_modules/react-bootstrap/esm/BootstrapModalManager.js","webpack:///./node_modules/react-bootstrap/esm/Breadcrumb.js","webpack:///./node_modules/react-bootstrap/esm/BreadcrumbItem.js","webpack:///./node_modules/react-bootstrap/esm/Button.js","webpack:///./node_modules/react-bootstrap/esm/ButtonGroup.js","webpack:///./node_modules/react-bootstrap/esm/ButtonToolbar.js","webpack:///./node_modules/react-bootstrap/esm/Card.js","webpack:///./node_modules/react-bootstrap/esm/CardColumns.js","webpack:///./node_modules/react-bootstrap/esm/CardContext.js","webpack:///./node_modules/react-bootstrap/esm/CardDeck.js","webpack:///./node_modules/react-bootstrap/esm/CardGroup.js","webpack:///./node_modules/react-bootstrap/esm/CardImg.js","webpack:///./node_modules/react-bootstrap/esm/Carousel.js","webpack:///./node_modules/react-bootstrap/esm/CarouselCaption.js","webpack:///./node_modules/react-bootstrap/esm/CarouselItem.js","webpack:///./node_modules/react-bootstrap/esm/CloseButton.js","webpack:///./node_modules/react-bootstrap/esm/Col.js","webpack:///./node_modules/react-bootstrap/esm/Collapse.js","webpack:///./node_modules/react-bootstrap/esm/Container.js","webpack:///./node_modules/react-bootstrap/esm/Dropdown.js","webpack:///./node_modules/react-bootstrap/esm/DropdownButton.js","webpack:///./node_modules/react-bootstrap/esm/DropdownItem.js","webpack:///./node_modules/react-bootstrap/esm/DropdownMenu.js","webpack:///./node_modules/react-bootstrap/esm/DropdownToggle.js","webpack:///./node_modules/react-bootstrap/esm/ElementChildren.js","webpack:///./node_modules/react-bootstrap/esm/Fade.js","webpack:///./node_modules/react-bootstrap/esm/Feedback.js","webpack:///./node_modules/react-bootstrap/esm/Figure.js","webpack:///./node_modules/react-bootstrap/esm/FigureCaption.js","webpack:///./node_modules/react-bootstrap/esm/FigureImage.js","webpack:///./node_modules/react-bootstrap/esm/Form.js","webpack:///./node_modules/react-bootstrap/esm/FormCheck.js","webpack:///./node_modules/react-bootstrap/esm/FormCheckInput.js","webpack:///./node_modules/react-bootstrap/esm/FormCheckLabel.js","webpack:///./node_modules/react-bootstrap/esm/FormContext.js","webpack:///./node_modules/react-bootstrap/esm/FormControl.js","webpack:///./node_modules/react-bootstrap/esm/FormFile.js","webpack:///./node_modules/react-bootstrap/esm/FormFileInput.js","webpack:///./node_modules/react-bootstrap/esm/FormFileLabel.js","webpack:///./node_modules/react-bootstrap/esm/FormGroup.js","webpack:///./node_modules/react-bootstrap/esm/FormLabel.js","webpack:///./node_modules/react-bootstrap/esm/FormText.js","webpack:///./node_modules/react-bootstrap/esm/Image.js","webpack:///./node_modules/react-bootstrap/esm/InputGroup.js","webpack:///./node_modules/react-bootstrap/esm/Jumbotron.js","webpack:///./node_modules/react-bootstrap/esm/ListGroup.js","webpack:///./node_modules/react-bootstrap/esm/ListGroupItem.js","webpack:///./node_modules/react-bootstrap/esm/Media.js","webpack:///./node_modules/react-bootstrap/esm/Modal.js","webpack:///./node_modules/react-bootstrap/esm/ModalBody.js","webpack:///./node_modules/react-bootstrap/esm/ModalContext.js","webpack:///./node_modules/react-bootstrap/esm/ModalDialog.js","webpack:///./node_modules/react-bootstrap/esm/ModalFooter.js","webpack:///./node_modules/react-bootstrap/esm/ModalHeader.js","webpack:///./node_modules/react-bootstrap/esm/ModalTitle.js","webpack:///./node_modules/react-bootstrap/esm/Nav.js","webpack:///./node_modules/react-bootstrap/esm/NavContext.js","webpack:///./node_modules/react-bootstrap/esm/NavDropdown.js","webpack:///./node_modules/react-bootstrap/esm/NavItem.js","webpack:///./node_modules/react-bootstrap/esm/NavLink.js","webpack:///./node_modules/react-bootstrap/esm/Navbar.js","webpack:///./node_modules/react-bootstrap/esm/NavbarBrand.js","webpack:///./node_modules/react-bootstrap/esm/NavbarCollapse.js","webpack:///./node_modules/react-bootstrap/esm/NavbarContext.js","webpack:///./node_modules/react-bootstrap/esm/NavbarToggle.js","webpack:///./node_modules/react-bootstrap/esm/Overlay.js","webpack:///./node_modules/react-bootstrap/esm/OverlayTrigger.js","webpack:///./node_modules/react-bootstrap/esm/PageItem.js","webpack:///./node_modules/react-bootstrap/esm/Pagination.js","webpack:///./node_modules/react-bootstrap/esm/Popover.js","webpack:///./node_modules/react-bootstrap/esm/PopoverContent.js","webpack:///./node_modules/react-bootstrap/esm/PopoverTitle.js","webpack:///./node_modules/react-bootstrap/esm/ProgressBar.js","webpack:///./node_modules/react-bootstrap/esm/ResponsiveEmbed.js","webpack:///./node_modules/react-bootstrap/esm/Row.js","webpack:///./node_modules/react-bootstrap/esm/SafeAnchor.js","webpack:///./node_modules/react-bootstrap/esm/SelectableContext.js","webpack:///./node_modules/react-bootstrap/esm/Spinner.js","webpack:///./node_modules/react-bootstrap/esm/SplitButton.js","webpack:///./node_modules/react-bootstrap/esm/Switch.js","webpack:///./node_modules/react-bootstrap/esm/Tab.js","webpack:///./node_modules/react-bootstrap/esm/TabContainer.js","webpack:///./node_modules/react-bootstrap/esm/TabContent.js","webpack:///./node_modules/react-bootstrap/esm/TabContext.js","webpack:///./node_modules/react-bootstrap/esm/TabPane.js","webpack:///./node_modules/react-bootstrap/esm/Table.js","webpack:///./node_modules/react-bootstrap/esm/Tabs.js","webpack:///./node_modules/react-bootstrap/esm/ThemeProvider.js","webpack:///./node_modules/react-bootstrap/esm/Toast.js","webpack:///./node_modules/react-bootstrap/esm/ToastBody.js","webpack:///./node_modules/react-bootstrap/esm/ToastContext.js","webpack:///./node_modules/react-bootstrap/esm/ToastHeader.js","webpack:///./node_modules/react-bootstrap/esm/ToggleButton.js","webpack:///./node_modules/react-bootstrap/esm/ToggleButtonGroup.js","webpack:///./node_modules/react-bootstrap/esm/Tooltip.js","webpack:///./node_modules/react-bootstrap/esm/createChainedFunction.js","webpack:///./node_modules/react-bootstrap/esm/createWithBsPrefix.js","webpack:///./node_modules/react-bootstrap/esm/divWithClassName.js","webpack:///./node_modules/react-bootstrap/esm/index.js","webpack:///./node_modules/react-bootstrap/esm/triggerBrowserReflow.js","webpack:///./node_modules/react-bootstrap/esm/usePopperMarginModifiers.js","webpack:///./node_modules/react-bootstrap/esm/useWrappedRefWithWarning.js","webpack:///./node_modules/react-dom/cjs/react-dom-server.browser.development.js","webpack:///./node_modules/react-dom/cjs/react-dom.development.js","webpack:///./node_modules/react-dom/index.js","webpack:///./node_modules/react-dom/server.browser.js","webpack:///./node_modules/react-is/cjs/react-is.development.js","webpack:///./node_modules/react-is/index.js","webpack:///./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js","webpack:///./node_modules/react-overlays/esm/Dropdown.js","webpack:///./node_modules/react-overlays/esm/DropdownContext.js","webpack:///./node_modules/react-overlays/esm/DropdownMenu.js","webpack:///./node_modules/react-overlays/esm/DropdownToggle.js","webpack:///./node_modules/react-overlays/esm/Modal.js","webpack:///./node_modules/react-overlays/esm/ModalManager.js","webpack:///./node_modules/react-overlays/esm/Overlay.js","webpack:///./node_modules/react-overlays/esm/isOverflowing.js","webpack:///./node_modules/react-overlays/esm/manageAriaHidden.js","webpack:///./node_modules/react-overlays/esm/mergeOptionsWithPopperConfig.js","webpack:///./node_modules/react-overlays/esm/ownerDocument.js","webpack:///./node_modules/react-overlays/esm/popper.js","webpack:///./node_modules/react-overlays/esm/safeFindDOMNode.js","webpack:///./node_modules/react-overlays/esm/usePopper.js","webpack:///./node_modules/react-overlays/esm/useRootClose.js","webpack:///./node_modules/react-overlays/esm/useWaitForDOMRef.js","webpack:///./node_modules/react-router-dom/esm/react-router-dom.js","webpack:///./node_modules/react-router/esm/react-router.js","webpack:///./node_modules/react-router/node_modules/isarray/index.js","webpack:///./node_modules/react-router/node_modules/path-to-regexp/index.js","webpack:///./node_modules/react-transition-group/esm/CSSTransition.js","webpack:///./node_modules/react-transition-group/esm/ReplaceTransition.js","webpack:///./node_modules/react-transition-group/esm/SwitchTransition.js","webpack:///./node_modules/react-transition-group/esm/Transition.js","webpack:///./node_modules/react-transition-group/esm/TransitionGroup.js","webpack:///./node_modules/react-transition-group/esm/TransitionGroupContext.js","webpack:///./node_modules/react-transition-group/esm/config.js","webpack:///./node_modules/react-transition-group/esm/index.js","webpack:///./node_modules/react-transition-group/esm/utils/ChildMapping.js","webpack:///./node_modules/react-transition-group/esm/utils/PropTypes.js","webpack:///./node_modules/react/cjs/react.development.js","webpack:///./node_modules/react/index.js","webpack:///./node_modules/react_ujs/react_ujs/index.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/detect.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/native.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/pjax.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/turbolinks.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/turbolinksClassic.js","webpack:///./node_modules/react_ujs/react_ujs/src/events/turbolinksClassicDeprecated.js","webpack:///./node_modules/react_ujs/react_ujs/src/getConstructor/fromGlobal.js","webpack:///./node_modules/react_ujs/react_ujs/src/getConstructor/fromRequireContext.js","webpack:///./node_modules/react_ujs/react_ujs/src/getConstructor/fromRequireContextWithGlobalFallback.js","webpack:///./node_modules/resolve-pathname/esm/resolve-pathname.js","webpack:///./node_modules/scheduler/cjs/scheduler-tracing.development.js","webpack:///./node_modules/scheduler/cjs/scheduler.development.js","webpack:///./node_modules/scheduler/index.js","webpack:///./node_modules/scheduler/tracing.js","webpack:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack:///./node_modules/tiny-invariant/dist/tiny-invariant.esm.js","webpack:///./node_modules/tiny-warning/dist/tiny-warning.esm.js","webpack:///./node_modules/uncontrollable/lib/esm/hook.js","webpack:///./node_modules/uncontrollable/lib/esm/index.js","webpack:///./node_modules/uncontrollable/lib/esm/uncontrollable.js","webpack:///./node_modules/uncontrollable/lib/esm/utils.js","webpack:///./node_modules/value-equal/esm/value-equal.js","webpack:///./node_modules/warning/warning.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///(webpack)/buildin/global.js","webpack:///(webpack)/buildin/module.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./app/javascript/packs/application.js\");\n","var map = {\n\t\"./attendance_channel.js\": \"./app/javascript/channels/attendance_channel.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/javascript/channels sync recursive _channel\\\\.js$\";","import consumer from \"./consumer\";\n\nconst AttendanceChannel=(receiver)=> {\n consumer.subscriptions.create(\"AttendanceChannel\", {\n connected() {\n // Called when the subscription is ready for use on the server\n // console.info(\"Connect AttendanceChannel\");\n },\n\n disconnected() {\n // Called when the subscription has been terminated by the server\n // console.info(\"Disconnect AttendanceChannel\");\n },\n\n received(data) {\n // Called when there's incoming data on the websocket for this channel\n // console.info(\"Receive Attendance: %o\", data);\n receiver(data);\n }\n });\n};\nexport default AttendanceChannel;","// Action Cable provides the framework to deal with WebSockets in Rails.\n// You can generate new channels where WebSocket features live using the `bin/rails generate channel` command.\n\nimport { createConsumer } from \"@rails/actioncable\";\n\nexport default createConsumer();\n","// Load all the channels within this directory and all subdirectories.\n// Channel files must be named *_channel.js.\n\nconst channels = require.context('.', true, /_channel\\.js$/);\nchannels.keys().forEach(channels);\n","var map = {\n\t\"./App\": \"./app/javascript/components/App.js\",\n\t\"./App.js\": \"./app/javascript/components/App.js\",\n\t\"./Root\": \"./app/javascript/components/Root.js\",\n\t\"./Root.js\": \"./app/javascript/components/Root.js\",\n\t\"./about/AboutUs\": \"./app/javascript/components/about/AboutUs.js\",\n\t\"./about/AboutUs.js\": \"./app/javascript/components/about/AboutUs.js\",\n\t\"./expo/Booth\": \"./app/javascript/components/expo/Booth.js\",\n\t\"./expo/Booth.js\": \"./app/javascript/components/expo/Booth.js\",\n\t\"./expo/BoothFiles\": \"./app/javascript/components/expo/BoothFiles.js\",\n\t\"./expo/BoothFiles.js\": \"./app/javascript/components/expo/BoothFiles.js\",\n\t\"./expo/Expo\": \"./app/javascript/components/expo/Expo.js\",\n\t\"./expo/Expo.js\": \"./app/javascript/components/expo/Expo.js\",\n\t\"./expo/SortPromoFiles\": \"./app/javascript/components/expo/SortPromoFiles.js\",\n\t\"./expo/SortPromoFiles.js\": \"./app/javascript/components/expo/SortPromoFiles.js\",\n\t\"./expo/VideoPlayer\": \"./app/javascript/components/expo/VideoPlayer.js\",\n\t\"./expo/VideoPlayer.js\": \"./app/javascript/components/expo/VideoPlayer.js\",\n\t\"./helpers/Ajax\": \"./app/javascript/components/helpers/Ajax.js\",\n\t\"./helpers/Ajax.js\": \"./app/javascript/components/helpers/Ajax.js\",\n\t\"./helpers/ColorTools\": \"./app/javascript/components/helpers/ColorTools.js\",\n\t\"./helpers/ColorTools.js\": \"./app/javascript/components/helpers/ColorTools.js\",\n\t\"./helpers/CurrentEvent\": \"./app/javascript/components/helpers/CurrentEvent.js\",\n\t\"./helpers/CurrentEvent.js\": \"./app/javascript/components/helpers/CurrentEvent.js\",\n\t\"./helpers/DateGroup\": \"./app/javascript/components/helpers/DateGroup.js\",\n\t\"./helpers/DateGroup.js\": \"./app/javascript/components/helpers/DateGroup.js\",\n\t\"./helpers/DynamicCSS\": \"./app/javascript/components/helpers/DynamicCSS.js\",\n\t\"./helpers/DynamicCSS.js\": \"./app/javascript/components/helpers/DynamicCSS.js\",\n\t\"./helpers/EventAssets\": \"./app/javascript/components/helpers/EventAssets.js\",\n\t\"./helpers/EventAssets.js\": \"./app/javascript/components/helpers/EventAssets.js\",\n\t\"./helpers/EventPages\": \"./app/javascript/components/helpers/EventPages.js\",\n\t\"./helpers/EventPages.js\": \"./app/javascript/components/helpers/EventPages.js\",\n\t\"./helpers/FontTools\": \"./app/javascript/components/helpers/FontTools.js\",\n\t\"./helpers/FontTools.js\": \"./app/javascript/components/helpers/FontTools.js\",\n\t\"./helpers/HashTools\": \"./app/javascript/components/helpers/HashTools.js\",\n\t\"./helpers/HashTools.js\": \"./app/javascript/components/helpers/HashTools.js\",\n\t\"./helpers/TimeCounter\": \"./app/javascript/components/helpers/TimeCounter.js\",\n\t\"./helpers/TimeCounter.js\": \"./app/javascript/components/helpers/TimeCounter.js\",\n\t\"./helpers/YoutubeLinkParser\": \"./app/javascript/components/helpers/YoutubeLinkParser.js\",\n\t\"./helpers/YoutubeLinkParser.js\": \"./app/javascript/components/helpers/YoutubeLinkParser.js\",\n\t\"./intro/Intro\": \"./app/javascript/components/intro/Intro.js\",\n\t\"./intro/Intro.js\": \"./app/javascript/components/intro/Intro.js\",\n\t\"./intro/IntroHero\": \"./app/javascript/components/intro/IntroHero.js\",\n\t\"./intro/IntroHero.js\": \"./app/javascript/components/intro/IntroHero.js\",\n\t\"./intro/IntroMovie\": \"./app/javascript/components/intro/IntroMovie.js\",\n\t\"./intro/IntroMovie.js\": \"./app/javascript/components/intro/IntroMovie.js\",\n\t\"./library/Book\": \"./app/javascript/components/library/Book.js\",\n\t\"./library/Book.js\": \"./app/javascript/components/library/Book.js\",\n\t\"./library/Library\": \"./app/javascript/components/library/Library.js\",\n\t\"./library/Library.js\": \"./app/javascript/components/library/Library.js\",\n\t\"./navigation/MainNavigation\": \"./app/javascript/components/navigation/MainNavigation.js\",\n\t\"./navigation/MainNavigation.js\": \"./app/javascript/components/navigation/MainNavigation.js\",\n\t\"./navigation/Menu\": \"./app/javascript/components/navigation/Menu.js\",\n\t\"./navigation/Menu.js\": \"./app/javascript/components/navigation/Menu.js\",\n\t\"./shared/PageTitle\": \"./app/javascript/components/shared/PageTitle.js\",\n\t\"./shared/PageTitle.js\": \"./app/javascript/components/shared/PageTitle.js\",\n\t\"./shared/Tags\": \"./app/javascript/components/shared/Tags.js\",\n\t\"./shared/Tags.js\": \"./app/javascript/components/shared/Tags.js\",\n\t\"./speakers/Speakers\": \"./app/javascript/components/speakers/Speakers.js\",\n\t\"./speakers/Speakers.js\": \"./app/javascript/components/speakers/Speakers.js\",\n\t\"./sponsors/Sponsors\": \"./app/javascript/components/sponsors/Sponsors.js\",\n\t\"./sponsors/Sponsors.js\": \"./app/javascript/components/sponsors/Sponsors.js\",\n\t\"./stream/CommentButtonPanel\": \"./app/javascript/components/stream/CommentButtonPanel.js\",\n\t\"./stream/CommentButtonPanel.js\": \"./app/javascript/components/stream/CommentButtonPanel.js\",\n\t\"./stream/DateTimePanel\": \"./app/javascript/components/stream/DateTimePanel.js\",\n\t\"./stream/DateTimePanel.js\": \"./app/javascript/components/stream/DateTimePanel.js\",\n\t\"./stream/Lecture\": \"./app/javascript/components/stream/Lecture.js\",\n\t\"./stream/Lecture.js\": \"./app/javascript/components/stream/Lecture.js\",\n\t\"./stream/SegmentLinePanel\": \"./app/javascript/components/stream/SegmentLinePanel.js\",\n\t\"./stream/SegmentLinePanel.js\": \"./app/javascript/components/stream/SegmentLinePanel.js\",\n\t\"./stream/Stream\": \"./app/javascript/components/stream/Stream.js\",\n\t\"./stream/Stream.js\": \"./app/javascript/components/stream/Stream.js\",\n\t\"./stream/StreamInfo\": \"./app/javascript/components/stream/StreamInfo.js\",\n\t\"./stream/StreamInfo.js\": \"./app/javascript/components/stream/StreamInfo.js\",\n\t\"./stream/StreamServiceInfo\": \"./app/javascript/components/stream/StreamServiceInfo.js\",\n\t\"./stream/StreamServiceInfo.js\": \"./app/javascript/components/stream/StreamServiceInfo.js\",\n\t\"./stream/StreamVideo\": \"./app/javascript/components/stream/StreamVideo.js\",\n\t\"./stream/StreamVideo.js\": \"./app/javascript/components/stream/StreamVideo.js\",\n\t\"./stream/comments/Comments\": \"./app/javascript/components/stream/comments/Comments.js\",\n\t\"./stream/comments/Comments.js\": \"./app/javascript/components/stream/comments/Comments.js\",\n\t\"./stream/comments/Form\": \"./app/javascript/components/stream/comments/Form.js\",\n\t\"./stream/comments/Form.js\": \"./app/javascript/components/stream/comments/Form.js\",\n\t\"./stream/comments/Input\": \"./app/javascript/components/stream/comments/Input.js\",\n\t\"./stream/comments/Input.js\": \"./app/javascript/components/stream/comments/Input.js\",\n\t\"./stream/comments/Item\": \"./app/javascript/components/stream/comments/Item.js\",\n\t\"./stream/comments/Item.js\": \"./app/javascript/components/stream/comments/Item.js\",\n\t\"./stream/comments/List\": \"./app/javascript/components/stream/comments/List.js\",\n\t\"./stream/comments/List.js\": \"./app/javascript/components/stream/comments/List.js\",\n\t\"./stream/comments/Submit\": \"./app/javascript/components/stream/comments/Submit.js\",\n\t\"./stream/comments/Submit.js\": \"./app/javascript/components/stream/comments/Submit.js\",\n\t\"./timeline/CalendarPanel\": \"./app/javascript/components/timeline/CalendarPanel.js\",\n\t\"./timeline/CalendarPanel.js\": \"./app/javascript/components/timeline/CalendarPanel.js\",\n\t\"./timeline/CentralPanel\": \"./app/javascript/components/timeline/CentralPanel.js\",\n\t\"./timeline/CentralPanel.js\": \"./app/javascript/components/timeline/CentralPanel.js\",\n\t\"./timeline/LecturePanel\": \"./app/javascript/components/timeline/LecturePanel.js\",\n\t\"./timeline/LecturePanel.js\": \"./app/javascript/components/timeline/LecturePanel.js\",\n\t\"./timeline/Timeline\": \"./app/javascript/components/timeline/Timeline.js\",\n\t\"./timeline/Timeline.js\": \"./app/javascript/components/timeline/Timeline.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/javascript/components sync recursive ^\\\\.\\\\/.*$\";","import React, { useState, useEffect, useRef } from \"react\";\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter, Route, Redirect, NavLink, Link, useLocation } from \"react-router-dom\";\nimport { CSSTransition } from 'react-transition-group';\nimport { Container, Row, Col } from 'react-bootstrap';\nimport { useScrollPosition } from '@n8tb1t/use-scroll-position';\n\nimport PropTypes from \"prop-types\";\n\nimport EventPages from './helpers/EventPages.js';\nimport EventAssets from './helpers/EventAssets.js';\n\nimport Menu from './navigation/Menu.js';\nimport MainNavigation from './navigation/MainNavigation.js';\n\n// Main component, presenting Navigation, Menu and all pages\n//\nexport const App=(props)=> {\n const [menu, setMenu] = useState(false);\n const { id } = props.data;\n const routes = EventPages(props);\n const assets = EventAssets(props);\n const [title, setTitle] = useState(null);\n const [navigation, setNavigation] = useState(true);\n const [scroll, setScroll] = useState(0);\n\n useEffect(() => {\n if(!document) { return; }\n document.title = props.data.title; // Set browser title\n assets.initializeDocument(document); // set background color and initialize fonts\n }, []);\n\n useEffect(() => {\n if(menu) { console.info(\"Menja se meni %o, na %o\", menu, title); return; }\n window.scrollTo(0, scroll);\n }, [menu]);\n\n useScrollPosition(({ prevPos, currPos }) => {\n if(menu || prevPos.y == currPos.y) { return; }\n setScroll(-currPos.y);\n }, [menu, title]);\n\n const closeMenu=(change)=> {\n if(change) { setScroll(0); }\n setMenu(false);\n };\n\n if(!id) { return null; }\n const nav = !menu && navigation;\n\n return (\n \n \n {/* Modal */}\n \n {/* Header Navigation */}\n { nav && }\n {/* Root redirects to intro */}\n \n {/* Route -> Page */}\n \n { routes.map(({ path, Component, meta, data }) => (\n \n {({ match }) => (\n \n \n setTitle(title)}\n showNavigation={(show)=>setNavigation(show)} />\n \n \n )}\n \n ))}\n \n \n \n );\n};\n\nApp.propTypes = {\n data: PropTypes.exact({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.string.isRequired,\n about: PropTypes.string.isRequired,\n colors: PropTypes.object.isRequired,\n fonts: PropTypes.object.isRequired,\n media: PropTypes.object.isRequired,\n speakers: PropTypes.array.isRequired,\n lectures: PropTypes.array.isRequired,\n books: PropTypes.array.isRequired,\n sponsors: PropTypes.array.isRequired,\n meta: PropTypes.object.isRequired,\n }),\n};\n","import React from \"react\";\nimport { App } from './App';\n\n\n// Root only exists because rails-react gem can't render components with hooks\n// It passes props to the App component and to check props\n//\nclass Root extends React.Component {\n render () { return ( ); }\n}\nexport default Root;\n","import React, { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Container, Row, Col } from 'react-bootstrap';\nimport PageTitle from '../shared/PageTitle.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst AboutUs=({meta, user, data, headerTitle, assets})=> {\n const [paragraphs, setParagraphs] = useState([]);\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'about', item: null});\n }, []);\n\n useEffect(() => {\n headerTitle(meta.title);\n setParagraphs(data.split(/\\r?\\n\\r?\\n/));\n }, [data]);\n\n const heading=(text, index)=> {\n return (

{ text }

);\n };\n const paragraph=(text, index, count)=> {\n return (\n
\n

{ text }

\n { (index < count-1) &&\n
\n }\n
\n );\n };\n return (\n \n \n \n \n { paragraphs.map((item, index)=> {\n return ((index % 2 == 0) ?\n heading(item, index) :\n paragraph(item, index, paragraphs.length));\n })}\n \n \n \n );\n};\n\nAboutUs.propTypes = {\n meta: PropTypes.shape({\n title: PropTypes.string.isRequired,\n }),\n data: PropTypes.string.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n pageText: PropTypes.object.isRequired,\n colorSeparator: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default AboutUs;\n","import React, { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useParams } from 'react-router-dom';\nimport { Container, Row, Col, Image } from 'react-bootstrap';\n\nimport PageTitle from '../shared/PageTitle.js';\nimport BoothFiles from './BoothFiles.js';\n\nimport imgBooth from '../../images/booth.png';\nimport VideoPlayer from './VideoPlayer.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Booth=({meta, user, sponsors, assets})=> {\n const { id } = useParams();\n const [sponsor] = useState(sponsors.find(item => item.id == id));\n\n const movies = sponsor.promo_files.filter((file)=> file.kind == \"mov\");\n const url = sponsor.url || null;\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'booth', item: id});\n }, []);\n\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {/* TODO: make it work just as other files */}\n \n \n \n \n \n \n \n \n \n \n \n );\n};\nBooth.propTypes = {\n sponsors: PropTypes.arrayOf(\n PropTypes.exact({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n tier: PropTypes.string.isRequired,\n level: PropTypes.number.isRequired,\n expo_index: PropTypes.number,\n banner: PropTypes.string.isRequired,\n url: PropTypes.string,\n url2: PropTypes.string,\n promo_files: PropTypes.arrayOf(\n PropTypes.exact({\n id: PropTypes.number.isRequired,\n kind: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n file: PropTypes.string.isRequired,\n })\n ).isRequired,\n })),\n assets: PropTypes.shape({\n css: PropTypes.shape({\n bgModal: PropTypes.object.isRequired,\n pageText: PropTypes.object.isRequired,\n tagAccess: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default Booth;\n","import React, { useState, useRef } from \"react\";\nimport { Container, Row, Col, Image, Button, Overlay, Tooltip, Popover, OverlayTrigger } from 'react-bootstrap';\n\nimport SortPromoFiles from './SortPromoFiles.js';\n\nconst BoothFiles=({files, assets})=> {\n const sorted = SortPromoFiles(files);\n const [selected, setSelected] = useState(null);\n const [target, setTarget] = useState(null);\n const ref = useRef(null);\n\n const select=(event, item)=> {\n if(item.files.length > 1) {\n setSelected(selected ? null : item);\n setTarget(target ? null : event.target);\n } else { present(item.files[0]); }\n };\n const present=(promo)=> {\n setSelected(null);\n setTarget(null);\n if(promo.file) { window.open(promo.file); }\n };\n\n return (\n \n { sorted.map((item, index)=> {\n const count = item.files.length;\n const mid = (index % 2 == 1);\n return (\n \n );\n })}\n \n \n \n {selected && selected.files.map((item, index)=> {\n return (\n present(item)} >\n \n \n
{ item.title }
\n \n
\n );\n })}\n
\n
\n
\n
\n );\n};\nexport default BoothFiles;\n","import React, { useState, useEffect } from \"react\";\nimport { Route } from \"react-router-dom\";\nimport PropTypes from \"prop-types\";\nimport { Link, useLocation } from \"react-router-dom\";\nimport { Container, Row, Col, Card } from 'react-bootstrap';\n\nimport PageTitle from '../shared/PageTitle.js';\nimport Booth from './Booth.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Expo=({meta, user, data, headerTitle, assets})=> {\n const filtered = data.filter((sponsor) => sponsor.promo_files.length > 1);\n const location = useLocation();\n const [booth, setBooth] = useState(null);\n const { hash } = useLocation();\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'expo', item: null});\n }, []);\n\n useEffect(() => {\n headerTitle(\"\");\n }, [location]);\n\n\n return (\n \n \n \n \n \n \n \n { filtered.map((item, index)=> {\n return (\n \n \n \n \n \n \n );\n })}\n \n \n \n );\n};\n\nExpo.propTypes = {\n data: PropTypes.arrayOf(PropTypes.exact({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n tier: PropTypes.string.isRequired,\n level: PropTypes.number.isRequired,\n banner: PropTypes.string,\n url: PropTypes.string,\n url2: PropTypes.string,\n promo_files: PropTypes.arrayOf(\n PropTypes.exact({\n id: PropTypes.number.isRequired,\n kind: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n file: PropTypes.string.isRequired,\n })\n ).isRequired,\n })).isRequired,\n};\nexport default Expo;\n","import imgDOC from '../../images/icon-word.svg';\nimport imgPPT from '../../images/icon-ppt.svg';\nimport imgPDF from '../../images/icon-pdf.svg';\n\n\nconst SortPromoFiles=(files)=> {\n const filtered=(list, type)=> {\n return list.filter((file)=> file.kind == type);\n };\n const sorted =\n [{icon: imgPDF, files: filtered(files, \"pdf\")},\n {icon: imgPPT, files: filtered(files, \"ppt\")},\n {icon: imgDOC, files: filtered(files, \"doc\")}];\n\n return sorted.filter((obj)=>{return obj.files.length > 0; });\n};\nexport default SortPromoFiles;\n","import React from \"react\";\nimport { Row, Col } from 'react-bootstrap';\n\n\nconst VideoPlayer=({source, width, placement})=> {\n if(!source || !source.file) { return null; }\n\n const columns = `col-${width}`;\n const justify = `justify-content-${placement}`;\n return (\n \n \n \n );\n};\nexport default VideoPlayer;\n","\nexport const Post=(path, payload)=> {\n fetch(path, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify(payload)\n });\n};\n\nexport const Put=(path, payload)=> {\n fetch(path, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n body: JSON.stringify(payload)\n });\n};\n\nexport const RecordPageVisit=({meta, user, page, item})=> {\n Post('/visit', { conference_id: meta.id,\n visitor_id: user && user.id,\n page: page,\n item: item });\n};\n","\n// Colors used throughout the app\n//\nexport const MediconColor = {\n green: '#30b48a',\n red: '#fa4164',\n purple: '#a74bfc',\n};\n\n// Make something more transparent\n//\nexport const ObscureColor=(hex, alpha)=> {\n return `${hex}${Math.floor(alpha * 255).toString(16).padStart(2, 0)}`;\n};\n\n// Parsing colors from backend and catalogue them for use in the app\n// In case of missing color, use red\n//\nexport const ColorParser=({colors})=> {\n const wrong = '#e51837';\n const green = '#30b48a';\n const red = '#fa4164';\n const white = '#ffffff';\n\n const bg = colors.bg || wrong;\n const text = colors.text || wrong;\n const heading = colors.heading || wrong;\n const title = colors.title || wrong;\n const subtitle = colors.subtitle || wrong;\n const transparentDark = '#11111177';\n const transparentLight = '#11111133';\n\n const initializeDocument=(document)=> {\n document.body.style.backgroundColor = colors.bg; //Pull color from bg and add to body\n };\n return {\n initializeDocument,\n wrong,\n green,\n red,\n white,\n bg,\n text,\n heading,\n title,\n subtitle,\n transparentDark,\n transparentLight,\n };\n};\n","import moment from 'moment';\n\n// Calculating event that is going on right now (started before now and longest lecture is still not finished)\n//\nconst CurrentEvent=(input)=> {\n if(!input || input.length < 1) { return -1; }\n let closest = [...input].reverse().find(e => moment(e.date, \"YYYY-MM-DD#hh-mm\").isBefore());\n if(!closest) { return -1; }\n\n const start = moment(closest.date, \"YYYY-MM-DD#hh-mm\");\n const longest_duration = Math.max.apply(Math, closest.lectures.map(e => e.duration));\n const end = moment(start).add(longest_duration, 'minutes');\n\n return (start && end && start.isBefore() && end.isAfter()) ? input.indexOf(closest) : -1;\n};\nexport default CurrentEvent;\n","// Grouping lectures by date and time\n//\nconst DateGroup=(input)=> {\n if(!input || input.length < 1) { return []; }\n\n const anchors=(input)=> {\n const reduced = input.reduce((rv, x)=> {\n rv[x['date'] + '#' + x['time']] = [];\n return rv;\n }, []);\n return Object.keys(reduced);\n };\n\n const values=(input, anchor)=> {\n const [date, time] = anchor.split('#');\n\n return input.filter((rv, x)=> {\n return (rv['date'] == date && rv['time'] == time);\n }, []);\n };\n\n const sortDate=(values)=> {\n return values.sort((v1, v2) => v1.priority < v2.priority);\n };\n\n return anchors(input).map((key)=> {\n return { date: key, lectures: sortDate(values(input, key)) };\n });\n};\nexport default DateGroup;\n","import { Pick, Purge } from './HashTools.js';\n\n\nexport const DynamicCSS=({media, colors, fonts})=> {\n\n const cover=(image)=> {\n if(!image) { return {}; }\n return { background: `url(${image}) no-repeat center center fixed` };\n };\n\n const fullscreen = {\n minHeight: '100vh',\n overscrollBehavior: 'contain',\n backgroundAttachment: 'fixed',\n overflow: 'visible',\n };\n const bgImage = {\n ...cover(media.background),\n backgroundColor: colors.text,\n backgroundSize: 'cover',\n ...fullscreen\n };\n const bgModal = {\n ...bgImage,\n overflow: 'auto',\n };\n const bgNav = {\n backgroundColor: colors.bg,\n opacity: 0.97,\n };\n const colorIcon = {\n color: colors.text\n };\n const smallIcon = {\n color: colors.text,\n fontSize: '2rem',\n };\n const circledIcon = {\n color: colors.text,\n fontSize: '1.8rem',\n };\n const colorSeparator = {\n backgroundColor: colors.text,\n opacity: 0.2,\n };\n const pageTitle = {\n color: colors.title,\n fontFamily: fonts.extrabold.family,\n };\n const pageText = {\n color: colors.text,\n fontFamily: fonts.regular.family,\n };\n const fatText = {\n color: colors.text,\n fontFamily: fonts.extrabold.family,\n };\n const subtitleText = {\n color: colors.subtitle,\n fontFamily: fonts.semibold.family,\n };\n const menuItem = {\n color: colors.heading,\n fontFamily: fonts.semibold.family,\n };\n const listAvatar = {\n color: colors.transparentDark,\n fontSize: '4rem',\n };\n const verticalLine = {\n backgroundColor: colors.text,\n opacity: 0.2,\n };\n const circleTransparent = {\n backgroundColor: colors.transparentDark,\n };\n const circleAlert = {\n backgroundColor: colors.red,\n };\n const bubblePanel = {\n backgroundColor: colors.transparentLight,\n };\n const tag = {\n color: colors.text,\n fontFamily: fonts.extrabold.family,\n fontSize: '0.7rem',\n };\n const counterIcon = {\n color: colors.text,\n fontFamily: fonts.regular.family,\n fontSize: '1.2rem',\n };\n const tagLive = {\n ...tag,\n backgroundColor: colors.red,\n };\n const tagRecorded = {\n ...tag,\n backgroundColor: colors.green,\n };\n const tagModerators = {\n ...tag,\n backgroundColor: 'black',\n color: colors.white,\n };\n const tagCounter = {\n ...tag,\n borderStyle: 'solid',\n borderWidth: 0.5,\n borderColor: colors.text,\n };\n const tagAccess = { // Not inheriting tag!\n color: '#333',\n fontFamily: fonts.extrabold.family,\n fontSize: '0.8rem',\n backgroundColor: 'white',\n };\n return {\n bgImage, bgModal, bgNav,\n colorIcon, smallIcon, circledIcon, // Icons\n colorSeparator,\n pageTitle, pageText, fatText, subtitleText, menuItem, // Text\n listAvatar,\n verticalLine, circleTransparent, circleAlert, bubblePanel, // Timeline\n tagLive, tagRecorded, tagModerators, tagAccess, tagCounter, // Tags\n counterIcon,\n };\n};\n","import { Pick, Purge } from './HashTools.js';\nimport { ObscureColor } from './ColorTools.js';\nimport { ColorParser } from './ColorTools.js';\nimport { FontParser } from './FontTools.js';\nimport { DynamicCSS } from './DynamicCSS.js';\n\n// EventAssets is receiving assets from the backend and creates styles for components\n//\nconst EventAssets=({data})=> {\n const colors = ColorParser(data);\n const fonts = FontParser(data);\n const css = DynamicCSS({media: data.media, colors: colors, fonts: fonts});\n\n const initializeDocument=(document)=> {\n colors.initializeDocument(document);\n fonts.initializeDocument(document);\n };\n return {\n css,\n initializeDocument,\n\n fonts:{},\n background:{},\n menu:{},\n menuButton:{},\n timeline:{},\n speakers:{},\n page: {\n title:{},\n text:{},\n secondary_text:{}\n }\n };\n};\nexport default EventAssets;\n","import React from \"react\";\nimport Intro from '../intro/Intro.js';\nimport Timeline from '../timeline/Timeline.js';\nimport Expo from '../expo/Expo.js';\nimport Speakers from '../speakers/Speakers.js';\nimport Sponsors from '../sponsors/Sponsors.js';\nimport Library from '../library/Library.js';\nimport AboutUs from '../about/AboutUs.js';\n\n\n// EventPages sorts data according to component which needs it\n// When there is no title in meta object, component is not presented in the Menu\n//\nconst EventPages=({data})=> {\n return [ { path: '/intro', Component: Intro, data: {...data}, meta: {} },\n { path: '/timeline', Component: Timeline, data: data.lectures, meta: { id: data.id, ...data.meta.timeline, ...data.meta.texts } },\n { path: '/expo', Component: Expo, data: data.sponsors, meta: { id: data.id, ...data.meta.expo } },\n { path: '/speakers', Component: Speakers, data: data.speakers, meta: { id: data.id, ...data.meta.speakers } },\n { path: '/sponsors', Component: Sponsors, data: data.sponsors, meta: { id: data.id, ...data.meta.sponsors } },\n { path: '/library', Component: Library, data: data.books, meta: { id: data.id, ...data.meta.library } },\n { path: '/about', Component: AboutUs, data: data.about, meta: { id: data.id, ...data.meta.about } },\n ];\n};\nexport default EventPages;\n","\n\n// Parsing fonts from backend and create FontFace objects\n//\nexport const FontParser=({fonts})=> {\n const regular = new FontFace('Regular', `url(${fonts.regular})`);\n const semibold = new FontFace('SemiBold', `url(${fonts.semibold})`);\n const extrabold = new FontFace('ExtraBold', `url(${fonts.extrabold})`);\n\n const initializeDocument=(document)=> {\n document.fonts.add(regular);\n document.fonts.add(semibold);\n document.fonts.add(extrabold);\n };\n return {\n initializeDocument,\n regular,\n semibold,\n extrabold\n };\n};\n","\n// Remove all null and undefined values from object\n//\nexport const Purge=(obj)=> {\n const result = Object.entries(obj)\n .filter(Boolean)\n .filter((obj)=> {\n return (obj[1] != \"null\") && (obj[1] != \"false\");\n });\n return Object.fromEntries(result);\n};\n\n// Take nth member from the array\n//\nexport const Pick=(array, n, attribute = null)=> {\n if(!array || array.length < n) { return null; }\n\n return attribute == null ?\n array[n] :\n array[n][attribute];\n};\n","import React, { useEffect } from \"react\";\nimport moment from 'moment';\n\nconst TimeCounter=({date, time})=> {\n if(!date || !time) return null;\n const stream_time = moment(date + \":\" + time, \"YYYY-MM-DD:hh-mm\");\n const later = stream_time.isAfter();\n\n const now = moment(moment.now()); //.format('hh:mm:ss');\n const then = stream_time; //.format('hh:mm:ss');\n const diff = moment(then.diff(now));\n const duration = moment.duration(diff);\n\n const remaining = duration.days() > 0 ? null : Math.floor(duration.asHours()) + moment.utc(diff).format(\":mm\");\n return { later, remaining };\n};\nexport default TimeCounter;\n","\n\nconst YoutubeLinkParser=(original)=> {\n var result = original.replace(\"youtu.be\", \"www.youtube.com/embed/\");\n result = result.replace(\"www.youtube.com/watch?v=\", \"www.youtube.com/embed/\");\n result = result.replace(\"http://\", \"https://\");\n return result;\n};\nexport default YoutubeLinkParser;\n","import React, { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { NavLink, Link } from \"react-router-dom\";\nimport { useHistory } from \"react-router-dom\";\nimport { CSSTransition, SwitchTransition } from 'react-transition-group';\nimport { Container } from 'react-bootstrap';\n\nimport PageTitle from '../shared/PageTitle.js';\nimport IntroMovie from './IntroMovie.js';\nimport IntroHero from './IntroHero.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Intro =({data, user, assets, showNavigation})=> {\n const history = useHistory();\n const portrait = window.innerWidth < window.innerHeight;\n const movie = portrait && data.media.phone_intro ? data.media.phone_intro : data.media.intro;\n const [showHero, setShowHero] = useState(movie == null);\n\n useEffect(()=> {\n console.log(data);\n RecordPageVisit({meta: data, user: user, page: 'intro', item: null});\n showNavigation(false);\n }, []);\n\n useEffect(() => {\n if(!showHero) { return ()=>{}; }\n const timer = setTimeout(() => imageEnd(), 3000);\n return () => clearTimeout(timer);\n }, [showHero]);\n\n const imageEnd=(()=> {\n history.push(\"/timeline\");\n });\n return (\n \n \n \n { showHero ?\n :\n setShowHero(true)} />\n }\n \n \n \n );\n};\nIntro.propTypes = {\n data: PropTypes.shape({\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.string.isRequired,\n media: PropTypes.object.isRequired,\n }).isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n pageText: PropTypes.object.isRequired,\n bubblePanel: PropTypes.object.isRequired,\n }).isRequired,\n }).isRequired\n};\nexport default Intro;\n","import React, { useState, useEffect } from \"react\";\nimport { Container, Col, Row, Nav } from 'react-bootstrap';\n\n\n// Fullscreen page with centered title/subtitle both vertically and horizontally\n//\nconst IntroHero=({title, subtitle, warning, assets})=> {\n return (\n \n \n \n

{ title }

\n
\n \n

{ subtitle }

\n
\n \n \n
\n {warning}\n
\n
\n
\n
\n
\n );\n};\nexport default IntroHero;\n","import React from \"react\";\n\n// Fullscreen movie that starts immediately and calls `finished` when it's over\n//\nconst IntroMovie=({file, portrait, finished})=> {\n return (\n
\n
\n \n
\n
\n );\n};\nexport default IntroMovie;\n","import React, { useState, useEffect, useRef } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useParams } from 'react-router-dom';\nimport { Container, Row, Col } from 'react-bootstrap';\nimport { usePdf } from '@mikecousins/react-pdf';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Book=({meta, user, books, assets})=> {\n const { id } = useParams();\n const [book] = useState(books.find(item => item.id == id));\n const [page, setPage] = useState(1);\n const [file, setFile] = useState('none');\n\n if(!book) { return null; }\n\n const canvasRef = useRef(null);\n const { pdfDocument, pdfPage } = usePdf({file: book.file, page, canvasRef});\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'book', item: id});\n }, []);\n\n useEffect(()=> {\n if(!book) return;\n setFile(book.file);\n }, [book]);\n\n const commands=()=> {\n return (\n
\n setPage(page-1)} />\n setPage(page+1)} />\n
\n );\n };\n\n return (\n \n \n {!pdfDocument && Knjiga se učitava...}\n {pdfDocument &&\n \n {commands()}\n \n \n }\n \n \n );\n};\nexport default Book;\n","import React, { useState, useEffect } from \"react\";\nimport { Route } from \"react-router-dom\";\nimport PropTypes from \"prop-types\";\nimport { Container, Row, Col } from 'react-bootstrap';\nimport { Link } from \"react-router-dom\";\n\nimport PageTitle from '../shared/PageTitle.js';\nimport Book from './Book.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Library=({meta, user, data, headerTitle, assets})=> {\n useEffect(() => {\n headerTitle(meta.title);\n }, [location]);\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'library', item: null});\n }, []);\n\n return (\n \n \n \n \n \n \n \n { data.map((item, index)=> {\n return (\n \n \n \n \n \n );\n })}\n \n \n \n );\n};\n\nLibrary.propTypes = {\n data: PropTypes.arrayOf(PropTypes.exact({\n id: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n file: PropTypes.string.isRequired,\n cover: PropTypes.string.isRequired,\n })).isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default Library;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Navbar, Button } from 'react-bootstrap';\nimport { useLocation, useHistory } from 'react-router-dom';\n\n// Header element shared on all pages,\n// In the left corner is Logo of the conference, in the right one is Menu button\n//\nconst MainNavigation=({openMenu, logo, title, assets})=> {\n const location = useLocation();\n const history = useHistory();\n const id = location.pathname.split(\"/\").pop();\n const detailPage = Number.isInteger(parseInt(id)); // If the last part of path is number\n\n const icon = detailPage ? \"icon-arrow-back\" : \"icon-menu\";\n\n const clickMenu=()=> {\n detailPage ? history.goBack() : openMenu(true);\n };\n\n return (\n \n
\n {/* Left */}\n \n {logo && }\n \n \n

{ title }

\n
\n {/* Right */}\n \n \n \n \n );\n};\nMainNavigation.propTypes = {\n logo: PropTypes.string,\n openMenu: PropTypes.func.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n colorIcon: PropTypes.object.isRequired\n }),\n }).isRequired\n};\nexport default MainNavigation;\n","import React, { useState } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { NavLink, Link } from \"react-router-dom\";\nimport { Container, Col, Row, Nav, Modal } from 'react-bootstrap';\n\n\nconst Menu =({show, close, routes, assets})=> {\n const visible = routes.filter(item => item.meta.name);\n\n return (\n close(false)}>\n \n {visible.map(({path, meta}) => (\n \n close(true)}>\n

{meta.name}

\n
\n
\n ))}\n
\n
\n );\n};\nMenu.propTypes = {\n show: PropTypes.bool.isRequired,\n close: PropTypes.func.isRequired,\n routes: PropTypes.array.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n menuItem: PropTypes.object.isRequired,\n }).isRequired,\n }).isRequired,\n};\nexport default Menu;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Col, Row, Button } from 'react-bootstrap';\n\nconst PageTitle=({text, sub, assets})=> {\n const [url, url2] = [null, null];\n\n const subUrl=(url)=> {\n return (\n \n \n { url }\n \n \n \n );\n };\n return (\n \n \n \n

\n { text }\n

\n
\n { sub && sub.map((url)=> {\n return url && subUrl(url);\n })}\n \n
\n );\n};\nPageTitle.propTypes = {\n text: PropTypes.string,\n url: PropTypes.string,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default PageTitle;\n","import React, { useEffect, useRef } from \"react\";\nimport { Row, Col } from 'react-bootstrap';\n\n// Root tag component\n//\nexport const Tag=({big, style, text})=> {\n const padding = big ? \"px-4 py-2\" : \"px-2 py-1\";\n return (\n \n \n {text}\n \n \n );\n};\n\n// Red tag with \"LIVE\" title\n//\nexport const TagLive=({assets, text})=> {\n return ;\n};\n// Green tag with \"ON DEMAND\" title\n//\nexport const TagRecorded=({assets, text})=> {\n return ;\n};\n// Bigger white tag with \"ACCESS\" title\n//\nexport const TagAccess=({assets, text})=> {\n return ;\n};\n// Black tag with \"MODERATORS\" title\n//\nexport const TagModerators=({assets, text})=> {\n return ;\n};\n// Tag with an eye icon and number\n//\nexport const TagCounter=({assets, text})=> {\n return (\n \n \n \n {text}\n \n \n );\n};\n","import React, { useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Container, Row, Col } from 'react-bootstrap';\nimport PageTitle from '../shared/PageTitle.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Speakers=({meta, user, data, headerTitle, assets})=> {\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'speakers', item: null});\n headerTitle(meta.title);\n }, []);\n\n return (\n \n \n \n { data.map((item, index)=> {\n return (\n \n
\n { item.avatar ?\n :\n \n }\n
\n
\n

{ item.name }

\n

{ item.title }

\n
\n );\n })}\n
\n
\n );\n};\n\nSpeakers.propTypes = {\n data: PropTypes.arrayOf(PropTypes.exact({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n avatar: PropTypes.string, // not required\n })).isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n fatText: PropTypes.object.isRequired,\n subtitleText: PropTypes.object.isRequired,\n listAvatar: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default Speakers;\n","import React, { useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Container, Row, Col, Card } from 'react-bootstrap';\nimport PageTitle from '../shared/PageTitle.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Sponsors=({meta, user, data, headerTitle, assets})=> {\n const ordered = data.sort((a, b)=> a.level - b.level);\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'sponsors', item: null});\n headerTitle(meta.title);\n }, []);\n\n return (\n \n \n \n { ordered.map((item, index)=> {\n const clearfix = index > 0 && item.level != ordered[index-1].level;\n return (\n \n {clearfix &&
}\n \n \n \n \n \n \n );\n })}\n \n \n );\n};\n\nSponsors.propTypes = {\n data: PropTypes.arrayOf(PropTypes.exact({\n id: PropTypes.number.isRequired,\n name: PropTypes.string.isRequired,\n tier: PropTypes.string.isRequired,\n level: PropTypes.number.isRequired,\n expo_index: PropTypes.number,\n banner: PropTypes.string,\n url: PropTypes.string,\n url2: PropTypes.string,\n promo_files: PropTypes.array.isRequired,\n })).isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageTitle: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default Sponsors;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Row, Button } from 'react-bootstrap';\nimport { Link } from \"react-router-dom\";\n\nconst CommentButtonPanel=({title, lecture, assets, click})=> {\n const buttonContent = (\n \n \n \n {title + ' (' + lecture.comments.length + ')'}\n \n \n );\n\n return (\n \n \n \n {buttonContent}\n \n \n \n );\n};\nCommentButtonPanel.propTypes = {\n title: PropTypes.string.isRequired,\n lecture: PropTypes.object.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n colorIcon: PropTypes.object.isRequired,\n fatText: PropTypes.object.isRequired,\n bubblePanel: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default CommentButtonPanel;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Row, Col } from 'react-bootstrap';\n\nconst DateTimePanel=({date, time, assets})=> {\n return (\n \n \n \n
{date}
\n
\n\n \n
{time}
\n \n \n\n );\n};\nDateTimePanel.propTypes = {\n date: PropTypes.string.isRequired,\n time: PropTypes.string.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n fatText: PropTypes.object.isRequired,\n colorIcon: PropTypes.object.isRequired,\n verticalLine: PropTypes.object.isRequired,\n bubblePanel: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default DateTimePanel;\n","import React, { useState, useEffect } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useParams, useHistory, useLocation } from 'react-router-dom';\n\nimport Stream from '../stream/Stream.js';\nimport Comments from './comments/Comments.js';\n\nimport { Post, Put } from '../helpers/Ajax.js';\nimport { RecordPageVisit } from '../helpers/Ajax.js';\n\nconst Lecture=({lectures, user, live, meta, assets})=> {\n const { id } = useParams();\n const { hash } = useLocation();\n const [lecture, setLecture] = useState(null);\n const [counter, setCounter] = useState(0);\n\n useEffect(() => {\n window.scrollTo(0, 0);\n\n Put(`/attendances/${id}`, { live_counter: 1 });\n return () => {\n Put(`/attendances/${id}`, { live_counter: -1 });\n };\n }, []);\n\n useEffect(() => {\n RecordPageVisit({meta: meta, user: user, page: 'stream', item: id});\n setLecture(lectures.find(item => item.id == id) || null);\n }, [id]);\n\n useEffect(() => {\n if(!lecture) {\n return;\n } else if(live && live[id]) {\n setCounter(live[id]);\n } else {\n setCounter(lecture.live_counter);\n }\n }, [lecture, live]);\n\n useEffect(() => {\n live && id && setCounter(live[id] || 0);\n }, [live]);\n\n return (\n hash == '#comments' ?\n :\n \n\n );\n};\nexport default Lecture;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Row, Col } from 'react-bootstrap';\n\nconst SegmentLinePanel=({icon, title, text, assets})=> {\n const style = {};\n return (\n \n {icon &&\n \n \n \n }\n \n \n { title && title.length > 1 && title }\n \n \n { text && text.length > 1 && text }\n \n \n
\n \n \n
\n );\n};\nSegmentLinePanel.propTypes = {\n icon: PropTypes.bool.isRequired,\n title: PropTypes.string,\n text: PropTypes.string,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n smallIcon: PropTypes.object.isRequired,\n fatText: PropTypes.object.isRequired,\n pageText: PropTypes.object.isRequired,\n colorSeparator: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default SegmentLinePanel;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Container, Row, Col } from 'react-bootstrap';\n\nimport StreamVideo from './StreamVideo.js';\nimport StreamInfo from './StreamInfo.js';\nimport StreamServiceInfo from './StreamServiceInfo.js';\n\nconst Stream=({lecture, counter, meta, assets})=> {\n if(!lecture) { return null; }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n );\n};\nStream.propTypes = {\n lecture: PropTypes.exact({\n id: PropTypes.number.isRequired,\n live_counter: PropTypes.number.isRequired,\n title: PropTypes.string.isRequired,\n subtitle: PropTypes.string,\n date: PropTypes.string.isRequired,\n time: PropTypes.string.isRequired,\n duration: PropTypes.number.isRequired,\n live: PropTypes.bool.isRequired,\n link: PropTypes.string.isRequired,\n moderators: PropTypes.string.isRequired,\n segments: PropTypes.arrayOf(\n PropTypes.shape({\n id: PropTypes.number,\n\ttitle: PropTypes.string.isRequired,\n speakers: PropTypes.string.isRequired,\n })\n ).isRequired,\n comments: PropTypes.array.isRequired,\n }),\n meta: PropTypes.object.isRequired,\n assets: PropTypes.shape({\n css: PropTypes.shape({\n pageText: PropTypes.object.isRequired,\n tagAccess: PropTypes.object.isRequired,\n }),\n }).isRequired\n};\nexport default Stream;\n","import React from \"react\";\nimport { Container, Row, Col } from 'react-bootstrap';\n\nimport { TagLive, TagRecorded, TagModerators, TagCounter } from '../shared/Tags.js';\nimport SegmentLinePanel from './SegmentLinePanel.js';\n\nconst StreamInfo=({lecture, counter, meta, assets})=> {\n return (\n \n {/* Header */}\n \n { lecture.live ?\n :\n \n }\n { counter && }\n \n {/* Title */}\n \n

{ lecture.title }

\n
\n {/* Mods and Segments */}\n \n { lecture.moderators && lecture.moderators.length > 0 &&\n \n \n \n \n }\n {lecture.segments.map((seg, index)=> (\n \n \n \n ))}\n \n \n );\n};\nexport default StreamInfo;\n","import React from \"react\";\nimport { Row, Col } from 'react-bootstrap';\n\nimport DateTimePanel from './DateTimePanel.js';\nimport CommentButtonPanel from './CommentButtonPanel.js';\n\nconst StreamServiceInfo=({lecture, meta, assets})=> {\n return (\n \n \n \n \n );\n};\nexport default StreamServiceInfo;\n","import React from \"react\";\nimport { Row, Col } from 'react-bootstrap';\n\nimport YoutubeLinkParser from '../helpers/YoutubeLinkParser.js';\nimport TimeCounter from '../helpers/TimeCounter.js';\n\nconst StreamVideo=({lecture, assets})=> {\n const source = YoutubeLinkParser(lecture.link);\n const { later, remaining } = TimeCounter(lecture);\n\n const counter=(time)=> {\n return (\n \n Počinje za { time }\n \n );\n };\n return (\n \n \n { !later &&