{"version":3,"file":"create_fabric.index.create-fabric-invitation-c4f1530.js","mappings":"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C,IAAMuG,EAAevG,EAAMM,aAAaiG,aACxC,GAAKA,EAAL,CAAoC,IACc,EADd,IACrBvG,EAAMI,eAAewxB,gBAAc,IAAlD,IAAK,EAAL,qBACE,KADOC,EAAE,QACT,GAAIA,EAAG52B,KAAOsL,EAAc,OAAOsrB,CAAE,CAAC,+BAFL,CAGrC,EAGwC,2BADA,SAAC7xB,GAAK,OAC5CA,EAAMM,aAAagW,kBAAkB,yOC7Fc,sBAAlB,kBACyB,wBAAvB,uBAuEnC,iCArE4C,CAK5C,oBACA,iBACA,mBACA,cACA,YACA,sBACA,WACA,gBACA,kBACA,WACA,gBACA,yBACA,UACA,gBACA,oBACA,gBACA,gBACA,aACA,gBACA,wBACA,gBACA,iBACA,iBACA,cACA,kBACA,kBACA,gBACA,kBACA,iBACA,aACA,yBACA,cACA,aACA,WACA,cACA,YACA,iBACA,kCACA,kBACA,gBACA,iBACA,YACA,gBACA,uBACA,oBACA,gBACA,sBACA,gBACA,cACA,cACA,kBACA,mBACA,sBACA,mBACA,aACA,kBACA,0BACA,YACA,yBACA,sBACA,iBACA,gCACA,mBACA,qBAkFA,mCA/E8C,CAK9C,MACA,aACA,YACA,QACA,cACA,UACA,WACA,iBACA,qBACA,iBACA,WACA,WACA,kBACA,cACA,aACA,oBACA,kBACA,iBACA,cACA,YACA,cACA,iBACA,SACA,oBACA,aACA,QACA,QACA,QACA,MACA,WACA,WACA,WACA,QACA,WACA,WACA,OACA,iBACA,aACA,kBACA,eACA,YACA,eACA,uBACA,gBACA,wBACA,UACA,QACA,oBACA,YACA,OACA,QACA,WACA,OACA,gBACA,YACA,oBACA,aACA,eACA,eACA,cACA,YACA,iBACA,YACA,QACA,WACA,SACA,eACA,sBACA,oBACA,cACA,cACA,eACA,YACA,SA0FA,iCAvF4C,CAK5C,YACA,gBACA,kBACA,aACA,gBACA,cACA,aACA,gBACA,mBACA,mBACA,wBACA,aACA,sBACA,4BACA,YACA,2BACA,gBACA,qBACA,gBACA,iBACA,oBACA,6BACA,mB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","sources":["webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Utility.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Tokenizer.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Enum.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Serializer.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Prefixer.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Parser.js","webpack://evite/./node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js","webpack://evite/./node_modules/@emotion/cache/node_modules/stylis/src/Middleware.js","webpack://evite/./node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js","webpack://evite/./node_modules/@emotion/memoize/dist/memoize.browser.esm.js","webpack://evite/./node_modules/@emotion/react/dist/emotion-element-cbed451f.browser.esm.js","webpack://evite/./node_modules/@emotion/react/dist/emotion-react.browser.esm.js","webpack://evite/./node_modules/@emotion/hash/dist/emotion-hash.esm.js","webpack://evite/./node_modules/@emotion/serialize/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js","webpack://evite/./node_modules/@emotion/serialize/dist/emotion-serialize.browser.esm.js","webpack://evite/./node_modules/@emotion/serialize/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://evite/./node_modules/@emotion/sheet/dist/emotion-sheet.browser.esm.js","webpack://evite/./node_modules/@emotion/unitless/dist/unitless.browser.esm.js","webpack://evite/./node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js","webpack://evite/./node_modules/@stripe/react-stripe-js/dist/react-stripe.umd.js","webpack://evite/./node_modules/@stripe/stripe-js/dist/stripe.esm.js","webpack://evite/./assets/js/CreateFabricInvitation/api/event.js","webpack://evite/./assets/js/CreateFabricInvitation/api/review.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Box/Box.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Captcha/CaptchaWrapper.js","webpack://evite/./assets/js/CreateFabricInvitation/components/ColorUnit/ColorUnit.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Colors/Colors.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Colors/RecentColors.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Content/ContentAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Envelope/Envelope.js","webpack://evite/./assets/js/CreateFabricInvitation/components/EyeDropper/EyeDropper.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Group/Group.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Header/Header.js","webpack://evite/./assets/js/CreateFabricInvitation/components/IconUnit/IconUnit.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Icons/Icons.js","webpack://evite/./assets/js/CreateFabricInvitation/components/LoginModal/LoginModalReduxWrapper.js","webpack://evite/./assets/js/CreateFabricInvitation/components/LoginModal/reducer/actions.js","webpack://evite/./assets/js/CreateFabricInvitation/components/LoginModal/reducer/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/components/LoginModal/reducer/index.js","webpack://evite/./assets/js/CreateFabricInvitation/components/LoginModal/reducer/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/components/NavHeader/NavHeader.js","webpack://evite/./assets/js/CreateFabricInvitation/components/NavHeader/OnboadingModalButton/OnboardingModalButton.js","webpack://evite/./assets/js/CreateFabricInvitation/components/NavHeader/ProgressBar.js","webpack://evite/./assets/js/CreateFabricInvitation/components/Rokt/RoktLauncherContextProvider.js","webpack://evite/./assets/js/CreateFabricInvitation/components/UpsellModal/UpsellModal.js","webpack://evite/./assets/js/CreateFabricInvitation/components/index.js","webpack://evite/./assets/js/CreateFabricInvitation/components/modals/NotifyGuestsOverlay.js","webpack://evite/./assets/js/CreateFabricInvitation/history.js","webpack://evite/./assets/js/CreateFabricInvitation/middleware/PromiseResolver.js","webpack://evite/./assets/js/CreateFabricInvitation/middleware/dataLayerMiddleware.js","webpack://evite/./assets/js/CreateFabricInvitation/middleware/previewTransform.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/ConfirmLeaveModal.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/createSteps.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/editSteps.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/index.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/utils.js","webpack://evite/./assets/js/CreateFabricInvitation/navigation/validation.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/details/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/details/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/details/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/details/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/eviteEvent/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/eviteEvent/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/eviteEvent/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/eviteEvent/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricDesign/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricDesign/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricDesign/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricDesign/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricTemplate/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricTemplate/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricTemplate/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/fabricTemplate/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/giftingOptions/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/giftingOptions/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/giftingOptions/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/modals/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/modals/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/modals/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/modals/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/reducers.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/review/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/review/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/review/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/review/selectors.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/webview/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/widgets/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/widgets/index.js","webpack://evite/./assets/js/CreateFabricInvitation/reducers/widgets/reducer.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/EventCreateDesign.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Background.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/BackgroundContainer.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/BackgroundEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/BackgroundEditorMobile.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/Contents/MobileBox.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Background/actions/useBackground.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Desktop/CardEditorDesktop.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Desktop/TextEditor/TextEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/CardEditorMobile.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/Contents/ContentBase.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/Contents/SpacingHeight/SpacingHeight.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/MobileButton.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/TextEditor/TextEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/UyoEditor/UyoEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ColorPicker/ColorPicker.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/AllFonts/AllFonts.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/Dropdown.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontItem/FontItem.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontsDropdown/FontsDropdown.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontsMobile.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/RecommendedFonts/RecommendedFonts.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/UpDownChevron/UpDownChevron.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/utils.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ImageSize/ImageSize.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LetterSpacing/LetterSpacing.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LineHeight/LineHeight.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ResetStyle/ResetStyle.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/TextFormat.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Alignment/Alignment.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Alignment/TextFormatAlignmentBase/TextFormatAlignmentBase.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Casing/Casing.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Casing/TextFormatCasingBase/TextFormatCasingBase.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextSize/TextSize.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UploadButton/UploadButton.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Uyo/Uyo.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Done/DoneButton.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Rotate/UyoImageRotate.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/UyoControl.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/Range/Range.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/ToggleButton/ToggleButton.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/CardTemplate.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Container.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Mobile/EditorContainer.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/EditBox/EditBox.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/Envelope.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/EnvelopeContainer.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/EnvelopeEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/Mobile/EnvelopeEditorMobile.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useEnvelope.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useLiner.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/EventCreateEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/ExitPremiumPreviewModal/ExitPremiumPreviewModal.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/NavBottom.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/NavButton.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/Onboarding.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Carousel/Carousel.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Carousel/Controller/Controller.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Step/Step.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/EventCreateStampContext.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/Mobile/StampEditorMobile.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/Stamp.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StampContainer.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StampEditor.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StickersCanvas.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/actions/useStamp.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/components/Stickers/Stickers.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/components/Tooltip/Tooltip.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/constants.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventCreateDesign/hooks/useOutsideAlerter.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventDetails/EventDetailsAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventGifting/EventGiftingAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/EventReview/EventReviewAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/GuestOptions/GuestOptionsAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/Preview/PreviewAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/Success/SuccessAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/Upsell/UpsellAsync.js","webpack://evite/./assets/js/CreateFabricInvitation/routes/Upsell/UpsellB.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/dataTracking.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/detectPinchGesture.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/experiments.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/modalPromises.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/save.js","webpack://evite/./assets/js/CreateFabricInvitation/utils/trackPages.js","webpack://evite/./assets/js/CreateFabricInvitation/webview/webview.js","webpack://evite/./assets/js/CreateGreetingCard/utils/navigation.js","webpack://evite/./assets/js/LoginModal/LoginContainer.js","webpack://evite/./assets/js/LoginModal/LoginWrapper.js","webpack://evite/./assets/js/MegaNav/MegaNavAsync.js","webpack://evite/./assets/js/SignupModal/index.js","webpack://evite/./assets/js/ViewInvitation/history.js","webpack://evite/./assets/js/ViewInvitation/reducers/apiActions.js","webpack://evite/./assets/js/ViewInvitation/reducers/apiFetcher.js","webpack://evite/./assets/js/ViewInvitation/reducers/avatars.js","webpack://evite/./assets/js/ViewInvitation/reducers/constants.js","webpack://evite/./assets/js/ViewInvitation/reducers/global.js","webpack://evite/./assets/js/ViewInvitation/reducers/newMessages.js","webpack://evite/./assets/js/ViewInvitation/reducers/posts.js","webpack://evite/./assets/js/ViewInvitation/utils/analytics.js","webpack://evite/./assets/js/ViewInvitation/utils/index.js","webpack://evite/./assets/js/ViewInvitation/utils/validateEmail.js","webpack://evite/./assets/js/common/_pb_components/atoms/Button.js","webpack://evite/./assets/js/common/_pb_components/atoms/Divider.js","webpack://evite/./assets/js/common/_pb_components/atoms/Input.js","webpack://evite/./assets/js/common/_pb_components/atoms/Link.js","webpack://evite/./assets/js/common/_pb_components/atoms/Overlay.js","webpack://evite/./assets/js/common/_pb_components/atoms/PanelHeaderRow.js","webpack://evite/./assets/js/common/_pb_components/atoms/Toast.js","webpack://evite/./assets/js/common/_pb_components/atoms/Typography.js","webpack://evite/./assets/js/common/_pb_components/molecules/LoadingOverlay.js","webpack://evite/./assets/js/common/_pb_components/molecules/SlideoutPanel.js","webpack://evite/./assets/js/common/_pb_components/organisms/InjectableFooter.js","webpack://evite/./assets/js/common/_pb_components/organisms/InjectableMegaNav.js","webpack://evite/./assets/js/common/_pb_components/organisms/Modal.js","webpack://evite/./assets/js/common/_pb_components/organisms/ResetPasswordModal.js","webpack://evite/./assets/js/common/_pb_components/organisms/ResponsiveModal.js","webpack://evite/./assets/js/common/_pb_components/organisms/ResponsivePanel.js","webpack://evite/./assets/js/common/_pb_components/organisms/SimpleNav.js","webpack://evite/./assets/js/common/auth/utils.js","webpack://evite/./assets/js/common/canvas/Canvas.js","webpack://evite/./assets/js/common/canvas/CanvasStickers.js","webpack://evite/./assets/js/common/canvas/Card/Card.js","webpack://evite/./assets/js/common/canvas/animation/gif/Gif.js","webpack://evite/./assets/js/common/canvas/animation/gif/GifToSprite.js","webpack://evite/./assets/js/common/canvas/controls/align_lines.js","webpack://evite/./assets/js/common/canvas/controls/clone.js","webpack://evite/./assets/js/common/canvas/controls/remove.js","webpack://evite/./assets/js/common/canvas/controls/rotation.js","webpack://evite/./assets/js/common/canvas/customs/fonts.js","webpack://evite/./assets/js/common/canvas/customs/gif.js","webpack://evite/./assets/js/common/canvas/customs/index.js","webpack://evite/./assets/js/common/canvas/customs/letter_casing.js","webpack://evite/./assets/js/common/canvas/customs/uyo_image.js","webpack://evite/./assets/js/common/canvas/fabric.js","webpack://evite/./assets/js/common/canvas/hooks/useCanvas.js","webpack://evite/./assets/js/common/canvas/hooks/useCanvasImage.js","webpack://evite/./assets/js/common/canvas/renderIcon.js","webpack://evite/./assets/js/common/components/Loader/Spinner.js","webpack://evite/./assets/js/common/components/LoginModal/reducer/actions.js","webpack://evite/./assets/js/common/components/LoginModal/reducer/constants.js","webpack://evite/./assets/js/common/components/LoginModal/reducer/index.js","webpack://evite/./assets/js/common/components/LoginModal/reducer/reducer.js","webpack://evite/./assets/js/common/constants/event-origins.js","webpack://evite/./assets/js/common/fabric/EventGuests/EventGuestsAsync.js","webpack://evite/./assets/js/common/fabric/EventGuests/api/guests.js","webpack://evite/./assets/js/common/fabric/EventGuests/components/DisplayCondition/addGuestsCondition.js","webpack://evite/./assets/js/common/fabric/EventGuests/reducers/guests/constants.js","webpack://evite/./assets/js/common/fabric/EventGuests/reducers/guests/index.js","webpack://evite/./assets/js/common/fabric/EventGuests/reducers/guests/reducer.js","webpack://evite/./assets/js/common/fabric/User/reducers/user/index.js","webpack://evite/./assets/js/common/fabric/User/reducers/user/reducer.js","webpack://evite/./assets/js/common/fabric/User/reducers/user/selectors.js","webpack://evite/./assets/js/common/fabric/constants.js","webpack://evite/./assets/js/common/hooks/useMatchQuery.js","webpack://evite/./assets/js/common/hooks/usePrevious.js","webpack://evite/./assets/js/common/public-path.js","webpack://evite/./assets/js/common/storage/gcs_storage.js","webpack://evite/./assets/js/common/svg/CardDesign.js","webpack://evite/./assets/js/common/svg/DiagonalLines.js","webpack://evite/./assets/js/common/svg/Diamond.js","webpack://evite/./assets/js/common/svg/DiamondFill.js","webpack://evite/./assets/js/common/svg/EviteLogo.js","webpack://evite/./assets/js/common/svg/Mail.js","webpack://evite/./assets/js/common/svg/PB_AlertLine.js","webpack://evite/./assets/js/common/svg/PB_Arrow.js","webpack://evite/./assets/js/common/svg/PB_Checkmark.js","webpack://evite/./assets/js/common/svg/PB_Chevron.js","webpack://evite/./assets/js/common/svg/PB_CloseLine.js","webpack://evite/./assets/js/common/svg/PB_EyeDrop.js","webpack://evite/./assets/js/common/svg/PB_Font.js","webpack://evite/./assets/js/common/svg/PB_FontSize.js","webpack://evite/./assets/js/common/svg/PB_Info.js","webpack://evite/./assets/js/common/svg/PB_Keyboard.js","webpack://evite/./assets/js/common/svg/PB_LeftAlign.js","webpack://evite/./assets/js/common/svg/PB_LineHeight.js","webpack://evite/./assets/js/common/svg/PB_MiddleAlign.js","webpack://evite/./assets/js/common/svg/PB_Minus.js","webpack://evite/./assets/js/common/svg/PB_Plus.js","webpack://evite/./assets/js/common/svg/PB_QuestionCircleUnfilled.js","webpack://evite/./assets/js/common/svg/PB_RightAlign.js","webpack://evite/./assets/js/common/svg/PB_Rotation.js","webpack://evite/./assets/js/common/svg/PB_SocialFb.js","webpack://evite/./assets/js/common/svg/PB_SocialIg.js","webpack://evite/./assets/js/common/svg/PB_SocialPin.js","webpack://evite/./assets/js/common/svg/PB_SocialTwi.js","webpack://evite/./assets/js/common/svg/PB_SocialYt.js","webpack://evite/./assets/js/common/svg/PB_TextColor.js","webpack://evite/./assets/js/common/svg/PB_TextFormat.js","webpack://evite/./assets/js/common/svg/PB_UploadSquare.js","webpack://evite/./assets/js/common/svg/PostStamp.js","webpack://evite/./assets/js/common/utils.js","webpack://evite/./assets/js/common/utils/event_utils.js","webpack://evite/./assets/js/create/history.js","webpack://evite/./assets/js/create/utils/formatters.js","webpack://evite/./assets/js/footer/BlockThisHost.js","webpack://evite/./assets/js/footer/Footer.js","webpack://evite/./assets/js/footer/LegalCopy.js","webpack://evite/./assets/js/footer/MobileApps.js","webpack://evite/./assets/js/footer/NewsletterSignup.js","webpack://evite/./assets/js/footer/SocialButtons.js","webpack://evite/./assets/js/modal/_ajax_error_handler.js","webpack://evite/./assets/js/modal/ajax_error_modal.js","webpack://evite/./assets/js/modal/auth_modal.js","webpack://evite/./assets/js/modal/base.js","webpack://evite/./assets/js/modal/captcha_modal.js","webpack://evite/./assets/js/modal/dialog_modal.js","webpack://evite/./assets/js/modal/evite_modal.js","webpack://evite/./assets/js/modal/index.js","webpack://evite/./assets/js/modal/loading_modal.js","webpack://evite/./assets/js/modal/popup_modal.js","webpack://evite/./assets/js/modal/send_message_modal.js","webpack://evite/./assets/js/modal/warning_modal.js","webpack://evite/./node_modules/classnames/index.js","webpack://evite/./node_modules/clsx/dist/clsx.m.js","webpack://evite/./node_modules/dom-align/dist-web/index.js","webpack://evite/./node_modules/exenv/index.js","webpack://evite/./node_modules/fabric/dist/fabric.js","webpack://evite/./node_modules/gifuct-js/lib/deinterlace.js","webpack://evite/./node_modules/gifuct-js/lib/index.js","webpack://evite/./node_modules/gifuct-js/lib/lzw.js","webpack://evite/./node_modules/history/esm/history.js","webpack://evite/./node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","webpack://evite/./node_modules/is-what/dist/index.esm.js","webpack://evite/./node_modules/js-binary-schema-parser/lib/index.js","webpack://evite/./node_modules/js-binary-schema-parser/lib/parsers/uint8.js","webpack://evite/./node_modules/js-binary-schema-parser/lib/schemas/gif.js","webpack://evite/./node_modules/lodash/lodash.js","webpack://evite/./node_modules/memoize-one/dist/memoize-one.esm.js","webpack://evite/./node_modules/merge-anything/dist/index.esm.js","webpack://evite/./assets/sass/pb_styleguide/base/_exports.sass","webpack://evite/./assets/sass/reinvention_styleguide/base/_exports.sass","webpack://evite/./node_modules/prop-types/factoryWithThrowingShims.js","webpack://evite/./node_modules/prop-types/index.js","webpack://evite/./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack://evite/./node_modules/rc-tooltip/es/placements.js","webpack://evite/./node_modules/rc-tooltip/es/Popup.js","webpack://evite/./node_modules/rc-tooltip/es/Tooltip.js","webpack://evite/./node_modules/rc-tooltip/es/index.js","webpack://evite/./node_modules/rc-motion/es/util/motion.js","webpack://evite/./node_modules/rc-motion/es/interface.js","webpack://evite/./node_modules/rc-motion/es/hooks/useIsomorphicLayoutEffect.js","webpack://evite/./node_modules/rc-motion/es/hooks/useStepQueue.js","webpack://evite/./node_modules/rc-motion/es/DomWrapper.js","webpack://evite/./node_modules/rc-motion/es/CSSMotion.js","webpack://evite/./node_modules/rc-motion/es/hooks/useStatus.js","webpack://evite/./node_modules/rc-motion/es/hooks/useDomMotionEvents.js","webpack://evite/./node_modules/rc-motion/es/hooks/useNextFrame.js","webpack://evite/./node_modules/rc-motion/es/util/diff.js","webpack://evite/./node_modules/rc-motion/es/CSSMotionList.js","webpack://evite/./node_modules/rc-motion/es/index.js","webpack://evite/./node_modules/rc-trigger/es/Popup/Mask.js","webpack://evite/./node_modules/rc-align/es/util.js","webpack://evite/./node_modules/rc-align/es/Align.js","webpack://evite/./node_modules/rc-align/es/hooks/useBuffer.js","webpack://evite/./node_modules/rc-align/es/index.js","webpack://evite/./node_modules/rc-trigger/es/Popup/useVisibleStatus.js","webpack://evite/./node_modules/rc-trigger/es/Popup/PopupInner.js","webpack://evite/./node_modules/rc-trigger/es/Popup/useStretchStyle.js","webpack://evite/./node_modules/rc-trigger/es/Popup/MobilePopupInner.js","webpack://evite/./node_modules/rc-trigger/es/Popup/index.js","webpack://evite/./node_modules/rc-trigger/es/context.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://evite/./node_modules/rc-util/es/Portal.js","webpack://evite/./node_modules/rc-trigger/es/utils/alignUtil.js","webpack://evite/./node_modules/rc-trigger/es/index.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/createSuper.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://evite/./node_modules/rc-trigger/es/utils/legacyUtil.js","webpack://evite/./node_modules/rc-util/es/Dom/addEventListener.js","webpack://evite/./node_modules/rc-util/es/Dom/canUseDom.js","webpack://evite/./node_modules/rc-util/es/Dom/contains.js","webpack://evite/./node_modules/rc-util/es/Dom/findDOMNode.js","webpack://evite/./node_modules/rc-util/es/Dom/isVisible.js","webpack://evite/./node_modules/rc-util/es/hooks/useLayoutEffect.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://evite/./node_modules/rc-util/es/hooks/useState.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://evite/./node_modules/rc-util/es/warning.js","webpack://evite/./node_modules/rc-util/es/isEqual.js","webpack://evite/./node_modules/rc-util/es/isMobile.js","webpack://evite/./node_modules/rc-util/es/raf.js","webpack://evite/./node_modules/rc-util/es/ref.js","webpack://evite/./node_modules/react-colorful/dist/index.js","webpack://evite/./node_modules/react-is/cjs/react-is.production.min.js","webpack://evite/./node_modules/react-is/index.js","webpack://evite/./node_modules/react-lifecycles-compat/react-lifecycles-compat.es.js","webpack://evite/./node_modules/react-modal-hook/dist/index.es.js","webpack://evite/./node_modules/react-modal/lib/components/Modal.js","webpack://evite/./node_modules/react-modal/lib/components/ModalPortal.js","webpack://evite/./node_modules/react-modal/lib/helpers/ariaAppHider.js","webpack://evite/./node_modules/react-modal/lib/helpers/bodyTrap.js","webpack://evite/./node_modules/react-modal/lib/helpers/classList.js","webpack://evite/./node_modules/react-modal/lib/helpers/focusManager.js","webpack://evite/./node_modules/react-modal/lib/helpers/portalOpenInstances.js","webpack://evite/./node_modules/react-modal/lib/helpers/safeHTMLElement.js","webpack://evite/./node_modules/react-modal/lib/helpers/scopeTab.js","webpack://evite/./node_modules/react-modal/lib/helpers/tabbable.js","webpack://evite/./node_modules/react-modal/lib/index.js","webpack://evite/./node_modules/react-modal/node_modules/warning/warning.js","webpack://evite/./node_modules/react-redux/es/components/Context.js","webpack://evite/./node_modules/react-redux/es/utils/batch.js","webpack://evite/./node_modules/react-redux/es/utils/Subscription.js","webpack://evite/./node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js","webpack://evite/./node_modules/react-redux/es/components/Provider.js","webpack://evite/./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://evite/./node_modules/react-redux/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://evite/./node_modules/react-redux/es/components/connectAdvanced.js","webpack://evite/./node_modules/react-redux/es/utils/shallowEqual.js","webpack://evite/./node_modules/react-redux/es/connect/wrapMapToProps.js","webpack://evite/./node_modules/react-redux/es/connect/mapDispatchToProps.js","webpack://evite/./node_modules/react-redux/es/utils/bindActionCreators.js","webpack://evite/./node_modules/react-redux/es/connect/mapStateToProps.js","webpack://evite/./node_modules/react-redux/es/connect/mergeProps.js","webpack://evite/./node_modules/react-redux/es/connect/selectorFactory.js","webpack://evite/./node_modules/react-redux/es/connect/connect.js","webpack://evite/./node_modules/react-redux/es/hooks/useReduxContext.js","webpack://evite/./node_modules/react-redux/es/hooks/useStore.js","webpack://evite/./node_modules/react-redux/es/hooks/useDispatch.js","webpack://evite/./node_modules/react-redux/es/hooks/useSelector.js","webpack://evite/./node_modules/react-redux/es/index.js","webpack://evite/./node_modules/react-redux/node_modules/react-is/cjs/react-is.production.min.js","webpack://evite/./node_modules/react-redux/node_modules/react-is/index.js","webpack://evite/./node_modules/react-router-dom/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://evite/./node_modules/react-router-dom/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://evite/./node_modules/react-router-dom/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://evite/./node_modules/react-router-dom/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://evite/./node_modules/react-router-dom/esm/react-router-dom.js","webpack://evite/./node_modules/react-select/dist/useCreatable-8a6670a3.esm.js","webpack://evite/./node_modules/react-select/creatable/dist/react-select.esm.js","webpack://evite/./node_modules/react-select/dist/Select-54ac8379.esm.js","webpack://evite/./node_modules/react-select/dist/index-a7690a33.esm.js","webpack://evite/./node_modules/react-select/dist/react-select.esm.js","webpack://evite/./node_modules/react-select/dist/useStateManager-68425271.esm.js","webpack://evite/./node_modules/react-swipeable/es/index.js","webpack://evite/./node_modules/react-tiny-popover/dist/ArrowContainer.js","webpack://evite/./node_modules/react-tiny-popover/dist/Popover.js","webpack://evite/./node_modules/react-tiny-popover/dist/PopoverPortal.js","webpack://evite/./node_modules/react-tiny-popover/dist/useArrowContainer.js","webpack://evite/./node_modules/react-tiny-popover/dist/useElementRef.js","webpack://evite/./node_modules/react-tiny-popover/dist/useMemoizedArray.js","webpack://evite/./node_modules/react-tiny-popover/dist/usePopover.js","webpack://evite/./node_modules/react-tiny-popover/dist/util.js","webpack://evite/./node_modules/react-toastify/dist/react-toastify.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack://evite/./node_modules/dom-helpers/esm/removeClass.js","webpack://evite/./node_modules/react-transition-group/esm/config.js","webpack://evite/./node_modules/react-transition-group/esm/TransitionGroupContext.js","webpack://evite/./node_modules/react-transition-group/esm/utils/reflow.js","webpack://evite/./node_modules/react-transition-group/esm/Transition.js","webpack://evite/./node_modules/react-transition-group/esm/CSSTransition.js","webpack://evite/./node_modules/dom-helpers/esm/addClass.js","webpack://evite/./node_modules/dom-helpers/esm/hasClass.js","webpack://evite/./node_modules/react-transition-group/esm/utils/ChildMapping.js","webpack://evite/./node_modules/react-transition-group/esm/TransitionGroup.js","webpack://evite/./node_modules/react-transition-group/esm/ReplaceTransition.js","webpack://evite/./node_modules/react-transition-group/esm/SwitchTransition.js","webpack://evite/./node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack://evite/./node_modules/react/jsx-runtime.js","webpack://evite/./node_modules/redux-thunk/es/index.js","webpack://evite/./node_modules/redux/es/redux.js","webpack://evite/./node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js","webpack://evite/./node_modules/resolve-pathname/esm/resolve-pathname.js","webpack://evite/./node_modules/styled-components/dist/styled-components.browser.esm.js","webpack://evite/./node_modules/stylis-rule-sheet/index.js","webpack://evite/./node_modules/stylis/stylis.min.js","webpack://evite/./node_modules/tiny-invariant/dist/tiny-invariant.esm.js","webpack://evite/./node_modules/uuid/dist/esm-browser/rng.js","webpack://evite/./node_modules/uuid/dist/esm-browser/regex.js","webpack://evite/./node_modules/uuid/dist/esm-browser/validate.js","webpack://evite/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://evite/./node_modules/uuid/dist/esm-browser/v1.js","webpack://evite/./node_modules/uuid/dist/esm-browser/parse.js","webpack://evite/./node_modules/uuid/dist/esm-browser/v35.js","webpack://evite/./node_modules/uuid/dist/esm-browser/md5.js","webpack://evite/./node_modules/uuid/dist/esm-browser/v3.js","webpack://evite/./node_modules/uuid/dist/esm-browser/v4.js","webpack://evite/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://evite/./node_modules/uuid/dist/esm-browser/v5.js","webpack://evite/./node_modules/uuid/dist/esm-browser/nil.js","webpack://evite/./node_modules/uuid/dist/esm-browser/version.js","webpack://evite/./node_modules/value-equal/esm/value-equal.js","webpack://evite/external var \"XDate\"","webpack://evite/external var \"evite.exports.React\"","webpack://evite/external var \"evite.exports.ReactDom\"","webpack://evite/external var \"evite.exports.ReactRouter\"","webpack://evite/external var \"evite.exports.mobx\"","webpack://evite/external var \"window.evite\"","webpack://evite/external var \"window.evite.exports\"","webpack://evite/external var \"window.evite.exports.Store2\"","webpack://evite/external var \"window.evite.urls\"","webpack://evite/./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/createSuper.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/extends.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://evite/./node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/objectSpread2.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://evite/./node_modules/rc-trigger/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://evite/./node_modules/rc-util/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/extends.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/inherits.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://evite/./node_modules/react-select/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack://evite/webpack/bootstrap","webpack://evite/webpack/runtime/load script","webpack://evite/webpack/runtime/amd options","webpack://evite/webpack/runtime/compat get default export","webpack://evite/webpack/runtime/define property getters","webpack://evite/webpack/runtime/ensure chunk","webpack://evite/webpack/runtime/get javascript chunk filename","webpack://evite/webpack/runtime/get mini-css chunk filename","webpack://evite/webpack/runtime/global","webpack://evite/webpack/runtime/hasOwnProperty shorthand","webpack://evite/webpack/runtime/make namespace object","webpack://evite/webpack/runtime/node module decorator","webpack://evite/webpack/runtime/publicPath","webpack://evite/webpack/runtime/css loading","webpack://evite/webpack/runtime/jsonp chunk loading","webpack://evite/webpack/runtime/nonce","webpack://evite/./assets/js/CreateFabricInvitation/app.js"],"sourcesContent":["/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3)\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nexport function indexof (value, search) {\n\treturn value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\n","import {IMPORT, COMMENT, RULESET, DECLARATION, KEYFRAMES} from './Enum.js'\nimport {strlen, sizeof} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\tvar length = sizeof(children)\n\n\tfor (var i = 0; i < length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: element.value = element.props.join(',')\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {MS, MOZ, WEBKIT} from './Enum.js'\nimport {hash, charat, strlen, indexof, replace} from './Utility.js'\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {string}\n */\nexport function prefix (value, length) {\n\tswitch (hash(value, length)) {\n\t\t// color-adjust\n\t\tcase 5103:\n\t\t\treturn WEBKIT + 'print-' + value + value\n\t\t// animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\t\tcase 5737: case 4201: case 3177: case 3433: case 1641: case 4457: case 2921:\n\t\t// text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\t\tcase 5572: case 6356: case 5844: case 3191: case 6645: case 3005:\n\t\t// mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\t\tcase 6391: case 5879: case 5623: case 6135: case 4599: case 4855:\n\t\t// background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\t\tcase 4215: case 6389: case 5109: case 5365: case 5621: case 3829:\n\t\t\treturn WEBKIT + value + value\n\t\t// appearance, user-select, transform, hyphens, text-size-adjust\n\t\tcase 5349: case 4246: case 4810: case 6968: case 2756:\n\t\t\treturn WEBKIT + value + MOZ + value + MS + value + value\n\t\t// flex, flex-direction\n\t\tcase 6828: case 4268:\n\t\t\treturn WEBKIT + value + MS + value + value\n\t\t// order\n\t\tcase 6165:\n\t\t\treturn WEBKIT + value + MS + 'flex-' + value + value\n\t\t// align-items\n\t\tcase 5187:\n\t\t\treturn WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + 'box-$1$2' + MS + 'flex-$1$2') + value\n\t\t// align-self\n\t\tcase 5443:\n\t\t\treturn WEBKIT + value + MS + 'flex-item-' + replace(value, /flex-|-self/, '') + value\n\t\t// align-content\n\t\tcase 4675:\n\t\t\treturn WEBKIT + value + MS + 'flex-line-pack' + replace(value, /align-content|flex-|-self/, '') + value\n\t\t// flex-shrink\n\t\tcase 5548:\n\t\t\treturn WEBKIT + value + MS + replace(value, 'shrink', 'negative') + value\n\t\t// flex-basis\n\t\tcase 5292:\n\t\t\treturn WEBKIT + value + MS + replace(value, 'basis', 'preferred-size') + value\n\t\t// flex-grow\n\t\tcase 6060:\n\t\t\treturn WEBKIT + 'box-' + replace(value, '-grow', '') + WEBKIT + value + MS + replace(value, 'grow', 'positive') + value\n\t\t// transition\n\t\tcase 4554:\n\t\t\treturn WEBKIT + replace(value, /([^-])(transform)/g, '$1' + WEBKIT + '$2') + value\n\t\t// cursor\n\t\tcase 6187:\n\t\t\treturn replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + '$1'), /(image-set)/, WEBKIT + '$1'), value, '') + value\n\t\t// background, background-image\n\t\tcase 5495: case 3959:\n\t\t\treturn replace(value, /(image-set\\([^]*)/, WEBKIT + '$1' + '$`$1')\n\t\t// justify-content\n\t\tcase 4968:\n\t\t\treturn replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + 'box-pack:$3' + MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + WEBKIT + value + value\n\t\t// (margin|padding)-inline-(start|end)\n\t\tcase 4095: case 3583: case 4068: case 2532:\n\t\t\treturn replace(value, /(.+)-inline(.+)/, WEBKIT + '$1$2') + value\n\t\t// (min|max)?(width|height|inline-size|block-size)\n\t\tcase 8116: case 7059: case 5753: case 5535:\n\t\tcase 5445: case 5701: case 4933: case 4677:\n\t\tcase 5533: case 5789: case 5021: case 4765:\n\t\t\t// stretch, max-content, min-content, fill-available\n\t\t\tif (strlen(value) - 1 - length > 6)\n\t\t\t\tswitch (charat(value, length + 1)) {\n\t\t\t\t\t// (m)ax-content, (m)in-content\n\t\t\t\t\tcase 109:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (charat(value, length + 4) !== 45)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t// (f)ill-available, (f)it-content\n\t\t\t\t\tcase 102:\n\t\t\t\t\t\treturn replace(value, /(.+:)(.+)-([^]+)/, '$1' + WEBKIT + '$2-$3' + '$1' + MOZ + (charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value\n\t\t\t\t\t// (s)tretch\n\t\t\t\t\tcase 115:\n\t\t\t\t\t\treturn ~indexof(value, 'stretch') ? prefix(replace(value, 'stretch', 'fill-available'), length) + value : value\n\t\t\t\t}\n\t\t\tbreak\n\t\t// position: sticky\n\t\tcase 4949:\n\t\t\t// (s)ticky?\n\t\t\tif (charat(value, length + 1) !== 115)\n\t\t\t\tbreak\n\t\t// display: (flex|inline-flex)\n\t\tcase 6444:\n\t\t\tswitch (charat(value, strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n\t\t\t\t// stic(k)y\n\t\t\t\tcase 107:\n\t\t\t\t\treturn replace(value, ':', ':' + WEBKIT) + value\n\t\t\t\t// (inline-)?fl(e)x\n\t\t\t\tcase 101:\n\t\t\t\t\treturn replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + WEBKIT + (charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + WEBKIT + '$2$3' + '$1' + MS + '$2box$3') + value\n\t\t\t}\n\t\t\tbreak\n\t\t// writing-mode\n\t\tcase 5936:\n\t\t\tswitch (charat(value, length + 11)) {\n\t\t\t\t// vertical-l(r)\n\t\t\t\tcase 114:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value\n\t\t\t\t// vertical-r(l)\n\t\t\t\tcase 108:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value\n\t\t\t\t// horizontal(-)tb\n\t\t\t\tcase 45:\n\t\t\t\t\treturn WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value\n\t\t\t}\n\n\t\t\treturn WEBKIT + value + MS + value + value\n\t}\n\n\treturn value\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && characters.charCodeAt(length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset:\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule) {\n\t\t\t\t\t\t\t\t\t// d m s\n\t\t\t\t\t\t\t\t\tcase 100: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nexport function comment (value, root, parent) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nexport function declaration (value, root, parent, length) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length)\n}\n","import { StyleSheet } from '@emotion/sheet';\nimport { dealloc, alloc, next, token, from, peek, delimit, slice, position, stringify, COMMENT, rulesheet, middleware, prefixer, serialize, compile } from 'stylis';\nimport '@emotion/weak-memoize';\nimport '@emotion/memoize';\n\nvar last = function last(arr) {\n  return arr.length ? arr[arr.length - 1] : null;\n}; // based on https://github.com/thysultan/stylis.js/blob/e6843c373ebcbbfade25ebcc23f540ed8508da0a/src/Tokenizer.js#L239-L244\n\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n  var previous = 0;\n  var character = 0;\n\n  while (true) {\n    previous = character;\n    character = peek(); // &\\f\n\n    if (previous === 38 && character === 12) {\n      points[index] = 1;\n    }\n\n    if (token(character)) {\n      break;\n    }\n\n    next();\n  }\n\n  return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n  // pretend we've started with a comma\n  var index = -1;\n  var character = 44;\n\n  do {\n    switch (token(character)) {\n      case 0:\n        // &\\f\n        if (character === 38 && peek() === 12) {\n          // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n          // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n          // and when it should just concatenate the outer and inner selectors\n          // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n          points[index] = 1;\n        }\n\n        parsed[index] += identifierWithPointTracking(position - 1, points, index);\n        break;\n\n      case 2:\n        parsed[index] += delimit(character);\n        break;\n\n      case 4:\n        // comma\n        if (character === 44) {\n          // colon\n          parsed[++index] = peek() === 58 ? '&\\f' : '';\n          points[index] = parsed[index].length;\n          break;\n        }\n\n      // fallthrough\n\n      default:\n        parsed[index] += from(character);\n    }\n  } while (character = next());\n\n  return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n  return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n  if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n  // negative .length indicates that this rule has been already prefixed\n  element.length < 1) {\n    return;\n  }\n\n  var value = element.value,\n      parent = element.parent;\n  var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n  while (parent.type !== 'rule') {\n    parent = parent.parent;\n    if (!parent) return;\n  } // short-circuit for the simplest case\n\n\n  if (element.props.length === 1 && value.charCodeAt(0) !== 58\n  /* colon */\n  && !fixedElements.get(parent)) {\n    return;\n  } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n  // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n  if (isImplicitRule) {\n    return;\n  }\n\n  fixedElements.set(element, true);\n  var points = [];\n  var rules = getRules(value, points);\n  var parentRules = parent.props;\n\n  for (var i = 0, k = 0; i < rules.length; i++) {\n    for (var j = 0; j < parentRules.length; j++, k++) {\n      element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n    }\n  }\n};\nvar removeLabel = function removeLabel(element) {\n  if (element.type === 'decl') {\n    var value = element.value;\n\n    if ( // charcode for l\n    value.charCodeAt(0) === 108 && // charcode for b\n    value.charCodeAt(2) === 98) {\n      // this ignores label\n      element[\"return\"] = '';\n      element.value = '';\n    }\n  }\n};\nvar ignoreFlag = 'emotion-disable-server-rendering-unsafe-selector-warning-please-do-not-use-this-the-warning-exists-for-a-reason';\n\nvar isIgnoringComment = function isIgnoringComment(element) {\n  return !!element && element.type === 'comm' && element.children.indexOf(ignoreFlag) > -1;\n};\n\nvar createUnsafeSelectorsAlarm = function createUnsafeSelectorsAlarm(cache) {\n  return function (element, index, children) {\n    if (element.type !== 'rule') return;\n    var unsafePseudoClasses = element.value.match(/(:first|:nth|:nth-last)-child/g);\n\n    if (unsafePseudoClasses && cache.compat !== true) {\n      var prevElement = index > 0 ? children[index - 1] : null;\n\n      if (prevElement && isIgnoringComment(last(prevElement.children))) {\n        return;\n      }\n\n      unsafePseudoClasses.forEach(function (unsafePseudoClass) {\n        console.error(\"The pseudo class \\\"\" + unsafePseudoClass + \"\\\" is potentially unsafe when doing server-side rendering. Try changing it to \\\"\" + unsafePseudoClass.split('-child')[0] + \"-of-type\\\".\");\n      });\n    }\n  };\n};\n\nvar isImportRule = function isImportRule(element) {\n  return element.type.charCodeAt(1) === 105 && element.type.charCodeAt(0) === 64;\n};\n\nvar isPrependedWithRegularRules = function isPrependedWithRegularRules(index, children) {\n  for (var i = index - 1; i >= 0; i--) {\n    if (!isImportRule(children[i])) {\n      return true;\n    }\n  }\n\n  return false;\n}; // use this to remove incorrect elements from further processing\n// so they don't get handed to the `sheet` (or anything else)\n// as that could potentially lead to additional logs which in turn could be overhelming to the user\n\n\nvar nullifyElement = function nullifyElement(element) {\n  element.type = '';\n  element.value = '';\n  element[\"return\"] = '';\n  element.children = '';\n  element.props = '';\n};\n\nvar incorrectImportAlarm = function incorrectImportAlarm(element, index, children) {\n  if (!isImportRule(element)) {\n    return;\n  }\n\n  if (element.parent) {\n    console.error(\"`@import` rules can't be nested inside other rules. Please move it to the top level and put it before regular rules. Keep in mind that they can only be used within global styles.\");\n    nullifyElement(element);\n  } else if (isPrependedWithRegularRules(index, children)) {\n    console.error(\"`@import` rules can't be after other rules. Please put your `@import` rules before your other rules.\");\n    nullifyElement(element);\n  }\n};\n\nvar defaultStylisPlugins = [prefixer];\n\nvar createCache = function createCache(options) {\n  var key = options.key;\n\n  if (process.env.NODE_ENV !== 'production' && !key) {\n    throw new Error(\"You have to configure `key` for your cache. Please make sure it's unique (and not equal to 'css') as it's used for linking styles to your cache.\\n\" + \"If multiple caches share the same key they might \\\"fight\\\" for each other's style elements.\");\n  }\n\n  if ( key === 'css') {\n    var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n    // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n    // note this very very intentionally targets all style elements regardless of the key to ensure\n    // that creating a cache works inside of render of a React component\n\n    Array.prototype.forEach.call(ssrStyles, function (node) {\n      // we want to only move elements which have a space in the data-emotion attribute value\n      // because that indicates that it is an Emotion 11 server-side rendered style elements\n      // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n      // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n      // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n      // will not result in the Emotion 10 styles being destroyed\n      var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n      if (dataEmotionAttribute.indexOf(' ') === -1) {\n        return;\n      }\n      document.head.appendChild(node);\n      node.setAttribute('data-s', '');\n    });\n  }\n\n  var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n  if (process.env.NODE_ENV !== 'production') {\n    // $FlowFixMe\n    if (/[^a-z-]/.test(key)) {\n      throw new Error(\"Emotion key must only contain lower case alphabetical characters and - but \\\"\" + key + \"\\\" was passed\");\n    }\n  }\n\n  var inserted = {};\n  var container;\n  var nodesToHydrate = [];\n\n  {\n    container = options.container || document.head;\n    Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n    // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n    document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n      var attrib = node.getAttribute(\"data-emotion\").split(' '); // $FlowFixMe\n\n      for (var i = 1; i < attrib.length; i++) {\n        inserted[attrib[i]] = true;\n      }\n\n      nodesToHydrate.push(node);\n    });\n  }\n\n  var _insert;\n\n  var omnipresentPlugins = [compat, removeLabel];\n\n  if (process.env.NODE_ENV !== 'production') {\n    omnipresentPlugins.push(createUnsafeSelectorsAlarm({\n      get compat() {\n        return cache.compat;\n      }\n\n    }), incorrectImportAlarm);\n  }\n\n  {\n    var currentSheet;\n    var finalizingPlugins = [stringify, process.env.NODE_ENV !== 'production' ? function (element) {\n      if (!element.root) {\n        if (element[\"return\"]) {\n          currentSheet.insert(element[\"return\"]);\n        } else if (element.value && element.type !== COMMENT) {\n          // insert empty rule in non-production environments\n          // so @emotion/jest can grab `key` from the (JS)DOM for caches without any rules inserted yet\n          currentSheet.insert(element.value + \"{}\");\n        }\n      }\n    } : rulesheet(function (rule) {\n      currentSheet.insert(rule);\n    })];\n    var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n    var stylis = function stylis(styles) {\n      return serialize(compile(styles), serializer);\n    };\n\n    _insert = function insert(selector, serialized, sheet, shouldCache) {\n      currentSheet = sheet;\n\n      if (process.env.NODE_ENV !== 'production' && serialized.map !== undefined) {\n        currentSheet = {\n          insert: function insert(rule) {\n            sheet.insert(rule + serialized.map);\n          }\n        };\n      }\n\n      stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n      if (shouldCache) {\n        cache.inserted[serialized.name] = true;\n      }\n    };\n  }\n\n  var cache = {\n    key: key,\n    sheet: new StyleSheet({\n      key: key,\n      container: container,\n      nonce: options.nonce,\n      speedy: options.speedy,\n      prepend: options.prepend,\n      insertionPoint: options.insertionPoint\n    }),\n    nonce: options.nonce,\n    inserted: inserted,\n    registered: {},\n    insert: _insert\n  };\n  cache.sheet.hydrate(nodesToHydrate);\n  return cache;\n};\n\nexport default createCache;\n","import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js'\nimport {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js'\nimport {copy, tokenize} from './Tokenizer.js'\nimport {serialize} from './Serializer.js'\nimport {prefix} from './Prefixer.js'\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nexport function middleware (collection) {\n\tvar length = sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = ''\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || ''\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nexport function rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nexport function prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length)\n\t\t\t\t\tbreak\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n\t\t\t\tcase RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn combine(element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase ':read-only': case ':read-write':\n\t\t\t\t\t\t\t\t\treturn serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase '::placeholder':\n\t\t\t\t\t\t\t\t\treturn serialize([\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n\t\t\t\t\t\t\t\t\t], callback)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn ''\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nexport function namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === 'global')\n\t\t\t\t\t\t\t\tchildren[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? '' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? '' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n","import memoize from '@emotion/memoize';\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar index = memoize(function (prop) {\n  return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n  /* o */\n  && prop.charCodeAt(1) === 110\n  /* n */\n  && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\nexport default index;\n","function memoize(fn) {\n  var cache = {};\n  return function (arg) {\n    if (cache[arg] === undefined) cache[arg] = fn(arg);\n    return cache[arg];\n  };\n}\n\nexport default memoize;\n","import * as React from 'react';\nimport { createContext, useContext, forwardRef, createElement, Fragment } from 'react';\nimport createCache from '@emotion/cache';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport weakMemoize from '@emotion/weak-memoize';\nimport hoistNonReactStatics from '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport { getRegisteredStyles, registerStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nvar EmotionCacheContext = /* #__PURE__ */createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? /* #__PURE__ */createCache({\n  key: 'css'\n}) : null);\n\nif (process.env.NODE_ENV !== 'production') {\n  EmotionCacheContext.displayName = 'EmotionCacheContext';\n}\n\nvar CacheProvider = EmotionCacheContext.Provider;\nvar __unsafe_useEmotionCache = function useEmotionCache() {\n  return useContext(EmotionCacheContext);\n};\n\nvar withEmotionCache = function withEmotionCache(func) {\n  // $FlowFixMe\n  return /*#__PURE__*/forwardRef(function (props, ref) {\n    // the cache will never be null in the browser\n    var cache = useContext(EmotionCacheContext);\n    return func(props, cache, ref);\n  });\n};\n\nvar ThemeContext = /* #__PURE__ */createContext({});\n\nif (process.env.NODE_ENV !== 'production') {\n  ThemeContext.displayName = 'EmotionThemeContext';\n}\n\nvar useTheme = function useTheme() {\n  return useContext(ThemeContext);\n};\n\nvar getTheme = function getTheme(outerTheme, theme) {\n  if (typeof theme === 'function') {\n    var mergedTheme = theme(outerTheme);\n\n    if (process.env.NODE_ENV !== 'production' && (mergedTheme == null || typeof mergedTheme !== 'object' || Array.isArray(mergedTheme))) {\n      throw new Error('[ThemeProvider] Please return an object from your theme function, i.e. theme={() => ({})}!');\n    }\n\n    return mergedTheme;\n  }\n\n  if (process.env.NODE_ENV !== 'production' && (theme == null || typeof theme !== 'object' || Array.isArray(theme))) {\n    throw new Error('[ThemeProvider] Please make your theme prop a plain object');\n  }\n\n  return _extends({}, outerTheme, theme);\n};\n\nvar createCacheWithTheme = /* #__PURE__ */weakMemoize(function (outerTheme) {\n  return weakMemoize(function (theme) {\n    return getTheme(outerTheme, theme);\n  });\n});\nvar ThemeProvider = function ThemeProvider(props) {\n  var theme = useContext(ThemeContext);\n\n  if (props.theme !== theme) {\n    theme = createCacheWithTheme(theme)(props.theme);\n  }\n\n  return /*#__PURE__*/createElement(ThemeContext.Provider, {\n    value: theme\n  }, props.children);\n};\nfunction withTheme(Component) {\n  var componentName = Component.displayName || Component.name || 'Component';\n\n  var render = function render(props, ref) {\n    var theme = useContext(ThemeContext);\n    return /*#__PURE__*/createElement(Component, _extends({\n      theme: theme,\n      ref: ref\n    }, props));\n  }; // $FlowFixMe\n\n\n  var WithTheme = /*#__PURE__*/forwardRef(render);\n  WithTheme.displayName = \"WithTheme(\" + componentName + \")\";\n  return hoistNonReactStatics(WithTheme, Component);\n}\n\nvar getLastPart = function getLastPart(functionName) {\n  // The match may be something like 'Object.createEmotionProps' or\n  // 'Loader.prototype.render'\n  var parts = functionName.split('.');\n  return parts[parts.length - 1];\n};\n\nvar getFunctionNameFromStackTraceLine = function getFunctionNameFromStackTraceLine(line) {\n  // V8\n  var match = /^\\s+at\\s+([A-Za-z0-9$.]+)\\s/.exec(line);\n  if (match) return getLastPart(match[1]); // Safari / Firefox\n\n  match = /^([A-Za-z0-9$.]+)@/.exec(line);\n  if (match) return getLastPart(match[1]);\n  return undefined;\n};\n\nvar internalReactFunctionNames = /* #__PURE__ */new Set(['renderWithHooks', 'processChild', 'finishClassComponent', 'renderToString']); // These identifiers come from error stacks, so they have to be valid JS\n// identifiers, thus we only need to replace what is a valid character for JS,\n// but not for CSS.\n\nvar sanitizeIdentifier = function sanitizeIdentifier(identifier) {\n  return identifier.replace(/\\$/g, '-');\n};\n\nvar getLabelFromStackTrace = function getLabelFromStackTrace(stackTrace) {\n  if (!stackTrace) return undefined;\n  var lines = stackTrace.split('\\n');\n\n  for (var i = 0; i < lines.length; i++) {\n    var functionName = getFunctionNameFromStackTraceLine(lines[i]); // The first line of V8 stack traces is just \"Error\"\n\n    if (!functionName) continue; // If we reach one of these, we have gone too far and should quit\n\n    if (internalReactFunctionNames.has(functionName)) break; // The component name is the first function in the stack that starts with an\n    // uppercase letter\n\n    if (/^[A-Z]/.test(functionName)) return sanitizeIdentifier(functionName);\n  }\n\n  return undefined;\n};\n\nvar useInsertionEffect = React['useInsertion' + 'Effect'] ? React['useInsertion' + 'Effect'] : function useInsertionEffect(create) {\n  create();\n};\nfunction useInsertionEffectMaybe(create) {\n\n  useInsertionEffect(create);\n}\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar labelPropName = '__EMOTION_LABEL_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n  if (process.env.NODE_ENV !== 'production' && typeof props.css === 'string' && // check if there is a css declaration\n  props.css.indexOf(':') !== -1) {\n    throw new Error(\"Strings are not allowed as css prop values, please wrap it in a css template literal from '@emotion/react' like this: css`\" + props.css + \"`\");\n  }\n\n  var newProps = {};\n\n  for (var key in props) {\n    if (hasOwnProperty.call(props, key)) {\n      newProps[key] = props[key];\n    }\n  }\n\n  newProps[typePropName] = type; // For performance, only call getLabelFromStackTrace in development and when\n  // the label hasn't already been computed\n\n  if (process.env.NODE_ENV !== 'production' && !!props.css && (typeof props.css !== 'object' || typeof props.css.name !== 'string' || props.css.name.indexOf('-') === -1)) {\n    var label = getLabelFromStackTrace(new Error().stack);\n    if (label) newProps[labelPropName] = label;\n  }\n\n  return newProps;\n};\n\nvar Insertion = function Insertion(_ref) {\n  var cache = _ref.cache,\n      serialized = _ref.serialized,\n      isStringTag = _ref.isStringTag;\n  registerStyles(cache, serialized, isStringTag);\n  var rules = useInsertionEffectMaybe(function () {\n    return insertStyles(cache, serialized, isStringTag);\n  });\n\n  return null;\n};\n\nvar Emotion = /* #__PURE__ */withEmotionCache(function (props, cache, ref) {\n  var cssProp = props.css; // so that using `css` from `emotion` and passing the result to the css prop works\n  // not passing the registered cache to serializeStyles because it would\n  // make certain babel optimisations not possible\n\n  if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n    cssProp = cache.registered[cssProp];\n  }\n\n  var WrappedComponent = props[typePropName];\n  var registeredStyles = [cssProp];\n  var className = '';\n\n  if (typeof props.className === 'string') {\n    className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n  } else if (props.className != null) {\n    className = props.className + \" \";\n  }\n\n  var serialized = serializeStyles(registeredStyles, undefined, useContext(ThemeContext));\n\n  if (process.env.NODE_ENV !== 'production' && serialized.name.indexOf('-') === -1) {\n    var labelFromStack = props[labelPropName];\n\n    if (labelFromStack) {\n      serialized = serializeStyles([serialized, 'label:' + labelFromStack + ';']);\n    }\n  }\n\n  className += cache.key + \"-\" + serialized.name;\n  var newProps = {};\n\n  for (var key in props) {\n    if (hasOwnProperty.call(props, key) && key !== 'css' && key !== typePropName && (process.env.NODE_ENV === 'production' || key !== labelPropName)) {\n      newProps[key] = props[key];\n    }\n  }\n\n  newProps.ref = ref;\n  newProps.className = className;\n  return /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement(Insertion, {\n    cache: cache,\n    serialized: serialized,\n    isStringTag: typeof WrappedComponent === 'string'\n  }), /*#__PURE__*/createElement(WrappedComponent, newProps));\n});\n\nif (process.env.NODE_ENV !== 'production') {\n  Emotion.displayName = 'EmotionCssPropInternal';\n}\n\nexport { CacheProvider as C, Emotion as E, ThemeContext as T, __unsafe_useEmotionCache as _, useTheme as a, ThemeProvider as b, createEmotionProps as c, withTheme as d, hasOwnProperty as h, useInsertionEffectMaybe as u, withEmotionCache as w };\n","import * as React from 'react';\nimport { createElement, useLayoutEffect, useContext, useRef, Fragment } from 'react';\nimport '@emotion/cache';\nimport { h as hasOwnProperty, E as Emotion, c as createEmotionProps, w as withEmotionCache, T as ThemeContext, u as useInsertionEffectMaybe } from './emotion-element-cbed451f.browser.esm.js';\nexport { C as CacheProvider, T as ThemeContext, b as ThemeProvider, _ as __unsafe_useEmotionCache, a as useTheme, w as withEmotionCache, d as withTheme } from './emotion-element-cbed451f.browser.esm.js';\nimport '@babel/runtime/helpers/extends';\nimport '@emotion/weak-memoize';\nimport 'hoist-non-react-statics';\nimport '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport { insertStyles, registerStyles, getRegisteredStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\n\nvar pkg = {\n\tname: \"@emotion/react\",\n\tversion: \"11.10.0\",\n\tmain: \"dist/emotion-react.cjs.js\",\n\tmodule: \"dist/emotion-react.esm.js\",\n\tbrowser: {\n\t\t\"./dist/emotion-react.esm.js\": \"./dist/emotion-react.browser.esm.js\"\n\t},\n\texports: {\n\t\t\".\": {\n\t\t\tmodule: {\n\t\t\t\tworker: \"./dist/emotion-react.worker.esm.js\",\n\t\t\t\tbrowser: \"./dist/emotion-react.browser.esm.js\",\n\t\t\t\t\"default\": \"./dist/emotion-react.esm.js\"\n\t\t\t},\n\t\t\t\"default\": \"./dist/emotion-react.cjs.js\"\n\t\t},\n\t\t\"./jsx-runtime\": {\n\t\t\tmodule: {\n\t\t\t\tworker: \"./jsx-runtime/dist/emotion-react-jsx-runtime.worker.esm.js\",\n\t\t\t\tbrowser: \"./jsx-runtime/dist/emotion-react-jsx-runtime.browser.esm.js\",\n\t\t\t\t\"default\": \"./jsx-runtime/dist/emotion-react-jsx-runtime.esm.js\"\n\t\t\t},\n\t\t\t\"default\": \"./jsx-runtime/dist/emotion-react-jsx-runtime.cjs.js\"\n\t\t},\n\t\t\"./_isolated-hnrs\": {\n\t\t\tmodule: {\n\t\t\t\tworker: \"./_isolated-hnrs/dist/emotion-react-_isolated-hnrs.worker.esm.js\",\n\t\t\t\tbrowser: \"./_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js\",\n\t\t\t\t\"default\": \"./_isolated-hnrs/dist/emotion-react-_isolated-hnrs.esm.js\"\n\t\t\t},\n\t\t\t\"default\": \"./_isolated-hnrs/dist/emotion-react-_isolated-hnrs.cjs.js\"\n\t\t},\n\t\t\"./jsx-dev-runtime\": {\n\t\t\tmodule: {\n\t\t\t\tworker: \"./jsx-dev-runtime/dist/emotion-react-jsx-dev-runtime.worker.esm.js\",\n\t\t\t\tbrowser: \"./jsx-dev-runtime/dist/emotion-react-jsx-dev-runtime.browser.esm.js\",\n\t\t\t\t\"default\": \"./jsx-dev-runtime/dist/emotion-react-jsx-dev-runtime.esm.js\"\n\t\t\t},\n\t\t\t\"default\": \"./jsx-dev-runtime/dist/emotion-react-jsx-dev-runtime.cjs.js\"\n\t\t},\n\t\t\"./package.json\": \"./package.json\",\n\t\t\"./types/css-prop\": \"./types/css-prop.d.ts\",\n\t\t\"./macro\": \"./macro.js\"\n\t},\n\ttypes: \"types/index.d.ts\",\n\tfiles: [\n\t\t\"src\",\n\t\t\"dist\",\n\t\t\"jsx-runtime\",\n\t\t\"jsx-dev-runtime\",\n\t\t\"_isolated-hnrs\",\n\t\t\"types/*.d.ts\",\n\t\t\"macro.js\",\n\t\t\"macro.d.ts\",\n\t\t\"macro.js.flow\"\n\t],\n\tsideEffects: false,\n\tauthor: \"Emotion Contributors\",\n\tlicense: \"MIT\",\n\tscripts: {\n\t\t\"test:typescript\": \"dtslint types\"\n\t},\n\tdependencies: {\n\t\t\"@babel/runtime\": \"^7.18.3\",\n\t\t\"@emotion/babel-plugin\": \"^11.10.0\",\n\t\t\"@emotion/cache\": \"^11.10.0\",\n\t\t\"@emotion/serialize\": \"^1.1.0\",\n\t\t\"@emotion/utils\": \"^1.2.0\",\n\t\t\"@emotion/weak-memoize\": \"^0.3.0\",\n\t\t\"hoist-non-react-statics\": \"^3.3.1\"\n\t},\n\tpeerDependencies: {\n\t\t\"@babel/core\": \"^7.0.0\",\n\t\treact: \">=16.8.0\"\n\t},\n\tpeerDependenciesMeta: {\n\t\t\"@babel/core\": {\n\t\t\toptional: true\n\t\t},\n\t\t\"@types/react\": {\n\t\t\toptional: true\n\t\t}\n\t},\n\tdevDependencies: {\n\t\t\"@babel/core\": \"^7.18.5\",\n\t\t\"@definitelytyped/dtslint\": \"0.0.112\",\n\t\t\"@emotion/css\": \"11.10.0\",\n\t\t\"@emotion/css-prettifier\": \"1.1.0\",\n\t\t\"@emotion/server\": \"11.10.0\",\n\t\t\"@emotion/styled\": \"11.10.0\",\n\t\t\"html-tag-names\": \"^1.1.2\",\n\t\treact: \"16.14.0\",\n\t\t\"svg-tag-names\": \"^1.1.1\",\n\t\ttypescript: \"^4.5.5\"\n\t},\n\trepository: \"https://github.com/emotion-js/emotion/tree/main/packages/react\",\n\tpublishConfig: {\n\t\taccess: \"public\"\n\t},\n\t\"umd:main\": \"dist/emotion-react.umd.min.js\",\n\tpreconstruct: {\n\t\tentrypoints: [\n\t\t\t\"./index.js\",\n\t\t\t\"./jsx-runtime.js\",\n\t\t\t\"./jsx-dev-runtime.js\",\n\t\t\t\"./_isolated-hnrs.js\"\n\t\t],\n\t\tumdName: \"emotionReact\",\n\t\texports: {\n\t\t\tenvConditions: [\n\t\t\t\t\"browser\",\n\t\t\t\t\"worker\"\n\t\t\t],\n\t\t\textra: {\n\t\t\t\t\"./types/css-prop\": \"./types/css-prop.d.ts\",\n\t\t\t\t\"./macro\": \"./macro.js\"\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar jsx = function jsx(type, props) {\n  var args = arguments;\n\n  if (props == null || !hasOwnProperty.call(props, 'css')) {\n    // $FlowFixMe\n    return createElement.apply(undefined, args);\n  }\n\n  var argsLength = args.length;\n  var createElementArgArray = new Array(argsLength);\n  createElementArgArray[0] = Emotion;\n  createElementArgArray[1] = createEmotionProps(type, props);\n\n  for (var i = 2; i < argsLength; i++) {\n    createElementArgArray[i] = args[i];\n  } // $FlowFixMe\n\n\n  return createElement.apply(null, createElementArgArray);\n};\n\nvar useInsertionEffect = React['useInsertion' + 'Effect'] ? React['useInsertion' + 'Effect'] : useLayoutEffect;\nvar warnedAboutCssPropForGlobal = false; // maintain place over rerenders.\n// initial render from browser, insertBefore context.sheet.tags[0] or if a style hasn't been inserted there yet, appendChild\n// initial client-side render from SSR, use place of hydrating tag\n\nvar Global = /* #__PURE__ */withEmotionCache(function (props, cache) {\n  if (process.env.NODE_ENV !== 'production' && !warnedAboutCssPropForGlobal && ( // check for className as well since the user is\n  // probably using the custom createElement which\n  // means it will be turned into a className prop\n  // $FlowFixMe I don't really want to add it to the type since it shouldn't be used\n  props.className || props.css)) {\n    console.error(\"It looks like you're using the css prop on Global, did you mean to use the styles prop instead?\");\n    warnedAboutCssPropForGlobal = true;\n  }\n\n  var styles = props.styles;\n  var serialized = serializeStyles([styles], undefined, useContext(ThemeContext));\n  // but it is based on a constant that will never change at runtime\n  // it's effectively like having two implementations and switching them out\n  // so it's not actually breaking anything\n\n\n  var sheetRef = useRef();\n  useInsertionEffect(function () {\n    var key = cache.key + \"-global\"; // use case of https://github.com/emotion-js/emotion/issues/2675\n\n    var sheet = new cache.sheet.constructor({\n      key: key,\n      nonce: cache.sheet.nonce,\n      container: cache.sheet.container,\n      speedy: cache.sheet.isSpeedy\n    });\n    var rehydrating = false; // $FlowFixMe\n\n    var node = document.querySelector(\"style[data-emotion=\\\"\" + key + \" \" + serialized.name + \"\\\"]\");\n\n    if (cache.sheet.tags.length) {\n      sheet.before = cache.sheet.tags[0];\n    }\n\n    if (node !== null) {\n      rehydrating = true; // clear the hash so this node won't be recognizable as rehydratable by other <Global/>s\n\n      node.setAttribute('data-emotion', key);\n      sheet.hydrate([node]);\n    }\n\n    sheetRef.current = [sheet, rehydrating];\n    return function () {\n      sheet.flush();\n    };\n  }, [cache]);\n  useInsertionEffect(function () {\n    var sheetRefCurrent = sheetRef.current;\n    var sheet = sheetRefCurrent[0],\n        rehydrating = sheetRefCurrent[1];\n\n    if (rehydrating) {\n      sheetRefCurrent[1] = false;\n      return;\n    }\n\n    if (serialized.next !== undefined) {\n      // insert keyframes\n      insertStyles(cache, serialized.next, true);\n    }\n\n    if (sheet.tags.length) {\n      // if this doesn't exist then it will be null so the style element will be appended\n      var element = sheet.tags[sheet.tags.length - 1].nextElementSibling;\n      sheet.before = element;\n      sheet.flush();\n    }\n\n    cache.insert(\"\", serialized, sheet, false);\n  }, [cache, serialized.name]);\n  return null;\n});\n\nif (process.env.NODE_ENV !== 'production') {\n  Global.displayName = 'EmotionGlobal';\n}\n\nfunction css() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return serializeStyles(args);\n}\n\nvar keyframes = function keyframes() {\n  var insertable = css.apply(void 0, arguments);\n  var name = \"animation-\" + insertable.name; // $FlowFixMe\n\n  return {\n    name: name,\n    styles: \"@keyframes \" + name + \"{\" + insertable.styles + \"}\",\n    anim: 1,\n    toString: function toString() {\n      return \"_EMO_\" + this.name + \"_\" + this.styles + \"_EMO_\";\n    }\n  };\n};\n\nvar classnames = function classnames(args) {\n  var len = args.length;\n  var i = 0;\n  var cls = '';\n\n  for (; i < len; i++) {\n    var arg = args[i];\n    if (arg == null) continue;\n    var toAdd = void 0;\n\n    switch (typeof arg) {\n      case 'boolean':\n        break;\n\n      case 'object':\n        {\n          if (Array.isArray(arg)) {\n            toAdd = classnames(arg);\n          } else {\n            if (process.env.NODE_ENV !== 'production' && arg.styles !== undefined && arg.name !== undefined) {\n              console.error('You have passed styles created with `css` from `@emotion/react` package to the `cx`.\\n' + '`cx` is meant to compose class names (strings) so you should convert those styles to a class name by passing them to the `css` received from <ClassNames/> component.');\n            }\n\n            toAdd = '';\n\n            for (var k in arg) {\n              if (arg[k] && k) {\n                toAdd && (toAdd += ' ');\n                toAdd += k;\n              }\n            }\n          }\n\n          break;\n        }\n\n      default:\n        {\n          toAdd = arg;\n        }\n    }\n\n    if (toAdd) {\n      cls && (cls += ' ');\n      cls += toAdd;\n    }\n  }\n\n  return cls;\n};\n\nfunction merge(registered, css, className) {\n  var registeredStyles = [];\n  var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n  if (registeredStyles.length < 2) {\n    return className;\n  }\n\n  return rawClassName + css(registeredStyles);\n}\n\nvar Insertion = function Insertion(_ref) {\n  var cache = _ref.cache,\n      serializedArr = _ref.serializedArr;\n  var rules = useInsertionEffectMaybe(function () {\n\n    for (var i = 0; i < serializedArr.length; i++) {\n      var res = insertStyles(cache, serializedArr[i], false);\n    }\n  });\n\n  return null;\n};\n\nvar ClassNames = /* #__PURE__ */withEmotionCache(function (props, cache) {\n  var hasRendered = false;\n  var serializedArr = [];\n\n  var css = function css() {\n    if (hasRendered && process.env.NODE_ENV !== 'production') {\n      throw new Error('css can only be used during render');\n    }\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    var serialized = serializeStyles(args, cache.registered);\n    serializedArr.push(serialized); // registration has to happen here as the result of this might get consumed by `cx`\n\n    registerStyles(cache, serialized, false);\n    return cache.key + \"-\" + serialized.name;\n  };\n\n  var cx = function cx() {\n    if (hasRendered && process.env.NODE_ENV !== 'production') {\n      throw new Error('cx can only be used during render');\n    }\n\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return merge(cache.registered, css, classnames(args));\n  };\n\n  var content = {\n    css: css,\n    cx: cx,\n    theme: useContext(ThemeContext)\n  };\n  var ele = props.children(content);\n  hasRendered = true;\n  return /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement(Insertion, {\n    cache: cache,\n    serializedArr: serializedArr\n  }), ele);\n});\n\nif (process.env.NODE_ENV !== 'production') {\n  ClassNames.displayName = 'EmotionClassNames';\n}\n\nif (process.env.NODE_ENV !== 'production') {\n  var isBrowser = \"object\" !== 'undefined'; // #1727 for some reason Jest evaluates modules twice if some consuming module gets mocked with jest.mock\n\n  var isJest = typeof jest !== 'undefined';\n\n  if (isBrowser && !isJest) {\n    // globalThis has wide browser support - https://caniuse.com/?search=globalThis, Node.js 12 and later\n    var globalContext = // $FlowIgnore\n    typeof globalThis !== 'undefined' ? globalThis // eslint-disable-line no-undef\n    : isBrowser ? window : global;\n    var globalKey = \"__EMOTION_REACT_\" + pkg.version.split('.')[0] + \"__\";\n\n    if (globalContext[globalKey]) {\n      console.warn('You are loading @emotion/react when it is already loaded. Running ' + 'multiple instances may cause problems. This can happen if multiple ' + 'versions are used, or if multiple builds of the same version are ' + 'used.');\n    }\n\n    globalContext[globalKey] = true;\n  }\n}\n\nexport { ClassNames, Global, jsx as createElement, css, jsx, keyframes };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n  // 'm' and 'r' are mixing constants generated offline.\n  // They're not really 'magic', they just happen to work well.\n  // const m = 0x5bd1e995;\n  // const r = 24;\n  // Initialize the hash\n  var h = 0; // Mix 4 bytes at a time into the hash\n\n  var k,\n      i = 0,\n      len = str.length;\n\n  for (; len >= 4; ++i, len -= 4) {\n    k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n    k =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n    k ^=\n    /* k >>> r: */\n    k >>> 24;\n    h =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n    /* Math.imul(h, m): */\n    (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Handle the last few bytes of the input array\n\n\n  switch (len) {\n    case 3:\n      h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n    case 2:\n      h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n    case 1:\n      h ^= str.charCodeAt(i) & 0xff;\n      h =\n      /* Math.imul(h, m): */\n      (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Do a few final mixes of the hash to ensure the last few\n  // bytes are well-incorporated.\n\n\n  h ^= h >>> 13;\n  h =\n  /* Math.imul(h, m): */\n  (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport default murmur2;\n","var unitlessKeys = {\n  animationIterationCount: 1,\n  borderImageOutset: 1,\n  borderImageSlice: 1,\n  borderImageWidth: 1,\n  boxFlex: 1,\n  boxFlexGroup: 1,\n  boxOrdinalGroup: 1,\n  columnCount: 1,\n  columns: 1,\n  flex: 1,\n  flexGrow: 1,\n  flexPositive: 1,\n  flexShrink: 1,\n  flexNegative: 1,\n  flexOrder: 1,\n  gridRow: 1,\n  gridRowEnd: 1,\n  gridRowSpan: 1,\n  gridRowStart: 1,\n  gridColumn: 1,\n  gridColumnEnd: 1,\n  gridColumnSpan: 1,\n  gridColumnStart: 1,\n  msGridRow: 1,\n  msGridRowSpan: 1,\n  msGridColumn: 1,\n  msGridColumnSpan: 1,\n  fontWeight: 1,\n  lineHeight: 1,\n  opacity: 1,\n  order: 1,\n  orphans: 1,\n  tabSize: 1,\n  widows: 1,\n  zIndex: 1,\n  zoom: 1,\n  WebkitLineClamp: 1,\n  // SVG-related properties\n  fillOpacity: 1,\n  floodOpacity: 1,\n  stopOpacity: 1,\n  strokeDasharray: 1,\n  strokeDashoffset: 1,\n  strokeMiterlimit: 1,\n  strokeOpacity: 1,\n  strokeWidth: 1\n};\n\nexport default unitlessKeys;\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar ILLEGAL_ESCAPE_SEQUENCE_ERROR = \"You have illegal escape sequence in your template literal, most likely inside content's property value.\\nBecause you write your CSS inside a JavaScript string you actually have to do double escaping, so for example \\\"content: '\\\\00d7';\\\" should become \\\"content: '\\\\\\\\00d7';\\\".\\nYou can read more about this here:\\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#ES2018_revision_of_illegal_escape_sequences\";\nvar UNDEFINED_AS_OBJECT_KEY_ERROR = \"You have passed in falsy value as style object's key (can happen when in example you pass unexported component as computed key).\";\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n  return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n  return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n  return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n  switch (key) {\n    case 'animation':\n    case 'animationName':\n      {\n        if (typeof value === 'string') {\n          return value.replace(animationRegex, function (match, p1, p2) {\n            cursor = {\n              name: p1,\n              styles: p2,\n              next: cursor\n            };\n            return p1;\n          });\n        }\n      }\n  }\n\n  if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n    return value + 'px';\n  }\n\n  return value;\n};\n\nif (process.env.NODE_ENV !== 'production') {\n  var contentValuePattern = /(var|attr|counters?|url|(((repeating-)?(linear|radial))|conic)-gradient)\\(|(no-)?(open|close)-quote/;\n  var contentValues = ['normal', 'none', 'initial', 'inherit', 'unset'];\n  var oldProcessStyleValue = processStyleValue;\n  var msPattern = /^-ms-/;\n  var hyphenPattern = /-(.)/g;\n  var hyphenatedCache = {};\n\n  processStyleValue = function processStyleValue(key, value) {\n    if (key === 'content') {\n      if (typeof value !== 'string' || contentValues.indexOf(value) === -1 && !contentValuePattern.test(value) && (value.charAt(0) !== value.charAt(value.length - 1) || value.charAt(0) !== '\"' && value.charAt(0) !== \"'\")) {\n        throw new Error(\"You seem to be using a value for 'content' without quotes, try replacing it with `content: '\\\"\" + value + \"\\\"'`\");\n      }\n    }\n\n    var processed = oldProcessStyleValue(key, value);\n\n    if (processed !== '' && !isCustomProperty(key) && key.indexOf('-') !== -1 && hyphenatedCache[key] === undefined) {\n      hyphenatedCache[key] = true;\n      console.error(\"Using kebab-case for css properties in objects is not supported. Did you mean \" + key.replace(msPattern, 'ms-').replace(hyphenPattern, function (str, _char) {\n        return _char.toUpperCase();\n      }) + \"?\");\n    }\n\n    return processed;\n  };\n}\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n  if (interpolation == null) {\n    return '';\n  }\n\n  if (interpolation.__emotion_styles !== undefined) {\n    if (process.env.NODE_ENV !== 'production' && interpolation.toString() === 'NO_COMPONENT_SELECTOR') {\n      throw new Error(noComponentSelectorMessage);\n    }\n\n    return interpolation;\n  }\n\n  switch (typeof interpolation) {\n    case 'boolean':\n      {\n        return '';\n      }\n\n    case 'object':\n      {\n        if (interpolation.anim === 1) {\n          cursor = {\n            name: interpolation.name,\n            styles: interpolation.styles,\n            next: cursor\n          };\n          return interpolation.name;\n        }\n\n        if (interpolation.styles !== undefined) {\n          var next = interpolation.next;\n\n          if (next !== undefined) {\n            // not the most efficient thing ever but this is a pretty rare case\n            // and there will be very few iterations of this generally\n            while (next !== undefined) {\n              cursor = {\n                name: next.name,\n                styles: next.styles,\n                next: cursor\n              };\n              next = next.next;\n            }\n          }\n\n          var styles = interpolation.styles + \";\";\n\n          if (process.env.NODE_ENV !== 'production' && interpolation.map !== undefined) {\n            styles += interpolation.map;\n          }\n\n          return styles;\n        }\n\n        return createStringFromObject(mergedProps, registered, interpolation);\n      }\n\n    case 'function':\n      {\n        if (mergedProps !== undefined) {\n          var previousCursor = cursor;\n          var result = interpolation(mergedProps);\n          cursor = previousCursor;\n          return handleInterpolation(mergedProps, registered, result);\n        } else if (process.env.NODE_ENV !== 'production') {\n          console.error('Functions that are interpolated in css calls will be stringified.\\n' + 'If you want to have a css call based on props, create a function that returns a css call like this\\n' + 'let dynamicStyle = (props) => css`color: ${props.color}`\\n' + 'It can be called directly with props or interpolated in a styled call like this\\n' + \"let SomeComponent = styled('div')`${dynamicStyle}`\");\n        }\n\n        break;\n      }\n\n    case 'string':\n      if (process.env.NODE_ENV !== 'production') {\n        var matched = [];\n        var replaced = interpolation.replace(animationRegex, function (match, p1, p2) {\n          var fakeVarName = \"animation\" + matched.length;\n          matched.push(\"const \" + fakeVarName + \" = keyframes`\" + p2.replace(/^@keyframes animation-\\w+/, '') + \"`\");\n          return \"${\" + fakeVarName + \"}\";\n        });\n\n        if (matched.length) {\n          console.error('`keyframes` output got interpolated into plain string, please wrap it with `css`.\\n\\n' + 'Instead of doing this:\\n\\n' + [].concat(matched, [\"`\" + replaced + \"`\"]).join('\\n') + '\\n\\nYou should wrap it with `css` like this:\\n\\n' + (\"css`\" + replaced + \"`\"));\n        }\n      }\n\n      break;\n  } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n  if (registered == null) {\n    return interpolation;\n  }\n\n  var cached = registered[interpolation];\n  return cached !== undefined ? cached : interpolation;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n  var string = '';\n\n  if (Array.isArray(obj)) {\n    for (var i = 0; i < obj.length; i++) {\n      string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n    }\n  } else {\n    for (var _key in obj) {\n      var value = obj[_key];\n\n      if (typeof value !== 'object') {\n        if (registered != null && registered[value] !== undefined) {\n          string += _key + \"{\" + registered[value] + \"}\";\n        } else if (isProcessableValue(value)) {\n          string += processStyleName(_key) + \":\" + processStyleValue(_key, value) + \";\";\n        }\n      } else {\n        if (_key === 'NO_COMPONENT_SELECTOR' && process.env.NODE_ENV !== 'production') {\n          throw new Error(noComponentSelectorMessage);\n        }\n\n        if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n          for (var _i = 0; _i < value.length; _i++) {\n            if (isProcessableValue(value[_i])) {\n              string += processStyleName(_key) + \":\" + processStyleValue(_key, value[_i]) + \";\";\n            }\n          }\n        } else {\n          var interpolated = handleInterpolation(mergedProps, registered, value);\n\n          switch (_key) {\n            case 'animation':\n            case 'animationName':\n              {\n                string += processStyleName(_key) + \":\" + interpolated + \";\";\n                break;\n              }\n\n            default:\n              {\n                if (process.env.NODE_ENV !== 'production' && _key === 'undefined') {\n                  console.error(UNDEFINED_AS_OBJECT_KEY_ERROR);\n                }\n\n                string += _key + \"{\" + interpolated + \"}\";\n              }\n          }\n        }\n      }\n    }\n  }\n\n  return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;\\n{]+)\\s*(;|$)/g;\nvar sourceMapPattern;\n\nif (process.env.NODE_ENV !== 'production') {\n  sourceMapPattern = /\\/\\*#\\ssourceMappingURL=data:application\\/json;\\S+\\s+\\*\\//g;\n} // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\n\nvar cursor;\nvar serializeStyles = function serializeStyles(args, registered, mergedProps) {\n  if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n    return args[0];\n  }\n\n  var stringMode = true;\n  var styles = '';\n  cursor = undefined;\n  var strings = args[0];\n\n  if (strings == null || strings.raw === undefined) {\n    stringMode = false;\n    styles += handleInterpolation(mergedProps, registered, strings);\n  } else {\n    if (process.env.NODE_ENV !== 'production' && strings[0] === undefined) {\n      console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n    }\n\n    styles += strings[0];\n  } // we start at 1 since we've already handled the first arg\n\n\n  for (var i = 1; i < args.length; i++) {\n    styles += handleInterpolation(mergedProps, registered, args[i]);\n\n    if (stringMode) {\n      if (process.env.NODE_ENV !== 'production' && strings[i] === undefined) {\n        console.error(ILLEGAL_ESCAPE_SEQUENCE_ERROR);\n      }\n\n      styles += strings[i];\n    }\n  }\n\n  var sourceMap;\n\n  if (process.env.NODE_ENV !== 'production') {\n    styles = styles.replace(sourceMapPattern, function (match) {\n      sourceMap = match;\n      return '';\n    });\n  } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n  labelPattern.lastIndex = 0;\n  var identifierName = '';\n  var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n  while ((match = labelPattern.exec(styles)) !== null) {\n    identifierName += '-' + // $FlowFixMe we know it's not null\n    match[1];\n  }\n\n  var name = hashString(styles) + identifierName;\n\n  if (process.env.NODE_ENV !== 'production') {\n    // $FlowFixMe SerializedStyles type doesn't have toString property (and we don't want to add it)\n    return {\n      name: name,\n      styles: styles,\n      map: sourceMap,\n      next: cursor,\n      toString: function toString() {\n        return \"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop).\";\n      }\n    };\n  }\n\n  return {\n    name: name,\n    styles: styles,\n    next: cursor\n  };\n};\n\nexport { serializeStyles };\n","function memoize(fn) {\n  var cache = Object.create(null);\n  return function (arg) {\n    if (cache[arg] === undefined) cache[arg] = fn(arg);\n    return cache[arg];\n  };\n}\n\nexport default memoize;\n","/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n// $FlowFixMe\nfunction sheetForTag(tag) {\n  if (tag.sheet) {\n    // $FlowFixMe\n    return tag.sheet;\n  } // this weirdness brought to you by firefox\n\n  /* istanbul ignore next */\n\n\n  for (var i = 0; i < document.styleSheets.length; i++) {\n    if (document.styleSheets[i].ownerNode === tag) {\n      // $FlowFixMe\n      return document.styleSheets[i];\n    }\n  }\n}\n\nfunction createStyleElement(options) {\n  var tag = document.createElement('style');\n  tag.setAttribute('data-emotion', options.key);\n\n  if (options.nonce !== undefined) {\n    tag.setAttribute('nonce', options.nonce);\n  }\n\n  tag.appendChild(document.createTextNode(''));\n  tag.setAttribute('data-s', '');\n  return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n  // Using Node instead of HTMLElement since container may be a ShadowRoot\n  function StyleSheet(options) {\n    var _this = this;\n\n    this._insertTag = function (tag) {\n      var before;\n\n      if (_this.tags.length === 0) {\n        if (_this.insertionPoint) {\n          before = _this.insertionPoint.nextSibling;\n        } else if (_this.prepend) {\n          before = _this.container.firstChild;\n        } else {\n          before = _this.before;\n        }\n      } else {\n        before = _this.tags[_this.tags.length - 1].nextSibling;\n      }\n\n      _this.container.insertBefore(tag, before);\n\n      _this.tags.push(tag);\n    };\n\n    this.isSpeedy = options.speedy === undefined ? process.env.NODE_ENV === 'production' : options.speedy;\n    this.tags = [];\n    this.ctr = 0;\n    this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n    this.key = options.key;\n    this.container = options.container;\n    this.prepend = options.prepend;\n    this.insertionPoint = options.insertionPoint;\n    this.before = null;\n  }\n\n  var _proto = StyleSheet.prototype;\n\n  _proto.hydrate = function hydrate(nodes) {\n    nodes.forEach(this._insertTag);\n  };\n\n  _proto.insert = function insert(rule) {\n    // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n    // it's 1 in dev because we insert source maps that map a single rule to a location\n    // and you can only have one source map per style tag\n    if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n      this._insertTag(createStyleElement(this));\n    }\n\n    var tag = this.tags[this.tags.length - 1];\n\n    if (process.env.NODE_ENV !== 'production') {\n      var isImportRule = rule.charCodeAt(0) === 64 && rule.charCodeAt(1) === 105;\n\n      if (isImportRule && this._alreadyInsertedOrderInsensitiveRule) {\n        // this would only cause problem in speedy mode\n        // but we don't want enabling speedy to affect the observable behavior\n        // so we report this error at all times\n        console.error(\"You're attempting to insert the following rule:\\n\" + rule + '\\n\\n`@import` rules must be before all other types of rules in a stylesheet but other rules have already been inserted. Please ensure that `@import` rules are before all other rules.');\n      }\n      this._alreadyInsertedOrderInsensitiveRule = this._alreadyInsertedOrderInsensitiveRule || !isImportRule;\n    }\n\n    if (this.isSpeedy) {\n      var sheet = sheetForTag(tag);\n\n      try {\n        // this is the ultrafast version, works across browsers\n        // the big drawback is that the css won't be editable in devtools\n        sheet.insertRule(rule, sheet.cssRules.length);\n      } catch (e) {\n        if (process.env.NODE_ENV !== 'production' && !/:(-moz-placeholder|-moz-focus-inner|-moz-focusring|-ms-input-placeholder|-moz-read-write|-moz-read-only|-ms-clear){/.test(rule)) {\n          console.error(\"There was a problem inserting the following rule: \\\"\" + rule + \"\\\"\", e);\n        }\n      }\n    } else {\n      tag.appendChild(document.createTextNode(rule));\n    }\n\n    this.ctr++;\n  };\n\n  _proto.flush = function flush() {\n    // $FlowFixMe\n    this.tags.forEach(function (tag) {\n      return tag.parentNode && tag.parentNode.removeChild(tag);\n    });\n    this.tags = [];\n    this.ctr = 0;\n\n    if (process.env.NODE_ENV !== 'production') {\n      this._alreadyInsertedOrderInsensitiveRule = false;\n    }\n  };\n\n  return StyleSheet;\n}();\n\nexport { StyleSheet };\n","var unitlessKeys = {\n  animationIterationCount: 1,\n  borderImageOutset: 1,\n  borderImageSlice: 1,\n  borderImageWidth: 1,\n  boxFlex: 1,\n  boxFlexGroup: 1,\n  boxOrdinalGroup: 1,\n  columnCount: 1,\n  columns: 1,\n  flex: 1,\n  flexGrow: 1,\n  flexPositive: 1,\n  flexShrink: 1,\n  flexNegative: 1,\n  flexOrder: 1,\n  gridRow: 1,\n  gridRowEnd: 1,\n  gridRowSpan: 1,\n  gridRowStart: 1,\n  gridColumn: 1,\n  gridColumnEnd: 1,\n  gridColumnSpan: 1,\n  gridColumnStart: 1,\n  msGridRow: 1,\n  msGridRowSpan: 1,\n  msGridColumn: 1,\n  msGridColumnSpan: 1,\n  fontWeight: 1,\n  lineHeight: 1,\n  opacity: 1,\n  order: 1,\n  orphans: 1,\n  tabSize: 1,\n  widows: 1,\n  zIndex: 1,\n  zoom: 1,\n  WebkitLineClamp: 1,\n  // SVG-related properties\n  fillOpacity: 1,\n  floodOpacity: 1,\n  stopOpacity: 1,\n  strokeDasharray: 1,\n  strokeDashoffset: 1,\n  strokeMiterlimit: 1,\n  strokeOpacity: 1,\n  strokeWidth: 1\n};\n\nexport default unitlessKeys;\n","var isBrowser = \"object\" !== 'undefined';\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n  var rawClassName = '';\n  classNames.split(' ').forEach(function (className) {\n    if (registered[className] !== undefined) {\n      registeredStyles.push(registered[className] + \";\");\n    } else {\n      rawClassName += className + \" \";\n    }\n  });\n  return rawClassName;\n}\nvar registerStyles = function registerStyles(cache, serialized, isStringTag) {\n  var className = cache.key + \"-\" + serialized.name;\n\n  if ( // we only need to add the styles to the registered cache if the\n  // class name could be used further down\n  // the tree but if it's a string tag, we know it won't\n  // so we don't have to add it to registered cache.\n  // this improves memory usage since we can avoid storing the whole style string\n  (isStringTag === false || // we need to always store it if we're in compat mode and\n  // in node since emotion-server relies on whether a style is in\n  // the registered cache to know whether a style is global or not\n  // also, note that this check will be dead code eliminated in the browser\n  isBrowser === false ) && cache.registered[className] === undefined) {\n    cache.registered[className] = serialized.styles;\n  }\n};\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n  registerStyles(cache, serialized, isStringTag);\n  var className = cache.key + \"-\" + serialized.name;\n\n  if (cache.inserted[serialized.name] === undefined) {\n    var current = serialized;\n\n    do {\n      var maybeStyles = cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n      current = current.next;\n    } while (current !== undefined);\n  }\n};\n\nexport { getRegisteredStyles, insertStyles, registerStyles };\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :\n\ttypeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :\n\t(global = global || self, factory(global.ReactStripe = {}, global.React));\n}(this, (function (exports, React) { 'use strict';\n\n\tReact = React && Object.prototype.hasOwnProperty.call(React, 'default') ? React['default'] : React;\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\t/**\n\t * Copyright (c) 2013-present, Facebook, Inc.\n\t *\n\t * This source code is licensed under the MIT license found in the\n\t * LICENSE file in the root directory of this source tree.\n\t */\n\n\tvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\tvar ReactPropTypesSecret_1 = ReactPropTypesSecret;\n\n\tfunction emptyFunction() {}\n\n\tfunction emptyFunctionWithReset() {}\n\n\temptyFunctionWithReset.resetWarningCache = emptyFunction;\n\n\tvar factoryWithThrowingShims = function () {\n\t  function shim(props, propName, componentName, location, propFullName, secret) {\n\t    if (secret === ReactPropTypesSecret_1) {\n\t      // It is still safe when called from React.\n\t      return;\n\t    }\n\n\t    var err = new Error('Calling PropTypes validators directly is not supported by the `prop-types` package. ' + 'Use PropTypes.checkPropTypes() to call them. ' + 'Read more at http://fb.me/use-check-prop-types');\n\t    err.name = 'Invariant Violation';\n\t    throw err;\n\t  }\n\t  shim.isRequired = shim;\n\n\t  function getShim() {\n\t    return shim;\n\t  }\n\t  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n\n\t  var ReactPropTypes = {\n\t    array: shim,\n\t    bool: shim,\n\t    func: shim,\n\t    number: shim,\n\t    object: shim,\n\t    string: shim,\n\t    symbol: shim,\n\t    any: shim,\n\t    arrayOf: getShim,\n\t    element: shim,\n\t    elementType: shim,\n\t    instanceOf: getShim,\n\t    node: shim,\n\t    objectOf: getShim,\n\t    oneOf: getShim,\n\t    oneOfType: getShim,\n\t    shape: getShim,\n\t    exact: getShim,\n\t    checkPropTypes: emptyFunctionWithReset,\n\t    resetWarningCache: emptyFunction\n\t  };\n\t  ReactPropTypes.PropTypes = ReactPropTypes;\n\t  return ReactPropTypes;\n\t};\n\n\tvar propTypes = createCommonjsModule(function (module) {\n\t/**\n\t * Copyright (c) 2013-present, Facebook, Inc.\n\t *\n\t * This source code is licensed under the MIT license found in the\n\t * LICENSE file in the root directory of this source tree.\n\t */\n\t{\n\t  // By explicitly using `prop-types` you are opting into new production behavior.\n\t  // http://fb.me/prop-types-in-prod\n\t  module.exports = factoryWithThrowingShims();\n\t}\n\t});\n\n\tfunction ownKeys(object, enumerableOnly) {\n\t  var keys = Object.keys(object);\n\n\t  if (Object.getOwnPropertySymbols) {\n\t    var symbols = Object.getOwnPropertySymbols(object);\n\n\t    if (enumerableOnly) {\n\t      symbols = symbols.filter(function (sym) {\n\t        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n\t      });\n\t    }\n\n\t    keys.push.apply(keys, symbols);\n\t  }\n\n\t  return keys;\n\t}\n\n\tfunction _objectSpread2(target) {\n\t  for (var i = 1; i < arguments.length; i++) {\n\t    var source = arguments[i] != null ? arguments[i] : {};\n\n\t    if (i % 2) {\n\t      ownKeys(Object(source), true).forEach(function (key) {\n\t        _defineProperty(target, key, source[key]);\n\t      });\n\t    } else if (Object.getOwnPropertyDescriptors) {\n\t      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n\t    } else {\n\t      ownKeys(Object(source)).forEach(function (key) {\n\t        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n\t      });\n\t    }\n\t  }\n\n\t  return target;\n\t}\n\n\tfunction _typeof(obj) {\n\t  \"@babel/helpers - typeof\";\n\n\t  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n\t    _typeof = function (obj) {\n\t      return typeof obj;\n\t    };\n\t  } else {\n\t    _typeof = function (obj) {\n\t      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n\t    };\n\t  }\n\n\t  return _typeof(obj);\n\t}\n\n\tfunction _defineProperty(obj, key, value) {\n\t  if (key in obj) {\n\t    Object.defineProperty(obj, key, {\n\t      value: value,\n\t      enumerable: true,\n\t      configurable: true,\n\t      writable: true\n\t    });\n\t  } else {\n\t    obj[key] = value;\n\t  }\n\n\t  return obj;\n\t}\n\n\tfunction _slicedToArray(arr, i) {\n\t  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _arrayWithHoles(arr) {\n\t  if (Array.isArray(arr)) return arr;\n\t}\n\n\tfunction _iterableToArrayLimit(arr, i) {\n\t  var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]);\n\n\t  if (_i == null) return;\n\t  var _arr = [];\n\t  var _n = true;\n\t  var _d = false;\n\n\t  var _s, _e;\n\n\t  try {\n\t    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n\t      _arr.push(_s.value);\n\n\t      if (i && _arr.length === i) break;\n\t    }\n\t  } catch (err) {\n\t    _d = true;\n\t    _e = err;\n\t  } finally {\n\t    try {\n\t      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n\t    } finally {\n\t      if (_d) throw _e;\n\t    }\n\t  }\n\n\t  return _arr;\n\t}\n\n\tfunction _unsupportedIterableToArray(o, minLen) {\n\t  if (!o) return;\n\t  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n\t  var n = Object.prototype.toString.call(o).slice(8, -1);\n\t  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n\t  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n\t  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n\t}\n\n\tfunction _arrayLikeToArray(arr, len) {\n\t  if (len == null || len > arr.length) len = arr.length;\n\n\t  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n\t  return arr2;\n\t}\n\n\tfunction _nonIterableRest() {\n\t  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\tvar usePrevious = function usePrevious(value) {\n\t  var ref = React.useRef(value);\n\t  React.useEffect(function () {\n\t    ref.current = value;\n\t  }, [value]);\n\t  return ref.current;\n\t};\n\n\tvar isUnknownObject = function isUnknownObject(raw) {\n\t  return raw !== null && _typeof(raw) === 'object';\n\t};\n\tvar isPromise = function isPromise(raw) {\n\t  return isUnknownObject(raw) && typeof raw.then === 'function';\n\t}; // We are using types to enforce the `stripe` prop in this lib,\n\t// but in an untyped integration `stripe` could be anything, so we need\n\t// to do some sanity validation to prevent type errors.\n\n\tvar isStripe = function isStripe(raw) {\n\t  return isUnknownObject(raw) && typeof raw.elements === 'function' && typeof raw.createToken === 'function' && typeof raw.createPaymentMethod === 'function' && typeof raw.confirmCardPayment === 'function';\n\t};\n\n\tvar PLAIN_OBJECT_STR = '[object Object]';\n\tvar isEqual = function isEqual(left, right) {\n\t  if (!isUnknownObject(left) || !isUnknownObject(right)) {\n\t    return left === right;\n\t  }\n\n\t  var leftArray = Array.isArray(left);\n\t  var rightArray = Array.isArray(right);\n\t  if (leftArray !== rightArray) return false;\n\t  var leftPlainObject = Object.prototype.toString.call(left) === PLAIN_OBJECT_STR;\n\t  var rightPlainObject = Object.prototype.toString.call(right) === PLAIN_OBJECT_STR;\n\t  if (leftPlainObject !== rightPlainObject) return false; // not sure what sort of special object this is (regexp is one option), so\n\t  // fallback to reference check.\n\n\t  if (!leftPlainObject && !leftArray) return left === right;\n\t  var leftKeys = Object.keys(left);\n\t  var rightKeys = Object.keys(right);\n\t  if (leftKeys.length !== rightKeys.length) return false;\n\t  var keySet = {};\n\n\t  for (var i = 0; i < leftKeys.length; i += 1) {\n\t    keySet[leftKeys[i]] = true;\n\t  }\n\n\t  for (var _i = 0; _i < rightKeys.length; _i += 1) {\n\t    keySet[rightKeys[_i]] = true;\n\t  }\n\n\t  var allKeys = Object.keys(keySet);\n\n\t  if (allKeys.length !== leftKeys.length) {\n\t    return false;\n\t  }\n\n\t  var l = left;\n\t  var r = right;\n\n\t  var pred = function pred(key) {\n\t    return isEqual(l[key], r[key]);\n\t  };\n\n\t  return allKeys.every(pred);\n\t};\n\n\tvar extractAllowedOptionsUpdates = function extractAllowedOptionsUpdates(options, prevOptions, immutableKeys) {\n\t  if (!isUnknownObject(options)) {\n\t    return null;\n\t  }\n\n\t  return Object.keys(options).reduce(function (newOptions, key) {\n\t    var isUpdated = !isUnknownObject(prevOptions) || !isEqual(options[key], prevOptions[key]);\n\n\t    if (immutableKeys.includes(key)) {\n\t      if (isUpdated) {\n\t        console.warn(\"Unsupported prop change: options.\".concat(key, \" is not a mutable property.\"));\n\t      }\n\n\t      return newOptions;\n\t    }\n\n\t    if (!isUpdated) {\n\t      return newOptions;\n\t    }\n\n\t    return _objectSpread2(_objectSpread2({}, newOptions || {}), {}, _defineProperty({}, key, options[key]));\n\t  }, null);\n\t};\n\n\tvar INVALID_STRIPE_ERROR = 'Invalid prop `stripe` supplied to `Elements`. We recommend using the `loadStripe` utility from `@stripe/stripe-js`. See https://stripe.com/docs/stripe-js/react#elements-props-stripe for details.'; // We are using types to enforce the `stripe` prop in this lib, but in a real\n\t// integration `stripe` could be anything, so we need to do some sanity\n\t// validation to prevent type errors.\n\n\tvar validateStripe = function validateStripe(maybeStripe) {\n\t  if (maybeStripe === null || isStripe(maybeStripe)) {\n\t    return maybeStripe;\n\t  }\n\n\t  throw new Error(INVALID_STRIPE_ERROR);\n\t};\n\n\tvar parseStripeProp = function parseStripeProp(raw) {\n\t  if (isPromise(raw)) {\n\t    return {\n\t      tag: 'async',\n\t      stripePromise: Promise.resolve(raw).then(validateStripe)\n\t    };\n\t  }\n\n\t  var stripe = validateStripe(raw);\n\n\t  if (stripe === null) {\n\t    return {\n\t      tag: 'empty'\n\t    };\n\t  }\n\n\t  return {\n\t    tag: 'sync',\n\t    stripe: stripe\n\t  };\n\t};\n\n\tvar ElementsContext = /*#__PURE__*/React.createContext(null);\n\tElementsContext.displayName = 'ElementsContext';\n\tvar parseElementsContext = function parseElementsContext(ctx, useCase) {\n\t  if (!ctx) {\n\t    throw new Error(\"Could not find Elements context; You need to wrap the part of your app that \".concat(useCase, \" in an <Elements> provider.\"));\n\t  }\n\n\t  return ctx;\n\t};\n\t/**\n\t * The `Elements` provider allows you to use [Element components](https://stripe.com/docs/stripe-js/react#element-components) and access the [Stripe object](https://stripe.com/docs/js/initializing) in any nested component.\n\t * Render an `Elements` provider at the root of your React app so that it is available everywhere you need it.\n\t *\n\t * To use the `Elements` provider, call `loadStripe` from `@stripe/stripe-js` with your publishable key.\n\t * The `loadStripe` function will asynchronously load the Stripe.js script and initialize a `Stripe` object.\n\t * Pass the returned `Promise` to `Elements`.\n\t *\n\t * @docs https://stripe.com/docs/stripe-js/react#elements-provider\n\t */\n\n\tvar Elements = function Elements(_ref) {\n\t  var rawStripeProp = _ref.stripe,\n\t      options = _ref.options,\n\t      children = _ref.children;\n\t  var parsed = React.useMemo(function () {\n\t    return parseStripeProp(rawStripeProp);\n\t  }, [rawStripeProp]); // For a sync stripe instance, initialize into context\n\n\t  var _React$useState = React.useState(function () {\n\t    return {\n\t      stripe: parsed.tag === 'sync' ? parsed.stripe : null,\n\t      elements: parsed.tag === 'sync' ? parsed.stripe.elements(options) : null\n\t    };\n\t  }),\n\t      _React$useState2 = _slicedToArray(_React$useState, 2),\n\t      ctx = _React$useState2[0],\n\t      setContext = _React$useState2[1];\n\n\t  React.useEffect(function () {\n\t    var isMounted = true;\n\n\t    var safeSetContext = function safeSetContext(stripe) {\n\t      setContext(function (ctx) {\n\t        // no-op if we already have a stripe instance (https://github.com/stripe/react-stripe-js/issues/296)\n\t        if (ctx.stripe) return ctx;\n\t        return {\n\t          stripe: stripe,\n\t          elements: stripe.elements(options)\n\t        };\n\t      });\n\t    }; // For an async stripePromise, store it in context once resolved\n\n\n\t    if (parsed.tag === 'async' && !ctx.stripe) {\n\t      parsed.stripePromise.then(function (stripe) {\n\t        if (stripe && isMounted) {\n\t          // Only update Elements context if the component is still mounted\n\t          // and stripe is not null. We allow stripe to be null to make\n\t          // handling SSR easier.\n\t          safeSetContext(stripe);\n\t        }\n\t      });\n\t    } else if (parsed.tag === 'sync' && !ctx.stripe) {\n\t      // Or, handle a sync stripe instance going from null -> populated\n\t      safeSetContext(parsed.stripe);\n\t    }\n\n\t    return function () {\n\t      isMounted = false;\n\t    };\n\t  }, [parsed, ctx, options]); // Warn on changes to stripe prop\n\n\t  var prevStripe = usePrevious(rawStripeProp);\n\t  React.useEffect(function () {\n\t    if (prevStripe !== null && prevStripe !== rawStripeProp) {\n\t      console.warn('Unsupported prop change on Elements: You cannot change the `stripe` prop after setting it.');\n\t    }\n\t  }, [prevStripe, rawStripeProp]); // Apply updates to elements when options prop has relevant changes\n\n\t  var prevOptions = usePrevious(options);\n\t  React.useEffect(function () {\n\t    if (!ctx.elements) {\n\t      return;\n\t    }\n\n\t    var updates = extractAllowedOptionsUpdates(options, prevOptions, ['clientSecret', 'fonts']);\n\n\t    if (updates) {\n\t      ctx.elements.update(updates);\n\t    }\n\t  }, [options, prevOptions, ctx.elements]); // Attach react-stripe-js version to stripe.js instance\n\n\t  React.useEffect(function () {\n\t    var anyStripe = ctx.stripe;\n\n\t    if (!anyStripe || !anyStripe._registerWrapper || !anyStripe.registerAppInfo) {\n\t      return;\n\t    }\n\n\t    anyStripe._registerWrapper({\n\t      name: 'react-stripe-js',\n\t      version: \"1.10.0\"\n\t    });\n\n\t    anyStripe.registerAppInfo({\n\t      name: 'react-stripe-js',\n\t      version: \"1.10.0\",\n\t      url: 'https://stripe.com/docs/stripe-js/react'\n\t    });\n\t  }, [ctx.stripe]);\n\t  return /*#__PURE__*/React.createElement(ElementsContext.Provider, {\n\t    value: ctx\n\t  }, children);\n\t};\n\tElements.propTypes = {\n\t  stripe: propTypes.any,\n\t  options: propTypes.object\n\t};\n\tvar useElementsContextWithUseCase = function useElementsContextWithUseCase(useCaseMessage) {\n\t  var ctx = React.useContext(ElementsContext);\n\t  return parseElementsContext(ctx, useCaseMessage);\n\t};\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#useelements-hook\n\t */\n\n\tvar useElements = function useElements() {\n\t  var _useElementsContextWi = useElementsContextWithUseCase('calls useElements()'),\n\t      elements = _useElementsContextWi.elements;\n\n\t  return elements;\n\t};\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#usestripe-hook\n\t */\n\n\tvar useStripe = function useStripe() {\n\t  var _useElementsContextWi2 = useElementsContextWithUseCase('calls useStripe()'),\n\t      stripe = _useElementsContextWi2.stripe;\n\n\t  return stripe;\n\t};\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#elements-consumer\n\t */\n\n\tvar ElementsConsumer = function ElementsConsumer(_ref2) {\n\t  var children = _ref2.children;\n\t  var ctx = useElementsContextWithUseCase('mounts <ElementsConsumer>'); // Assert to satisfy the busted React.FC return type (it should be ReactNode)\n\n\t  return children(ctx);\n\t};\n\tElementsConsumer.propTypes = {\n\t  children: propTypes.func.isRequired\n\t};\n\n\tvar useCallbackReference = function useCallbackReference(cb) {\n\t  var ref = React.useRef(cb);\n\t  React.useEffect(function () {\n\t    ref.current = cb;\n\t  }, [cb]);\n\t  return function () {\n\t    if (ref.current) {\n\t      ref.current.apply(ref, arguments);\n\t    }\n\t  };\n\t};\n\n\tvar noop = function noop() {};\n\n\tvar capitalized = function capitalized(str) {\n\t  return str.charAt(0).toUpperCase() + str.slice(1);\n\t};\n\n\tvar createElementComponent = function createElementComponent(type, isServer) {\n\t  var displayName = \"\".concat(capitalized(type), \"Element\");\n\n\t  var ClientElement = function ClientElement(_ref) {\n\t    var id = _ref.id,\n\t        className = _ref.className,\n\t        _ref$options = _ref.options,\n\t        options = _ref$options === void 0 ? {} : _ref$options,\n\t        _ref$onBlur = _ref.onBlur,\n\t        onBlur = _ref$onBlur === void 0 ? noop : _ref$onBlur,\n\t        _ref$onFocus = _ref.onFocus,\n\t        onFocus = _ref$onFocus === void 0 ? noop : _ref$onFocus,\n\t        _ref$onReady = _ref.onReady,\n\t        onReady = _ref$onReady === void 0 ? noop : _ref$onReady,\n\t        _ref$onChange = _ref.onChange,\n\t        onChange = _ref$onChange === void 0 ? noop : _ref$onChange,\n\t        _ref$onEscape = _ref.onEscape,\n\t        onEscape = _ref$onEscape === void 0 ? noop : _ref$onEscape,\n\t        _ref$onClick = _ref.onClick,\n\t        onClick = _ref$onClick === void 0 ? noop : _ref$onClick,\n\t        _ref$onLoadError = _ref.onLoadError,\n\t        onLoadError = _ref$onLoadError === void 0 ? noop : _ref$onLoadError,\n\t        _ref$onLoaderStart = _ref.onLoaderStart,\n\t        onLoaderStart = _ref$onLoaderStart === void 0 ? noop : _ref$onLoaderStart;\n\n\t    var _useElementsContextWi = useElementsContextWithUseCase(\"mounts <\".concat(displayName, \">\")),\n\t        elements = _useElementsContextWi.elements;\n\n\t    var elementRef = React.useRef(null);\n\t    var domNode = React.useRef(null);\n\t    var callOnReady = useCallbackReference(onReady);\n\t    var callOnBlur = useCallbackReference(onBlur);\n\t    var callOnFocus = useCallbackReference(onFocus);\n\t    var callOnClick = useCallbackReference(onClick);\n\t    var callOnChange = useCallbackReference(onChange);\n\t    var callOnEscape = useCallbackReference(onEscape);\n\t    var callOnLoadError = useCallbackReference(onLoadError);\n\t    var callOnLoaderStart = useCallbackReference(onLoaderStart);\n\t    React.useLayoutEffect(function () {\n\t      if (elementRef.current == null && elements && domNode.current != null) {\n\t        var element = elements.create(type, options);\n\t        elementRef.current = element;\n\t        element.mount(domNode.current);\n\t        element.on('ready', function () {\n\t          return callOnReady(element);\n\t        });\n\t        element.on('change', callOnChange);\n\t        element.on('blur', callOnBlur);\n\t        element.on('focus', callOnFocus);\n\t        element.on('escape', callOnEscape); // Users can pass an onLoadError prop on any Element component\n\t        // just as they could listen for the `loaderror` event on any Element,\n\t        // but only certain Elements will trigger the event.\n\n\t        element.on('loaderror', callOnLoadError); // Users can pass an onLoaderStart prop on any Element component\n\t        // just as they could listen for the `loaderstart` event on any Element,\n\t        // but only certain Elements will trigger the event.\n\n\t        element.on('loaderstart', callOnLoaderStart); // Users can pass an onClick prop on any Element component\n\t        // just as they could listen for the `click` event on any Element,\n\t        // but only the PaymentRequestButton will actually trigger the event.\n\n\t        element.on('click', callOnClick);\n\t      }\n\t    });\n\t    var prevOptions = usePrevious(options);\n\t    React.useEffect(function () {\n\t      if (!elementRef.current) {\n\t        return;\n\t      }\n\n\t      var updates = extractAllowedOptionsUpdates(options, prevOptions, ['paymentRequest']);\n\n\t      if (updates) {\n\t        elementRef.current.update(updates);\n\t      }\n\t    }, [options, prevOptions]);\n\t    React.useLayoutEffect(function () {\n\t      return function () {\n\t        if (elementRef.current) {\n\t          elementRef.current.destroy();\n\t          elementRef.current = null;\n\t        }\n\t      };\n\t    }, []);\n\t    return /*#__PURE__*/React.createElement(\"div\", {\n\t      id: id,\n\t      className: className,\n\t      ref: domNode\n\t    });\n\t  }; // Only render the Element wrapper in a server environment.\n\n\n\t  var ServerElement = function ServerElement(props) {\n\t    // Validate that we are in the right context by calling useElementsContextWithUseCase.\n\t    useElementsContextWithUseCase(\"mounts <\".concat(displayName, \">\"));\n\t    var id = props.id,\n\t        className = props.className;\n\t    return /*#__PURE__*/React.createElement(\"div\", {\n\t      id: id,\n\t      className: className\n\t    });\n\t  };\n\n\t  var Element = isServer ? ServerElement : ClientElement;\n\t  Element.propTypes = {\n\t    id: propTypes.string,\n\t    className: propTypes.string,\n\t    onChange: propTypes.func,\n\t    onBlur: propTypes.func,\n\t    onFocus: propTypes.func,\n\t    onReady: propTypes.func,\n\t    onClick: propTypes.func,\n\t    onLoadError: propTypes.func,\n\t    onLoaderStart: propTypes.func,\n\t    options: propTypes.object\n\t  };\n\t  Element.displayName = displayName;\n\t  Element.__elementType = type;\n\t  return Element;\n\t};\n\n\tvar isServer = typeof window === 'undefined';\n\t/**\n\t * Requires beta access:\n\t * Contact [Stripe support](https://support.stripe.com/) for more information.\n\t *\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar AuBankAccountElement = createElementComponent('auBankAccount', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar CardElement = createElementComponent('card', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar CardNumberElement = createElementComponent('cardNumber', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar CardExpiryElement = createElementComponent('cardExpiry', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar CardCvcElement = createElementComponent('cardCvc', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar FpxBankElement = createElementComponent('fpxBank', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar IbanElement = createElementComponent('iban', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar IdealBankElement = createElementComponent('idealBank', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar P24BankElement = createElementComponent('p24Bank', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar EpsBankElement = createElementComponent('epsBank', isServer);\n\tvar PaymentElement = createElementComponent('payment', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar PaymentRequestButtonElement = createElementComponent('paymentRequestButton', isServer);\n\t/**\n\t * Requires beta access:\n\t * Contact [Stripe support](https://support.stripe.com/) for more information.\n\t *\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar LinkAuthenticationElement = createElementComponent('linkAuthentication', isServer);\n\t/**\n\t * Requires beta access:\n\t * Contact [Stripe support](https://support.stripe.com/) for more information.\n\t *\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar ShippingAddressElement = createElementComponent('shippingAddress', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar AffirmMessageElement = createElementComponent('affirmMessage', isServer);\n\t/**\n\t * @docs https://stripe.com/docs/stripe-js/react#element-components\n\t */\n\n\tvar AfterpayClearpayMessageElement = createElementComponent('afterpayClearpayMessage', isServer);\n\n\texports.AffirmMessageElement = AffirmMessageElement;\n\texports.AfterpayClearpayMessageElement = AfterpayClearpayMessageElement;\n\texports.AuBankAccountElement = AuBankAccountElement;\n\texports.CardCvcElement = CardCvcElement;\n\texports.CardElement = CardElement;\n\texports.CardExpiryElement = CardExpiryElement;\n\texports.CardNumberElement = CardNumberElement;\n\texports.Elements = Elements;\n\texports.ElementsConsumer = ElementsConsumer;\n\texports.EpsBankElement = EpsBankElement;\n\texports.FpxBankElement = FpxBankElement;\n\texports.IbanElement = IbanElement;\n\texports.IdealBankElement = IdealBankElement;\n\texports.LinkAuthenticationElement = LinkAuthenticationElement;\n\texports.P24BankElement = P24BankElement;\n\texports.PaymentElement = PaymentElement;\n\texports.PaymentRequestButtonElement = PaymentRequestButtonElement;\n\texports.ShippingAddressElement = ShippingAddressElement;\n\texports.useElements = useElements;\n\texports.useStripe = useStripe;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n","var V3_URL = 'https://js.stripe.com/v3';\nvar V3_URL_REGEX = /^https:\\/\\/js\\.stripe\\.com\\/v3\\/?(\\?.*)?$/;\nvar EXISTING_SCRIPT_MESSAGE = 'loadStripe.setLoadParameters was called but an existing Stripe.js script already exists in the document; existing script parameters will be used';\nvar findScript = function findScript() {\n  var scripts = document.querySelectorAll(\"script[src^=\\\"\".concat(V3_URL, \"\\\"]\"));\n\n  for (var i = 0; i < scripts.length; i++) {\n    var script = scripts[i];\n\n    if (!V3_URL_REGEX.test(script.src)) {\n      continue;\n    }\n\n    return script;\n  }\n\n  return null;\n};\n\nvar injectScript = function injectScript(params) {\n  var queryString = params && !params.advancedFraudSignals ? '?advancedFraudSignals=false' : '';\n  var script = document.createElement('script');\n  script.src = \"\".concat(V3_URL).concat(queryString);\n  var headOrBody = document.head || document.body;\n\n  if (!headOrBody) {\n    throw new Error('Expected document.body not to be null. Stripe.js requires a <body> element.');\n  }\n\n  headOrBody.appendChild(script);\n  return script;\n};\n\nvar registerWrapper = function registerWrapper(stripe, startTime) {\n  if (!stripe || !stripe._registerWrapper) {\n    return;\n  }\n\n  stripe._registerWrapper({\n    name: 'stripe-js',\n    version: \"1.35.0\",\n    startTime: startTime\n  });\n};\n\nvar stripePromise = null;\nvar loadScript = function loadScript(params) {\n  // Ensure that we only attempt to load Stripe.js at most once\n  if (stripePromise !== null) {\n    return stripePromise;\n  }\n\n  stripePromise = new Promise(function (resolve, reject) {\n    if (typeof window === 'undefined') {\n      // Resolve to null when imported server side. This makes the module\n      // safe to import in an isomorphic code base.\n      resolve(null);\n      return;\n    }\n\n    if (window.Stripe && params) {\n      console.warn(EXISTING_SCRIPT_MESSAGE);\n    }\n\n    if (window.Stripe) {\n      resolve(window.Stripe);\n      return;\n    }\n\n    try {\n      var script = findScript();\n\n      if (script && params) {\n        console.warn(EXISTING_SCRIPT_MESSAGE);\n      } else if (!script) {\n        script = injectScript(params);\n      }\n\n      script.addEventListener('load', function () {\n        if (window.Stripe) {\n          resolve(window.Stripe);\n        } else {\n          reject(new Error('Stripe.js not available'));\n        }\n      });\n      script.addEventListener('error', function () {\n        reject(new Error('Failed to load Stripe.js'));\n      });\n    } catch (error) {\n      reject(error);\n      return;\n    }\n  });\n  return stripePromise;\n};\nvar initStripe = function initStripe(maybeStripe, args, startTime) {\n  if (maybeStripe === null) {\n    return null;\n  }\n\n  var stripe = maybeStripe.apply(undefined, args);\n  registerWrapper(stripe, startTime);\n  return stripe;\n}; // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n// own script injection.\n\nvar stripePromise$1 = Promise.resolve().then(function () {\n  return loadScript(null);\n});\nvar loadCalled = false;\nstripePromise$1[\"catch\"](function (err) {\n  if (!loadCalled) {\n    console.warn(err);\n  }\n});\nvar loadStripe = function loadStripe() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  loadCalled = true;\n  var startTime = Date.now();\n  return stripePromise$1.then(function (maybeStripe) {\n    return initStripe(maybeStripe, args, startTime);\n  });\n};\n\nexport { loadStripe };\n","import {SET_EVITE_EVENT} from '~/CreateFabricInvitation/reducers/eviteEvent/constants';\nimport {formatTimezoneOffset, removeNestedProperty} from '~/common/utils';\nimport XDate from 'xdate';\nimport {\n  selectSelectedLiner,\n  selectSelectedStamp,\n  selectSelectedBackground,\n  selectSelectedEnvelope,\n} from '../reducers/fabricDesign/selectors';\nimport {updateEventIdInPathname} from '~/CreateFabricInvitation/utils/save';\nimport {fetchInvitationSummary} from '~/ViewInvitation/reducers/apiActions';\nimport CaptchaWrapper from '~/CreateFabricInvitation/components/Captcha/CaptchaWrapper';\nimport {\n  selectHostIds,\n  selectPendingHostIds,\n} from '../reducers/eviteEvent/selectors';\n\nlet captchaResponse;\n\nconst twoWeeksFromNow = () => {\n  let future = new XDate().addWeeks(2);\n  return future.toString('i').slice(0, 16) + formatTimezoneOffset();\n};\n\nexport const stateToBackendEventRepresentation = (state, sendInvitations) => {\n  const {\n    details,\n    giftingOptions,\n    fabricTemplate,\n    eviteEvent,\n    fabricDesign,\n    coverData,\n  } = state;\n  const background = selectSelectedBackground(state);\n  const stamp = selectSelectedStamp(state);\n  const liner = selectSelectedLiner(state);\n  const envelope = selectSelectedEnvelope(state);\n  let widgets = state.widgets;\n  const {\n    gift_registry_name,\n    gift_registry_urls,\n    pledgeling_data,\n  } = giftingOptions;\n\n  const host_ids = selectHostIds(state);\n  const pending_host_ids = selectPendingHostIds(state);\n\n  if (!fabricDesign.fabricArt?.objects?.length) {\n    Raven.setTagsContext({key: 'eventTime', value: new Date()});\n  }\n\n  const event = {\n    ...eviteEvent,\n    host_ids,\n    pending_host_ids,\n    origin: 21,\n    status: sendInvitations ? 'sending' : eviteEvent.status || 'draft',\n    //id: details.id,\n    template_name: fabricTemplate.templateName,\n    fabric_design_data: fabricDesign.fabricArt,\n    host_name: details.host,\n    phone_number: details.phoneNumber,\n    event_type: details.type,\n    cohost_name1: details.cohost.name,\n    cohost_email1: details.cohost.email,\n    guests_of_honor: {...details.guestsOfHonor},\n    location_name: details.location,\n    street_address: details.address.street,\n    city: details.address.city,\n    state: details.address.state,\n    zip_code: details.address.zip,\n    title: details.title,\n    message: details.notes,\n    start_datetime: details.start\n      ? XDate(details.start)\n          .toString('i')\n          .slice(0, 16) + formatTimezoneOffset()\n      : twoWeeksFromNow(),\n    end_datetime:\n      details.end &&\n      XDate(details.end)\n        .toString('i')\n        .slice(0, 16) + formatTimezoneOffset(),\n    stop_datetime:\n      details.stop &&\n      XDate(details.stop)\n        .toString('i')\n        .slice(0, 16) + +formatTimezoneOffset(),\n    known_timezone_name: coverData.known_timezone_name,\n    known_timezone_abbr: coverData.known_timezone_abbr,\n    // send_on: ,\n    gift_registry_urls,\n    gift_registry_name,\n    rsvp_off: details.rsvp_off,\n    gift_keywords: null,\n    gift_list_url: null,\n    wishlist: null,\n    options: {\n      ...eviteEvent.options,\n      ...giftingOptions.options,\n      event_option_allow_invite_more: false, // This will no longer be supported in Fabric invitations\n      // Remove rendered data so we don't overwrite what is on the server getting set asynchronously\n      rendered_image_filename: undefined,\n      rendered_image_gs_key: undefined,\n      rendered_image_url: undefined,\n      rendered_text_image_url: undefined,\n      custom_image_id: fabricDesign.uyoImageId || undefined,\n    },\n    is_fabric_premium: details.isPremium,\n    pledgeling_data,\n    pledgeling_new_api: true,\n    // fields to not send back\n    guessing_games_data: undefined,\n    sent_on: undefined,\n    last_updated: undefined,\n    date_created: undefined,\n  };\n  details.guestsOfHonor.update = false; // Only send update once on step 2\n  event.options.design = event.options.design || {};\n  event.used_as = eviteEvent.id ? event.used_as : fabricTemplate.usedAs;\n  const design = event.options.design;\n  if (envelope) {\n    design.envelope = envelope.id;\n    design.envelope_flap_down = envelope.flap_down_image;\n    design.envelope_flap_up = envelope.blank;\n    design.envelope_front = envelope.image;\n    design.name_style = {\n      // Text style for names on front of envelopes\n      align: 'center',\n      color: envelope.text_color,\n      font: 'JosefinSans-SemiBold',\n      position: {x: 0, x2: 605, y: 225, y2: 465},\n      size: 40,\n    };\n\n    if (liner) {\n      design.liner = liner.id;\n      for (let media of liner.media)\n        if (media.label === 'image') design.liner_image = media.url;\n    }\n    if (stamp) {\n      design.stamp = stamp.id;\n      for (let media of stamp.media)\n        if (media.label === 'image') design.stamp_image = media.url;\n    }\n    if (fabricDesign.backgroundId) {\n      design.background = fabricDesign.backgroundId;\n      for (let media of background.media)\n        if (media.label === 'mobile')\n          design.background_image_mobile = media.url;\n      for (let media of background.media)\n        if (media.label === 'desktop')\n          design.background_image_desktop = media.url;\n      design.background_color = null;\n    } else {\n      design.background = null;\n      design.background_image_mobile = null;\n      design.background_image_desktop = null;\n      design.background_color = fabricDesign.backgroundColor;\n    }\n  }\n  design.envelope_fabric_stickers = fabricDesign.envelopeStickers;\n  // Include flags for finishing any image uploads.\n  if (\n    fabricDesign.uyoImageId &&\n    fabricDesign.uyoImageId !== eviteEvent?.options?.custom_image_id\n  ) {\n    console.log(\n      'ADDING anonDyoImageKey FLAG FOR FINISHING.',\n      fabricDesign.uyoImageId\n    );\n    event.dyo = fabricDesign.uyoImageId;\n  }\n\n  // We don't need to send \"created\" fields to the BE since it does not make sense to update them\n  removeNestedProperty(widgets, 'created');\n\n  if (!event.tracking_data)\n    event.tracking_data = {gallery_category: details.tracking_gallery_category};\n\n  return {event, widgets};\n};\n\nexport const saveEventThunk = (\n  sendInvitations = false,\n  saveToBackend = true,\n  delayFetchSummary = 0\n) => async (dispatch, getState) => {\n  const eventId = getState().eviteEvent.id;\n  const {origin} = window.location;\n  const url = eventId\n    ? new URL(`/ajax/event/${eventId}/update/`, origin)\n    : new URL('/ajax/event/create/', origin);\n\n  const eventRepresentation = stateToBackendEventRepresentation(\n    getState(),\n    sendInvitations\n  );\n  // console.log('eventRepresentation: ', eventRepresentation);\n  let saveStatus;\n  if (saveToBackend) {\n    let resp;\n    try {\n      resp = await evite.fetch(url, {\n        method: 'POST',\n        credentials: 'include',\n        headers: {\n          'X-CSRFToken': evite.cookie('csrftoken'),\n          Accept: 'application/json',\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(eventRepresentation),\n      });\n\n      saveStatus = resp.status;\n\n      if (sendInvitations) {\n        const sendResponse = await evite.fetch('/event/send', {\n          method: 'POST',\n          credentials: 'include',\n          accept: 'application/json',\n          body: JSON.stringify({event_id: eventId, captcha: captchaResponse}),\n        });\n        const jsonResponse = await sendResponse.json();\n        if (sendResponse.status === 412) {\n          document.getElementById('evite-modal-container').style.display =\n            'flex';\n\n          return new Promise((resolve, reject) => {\n            new CaptchaWrapper({\n              challenge: jsonResponse,\n              onSubmit: (_response) => {\n                captchaResponse = Object.assign({}, _response);\n                captchaResponse.name = undefined;\n                resolve(captchaResponse);\n              },\n              onCancel: (err) => {\n                document.getElementById('evite-modal-container').style.display =\n                  'none';\n                reject();\n              },\n            }).show();\n          });\n        } else if (sendResponse.status === 400) {\n          resp.ok = false;\n        }\n      }\n    } catch (e) {\n      console.log('save failed', e);\n      alert('Save failed due to network error, please try again.');\n    }\n    if (!resp.ok) {\n      console.log('save returned failure', resp);\n      const {message} = await resp.json();\n      alert(`Save Failed: ${message}`);\n      throw message;\n    }\n    const results = await resp.json();\n\n    if (!eventId) updateEventIdInPathname(results.event.id);\n    window.evite_event = results.event;\n    dispatch({type: SET_EVITE_EVENT, payload: results.event});\n  } else {\n    window.evite_event = eventRepresentation.event;\n    dispatch({type: SET_EVITE_EVENT, payload: eventRepresentation.event});\n  }\n\n  if (window.evite_event) {\n    if (delayFetchSummary > 0) {\n      setTimeout(async () => {\n        await dispatch(fetchInvitationSummary(window.evite_event.id));\n      }, delayFetchSummary);\n    } else {\n      await dispatch(fetchInvitationSummary(window.evite_event.id));\n    }\n  }\n  return saveStatus;\n};\n","import urls from 'urls';\nimport {selectSelectedOffer} from '../reducers/review/selectors';\nimport {saveEventThunk} from '../api/event';\nimport {\n  SET_ORDER_DATE,\n  SET_PAYMENT_METHOD,\n} from '~/CreateFabricInvitation/reducers/review/constants';\nimport {pushDataLayerEventCache} from '../utils/dataTracking';\nimport CaptchaWrapper from '../components/Captcha/CaptchaWrapper';\n\nconst OFFER_LIST_NAME = 'greeting_card_2_1_pricing';\nimport {saveUserDataToLocalStorage} from '~/common/auth/utils';\nimport {userLoggedIn} from '~/CreateFabricInvitation/components/LoginModal/reducer';\n\nexport const getCalc = async (store) => {\n  const state = store.getState();\n  const eventId = state.eviteEvent.id;\n  const fabricGreetingCard = state.guests.fabricGreetingCard;\n\n  const url = `/ajax/payments/calc?event_id=${eventId}${\n    fabricGreetingCard ? `&offer_list_name=${OFFER_LIST_NAME}` : ''\n  }`;\n\n  const method = 'GET';\n  try {\n    const response = await evite.fetch(url, {\n      method,\n      headers: {\n        Accept: 'application/json',\n        'Content-Type': 'application/json',\n        'X-CSRFToken': evite.cookie('csrftoken'),\n      },\n    });\n    if (!response.ok) {\n      evite.error('Error retrieving offers:', response);\n      throw response;\n    }\n    return await response.json();\n  } catch (err) {\n    evite.error(err);\n    throw err;\n  }\n};\n\nexport const updateSelectedOffer = async (store, selectedOfferKey) => {\n  const state = store.getState();\n  const eventId = state.eviteEvent.id;\n  const fabricGreetingCard = state.guests.fabricGreetingCard;\n  const offerListName = state.review.calc.offerListName;\n\n  const postData = {\n    offer_data: {[selectedOfferKey]: 1},\n    offer_list_name: fabricGreetingCard\n      ? offerListName\n      : 'current_invitation_pricing',\n    num_guests_being_added: state.guests.guests.count,\n    event_id: eventId,\n  };\n\n  const url = urls.get('ajax_update_offers');\n  const response = await evite.fetch(url, {\n    method: 'post',\n    cache: 'no-cache',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n    },\n    body: JSON.stringify(postData),\n  });\n  const data = await response.json();\n\n  if (!response.ok) {\n    const error =\n      data.message ||\n      'Sorry there was an error - please wait a few minutes and try again';\n    evite.error(error);\n    throw data;\n  }\n  return data.calc;\n};\n\nexport const removeOffer = async (store) => {\n  const state = store.getState();\n  const eventId = state.eviteEvent.id;\n  if (!eventId) return; // Event has not been created yet; no event for API to reference\n  const fabricGreetingCard = state.guests.fabricGreetingCard;\n  const offerListName = state.review.calc.offerListName;\n\n  const postData = {\n    offer_list_name: fabricGreetingCard\n      ? offerListName\n      : 'current_invitation_pricing',\n    event_id: eventId,\n  };\n\n  const url = urls.get('ajax_downgrade');\n  const response = await evite.fetch(url, {\n    method: 'post',\n    cache: 'no-cache',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n    },\n    body: JSON.stringify(postData),\n  });\n\n  const data = await response.json();\n\n  if (!response.ok) {\n    const error =\n      data.message ||\n      'Sorry there was an error - please wait a few minutes and try again';\n    evite.error(error);\n    throw data;\n  }\n\n  state.eviteEvent.max_guest_list = data.event.max_guest_list;\n  state.eviteEvent.options.offers = data.event.options.offers;\n  state.eviteEvent.options.downgraded = data.event.options.downgraded;\n  state.eviteEvent.custom_logo = data.event.custom_logo;\n  state.eviteEvent.custom_logos = data.event.custom_logos;\n  state.eviteEvent.options.event_option_show_gifting =\n    data.event.options.event_option_show_gifting;\n};\n\nexport const checkoutInvitation = async (store, cardSourceId) => {\n  const state = store.getState();\n  const eventId = state.eviteEvent.id;\n  const selectedOffer = selectSelectedOffer(state);\n  const centsToBeCharged = state.review.calc?.centsToBeCharged;\n  const url = urls.get('premium_checkout', {event_id: eventId});\n  const data = {\n    event_id: eventId,\n    card_source: cardSourceId, // Source ID for newly entered card data (will bill card on user profile if not supplied)\n    card_token: undefined,\n    // captcha: undefined, // TODO: implement captcha modal\n    selected_offers: {[state.review.selectedOfferKey]: 1},\n    cents_to_be_charged: centsToBeCharged,\n  };\n\n  if (selectedOffer.productType === 'greeting_card_individual') {\n    data.external_virtual_quantity = state.review.calc?.numGuestsBeingAdded;\n  }\n\n  const response = await evite.fetch(url, {\n    method: 'POST',\n    credentials: 'include',\n    cache: 'no-cache',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n    },\n    body: JSON.stringify(data),\n  });\n  const jsonResponse = await response.json();\n  if (!response.ok || jsonResponse.purchase_response?.success === false) {\n    // check for captcha\n    if (response.status === 412) {\n      // alert('Captcha required, but not implemented yet - TODO');\n      // throw 'CAPTCHA_REQUIRED';\n      document.getElementById('evite-modal-container').style.display = 'flex';\n      return new Promise((resolve, reject) => {\n        new CaptchaWrapper({\n          challenge: jsonResponse,\n          onSubmit: (_response) => {\n            const captchaResponse = Object.assign({}, _response);\n            captchaResponse.name = undefined;\n            resolve(captchaResponse);\n          },\n          onCancel: (e) => {\n            reject();\n          },\n        }).show();\n      });\n    } else {\n      console.error(\n        \"Something went wrong with your card. Please double-check the fields you've entered for accurate information.\"\n      );\n      throw jsonResponse.message ||\n        \"Something went wrong with your card. Please double-check the fields you've entered for accurate information.\";\n    }\n  }\n  store.dispatch({\n    type: SET_ORDER_DATE,\n    payload: jsonResponse.send_response.created,\n  });\n  store.dispatch({\n    type: SET_PAYMENT_METHOD,\n    payload: 'STRIPE',\n  });\n  // The checkout adds a big cookie which can cause future page loads to fail\n  // Process and clear it.\n  pushDataLayerEventCache();\n  return jsonResponse;\n};\n\nexport const updateSelectedOffers = async (eviteEvent, calc, guests) => {\n  for (let key of Object.keys(calc.selectedOffers || {})) {\n    calc.selectedOffers[key] = 0;\n  }\n\n  if (!eviteEvent.id && !this.isStandalonePayment) {\n    // we can't update offers if we haven't created the event yet\n    return;\n  }\n\n  // updates event offers on the datastore with the currently selected offers\n  // this._setUpdating(true);\n  const errorDefault =\n    'Unknown error while updating your selection. Please check your network ' +\n    'connection and try again.';\n\n  try {\n    const body = new FormData();\n\n    body.append('offer_data', JSON.stringify(calc.selectedOffers));\n    body.append('offer_list_name', calc.offerListName);\n    body.append('num_guests_being_added', JSON.stringify(guests.guests.count));\n    body.append('event_id', eviteEvent.id);\n\n    const url = `${urls.get('ajax_update_offers')}`;\n    // const url = `${urls.get('ajax_update_offers')}${\n    //   autoApplyRedemptionCode ? '?auto_apply_redemption_code=true' : ''\n    // }`;\n    const response = await evite.fetch(url, {\n      method: 'post',\n      body: body,\n      credentials: 'include',\n      cache: 'no-cache',\n      headers: {\n        'X-CSRFToken': evite.cookie('csrftoken'),\n        Accept: 'application/json',\n      },\n    });\n    const data = await response.json();\n\n    if (!response.ok) {\n      evite.error('Failed Response', data.message || errorDefault);\n      // failedFetchModal(response, 'Error', error);\n      // this._setUpdating(false);\n      return;\n    } else {\n      return;\n    }\n  } catch (e) {\n    evite.error('Failed to update', e);\n    // failedFetchModal(null, 'Error', errorDefault);\n    // this._setUpdating(false);\n  }\n};\n\nexport const checkoutInvitationPaypal = async (store, paypalData, details) => {\n  const state = store.getState();\n  const eventId = state.eviteEvent.id;\n  const selectedOffer = selectSelectedOffer(state);\n  const centsToBeCharged = state.review.calc?.centsToBeCharged;\n  const url = urls.get('premium_checkout_paypal', {event_id: eventId});\n  const data = {\n    event_id: eventId,\n    card_source: undefined, // Source ID for newly entered card data (will bill card on user profile if not supplied)\n    card_token: undefined,\n    // captcha: undefined, // TODO: implement captcha modal\n    selected_offers: {[state.review.selectedOfferKey]: 1},\n    cents_to_be_charged: centsToBeCharged,\n    data: JSON.stringify(paypalData),\n    checkout_type: 'paypal',\n    stripe_charge_id: '',\n  };\n\n  if (selectedOffer.productType === 'greeting_card_individual') {\n    data.external_virtual_quantity = state.review.calc?.numGuestsBeingAdded;\n  }\n\n  const response = await evite.fetch(url, {\n    method: 'POST',\n    credentials: 'include',\n    cache: 'no-cache',\n    headers: {\n      Accept: 'application/json',\n      'Content-Type': 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n    },\n    body: JSON.stringify(data),\n  });\n  const jsonResponse = await response.json();\n  if (!response.ok || jsonResponse.purchase_response?.success === false) {\n    if (response.status === 412) {\n      // throw 'CAPTCHA_REQUIRED';\n      document.getElementById('evite-modal-container').style.display = 'flex';\n      return new Promise((resolve, reject) => {\n        new CaptchaWrapper({\n          challenge: jsonResponse,\n          onSubmit: (_response) => {\n            const captchaResponse = Object.assign({}, _response);\n            captchaResponse.name = undefined;\n            resolve(captchaResponse);\n          },\n          onCancel: (e) => {\n            reject();\n          },\n        }).show();\n      });\n    } else {\n      throw jsonResponse.message ||\n        \"Something went wrong with your card. Please double-check the fields you've entered for accurate information.\";\n    }\n  }\n  store.dispatch({\n    type: SET_ORDER_DATE,\n    payload: jsonResponse.send_response.created,\n  });\n  store.dispatch({\n    type: SET_PAYMENT_METHOD,\n    payload: 'PAYPAL',\n  });\n\n  // The checkout adds a big cookie which can cause future page loads to fail\n  // Process and clear it.\n  pushDataLayerEventCache();\n  return jsonResponse;\n};\n// /**\n//  * Sets (or removes) the promotion on the greetingCard event\n//  * @param greetingCardId\n//  * @param promocode\n//  * @returns {Promise<calc Object>}\n//  */\n\nexport const finishAndSend = async (store, event) => {\n  let resp = await store.dispatch(saveEventThunk(true));\n\n  // On some occasions, there can be more than one captcha\n  let numCaptchas = 0;\n  while (resp?.type === 'recaptcha' || resp?.type === 'sms') {\n    resp = await store.dispatch(saveEventThunk(true));\n    if (++numCaptchas > 2) {\n      break;\n    }\n  }\n\n  // Log transaction into datalayer\n  const isPremium = store.getState().details.isPremium;\n  if (isPremium) {\n    const transactionData = store.getState().review?.purchase_transaction_data;\n    if (\n      transactionData &&\n      (transactionData.stripe_charge ||\n        transactionData.is_stripe_charge ||\n        transactionData.purchase_platform == 'paypal')\n    ) {\n      window.dataLayer.push({\n        event: 'fabric_create_transaction_complete',\n        line_items: transactionData.line_items\n          ? transactionData.line_items.map((item) =>\n              item.invoice_description ? item.invoice_description : item.name\n            )\n          : undefined,\n        total: transactionData.amount_display.trim(),\n        is_fabric_premium: event.is_fabric_premium,\n        tracking_product_type: window.tracking_product_type,\n      });\n    }\n  }\n\n  // Log draft completion and event send into dataLayer\n  if (event.status !== 'sending') {\n    if (event.is_fabric_premium) {\n      window.dataLayer.push({\n        event: 'fabric_create_premium_complete',\n        is_fabric_premium: event.is_fabric_premium,\n        tracking_product_type: window.tracking_product_type,\n      });\n    } else {\n      window.dataLayer.push({\n        event: 'fabric_create_free_complete',\n        is_fabric_premium: event.is_fabric_premium,\n        tracking_product_type: window.tracking_product_type,\n      });\n    }\n  }\n\n  updateUser(store);\n};\n\nexport const updateUser = async (store) => {\n  const url = urls.get('ajax_get_user');\n  const response = await evite.fetch(url, {\n    method: 'get',\n    credentials: 'include',\n    cache: 'no-cache',\n    headers: {\n      'X-CSRFToken': evite.cookie('csrftoken'),\n      Accept: 'application/json',\n    },\n  });\n  const data = await response.json();\n  if (!response.ok) throw response;\n  saveUserDataToLocalStorage(data);\n  await store.dispatch(\n    userLoggedIn(\n      data.user_id,\n      data.full_name,\n      data.subscription_plan_name,\n      data.email,\n      data.avatar_disk,\n      data.image_url,\n      data.initials,\n      data.first_name\n    )\n  );\n};\n\nexport const applyPromotion = async (\n  store,\n  eviteEventId,\n  promocode,\n  offerName\n) => {\n  const {\n    guests: {fabricGreetingCard},\n    review: {\n      calc: {offerListName},\n    },\n  } = store.getState();\n\n  if (!promocode) {\n    // Removing the promocode from the event\n    const url = `${urls.get('ajax_apply_promotion')}?event_id=${eviteEventId}${\n      fabricGreetingCard ? `&offer_list_name=${offerListName}` : ''\n    }`;\n    const response = await evite.fetch(url, {\n      method: 'delete',\n      credentials: 'include',\n      cache: 'no-cache',\n      headers: {\n        'X-CSRFToken': evite.cookie('csrftoken'),\n        Accept: 'application/json',\n      },\n    });\n    const data = await response.json();\n    if (!response.ok) throw response;\n    return data.calc;\n  } else {\n    // Adding a promocode to the event\n    const body = new FormData();\n    body.append('promocode', promocode);\n    body.append('event_id', eviteEventId);\n    body.append(\n      'offer_list_name',\n      fabricGreetingCard ? offerListName : offerName\n    );\n\n    const url = urls.get('ajax_apply_promotion');\n\n    const response = await evite.fetch(url, {\n      method: 'post',\n      body: body,\n      credentials: 'include',\n      cache: 'no-cache',\n      headers: {\n        'X-CSRFToken': evite.cookie('csrftoken'),\n        Accept: 'application/json',\n      },\n    });\n    const data = await response.json();\n    if (!response.ok) {\n      throw data || response;\n    }\n    return data;\n  }\n};\n","import React from 'react';\nimport './Box.sass';\n\nexport default function Box({\n  children,\n  center,\n  className = '',\n  padding = 16,\n  borderRadius = 4,\n}) {\n  return (\n    <div\n      className={`box ${center ? 'box-center' : ''} ${className}`}\n      style={{padding, borderRadius}}\n    >\n      {children}\n    </div>\n  );\n}\n","import EviteModal from '../../../modal/evite_modal';\nimport urls from 'urls';\n\nclass CaptchaWrapper {\n  constructor(settings) {\n    this.settings = {\n      width: '520px',\n      ...settings,\n    };\n    if (this.settings.challenge.type === 'sms') {\n      this.settings.url = urls.get('sms_captcha');\n    } else if (this.settings.challenge.type === 'ad') {\n      this.settings.url = urls.get('ad_captcha');\n    } else {\n      this.settings.url = urls.get('recaptcha');\n    }\n    if (this.settings.challenge.captcha_event) {\n      this.settings.url =\n        this.settings.url + this.settings.challenge.captcha_event + '/';\n      if (this.settings.challenge.retry) {\n        this.settings.url = this.settings.url + 'retry/';\n      }\n    }\n    this.settings.url_parameters = {\n      challenge: this.settings.challenge,\n    };\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default CaptchaWrapper;\n","import React, {useCallback} from 'react';\nimport './ColorUnit.sass';\n\nexport default function ColorUnit({\n  color,\n  height = 32,\n  width = 32,\n  onClick,\n  square = false,\n  isActive,\n  dataQaId,\n  disabled = false,\n}) {\n  const onClickHandler = useCallback(() => {\n    onClick && onClick(color);\n  }, []);\n\n  return (\n    <div\n      role={'button'}\n      className={`colors_unit ${onClick && 'colors_unit--clickable'} ${square &&\n        'colors_unit--square'} ${isActive && 'colors_unit--active'}\n      ${disabled && 'colors_unit--disabled'}`}\n      style={{backgroundColor: color, height, width}}\n      title={color}\n      onClick={disabled ? undefined : onClickHandler}\n      data-qa-id={dataQaId}\n    />\n  );\n}\n","import React, {useCallback, useMemo, useState} from 'react';\nimport ColorUnit from '~/CreateFabricInvitation/components/ColorUnit/ColorUnit';\nimport './Colors.sass';\n\nexport default function Colors({\n  colors,\n  onClick,\n  square = false,\n  highlight = true,\n  className = '',\n  height = 32,\n  width = 32,\n  mobile,\n  disabled = false,\n}) {\n  const [selectedColor, setSelectedColor] = useState('');\n\n  const onClickHandler = useCallback(\n    (value) => {\n      setSelectedColor(value);\n      onClick(value);\n    },\n    [onClick]\n  );\n\n  const colorsMemo = useMemo(() => {\n    return colors?.map((color) => (\n      <ColorUnit\n        color={color}\n        key={color}\n        onClick={onClickHandler}\n        square={square}\n        isActive={selectedColor === color && highlight}\n        height={height}\n        width={width}\n        disabled={disabled}\n        dataQaId={`step1-textcolor-${color}`}\n      />\n    ));\n  }, [colors, selectedColor, disabled]);\n\n  if (colors.length === 0) {\n    return null;\n  }\n\n  return (\n    <div className={`colors ${className} ${mobile && 'colors--mobile'}`}>\n      {colorsMemo}\n    </div>\n  );\n}\n","import {Typography} from '~/common/_pb_components/atoms/Typography';\nimport Colors from './Colors';\n\nexport const RecentColors = ({colors, onClick, highlight, disabled}) => {\n  return (\n    <div className=\"color-picker__recent-colors\">\n      <Typography variant=\"label3\" color=\"pebble\">\n        Recently Used\n      </Typography>\n      <Colors\n        colors={colors}\n        onClick={onClick}\n        highlight={highlight}\n        disabled={disabled}\n      />\n    </div>\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const ContentAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"Content\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"Content\" */ '~/CreateFabricInvitation/components/Content/Content'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React, {useEffect, useRef} from 'react';\nimport {useEnvelope} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useEnvelope';\nimport {StickersCanvas} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StickersCanvas';\nimport './Envelope.sass';\nimport {useSelector} from 'react-redux';\nimport {\n  selectIsPremium,\n  selectIsProOrPartyPass,\n} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {useNavigator} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {selectLoaded} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nexport const Envelope = ({\n  id,\n  type,\n  onLoad,\n  redirectTo,\n  message,\n  className,\n  selectedLiner,\n  selectedStamp,\n  style = {},\n  canvas = false,\n  parentNode = '',\n  forceShowEnvelope = false,\n}) => {\n  const ref = useRef();\n  const isPremium = useSelector(selectIsPremium);\n  const {selectedEnvelope} = useEnvelope();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const loaded = useSelector(selectLoaded);\n  const isProOrPartyPass = useSelector(selectIsProOrPartyPass);\n  const isMobile = !isDesktop;\n  const navigate = useNavigator({\n    isMobile,\n    disableAutoOpenEditor: redirectTo === Sections.CARD_DESIGN,\n  });\n\n  useEffect(() => {\n    if (ref.current) {\n      const setCurrentDimensions = () => {\n        const envelopeSizer = document.getElementById(parentNode);\n\n        if (isMobile && envelopeSizer) {\n          ref.current.style.height = `${envelopeSizer.offsetWidth}px`;\n          ref.current.style.width = `${envelopeSizer.offsetHeight}px`;\n        }\n      };\n\n      setCurrentDimensions();\n\n      window.addEventListener('resize', setCurrentDimensions);\n\n      return () => {\n        window.removeEventListener('resize', setCurrentDimensions);\n      };\n    }\n  }, [ref.current, isMobile]);\n\n  return (\n    (isPremium || isProOrPartyPass || forceShowEnvelope) && (\n      <div\n        ref={ref}\n        onClick={loaded && redirectTo ? () => navigate(redirectTo) : undefined}\n        className={`envelope_image__wrapper envelope_image__wrapper__${type} ${redirectTo &&\n          'envelope_image__wrapper--clickable'} ${!loaded &&\n          'envelope_image__wrapper--clickable--disabled'} ${className}`}\n        style={style}\n      >\n        {selectedEnvelope && (\n          <img\n            src={selectedEnvelope[type]}\n            className={`envelope_image`}\n            id={id}\n            onLoad={onLoad}\n          />\n        )}\n        {selectedLiner && (\n          <img src={selectedLiner} className=\"envelope_image__wrapper__liner\" />\n        )}\n        {selectedStamp && (\n          <img className=\"envelope_image__wrapper__stamp\" src={selectedStamp} />\n        )}\n        {message && (\n          <div className=\"envelope_image__wrapper__text\">\n            <span style={{color: selectedEnvelope?.text_color}}>{message}</span>\n          </div>\n        )}\n        {canvas && (\n          <StickersCanvas className=\"envelope_image__wrapper__canvas\" />\n        )}\n      </div>\n    )\n  );\n};\n","import React, {useCallback, useRef, useState} from 'react';\nimport {HexColorPicker} from 'react-colorful';\nimport {useSelector} from 'react-redux';\nimport {Popover} from 'react-tiny-popover';\nimport {PB_EyeDrop} from '~/common/svg/PB_EyeDrop';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nimport './EyeDropper.sass';\n\nexport function EyeDropper({color, onChange, onConfirmColor}) {\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const [isVisible, setIsVisible] = useState(false);\n  const ref = useRef();\n\n  const toggleVisibility = useCallback(() => {\n    setIsVisible((prevState) => {\n      if (prevState) {\n        onConfirmColor();\n      }\n      return !prevState;\n    });\n  }, [onConfirmColor]);\n\n  const handleColorChange = useCallback(\n    (value) => {\n      onChange(value);\n    },\n    [onChange]\n  );\n\n  const handleButtonClick = useCallback(() => {\n    if (!editorDisabled) {\n      toggleVisibility();\n    }\n  }, [editorDisabled, toggleVisibility]);\n\n  return (\n    <Popover\n      ref={ref}\n      isOpen={isVisible}\n      positions={['top', 'bottom', 'left', 'right']}\n      onClickOutside={toggleVisibility}\n      content={<HexColorPicker color={color} onChange={handleColorChange} />}\n      containerClassName=\"eye_dropper\"\n      clickOutsideCapture\n    >\n      <button\n        className=\"eye_dropper--button unstyled-button\"\n        onClick={editorDisabled ? undefined : handleButtonClick}\n        disabled={editorDisabled}\n        data-qa-id=\"step1-textcolor-add\"\n      >\n        <PB_EyeDrop ratio={1} />\n      </button>\n    </Popover>\n  );\n}\n","import React from 'react';\nimport './Group.sass';\n\nexport default function Group({children}) {\n  return <div className={'group'}>{children}</div>;\n}\n","import {Typography} from '~/common/_pb_components/atoms/Typography';\nimport React from 'react';\nimport './Header.sass';\n\nexport default function Header({title, extra, dark = false}) {\n  return (\n    <div className={'header'}>\n      <Typography as=\"h1\" variant=\"label2\" color={dark ? 'charcoal' : 'pebble'}>\n        {title}\n      </Typography>\n      <div className={'header__extra'}>{extra}</div>\n    </div>\n  );\n}\n","import React, {useCallback, useState} from 'react';\nimport './IconUnit.sass';\n\nexport default function IconUnit({\n  icon,\n  height = 32,\n  width = 32,\n  onClick,\n  square = false,\n  isActive,\n  id = null,\n  disabled = false,\n}) {\n  const [loading, setLoading] = useState(true);\n  const onClickHandler = useCallback(() => {\n    !isActive && !disabled && onClick && onClick(icon, id);\n  }, [isActive, icon, id, onClick]);\n\n  return (\n    <div\n      className=\"icons_unit_wrapper\"\n      style={{height, width, position: 'relative', overflow: 'hidden'}}\n    >\n      {loading && (\n        <div style={{height, width}} className=\"icons_unit icons_unit--loader\">\n          <span className=\"evt-spinner inline\" />\n        </div>\n      )}\n      <img\n        className={`icons_unit ${onClick && 'icons_unit--clickable'} ${square &&\n          'icons_unit--square'} ${isActive && 'icons_unit--active'} ${loading &&\n          'icons_unit--hidden'} ${disabled && 'icons_unit--disabled'}`}\n        style={{height, width}}\n        onClick={onClickHandler}\n        src={icon}\n        onLoad={() => setLoading(false)}\n      />\n    </div>\n  );\n}\n","import React, {useCallback, useMemo} from 'react';\nimport IconUnit from '~/CreateFabricInvitation/components/IconUnit/IconUnit';\nimport './Icons.sass';\n\nexport default function Icons({\n  icons,\n  onClick,\n  square = false,\n  selectedIcon,\n  height = 32,\n  width = 32,\n  className,\n  mobile,\n}) {\n  const onClickHandler = useCallback(onClick, [onClick]);\n\n  const iconsMemo = useMemo(() => {\n    return icons\n      ?.filter(Boolean)\n      ?.map((icon) => (\n        <IconUnit\n          key={icon}\n          icon={icon}\n          onClick={onClickHandler}\n          square={square}\n          isActive={selectedIcon === icon}\n          height={height}\n          width={width}\n        />\n      ));\n  }, [selectedIcon, square, height, width, icons]);\n  return (\n    <div\n      className={`'icons ${className && className} ${mobile &&\n        'icons--mobile'}`}\n    >\n      {iconsMemo}\n    </div>\n  );\n}\n","import React from 'react';\nimport {useDispatch} from 'react-redux';\nimport {useSelector} from 'react-redux';\nimport {userLoggedIn, hideLoginModal} from './reducer';\nimport {LoginWrapper} from '~/LoginModal/LoginWrapper';\nimport {useCurrentRoute} from '~/CreateFabricInvitation/navigation';\n\nexport const LoginModalReduxWrapper = () => {\n  const dispatch = useDispatch();\n  const {path} = useCurrentRoute();\n  const showModal = useSelector((state) => state.loginModal.showLoginModal);\n\n  if (path !== 'customize') return null;\n  return (\n    <>\n      <div\n        className={\n          !showModal\n            ? 'login-modal-background bg-hidden'\n            : 'login-modal-background bg-visible'\n        }\n      />\n      <div className={`meganav-auth-slideout ${showModal ? 'open' : ''}`}>\n        <LoginWrapper\n          onSignupSuccess={(\n            userId,\n            fullName,\n            subscriptionPlanName,\n            email,\n            avatarDisk,\n            imgUrl,\n            initials,\n            firstName\n          ) =>\n            dispatch(\n              userLoggedIn(\n                userId,\n                fullName,\n                subscriptionPlanName,\n                email,\n                avatarDisk,\n                imgUrl,\n                initials,\n                firstName\n              )\n            )\n          }\n          onLoginSuccess={(\n            userId,\n            fullName,\n            subscriptionPlanName,\n            email,\n            avatarDisk,\n            imgUrl,\n            initials,\n            firstName\n          ) =>\n            dispatch(\n              userLoggedIn(\n                userId,\n                fullName,\n                subscriptionPlanName,\n                email,\n                avatarDisk,\n                imgUrl,\n                initials,\n                firstName\n              )\n            )\n          }\n          onCloser={() => dispatch(hideLoginModal())}\n        />\n      </div>\n    </>\n  );\n};\n","import * as constants from './constants';\n\nexport const showLoginModal = () => {\n  return {\n    type: constants.SHOW_LOGIN_MODAL,\n  };\n};\n\nexport const hideLoginModal = () => {\n  return {\n    type: constants.HIDE_LOGIN_MODAL,\n  };\n};\n\nexport const userLoggedIn = (\n  userId,\n  userName,\n  subscriptionPlanName,\n  email,\n  avatarDisk,\n  imgUrl,\n  initials,\n  firstName\n) => {\n  return {\n    type: constants.USER_LOGGED_IN,\n    userId,\n    userName,\n    subscriptionPlanName,\n    email,\n    avatarDisk,\n    imgUrl,\n    initials,\n    firstName,\n  };\n};\n","export const SHOW_LOGIN_MODAL = 'evite/*/LOGIN_MODAL/SHOW';\nexport const HIDE_LOGIN_MODAL = 'evite/*/LOGIN_MODAL/HIDE';\nexport const USER_LOGGED_IN = 'evite/*/LOGIN_MODAL/USER_LOGGED_IN';\n","export * from './constants.js';\nexport * from './reducer.js';\nexport * from './actions.js';\n","import * as constants from './constants';\n\nlet initialState = {\n  showLoginModal: false,\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case constants.USER_LOGGED_IN:\n    case constants.HIDE_LOGIN_MODAL: {\n      return {\n        showLoginModal: false,\n      };\n    }\n    case constants.SHOW_LOGIN_MODAL: {\n      return {\n        showLoginModal: true,\n      };\n    }\n    default: {\n      return state;\n    }\n  }\n};\n","import React, {useContext, useState} from 'react';\nimport {Diamond} from '~/common/svg/Diamond';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {useSelector, useStore} from 'react-redux';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {\n  navigateToRoute,\n  useCurrentRoute,\n} from '~/CreateFabricInvitation/navigation';\nimport './NavHeader.sass';\nimport {eventStepCount} from '~/CreateFabricInvitation/navigation/createSteps';\nimport {ProgressBar} from './ProgressBar';\nimport {ConfirmLeaveModalContainer} from '../../navigation/ConfirmLeaveModal';\nimport {eventIsPremium} from '../../reducers/details/selectors';\nimport {\n  selectCurrentSection,\n  selectPristine,\n  selectPristineUyo,\n  selectUsedPremiumFeature,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {OnboardingModalButton} from '~/CreateFabricInvitation/components/NavHeader/OnboadingModalButton/OnboardingModalButton';\nimport {saveEventThunk} from '~/CreateFabricInvitation/api/event';\nimport {InjectableMegaNav} from '~/common/_pb_components/organisms/InjectableMegaNav';\nimport {SimpleNav} from '~/common/_pb_components/organisms/SimpleNav';\nimport {\n  isWebview,\n  webViewModalShowing,\n  webViewPendingUpgradeToPremium,\n} from '~/CreateFabricInvitation/webview/webview';\nimport {getEventId} from '~/CreateFabricInvitation/reducers/eviteEvent/selectors';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useNavigator} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {REVERT_TO_BASIC} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {ExitPremiumPreviewModal} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/ExitPremiumPreviewModal/ExitPremiumPreviewModal';\nimport {UpsellModal} from '~/CreateFabricInvitation/components/UpsellModal/UpsellModal';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\nimport {removeOffer} from '~/CreateFabricInvitation/api/review';\nimport {SET_UPSELL_CONFIRMED} from '~/CreateFabricInvitation/reducers/modals';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {getEventStepsType} from '~/common/fabric/EventGuests/components/DisplayCondition/addGuestsCondition';\n\nexport const NavHeader = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const currentRoute = useCurrentRoute();\n  const store = useStore();\n  const [showLeaveModal, setShowLeaveModal] = useState(false);\n  const [showUpsellModal, setShowUpsellModal] = useState(false);\n  const [\n    showExitPremiumPreviewModal,\n    setShowExitPremiumPreviewModal,\n  ] = useState(false);\n  const isPremium = useSelector(eventIsPremium);\n  const usedPremiumFeature = useSelector(selectUsedPremiumFeature);\n  const showSteps = currentRoute.meta.countSteps;\n  const currentSection = useSelector(selectCurrentSection);\n\n  const pristine = useSelector(selectPristine);\n  const pristineUyo = useSelector(selectPristineUyo);\n  const hasBeenSaved = !!useSelector(getEventId);\n\n  const navigate = useNavigator({\n    isMobile: !isDesktop,\n    disableAutoOpenEditor: currentSection === Sections.CARD_DESIGN,\n  });\n\n  const eventStepsType = useSelector(getEventStepsType);\n  const totalSteps = eventStepCount[eventStepsType];\n\n  const simpleNavObj = {\n    prev: {\n      onClick: () => {\n        store.dispatch({\n          type: UPDATE_EVENT_DETAILS,\n          payload: {preventUpdateModal: true},\n        });\n        navigateToRoute('back', store);\n      },\n      text: 'Back',\n      qaId: 'upsell-back',\n      buttonVariant: 'secondary',\n    },\n    next: {\n      onClick: () => {\n        store.dispatch({\n          type: UPDATE_EVENT_DETAILS,\n          payload: {preventUpdateModal: true},\n        });\n        navigateToRoute('next', store);\n      },\n      text: 'Skip',\n      qaId: 'upsell-next',\n      buttonVariant: 'secondary',\n    },\n  };\n\n  const toggleUpsellModal = (changeToState) => {\n    if (changeToState) {\n      webViewModalShowing('upsell');\n    }\n    setShowUpsellModal(changeToState);\n  };\n\n  const downgradeIfDismissCheckout = () => {\n    // If we dismiss the checkout, we should clear the\n    // offers from the cart as well\n    if (currentRoute.name === 'review' && isPremium) removeOffer(store);\n  };\n\n  const onClickCloseBtn = () => {\n    const uyoImage = canvas\n      ?.getObjects()\n      ?.find((obj) => obj.type === 'uYOImage');\n    const rect = canvas?.getObjects()?.find((obj) => obj.type === 'rect');\n    let isUyo = false;\n    if ((!rect && uyoImage) || uyoImage?.isError) {\n      isUyo = true;\n    }\n    if (pristine && (!isUyo || pristineUyo)) {\n      return navigateToRoute('exit', store, true);\n    }\n\n    return setShowLeaveModal(true);\n  };\n\n  if (currentRoute.showMegaNav) {\n    return <InjectableMegaNav />;\n  }\n  if (currentRoute.showSimpleNav) {\n    return <SimpleNav prev={simpleNavObj.prev} next={simpleNavObj.next} />;\n  }\n\n  const onClosePremiumPreviewClick = () => {\n    setShowExitPremiumPreviewModal(true);\n  };\n\n  const upgradeToPremium = () => {\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {isPremium: true, hideUpsell: true},\n    });\n    store.dispatch({\n      type: SET_UPSELL_CONFIRMED,\n      payload: true,\n    });\n    window.dataLayer.push({\n      event: `fabric_create_upgrade_${currentRoute.name}`,\n    });\n    webViewPendingUpgradeToPremium(true);\n    toggleUpsellModal(false);\n  };\n\n  const defaultNavElem = (\n    <nav\n      className={`fabric-header__nav${\n        currentRoute.id > totalSteps ? ' frp' : ''\n      }`}\n    >\n      <div className=\"fabric-header__left-wrap\">\n        <Button\n          id=\"continueBtn\"\n          data-qa-id=\"exit-create\"\n          className=\"fabric-header__back\"\n          variant=\"link\"\n          size=\"small\"\n          onClick={onClickCloseBtn}\n        >\n          <PB_CloseLine ratio={0.75} />\n        </Button>\n        <div className=\"fabric-header__step-wrap\">\n          <Typography\n            variant=\"list2\"\n            size=\"large\"\n            color=\"pebble\"\n            classNames=\"fabric-header__step-count\"\n          >\n            {isPremium && (\n              <Diamond\n                ratio={16 / 14.0}\n                className=\"fabric-header__is-premium\"\n              />\n            )}\n            {isPremium && showSteps && ' '}\n            {showSteps ? `${currentRoute.id} of ${totalSteps}:` : ''}\n          </Typography>\n          <Typography\n            variant=\"list2\"\n            as=\"h1\"\n            size=\"large\"\n            classNames=\"fabric-header__step-name\"\n          >\n            &nbsp;\n            {currentRoute.displayName || ''}\n          </Typography>\n        </div>\n        {currentRoute.linkPreview && (\n          <Button\n            id=\"continueBtn\"\n            data-qa-id=\"continueBtn\"\n            className=\"fabric-header__continue\"\n            variant=\"link\"\n            size=\"large\"\n            onClick={() => {\n              store.dispatch(saveEventThunk(false, false));\n              navigateToRoute('preview', store);\n            }}\n          >\n            Preview\n          </Button>\n        )}\n        {currentRoute.linkBack && (\n          <Button\n            id=\"continueBtn\"\n            data-qa-id=\"continueBtn\"\n            className=\"fabric-header__continue\"\n            variant=\"link\"\n            size=\"large\"\n            onClick={() => navigateToRoute('back', store)}\n          >\n            Back\n          </Button>\n        )}\n      </div>\n      <OnboardingModalButton visible={currentRoute.id === 1 && !isWebview()} />\n    </nav>\n  );\n\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC();\n\n  return (\n    <>\n      <div className=\"fabric-header__wrapper\">\n        <header\n          className={`fabric-header${\n            currentRoute.id > totalSteps ? ' frp' : ''\n          }${\n            currentRoute.id === 1 && !isPremium && usedPremiumFeature\n              ? ' premium-preview-header'\n              : ''\n          }`}\n        >\n          {inPremiumPricingVariationC && !isWebview() && isDesktop ? (\n            !isPremium && usedPremiumFeature && currentRoute.id === 1 ? (\n              <nav className=\"fabric-header__premium_preview_nav\">\n                <div className=\"premium-preview\">\n                  <Diamond ratio={1.6} />\n                  <Typography\n                    variant=\"paragraph2\"\n                    classNames=\"premium-preview-text\"\n                  >\n                    Premium Preview\n                  </Typography>\n                </div>\n                <div className=\"upgrade-to-save\">\n                  <Button\n                    data-qa-id=\"upgrade-to-save\"\n                    data-impression-tracking=\"true\"\n                    variant=\"link\"\n                    size=\"large\"\n                    onClick={() => toggleUpsellModal(true)}\n                  >\n                    Upgrade to Save\n                  </Button>\n                  {!isDesktop && (\n                    <Button\n                      variant=\"link\"\n                      data-qa-id=\"close-premium-preview\"\n                      onClick={onClosePremiumPreviewClick}\n                    >\n                      <PB_CloseLine ratio={0.75} />\n                    </Button>\n                  )}\n                </div>\n                {isDesktop && (\n                  <Button\n                    variant=\"link\"\n                    data-qa-id=\"close-premium-preview\"\n                    className=\"close-premium-preview-desktop\"\n                    onClick={onClosePremiumPreviewClick}\n                  >\n                    <PB_CloseLine ratio={0.75} />\n                  </Button>\n                )}\n              </nav>\n            ) : (\n              defaultNavElem\n            )\n          ) : (\n            defaultNavElem\n          )}\n        </header>\n        {(!inPremiumPricingVariationC ||\n          isPremium ||\n          !usedPremiumFeature ||\n          currentRoute.id !== 1) && <ProgressBar />}\n      </div>\n      {showLeaveModal && (\n        <ConfirmLeaveModalContainer\n          isFirstStep={!hasBeenSaved}\n          isEditingFlow={currentRoute.meta.editing}\n          leave={() => {\n            setShowLeaveModal(false);\n            downgradeIfDismissCheckout();\n            navigateToRoute('exit', store, true);\n          }}\n          saveAndLeave={() => {\n            // If step 2 create flow, pass force as a 3rd option: 'saveAndExit' which will save first\n            const force =\n              currentRoute.meta.creating && currentRoute.id === 2\n                ? 'saveAndExit'\n                : false;\n            setShowLeaveModal(false);\n            navigateToRoute('exit', store, force);\n          }}\n          cancelLeave={() => setShowLeaveModal(false)}\n        />\n      )}\n      {inPremiumPricingVariationC && (\n        <>\n          {showUpsellModal && (\n            <UpsellModal\n              noAutoRestore\n              toggleUpsellModal={() => toggleUpsellModal(!showUpsellModal)}\n              closeOverlay={() => {\n                setShowUpsellModal(false);\n                setShowExitPremiumPreviewModal(true);\n              }}\n              onConfirmAction={upgradeToPremium}\n            />\n          )}\n          {showExitPremiumPreviewModal && (\n            <ExitPremiumPreviewModal\n              closeOverlay={() => {\n                setShowExitPremiumPreviewModal(false);\n              }}\n              onConfirmAction={() => {\n                store.dispatch({\n                  type: REVERT_TO_BASIC,\n                });\n                webViewPendingUpgradeToPremium(false);\n                navigate(Sections.CARD_DESIGN);\n                setShowExitPremiumPreviewModal(false);\n              }}\n            />\n          )}\n        </>\n      )}\n    </>\n  );\n};\n","import {PB_QuestionCircleUnfilled} from '~/common/svg/PB_QuestionCircleUnfilled';\nimport {useDispatch} from 'react-redux';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {useCallback} from 'react';\n\nexport function OnboardingModalButton({visible}) {\n  const dispatch = useDispatch();\n\n  const onClickHandler = useCallback(() => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {forceShowOnboardingModal: true},\n    });\n  }, []);\n\n  if (!visible) {\n    return null;\n  }\n\n  return (\n    <div>\n      <button\n        className=\"unstyled-button\"\n        data-qa-id=\"onboard-open\"\n        onClick={onClickHandler}\n      >\n        <PB_QuestionCircleUnfilled />\n      </button>\n    </div>\n  );\n}\n","import React from 'react';\nimport {useCurrentRoute} from '~/CreateFabricInvitation/navigation';\nimport {eventStepCount} from '~/CreateFabricInvitation/navigation/createSteps';\nimport './NavHeader.sass';\nimport {useSelector} from 'react-redux';\nimport {getEventStepsType} from '~/common/fabric/EventGuests/components/DisplayCondition/addGuestsCondition';\n\nexport const ProgressBar = (props) => {\n  const {id} = useCurrentRoute();\n\n  const eventType = useSelector(getEventStepsType);\n  const totalSteps = eventStepCount[eventType];\n\n  return (\n    <progress\n      className=\"fabric-header__progress-bar\"\n      min=\"0\"\n      max=\"100\"\n      value={(id / totalSteps) * 100}\n    />\n  );\n};\n","import React, {createContext, useContext, useEffect, useState} from 'react';\n\nexport const RoktLauncherContext = createContext(null);\nexport const RoktLauncherContextConsumer = RoktLauncherContext.Consumer;\n\nexport function useRoktLauncher() {\n  return useContext(RoktLauncherContext);\n}\n\nexport function RoktLauncherContextProvider({\n  children,\n  accountId,\n  sandbox = false,\n}) {\n  const [launcher, setLauncher] = useState(null);\n\n  useEffect(() => {\n    (async () => {\n      // Guards against Rokt script being still loaded into the application when the context is created\n      await new Promise((resolve) =>\n        window.Rokt\n          ? resolve()\n          : (document.getElementById('rokt-launcher').onload = resolve)\n      );\n\n      const launcherInstance = await window.Rokt.createLauncher({\n        accountId: accountId,\n        sandbox: sandbox,\n      });\n\n      setLauncher(launcherInstance);\n    })();\n\n    return () => {\n      if (launcher) {\n        launcher.terminate();\n      }\n    };\n  }, [accountId, sandbox]);\n\n  // Return the context provider\n  return (\n    <RoktLauncherContext.Provider value={launcher}>\n      {children}\n    </RoktLauncherContext.Provider>\n  );\n}\n","import React, {useEffect, useRef} from 'react';\nimport {useStore} from 'react-redux';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\nimport {UPDATE_GIFT_OPTIONS} from '~/CreateFabricInvitation/reducers/giftingOptions/constants';\nimport {\n  UpsellDesktop,\n  UpsellTrays,\n} from '~/CreateFabricInvitation/routes/Upsell/UpsellB';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\n\nexport const UpsellModal = ({\n  toggleUpsellModal,\n  closeOverlay,\n  noAutoRestore,\n  onConfirmAction,\n}) => {\n  const store = useStore();\n  const {matches: mobile} = useMatchQuery('(max-width: 48rem)');\n  const upsellModalRef = useRef(null);\n\n  useEffect(() => {\n    if (!upsellModalRef.current || !isInPremiumPricingVariationC()) return;\n\n    upsellModalRef.current.style.height =\n      upsellModalRef.current.offsetHeight + 'px';\n  }, []);\n\n  const upgradeToPremium = () => {\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {isPremium: true},\n    });\n    toggleUpsellModal();\n  };\n\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC();\n\n  return (\n    <div className=\"create-flow__upsell-modal\">\n      {mobile && inPremiumPricingVariationC ? (\n        <UpsellDesktop\n          onClose={toggleUpsellModal}\n          onDecline={closeOverlay}\n          onUpgradeClick={onConfirmAction}\n        />\n      ) : (\n        <>\n          <div\n            className=\"create-flow__upsell-modal-overlay\"\n            onClick={() => toggleUpsellModal()}\n          />\n          <div\n            className={`create-flow__upsell-modal-content ${\n              inPremiumPricingVariationC ? 'c-variation' : ''\n            }`}\n            ref={upsellModalRef}\n          >\n            <button\n              className=\"create-flow__upsell-modal-close-btn\"\n              data-qa-id=\"upsell-close\"\n              onClick={() => toggleUpsellModal()}\n            >\n              <PB_CloseLine ratio={0.75} />\n            </button>\n            {inPremiumPricingVariationC ? (\n              <UpsellTrays />\n            ) : (\n              <>\n                <Typography\n                  as=\"label\"\n                  classNames=\"create-flow__upsell-modal-label\"\n                  variant=\"label1\"\n                  data-qa-id=\"createFlowUpsellModalLabel\"\n                  color=\"shadow\"\n                >\n                  UPGRADE\n                </Typography>\n                <Typography\n                  as=\"h3\"\n                  classNames=\"create-flow__upsell-modal-heading\"\n                  variant=\"header3\"\n                  data-qa-id=\"createFlowUpsellModalHeading\"\n                  color=\"shadow\"\n                >\n                  Want to remove gift ideas from Amazon?\n                </Typography>\n\n                <Typography\n                  as=\"p\"\n                  classNames=\"create-flow__upsell-modal-description\"\n                  variant=\"paragraph2\"\n                  data-qa-id=\"createFlowUpsellModalDescription\"\n                  color=\"shadow\"\n                >\n                  When you upgrade to a Premium invitation, you can send your\n                  invitations without Amazon’s gift suggestions.\n                  <br />\n                  <br />\n                  Plus, all Premium invitations offer your guests an ad-free\n                  experience.\n                </Typography>\n              </>\n            )}\n            <div className=\"create-flow__upsell-modal-footer\">\n              <Button\n                className=\"create-flow__upsell-modal-back-btn\"\n                data-qa-id=\"upsell-back\"\n                variant=\"secondary\"\n                size=\"large\"\n                onClick={() => {\n                  !noAutoRestore &&\n                    store.dispatch({\n                      type: UPDATE_GIFT_OPTIONS,\n                      payload: {\n                        options: {event_option_show_gifting: true},\n                        showGifting: true,\n                      },\n                    });\n\n                  toggleUpsellModal();\n                  closeOverlay();\n                }}\n              >\n                No Thanks\n              </Button>\n              <Button\n                className=\"create-flow__upsell-modal-upgrade-btn\"\n                data-qa-id=\"upsell-upgrade-now\"\n                data-impression-tracking=\"true\"\n                variant=\"primary\"\n                size=\"large\"\n                onClick={(e) => {\n                  upgradeToPremium();\n                  onConfirmAction(e);\n                }}\n              >\n                Yes, Upgrade Now\n              </Button>\n            </div>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n","export {NavHeader} from './NavHeader/NavHeader';\n","import {useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport * as detailsSelectors from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {selectRsvpOff} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {\n  getEventHostId,\n  getEventId,\n} from '~/CreateFabricInvitation/reducers/eviteEvent/selectors';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Input} from '~/common/_pb_components/atoms/Input';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {ResponsivePanel} from '~/common/_pb_components/organisms/ResponsivePanel';\nimport './NotifyGuestsOverlay.sass';\nimport {\n  CANCEL_NOTIFY_GUESTS_OVERLAY,\n  HIDE_NOTIFY_GUESTS_OVERLAY,\n} from '~/CreateFabricInvitation/reducers/modals/constants';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\nimport {notifyGuestsOverlayShowing} from '~/CreateFabricInvitation/reducers/modals/selectors';\nimport {getLoggedUserId} from '~/common/fabric/User/reducers/user';\n\nconst MESSAGE = 'I’ve made an update. Check it out to see what’s new.';\nconst [ALL, ...GROUPS] = ['all', 'yes', 'no', 'undecided'];\nconst TO = [ALL];\n\nexport const NotifyGuestsOverlay = (props) => {\n  const eventId = useSelector(getEventId);\n  const hostId = useSelector(getEventHostId);\n  const loggedUserId = useSelector(getLoggedUserId);\n  const title = useSelector(detailsSelectors.selectTitle);\n  const host = useSelector(detailsSelectors.selectHost);\n  const coHost = useSelector(detailsSelectors.selectCohostName);\n  const dispatch = useDispatch();\n  const showModal = useSelector(notifyGuestsOverlayShowing);\n  const [subject, setSubject] = useState(`Update for ${title}`);\n  const rsvpOff = useSelector(selectRsvpOff);\n\n  const [message, setMessage] = useState(MESSAGE);\n  let [to, setTo] = useState(TO);\n\n  if (!showModal) return null;\n\n  const from = hostId === loggedUserId ? host : coHost;\n\n  const closeOverlay = (confirmationType) => {\n    dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {confirmationType: confirmationType},\n    });\n    dispatch({type: HIDE_NOTIFY_GUESTS_OVERLAY});\n  };\n\n  const cancelOverlay = () => {\n    dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {confirmationType: 'updated'},\n    });\n    dispatch({type: CANCEL_NOTIFY_GUESTS_OVERLAY});\n  };\n\n  const handleSend = async (e) => {\n    const url = `/tsunami/v1/services/event/${eventId}/broadcast`;\n    try {\n      await fetch(url, {\n        method: 'POST',\n        body: JSON.stringify({\n          q_message_type: 'guest_update_event',\n          virtual_groups: [...to].join('|'),\n          message,\n        }),\n      });\n    } catch (error) {\n      console.error(error);\n    }\n    closeOverlay('sent');\n  };\n\n  const handleClick = (group) => {\n    if (group === ALL) return setTo([ALL]);\n    else to = to.filter((t) => t !== ALL);\n\n    if (to.includes(group)) to = to.filter((t) => t !== group);\n    else to = [...to, group];\n\n    if (to.length) setTo(to);\n    else setTo([ALL]);\n  };\n\n  return (\n    <ResponsivePanel\n      isOpen={true}\n      onClose={cancelOverlay}\n      title=\"Send an update to your guests\"\n      secondaryText=\"Skip\"\n      primaryText=\"Send\"\n      showCover={true}\n    >\n      <div className=\"notify-guests-overlay\">\n        <Typography\n          variant=\"label2\"\n          className=\"notify-guests-overlay__from-lbl\"\n        >\n          From:\n        </Typography>\n        <Typography\n          variant=\"paragraph2\"\n          className=\"notify-guests-overlay__from\"\n        >\n          {from}\n        </Typography>\n        {!rsvpOff && (\n          <>\n            <Typography\n              variant=\"label2\"\n              className=\"notify-guests-overlay__send-to-lbl\"\n            >\n              To:\n            </Typography>\n            <div className=\"notify-guests-overlay__send-to\">\n              {[ALL, ...GROUPS].map((group) => {\n                const modifier = to.includes(group) ? '--active' : '';\n                const className = `notify-guests-overlay__send-to-group${modifier}`;\n\n                return (\n                  <Typography\n                    key={group}\n                    variant=\"label2\"\n                    color=\"pebble\"\n                    className={className}\n                    onClick={(e) => handleClick(group)}\n                  >\n                    {group}\n                  </Typography>\n                );\n              })}\n            </div>\n          </>\n        )}\n        <hr style={{margin: '1.5rem 0'}} />\n        <div className=\"notify-guests-overlay__subject-lbl\">\n          <Typography variant=\"label2\">Subject</Typography>\n          <Input\n            data-qa-id=\"event-update-message-subject\"\n            value={subject}\n            onChange={(e) => setSubject(e.target.value)}\n            className=\"notify-guests-overlay__subject-field\"\n          />\n        </div>\n        <div className=\"notify-guests-overlay__message-lbl\">\n          <Typography variant=\"label2\">Message</Typography>\n          <Input\n            data-qa-id=\"event-update-message-body\"\n            type=\"textarea\"\n            value={message}\n            onChange={(e) => setMessage(e.target.value)}\n            className=\"notify-guests-overlay__message-field\"\n          />\n        </div>\n        <div className=\"notify-guests-overlay__actions\">\n          <Button\n            variant=\"secondary\"\n            size=\"large\"\n            className=\"notify-guests-overlay__actions-btn\"\n            onClick={() => closeOverlay('updated')}\n            data-qa-id=\"notify-guests__skip\"\n          >\n            Skip\n          </Button>\n          <Button\n            variant=\"primary\"\n            size=\"large\"\n            className=\"notify-guests-overlay__actions-btn\"\n            onClick={handleSend}\n            data-qa-id=\"notify-guests__send\"\n          >\n            Send\n          </Button>\n        </div>\n      </div>\n    </ResponsivePanel>\n  );\n};\n","import {createBrowserHistory} from 'history';\n\nexport const history = createBrowserHistory({\n  basename: `/invitation/`,\n});\n","let promiseListeners = [];\n\nexport const reduxPromise = (\n  executor,\n  successActionTypes,\n  errorActionTypes\n) => {\n  let resolve, reject;\n  let completed = false;\n  successActionTypes = successActionTypes || [];\n  errorActionTypes = errorActionTypes || [];\n  const promise = new Promise((resolve_, reject_) => {\n    resolve = resolve_;\n    reject = reject_;\n    const actionListener = (action) => {\n      // returns false if it should be removed from the list\n      if (completed) return false;\n      if (successActionTypes.indexOf(action.type) >= 0) {\n        resolve();\n        return false;\n      }\n      if (errorActionTypes.indexOf(action.type) >= 0) {\n        reject();\n        return false;\n      }\n      return true;\n    };\n    promiseListeners.push(actionListener);\n    executor && executor(resolve_, reject_);\n  });\n  promise.finally(() => {\n    completed = true;\n  });\n  return promise;\n};\n\nexport const promiseResolverMiddleware = (store) => (next) => (action) => {\n  next(action);\n  promiseListeners = promiseListeners.filter((actionListener) =>\n    actionListener(action)\n  );\n};\n","import {pushDataLayerEcommerceObject} from '../utils/dataTracking';\nimport {selectEcommerceObject} from '../reducers/review';\nimport {GREETING_CARD_CHECKED_OUT} from '../reducers/constants';\n\nexport const dataLayerMiddleware = (store) => (next) => (action) => {\n  switch (action.type) {\n    case GREETING_CARD_CHECKED_OUT:\n      next(action);\n\n      const _store = store.getState();\n\n      // TODO: get ecommerce data for invitation checkout\n      const ecomerce = selectEcommerceObject(_store);\n\n      pushDataLayerEcommerceObject(ecomerce);\n      break;\n\n    default:\n      next(action);\n      break;\n  }\n};\n","import XDate from 'xdate';\nimport {getTimezone} from '~/common/utils';\nimport {\n  TURN_OFF_DONATION_LOADING,\n  TURN_ON_DONATION_LOADING,\n  UPDATE_INVITATION_SUMMARY,\n} from '~/ViewInvitation/reducers/constants';\nimport {\n  UPDATE_GIFT_OPTIONS,\n  UPDATE_PLEDGELING_OPTIONS,\n} from '~/CreateFabricInvitation/reducers/giftingOptions/constants';\n\nconst EVENT_MODULE = 'event_details';\nconst WHO_IS_COMING_MODULE = 'who_is_coming';\nconst GIFT_REGISTRY_MODULE = 'gift_registry';\nconst GIFTING_MODULE = 'gifting';\nconst DONATION_MODULE = 'donation';\nconst POLL_MODULE = 'poll';\nconst WHAT_TO_BRING_MODULE = 'what_to_bring';\nconst PHOTO_MODULE = 'photo';\n\n// should match BE from cyclone/services.py:\n//         EVENT_MODULE: 1,\n//         WHO_IS_COMING_MODULE: 2,\n//         GIFT_REGISTRY_MODULE: 3,\n//         GIFTING_MODULE: 4,\n//         DONATION_MODULE: 5,\n//         DONATIONS_MODULE: 6, // what is this one?\n//         POLL_MODULE: 7,\n//         WHAT_TO_BRING_MODULE: 8,\n//         PHOTO_MODULE: 9,\nconst displayOrder = [\n  [EVENT_MODULE, 1],\n  [WHO_IS_COMING_MODULE, 2],\n  [GIFT_REGISTRY_MODULE, 3],\n  [GIFTING_MODULE, 4],\n  [DONATION_MODULE, 5],\n  [POLL_MODULE, 6],\n  [WHAT_TO_BRING_MODULE, 7],\n  [PHOTO_MODULE, 8],\n];\n\nexport const previewTransformMiddleware = (store) => (next) => (action) => {\n  next(action);\n  const state = store.getState();\n  const event = {...state.eviteEvent, rsvp: undefined};\n  if (Object.keys(state.eviteEvent).length === 0) return state;\n  const reminders = [];\n  if (event.event_reminder_0) {\n    reminders.push(event.event_reminder_0);\n  }\n  if (event.event_reminder_1) {\n    reminders.push(event.event_reminder_1);\n  }\n  const pathPieces = window.location.pathname.split('/').slice(1);\n  const inStep2 = pathPieces[2] === 'details';\n  state.eventDetails = {\n    ...state.eventDetails,\n    ...state.details,\n    ...state.details.address,\n    title: state.details.title || 'Your event title',\n    locationName: state.details.location,\n    streetAddress: state.details.address?.street ?? null,\n    zipCode: state.details.address?.zip || null,\n    start: state.details.start?.toString() || '',\n    end: state.details.end?.toString() || '',\n    messageFromHost: state.details.notes,\n    hostName: state.details.host || event.host_name,\n    _evite_event: event,\n    videoChatType: event.video_chat_type,\n    videoChatLink: event.video_chat_link,\n    shortLink: event.shortlink,\n    eventId: event.id,\n    eventType: event.event_type,\n    status: event.status,\n    usedAs: event.used_as,\n    rsvpStyle: {...event.rsvp_style},\n    allowGifts: !!state.giftingOptions.options.event_option_show_gifting,\n    registriesData: event.gift_registries_data,\n    fabric_design_data: event.fabric_design_data,\n    design: event.options.design,\n    allowGuests: event.options.event_option_allow_guest_number,\n    allowInviteMore: event.options.event_option_allow_invite_more,\n    allowKids: event.options.event_option_allow_kids,\n    maxGuests: event.options.event_option_max_guest_number || 100,\n    maxTotalGuests: event.options.event_option_max_guests || 750,\n    privateGuestlist: event.options.event_option_private_guestlist,\n    hasPassed: window.event_has_passed || false,\n    origin: event.origin,\n    isPremium:\n      state.details.isPremium ??\n      (event.origin === 13 || event.is_fabric_premium),\n    removeAds: event.remove_ads || false,\n    reminders,\n    pledgeling_data: {\n      pledgeling_added: event.pledgeling_added,\n      pledgeling_beneficiary: event.pledgeling_beneficiary,\n      pledgeling_beneficiary_type: event.pledgeling_beneficiary_type,\n      pledgeling_category: event.pledgeling_category,\n      pledgeling_goal: event.pledgeling_goal,\n      pledgeling_id: event.pledgeling_id,\n      pledgeling_purpose: event.pledgeling_purpose,\n    },\n    videoId: event.event_videos_id,\n    pristineHostMessage: !state.details.notes && inStep2,\n  };\n\n  const {\n    address: {city, state: addrState, zip, street},\n    location: locationName,\n  } = state.details;\n  state.eventDetails.editedLocation = inStep2\n    ? !!locationName || !!street || !!city || !!addrState || !!zip\n    : true;\n  if (!state.eventDetails.editedLocation) {\n    state.eventDetails.streetAddress = '[Event location]';\n    state.eventDetails.city = '';\n    state.eventDetails.state = '';\n    state.eventDetails.zipCode = '';\n  } else {\n    state.eventDetails.streetAddress = street;\n    state.eventDetails.city = city;\n    state.eventDetails.state = addrState;\n    state.eventDetails.zipCode = zip;\n  }\n\n  const premiumDesign = event.options.design;\n  state.premiumDesign =\n    state.eventDetails.isPremium ||\n    state.user.subscriptionPlanName === 'pro' ||\n    state.user.subscriptionPlanName === 'party_pass'\n      ? {\n          envelope: {\n            name: {\n              ...premiumDesign.name_style,\n            },\n            openBack: premiumDesign.envelope_flap_up,\n            closedBack: premiumDesign.envelope_flap_down,\n            closedFront: premiumDesign.envelope_front,\n          },\n          stamp: {\n            image: premiumDesign.stamp_image,\n          },\n          background: {\n            background: premiumDesign.background,\n            color: premiumDesign.background_color,\n            imageDesktop: premiumDesign.background_image_desktop,\n            imageMobile: premiumDesign.background_image_mobile,\n          },\n          liner: {\n            liner: premiumDesign.liner,\n            image: premiumDesign.liner_image,\n          },\n          envelopeStickers: premiumDesign.envelope_fabric_stickers ?? null,\n        }\n      : {};\n\n  const timezone = getTimezone();\n  state.details.known_timezone_abbr =\n    state.details.known_timezone_abbr || timezone?.timezoneAbbr;\n  state.details.known_timezone_name =\n    state.details.known_timezone_name || timezone?.timezoneId;\n\n  state.coverData = {\n    known_timezone_abbr: state.details.known_timezone_abbr,\n    known_timezone_name: state.details.known_timezone_name,\n    template: {},\n  };\n\n  state.user = {\n    ...state.user,\n    isHost: state.eventDetails.host_ids.indexOf(state.user.userId) > -1,\n  };\n\n  const rsvp = event.rsvp || {};\n  state.rsvp = {\n    hasRsvpd: false,\n    guestEmail: rsvp?.email ?? '',\n  };\n\n  state.gifting =\n    action.type === UPDATE_INVITATION_SUMMARY\n      ? {\n          url: action.results?.gifting?.url ?? '',\n          iconUrl: action.results?.gifting?.icon_url ?? '',\n          vendorName: 'Amazon',\n        }\n      : {\n          url: state.gifting?.url ?? '',\n          iconUrl:\n            state.gifting?.iconUrl ??\n            'https://g5.evitecdn.com/apps/logos/third-party/amazon_logo_plain_large.png',\n          vendorName: state.gifting?.vendorName ?? 'Amazon',\n        };\n\n  state.registry =\n    action.type === UPDATE_INVITATION_SUMMARY\n      ? {\n          display_order: 3,\n          name: action.results.gift_registry?.name || '',\n          registries:\n            action.results.gift_registry?.registries.map((gf) => ({\n              ...gf,\n              vendorName: gf.name,\n            })) ?? [],\n        }\n      : {\n          ...state.registry,\n          display_order: state.registry?.display_order ?? 3,\n          name:\n            state.registry?.name ||\n            state.giftingOptions.gift_registry_name ||\n            '',\n          registries: state.registry?.registries ?? [],\n        };\n  state.giftKeywords = {\n    keywords: [],\n  };\n  state.whatToBring = {\n    items: [],\n    allowOther: false,\n    creatorId: state.user.userId,\n  };\n  state.whatToBringSummary = {\n    participants: [],\n    listId: '',\n  };\n  state.guestList = {\n    rsvpCounts: {\n      adults_yes: 0,\n      adults_maybe: 0,\n      kids_yes: 0,\n      kids_maybe: 0,\n      yes: 0,\n      maybe: 0,\n      no: 0,\n      no_reply: 0,\n    },\n    rsvpDetails: {\n      maybe: [],\n      yes: [],\n      no_reply: [],\n      no: [],\n    },\n  };\n  // TODO: whoIsComing\n  state.whoIsComing = {\n    isPrivateGuestlist:\n      state.giftingOptions.options.event_option_private_guestlist,\n    guestPreviews: [\n      {\n        userId: 1,\n        adults: state.eventDetails.allowKids ? 2 : 3,\n        guestName: 'Guest Name',\n        kids: 1,\n        rsvpComment: 'Guest comment',\n        rsvpWhen: XDate(new Date())\n          .addDays(-7)\n          .toString(),\n      },\n      {\n        userId: 2,\n        adults: state.eventDetails.allowKids ? 2 : 3,\n        guestName: 'Guest Name',\n        kids: 1,\n        rsvpComment: '',\n        rsvpWhen: XDate(new Date())\n          .addDays(-6)\n          .toString(),\n      },\n      {\n        userId: 3,\n        adults: state.eventDetails.allowKids ? 1 : 2,\n        guestName: 'Guest Name',\n        kids: 1,\n        rsvpComment: 'Guest comment',\n        rsvpWhen: XDate(new Date())\n          .addDays(-5)\n          .toString(),\n      },\n      {\n        userId: 4,\n        adults: state.eventDetails.allowKids ? 1 : 2,\n        guestName: 'Guest Name',\n        kids: 1,\n        rsvpComment: '',\n        rsvpWhen: XDate(new Date())\n          .addDays(-4)\n          .toString(),\n      },\n      {\n        userId: 5,\n        adults: 1,\n        guestName: 'Guest Name',\n        kids: 0,\n        rsvpComment: '',\n        rsvpWhen: XDate(new Date())\n          .addDays(-3)\n          .toString(),\n      },\n    ],\n  };\n  // TODO: donation\n  state.donation = {\n    ...state.donation,\n    loading: state.donation?.loading ?? false,\n    donations: state.donation?.donations ?? [],\n  };\n  if (\n    action.type === UPDATE_INVITATION_SUMMARY ||\n    action.type === UPDATE_PLEDGELING_OPTIONS ||\n    action.type === UPDATE_GIFT_OPTIONS\n  ) {\n    state.donation.donations = [];\n    if (\n      'pledgeling_beneficiary_type' in\n      state.giftingOptions.pledgeling_data['Organization']\n    ) {\n      state.donation.donations.push({\n        id: `${event.id}_Organization`,\n        donation_url: `https://${window.pledge_url}/widgets/donate/${window.pledge_key}/${event.id}_Organization`,\n        found: true,\n      });\n    }\n    if (\n      'pledgeling_beneficiary_type' in\n      state.giftingOptions.pledgeling_data['Crowdfund']\n    ) {\n      state.donation.donations.push({\n        id: `${event.id}_Crowdfund`,\n        donation_url: `https://${window.pledge_url}/widgets/donate/${window.pledge_key}/${event.id}_Crowdfund`,\n        found: true,\n      });\n    }\n  } else if (action.type === TURN_ON_DONATION_LOADING) {\n    state.donation.loading = true;\n  } else if (action.type === TURN_OFF_DONATION_LOADING) {\n    state.donation.loading = false;\n  }\n  state.eventDetails.hasDonations = state.donation.donations.length > 0;\n\n  state.poll =\n    state.widgets?.polls?.length > 0\n      ? {\n          ...state.widgets?.polls[0],\n        }\n      : [];\n\n  const moduleSet = new Set(displayOrder.map((o) => o[0]));\n  if (\n    state.eventDetails.eventType === 'funeral_memorial_service' ||\n    (!state.eventDetails.allowGifts && state.registry.registries.length === 0)\n  ) {\n    // Hide gifting module if event is a funeral / memorial service, OR if user has turned off registries and gifting\n    moduleSet.delete(GIFTING_MODULE);\n  }\n\n  if (state.eventDetails.rsvp_off) {\n    moduleSet.delete(WHO_IS_COMING_MODULE);\n  }\n\n  if (!state.widgets?.whatToBrings?.length > 0) {\n    moduleSet.delete(WHAT_TO_BRING_MODULE);\n  }\n\n  if (!state.eventDetails.hasDonations) {\n    moduleSet.delete(DONATION_MODULE);\n  }\n\n  if (!state.widgets?.polls?.length) {\n    moduleSet.delete(POLL_MODULE);\n  }\n\n  state.moduleOrder = {\n    displayOrder: Array.from(moduleSet),\n  };\n\n  next(action);\n  return state;\n};\n","import React from 'react';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\n\nconst FirstStepLeaveModal = (props) => {\n  const {cancelLeave, leave} = props;\n  return (\n    <ConfirmLeaveModal\n      {...props}\n      title=\"Are you sure you want to Exit?\"\n      message=\"You will lose your invitation progress. Please continue to step 2 to save your invitation.\"\n    >\n      <Button\n        className=\"create-flow__upsell-modal-upgrade-btn\"\n        data-qa-id=\"say-yes-btn\"\n        variant=\"secondary\"\n        size=\"large\"\n        onClick={() => leave()}\n        data-impression-tracking=\"true\"\n      >\n        Yes, I’ll Exit\n      </Button>\n      <Button\n        className=\"create-flow__upsell-modal-back-btn\"\n        data-qa-id=\"say-no-btn\"\n        variant=\"primary\"\n        size=\"large\"\n        onClick={() => cancelLeave()}\n      >\n        No, I’ll Continue\n      </Button>\n    </ConfirmLeaveModal>\n  );\n};\n\nconst EditionFlowLeaveModal = (props) => {\n  const {cancelLeave, leave} = props;\n  return (\n    <ConfirmLeaveModal\n      {...props}\n      title=\"Are you sure you want to cancel?\"\n      message=\"Your unsaved changes to this invitation will be lost.\"\n    >\n      <Button\n        className=\"create-flow__upsell-modal-upgrade-btn\"\n        data-qa-id=\"say-yes-btn\"\n        variant=\"secondary\"\n        size=\"large\"\n        onClick={() => cancelLeave()}\n        data-impression-tracking=\"true\"\n      >\n        No\n      </Button>\n      <Button\n        className=\"create-flow__upsell-modal-back-btn\"\n        data-qa-id=\"say-no-btn\"\n        variant=\"primary\"\n        size=\"large\"\n        onClick={() => leave()}\n      >\n        Yes\n      </Button>\n    </ConfirmLeaveModal>\n  );\n};\n\nconst CreationFlowLeaveModal = (props) => {\n  const {cancelLeave, leave} = props;\n  return (\n    <ConfirmLeaveModal\n      {...props}\n      title=\"Exit the Invitation Editor\"\n      message=\"We've saved your progress so you can finish creating your invitation later.\"\n    >\n      <Button\n        className=\"create-flow__upsell-modal-back-btn\"\n        data-qa-id=\"keep-editing-btn\"\n        variant=\"secondary\"\n        size=\"large\"\n        onClick={() => cancelLeave()}\n      >\n        Keep Editing\n      </Button>\n      <Button\n        className=\"create-flow__upsell-modal-upgrade-btn\"\n        data-qa-id=\"exit-btn\"\n        variant=\"primary\"\n        size=\"large\"\n        onClick={() => leave()}\n        data-impression-tracking=\"true\"\n      >\n        Exit\n      </Button>\n    </ConfirmLeaveModal>\n  );\n};\n\nexport const ConfirmLeaveModal = (props) => {\n  const {cancelLeave, children, message, title} = props;\n\n  return (\n    <div className=\"create-flow__upsell-modal\">\n      <div\n        className=\"create-flow__upsell-modal-overlay\"\n        onClick={() => cancelLeave()}\n      ></div>\n      <div className=\"create-flow__upsell-modal-content\">\n        <button\n          className=\"create-flow__upsell-modal-close-btn\"\n          onClick={() => cancelLeave()}\n        >\n          <PB_CloseLine ratio={0.75} />\n        </button>\n        <Typography\n          as=\"p\"\n          classNames=\"create-flow__upsell-modal-label\"\n          variant=\"label1\"\n          data-qa-id=\"createFlowUpsellModalLabel\"\n          color=\"shadow\"\n        >\n          {title}\n        </Typography>\n        <Typography\n          as=\"p\"\n          classNames=\"create-flow__upsell-modal-description\"\n          variant=\"paragraph2\"\n          data-qa-id=\"createFlowUpsellModalDescription\"\n          color=\"shadow\"\n        >\n          {message}\n        </Typography>\n        <div className=\"create-flow__upsell-modal-footer\">{children}</div>\n      </div>\n    </div>\n  );\n};\n\nexport const ConfirmLeaveModalContainer = (props) => {\n  const {isFirstStep, cancelLeave, saveAndLeave, leave, isEditingFlow} = props;\n  switch (true) {\n    case isFirstStep && isEditingFlow:\n    case isEditingFlow:\n      return <EditionFlowLeaveModal cancelLeave={cancelLeave} leave={leave} />;\n    case isFirstStep:\n      return <FirstStepLeaveModal cancelLeave={cancelLeave} leave={leave} />;\n    default:\n      return (\n        <CreationFlowLeaveModal\n          cancelLeave={cancelLeave}\n          leave={saveAndLeave}\n        />\n      );\n  }\n};\n","import {selectIsDirty} from '../reducers/details/selectors';\nimport {validateEventDetails} from '~/CreateFabricInvitation/navigation/validation';\nimport {setInEditMode} from '~/CreateFabricInvitation/navigation/utils';\nimport {finishAndSend} from '../api/review';\nimport {eventStepsType} from '~/common/fabric/EventGuests/components/DisplayCondition/addGuestsCondition';\n\nexport const createSteps = {\n  meta: {\n    // Not a step - global settings for steps\n    editing: false,\n    creating: true,\n    showBackButton: true,\n    countSteps: true,\n  },\n  customize: {\n    id: 1,\n    name: 'customize',\n    path: 'customize',\n    displayName: 'Customize',\n    title: `Customize Your Invitation`,\n    nextRoute: 'details',\n    previousRoute: null,\n    saveOnLeave: true,\n    nextButtonText: 'Next: Event Details',\n    hideInWebView: false,\n  },\n  details: {\n    id: 2,\n    name: 'details',\n    path: 'details',\n    displayName: 'Edit Details',\n    title: `Enter Or Edit Your Event Details`,\n    nextRouteAvailableSelector: (state) => !selectIsDirty(state),\n    preLeaveRouteFunction: validateEventDetails,\n    nextRoute: 'gifting',\n    previousRoute: 'customize',\n    saveOnLeave: true,\n    nextButtonText: 'Next: Gifting',\n    hideInWebView: false,\n  },\n  gifting: {\n    id: 3,\n    path: 'gifting',\n    name: 'gifting',\n    displayName: 'Gifting Options',\n    title:\n      \"Select one or more gift options you'd like to include in your invitation\",\n    nextRoute: 'preview',\n    previousRoute: 'details',\n    saveOnLeave: true,\n    nextButtonText: 'Next: Preview',\n    hideInWebView: false,\n  },\n  preview: {\n    id: 4,\n    path: 'preview',\n    name: 'preview',\n    displayName: 'Preview',\n    title: `This Is A Preview Of Your Invitation`,\n    nextRoute: 'guests',\n    previousRoute: 'gifting',\n    saveOnLeave: true,\n    nextButtonText: 'Next: Add Guests',\n    hideInWebView: false,\n  },\n  guests: {\n    id: 5,\n    path: 'guests',\n    name: 'guests',\n    displayName: 'Add Guests',\n    title: 'Add guests',\n    nextRoute: 'review',\n    previousRoute: 'preview',\n    saveOnLeave: false,\n    nextButtonText: 'Next: Review & Send',\n    hideInWebView: true,\n  },\n  review: {\n    id: 6,\n    path: 'review',\n    name: 'review',\n    displayName: 'Review & Send',\n    title: 'Review & Send',\n    nextRoute: (store) => {\n      if (\n        store.getState().details.isPremium || // if premium design\n        store.getState().review?.calc?.userHasActivePremiumPass || // or user has active premium pass\n        store.getState().details.hideUpsell // or user has downgraded\n      ) {\n        return 'confirm';\n      } else {\n        return 'send';\n      }\n    },\n    previousRoute: 'guests',\n    saveOnLeave: false,\n    nextButtonText: 'Purchase & Send', // TODO: Text changes: \"Send Invitation\" for free with guests. \"Finish & Send Later\" if free no guests.\n    hideInWebView: true,\n    isUpsellMode: (store) => !!store.getState().details.isUpsellMode,\n  },\n  send: {\n    id: 7,\n    path: 'send',\n    name: 'send',\n    displayName: 'Upgrade to Premium',\n    title: 'Upgrade to Premium',\n    preLeaveRouteFunction: setInEditMode,\n    previousRoute: 'review',\n    nextRoute: 'confirm',\n    nextButtonText: 'Upgrade to Premium',\n    hideInWebView: true,\n    showSimpleNav: true,\n    showFooter: false,\n  },\n  confirm: {\n    id: 8,\n    path: 'confirm',\n    name: 'confirm',\n    displayName: 'Confirmation',\n    title: 'Confirmation',\n    // nextRoute: 'confirm',\n    previousRoute: 'review',\n    saveOnLeave: false,\n    // nextButtonText: 'Purchase & Send', // TODO: text changes for free/premium??\n    hideInWebView: true,\n    showMegaNav: true,\n    showFooter: true,\n  },\n  exit: {\n    // Routes us to the source page\n    id: -1,\n    path:\n      !document.referrer?.includes?.('login') && document.referrer\n        ? document.referrer\n        : '/',\n    hideInWebView: true,\n  },\n};\n\nexport const freemiumSteps = {\n  ...createSteps,\n  gifting: {\n    ...createSteps.gifting,\n    nextButtonText: 'Next: Review',\n  },\n  preview: {\n    ...createSteps.preview,\n    displayName: 'Review',\n    nextRoute: createSteps.guests.nextRoute,\n    nextButtonText: 'Next: Checkout',\n  },\n  review: {\n    ...createSteps.review,\n    id: createSteps.guests.id,\n    displayName: 'Checkout',\n    previousRoute: createSteps.guests.previousRoute,\n    nextButtonText: 'Purchase & Add Guests',\n  },\n};\n\nexport const freeSteps = {\n  ...createSteps,\n  gifting: {\n    ...createSteps.gifting,\n    nextRoute: 'preview',\n    nextButtonText: 'Next: Review',\n  },\n  review: {\n    ...createSteps.review,\n    id: 4,\n  },\n  preview: {\n    ...createSteps.preview,\n    name: 'review',\n    displayName: 'Review',\n    previousRoute: 'gifting',\n    preLeaveRouteFunction: async (store, routeName) => {\n      if (['send', 'confirm'].includes(routeName)) {\n        const eviteEvent = store.getState().eviteEvent;\n        await finishAndSend(store, eviteEvent);\n      }\n      return true;\n    },\n    nextRoute: createSteps.review.nextRoute,\n    nextButtonText: 'Finish & Add Guests',\n  },\n};\n\nexport const freeWithGuestsSteps = {\n  ...freeSteps,\n  preview: {\n    ...freeSteps.preview,\n    nextRoute: 'guests',\n    nextButtonText: 'Next: Add Guests',\n    preLeaveRouteFunction: null,\n  },\n  guests: {\n    ...freeSteps.guests,\n    nextRoute: createSteps.review.nextRoute,\n    nextButtonText: 'Finish & Send',\n    preLeaveRouteFunction: freeSteps.preview.preLeaveRouteFunction,\n  },\n};\n\nexport const freemiumWithGuestsSteps = {\n  ...freemiumSteps,\n  preview: {\n    ...freemiumSteps.preview,\n    nextRoute: createSteps.preview.nextRoute,\n    nextButtonText: createSteps.preview.nextButtonText,\n  },\n  guests: {\n    ...createSteps.guests,\n    nextButtonText: 'Next: Checkout',\n  },\n  review: {\n    ...createSteps.review,\n    displayName: 'Checkout',\n    nextButtonText: 'Purchase & Send',\n  },\n};\n\nexport const numSteps = 6;\n\nexport const eventStepCount = {\n  [eventStepsType.PREMIUM]: numSteps,\n  [eventStepsType.FREEMIUM_WITH_GUESTS]: numSteps,\n  [eventStepsType.FREEMIUM]: numSteps - 1,\n  [eventStepsType.FREE_WITH_GUESTS]: numSteps - 1,\n  [eventStepsType.FREE]: numSteps - 2,\n};\n\nexport const eventSteps = {\n  [eventStepsType.PREMIUM]: createSteps,\n  [eventStepsType.FREEMIUM_WITH_GUESTS]: freemiumWithGuestsSteps,\n  [eventStepsType.FREEMIUM]: freemiumSteps,\n  [eventStepsType.FREE_WITH_GUESTS]: freeWithGuestsSteps,\n  [eventStepsType.FREE]: freeSteps,\n};\n","import {selectIsDirty} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {validateEventDetails} from './validation';\nimport {saveEventThunk} from '../api/event';\nimport {NotifyGuestsOverlayPromise} from '../utils/modalPromises';\nimport {isInPremiumPricingVariationC} from '../utils/experiments';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\n\nconst {fabricTemplate} = window;\n\nconst nextButtonText = fabricTemplate?.premium\n  ? 'Review & Send'\n  : 'Send Invitation';\n\nconst saveAndSendGuestsMessage = async (store) => {\n  const includesPath = (path) => window.location.pathname.includes(path);\n\n  // In edit flow, ONLY send invitations to draft guests if in Add Guests page or Review/Checkout page\n  const sendInvitations = ['guests', 'review'].some(includesPath);\n  await store.dispatch(saveEventThunk(sendInvitations));\n\n  const pathsToIgnore = ['guests', 'confirm'];\n  const onPathToIgnore = pathsToIgnore.some(includesPath);\n\n  const preventUpdateModal =\n    onPathToIgnore ||\n    store.getState()?.review?.calc?.numGuestsBeingAdded > 0 ||\n    store.getState()?.details?.preventUpdateModal;\n\n  if (preventUpdateModal) return;\n  try {\n    await store.dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {savingStep: false},\n    });\n    await NotifyGuestsOverlayPromise(store.dispatch);\n    // Message sent or skipped\n  } catch (e) {\n    // Modal closed\n    throw null;\n  }\n};\n\nexport const editSteps = {\n  meta: {\n    // Not a step - global settings for steps\n    editing: true,\n    creating: false,\n    showBackButton: false,\n    countSteps: false,\n    showBottomNav: false,\n  },\n  customize: {\n    id: 1,\n    name: 'customize',\n    path: 'customize',\n    displayName: 'Customize',\n    title: `Customize Your Invitation`,\n    linkPreview: true,\n    nextRoute: (store) => {\n      let newRoute;\n      const isPremium = store.getState().details.isPremium;\n      const isPremiumTemplate = store.getState().fabricTemplate.premium;\n      const upsellConfirmed = store.getState().modals.upsellConfirmed;\n      const C = isInPremiumPricingVariationC();\n\n      if (C && !isPremiumTemplate && isPremium && upsellConfirmed) {\n        newRoute = 'review';\n      } else if (isPremium) {\n        newRoute = 'exit';\n      } else {\n        newRoute = 'confirm';\n      }\n      return newRoute;\n    },\n    nextButtonText: 'Done',\n    hideInWebView: false,\n  },\n  details: {\n    id: 2,\n    name: 'details',\n    path: 'details',\n    displayName: 'Event Details',\n    title: `Enter Or Edit Your Event Details`,\n    linkPreview: true,\n    nextRouteAvailableSelector: (state) => !selectIsDirty(state),\n    preLeaveRouteFunction: validateEventDetails,\n    nextRoute: (store) => {\n      let newRoute;\n      if (store.getState().details.isPremium) {\n        newRoute = 'exit';\n      } else {\n        newRoute = 'confirm';\n      }\n      return newRoute;\n    },\n    nextButtonText: 'Done',\n    hideInWebView: false,\n  },\n  gifting: {\n    id: 3,\n    path: 'gifting',\n    name: 'gifting',\n    displayName: 'Gifting Options',\n    title:\n      \"Select one or more gift options you'd like to include in your invitation\",\n    linkPreview: true,\n    nextRoute: (store) => {\n      let newRoute;\n      if (store.getState().details.isPremium) {\n        newRoute = 'exit';\n      } else {\n        newRoute = 'confirm';\n      }\n      return newRoute;\n    },\n    nextButtonText: 'Done',\n    hideInWebView: false,\n  },\n  preview: {\n    id: 4,\n    path: 'preview',\n    name: 'preview',\n    displayName: 'Preview',\n    title: `This Is A Preview Of Your Invitation`,\n    linkPreview: false,\n    linkBack: true,\n    nextButtonText: '',\n    hideBottomNav: true,\n    hideInWebView: false,\n  },\n  guests: {\n    id: 5,\n    path: 'guests',\n    name: 'guests',\n    displayName: 'Add Guests',\n    title: 'Add guests',\n    nextRoute: 'confirm',\n    nextButtonText,\n    hideInWebView: true,\n  },\n  review: {\n    id: 6,\n    path: 'review',\n    name: 'review',\n    displayName: 'Review & Send',\n    title: 'Review & Send',\n    nextRoute: (store) => {\n      let newRoute;\n      if (\n        // Not sure why this logic was written, but QA expects either to land on confirm\n        store.getState().details.isPremium &&\n        !store.getState().details.isUpsellMode\n      ) {\n        newRoute = 'confirm'; // was 'exit'\n      } else {\n        newRoute = 'confirm';\n      }\n      return newRoute;\n    },\n    nextButtonText: 'Done',\n    hideInWebView: true,\n  },\n  confirm: {\n    id: 7,\n    path: 'confirm',\n    name: 'confirm',\n    displayName: 'Confirmation',\n    title: 'Confirmation',\n    // nextRoute(store) = store.getState().details.isPremium ? 'exit' : : 'confirm',\n    previousRoute: 'review',\n    saveOnLeave: false,\n    // nextButtonText: 'Purchase & Send', // TODO: text changes for free/premium??\n    hideInWebView: true,\n    showMegaNav: true,\n    showFooter: true,\n    preEnterRouteFunction: saveAndSendGuestsMessage,\n  },\n  exit: {\n    // Routes us to the source page\n    id: -1,\n    path:\n      !document.referrer?.includes?.('login') && document.referrer\n        ? document.referrer\n        : '/',\n    hideInWebView: true,\n    preEnterRouteFunction: saveAndSendGuestsMessage,\n  },\n};\n","import {useSelector, useStore} from 'react-redux';\nimport {useLocation} from 'react-router';\nimport {history} from '../history';\nimport {eventSteps} from './createSteps';\nimport {editSteps} from './editSteps';\nimport {backToGallery, getLastPathComponent} from './utils';\nimport {saveEventThunk} from '../api/event';\nimport {loginModalPromise} from '../utils/modalPromises';\nimport {\n  isGuamWebviewOrLater,\n  isWebview,\n  webViewOnNav,\n  webViewSetBusy,\n  webViewSetEventId,\n  webViewSetShouldUserLogIn,\n} from '../webview/webview';\nimport {trackEventId} from '~/CreateFabricInvitation/utils/dataTracking';\nimport {eventInEditMode} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {getEventStepsType} from '~/common/fabric/EventGuests/components/DisplayCondition/addGuestsCondition';\n\nconst getNavigationSteps = (inEditMode, state) => {\n  if (inEditMode) return editSteps;\n\n  const eventType = getEventStepsType(state);\n\n  return eventSteps[eventType];\n};\n\n/* Shape of navigationSteps\nTODO: this doc is out of date - update and move to a readme\n{\n  route_name: {\n    id: 1, // for ordering the steps\n    path: 'path_component',\n    name: 'route_name',\n    displayName: 'Checkout',\n    title: 'Page Title',\n    continueButtonText: 'Text on \"Continue\" button.  Only set to override the default',\n    nextRouteAvailableSelector: (state) => { Return true if we should enable the 'next' button },\n    preEnterRouteStatusMessage: 'Button text while running the preEnterRouteFunction',\n    preEnterRouteFunction: async (state) => { Code to run before changing route - save, login, etc. },\n    nextRoute: 'route_name that next button will load',\n    previousRoute: 'route name that back button will take you to',\n  },\n  ...\n}\n*/\n\nexport const getCurrentStep = ({inEditMode, store}) => {\n  const navigationSteps = getNavigationSteps(inEditMode, store.getState());\n  const location = window.location;\n  const lastPathComponent = getLastPathComponent(location.pathname);\n  // TODO: add 'aliases' to navigationSteps instead of hard coding it in this function\n  const stepName =\n    {create: 'customize', design: 'customize'}[lastPathComponent] ||\n    lastPathComponent;\n  return {...navigationSteps[stepName]};\n};\n\nexport const useCurrentRoute = () => {\n  const inEditMode = useSelector(eventInEditMode);\n  const location = useLocation(); // get updated when the path changes\n  const store = useStore();\n  const navigationSteps = getNavigationSteps(inEditMode, store.getState());\n  const currentStep = getCurrentStep({inEditMode, store});\n\n  currentStep.nextRoute =\n    typeof currentStep.nextRoute == 'function'\n      ? currentStep.nextRoute(store)\n      : currentStep.nextRoute;\n  const nextStep = navigationSteps[currentStep.nextRoute];\n  // console.log({stepName});\n  // console.log({currentStep});\n  // console.log({nextStep});\n  const nextStepAvailable = useSelector(\n    currentStep.nextRouteAvailableSelector || (() => true)\n  ); // still have to supply a 'selector' even if current step doesn't have one.\n  const nextStepPreEnterRouteStatusMessage =\n    nextStep?.preEnterRouteStatusMessage;\n\n  const previousStep = currentStep.previousRoute;\n  const lastPathComponent = getLastPathComponent(location.pathname);\n\n  return {\n    ...currentStep,\n    path: currentStep.path || lastPathComponent,\n    meta: navigationSteps.meta,\n    nextRouteAvailableSelector: null,\n    nextStepAvailable,\n    nextPath: nextStep?.path,\n    previousPath: previousStep,\n    nextStepPreEnterRouteStatusMessage,\n    nextButtonComponent: currentStep.nextButtonComponent\n      ? currentStep.nextButtonComponent(store)\n      : null,\n  };\n};\n\nexport const navigateToRoute = async (routeName, store, force, ...args) => {\n  if (!routeName) {\n    return backToGallery();\n  }\n\n  const inEditMode = store.getState().details.inEditMode;\n  const currentStep = getCurrentStep({inEditMode, store});\n\n  if (routeName === 'next') {\n    if (typeof currentStep.nextRoute == 'function') {\n      routeName = currentStep.nextRoute(store);\n    } else {\n      routeName = currentStep.nextRoute;\n    }\n  }\n  if (routeName === 'back') window.history.back();\n  if (!force && currentStep.preLeaveRouteFunction) {\n    try {\n      const cont = await currentStep.preLeaveRouteFunction(\n        store,\n        routeName,\n        ...args\n      );\n      if (cont === false)\n        /* preLeaveRoutFunction returns false to abort navigation */\n        return;\n    } catch (e) {\n      console.log(\n        'not navigating to route due to throw from preLeaveRouteFunction:',\n        e\n      );\n      // e && alert(typeof e === 'object' ? JSON.stringify(e) : e);\n      e && alert(e);\n      return;\n    }\n  }\n  if ((!force || force === 'saveAndExit') && currentStep.saveOnLeave) {\n    webViewSetBusy(true);\n    try {\n      const userId = store.getState().user?.userId;\n      if (!userId) {\n        if (isGuamWebviewOrLater()) {\n          webViewSetShouldUserLogIn(true);\n          return;\n        }\n        try {\n          await loginModalPromise(store.dispatch);\n        } catch (e) {\n          // login window canceled\n          return;\n        }\n      }\n      const origEventId = store.getState().eviteEvent.id;\n      const sendInvitations = args.find(({sendInvitations}) => sendInvitations);\n      const status = store.getState().eviteEvent.status;\n      const saveToBackend =\n        !origEventId ||\n        !status ||\n        status === 'draft' ||\n        currentStep.name === 'review';\n      // !origEventId --> we're in step 1 before the user has saved any changes\n      // status === 'draft' --> we're in the create flow\n      // currentStep.name === 'review' --> we're on the Checkout step\n      await store.dispatch(saveEventThunk(sendInvitations, saveToBackend));\n      const newEventId = store.getState().eviteEvent.id;\n      if (newEventId !== origEventId) {\n        webViewSetEventId(newEventId);\n        trackEventId(newEventId);\n      }\n    } finally {\n      webViewSetBusy(false);\n    }\n  }\n  if (typeof routeName === 'function') {\n    routeName = routeName(store);\n  }\n\n  const navigationSteps = getNavigationSteps(inEditMode, store.getState());\n  const route = navigationSteps[routeName];\n  if (!route) {\n    console.log('unable to find route', route);\n    return;\n  }\n  if (!force && route.preEnterRouteFunction) {\n    try {\n      webViewSetBusy(true);\n      const cont = await route.preEnterRouteFunction(store, ...args);\n      if (cont === false)\n        /* preEnterRouteFunction returns false to abort navigation */\n        return;\n    } catch (e) {\n      console.log(\n        'not navigating to route due to throw from preEnterRouteFunction:',\n        e\n      );\n      e && alert(e);\n      return;\n    } finally {\n      webViewSetBusy(false);\n    }\n  }\n  if (isWebview() && route.hideInWebView) {\n    // Only notify the app of the new route, don't update our pathname\n    webViewOnNav(\n      routeName,\n      route.nextRoute,\n      route.previousRoute,\n      route.nextButtonText\n    );\n  } else {\n    if (route.path.indexOf('/') < 0) {\n      historyPush(route);\n    } else {\n      if (routeName === 'exit' && currentStep.id === 1) {\n        window.history.back();\n      } else {\n        window.location = route.path;\n      }\n    }\n  }\n};\n\nexport const setupWebviewNavigation = (store) => {\n  window.webview = window.webview || {};\n  window.navigateToRoute = (route) => {\n    navigateToRoute(route, store);\n  };\n};\n\nexport const historyPush = (route) => {\n  const components = history.location.pathname.split('/');\n  components[components.length - 1] = route.path;\n  history.push({\n    pathname: components.join('/'),\n    hash: history.location.hash,\n    search: history.location.search,\n  });\n};\n","import {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\nimport {qsArrayTransform} from '~/CreateGreetingCard/utils/navigation';\nimport urls from 'urls';\n\nexport const getLastPathComponent = (path) => {\n  const components = path.split('/');\n  return components[components.length - 1];\n};\n\nconst getGalleryUrl = () => {\n  const urlParams = new URLSearchParams(window.location.search);\n\n  const category = urlParams.get('c');\n  const page = urlParams.get('page');\n  const filter = qsArrayTransform('filter');\n\n  return category && page\n    ? `/gallery/category/${category}/${page}?${filter}`\n    : '/';\n};\n\nexport const navigateToPrevious = (store) => {\n  const urlParams = new URLSearchParams(window.location.search);\n  const previous = urlParams.get('previous');\n  let destination = '/';\n  const greetingCardId = store.getState()?.greetingCardDetails?.greetingCardId;\n  console.log('navigating to previous - ', previous);\n  switch (previous) {\n    case 'home':\n      destination = '/';\n      break;\n    case 'event_dashboard':\n      if (greetingCardId)\n        destination = urls.get('event_dashboard', {event_id: greetingCardId});\n      break;\n    case 'gallery':\n      destination = getGalleryUrl();\n      break;\n  }\n  window.location.href = destination;\n};\n\nexport const backToGallery = () => {\n  window.location.href = getGalleryUrl();\n};\n\nexport const setInEditMode = async (store) => {\n  store.dispatch({\n    type: UPDATE_EVENT_DETAILS,\n    payload: {inEditMode: true},\n  });\n  return true; // allow navigation\n};\n","import {selectEventDetailsValid} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\n\nexport const validateEventDetails = async (store) => {\n  if (!selectEventDetailsValid(store.getState())) {\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {request: {failed: true}},\n    });\n    return false; // Prevent navigation\n  }\n\n  store.dispatch({\n    type: UPDATE_EVENT_DETAILS,\n    payload: {request: {failed: false}},\n  });\n  return true; // Allow navigation\n};\n","export const PROPAGATE_STEP_CHANGE =\n  'CreateFabricInvitation/*/PropagateStepChange';\nexport const SET_ALL_ASSETS = 'CreateFabricInvitation/*/AllAssets';\n","export const UPDATE_EVENT_DETAILS = '/EventDetails/*/Update';\n","export * from './reducer';\n","import {UPDATE_EVENT_DETAILS} from './constants';\nimport {INIT_APP} from '~/common/fabric/constants';\nimport {getTimezone} from '~/common/utils';\nimport {USER_LOGGED_IN} from '~/common/components/LoginModal/reducer';\nimport XDate from 'xdate';\nimport {isProOrPartyPassUser} from '~/CreateFabricInvitation/utils/experiments';\n\nconst timezone = getTimezone();\n\nfunction initGuestsOfHonor() {\n  let guests = [];\n  for (let guest of window.guestsOfHonor) {\n    guests.push({name: guest.name, email: guest.email});\n  }\n  return {update: false, guests: guests};\n}\n\nexport const initialState = {\n  address: {city: '', state: '', street: '', zip: ''},\n  phoneNumber: '',\n  cohost: {name: '', email: ''},\n  guestsOfHonor: {guests: [], update: false},\n  host_ids: [],\n  end: '',\n  host: window.userName || '',\n  location: '',\n  notes: '',\n  pending_host_ids: [],\n  request: {failed: false, pending: false, success: false},\n  start: '',\n  stop: '',\n  known_timezone_abbr: timezone?.timezoneAbbr || '',\n  known_timezone_name: timezone?.timezoneId || '',\n  title: '',\n  type: '',\n  isPremium: false,\n  hideUpsell: false,\n  isUpsellMode: false,\n  inEditMode: false,\n  preventUpdateModal: false,\n  // The default behaviour is to have rsvps enabled (rsvp_off = false)\n  // Some templates might have the rsvp optional flag enabled, so in that\n  // case, we set rsvp_off = true by default, unless the user chooses to\n  // keep rsvps by toggling rsvps on. The rsvp_off value is then saved in the event.\n  rsvp_off:\n    window?.evite_event?.rsvp_off !== undefined\n      ? window.evite_event.rsvp_off\n      : !!window?.fabricTemplate?.rsvp_optional,\n  hasUpgraded: false,\n  confirmationType: '',\n  // Data analytics tracking fields\n  tracking_gallery_category: '',\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case UPDATE_EVENT_DETAILS:\n      return {\n        ...state,\n        ...action.payload,\n      };\n    case USER_LOGGED_IN:\n      return {\n        ...state,\n        host: state.host || action.userName,\n        isPremium:\n          state.isPremium || isProOrPartyPassUser(action.subscriptionPlanName),\n      };\n    case INIT_APP:\n      const {event, user, template, override_freemium} = action.payload;\n      const {host_ids, pending_host_ids} = event ?? {};\n\n      if (!event)\n        return {\n          ...state,\n          host: user.userName,\n          isPremium:\n            override_freemium ||\n            template.premium ||\n            isProOrPartyPassUser(window?.subscriptionPlanName),\n          hideUpsell: template.premium || override_freemium,\n          type: action.payload.category_event_type || template.event_type || '',\n          tracking_gallery_category: action.payload.category_id,\n        };\n\n      const start = XDate(event.start_datetime);\n\n      return {\n        ...state,\n        address: {\n          city: event.city,\n          state: event.state,\n          street: event.street_address,\n          zip: event.zip_code,\n        },\n        phoneNumber: event.phone_number,\n        cohost: {\n          name: event.cohost_name1 || '',\n          email: event.cohost_email1 || '',\n        },\n        guestsOfHonor: initGuestsOfHonor(),\n        end: event.end_datetime && new XDate(event.end_datetime),\n        host: event.host_name || user.userName,\n        host_ids,\n        location: event.location_name,\n        notes: event.message,\n        pending_host_ids,\n        rsvp_off: event.rsvp_off,\n        start,\n        stop: event.stop_datetime && new XDate(event.stop_datetime),\n        known_timezone_abbr: event.known_timezone_abbr || timezone.timezoneAbbr,\n        known_timezone_name: event.known_timezone_name,\n        title: event.title,\n        type: event.event_type,\n        isPremium:\n          event.is_fabric_premium ||\n          isProOrPartyPassUser(window?.subscriptionPlanName),\n        hideUpsell: event.is_fabric_premium || event.is_upgrade,\n        inEditMode: event.status === 'sending',\n        tracking_gallery_category: event.tracking_data?.gallery_category,\n      };\n    default:\n      return state;\n  }\n};\n","import XDate from 'xdate';\nimport {parse_us_phone_number, valid_email} from '~/common/utils';\n\nexport const selectDetails = ({details}) => details;\nexport const selectRequestFailed = ({details}) => details.request.failed;\n\n/** Required fields: [host, start, title, type] */\nexport const selectTitle = ({details}) => details.title.trim();\nexport const selectType = ({details}) => details.type;\nexport const selectHost = ({details}) => details.host;\nexport const selectStart = ({details}) => details.start;\nexport const selectRsvpOff = ({details}) => details.rsvp_off;\n\nexport const selectTitleError = ({details}) => {\n  return selectRequestFailed({details}) && !selectTitle({details});\n};\nexport const selectTypeError = ({details}) => {\n  return selectRequestFailed({details}) && !selectType({details});\n};\nexport const selectHostError = ({details}) => {\n  return selectRequestFailed({details}) && !selectHost({details});\n};\nexport const selectStartDateError = ({details}) => {\n  return (\n    selectRequestFailed({details}) &&\n    (!selectStart({details}) || selectEventDateHasPassed({details}))\n  );\n};\nexport const selectRequiredComplete = ({details}) => {\n  return details.title.trim() && details.type && details.host && details.start;\n};\n\n/** Optional fields: [co-host, end] */\nexport const selectCohostName = ({details}) => details.cohost.name;\nexport const selectCohostEmail = ({details}) => details.cohost.email;\n\nexport const selectCohostEmailValid = ({details}) => {\n  return valid_email(selectCohostEmail({details})).is_valid;\n};\nexport const selectCohostNameError = ({details}) => {\n  return selectCohostEmailValid({details}) && !selectCohostName({details});\n};\nconst selectCohostEmailMissing = ({details}) => {\n  return selectCohostName({details}) && !selectCohostEmailValid({details});\n};\nexport const selectValidCohost = ({details}) => {\n  return (\n    !selectCohostEmailMissing({details}) && !selectCohostNameError({details})\n  );\n};\nexport const selectGuestsOfHonor = ({details}) => {\n  if (details.guestsOfHonor.guests.length == 0) return [{name: '', email: ''}];\n  return details.guestsOfHonor.guests;\n};\nexport const selectPhoneNumber = ({details}) => String(details.phoneNumber);\nexport const selectPhoneNumberIsValid = ({details}) => {\n  return (\n    !selectPhoneNumber({details}) ||\n    (selectPhoneNumber({details}) &&\n      parse_us_phone_number(selectPhoneNumber({details})).is_valid)\n  );\n};\n\nexport const selectStartDateBeforeEndDate = ({details}) => {\n  const {start, end} = details;\n  if (!end) return false;\n  return new Date(end).getTime() - new Date(start).getTime() < 0;\n};\n\n/** Allow submission */\nexport const selectIsDirty = ({details}) => {\n  const {address, cohost, time, timezone, request, ...rest} = details;\n\n  const flattened = {...address, ...cohost, ...time, ...rest};\n  const id = (id) => id;\n\n  return !Object.values(flattened).some(id);\n};\n\nexport const selectEventDateHasPassed = ({details}) => {\n  const {start} = details;\n\n  const then = new XDate(start);\n  const now = new XDate();\n  const diff = now.diffDays(then);\n\n  if (diff < 0) return true;\n  else return false;\n};\n\n/** Validate on submit/navigation */\nexport const selectEventDetailsValid = ({details}) => {\n  if (selectEventDateHasPassed({details})) return false;\n  if (selectStartDateBeforeEndDate({details})) return false;\n  if (!selectValidCohost({details})) return false;\n  if (!selectPhoneNumberIsValid({details})) return false;\n  return selectRequiredComplete({details});\n};\n\nexport const eventIsPremium = ({details}) => details.isPremium;\nexport const eventInEditMode = ({details}) => details.inEditMode;\nexport const eventInUpsellMode = ({details}) => details.isUpsellMode;\nexport const selectUsedAs = ({details}) => details.usedAs;\n","export const SET_EVITE_EVENT = 'eviteEvent/set';\n\nexport const UPDATE_EVITE_EVENT = 'eviteEvent/update';\n","export * from './reducer';\n","import {SET_EVITE_EVENT, UPDATE_EVITE_EVENT} from './constants';\nimport {INIT_APP} from '~/common/fabric/constants';\n\n/*\n  The eviteEvent reducer holds the 'event' model as returned by the server.\n  It should NEVER be modified.\n  Data only replaced when we receive a new EventModel from the server.\n  Intended for use by api calls.\n */\n\nconst initialState = {\n  // Initially empty\n  // will be set to the contents of the event model returned by the server\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case SET_EVITE_EVENT:\n      return {...action.payload};\n    case INIT_APP:\n      return {...action.payload.event};\n    case UPDATE_EVITE_EVENT:\n      return {\n        ...state,\n        ...action.payload,\n      };\n    default:\n      return state;\n  }\n};\n","export const getEventId = ({eviteEvent}) => eviteEvent?.id;\n\nexport const getEventHostId = ({eviteEvent}) => eviteEvent.host_id;\n\nexport const selectHostIds = ({eviteEvent, details}) => {\n  return details.cohost.email !== eviteEvent.cohost_email1\n    ? details.host_ids\n    : eviteEvent.host_ids;\n};\n\nexport const selectPendingHostIds = ({eviteEvent, details}) => {\n  return details.cohost.email !== eviteEvent.cohost_email1\n    ? details.pending_host_ids\n    : eviteEvent.pending_host_ids;\n};\n\nexport const selectUsedAs = ({eviteEvent}) => {\n  return eviteEvent.used_as;\n};\n","export const UPDATE_DESIGN_OPTIONS = 'fabricDesign/*/UpdateOptions';\nexport const SET_UPLOADED_IMAGE = 'fabricDesign/*/SetUploadedImage';\nexport const REVERT_TO_BASIC = 'fabricDesign/*/RevertToBasic';\n","export * from './reducer';\n","import {\n  REVERT_TO_BASIC,\n  SET_UPLOADED_IMAGE,\n  UPDATE_DESIGN_OPTIONS,\n} from './constants';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {INIT_APP} from '~/common/fabric/constants';\nimport {silver} from '~sass/pb_styleguide/base/_exports.sass';\nimport {SET_EVITE_EVENT} from '~/CreateFabricInvitation/reducers/eviteEvent/constants';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\n\nconst initialState = {\n  originalFabricArt: {},\n  fabricArt: {},\n  backgroundId: null,\n  backgroundColor: silver,\n  stampId: 'evite01',\n  envelopeId: 'wht01',\n  linerId: '',\n  envelopeStickers: null,\n  currentSection: Sections.CARD_DESIGN,\n  loaded: false,\n  touched: false,\n  pristine: true,\n  pristineUyo: false,\n  hasTextbox: true,\n  editingMobile: false,\n  editingUyoMobile: false,\n  textAreaOpen: false,\n  savingStep: false,\n  forceShowOnboardingModal: false,\n  uyoImageId: undefined,\n  uyoImagePath: '',\n  recentTextColors: [],\n  usedPremiumFeature: false,\n  defaultBackgroundColor: null,\n  defaultEnvelope: null,\n  defaultStamp: null,\n  defaultLiner: null,\n};\n\nfunction _first_matching_art(art, category_list) {\n  for (let c of category_list) if (c && art[c]) return art[c];\n}\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case UPDATE_DESIGN_OPTIONS:\n      return {...state, ...action.payload};\n    case SET_EVITE_EVENT:\n      const eviteEvent = action.payload;\n      return {\n        ...state,\n        fabricArt: eviteEvent?.fabric_design_data,\n        uyoImageId: eviteEvent?.options?.custom_image_id,\n        pristine: false,\n      };\n    case INIT_APP:\n      const template = action.payload.template || {};\n      const event = action.payload.event || {};\n      const design = event?.options?.design;\n\n      return {\n        ...state,\n        originalFabricArt: _first_matching_art(template?.editable_art, [\n          new URLSearchParams(window.location.search).get('category_id'),\n          'default',\n        ]),\n\n        fabricArt:\n          event?.fabric_design_data ??\n          _first_matching_art(template?.editable_art, [\n            new URLSearchParams(window.location.search).get('category_id'),\n            'default',\n          ]),\n        backgroundId: design?.background,\n        backgroundColor:\n          design?.background_color ??\n          (template?.background_color && template?.premium\n            ? template?.background_color\n            : silver),\n        defaultBackgroundColor:\n          design?.background_color ??\n          (template?.background_color && template?.premium\n            ? template?.background_color\n            : silver),\n        stampId: design?.stamp ?? template?.stamps?.[0] ?? stamps?.[0]?.id,\n        defaultStamp: design?.stamp ?? template?.stamps?.[0] ?? stamps?.[0]?.id,\n        envelopeId:\n          design?.envelope ?? template?.envelopes?.[0] ?? envelopes?.[0]?.id,\n        defaultEnvelope:\n          design?.envelope ?? template?.envelopes?.[0] ?? envelopes?.[0]?.id,\n        linerId: design?.liner ?? template?.liners?.[0] ?? liners?.[0]?.id,\n        defaultLiner: design?.liner ?? template?.liners?.[0] ?? liners?.[0]?.id,\n        currentSection: Sections.CARD_DESIGN,\n        envelopeStickers: design?.envelope_fabric_stickers,\n        loaded: false,\n        touched: !!event?.id,\n        pristine: !event?.id,\n        premiumFeaturesPristine: !event?.id || isInPremiumPricingVariationC(),\n        premiumFeaturesWarning: false,\n        ignorePremiumWarning: !!event?.id,\n        editingMobile: false,\n        editorDisabled: !!event?.id,\n        forceShowOnboardingModal: false,\n        uyoImageId: event?.options?.custom_image_id,\n      };\n    case SET_UPLOADED_IMAGE:\n      return {...state, uyoImageId: action.payload.imageKey};\n    case REVERT_TO_BASIC:\n      return {\n        ...state,\n        usedPremiumFeature: false,\n        backgroundId: null,\n        backgroundColor: state.defaultBackgroundColor,\n        stampId: state.defaultStamp,\n        envelopeId: state.defaultEnvelope,\n        linerId: state.defaultLiner,\n        envelopeStickers: null,\n        premiumFeaturesPristine: true,\n      };\n    default:\n      return state;\n  }\n};\n","export const selectFabricArt = ({fabricDesign}) => fabricDesign.fabricArt;\n\nexport const selectEnvelopeStickers = ({fabricDesign}) =>\n  fabricDesign.envelopeStickers;\n\nexport const selectOriginalFabricArt = ({fabricDesign}) =>\n  fabricDesign.originalFabricArt;\n\nexport const selectBackgroundId = ({fabricDesign}) => fabricDesign.backgroundId;\n\nexport const selectBackgroundColor = ({fabricDesign}) =>\n  fabricDesign.backgroundColor;\n\nexport const selectStampId = ({fabricDesign}) => fabricDesign.stampId;\n\nexport const selectEnvelopeId = ({fabricDesign}) =>\n  fabricDesign.envelopeId || 'wht01';\n\nexport const selectLinerId = ({fabricDesign}) => fabricDesign.linerId;\n\nexport const selectCurrentSection = ({fabricDesign}) =>\n  fabricDesign.currentSection;\n\nexport const selectLoaded = ({fabricDesign}) => fabricDesign?.loaded ?? false;\n\nexport const selectTouched = ({fabricDesign}) => fabricDesign.touched;\n\nexport const selectPristine = ({fabricDesign}) => fabricDesign.pristine;\nexport const selectPristineUyo = ({fabricDesign}) => fabricDesign.pristineUyo;\nexport const selectAllFieldsEdited = ({fabricDesign}) =>\n  fabricDesign.allFieldsEdited;\n\nexport const selectHasTextbox = ({fabricDesign}) => fabricDesign.hasTextbox;\n\nexport const selectPremiumFeaturesPristine = ({fabricDesign}) =>\n  fabricDesign.premiumFeaturesPristine;\n\nexport const selectPremiumFeaturesWarning = ({fabricDesign}) =>\n  fabricDesign.premiumFeaturesWarning;\n\nexport const selectIgnorePremiumWarning = ({fabricDesign}) =>\n  fabricDesign.ignorePremiumWarning;\n\nexport const selectSavingStep = ({fabricDesign}) => fabricDesign.savingStep;\n\nexport const selectTextAreaOpen = ({fabricDesign}) => fabricDesign.textAreaOpen;\n\nexport const selectEditingMobile = ({fabricDesign}) =>\n  fabricDesign.editingMobile;\n\nexport const selectEditorDisabled = ({fabricDesign}) =>\n  fabricDesign.editorDisabled;\n\nexport const selectEditingUyoMobile = ({fabricDesign}) =>\n  fabricDesign.editingUyoMobile;\n\nexport const selectForceShowOnboardingModal = ({fabricDesign}) =>\n  fabricDesign.forceShowOnboardingModal;\n\nexport const selectIsFullDyo = ({fabricTemplate}) =>\n  fabricTemplate.templateName === 'general-full_dyo';\n\nexport const selectSelectedEnvelope = (state) => {\n  const envelopeId = state.fabricDesign.envelopeId;\n  if (!envelopeId) return undefined;\n  for (let envelope of state.fabricTemplate.allEnvelopes)\n    if (envelope.id === envelopeId) return envelope;\n  return state.fabricTemplate.allEnvelopes[0];\n};\n\nexport const selectSelectedStamp = (state) => {\n  const stampId = state.fabricDesign.stampId;\n  if (!stampId) return undefined;\n  for (let stamp of state.fabricTemplate.allStamps)\n    if (stamp.id === stampId) return stamp;\n  return state.fabricTemplate.allStamps[0];\n};\n\nexport const selectSelectedLiner = (state) => {\n  const linerId = state.fabricDesign.linerId;\n  if (!linerId) return undefined;\n  for (let liner of state.fabricTemplate.allLiners)\n    if (liner.id === linerId) return liner;\n};\n\nexport const selectSelectedBackground = (state) => {\n  const backgroundId = state.fabricDesign.backgroundId;\n  if (!backgroundId) return undefined;\n  for (let bg of state.fabricTemplate.allBackgrounds)\n    if (bg.id === backgroundId) return bg;\n};\n\nexport const selectUsedPremiumFeature = (state) =>\n  state.fabricDesign.usedPremiumFeature;\n","export const SET_FABRIC_TEMPLATE = '/Template/*/Set';\nexport const SET_TEMPLATE_SNAPSHOT = '/Template/*/SNAPSHOT';\n\nexport const TEMPORARY_STAMP_ASSET_ORDERING = [\n  /**\n   * In lieu of easy access to asset ids we will use asset display\n   * names as unique identifiers arrayed in the expected order\n   */\n  'After Life Skulls',\n  'Black Cat Tomb',\n  'Pick Your Poison',\n  'Spooky Bats',\n  'Faboolous',\n  'Beary Happy Holiday',\n  'Gold Joy',\n  'Holiday Trees',\n  'Top Hat Snowman',\n  'Fa La La',\n  'Dove of Peace',\n  'Fair Isle Holiday Bell',\n  'Menorah',\n  'Star of David',\n  'Happy Happy Happy',\n  'Black Candles',\n  'Party Pennant',\n  'Party Hats',\n  'Birthday Cake',\n  'Gold HBD and Confetti',\n  'Pop Art Stars',\n  'Moon and Stars',\n  'Pastel Rainbow',\n  'Happy Cloud',\n  'Peek-A-Boo Bear',\n  'Jumping for Joy',\n  'Shooting Star',\n  'Sticker Collage',\n  'Baby Sprinkles',\n  'Gold Crown',\n  'Watercolor Wildflowers',\n  'Green Sprig',\n  'Party Gold',\n  'Hedgehog',\n  'Ocean Waves',\n  'Red Heart',\n  'Bright Rainbow',\n  \"You're Invited Scalloped Border\",\n  'Heart Chocolate',\n  'Retro Flowers',\n  'Graduation Cap',\n  'Fireworks',\n  'Flower Garden',\n  'Ombré Lightning Bolt',\n  'Pink-Purple Stars',\n  'Red Celebrate',\n  'Retro Rainbow Stars',\n  'Neon Cocktail',\n  'Gold Cheers',\n  'Smiley Face',\n  'Comic Book Boom',\n  'Victorian Garden',\n  'Watercolor Greenery',\n  'Typographic Love',\n  'Happy Face',\n  'Gold Love Heart',\n  'Diamond Engagement Ring',\n  'Pink Rose',\n  'Champagne and Confetti',\n  \"Blue You're Invited\",\n  'Single Diamond',\n  \"Gold and Ivory You're Invited\",\n  'Rose Gold Ribbon',\n  'Gold Cutout Heart',\n];\n\nexport const TEMPORARY_STICKER_ASSET_ORDERING = [\n  /**\n   * In lieu of easy access to asset ids we will use asset display\n   * names as unique identifiers arrayed in the expected order\n   */\n  'Bat',\n  'Candy Corn',\n  'Faboolous',\n  'Ghost',\n  'Hocus Pocus',\n  'Pumpkin',\n  'Skeleton',\n  'Trick or Treat',\n  'Blushing Snowflake',\n  'Cool Snowflake',\n  'Gift Box',\n  'Ho Ho Ho',\n  'Jumping Snowman',\n  'Merry Vibes',\n  'Peace Love',\n  'Spinning Ornament',\n  'Surfer Reindeer',\n  'Xmas Palm Tree',\n  'Give Thanks',\n  'Gratitude',\n  'Oh My Gourd',\n  'Thanks a Latte',\n  'Turkey',\n  'Colorful Balloons',\n  \"Can't Wait\",\n  'Click',\n  'Conga',\n  'IYKYK',\n  'New',\n  'New Post',\n  'Party!!!',\n  'Pointing',\n  'Smile',\n  'Swipe Up',\n  'Tap Here',\n  'Wave',\n  \"You're Invited\",\n  'Bride Sash',\n  'Bridesmaid Sash',\n  'Wedding Cake',\n  'Margarita',\n  'Wedding Veil',\n  'Beers (Dark Outline)',\n  'Fire Football',\n  'Foam Finger (Outline)',\n  'Game On',\n  'Super',\n  'Super Bowl Trophy',\n  'Galentine',\n  'Love',\n  'Rosés',\n  'So Sweet',\n  'XOXO',\n  'Best in Bloom',\n  'Butterfly',\n  'Spring Has Sprung',\n  'Pink Tulip',\n  \"Rise'n Shine\",\n  'Easter Hatch',\n  'Hop on Over',\n  'Hoppy Bee',\n  'Hop to See You',\n  'Somebunny',\n  'Heart',\n  'Love You',\n  'Ribbon',\n  'Rose and Bud',\n  \"Mother's Day Trophy\",\n  \"Mother's Day Type\",\n  'Happy Pride',\n  'Pride Heart',\n  'Love Is Love',\n  'Love Wins',\n  'Pride',\n];\n\nexport const TEMPORARY_LINER_ASSET_ORDERING = [\n  /**\n   * In lieu of easy access to asset ids we will use asset display\n   * names as unique identifiers arrayed in the expected order\n   */\n  'Black Cat',\n  'Grey Pumpkins',\n  'Halloween Feast',\n  'Candy Corn',\n  'Witching Hour',\n  'Spooky Bats',\n  'Green Pine',\n  'Holiday Stars',\n  'Retro Snowflakes',\n  'Holiday Confetti',\n  'Holiday String Lights',\n  'Ivory Pine',\n  'Beige Star of David',\n  'Colorful Retro Starbursts',\n  'Night Sky',\n  'Colorful Twinkling Stars',\n  'Holiday Trees',\n  'Gold Star of David',\n  'Holly Berries',\n  'Party Balloons',\n  'Metallic Confetti',\n  'Colorful Confetti on White',\n  'Glitter Gradient',\n  'Retro Geometric Confetti',\n  'Gold Stars on Black',\n  'Pop Art Stars',\n  'Pompom Party Hats',\n  'Rainbow Colorful Stripes',\n  'Floating Balloons',\n  'Ribbon Confetti on Gold',\n  'Colorful Confetti on Cream',\n  'Blue Grid',\n  'Pastel Stripes',\n  'Hearts and Stars Shapes',\n  'Hearts and Flourishes',\n  'Textured Stars',\n  'Wildflowers',\n  'Teal Gradient',\n  'Pink and Gold Hearts',\n  'Colorful Raindrops',\n  'Restful Pastel Stars',\n  'Daisies',\n  'Blue and Pink Flowers',\n  'Rainbow Brushstroke',\n  'Pink and Orange Hearts',\n  'Golden Leaves',\n  'Silver Disco',\n  'Red Grid',\n  'Squiggly Confetti',\n  'Rainbow Gradient',\n  'Gold Foil Stars',\n  'Rustic Stripes',\n  'Pastel Gradient',\n  'Gradient Stars',\n  'Field of Daisies on Blue',\n  'Smiley Face',\n  'Purple Watercolor',\n  'Green Watercolor',\n  'Pink Watercolor',\n  'Gradient Rainbow Hearts',\n  'Grey Harlequin Pattern',\n  'Gold Fireworks',\n  'Field of Daisies on Green',\n  'Wavy Colorful Lines',\n  'Watercolor Plants',\n  'Blue and Pink Grid',\n  'Superhero Pop Art',\n  'Palm Trees on Pink',\n  'Butterflies and Flowers',\n  'Gold Glitter',\n  'Gold Polka Dots',\n  'Gold Stripes',\n  'Gold Light Rays',\n  'Rose Gold',\n  'Gold Confetti',\n  'Silver Soirée',\n  'Gold Soirée',\n  'Bronze Soirée',\n  'Gold and Silver Stars',\n  'Gold Loops',\n  'With Love',\n  'Gold String Lights',\n];\n","export * from './reducer';\n","import {SET_FABRIC_TEMPLATE, SET_TEMPLATE_SNAPSHOT} from './constants';\nimport {SET_ALL_ASSETS} from '../constants';\nimport {INIT_APP} from '~/common/fabric/constants';\n\nconst initialState = {\n  artist: '',\n  backgroundColor: '',\n  backgrounds: [],\n  displayName: '',\n  editableArt: {default: []},\n  envelopes: [],\n  eventType: '',\n  liners: [],\n  metaDescription: null,\n  premium: false,\n  snapshot: null,\n  stamps: [],\n  stickers: [],\n  templateName: '',\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case SET_FABRIC_TEMPLATE:\n      return {...state, ...action.payload};\n    case SET_TEMPLATE_SNAPSHOT:\n      return {...state, snapshot: action.payload};\n    case INIT_APP:\n      const _t = action.payload.template;\n      return {\n        allBackgrounds: action.payload.allBackgrounds,\n        allEnvelopes: action.payload.allEnvelopes,\n        allLiners: action.payload.allLiners,\n        allStamps: action.payload.allStamps,\n        allStickers: action.payload.allStickers,\n        artist: _t.artist,\n        backgroundColor: _t.background_color,\n        backgrounds: action.payload.allBackgrounds,\n        displayName: _t.display_name,\n        editableArt: _t.editable_art,\n        envelopes: _t.envelopes,\n        eventType: _t.event_type,\n        liners: _t.liners,\n        metaDescription: _t.meta_description,\n        premium: _t.premium,\n        rsvpOptional: _t.rsvp_optional,\n        snapshot: null,\n        stamps: action.payload.stamps,\n        stickers: _t.stickers,\n        templateName: _t.id,\n        usedAs: _t.used_as,\n      };\n    case SET_ALL_ASSETS:\n      const {\n        allStamps,\n        allStickers,\n        allLiners,\n        allBackgrounds,\n        allEnvelopes,\n      } = action.payload.allAssets;\n      return {\n        ...state,\n        ...{\n          allStamps,\n          allStickers,\n          allLiners,\n          allBackgrounds,\n          allEnvelopes,\n          backgrounds: allBackgrounds,\n          stamps: allStamps,\n        },\n      };\n    default:\n      return state;\n  }\n};\n","import {\n  TEMPORARY_STAMP_ASSET_ORDERING,\n  TEMPORARY_STICKER_ASSET_ORDERING,\n  TEMPORARY_LINER_ASSET_ORDERING,\n} from './constants';\n\n// todo:\n// selectDefaultStamp\n// selectDefaultEnvelope\n\nexport const selectEditableArtForEventType = (eventType = null) => {\n  return (state) => {\n    if (!eventType) eventType = state.event.event_type;\n    if (Object.keys(state.fabricTemplate.editableArt).indexOf(eventType) < 0)\n      eventType = 'default';\n    return state.fabricTemplate.editableArt[eventType];\n  };\n};\n\nexport const selectDefaultStampId = (eventType = null) => {\n  return (state) => {\n    return;\n  };\n};\n\nexport const selectIsPremium = ({details}) => details.isPremium;\nexport const selectIsProOrPartyPass = ({user}) => {\n  return (\n    user.subscriptionPlanName === 'pro' ||\n    user.subscriptionPlanName === 'party_pass'\n  );\n};\n\nconst halloweenStamps = ({display_name: dn}) =>\n  TEMPORARY_STAMP_ASSET_ORDERING.includes(dn);\n\nconst stampOrder = (a, b) =>\n  TEMPORARY_STAMP_ASSET_ORDERING.indexOf(a.display_name) -\n  TEMPORARY_STAMP_ASSET_ORDERING.indexOf(b.display_name);\n\nconst halloweenStickers = ({display_name: dn}) =>\n  TEMPORARY_STICKER_ASSET_ORDERING.includes(dn);\n\nconst stickerOrder = (a, b) =>\n  TEMPORARY_STICKER_ASSET_ORDERING.indexOf(b.display_name) -\n  TEMPORARY_STICKER_ASSET_ORDERING.indexOf(a.display_name);\n\nconst halloweenLiners = ({display_name: dn}) =>\n  TEMPORARY_LINER_ASSET_ORDERING.includes(dn);\n\nconst linerOrder = (a, b) =>\n  TEMPORARY_LINER_ASSET_ORDERING.indexOf(a.display_name) -\n  TEMPORARY_LINER_ASSET_ORDERING.indexOf(b.display_name);\n\nexport const selectEnvelopes = ({fabricTemplate}) =>\n  fabricTemplate.allEnvelopes;\nexport const selectLiners = ({fabricTemplate: {allLiners = []}}) => \n  [...allLiners?.filter(halloweenLiners).sort(linerOrder)] // prettier-ignore\nexport const selectBackgrounds = ({fabricTemplate}) =>\n  fabricTemplate.allBackgrounds;\nexport const selectStamps = ({fabricTemplate: {allStamps = []}}) =>\n  [...allStamps?.filter(halloweenStamps).sort(stampOrder)] // prettier-ignore\nexport const selectStickers = ({fabricTemplate: {allStickers = []}}) => \n  [...allStickers?.filter(halloweenStickers).sort(stickerOrder)] // prettier-ignore\nexport const selectSnapshot = ({fabricTemplate}) => fabricTemplate.snapshot;\nexport const selectTemplateName = ({fabricTemplate}) =>\n  fabricTemplate.templateName;\nexport const selectIsPremiumTemplate = ({fabricTemplate}) =>\n  fabricTemplate.premium;\nexport const selectEventType = ({fabricTemplate}) => fabricTemplate.eventType;\nexport const selectRsvpOptional = ({fabricTemplate}) =>\n  fabricTemplate.rsvpOptional;\nexport const selectUsedAs = ({fabricTemplate}) => fabricTemplate.usedAs;\n","export const UPDATE_GIFT_OPTIONS = '/EventGifting/*/Update';\n\nexport const UPDATE_PLEDGELING_OPTIONS = '/EventGifting/*/Update/Pledgeling';\n","export * from './reducer';\n","import {INIT_APP} from '~/common/fabric/constants';\nimport {SET_EVITE_EVENT} from '../eviteEvent/constants';\nimport {UPDATE_GIFT_OPTIONS, UPDATE_PLEDGELING_OPTIONS} from './constants';\nimport {UPDATE_INVITATION_SUMMARY} from '~/ViewInvitation/reducers/constants';\n\nconst initialState = {\n  gift_registry_name: '',\n  gift_registry_urls: [],\n  options: {event_option_show_gifting: true},\n  showGifting: true,\n  pledgeling_data: {\n    Crowdfund: {},\n    Organization: {},\n  },\n  upgraded: false,\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case UPDATE_PLEDGELING_OPTIONS: {\n      const {pledgeling_data} = state;\n      return {...state, pledgeling_data: pledgeling(pledgeling_data, action)};\n    }\n    case UPDATE_INVITATION_SUMMARY: {\n      return {\n        ...state,\n      };\n    }\n    case UPDATE_GIFT_OPTIONS:\n      return {...state, ...action.payload};\n    case SET_EVITE_EVENT: {\n      const {\n        gift_registry_name,\n        gift_registry_urls,\n        options,\n        pledgeling_data,\n      } = action.payload;\n      const {event_option_show_gifting: showGifting} = options;\n\n      return {\n        ...state,\n        gift_registry_name,\n        gift_registry_urls,\n        options,\n        // We had some events written with bad pledgeling_data, so we are fixing that up here.\n        pledgeling_data: pledgeling_data || initialState.pledgeling_data,\n        showGifting,\n      };\n    }\n    case INIT_APP: {\n      if (action.payload.event) {\n        const {\n          gift_registry_name,\n          gift_registry_urls,\n          pledgeling_data,\n          options,\n        } = action.payload.event;\n        const {event_option_show_gifting} = options;\n\n        return {\n          ...state,\n          gift_registry_name,\n          gift_registry_urls,\n          options,\n          showGifting: event_option_show_gifting,\n          // We had some events written with bad pledgeling_data, so we are fixing that up here.\n          pledgeling_data: pledgeling_data || initialState.pledgeling_data,\n        };\n      } else {\n        return state;\n      }\n    }\n    default:\n      return state;\n  }\n};\n\nexport const pledgeling = (state, action = {}) => {\n  switch (action.payload.beneficiary_type) {\n    case 'Crowdfund': {\n      if ('purpose' in action.payload === false) {\n        return {...state, Crowdfund: {}};\n      }\n\n      const {\n        beneficiary_type: pledgeling_beneficiary_type,\n        purpose: pledgeling_purpose,\n        goal: pledgeling_goal,\n        ...rest\n      } = action.payload;\n\n      return {\n        ...state,\n        Crowdfund: {\n          ...state.Crowdfund,\n          pledgeling_beneficiary_type,\n          pledgeling_purpose: pledgeling_purpose.toString(),\n          pledgeling_goal,\n          ...rest,\n        },\n      };\n    }\n\n    case 'Organization': {\n      if ('beneficiary_uuid' in action.payload === false) {\n        const {\n          event_id,\n          host_id,\n          pledgeling_data_item_id,\n          additional_data,\n        } = state.Organization;\n\n        return {\n          ...state,\n          Organization: {\n            event_id,\n            host_id,\n            pledgeling_data_item_id,\n            additional_data,\n          },\n        };\n      }\n\n      const {\n        beneficiary_type: pledgeling_beneficiary_type,\n        beneficiary_uuid: pledgeling_uuid,\n        beneficiary_id: pledgeling_id,\n        goal: pledgeling_goal,\n        ...rest\n      } = action.payload;\n\n      return {\n        ...state,\n        Organization: {\n          ...state.Organization,\n          pledgeling_beneficiary_type,\n          pledgeling_goal: pledgeling_goal.toString(),\n          pledgeling_id: pledgeling_id.toString(),\n          pledgeling_uuid,\n          ...rest,\n        },\n      };\n    }\n\n    default:\n      return state;\n  }\n};\n","import {createStore, applyMiddleware, compose} from 'redux';\nimport thunk from 'redux-thunk';\nimport {rootReducer} from './reducers';\nimport {promiseResolverMiddleware} from '../middleware/PromiseResolver';\nimport {dataLayerMiddleware} from '../middleware/dataLayerMiddleware';\nimport {previewTransformMiddleware} from '../middleware/previewTransform';\n\nconst composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;\n\nconst middleWares = [\n  thunk,\n  dataLayerMiddleware,\n  promiseResolverMiddleware,\n  previewTransformMiddleware,\n];\n\nconst createStoreWithMiddleware = composeEnhancers(\n  applyMiddleware(...middleWares)\n)(createStore);\n\nexport const createCreateFabricInvitationStore = (initialState) => {\n  return createStoreWithMiddleware(rootReducer, initialState);\n};\n","export const SHOW_NOTIFY_GUESTS_OVERLAY = '/modals/NotifyGuestsOverlay/show';\nexport const HIDE_NOTIFY_GUESTS_OVERLAY = '/modals/NotifyGuestsOverlay/hide';\nexport const CANCEL_NOTIFY_GUESTS_OVERLAY =\n  '/modals/NotifyGuestsOverlay/cancel';\nexport const SET_UPSELL_MODAL_ORDER = '/modals/Upsell/setOrder';\nexport const SET_UPSELL_CONFIRMED = '/modals/Upsell/SetUpsellConfirmed';\n","export * from './constants';\nexport * from './reducer';\nexport * from './selectors';\n","import {\n  SHOW_NOTIFY_GUESTS_OVERLAY,\n  HIDE_NOTIFY_GUESTS_OVERLAY,\n  CANCEL_NOTIFY_GUESTS_OVERLAY,\n  SET_UPSELL_MODAL_ORDER,\n  SET_UPSELL_CONFIRMED,\n} from './constants';\n\nconst initialState = {\n  showNotifyGuestsOverlay: false,\n  upsellConfirmed: false,\n};\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case SHOW_NOTIFY_GUESTS_OVERLAY:\n      return {\n        ...state,\n        showNotifyGuestsOverlay: true,\n      };\n    case CANCEL_NOTIFY_GUESTS_OVERLAY:\n    case HIDE_NOTIFY_GUESTS_OVERLAY:\n      return {\n        ...state,\n        showNotifyGuestsOverlay: false,\n      };\n    case SET_UPSELL_MODAL_ORDER:\n      return {\n        ...state,\n        ...action.payload,\n      };\n    case SET_UPSELL_CONFIRMED:\n      return {\n        ...state,\n        upsellConfirmed: action.payload,\n      };\n    default:\n      return state;\n  }\n}\n","export const notifyGuestsOverlayShowing = (state) => {\n  return state.modals.showNotifyGuestsOverlay;\n};\n\nexport const anyOverlayShowing = (state) => {\n  // TODO: Need to consolidate any other modals state into redux to make this useful\n  return (\n    state.modals.showNotifyGuestsOverlay || state.loginModal?.showLoginModal\n  );\n};\n\nexport const selectUpsellOrder = (state) => {\n  return state.modals.sectionToRemove;\n};\n\nexport const selectIsUpsellConfirmed = (state) => state.modals.upsellConfirmed;\n","/** Global imports */\nimport {combineReducers} from 'redux';\nimport {reducer as loginModal} from '~/CreateFabricInvitation/components/LoginModal/reducer';\nimport {reducer as details} from './details';\nimport {reducer as giftingOptions} from './giftingOptions';\nimport {reducer as guests} from '~/common/fabric/EventGuests/reducers/guests';\nimport {reducer as review} from './review';\nimport {reducer as fabricTemplate} from './fabricTemplate';\nimport {reducer as fabricDesign} from './fabricDesign';\nimport {reducer as eviteEvent} from './eviteEvent';\nimport {reducer as user} from '../../common/fabric/User/reducers/user';\nimport {reducer as modals} from './modals';\nimport {reducer as webview} from './webview/reducer';\nimport {reducer as widgets} from './widgets';\n\n/** Local imports */\n\nexport const rootReducer = combineReducers({\n  details,\n  fabricDesign,\n  fabricTemplate,\n  giftingOptions,\n  guests,\n  loginModal,\n  eviteEvent,\n  user,\n  review,\n  modals,\n  webview,\n  widgets,\n  // for invitation preview\n  moduleOrder: (state = {}) => state,\n  eventDetails: (state = {}) => state,\n  coverData: (state = {}) => state,\n  rsvp: (state = {}) => state,\n  gifting: (state = {}) => state,\n  registry: (state = {}) => state,\n  poll: (state = {}) => state,\n  giftKeywords: (state = {}) => state,\n  whatToBring: (state = {}) => state,\n  whatToBringSummary: (state = {}) => state,\n  guestList: (state = {}) => state,\n  whoIsComing: (state = {}) => state,\n  donation: (state = {}) => state,\n  premiumDesign: (state = {}) => state,\n});\n","export const UPDATE_NAME_ON_CARD = 'CreateInvitationReview/*/UpdateNameOnCard';\nexport const UPDATE_CARD_NUMBER_LAST_FOUR =\n  'CreateInvitationReview/*/UpdateCardNumberLastFour';\nexport const UPDATE_CARD_ENCRYPTED =\n  'CreateInvitationReview/*/UpdateCardEncrypted';\nexport const UPDATE_CARD_NUMBER_FILLED =\n  'CreateInvitationReview/*/UpdateCardNumberFilled';\nexport const UPDATE_CARD_EXP_DATE_FILLED =\n  'CreateInvitationReview/*/UpdateCardExpirationDate';\nexport const UPDATE_CARD_CVC_FILLED =\n  'CreateInvitationReview/*/UpdateCardSecurityCode';\nexport const UPDATE_BILLING_ZIP = 'CreateInvitationReview/*/UpdateBillingZIP';\nexport const TOGGLE_PROMO_CODE = 'CreateInvitationReview/*/TogglePromoCode';\nexport const UPDATE_SELECTED_OFFER_KEY =\n  'CreateInvitationReview/*/UpdateSelectedOfferKey';\nexport const INIT_OFFERS = 'CreateInvitationReview/*/InitOffers';\nexport const SET_CALC = 'CreateInvitationReview/*/SetCalc';\nexport const TOGGLE_USE_EXISTING_PAYMENT =\n  'CreateInvitationReview/*/ToggleUseExistingPayment';\nexport const SET_UPDATING_PAYMENT_CALC =\n  'CreateInvitationReview/*/SetUpdateingPaymentCalc';\nexport const SET_ORDER_DATE = 'CreateInvitationReview/*/SetOrderDate';\nexport const SET_PAYMENT_METHOD = 'CreateInvitationReview/*/SetPaymentMethod';\nexport const UPDATE_PAYMENT_TYPE = 'CreateInvitationReview/*/UpdatePaymentType';\nexport const UPDATE_REVIEW = 'CreateInvitationReview/*/UpdateReview';\nexport const INVITATION_CHECKED_OUT =\n  'CreateInvitationReview/*/InvitationCheckedOut';\nexport const SET_USE_EXISTING_PAYMENT =\n  'CreateInvitationReview/*/SetUseExistingPayment';\n\nexport const TOGGLE_DELIVER_CARD_NOW =\n  'CreateGreetingCard/*/ToggleDeliverCardNow';\nexport const UPDATE_DELIVER_CARD_DATE_TIME =\n  'CreateGreetingCard/*/UpdateDeliverCardDateTime';\n\nexport const UPDATE_DELIVER_CARD_TIMEZONE =\n  'CreateGreetingCard/*/UpdateDeliverCardTimeZone';\n\nexport const UPDATE_SENDER = 'CreateGreetingCard/*/UpdateSender';\nexport const GREETING_CARD_CHECKED_OUT = 'CreateGreetingCard/*/CheckedOut';\nexport const RESET_REVIEW = 'CreateGreetingCard/*/ResetReview';\nexport const GREETING_CARD_E_GIFT_CHECKED_OUT =\n  'CreateGreetingCard/*/EGiftCardCheckedOut';\n","export * from './reducer';\n","import {\n  UPDATE_CARD_EXP_DATE_FILLED,\n  UPDATE_CARD_NUMBER_LAST_FOUR,\n  UPDATE_CARD_NUMBER_FILLED,\n  UPDATE_NAME_ON_CARD,\n  UPDATE_CARD_CVC_FILLED,\n  UPDATE_BILLING_ZIP,\n  TOGGLE_PROMO_CODE,\n  UPDATE_SELECTED_OFFER_KEY,\n  INIT_OFFERS,\n  SET_CALC,\n  TOGGLE_USE_EXISTING_PAYMENT,\n  UPDATE_CARD_ENCRYPTED,\n  UPDATE_PAYMENT_TYPE,\n  SET_UPDATING_PAYMENT_CALC,\n  SET_ORDER_DATE,\n  SET_PAYMENT_METHOD,\n  UPDATE_REVIEW,\n  INVITATION_CHECKED_OUT,\n  SET_USE_EXISTING_PAYMENT,\n  UPDATE_SENDER,\n  TOGGLE_DELIVER_CARD_NOW,\n  UPDATE_DELIVER_CARD_DATE_TIME,\n  UPDATE_DELIVER_CARD_TIMEZONE,\n  GREETING_CARD_CHECKED_OUT,\n  RESET_REVIEW,\n  GREETING_CARD_E_GIFT_CHECKED_OUT,\n} from './constants';\nimport XDate from 'xdate';\nimport {USER_LOGGED_IN} from '~/common/components/LoginModal/reducer';\n\nconst dayPlusOne = XDate()\n  .addDays(1)\n  .setMinutes(0)\n  .setSeconds(0)\n  .toString('i')\n  .slice(0, 16);\n\nconst checkDateIsTodayOrBefore = (date) =>\n  Math.floor(XDate().diffDays(XDate(date))) < 0;\n\nconst getSendCardDate = (date) => {\n  if (!date || checkDateIsTodayOrBefore(date)) {\n    return dayPlusOne;\n  }\n  return date;\n};\n\nconst initialState = {\n  expDateFilled: false,\n  cardNumberFilled: false,\n  cardNumberLastFour: '',\n  nameOnCard: '',\n  promoCode: '',\n  hasPromoCode: false,\n  cardSecurityCodeFilled: false,\n  billingZip: '',\n  selectedOfferKey: undefined,\n  offers: [],\n  calc: {},\n  encryptedCard: {},\n  useExistingPaymentOnFile: false,\n  isUpdatingPaymentCalc: false,\n  orderDate: null,\n  paymentMethod: '',\n  eventHostName: window?.evite_event?.host_name || window?.userName,\n  deliverCardNow: !window?.evite_event?.send_on,\n  deliveryCardDateTime: getSendCardDate(window?.evite_event?.send_on),\n  known_timezone_abbr: window?.evite_event?.known_timezone_abbr || 'PT',\n  known_timezone_name:\n    window?.evite_event?.known_timezone_name || 'America/Los_Angeles',\n  checkedOut: false,\n  e_gift_purchase_response: {},\n};\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case UPDATE_NAME_ON_CARD:\n      return {\n        ...state,\n        nameOnCard: action.payload,\n      };\n    case UPDATE_REVIEW:\n      return {\n        ...state,\n        review: action.payload,\n      };\n    case UPDATE_PAYMENT_TYPE:\n      return {\n        ...state,\n        paymentType: action.payload,\n      };\n    case UPDATE_CARD_NUMBER_LAST_FOUR:\n      return {\n        ...state,\n        cardNumberLastFour: action.payload,\n      };\n    case UPDATE_CARD_ENCRYPTED:\n      return {\n        ...state,\n        encryptedCard: {...action.payload},\n      };\n    case UPDATE_CARD_NUMBER_FILLED:\n      return {\n        ...state,\n        cardNumberFilled: action.payload,\n      };\n    case UPDATE_CARD_EXP_DATE_FILLED:\n      return {\n        ...state,\n        expDateFilled: action.payload,\n      };\n    case UPDATE_CARD_CVC_FILLED:\n      return {\n        ...state,\n        cardSecurityCodeFilled: action.payload,\n      };\n    case UPDATE_BILLING_ZIP:\n      return {\n        ...state,\n        billingZip: action.payload,\n      };\n    case TOGGLE_PROMO_CODE:\n      return {\n        ...state,\n        hasPromoCode: !state.hasPromoCode,\n        promoCode: '',\n      };\n    case UPDATE_SELECTED_OFFER_KEY:\n      return {\n        ...state,\n        selectedOfferKey: action.payload,\n      };\n    case INIT_OFFERS:\n      return {\n        ...state,\n        offers: [...action.payload],\n      };\n    case SET_CALC:\n      return {\n        ...state,\n        calc: {...action.payload},\n        offers: [...action.payload.availableOffers],\n      };\n    case TOGGLE_USE_EXISTING_PAYMENT:\n      return {\n        ...state,\n        useExistingPaymentOnFile: action.payload,\n      };\n    case SET_USE_EXISTING_PAYMENT:\n      return {\n        ...state,\n        useExistingPaymentOnFile: action.payload,\n      };\n    case SET_UPDATING_PAYMENT_CALC:\n      return {\n        ...state,\n        isUpdatingPaymentCalc: action.payload,\n      };\n    case INVITATION_CHECKED_OUT:\n      const {purchase_response, purchase_transaction_data} = action.payload;\n      return {\n        ...state,\n        checkedOut: true,\n        purchase_response,\n        purchase_transaction_data,\n      };\n    case GREETING_CARD_CHECKED_OUT:\n      return {\n        ...state,\n        purchase_response: action.payload.purchase_response,\n        purchase_transaction_data: action.payload.purchase_transaction_data,\n      };\n    case GREETING_CARD_E_GIFT_CHECKED_OUT:\n      return {\n        ...state,\n        e_gift_purchase_response: action.payload,\n      };\n    case SET_ORDER_DATE:\n      return {\n        ...state,\n        orderDate: action.payload,\n      };\n    case SET_PAYMENT_METHOD:\n      return {\n        ...state,\n        paymentMethod: action.payload,\n      };\n\n    /** GREETING CARD ACTIONS */\n\n    case USER_LOGGED_IN:\n      return {\n        ...state,\n        eventHostName: state.eventHostName || action.userName,\n      };\n\n    case UPDATE_SENDER:\n      return {\n        ...state,\n        eventHostName: action.payload,\n      };\n\n    /** Toggle whether to deliver the card now */\n    case TOGGLE_DELIVER_CARD_NOW: {\n      if (action.payload === true) {\n        return {\n          ...state,\n          deliverCardNow: true,\n          deliveryCardDateTime: null,\n          known_timezone_abbr: null,\n          known_timezone_name: null,\n        };\n      } else {\n        return {\n          ...state,\n          deliverCardNow: false,\n          deliveryCardDateTime: dayPlusOne,\n        };\n      }\n    }\n    case UPDATE_DELIVER_CARD_DATE_TIME: {\n      return {\n        ...state,\n        deliveryCardDateTime: action.payload,\n      };\n    }\n    case UPDATE_DELIVER_CARD_TIMEZONE: {\n      return {\n        ...state,\n        ...action.payload,\n      };\n    }\n    case RESET_REVIEW: {\n      return {...initialState};\n    }\n    default:\n      return state;\n  }\n}\n","export const selectSelectedOffer = (state) => {\n  if (Object.keys(state.review.calc).length === 0) {\n    return;\n  }\n\n  const key = Object.keys(state.review.calc.selectedOffers)[0];\n  const availableOffers = state.review.calc.availableOffers;\n  if (!key || !availableOffers) return {};\n  const offer = availableOffers.find((o) => o.offerKey === key);\n  if (!offer) {\n    return {};\n  }\n  return offer;\n};\n\nexport const selectSender = ({review}) => review.eventHostName;\nexport const selectDeliverCardNow = ({review}) => review.deliverCardNow;\n\nexport const selectDeliveryCardDateTime = ({review}) =>\n  review.deliveryCardDateTime;\n\nexport const selectDeliveryCardTimezone = ({review}) => ({\n  known_timezone_abbr: review.known_timezone_abbr,\n  known_timezone_name: review.known_timezone_name,\n});\n\nexport const selectVirtualQuantity = (state) => {\n  const {virtualQuantity} = selectSelectedOffer(state);\n  return virtualQuantity;\n};\n\nexport const selectDisplayPrice = (state) => {\n  const {displayPrice} = selectSelectedOffer(state);\n  return displayPrice;\n};\nexport const selectPromoCode = (state) => {\n  const promocode = state.review.calc.promocode;\n  return promocode;\n};\nexport const selectPromoType = (state) => {\n  const promoType = state.review.calc.promoType;\n  return promoType;\n};\nexport const selectPurchaseChargeId = (state) => {\n  const {charge_id} = state.review.purchase_response;\n  return charge_id;\n};\n\nexport const selectTransactionId = (state) => {\n  const {transaction} = state.review.purchase_response;\n  return transaction;\n};\n\n// GTM/dataLayer reporting requires '1.99' not '$1.99'\nexport const selectEcommerceDisplayPrice = (state) => {\n  const {displayPrice} = selectSelectedOffer(state);\n  return displayPrice.substring(1);\n};\n\n// GTM/dataLayer reporting individual product data for checkout\nexport const selectEcommerceProduct = (state) => {\n  return {\n    quantity: selectVirtualQuantity(state),\n    price: selectEcommerceDisplayPrice(state),\n    brand: 'Evite',\n  };\n};\n\nconst actionFieldDefaults = {\n  affiliation: 'Fabric GreetingCard',\n  tax: 0.0,\n  shipping: 0.0,\n  promoType: '',\n  promocode: '',\n};\n\n// GTM/dataLayer reporting action field data for checkout\nexport const selectActionField = (state) => {\n  const revenue = selectDisplayPrice(state);\n  const id = selectPurchaseChargeId(state);\n  const promocode = selectPromoCode(state);\n  const promoType = selectPromoType(state);\n\n  return {...actionFieldDefaults, revenue, id, promoType, promocode};\n};\n\n// GTM/dataLayer Ecommerce reporting field data for checkout\nexport const selectEcommerceObject = (state) => {\n  const actionField = state.review.purchase_response\n    ? selectActionField(state)\n    : null;\n  const products = [selectEcommerceProduct(state)];\n  const purchasePrice = selectEcommerceDisplayPrice(state);\n  const transaction_id = state.review.purchase_response\n    ? selectTransactionId(state)\n    : null;\n  const {offerId: offer_id} = selectSelectedOffer(state);\n\n  return {\n    ecommerce: {actionField, products},\n    offer_id,\n    purchasePrice,\n    transaction_id,\n  };\n};\n","import {INIT_APP} from '~/common/fabric/constants';\nimport {webViewSetIsPremium} from '../../webview/webview';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\n\n// No real state here - we just listen for events that the apps need to be notified for\n// Not a normal reducer - just a bridge to let the mobile apps know when certain actions occur\n\nconst initialState = {};\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case UPDATE_EVENT_DETAILS:\n      const premium = action.payload.isPremium;\n      if (typeof premium !== 'undefined')\n        setTimeout(() => webViewSetIsPremium(premium), 100);\n      return state;\n    case INIT_APP:\n      const {event, template} = action.payload;\n      let isPremium = event?.is_fabric_premium;\n      if (!event) isPremium = template.premium;\n      setTimeout(() => webViewSetIsPremium(isPremium), 100);\n      return state;\n    default:\n      return state;\n  }\n}\n","export const CREATE_EDIT_POLL = 'CreateInvitationWidget/*/CreateEditPoll';\nexport const CREATE_EDIT_WTB = 'CreateInvitationWidget/*/CreateEditWTB';\n","export * from './constants';\nexport * from './reducer';\n","import {CREATE_EDIT_POLL, CREATE_EDIT_WTB} from './constants';\nimport {INIT_APP} from '~/common/fabric/constants';\nimport {SET_EVITE_EVENT} from '~/CreateFabricInvitation/reducers/eviteEvent/constants';\n\nconst initialState = [];\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case CREATE_EDIT_POLL:\n      return {\n        ...state,\n        polls: [...action.payload.polls],\n      };\n    case CREATE_EDIT_WTB:\n      return {\n        ...state,\n        whatToBrings: [...action.payload.whatToBrings],\n      };\n    case SET_EVITE_EVENT:\n      return {\n        ...state,\n        widgets: {...action.payload.widgets},\n      };\n    case INIT_APP:\n      return {\n        ...state,\n        polls: [...action.payload.widgets.polls],\n        whatToBrings: [...action.payload.widgets.whatToBrings],\n      };\n    default:\n      return state;\n  }\n}\n","import React, {createContext, useState} from 'react';\n\nconst defaultContextValue = {\n  setCanvas: () => null,\n  canvas: null,\n  activeObjects: [],\n  setActiveObjects: () => null,\n};\n\nexport const EventCreateContext = createContext(defaultContextValue);\n\nexport const EventCreateParent = ({children}) => {\n  const [canvas, setCanvas] = useState();\n  const [activeObjects, setActiveObjects] = useState();\n\n  return (\n    <EventCreateContext.Provider\n      value={{\n        canvas,\n        setCanvas,\n        activeObjects,\n        setActiveObjects,\n      }}\n    >\n      {children}\n    </EventCreateContext.Provider>\n  );\n};\n","import React, {useContext, useEffect} from 'react';\nimport {BackgroundContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/BackgroundContainer';\nimport {StampContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StampContainer';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {EnvelopeContainer} from './components/Envelope/EnvelopeContainer';\nimport {EventCreateEditor} from './components/EventCreateEditor';\nimport {NavBottom} from './components/NavBottom/NavBottom';\nimport {EventCreateContext, EventCreateParent} from './EventCreateContext';\nimport {CardEditorMobile} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/CardEditorMobile';\nimport {BackgroundEditorMobile} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/BackgroundEditorMobile';\nimport {EnvelopeEditorMobile} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/Mobile/EnvelopeEditorMobile';\nimport {StampEditorMobile} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/Mobile/StampEditorMobile';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {\n  selectBackgroundColor,\n  selectCurrentSection,\n  selectEditingMobile,\n  selectPremiumFeaturesWarning,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport './EventCreateDesign.sass';\nimport {EventCreateStampParent} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/EventCreateStampContext';\nimport {useBackground} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/actions/useBackground';\nimport {Onboarding} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/Onboarding';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport fabric from '../../../common/canvas/fabric';\n\nconst sectionComponentsMap = {\n  [Sections.CARD_DESIGN]: EventCreateEditor,\n  [Sections.BACKGROUND]: BackgroundContainer,\n  [Sections.ENVELOPE_LINER]: EnvelopeContainer,\n  [Sections.STAMP]: StampContainer,\n};\n\nconst sectionEditMobileMap = {\n  [Sections.CARD_DESIGN]: CardEditorMobile,\n  [Sections.BACKGROUND]: BackgroundEditorMobile,\n  [Sections.ENVELOPE_LINER]: EnvelopeEditorMobile,\n  [Sections.STAMP]: StampEditorMobile,\n};\n\nconst EventCreateDesign = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const editingMobile = useSelector(selectEditingMobile);\n  const currentSection = useSelector(selectCurrentSection);\n  const backgroundColor = useSelector(selectBackgroundColor);\n  const premiumFeaturesWarning = useSelector(selectPremiumFeaturesWarning);\n  const eviteEvent = useSelector((state) => state.eviteEvent);\n  const Section = sectionComponentsMap[currentSection];\n  const NavBottomMobile = sectionEditMobileMap[currentSection];\n  const {selectedBackground} = useBackground();\n  const dispatch = useDispatch();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n\n  const shiftPressed = React.useRef(false);\n  const leftIntervalRef = React.useRef(null);\n  const rightIntervalRef = React.useRef(null);\n  const upIntervalRef = React.useRef(null);\n  const downIntervalRef = React.useRef(null);\n\n  useEffect(() => {\n    canvas?.discardActiveObject()?.requestRenderAll();\n  }, [canvas, isMobile]);\n\n  const onSelectionEvent = (value) => {\n    if (isMobile) {\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {editingMobile: value},\n      });\n    }\n  };\n\n  useEffect(() => {\n    canvas?.on({\n      'selection:created': () => onSelectionEvent(true),\n      'selection:updated': () => onSelectionEvent(true),\n      'selection:cleared': () => onSelectionEvent(false),\n    });\n  }, [canvas, onSelectionEvent]);\n\n  const BASE_STEP = 1;\n  const SHIFT_STEP = 10;\n\n  const Direction = {\n    LEFT: 0,\n    UP: 1,\n    RIGHT: 2,\n    DOWN: 3,\n  };\n\n  useEffect(() => {\n    const onKeyDown = (options) => {\n      if (options.repeat) {\n        return;\n      }\n      var key = options.which || options.keyCode; // key detection\n      if (key === 16) {\n        // handle Shift key\n        shiftPressed.current = true;\n      } else if (key === 37) {\n        // handle Left key\n        leftIntervalRef.current = setInterval(() => {\n          moveSelected(Direction.LEFT);\n        }, 50);\n      } else if (key === 38) {\n        // handle Up key\n        upIntervalRef.current = setInterval(() => {\n          moveSelected(Direction.UP);\n        }, 50);\n      } else if (key === 39) {\n        // handle Right key\n        rightIntervalRef.current = setInterval(() => {\n          moveSelected(Direction.RIGHT);\n        }, 50);\n      } else if (key === 40) {\n        // handle Down key\n        downIntervalRef.current = setInterval(() => {\n          moveSelected(Direction.DOWN);\n        }, 50);\n      }\n    };\n\n    const onKeyUp = (options) => {\n      if (options.repeat) {\n        return;\n      }\n      var key = options.which || options.keyCode; // key detection\n      if (key === 16) {\n        // handle Shift key\n        shiftPressed.current = false;\n      } else {\n        if (key === 37) {\n          // handle Left key\n          clearInterval(leftIntervalRef.current);\n        } else if (key === 38) {\n          // handle Up key\n          clearInterval(upIntervalRef.current);\n        } else if (key === 39) {\n          // handle Right key\n          clearInterval(rightIntervalRef.current);\n        } else if (key === 40) {\n          // handle Down key\n          clearInterval(downIntervalRef.current);\n        }\n      }\n    };\n\n    fabric.util.addListener(document.body, 'keydown', onKeyDown);\n    fabric.util.addListener(document.body, 'keyup', onKeyUp);\n\n    return () => {\n      fabric.util.removeListener(document.body, 'keydown', onKeyDown);\n      fabric.util.removeListener(document.body, 'keyup', onKeyUp);\n    };\n  }, [canvas, canvas?.getObjects()?.length]);\n\n  const moveSelected = (direction) => {\n    const activeObject = canvas?.getActiveObject();\n    const stepLength = shiftPressed.current ? SHIFT_STEP : BASE_STEP;\n\n    if (activeObject) {\n      switch (direction) {\n        case Direction.LEFT:\n          activeObject.left -= stepLength;\n          break;\n        case Direction.UP:\n          activeObject.top -= stepLength;\n          break;\n        case Direction.RIGHT:\n          activeObject.left += stepLength;\n          break;\n        case Direction.DOWN:\n          activeObject.top += stepLength;\n          break;\n      }\n      activeObject.setCoords();\n      canvas?.renderAll();\n    }\n  };\n\n  const style = selectedBackground?.image\n    ? {\n        backgroundColor,\n        backgroundImage: `url(${selectedBackground?.image})`,\n        backgroundSize: 'cover',\n      }\n    : {\n        backgroundColor,\n      };\n\n  const dismissPremiumFeaturesWarning = () => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        premiumFeaturesWarning: false,\n        ignorePremiumWarning: true,\n      },\n    });\n  };\n  return (\n    <div className=\"event-create-design\" style={style}>\n      <div\n        className={`overlay${premiumFeaturesWarning ? ' open' : ''}`}\n        onClick={dismissPremiumFeaturesWarning}\n        data-qa-id=\"premium-features-warning-overlay\"\n        style={{\n          zIndex: 1,\n        }}\n      />\n      <div className=\"event-create-design__content\">\n        <Section />\n      </div>\n      <div className=\"event-create-design__bottom\">\n        {isMobile && <NavBottomMobile />}\n        {(!editingMobile || isDesktop) && <NavBottom />}\n      </div>\n    </div>\n  );\n};\n\nexport const EventCreateDesignContainer = () => {\n  return (\n    <EventCreateParent>\n      <Onboarding />\n      <EventCreateStampParent>\n        <EventCreateDesign />\n      </EventCreateStampParent>\n    </EventCreateParent>\n  );\n};\n","import React from 'react';\nimport './Background.sass';\nimport {useSelector} from 'react-redux';\nimport {Card} from '~/common/canvas/Card/Card';\nimport {selectFabricArt} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {useEnvelope} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useEnvelope';\nimport {Envelope} from '~/CreateFabricInvitation/components/Envelope/Envelope';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\n\nexport const Background = () => {\n  const fabricArt = useSelector(selectFabricArt);\n  const {selectedEnvelope: envelope} = useEnvelope();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  let type = 'flap_down_image';\n  type = envelope[type] ? type : 'blank';\n\n  if (type)\n    return (\n      <div className=\"create_flow__background\">\n        <div className=\"create_flow__background__images\">\n          <Envelope\n            type={type}\n            className=\"create_flow__background__images__envelope\"\n            redirectTo={isDesktop ? Sections.ENVELOPE_LINER : null}\n            forceShowEnvelope\n          />\n          <Card\n            className=\"create_flow__background__images__card\"\n            fabricArt={fabricArt}\n            redirectTo={isDesktop ? Sections.CARD_DESIGN : null}\n          />\n        </div>\n      </div>\n    );\n};\n","import React from 'react';\nimport {Container} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Container';\nimport {Background} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Background';\nimport {BackgroundEditor} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/BackgroundEditor';\n\nexport const BackgroundContainer = () => {\n  return (\n    <Container>\n      <Background />\n      <BackgroundEditor />\n    </Container>\n  );\n};\n","import React from 'react';\nimport Box from '~/CreateFabricInvitation/components/Box/Box';\nimport Colors from '~/CreateFabricInvitation/components/Colors/Colors';\nimport Group from '~/CreateFabricInvitation/components/Group/Group';\nimport Header from '~/CreateFabricInvitation/components/Header/Header';\nimport {EditBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/EditBox/EditBox';\nimport './BackgroundEditor.sass';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {textColorOptions} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {useBackground} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/actions/useBackground';\n\nexport const BackgroundEditor = () => {\n  const {\n    backgroundIcons,\n    onColorChange,\n    onTextureChange,\n    selectedBackground,\n  } = useBackground();\n\n  return (\n    <div className=\"background-editor\">\n      <EditBox className=\"background-editor-content\">\n        <Group>\n          <Header title={'Textures'} />\n          <Box className=\"background-editor__box\">\n            <Icons\n              icons={backgroundIcons}\n              selectedIcon={selectedBackground?.id}\n              onClick={onTextureChange}\n              square\n              height={40}\n              width={46}\n              className=\"background-editor__box__icons\"\n            />\n          </Box>\n        </Group>\n        <Group>\n          <Header title={'Solid Colors'} />\n          <Box className=\"background-editor__box\">\n            <Colors\n              colors={textColorOptions}\n              onClick={onColorChange}\n              height={40}\n              width={40}\n              className=\"background-editor__box__icons__solid_colors\"\n            />\n          </Box>\n        </Group>\n      </EditBox>\n    </div>\n  );\n};\n","import React from 'react';\nimport Colors from '~/CreateFabricInvitation/components/Colors/Colors';\nimport {textColorOptions} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {MobileBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/Contents/MobileBox';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {useBackground} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/actions/useBackground';\nimport {EditorContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Mobile/EditorContainer';\n\nexport function BackgroundEditorMobile() {\n  const {\n    backgroundIcons,\n    onColorChange,\n    onTextureChange,\n    selectedBackground,\n  } = useBackground();\n\n  return (\n    <EditorContainer>\n      <MobileBox title={'TEXTURES & PATTERNS'}>\n        <Icons\n          icons={backgroundIcons}\n          onClick={onTextureChange}\n          selectedIcon={selectedBackground?.icon}\n          highlight={false}\n          square\n          height={40}\n          width={40}\n          mobile\n        />\n      </MobileBox>\n      <MobileBox title={'Solid Colors'}>\n        <Colors\n          colors={textColorOptions}\n          onClick={onColorChange}\n          highlight={false}\n          height={40}\n          width={40}\n          mobile\n        />\n      </MobileBox>\n    </EditorContainer>\n  );\n}\n","import React from 'react';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport './MobileBox.sass';\n\nexport const MobileBox = ({title, children}) => {\n  return (\n    <div className=\"mobile-box\">\n      <div className=\"mobile-box__header\">\n        <div className=\"mobile-box__header__title\">\n          <Typography\n            as=\"h1\"\n            variant=\"paragraph4\"\n            size=\"medium\"\n            color={'pebble'}\n          >\n            {title}\n          </Typography>\n        </div>\n      </div>\n      <div className=\"mobile-box__body\">{children}</div>\n    </div>\n  );\n};\n","import {useMemo} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectBackgrounds} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {selectBackgroundId} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport const useBackground = () => {\n  const dispatch = useDispatch();\n  const backgrounds = useSelector(selectBackgrounds);\n  const backgroundId = useSelector(selectBackgroundId);\n\n  const backgroundIcons = useMemo(\n    () =>\n      backgrounds\n        ?.filter(({media}) => media.find(({label}) => label === 'desktop').url)\n        .map(({media}) => media.find(({label}) => label === 'icon').url),\n    [backgrounds]\n  );\n\n  const onColorChange = (background) => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        backgroundColor: background,\n        backgroundId: null,\n        premiumFeaturesPristine: false,\n      },\n    });\n  };\n\n  const onTextureChange = (icon) => {\n    const selected = backgrounds?.find(\n      ({media}) => media.find(({label}) => label === 'icon').url === icon\n    );\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        backgroundId: selected.id,\n        backgroundColor: null,\n        premiumFeaturesPristine: false,\n      },\n    });\n  };\n\n  const selectedBackground = useMemo(() => {\n    const selected = backgrounds?.find(({id}) => id === backgroundId);\n    if (selected) {\n      const image = selected.media.find(({label}) => label === 'desktop').url;\n      const icon = selected.media.find(({label}) => label === 'icon').url;\n      return {...selected, image, icon};\n    }\n  }, [backgrounds, backgroundId]);\n\n  return {backgroundIcons, onColorChange, onTextureChange, selectedBackground};\n};\n","import React, {useContext, useEffect} from 'react';\nimport Box from '~/CreateFabricInvitation/components/Box/Box';\nimport Group from '~/CreateFabricInvitation/components/Group/Group';\nimport Header from '~/CreateFabricInvitation/components/Header/Header';\nimport {ColorPicker} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ColorPicker/ColorPicker';\nimport {ResetStyle} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ResetStyle/ResetStyle';\nimport {TextFormat} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/TextFormat';\nimport {LetterSpacing} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LetterSpacing/LetterSpacing';\nimport {LineHeight} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LineHeight/LineHeight';\nimport {TextSize} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextSize/TextSize';\nimport {Dropdown} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/Dropdown';\nimport {EditBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/EditBox/EditBox';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {\n  selectEditorDisabled,\n  selectTouched,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport './CardEditorDesktop.sass';\nimport {TextEditor} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Desktop/TextEditor/TextEditor';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {menuMappingKeys} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport function CardEditorDesktop() {\n  const touched = useSelector(selectTouched);\n  const {canvas} = useContext(EventCreateContext);\n  const dispatch = useDispatch();\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n\n  const checkIfTheresAImageSelected = () => {\n    const active = canvas?.getActiveObjects();\n    if (canvas?.getActiveObjects()) {\n      const editorDisabled = active?.some((el) => el?.type !== 'textbox');\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {editorDisabled},\n      });\n    }\n  };\n\n  useEffect(() => {\n    if (canvas) {\n      canvas?.on({\n        'selection:created': checkIfTheresAImageSelected,\n        'selection:updated': checkIfTheresAImageSelected,\n        'selection:cleared': () => {\n          dispatch({\n            type: UPDATE_DESIGN_OPTIONS,\n            payload: {editorDisabled: true},\n          });\n        },\n      });\n    }\n  }, [!!canvas]);\n\n  if (!touched || isMobile) {\n    return null;\n  }\n\n  return (\n    <div className={`card_editor ${editorDisabled && 'card_editor--disabled'}`}>\n      <EditBox className=\"card_editor__content\">\n        <TextEditor />\n\n        <Group>\n          <Header\n            title={'Text Style'}\n            extra={\n              <ResetStyle\n                label=\"Reset\"\n                style={menuMappingKeys.FONT_STYLE}\n                dataQaId=\"step1-textstyle-reset\"\n              />\n            }\n          />\n          <Dropdown />\n        </Group>\n\n        <Group>\n          <Header\n            title={'Text Size'}\n            extra={\n              <ResetStyle\n                label=\"Reset\"\n                style={menuMappingKeys.FONT_SIZE}\n                dataQaId=\"step1-textsize-reset\"\n              />\n            }\n          />\n          <Box center>\n            <TextSize />\n          </Box>\n        </Group>\n\n        <Group>\n          <Header\n            title={'Text Color'}\n            extra={\n              <ResetStyle\n                label=\"Reset\"\n                style={menuMappingKeys.COLOR}\n                dataQaId=\"step1-textcolor-reset\"\n              />\n            }\n          />\n          <Box padding={'16px 16px 0'}>\n            <ColorPicker />\n          </Box>\n        </Group>\n\n        <Group>\n          <Header\n            title={'Text Format'}\n            extra={\n              <ResetStyle\n                label=\"Reset\"\n                style={menuMappingKeys.TEXT_FORMAT}\n                dataQaId=\"step1-textformat-reset\"\n              />\n            }\n          />\n          <Box>\n            <TextFormat />\n          </Box>\n        </Group>\n\n        <Group>\n          <Header\n            title={'Spacing'}\n            extra={\n              <ResetStyle\n                label=\"Reset\"\n                style={menuMappingKeys.SPACING}\n                dataQaId=\"step1-textspacing-reset\"\n              />\n            }\n          />\n          <Box>\n            <Header title={'Letter Spacing'} dark />\n            <LetterSpacing />\n\n            <Header title={'Line Height'} dark />\n            <LineHeight />\n          </Box>\n        </Group>\n      </EditBox>\n    </div>\n  );\n}\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport Header from '~/CreateFabricInvitation/components/Header/Header';\nimport Group from '~/CreateFabricInvitation/components/Group/Group';\nimport './TextEditor.sass';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport function TextEditor() {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [text, setText] = useState('');\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const activeObject = activeObjects?.[0];\n\n  useEffect(() => {\n    setText(activeObject?.text);\n  }, [activeObject]);\n\n  const changeText = (text) => {\n    setText(text);\n    activeObject.text = text;\n    activeObject?.exitEditing();\n    canvas.requestRenderAll();\n  };\n\n  const onTextEditingEntered = ({target}) =>\n    target.hiddenTextarea.addEventListener('input', ({target: {value}}) =>\n      setText(value)\n    );\n\n  useEffect(() => {\n    canvas?.on({\n      'text:editing:entered': onTextEditingEntered,\n    });\n  }, [canvas, onTextEditingEntered]);\n\n  const onTextChangeHandler = useCallback(\n    ({target: {value}}) => changeText(value),\n    [changeText]\n  );\n\n  const onClearClickHandler = () => changeText('');\n\n  const handleFocus = (event) => event.target.select();\n\n  return (\n    <Group className=\"desktop_editor__text_editor\">\n      <Header\n        title=\"Text Editor\"\n        extra={\n          <Button\n            data-qa-id=\"step1-texteditor-clear\"\n            variant=\"link\"\n            size=\"small\"\n            onClick={onClearClickHandler}\n            disabled={editorDisabled}\n            className=\"desktop_editor__text_editor__header__clear_btn\"\n          >\n            Clear\n          </Button>\n        }\n      />\n      <div className=\"desktop_editor__text_editor__body\">\n        <textarea\n          onFocus={handleFocus}\n          onChange={onTextChangeHandler}\n          value={text}\n          data-qa-id=\"step1-texteditor-input\"\n          disabled={editorDisabled || activeObject?.type !== 'textbox'}\n        />\n      </div>\n    </Group>\n  );\n}\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {UyoEditor} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/UyoEditor/UyoEditor';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {PB_Font} from '~/common/svg/PB_Font';\nimport {PB_Keyboard} from '~/common/svg/PB_Keyboard';\nimport {PB_FontSize} from '~/common/svg/PB_FontSize';\nimport {PB_LineHeight} from '~/common/svg/PB_LineHeight';\nimport {PB_TextColor} from '~/common/svg/PB_TextColor';\nimport {MobileButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/MobileButton';\nimport {ContentBase} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/Contents/ContentBase';\nimport {TextFormat} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/TextFormat';\nimport {TextSize} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextSize/TextSize';\nimport {SpacingHeight} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/Contents/SpacingHeight/SpacingHeight';\nimport {ColorPicker} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ColorPicker/ColorPicker';\nimport {FontsMobile} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontsMobile';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectEditingMobile} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport './CardEditorMobile.sass';\nimport {PB_TextFormat} from '~/common/svg/PB_TextFormat';\nimport {menuMappingKeys} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\n\nexport function CardEditorMobile() {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [showMenu, setShowMenu] = useState(false);\n  const [activeMenu, setActiveMenu] = useState();\n  const editingMobile = useSelector(selectEditingMobile);\n  const dispatch = useDispatch();\n\n  const onClickMenu = useCallback(\n    (activeMenu) => () => {\n      setShowMenu(true);\n      setActiveMenu(activeMenu);\n    },\n    []\n  );\n\n  useEffect(() => {\n    if (!editingMobile) {\n      setShowMenu(editingMobile);\n    }\n  }, [editingMobile]);\n\n  const scrollToTop = () => {\n    setTimeout(() => {\n      const canvasWrapper = document.querySelector(\n        '.event-create-design__content'\n      );\n      canvasWrapper.scrollTo({\n        top: 0,\n        left: 0,\n        behavior: 'smooth',\n      });\n    }, 1);\n  };\n\n  const onKeyboardButtonClick = () =>\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {textAreaOpen: true},\n    });\n\n  const onClickCloseHandler = useCallback(() => {\n    scrollToTop();\n    setShowMenu(false);\n    canvas.renderAll();\n  }, [canvas, scrollToTop]);\n\n  const onCloseEditorClick = useCallback(() => {\n    setActiveMenu(null);\n    setShowMenu(false);\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {editingMobile: false},\n    });\n    canvas.discardActiveObject().renderAll();\n  }, [canvas]);\n\n  useEffect(() => {\n    if (\n      showMenu &&\n      activeMenu === menuMappingKeys.FONT_STYLE &&\n      !!activeObjects?.length\n    ) {\n      const canvasWrapper = document.querySelector(\n        '.event-create-design__content'\n      );\n      const y = activeObjects[0].top / 2 - canvasWrapper.clientHeight / 2 - 120;\n\n      canvasWrapper.scrollTo({\n        top: y,\n        left: 0,\n        behavior: 'smooth',\n      });\n    }\n  }, [activeMenu, activeObjects, showMenu]);\n\n  if (!editingMobile) {\n    return null;\n  }\n\n  return (\n    <div\n      className=\"card_editor--mobile\"\n      id={`card-editor-mobile-${activeMenu?.toLowerCase()}`}\n    >\n      <button\n        className=\"unstyled-button card_editor--mobile__close_btn\"\n        onClick={onCloseEditorClick}\n        data-qa-id=\"mobile-close-btn\"\n      >\n        Close\n      </button>\n      <div\n        className={`card_editor--mobile__content ${\n          showMenu ? 'card_editor--mobile__content--active' : ''\n        }`}\n      >\n        <ContentBase\n          resetDataQaId=\"step1-textstyle-reset\"\n          closeDataQaId=\"step1-textstyle-close\"\n          title=\"Font Style\"\n          visible={activeMenu === menuMappingKeys.FONT_STYLE}\n          style={menuMappingKeys.FONT_STYLE}\n          onCloseClick={onClickCloseHandler}\n        >\n          <FontsMobile />\n        </ContentBase>\n\n        <ContentBase\n          resetDataQaId=\"step1-textsize-reset\"\n          closeDataQaId=\"step1-textsize-close\"\n          title=\"Font Size\"\n          onCloseClick={onClickCloseHandler}\n          visible={activeMenu === menuMappingKeys.FONT_SIZE}\n          style={menuMappingKeys.FONT_SIZE}\n        >\n          <TextSize />\n        </ContentBase>\n\n        <ContentBase\n          resetDataQaId=\"step1-textformat-reset\"\n          closeDataQaId=\"step1-textformat-close\"\n          title=\"Text Format\"\n          onCloseClick={onClickCloseHandler}\n          visible={activeMenu === menuMappingKeys.TEXT_FORMAT}\n          style={menuMappingKeys.TEXT_FORMAT}\n        >\n          <TextFormat />\n        </ContentBase>\n\n        <ContentBase\n          resetDataQaId=\"step1-textspacing-reset\"\n          closeDataQaId=\"step1-textspacing-close\"\n          title=\"Spacing\"\n          onCloseClick={onClickCloseHandler}\n          visible={activeMenu === menuMappingKeys.SPACING}\n          style={menuMappingKeys.SPACING}\n        >\n          <SpacingHeight />\n        </ContentBase>\n\n        <ContentBase\n          resetDataQaId=\"step1-textcolor-reset\"\n          closeDataQaId=\"step1-textcolor-close\"\n          title=\"Color\"\n          onCloseClick={onClickCloseHandler}\n          visible={activeMenu === menuMappingKeys.COLOR}\n          style={menuMappingKeys.COLOR}\n          bodyStyle={{\n            paddingRight: 0,\n          }}\n        >\n          <ColorPicker />\n        </ContentBase>\n        <UyoEditor\n          activeMenu={activeMenu}\n          scrollToTop={scrollToTop}\n          setActiveMenu={setActiveMenu}\n          showMenu={showMenu}\n          setShowMenu={setShowMenu}\n        />\n      </div>\n      <div className=\"card_editor--mobile__buttons\">\n        <MobileButton\n          icon={<PB_Keyboard />}\n          onClick={onKeyboardButtonClick}\n          active={activeMenu === menuMappingKeys.KEYBOARD}\n          title=\"Edit Text\"\n          dataQaId=\"step1-texteditor\"\n        />\n        <MobileButton\n          icon={<PB_Font />}\n          onClick={onClickMenu(menuMappingKeys.FONT_STYLE)}\n          title=\"Font\"\n          dataQaId=\"step1-textstyle\"\n        />\n        <MobileButton\n          icon={<PB_FontSize />}\n          onClick={onClickMenu(menuMappingKeys.FONT_SIZE)}\n          title=\"Size\"\n          dataQaId=\"step1-textsize\"\n        />\n        <MobileButton\n          icon={<PB_TextColor color={activeObjects?.[0]?.fill} />}\n          onClick={onClickMenu(menuMappingKeys.COLOR)}\n          title=\"Color\"\n          dataQaId=\"step1-textcolor\"\n        />\n        <MobileButton\n          icon={<PB_TextFormat />}\n          onClick={onClickMenu(menuMappingKeys.TEXT_FORMAT)}\n          title=\"Format\"\n          dataQaId=\"step1-textformat\"\n        />\n        <MobileButton\n          icon={<PB_LineHeight />}\n          onClick={onClickMenu(menuMappingKeys.SPACING)}\n          title=\"Spacing\"\n          dataQaId=\"step1-textspacing\"\n        />\n      </div>\n    </div>\n  );\n}\n","import React from 'react';\nimport {ResetStyle} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ResetStyle/ResetStyle';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport './ContentBase.sass';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\n\nexport function ContentBase({\n  title,\n  children,\n  onCloseClick,\n  bodyStyle = {},\n  noBodyPadding,\n  visible,\n  style,\n  onResetClick,\n  resetDataQaId,\n  closeDataQaId,\n  hideResetButton = false,\n}) {\n  return (\n    visible && (\n      <div className=\"content_base\">\n        <div className=\"content_base__header\">\n          {!hideResetButton && (\n            <div>\n              <ResetStyle\n                label=\"Reset\"\n                style={style}\n                onResetClick={onResetClick}\n                dataQaId={resetDataQaId}\n              />\n            </div>\n          )}\n          <div className=\"content_base__header__title\">\n            <Typography\n              as=\"h1\"\n              variant=\"paragraph4\"\n              size=\"medium\"\n              color={'pebble'}\n            >\n              {title}\n            </Typography>\n          </div>\n          <button\n            className=\"content_base__header__close_btn unstyled-button\"\n            onClick={onCloseClick}\n            data-qa-id={closeDataQaId}\n            data-impression-tracking=\"true\"\n          >\n            <PB_CloseLine ratio={0.75} />\n          </button>\n        </div>\n        <div\n          className={`content_base__body ${\n            noBodyPadding ? 'content_base__body--no-padding' : ''\n          }`}\n          style={bodyStyle}\n        >\n          {children}\n        </div>\n      </div>\n    )\n  );\n}\n","import {LetterSpacing} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LetterSpacing/LetterSpacing';\nimport {LineHeight} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/LineHeight/LineHeight';\nimport React, {useCallback, useState} from 'react';\nimport './SpacingHeight.sass';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\n\nexport function SpacingHeight() {\n  const tabs = {\n    LETTER_SPACING: {\n      label: 'Letter Spacing',\n      key: 'LETTER_SPACING',\n      component: <LetterSpacing />,\n    },\n    LINE_HEIGHT: {\n      label: 'Line Height',\n      key: 'LINE_HEIGHT',\n      component: <LineHeight />,\n    },\n  };\n\n  const [activeTab, setActiveTab] = useState(tabs.LETTER_SPACING.key);\n\n  const onTabClick = useCallback((tab) => () => setActiveTab(tab), []);\n\n  return (\n    <div className=\"spacing_height\">\n      <div className=\"spacing_height__tabs\">\n        {Object.keys(tabs).map((key) => (\n          <div\n            onClick={onTabClick(tabs[key].key)}\n            className=\"spacing_height__tabs__tab\"\n          >\n            <Typography\n              variant=\"paragraph1\"\n              color=\"pebble\"\n              classNames={`spacing_height__tabs__tab__label ${\n                tabs[key].key === activeTab\n                  ? 'spacing_height__tabs__tab__label--active'\n                  : ''\n              }`}\n            >\n              {tabs[key].label}\n            </Typography>\n          </div>\n        ))}\n      </div>\n      <div className=\"spacing_height__content\">{tabs[activeTab].component}</div>\n    </div>\n  );\n}\n","import React from 'react';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport lodash from 'lodash';\nimport './MobileButton.sass';\n\nexport const MobileButton = ({icon, title, onClick, active, dataQaId}) => {\n  return (\n    <div onClick={onClick} role=\"button\">\n      <Button\n        id=\"navBottom\"\n        className={`card_editor__mobile__button ${\n          active ? 'card_editor__mobile__button--active' : ''\n        }`}\n        variant=\"secondary\"\n        size={'small'}\n        data-qa-id={dataQaId}\n      >\n        {icon}\n      </Button>\n      <Typography\n        variant=\"paragraph3\"\n        classNames=\"card_editor__mobile__button__title\"\n      >\n        {title}\n      </Typography>\n    </div>\n  );\n};\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {selectTextAreaOpen} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport './TextEditor.sass';\n\nexport function TextEditor() {\n  const {canvas} = useContext(EventCreateContext);\n  const [text, setText] = useState('');\n  const [originalText, setOriginalText] = useState('');\n  const textAreaOpen = useSelector(selectTextAreaOpen);\n  const dispatch = useDispatch();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  const onTextEditingEntered = () =>\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {textAreaOpen: true},\n    });\n\n  useEffect(() => {\n    const activeObject = canvas?.getActiveObject();\n    setText(activeObject?.text);\n    setOriginalText(activeObject?.text);\n  }, [canvas, textAreaOpen]);\n\n  useEffect(() => {\n    canvas?.on({\n      'text:editing:entered': onTextEditingEntered,\n    });\n  }, [canvas, onTextEditingEntered]);\n\n  const changeText = (text) => {\n    const activeObject = canvas?.getActiveObject();\n    setText(text);\n    activeObject.text = text;\n  };\n\n  const onTextChangeHandler = useCallback(\n    ({target: {value}}) => changeText(value),\n\n    [canvas]\n  );\n\n  const closeEditor = () => {\n    const activeObject = canvas?.getActiveObject();\n    activeObject?.exitEditing();\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {textAreaOpen: false},\n    });\n    canvas.requestRenderAll();\n  };\n\n  const onClearClickHandler = () => changeText('');\n\n  const onCancelClickHandler = () => {\n    changeText(originalText);\n    closeEditor();\n  };\n\n  const onDoneClickHandler = () => {\n    changeText(text); //prevent automatic tests non save\n    closeEditor();\n  };\n\n  const handleFocus = (event) => event.target.select();\n\n  if (isDesktop || !textAreaOpen) {\n    return null;\n  }\n\n  return (\n    <div\n      className={`mobile_editor__text_editor ${\n        textAreaOpen ? 'mobile_editor__text_editor--visible' : ''\n      }`}\n    >\n      <div className=\"mobile_editor__text_editor__header\">\n        <Button\n          data-qa-id=\"step1-texteditor-cancel\"\n          className=\"mobile_editor__text_editor__header__cancel_btn\"\n          variant=\"link\"\n          size=\"small\"\n          onClick={onCancelClickHandler}\n        >\n          Cancel\n        </Button>\n        <Button\n          data-qa-id=\"step1-texteditor-clear\"\n          className=\"mobile_editor__text_editor__header__clear_btn\"\n          variant=\"link\"\n          size=\"small\"\n          onClick={onClearClickHandler}\n        >\n          Clear\n        </Button>\n        <Button\n          data-qa-id=\"step1-texteditor-done\"\n          className=\"mobile_editor__text_editor__header__done_btn\"\n          variant=\"link\"\n          size=\"small\"\n          onClick={onDoneClickHandler}\n        >\n          Done\n        </Button>\n      </div>\n      <div className=\"mobile_editor__text_editor__body\">\n        <textarea\n          onFocus={handleFocus}\n          onChange={onTextChangeHandler}\n          value={text}\n          autoFocus\n          key={originalText}\n          data-qa-id=\"step1-texteditor-input\"\n        />\n      </div>\n    </div>\n  );\n}\n","import {fabric} from 'fabric';\nimport React, {useCallback, useContext, useEffect} from 'react';\nimport {ImageSize} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ImageSize/ImageSize';\nimport {UploadButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UploadButton/UploadButton';\nimport {DoneButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Done/DoneButton';\nimport {UyoImageRotate} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Rotate/UyoImageRotate';\nimport {ContentBase} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/Contents/ContentBase';\nimport {menuMappingKeys} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport './UyoEditor.sass';\n\nexport const UyoEditor = ({\n  scrollToTop,\n  setShowMenu,\n  showMenu,\n  activeMenu,\n  setActiveMenu,\n}) => {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const isUyoSelected = activeObjects?.[0]?.type === 'uYOImage';\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  const onCloseUyoHandler = useCallback(() => {\n    scrollToTop();\n    setShowMenu(false);\n    canvas.discardActiveObject();\n    canvas.renderAll();\n  }, [canvas, scrollToTop]);\n\n  const onResetClick = useCallback(\n    (currElement) => {\n      const scale = fabric.util.findScaleToCover(\n        currElement,\n        currElement._originalObject\n      );\n\n      const {left, top, angle} = currElement._originalObject;\n      activeObjects[0].scale(scale).set({left, top, angle});\n      canvas.renderAll();\n    },\n    [canvas]\n  );\n\n  useEffect(() => {\n    if (!showMenu && isUyoSelected) {\n      setShowMenu(true);\n      setActiveMenu(menuMappingKeys.UYO);\n    }\n  }, [activeMenu, activeObjects, showMenu]);\n\n  if (isDesktop || !isUyoSelected) {\n    return null;\n  }\n\n  return (\n    <ContentBase\n      title=\"Edit Image\"\n      onCloseClick={onCloseUyoHandler}\n      visible={activeMenu === menuMappingKeys.UYO}\n      bodyStyle={{flexDirection: 'column', paddingBottom: '32px'}}\n      onResetClick={onResetClick}\n    >\n      <ImageSize />\n      <div className=\"uyo_editor--mobile__buttons\">\n        <UyoImageRotate />\n        <UploadButton className=\"uyo_editor--mobile__upload\" />\n        <DoneButton />\n      </div>\n    </ContentBase>\n  );\n};\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport Box from '~/CreateFabricInvitation/components/Box/Box';\nimport Colors from '~/CreateFabricInvitation/components/Colors/Colors';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {textColorOptions} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport ColorUnit from '~/CreateFabricInvitation/components/ColorUnit/ColorUnit';\nimport {EyeDropper} from '~/CreateFabricInvitation/components/EyeDropper/EyeDropper';\nimport './ColorPicker.sass';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {RecentColors} from '~/CreateFabricInvitation/components/Colors/RecentColors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {Divider} from '~/common/_pb_components/atoms/Divider';\n\nexport function ColorPicker() {\n  const dispatch = useDispatch();\n  const [color, setColor] = useState('#000');\n  const {canvas} = useContext(EventCreateContext);\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const {recentTextColors} = useSelector((state) => state.fabricDesign);\n\n  useEffect(() => {\n    setColor(canvas?.getActiveObjects()?.[0]?.fill);\n    canvas?.on('object:reset', () =>\n      setColor(canvas?.getActiveObjects()?.[0]?.fill)\n    );\n  }, [canvas]);\n\n  const onChangeHandler = useCallback(\n    (color) => {\n      const activeObjects = canvas.getActiveObjects();\n      setColor(color);\n      activeObjects.forEach((obj) => obj.set('fill', color));\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [canvas]\n  );\n\n  const onInputColorChange = useCallback(\n    ({target: {value}}) => onChangeHandler(value),\n    []\n  );\n\n  // If selected color is defined and the recentTextColors array doesn't already contain it,\n  // add it to the array, remove any colors beyond the seventh in the array & store new array in redux\n  const addColorToRecentColors = () => {\n    if (color !== undefined && !recentTextColors.includes(color)) {\n      const newArray = [color, ...recentTextColors];\n\n      while (newArray.length > 7) {\n        newArray.pop();\n      }\n\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {\n          recentTextColors: newArray,\n        },\n      });\n    }\n  };\n\n  return (\n    <div className={'color_picker'}>\n      <div className={'info'}>\n        <Box padding={8} borderRadius={8} className={'info__box'}>\n          <ColorUnit\n            color={editorDisabled ? '#6B5A3A' : color}\n            key={color}\n            dataQaId={`step1-textcolor-select-${color}`}\n          />\n          <input\n            type=\"text\"\n            value={editorDisabled ? '#' : color}\n            onChange={onInputColorChange}\n            disabled={editorDisabled}\n            data-qa-id=\"step1-textcolor-input\"\n          />\n        </Box>\n\n        <EyeDropper\n          color={color}\n          onChange={onChangeHandler}\n          onConfirmColor={addColorToRecentColors}\n        />\n      </div>\n      {recentTextColors.length > 0 && (\n        <>\n          <RecentColors\n            colors={recentTextColors}\n            onClick={onChangeHandler}\n            highlight={false}\n            disabled={editorDisabled}\n          />\n          <Divider marginTop=\"0.5rem\" marginBottom=\"0.5rem\" />\n        </>\n      )}\n      <Colors\n        colors={textColorOptions}\n        onClick={onChangeHandler}\n        highlight={false}\n        disabled={editorDisabled}\n      />\n    </div>\n  );\n}\n","import {RECOMMENDED_FONTS} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {FontItem} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontItem/FontItem';\n\nexport function AllFonts({onClick, selectedFont}) {\n  return window.fonts\n    .filter((font) => !RECOMMENDED_FONTS.some((rf) => rf.name === font.name))\n    .map((option, index) => (\n      <FontItem\n        font={option}\n        key={`${option.name}_${index}`}\n        onClick={onClick}\n        selected={option.name === selectedFont?.name}\n      />\n    ));\n}\n","import React, {\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\n\nimport {FontsDropdown} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontsDropdown/FontsDropdown';\nimport {UpDownChevron} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/UpDownChevron/UpDownChevron';\nimport {RecommendedFonts} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/RecommendedFonts/RecommendedFonts';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {useOutsideAlerter} from '~/CreateFabricInvitation/routes/EventCreateDesign/hooks/useOutsideAlerter';\nimport './Dropdown.sass';\nimport {mapFabricFontToLocal} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/utils';\n\nexport const Dropdown = () => {\n  const [showMenu, setShowMenu] = useState(false);\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const [selectedValue, setSelectedValue] = useState();\n  const wrapperRef = useRef(null);\n\n  const updateValue = (obj) => {\n    setSelectedValue(\n      mapFabricFontToLocal({\n        fontFamily: obj.fontFamily,\n        fontStyle: obj.fontStyle,\n        fontWeight: obj.fontWeight,\n      })\n    );\n  };\n\n  useEffect(() => {\n    updateValue(canvas?.getActiveObjects()?.[0] || {});\n    canvas?.on('object:reset', () =>\n      updateValue(canvas?.getActiveObjects()?.[0] || {})\n    );\n  }, [canvas]);\n\n  const toggleDropdown = useCallback((e) => {\n    e.stopPropagation();\n    setShowMenu((prevState) => !prevState);\n  }, []);\n\n  const closeMenu = useCallback(() => {\n    setShowMenu(false);\n  }, []);\n\n  useOutsideAlerter(wrapperRef, closeMenu);\n\n  const onChangeHandler = useCallback(\n    (value) => {\n      setSelectedValue(value);\n      setShowMenu(false);\n      activeObjects.forEach((obj) =>\n        obj.set({\n          fontFamily: value.family,\n          fontStyle: value.style,\n          fontWeight: value.weight,\n        })\n      );\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [activeObjects, canvas]\n  );\n\n  return (\n    <div className=\"dropdown_container\" ref={wrapperRef}>\n      <div\n        onClick={editorDisabled ? undefined : toggleDropdown}\n        className={`selected_font_wrapper ${editorDisabled &&\n          'selected_font_wrapper--disabled'}`}\n        data-qa-id=\"step1-textstyle-dropdown\"\n      >\n        <div\n          style={{\n            fontFamily: selectedValue?.family,\n            fontWeight: selectedValue?.weight,\n            fontStyle: selectedValue?.style,\n          }}\n        >\n          {selectedValue?.name}\n        </div>\n        <UpDownChevron up={showMenu} ratio={0.7} />\n      </div>\n      {showMenu && (\n        <div className=\"dropdown_menu\">\n          <div className=\"dropdown_menu__upper\">\n            <RecommendedFonts\n              onChange={onChangeHandler}\n              selectedFont={selectedValue}\n            />\n          </div>\n          <div className=\"dropdown_menu__lower\">\n            <FontsDropdown\n              placeHolder=\"ALL FONTS\"\n              onChange={onChangeHandler}\n              selectedFont={selectedValue}\n            />\n          </div>\n        </div>\n      )}\n    </div>\n  );\n};\n","import React, {useCallback, useRef, useEffect} from 'react';\nimport {PB_Checkmark} from '~/common/svg/PB_Checkmark';\nimport {emeraldWebText} from '~sass/pb_styleguide/base/_exports.sass';\nimport {isNil} from 'lodash';\n\nimport './FontItem.sass';\n\nexport function FontItem({font, selected, onClick}) {\n  if (isNil(font)) {\n    return null;\n  }\n\n  const onClickHandler = useCallback(() => onClick(font), [font]);\n\n  const ref = useRef();\n  useEffect(() => {\n    if (ref.current && selected) {\n      ref.current.scrollIntoView({block: 'nearest', inline: 'nearest'});\n    }\n  }, []);\n\n  return (\n    <div\n      ref={ref}\n      className={`font_item`}\n      onClick={onClickHandler}\n      role={'button'}\n      data-type={font.type}\n    >\n      <p\n        key={`${font.name}-${font.weight}-${font.style}`}\n        className={selected ? 'paragraph--selected' : ''}\n        style={{\n          fontFamily: font?.family,\n          fontWeight: font?.weight ?? 'normal',\n          fontStyle: font?.style ?? 'normal',\n        }}\n      >\n        {font.name}\n      </p>\n      {!!selected && <PB_Checkmark ratio={0.5} color={emeraldWebText} />}\n    </div>\n  );\n}\n","import React, {useState} from 'react';\nimport {UpDownChevron} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/UpDownChevron/UpDownChevron';\nimport {AllFonts} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/AllFonts/AllFonts';\nimport './FontsDropdown.sass';\n\nexport const FontsDropdown = ({placeHolder, onChange, selectedFont}) => {\n  const [showMenu, setShowMenu] = useState(true);\n\n  const handleInputClick = (e) => {\n    e.stopPropagation();\n    setShowMenu((prevState) => !prevState);\n  };\n\n  return (\n    <div className=\"fonts_dropdown_container\" onClick={handleInputClick}>\n      <div className=\"upper\">\n        <div className={'title'}>{placeHolder}</div>\n        <UpDownChevron up={showMenu} ratio={0.5} />\n      </div>\n      <div\n        className={`fonts__container ${\n          showMenu ? 'fonts__container--visible' : ''\n        }`}\n      >\n        <div className=\"fonts__container__inner\">\n          <AllFonts onClick={onChange} selectedFont={selectedFont} />\n        </div>\n      </div>\n    </div>\n  );\n};\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {RecommendedFonts} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/RecommendedFonts/RecommendedFonts';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {FontItem} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontItem/FontItem';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport './FontsMobile.sass';\nimport {AllFonts} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/AllFonts/AllFonts';\nimport {mapFabricFontToLocal} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/utils';\n\nexport const FontsMobile = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const [selectedValue, setSelectedValue] = useState({});\n  const activeObjects = canvas?.getActiveObjects();\n\n  useEffect(() => {\n    setSelectedValue(mapFabricFontToLocal(activeObjects?.[0]));\n  }, [activeObjects?.[0]]);\n\n  const onChangeHandler = useCallback(\n    (value) => {\n      const activeObjects = canvas.getActiveObjects();\n      setSelectedValue(value);\n      activeObjects.forEach((obj) =>\n        obj.set({\n          fontFamily: value.family,\n          fontStyle: value.style,\n          fontWeight: value.weight,\n        })\n      );\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [canvas]\n  );\n\n  return (\n    <div className=\"fonts__mobile\">\n      <div className=\"fonts__mobile__bottom\">\n        <div className=\"fonts__mobile__bottom__selected_font\">\n          <FontItem font={selectedValue} selected={true} />\n        </div>\n\n        <div className=\"fonts__mobile__bottom__recommended\">\n          <RecommendedFonts\n            onChange={onChangeHandler}\n            selectedFont={selectedValue}\n          />\n        </div>\n        <Typography\n          as=\"h1\"\n          variant=\"label2\"\n          color={'pebble'}\n          classNames={'fonts__mobile__bottom__title'}\n        >\n          All fonts\n        </Typography>\n        <div className=\"fonts__mobile__bottom__all\">\n          <AllFonts onClick={onChangeHandler} selectedFont={selectedValue} />\n        </div>\n      </div>\n    </div>\n  );\n};\n","import {Typography} from '~/common/_pb_components/atoms/Typography';\nimport React, {useMemo} from 'react';\nimport {FontItem} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Dropdown/FontItem/FontItem';\nimport {RECOMMENDED_FONTS} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport './RecommendedFonts.sass';\n\nexport function RecommendedFonts({onChange, selectedFont}) {\n  return (\n    <div>\n      <Typography\n        as=\"p\"\n        variant=\"paragraph4\"\n        size=\"medium\"\n        classNames=\"recommended_fonts__title\"\n      >\n        RECOMMENDED FONTS\n      </Typography>\n\n      {RECOMMENDED_FONTS.map((font) => (\n        <FontItem\n          onClick={onChange}\n          font={font}\n          key={font.name}\n          selected={selectedFont?.name === font?.name}\n        />\n      ))}\n    </div>\n  );\n}\n","import {PB_Chevron} from '~/common/svg/PB_Chevron';\nimport React from 'react';\nimport './UpDownChevron.sass';\n\nexport function UpDownChevron({up, ratio = 1}) {\n  return up ? (\n    <PB_Chevron ratio={ratio} className={'up_down_chrevroon--up'} />\n  ) : (\n    <PB_Chevron ratio={ratio} className={'up_down_chrevroon--down'} />\n  );\n}\n","const convertKnownFontWeight = (fontWeight) => {\n  const fontWeightMap = {\n    400: 'normal',\n    700: 'bold',\n  };\n\n  return fontWeightMap[fontWeight] || fontWeight;\n};\n\nexport const mapFabricFontToLocal = (selectedFont) => {\n  return window?.fonts?.find((font) => {\n    const fabricFontFamily = selectedFont?.fontFamily?.toLowerCase();\n    const fabricFontStyle = selectedFont?.fontStyle?.toLowerCase();\n    const fabricWeight = convertKnownFontWeight(\n      selectedFont?.fontWeight?.toLowerCase()\n    );\n\n    const selectedFontFamily = font?.family?.toLowerCase();\n    const selectedFontStyle = font?.style?.toLowerCase();\n    const selectedWeight = convertKnownFontWeight(font?.weight?.toLowerCase());\n    if (\n      fabricFontFamily === selectedFontFamily &&\n      fabricFontStyle === selectedFontStyle &&\n      fabricWeight === selectedWeight\n    ) {\n      return font;\n    }\n  });\n};\n","import {fabric} from 'fabric';\nimport React, {useCallback, useContext, useEffect, useState} from 'react';\nimport './ImageSize.sass';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport Range from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/Range/Range';\nimport {detectPinchGesture} from '~/CreateFabricInvitation/utils/detectPinchGesture';\nimport {useSelector} from 'react-redux';\nimport {selectFabricArt} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nconst MIN_IMAGE_SIZE = 0.1;\nconst MAX_IMAGE_SIZE = 2;\n\nexport function ImageSize() {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [value, setValue] = useState(1);\n\n  const fabricArt = useSelector(selectFabricArt);\n\n  useEffect(() => {\n    let scale = 1;\n    if (activeObjects?.length) {\n      if (Array.isArray(activeObjects) && activeObjects.length > 0) {\n        const uyoImg = fabricArt.objects.find((obj) => {\n          return obj.type === 'uYOImage';\n        });\n        if (uyoImg) {\n          scale = uyoImg.scaleX;\n          if (scale) {\n            setValue(scale);\n          }\n        }\n      }\n    }\n\n    const cleanup = detectPinchGesture((scaleFactor) => {\n      // Set scale of image on pinch\n      setValue(scaleFactor);\n    }, scale);\n\n    return cleanup;\n  }, []);\n\n  useEffect(() => {\n    let uyoImage;\n    if (Array.isArray(activeObjects) && activeObjects.length > 0) {\n      [uyoImage] = activeObjects;\n      uyoImage.scale(value);\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    }\n  }, [value]);\n\n  const setNewValue = useCallback(\n    (value) => {\n      setValue(value);\n\n      let uyoImage;\n      if (Array.isArray(activeObjects) && activeObjects.length > 0) {\n        [uyoImage] = activeObjects;\n\n        const scale = fabric.util.findScaleToCover(\n          uyoImage,\n          uyoImage._originalObject\n        );\n        const newScale = scale * Number(value);\n        uyoImage.scale(newScale);\n\n        canvas.requestRenderAll();\n        canvas.fire('object:modified');\n      }\n    },\n    [canvas, activeObjects]\n  );\n\n  return (\n    <div className=\"textsize\">\n      <Range\n        min={MIN_IMAGE_SIZE}\n        max={MAX_IMAGE_SIZE}\n        step=\"0.1\"\n        value={value}\n        onChange={setNewValue}\n        onLocalChange={setNewValue}\n        hasControls={true}\n        hiddenInput\n      />\n    </div>\n  );\n}\n","import Range from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/Range/Range';\nimport {useCallback, useContext, useEffect, useState} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport function LetterSpacing() {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [charSpacing, setCharSpacing] = useState();\n  const editorDisabled = useSelector(selectEditorDisabled);\n\n  useEffect(() => {\n    setCharSpacing(canvas?.getActiveObjects()?.[0]?.charSpacing);\n    canvas?.on('object:reset', () =>\n      setCharSpacing(canvas?.getActiveObjects()?.[0]?.charSpacing)\n    );\n  }, [canvas]);\n\n  const onChangeHandler = useCallback(\n    (value) => {\n      activeObjects.forEach((obj) => {\n        setCharSpacing(value);\n        obj.set('charSpacing', value);\n      });\n\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [activeObjects]\n  );\n\n  return (\n    <Range\n      min={0}\n      max={100}\n      step=\"10\"\n      suffix=\"%\"\n      onChange={onChangeHandler}\n      value={charSpacing}\n      disabled={editorDisabled}\n      dataQaId=\"step1-textspacing-range\"\n    />\n  );\n}\n","import Range from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/Range/Range';\nimport {useCallback, useContext, useEffect, useState} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport function LineHeight() {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [lineHeight, setLineHeight] = useState();\n  const editorDisabled = useSelector(selectEditorDisabled);\n\n  useEffect(() => {\n    setLineHeight(canvas?.getActiveObjects()?.[0]?.lineHeight);\n    canvas?.on('object:reset', () =>\n      setLineHeight(canvas?.getActiveObjects()?.[0]?.lineHeight)\n    );\n  }, [canvas]);\n\n  const onChangeHandler = useCallback(\n    (value) => {\n      activeObjects.forEach((obj) => {\n        setLineHeight(value);\n        obj.set('lineHeight', value);\n      });\n\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [activeObjects]\n  );\n\n  return (\n    <Range\n      min={1}\n      max={4}\n      step=\"0.1\"\n      value={lineHeight}\n      onChange={onChangeHandler}\n      disabled={editorDisabled}\n      dataQaId=\"step1-textheight-range\"\n    />\n  );\n}\n","import React, {useCallback, useContext} from 'react';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\n\nimport './ResetStyle.sass';\nimport {menuMappingKeys} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nconst fabricToStyleMapping = {\n  [menuMappingKeys.FONT_STYLE]: ['fontFamily', 'fontStyle', 'fontWeight'],\n  [menuMappingKeys.FONT_SIZE]: ['fontSize'],\n  [menuMappingKeys.TEXT_FORMAT]: ['letterCasing', 'textAlign'],\n  [menuMappingKeys.SPACING]: ['charSpacing', 'lineHeight'],\n  [menuMappingKeys.COLOR]: ['fill'],\n};\n\nconst toSentenceCase = (text) =>\n  text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\nexport function ResetStyle({\n  label = 'Reset All',\n  style = 'all',\n  onResetClick,\n  dataQaId,\n}) {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const editorDisabled = useSelector(selectEditorDisabled);\n\n  const resetElement =\n    onResetClick ||\n    useCallback(\n      (currElement) => {\n        let newObject;\n        if (style === 'all') {\n          newObject = currElement._originalObject;\n          const {\n            _originalObject,\n            ...originalObject\n          } = currElement._originalObject;\n          newObject._originalObject = originalObject;\n          newObject.text = currElement?.text;\n        } else {\n          newObject = fabricToStyleMapping[style].reduce(\n            (prevValue, currValue) => ({\n              ...prevValue,\n              [currValue]: currElement._originalObject[currValue],\n            }),\n            {}\n          );\n        }\n\n        newObject.text = toSentenceCase(currElement?.text || '');\n\n        currElement.set(newObject);\n      },\n      [canvas]\n    );\n\n  const onClickHandler = useCallback(() => {\n    activeObjects.forEach(resetElement);\n    canvas.requestRenderAll();\n    canvas.fire('object:modified');\n    canvas.fire('object:reset');\n  }, [canvas, activeObjects, resetElement]);\n\n  return (\n    <Button\n      onClick={onClickHandler}\n      data-qa-id={dataQaId}\n      variant=\"link\"\n      size=\"small\"\n      className=\"reset_all__button\"\n      disabled={editorDisabled}\n    >\n      {label}\n    </Button>\n  );\n}\n","import React from 'react';\nimport Casing from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Casing/Casing';\nimport Alignment from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Alignment/Alignment';\n\nimport './TextFormat.sass';\n\nexport function TextFormat() {\n  return (\n    <div className={'text_format'}>\n      <Casing className={'text_format__upper'} />\n      <Alignment className={'text_format__lower'} />\n    </div>\n  );\n}\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\n\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {PB_LeftAlign} from '~/common/svg/PB_LeftAlign';\nimport {PB_RightAlign} from '~/common/svg/PB_RightAlign';\nimport {PB_MiddleAlign} from '~/common/svg/PB_MiddleAlign';\nimport TextFormatAlignmentBase from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Alignment/TextFormatAlignmentBase/TextFormatAlignmentBase';\n\nexport default function Alignment({className}) {\n  const {canvas} = useContext(EventCreateContext);\n  const [selectedAlignment, setAlignment] = useState();\n\n  useEffect(() => {\n    setAlignment(canvas?.getActiveObjects()?.[0]?.textAlign);\n    canvas?.on('object:reset', () =>\n      setAlignment(canvas?.getActiveObjects()?.[0]?.textAlign)\n    );\n  }, [canvas]);\n\n  const changeAlignment = (align) => {\n    const activeObjects = canvas.getActiveObjects();\n    activeObjects.forEach((obj) => {\n      setAlignment(align);\n      obj.set('textAlign', align);\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    });\n  };\n\n  const leftAlignment = useCallback(() => changeAlignment('left'), []);\n  const middleAlignment = useCallback(() => changeAlignment('center'), []);\n  const rightAlignment = useCallback(() => changeAlignment('right'), []);\n\n  return (\n    <div className={className}>\n      <TextFormatAlignmentBase\n        icon={PB_LeftAlign}\n        onClick={leftAlignment}\n        active={selectedAlignment === 'left'}\n        dataQaId=\"step1-textformat-leftalign\"\n      />\n      <TextFormatAlignmentBase\n        icon={PB_MiddleAlign}\n        onClick={middleAlignment}\n        active={selectedAlignment === 'center'}\n        dataQaId=\"step1-textformat-centeralign\"\n      />\n      <TextFormatAlignmentBase\n        icon={PB_RightAlign}\n        onClick={rightAlignment}\n        active={selectedAlignment === 'right'}\n        dataQaId=\"step1-textformat-rightalign\"\n      />\n    </div>\n  );\n}\n","import React from 'react';\nimport ToggleButton from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/ToggleButton/ToggleButton';\nimport {charcoal, emerald} from '~sass/pb_styleguide/base/_exports.sass';\n\nimport './TextFormatAlignmentBase.sass';\n\nexport default function TextFormatAlignmentBase({\n  icon,\n  onClick,\n  active,\n  dataQaId,\n}) {\n  const Icon = icon;\n\n  return (\n    <ToggleButton\n      onChange={onClick}\n      className={`text_format_base ${\n        active ? 'text_format_base--checked' : ''\n      }`}\n      active={active}\n      dataQaId={dataQaId}\n    >\n      <Icon width={16} height={14} color={active ? emerald : charcoal} />\n    </ToggleButton>\n  );\n}\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport TextFormatCasingBase from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/TextFormat/components/Casing/TextFormatCasingBase/TextFormatCasingBase';\n\nconst toTitleCase = (text) =>\n  text\n    .split(' ')\n    .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n    .join(' ');\n\nconst toUpperCase = (text) => text.toUpperCase();\nconst toLowerCase = (text) => text.toLowerCase();\n\nconst actions = {\n  capitalize: 'capitalize',\n  upper: 'upper',\n  lower: 'lower',\n};\n\nconst letterCasingMapping = {\n  [actions.capitalize]: toTitleCase,\n  [actions.upper]: toUpperCase,\n  [actions.lower]: toLowerCase,\n};\n\nexport default function Casing({className}) {\n  const {canvas} = useContext(EventCreateContext);\n  const activeObjects = canvas?.getActiveObjects();\n\n  const [currentLetterCase, setCurrentLetterCase] = useState(null);\n\n  useEffect(() => {\n    setCurrentLetterCase(canvas?.getActiveObjects()?.[0]?.letterCasing);\n    canvas?.on('object:reset', () =>\n      setCurrentLetterCase(canvas?.getActiveObjects()?.[0]?.letterCasing)\n    );\n  }, [canvas]);\n\n  const onClickHandler = useCallback(\n    (operation) => {\n      activeObjects?.forEach((obj) => {\n        if (operation) {\n          obj.text = letterCasingMapping[operation](obj.text);\n        } else {\n          obj.text = obj._originalText;\n        }\n\n        obj.letterCasing = operation;\n\n        setCurrentLetterCase(operation);\n      });\n\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [canvas, activeObjects]\n  );\n\n  return (\n    <div className={className}>\n      <TextFormatCasingBase\n        value={actions.upper}\n        onClick={onClickHandler}\n        active={currentLetterCase === actions.upper}\n        dataQaId=\"step1-textformat-uppercase\"\n        label={'AA'}\n      />\n      <TextFormatCasingBase\n        value={actions.lower}\n        onClick={onClickHandler}\n        active={currentLetterCase === actions.lower}\n        dataQaId=\"step1-textformat-lowercase\"\n        label={'aa'}\n      />\n      <TextFormatCasingBase\n        value={actions.capitalize}\n        onClick={onClickHandler}\n        active={currentLetterCase === actions.capitalize}\n        dataQaId=\"step1-textformat-titlecase\"\n        label={'Aa'}\n      />\n    </div>\n  );\n}\n","import ToggleButton from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/ToggleButton/ToggleButton';\nimport React, {useCallback, useContext} from 'react';\n\nimport './TextFormatCasingBase.sass';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport default function TextFormatCasingBase({\n  active,\n  onClick,\n  dataQaId,\n  label,\n  value,\n}) {\n  const {activeObjects} = useContext(EventCreateContext);\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const onClickHandler = useCallback(\n    (checked) => {\n      onClick(checked ? value : null);\n    },\n    [onClick, value]\n  );\n\n  return (\n    <ToggleButton onChange={onClickHandler} active={active}>\n      <button\n        data-qa-id={dataQaId}\n        className={`unstyled-button text_format_casing_base ${\n          active ? 'text_format_casing_base--checked' : ''\n        }`}\n        disabled={editorDisabled}\n      >\n        {label}\n      </button>\n    </ToggleButton>\n  );\n}\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport './TextSize.sass';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport Range from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/components/Range/Range';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nconst MIN_FONT_SIZE = 16;\nconst MAX_FONT_SIZE = 120;\n\nexport function TextSize() {\n  const {canvas} = useContext(EventCreateContext);\n  const [value, setValue] = useState(0);\n  const activeObjects = canvas?.getActiveObjects();\n  const editorDisabled = useSelector(selectEditorDisabled);\n\n  useEffect(() => {\n    setValue(canvas?.getActiveObjects()?.[0]?.fontSize);\n    canvas?.on('object:reset', () =>\n      setValue(canvas?.getActiveObjects()?.[0]?.fontSize)\n    );\n  }, [canvas]);\n\n  const setNewValue = useCallback(\n    (value) => {\n      setValue(value);\n\n      activeObjects?.forEach((obj) => {\n        obj.fontSize = value;\n      });\n\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [canvas, activeObjects]\n  );\n\n  const changeTextSize = useCallback(\n    (value) => {\n      activeObjects?.forEach((obj) => {\n        obj.fontSize = value;\n      });\n\n      canvas.requestRenderAll();\n      canvas.fire('object:modified');\n    },\n    [canvas, activeObjects]\n  );\n\n  const onObjectScaled = useCallback(\n    (event) => {\n      if (event.action !== 'scale') {\n        return;\n      }\n\n      const target = event.target;\n\n      const changeFontSize = (obj) => {\n        let fontSize = Math.floor((obj.fontSize *= target.scaleX));\n        fontSize = fontSize < MIN_FONT_SIZE ? MIN_FONT_SIZE : fontSize;\n        fontSize = fontSize > MAX_FONT_SIZE ? MAX_FONT_SIZE : fontSize;\n        obj.fontSize = fontSize;\n        obj.width = obj.width * target.scaleX;\n        obj.height = obj.height * target.scaleY;\n        obj.scaleX = 1;\n        obj.scaleY = 1;\n        setValue(obj.fontSize);\n        canvas.requestRenderAll();\n        canvas.fire('object:modified');\n      };\n\n      if (target?.type === 'activeSelection') {\n        target.forEachObject(changeFontSize);\n      } else if (target?.type === 'textbox') {\n        changeFontSize(target);\n      }\n    },\n    [canvas]\n  );\n\n  useEffect(() => {\n    canvas?.on({\n      'object:modified': onObjectScaled,\n    });\n  }, [canvas]);\n\n  return (\n    <div className=\"textsize\">\n      <Range\n        min={MIN_FONT_SIZE}\n        max={MAX_FONT_SIZE}\n        step=\"1\"\n        suffix=\" pt\"\n        value={value}\n        onChange={setNewValue}\n        onLocalChange={changeTextSize}\n        disabled={editorDisabled}\n        dataQaId=\"step1-textsize-range\"\n        inputEditable\n      />\n    </div>\n  );\n}\n","import {fabric} from 'fabric';\nimport React, {useContext, useRef, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {toastAlert} from '~/common/_pb_components/atoms/Toast';\nimport {GCS_PATH_IDS, gcsUploadImage} from '~/common/storage/gcs_storage';\nimport {PB_AlertLine} from '~/common/svg/PB_AlertLine';\nimport {PB_UploadSquare} from '~/common/svg/PB_UploadSquare';\nimport {getEventId} from '~/CreateFabricInvitation/reducers/eviteEvent/selectors';\nimport {SET_UPLOADED_IMAGE} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {\n  charcoal,\n  mexicanOpalWebText,\n} from '~sass/pb_styleguide/base/_exports.sass';\nimport './UploadButton.sass';\n\nexport const imageFileUpload = async (file, eventId) => {\n  if (file.size > 10 ** 7) {\n    toastAlert('Please select an image less than 10MB.', {\n      className: 'uyo_toast__error',\n      title: 'This image is too large',\n      type: 'error',\n      icon: <PB_AlertLine ratio={0.65} color={mexicanOpalWebText} />,\n      position: 'top-right',\n      autoClose: 5000,\n      hideProgressBar: true,\n      closeOnClick: true,\n      pauseOnHover: true,\n      draggable: true,\n      progress: undefined,\n    });\n    throw new Error('Please select an image less than 10MB.');\n  }\n\n  const gcsUploadArgs = {\n    gcsPathId: GCS_PATH_IDS.anonymous_image,\n    params: {\n      event_id: eventId,\n      image_id: '',\n    },\n    image: file,\n  };\n\n  return gcsUploadImage(gcsUploadArgs);\n};\n\nexport const UploadButton = ({className, styles, callback}) => {\n  const {canvas} = useContext(EventCreateContext);\n  const [processing, setProcessing] = useState(false);\n  const eventId = useSelector(getEventId);\n  const fileRef = useRef();\n  const dispatch = useDispatch();\n\n  const onClickHandler = () => {\n    fileRef.current.click();\n  };\n\n  const setUYOImage = (img) => {\n    const uyoImage = canvas.getObjects().find((obj) => obj.type === 'uYOImage');\n\n    const originalObject = uyoImage?._originalObject || uyoImage.toJSON();\n    const scale = fabric.util.findScaleToCover(img, originalObject);\n\n    if (!canvas.getObjects().find((obj) => obj.type === 'rect')) {\n      const rect = new fabric.Rect({\n        left: originalObject.left,\n        top: originalObject.top,\n        width: originalObject.width,\n        height: originalObject.height,\n        scaleX: originalObject.scaleX,\n        scaleY: originalObject.scaleY,\n        fill: 'white',\n        selectable: false,\n        hasControls: false,\n      });\n\n      canvas.insertAt(rect, 0);\n    }\n\n    const centerX = 495;\n    const centerY = 680;\n\n    img.scale(scale).set({\n      left: centerX,\n      top: centerY,\n      originX: 'center',\n      originY: 'center',\n      centeredRotation: true,\n      hasControls: false,\n      _originalObject: originalObject,\n    });\n\n    canvas.remove(uyoImage);\n    canvas.insertAt(img, 1);\n    canvas.setActiveObject(img);\n    canvas.renderAll();\n    canvas.fire('object:added');\n\n    callback?.(img);\n  };\n\n  const onChangeImage = async (event) => {\n    const [file] = event.target?.files;\n\n    if (file) {\n      try {\n        setProcessing(true);\n        const {url, gcsPath, imageKey} = await imageFileUpload(file, eventId);\n        fabric.UYOImage.fromURL(url, setUYOImage);\n\n        dispatch({\n          type: SET_UPLOADED_IMAGE,\n          payload: {url, gcsPath, imageKey},\n        });\n      } finally {\n        setProcessing(false);\n      }\n    }\n  };\n\n  return (\n    <div\n      id=\"uyoBtn\"\n      className={className}\n      onClick={onClickHandler}\n      role=\"button\"\n      style={styles}\n    >\n      <input\n        ref={fileRef}\n        type=\"file\"\n        id=\"uyo-upload-input\"\n        accept=\"image/png,image/jpeg\"\n        onChange={onChangeImage}\n        hidden\n      />\n      {processing ? (\n        <span className=\"evt-spinner inline\" />\n      ) : (\n        <PB_UploadSquare className=\"action_button__upload\" color={charcoal} />\n      )}\n    </div>\n  );\n};\n","import {fabric} from 'fabric';\nimport {forEach} from 'lodash';\nimport React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {\n  selectLoaded,\n  selectPristineUyo,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UploadButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UploadButton/UploadButton';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport './Uyo.sass';\n\nexport const Uyo = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const [styles, setStyles] = useState({});\n  const pristineUyo = useSelector(selectPristineUyo);\n  const dispatch = useDispatch();\n\n  const selectUyo = useCallback(\n    (e) => {\n      const uyoImage = canvas\n        .getObjects()\n        .find((obj) => obj.type === 'uYOImage' && !!obj._originalObject);\n      const rect = canvas.getObjects().find((obj) => obj.type === 'rect');\n      const _mouse = canvas.getPointer(e);\n      const texts = canvas.getObjects().filter(({type}) => type === 'textbox');\n      const pointer = canvas.getPointer(e, true);\n      const target = canvas._searchPossibleTargets(texts, pointer);\n\n      if (target) {\n        canvas.setActiveObject(target).renderAll();\n      } else if (uyoImage && rect.containsPoint(_mouse, null, true)) {\n        canvas.setActiveObject(uyoImage).renderAll();\n      }\n    },\n    [canvas]\n  );\n\n  const positionBtn = useCallback((obj, canvas) => {\n    const {x: left, y: top} = obj.getCenterPoint();\n    const zoom = canvas.getZoom();\n\n    setStyles({\n      left: `${left * zoom - 20}px`,\n      top: `${top * zoom - 20}px`,\n      display: 'block',\n    });\n  }, []);\n\n  const overrideFindTarget = useCallback(() => {\n    fabric.util.addListener(canvas.upperCanvasEl, 'mousedown', selectUyo);\n    fabric.util.addListener(canvas.upperCanvasEl, 'touchstart', selectUyo);\n\n    const _findTarget = function(e, skipGroup) {\n      if (this.skipTargetFind) {\n        return;\n      }\n      let ignoreZoom = true,\n        pointer = this.getPointer(e, ignoreZoom),\n        activeObject = this._activeObject,\n        aObjects = this.getActiveObjects(),\n        activeTarget,\n        activeTargetSubs,\n        isTouch = fabric.util.isTouchEvent(e),\n        shouldLookForActive =\n          (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n      this.targets = [];\n\n      if (\n        shouldLookForActive &&\n        activeObject._findTargetCorner(pointer, isTouch)\n      ) {\n        return activeObject;\n      }\n\n      if (\n        aObjects.length > 1 &&\n        !skipGroup &&\n        activeObject === this._searchPossibleTargets([activeObject], pointer)\n      ) {\n        return activeObject;\n      }\n      if (\n        aObjects.length === 1 &&\n        !!this._searchPossibleTargets([activeObject], pointer)\n      ) {\n        return activeObject;\n      }\n      let target = this._searchPossibleTargets(this._objects, pointer);\n      if (\n        e[this.altSelectionKey] &&\n        target &&\n        activeTarget &&\n        target !== activeTarget\n      ) {\n        target = activeTarget;\n        this.targets = activeTargetSubs;\n      }\n      return target;\n    };\n    canvas.findTarget = _findTarget.bind(canvas);\n  }, [canvas]);\n\n  const imageUploadedCallback = useCallback(\n    (uyoImage) => {\n      overrideFindTarget();\n\n      canvas.setActiveObject(uyoImage).renderAll();\n\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {pristineUyo: false},\n      });\n    },\n    [canvas, selectUyo]\n  );\n\n  useEffect(() => {\n    if (canvas) {\n      const uyoImage = canvas\n        .getObjects()\n        .find((obj) => obj.type === 'uYOImage');\n\n      const rect = canvas.getObjects().find((obj) => obj.type === 'rect');\n      const textbox = canvas\n        .getObjects()\n        .filter((obj) => obj.type === 'textbox');\n\n      const positionBtnHandler = () => positionBtn(uyoImage, canvas);\n      if ((!rect && uyoImage) || uyoImage?.isError) {\n        positionBtnHandler();\n        window.addEventListener('resize', positionBtnHandler);\n        dispatch({\n          type: UPDATE_DESIGN_OPTIONS,\n          payload: {pristineUyo: true},\n        });\n      } else if (rect && uyoImage) {\n        uyoImage.hasControls = false;\n        uyoImage._originalObject = rect.toJSON();\n        overrideFindTarget();\n      }\n\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {hasTextbox: !!textbox.length},\n      });\n\n      return () => {\n        window.removeEventListener('resize', positionBtnHandler);\n      };\n    }\n  }, [!!canvas, canvas?.getObjects()?.length]);\n\n  if (!pristineUyo) return null;\n\n  return (\n    <UploadButton\n      styles={styles}\n      className=\"uyo__action__button\"\n      callback={imageUploadedCallback}\n    />\n  );\n};\n","import React, {useContext} from 'react';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport './DoneButton.sass';\n\nexport const DoneButton = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const discardSelection = () => {\n    canvas?.discardActiveObject()?.requestRenderAll();\n  };\n\n  return (\n    <button\n      className=\"uyo_control__button__done\"\n      onClick={discardSelection}\n      data-qa-id=\"done-btn\"\n    >\n      Done\n    </button>\n  );\n};\n","import React, {useContext} from 'react';\nimport {PB_Rotation} from '~/common/svg/PB_Rotation';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\n\nexport const UyoImageRotate = () => {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n\n  const rotate = () => {\n    const target = activeObjects?.[0];\n    target.rotate(target.angle - 30);\n    canvas.renderAll();\n  };\n\n  return (\n    <div className=\"uyo_control__rotate_button\">\n      <PB_Rotation onClick={rotate} />\n    </div>\n  );\n};\n","import React, {useContext, useEffect, useState} from 'react';\nimport {ImageSize} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/ImageSize/ImageSize';\nimport {UploadButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UploadButton/UploadButton';\nimport {DoneButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Done/DoneButton';\nimport {UyoImageRotate} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/Rotate/UyoImageRotate';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport './UyoControl.sass';\n\nexport const UyoControl = () => {\n  const {canvas, activeObjects} = useContext(EventCreateContext);\n  const [styles, setStyles] = useState({});\n\n  const controlPosition = (obj, canvas) => {\n    const height = canvas.getHeight();\n    const width = canvas.getWidth();\n\n    setStyles({\n      left: `${width / 2 - 137}px`,\n      top: `${height - 133}px`,\n      display: 'block',\n    });\n  };\n\n  useEffect(() => {\n    if (canvas) {\n      canvas?.on('selection:cleared', () => {\n        setStyles({display: 'none'});\n      });\n    }\n  }, [!!canvas]);\n\n  useEffect(() => {\n    setStyles({display: 'none'});\n\n    const element = canvas?.getActiveObject();\n    if (element?.type === 'uYOImage') {\n      controlPosition(activeObjects[0], canvas);\n    }\n  }, [activeObjects]);\n\n  return (\n    <div style={styles} className=\"uyo_control\">\n      <div className=\"uyo_control__button__zoom\">\n        <ImageSize />\n      </div>\n      <div className=\"uyo_control__button__actions\">\n        <UyoImageRotate />\n        <UploadButton />\n        <DoneButton />\n      </div>\n    </div>\n  );\n};\n","import React, {useCallback, useEffect, useState} from 'react';\nimport {PB_Minus} from '~/common/svg/PB_Minus';\nimport {PB_Plus} from '~/common/svg/PB_Plus';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport './Range.sass';\n\nconst calculatePercentage = (value, min, max) => {\n  const percent = ((value - min) * 100) / (max - min);\n  return `${percent}% 100%`;\n};\n\nexport default function Range({\n  min = 0,\n  max = 100,\n  step = 1,\n  onChange,\n  value = 1,\n  suffix,\n  disabled = false,\n  dataQaId,\n  hasControls = false,\n  onLocalChange,\n  inputEditable = false,\n  hiddenInput = false,\n}) {\n  const [localValue, setLocalValue] = useState(value);\n  const [backgroundSize, setBackgroundSize] = useState(\n    calculatePercentage(value, min, max)\n  );\n\n  const calculateValue = (value) => {\n    if (Number.isNaN(value)) {\n      return value;\n    } else if (Number(value) < min) {\n      return min;\n    } else if (Number(value) > max) {\n      return max;\n    }\n\n    return Number(value);\n  };\n\n  const isInvalid = (value) => {\n    return !!(\n      Number.isNaN(value) ||\n      Number(value) < min ||\n      Number(value) > max\n    );\n  };\n\n  const parseNumber = (value) => {\n    const number = calculateValue(value);\n    return Number.isNaN(number) ? 0 : number;\n  };\n\n  const onChangeHandler = useCallback(\n    (e) => {\n      onChange(e.target.value);\n    },\n    [onChange]\n  );\n\n  const onLocalChangeHandler = useCallback((e) => {\n    const targetValue = e.target.value;\n    setLocalValue(targetValue);\n    onLocalChange(parseNumber(targetValue));\n    setBackgroundSize(calculatePercentage(parseNumber(targetValue), min, max));\n  }, []);\n\n  useEffect(() => {\n    setBackgroundSize(calculatePercentage(value, min, max));\n    setLocalValue(value);\n  }, [value]);\n\n  const onBlurHandler = useCallback(() => {\n    const value = parseNumber(localValue);\n    setLocalValue(value);\n    onChange(value);\n  }, [localValue, onChange]);\n\n  return (\n    <div className=\"range\">\n      <div className=\"range-group\">\n        {hasControls && (\n          <Button\n            data-qa-id=\"range-decrease\"\n            variant=\"transparent\"\n            className=\"range-control range-control-dec\"\n            onClick={() => {\n              const newValue = Math.max(\n                min,\n                parseFloat(localValue) - parseFloat(step)\n              );\n              setLocalValue(newValue);\n              onLocalChange(newValue);\n              setBackgroundSize(calculatePercentage(newValue, min, max));\n            }}\n          >\n            <PB_Minus ratio={0.5} />\n          </Button>\n        )}\n        <input\n          type=\"range\"\n          min={disabled ? 0 : min}\n          max={max}\n          value={disabled ? 0 : parseNumber(localValue)}\n          onChange={onChangeHandler}\n          step={step}\n          disabled={disabled}\n          data-qa-id={dataQaId}\n          style={{backgroundSize}}\n        />\n        {hasControls && (\n          <Button\n            data-qa-id=\"range-increase\"\n            variant=\"transparent\"\n            className=\"range-control range-control-inc\"\n            onClick={() => {\n              const newValue = Math.min(\n                parseFloat(localValue) + parseFloat(step),\n                max\n              );\n              if (newValue !== localValue) {\n                setLocalValue(newValue);\n                onLocalChange(newValue);\n                setBackgroundSize(calculatePercentage(newValue, min, max));\n              }\n            }}\n          >\n            <PB_Plus ratio={0.5} />\n          </Button>\n        )}\n      </div>\n      {!hiddenInput && (\n        <div\n          className={`range__value ${\n            !disabled && isInvalid(localValue) ? 'range__value--invalid' : ''\n          }`}\n        >\n          <input\n            type=\"number\"\n            inputMode=\"numeric\"\n            value={disabled ? 0 : `${localValue}`}\n            style={{width: `${localValue?.toString().length * 1}ch`}}\n            onChange={inputEditable ? onLocalChangeHandler : undefined}\n            onBlur={onBlurHandler}\n            disabled={!inputEditable}\n            data-qa-id={`${dataQaId}-input`}\n          />\n          <span>{suffix && suffix}</span>\n        </div>\n      )}\n    </div>\n  );\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useSelector} from 'react-redux';\nimport {selectEditorDisabled} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport default function ToggleButton({\n  children,\n  onChange,\n  className = '',\n  active,\n  dataQaId,\n}) {\n  const editorDisabled = useSelector(selectEditorDisabled);\n  const [checked, setChecked] = useState(false);\n\n  useEffect(() => {\n    setChecked(active);\n  }, [active]);\n\n  const toggleChecked = useCallback(() => {\n    const value = !checked;\n    setChecked(value);\n    onChange && onChange(value);\n  }, [onChange, checked]);\n\n  return (\n    <div\n      className={className}\n      onClick={editorDisabled ? undefined : toggleChecked}\n      role=\"button\"\n      style={{cursor: editorDisabled ? 'not-allowed' : 'pointer'}}\n      data-qa-id={dataQaId}\n    >\n      {children}\n    </div>\n  );\n}\n","import React, {\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport lodash from 'lodash';\nimport {Canvas} from '~/common/canvas/Canvas';\nimport {Uyo} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/Uyo/Uyo';\nimport {UyoControl} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/actions/UyoControl/UyoControl';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {Tooltip} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Tooltip/Tooltip';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {\n  selectFabricArt,\n  selectHasTextbox,\n  selectOriginalFabricArt,\n  selectTouched,\n  selectUsedPremiumFeature,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {SET_TEMPLATE_SNAPSHOT} from '~/CreateFabricInvitation/reducers/fabricTemplate/constants';\nimport {Envelope} from '~/CreateFabricInvitation/components/Envelope/Envelope';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\nimport './CardTemplate.sass';\nimport {getUsedAsTypeName} from '~/common/utils/event_utils';\n\nconst removeElements = (objects) =>\n  objects?.map((obj) => {\n    return lodash.omit(obj, [\n      '_originalText',\n      '_originalObject',\n      'version',\n      'styles',\n    ]);\n  });\n\nexport const CardTemplate = () => {\n  const fabricArt = useSelector(selectFabricArt);\n  const [showTooltip, setShowTooltip] = useState(false);\n  const dispatch = useDispatch();\n  const {canvas, setCanvas, setActiveObjects} = useContext(EventCreateContext);\n  const touched = useSelector(selectTouched);\n  const originalFabricArt = useSelector(selectOriginalFabricArt);\n  const usedPremiumFeature = useSelector(selectUsedPremiumFeature);\n  const hasTextbox = useSelector(selectHasTextbox);\n  const elementRef = useRef(null);\n  // Hacky way to detect first time through, but title is empty on first creation,\n  // and required to be set before coming back to this step.\n  const firstTime = useSelector((state) => !state.details?.title);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n  const {usedAs} = useSelector((state) => state.fabricTemplate);\n\n  const ctaWordings = getUsedAsTypeName(usedAs);\n\n  // TODO: temporary, needs to improve implementation\n  window.canvas = canvas;\n\n  const saveSnapshot = useCallback((snapshot) => {\n    dispatch({type: SET_TEMPLATE_SNAPSHOT, payload: snapshot});\n  }, []);\n\n  const onCanvasLoadHandler = useCallback(() => {\n    dispatch({type: UPDATE_DESIGN_OPTIONS, payload: {loaded: true}});\n    setTimeout(() => {\n      setShowTooltip(firstTime);\n    }, 300);\n  }, []);\n\n  const onChangeHandler = (fabricArt) => {\n    const objectTextFilter = (object) => object.type === 'textbox';\n    const modifiedObjects = removeElements(\n      fabricArt.objects.filter(objectTextFilter)\n    );\n    const originalObjects = removeElements(\n      originalFabricArt.objects.filter(objectTextFilter)\n    );\n    const pristine = lodash.isEqual(modifiedObjects, originalObjects);\n\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        fabricArt,\n        pristine,\n      },\n    });\n  };\n\n  useEffect(() => {\n    canvas?.on('mouse:down', () => setShowTooltip(false));\n  }, [canvas]);\n\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC();\n\n  return (\n    <div\n      className={`card_template ${!touched ? 'card_template--no-editor' : ''}`}\n      ref={elementRef}\n    >\n      <div className=\"card_template__images\">\n        <Envelope\n          type=\"flap_down_image\"\n          className=\"card_template__envelope\"\n          redirectTo={isMobile ? null : Sections.ENVELOPE_LINER}\n          parentNode={`${isMobile ? 'fabric-canvas' : ''}`}\n          forceShowEnvelope={inPremiumPricingVariationC && usedPremiumFeature}\n        />\n        <Uyo />\n        {isDesktop && <UyoControl />}\n        <Tooltip\n          className=\"card_template__tooltip\"\n          text={`${\n            isMobile ? 'Tap' : 'Click'\n          } text on ${ctaWordings.toLowerCase()} to edit`}\n          visible={!touched && showTooltip && hasTextbox}\n          position={isMobile ? 'bottom' : 'right'}\n          dataQaId=\"card-template-tooltip-close\"\n        >\n          <Canvas\n            configJson={fabricArt}\n            onChange={onChangeHandler}\n            setCanvas={setCanvas}\n            setActiveObjects={setActiveObjects}\n            saveSnapshot={saveSnapshot}\n            onLoad={onCanvasLoadHandler}\n            className=\"fabric_user_card card_template__canvas_mobile\"\n            parentNode={`${isMobile ? 'create-container' : ''}`}\n          />\n        </Tooltip>\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport './Container.sass';\n\nexport const Container = ({children, className = ''}) => {\n  return (\n    <div id=\"create-container\" className={`create-container ${className}`}>\n      {children}\n    </div>\n  );\n};\n","import {useCallback} from 'react';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectEditingMobile} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport './EditorContainer.sass';\n\nexport const EditorContainer = ({children}) => {\n  const editingMobile = useSelector(selectEditingMobile);\n  const dispatch = useDispatch();\n\n  const onCloseClick = useCallback(() => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {editingMobile: false},\n    });\n  }, []);\n\n  if (!editingMobile) {\n    return null;\n  }\n\n  return (\n    <div className=\"mobile-editor\">\n      <button\n        className=\"unstyled-button mobile-editor__close_button\"\n        onClick={onCloseClick}\n        data-qa-id=\"design-editor-close\"\n      >\n        Close\n      </button>\n      <div className=\"mobile-editor__content\">{children}</div>\n    </div>\n  );\n};\n","import './EditBox.sass';\n\nexport const EditBox = ({children, className}) => {\n  return <div className={`edit_box ${className}`}>{children}</div>;\n};\n","import React from 'react';\nimport {useSelector} from 'react-redux';\nimport {Card} from '~/common/canvas/Card/Card';\nimport {selectFabricArt} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {useLiners} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useLiner';\nimport {Envelope as EnvelopeImage} from '~/CreateFabricInvitation/components/Envelope/Envelope';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\n\nexport const Envelope = () => {\n  const {selectedLiner} = useLiners();\n  const fabricArt = useSelector(selectFabricArt);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  return (\n    <div className=\"envelope\">\n      <div className={'envelope__images'}>\n        <Card\n          className=\"envelope__images__card\"\n          fabricArt={fabricArt}\n          redirectTo={isDesktop ? Sections.CARD_DESIGN : null}\n        />\n        <EnvelopeImage\n          type=\"blank\"\n          className=\"envelope__images__envelope\"\n          selectedLiner={selectedLiner?.image}\n          forceShowEnvelope\n        />\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport {Container} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Container';\nimport {Envelope} from './Envelope';\nimport './Envelope.sass';\nimport {EnvelopeEditor} from './EnvelopeEditor';\n\nexport const EnvelopeContainer = () => {\n  return (\n    <Container>\n      <Envelope forceShowEnvelope />\n      <EnvelopeEditor />\n    </Container>\n  );\n};\n","import React from 'react';\nimport Box from '~/CreateFabricInvitation/components/Box/Box';\nimport Group from '~/CreateFabricInvitation/components/Group/Group';\nimport Header from '~/CreateFabricInvitation/components/Header/Header';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {EditBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/EditBox/EditBox';\nimport {useEnvelope} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useEnvelope';\nimport {useLiners} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useLiner';\nimport './EnvelopeEditor.sass';\n\nexport const EnvelopeEditor = () => {\n  const {envelopeIcons, onEnvelopeChange, selectedEnvelope} = useEnvelope();\n  const {linerIcons, onLinerChange, selectedLiner} = useLiners();\n\n  return (\n    <div className=\"envelope-editor\">\n      <EditBox className=\"envelope-editor__content\">\n        <Group>\n          <Header title={'Envelope Colors'} />\n          <Box className=\"envelope-editor__box\">\n            <Icons\n              icons={envelopeIcons}\n              onClick={onEnvelopeChange}\n              selectedIcon={selectedEnvelope?.icon}\n              height={40}\n              width={40}\n              className=\"envelope-editor__box__icons\"\n            />\n          </Box>\n        </Group>\n        <Group>\n          <Header title={'Liners'} />\n          <Box className=\"envelope-editor__box\">\n            <Icons\n              icons={linerIcons}\n              onClick={onLinerChange}\n              square\n              selectedIcon={selectedLiner?.icon}\n              className=\"envelope-editor__box__icons envelope-editor__box__icons__liners\"\n              height={40}\n              width={48.33}\n            />\n          </Box>\n        </Group>\n      </EditBox>\n    </div>\n  );\n};\n","import React from 'react';\nimport {MobileBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/Contents/MobileBox';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {useEnvelope} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useEnvelope';\nimport {useLiners} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Envelope/actions/useLiner';\nimport {EditorContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Mobile/EditorContainer';\n\nexport function EnvelopeEditorMobile() {\n  const {envelopeIcons, onEnvelopeChange, selectedEnvelope} = useEnvelope();\n  const {linerIcons, onLinerChange, selectedLiner} = useLiners();\n\n  return (\n    <EditorContainer>\n      <MobileBox title={'Envelope'}>\n        <Icons\n          icons={envelopeIcons}\n          onClick={onEnvelopeChange}\n          highlight={false}\n          selectedIcon={selectedEnvelope?.icon}\n          height={40}\n          width={40}\n          mobile\n        />\n      </MobileBox>\n      <MobileBox title={'Liner'}>\n        <Icons\n          icons={linerIcons}\n          onClick={onLinerChange}\n          highlight={false}\n          square\n          selectedIcon={selectedLiner?.icon}\n          height={40}\n          width={40}\n          mobile\n        />\n      </MobileBox>\n    </EditorContainer>\n  );\n}\n","import {useCallback, useMemo} from 'react';\nimport {selectEnvelopes} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectEnvelopeId} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\n\nexport const useEnvelope = () => {\n  const dispatch = useDispatch();\n  const envelopes = useSelector(selectEnvelopes);\n  const envelopeId = useSelector(selectEnvelopeId);\n\n  const onEnvelopeChange = useCallback(\n    (icon) => {\n      const selected = envelopes?.find((envelope) => envelope.icon === icon);\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {envelopeId: selected.id, premiumFeaturesPristine: false},\n      });\n    },\n    [envelopes]\n  );\n\n  const envelopeIcons = useMemo(() => envelopes?.map(({icon}) => icon), [\n    envelopes,\n  ]);\n\n  const selectedEnvelope = useMemo(() => {\n    return envelopes?.find(({id}) => id === envelopeId);\n  }, [envelopes, envelopeId]);\n\n  return {onEnvelopeChange, envelopeIcons, selectedEnvelope};\n};\n","import {useCallback, useMemo} from 'react';\nimport {selectLiners} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectLinerId} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\n\nexport const useLiners = () => {\n  const dispatch = useDispatch();\n  const liners = useSelector(selectLiners);\n  const linerId = useSelector(selectLinerId);\n\n  const linerIcons = useMemo(\n    () =>\n      liners?.map(({media}) => media.find(({label}) => label === 'icon').url),\n    [liners]\n  );\n\n  const onLinerChange = useCallback(\n    (icon) => {\n      const selected = liners?.find(\n        ({media}) => media.find(({label}) => label === 'icon').url === icon\n      );\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {linerId: selected.id, premiumFeaturesPristine: false},\n      });\n    },\n    [liners]\n  );\n\n  const selectedLiner = useMemo(() => {\n    const selected = liners?.find(({id}) => id === linerId);\n    if (selected) {\n      const image = selected.media.find(({label}) => label === 'image').url;\n      const icon = selected.media.find(({label}) => label === 'icon').url;\n      return {...selected, image, icon};\n    }\n  }, [liners, linerId]);\n\n  return {linerIcons, onLinerChange, selectedLiner};\n};\n","import React, {useContext, useEffect} from 'react';\nimport {Container} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Container';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {CardTemplate} from './CardTemplate';\nimport {CardEditorDesktop} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Desktop/CardEditorDesktop';\nimport './EventCreateEditor.sass';\nimport {useDispatch} from 'react-redux';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {TextEditor} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/CardEditor/Mobile/TextEditor/TextEditor';\n\nexport const EventCreateEditor = () => {\n  const {canvas} = useContext(EventCreateContext);\n  const dispatch = useDispatch();\n\n  const activeObject = canvas?.getActiveObject();\n\n  useEffect(() => {\n    if (activeObject) {\n      dispatch({type: UPDATE_DESIGN_OPTIONS, payload: {touched: true}});\n    }\n\n    return () => {\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {textAreaOpen: false},\n      });\n    };\n  }, [activeObject]);\n\n  return (\n    <Container className=\"event-create-editor\">\n      <TextEditor />\n      <CardTemplate />\n      <CardEditorDesktop key={activeObject} />\n    </Container>\n  );\n};\n","import React from 'react';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport './ExitPremiumPreviewModal.sass';\n\nexport const ExitPremiumPreviewModal = ({closeOverlay, onConfirmAction}) => {\n  return (\n    <div className=\"create-flow__upsell-modal\">\n      <div\n        className=\"create-flow__upsell-modal-overlay\"\n        onClick={closeOverlay}\n      ></div>\n      <div className=\"create-flow__upsell-modal-content\">\n        <button\n          className=\"create-flow__upsell-modal-close-btn\"\n          data-qa-id=\"exit-premium-preview-close-modal\"\n          onClick={closeOverlay}\n        >\n          <PB_CloseLine ratio={0.75} />\n        </button>\n        <Typography\n          as=\"label\"\n          classNames=\"create-flow__upsell-modal-label\"\n          variant=\"label1\"\n          data-qa-id=\"exit-premium-preview-modal-label\"\n          color=\"shadow\"\n        >\n          ARE YOU SURE YOU WANT TO EXIT YOUR PREMIUM PREVIEW?\n        </Typography>\n        <Typography\n          as=\"p\"\n          classNames=\"create-flow__exit-premium-preview-modal-description\"\n          variant=\"paragraph2\"\n          data-qa-id=\"exit-premium-preview-modal-description\"\n          color=\"shadow\"\n        >\n          By exiting, you will lose your Premium customizations.\n        </Typography>\n        <div className=\"create-flow__upsell-modal-footer\">\n          <Button\n            className=\"create-flow__upsell-modal-upgrade-btn\"\n            data-qa-id=\"exit-premium-preview-revert-to-basic\"\n            data-impression-tracking=\"true\"\n            variant=\"secondary\"\n            size=\"large\"\n            onClick={onConfirmAction}\n          >\n            Revert to Basic\n          </Button>\n          <Button\n            className=\"create-flow__upsell-modal-back-btn\"\n            data-qa-id=\"exit-premium-preview-keep-editing\"\n            variant=\"primary\"\n            size=\"large\"\n            onClick={closeOverlay}\n          >\n            Keep Editing\n          </Button>\n        </div>\n      </div>\n    </div>\n  );\n};\n","import React, {useCallback, useContext, useEffect, useState} from 'react';\nimport {useDispatch, useSelector, useStore} from 'react-redux';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport LoadingOverlay from '~/common/_pb_components/molecules/LoadingOverlay';\nimport {CardDesign} from '~/common/svg/CardDesign';\nimport {DiagonalLines} from '~/common/svg/DiagonalLines';\nimport {Mail} from '~/common/svg/Mail';\nimport {PostStamp} from '~/common/svg/PostStamp';\nimport {\n  navigateToRoute,\n  useCurrentRoute,\n} from '~/CreateFabricInvitation/navigation';\nimport {\n  eventInEditMode,\n  selectEventDetailsValid,\n} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport {NavButton} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/NavButton';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\nimport {\n  selectIsPremium,\n  selectIsPremiumTemplate,\n  selectIsProOrPartyPass,\n} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {\n  selectCurrentSection,\n  selectHasTextbox,\n  selectIgnorePremiumWarning,\n  selectUsedPremiumFeature,\n  selectIsFullDyo,\n  selectPremiumFeaturesPristine,\n  selectPremiumFeaturesWarning,\n  selectPristine,\n  selectPristineUyo,\n  selectSavingStep,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {toastAlert} from '~/common/_pb_components/atoms/Toast';\nimport {PB_AlertLine} from '~/common/svg/PB_AlertLine';\nimport './NavBottom.sass';\nimport {EventCreateContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateContext';\nimport {\n  REVERT_TO_BASIC,\n  UPDATE_DESIGN_OPTIONS,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {Tooltip} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Tooltip/Tooltip';\nimport {useNavigator} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator';\nimport {UpsellModal} from '~/CreateFabricInvitation/components/UpsellModal/UpsellModal';\nimport {UPDATE_EVENT_DETAILS} from '~/CreateFabricInvitation/reducers/details/constants';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {ExitPremiumPreviewModal} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/ExitPremiumPreviewModal/ExitPremiumPreviewModal';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\nimport {\n  SET_UPSELL_CONFIRMED,\n  selectIsUpsellConfirmed,\n} from '~/CreateFabricInvitation/reducers/modals';\nimport {\n  isWebview,\n  webViewModalShowing,\n  webViewPendingUpgradeToPremium,\n} from '~/CreateFabricInvitation/webview/webview';\n\nexport const NavBottom = () => {\n  const store = useStore();\n  const isPremium = useSelector(selectIsPremium);\n  const isPremiumTemplate = useSelector(selectIsPremiumTemplate);\n  const upsellConfirmed = useSelector(selectIsUpsellConfirmed);\n  const inEditMode = useSelector(eventInEditMode);\n  const isProOrPartyPass = useSelector(selectIsProOrPartyPass);\n  const valid = useSelector(selectEventDetailsValid);\n  const pristine = useSelector(selectPristine);\n  const hasTextbox = useSelector(selectHasTextbox);\n  const premiumFeaturesWarning = useSelector(selectPremiumFeaturesWarning);\n  const premiumFeaturesPristine = useSelector(selectPremiumFeaturesPristine);\n  const pristineUyo = useSelector(selectPristineUyo);\n  const ignorePremiumWarning = useSelector(selectIgnorePremiumWarning);\n  const usedPremiumFeature = useSelector(selectUsedPremiumFeature);\n  const savingStep = useSelector(selectSavingStep);\n  const isFullDyo = useSelector(selectIsFullDyo);\n  const currentRoute = useCurrentRoute();\n  const currentSection = useSelector(selectCurrentSection);\n  const {canvas} = useContext(EventCreateContext);\n  const dispatch = useDispatch();\n\n  const [showUpsellModal, setShowUpsellModal] = useState(false);\n  const [\n    showExitPremiumPreviewModal,\n    setShowExitPremiumPreviewModal,\n  ] = useState(false);\n\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const navigate = useNavigator({\n    isMobile: !isDesktop,\n    disableAutoOpenEditor: currentSection === Sections.CARD_DESIGN,\n  });\n\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC();\n\n  const stopSubmitting = () => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {savingStep: false},\n    });\n  };\n\n  const onClickHandler = useCallback(async () => {\n    let errorState = false;\n\n    if (pristine && hasTextbox && !isFullDyo) {\n      stopSubmitting();\n      const toastId = 'create-design__toast__text';\n\n      // This will prevent showing multiple toasts for this action\n      if (!document.getElementById(toastId)) {\n        toastAlert('Please edit sample text on card before continuing', {\n          type: 'error',\n          icon: <PB_AlertLine ratio={0.65} />,\n          position: 'top-right',\n          autoClose: 5000,\n          hideProgressBar: true,\n          closeOnClick: true,\n          pauseOnHover: true,\n          draggable: true,\n          progress: undefined,\n          id: toastId,\n        });\n      }\n      errorState = true;\n    }\n\n    if (pristineUyo) {\n      stopSubmitting();\n      const toastId = 'design__toast__photo';\n\n      // This will prevent showing multiple toasts for this action\n      if (!document.getElementById(toastId)) {\n        toastAlert(\n          <span>\n            Forget to add your photo?{' '}\n            <span className=\"create-design__toast--bold\">Add Now</span>\n          </span>,\n          {\n            title: 'Missing photo',\n            type: 'warning',\n            icon: <PB_AlertLine ratio={0.65} />,\n            position: 'top-right',\n            autoClose: 5000,\n            hideProgressBar: true,\n            closeOnClick: true,\n            pauseOnHover: true,\n            draggable: true,\n            progress: undefined,\n            id: toastId,\n          }\n        );\n      }\n      errorState = true;\n    }\n\n    if (\n      isPremium &&\n      !errorState &&\n      premiumFeaturesPristine &&\n      !ignorePremiumWarning\n    ) {\n      stopSubmitting();\n      return dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {premiumFeaturesWarning: true},\n      });\n    }\n\n    if (!errorState) {\n      if (\n        inPremiumPricingVariationC &&\n        !isPremium &&\n        (usedPremiumFeature || !premiumFeaturesPristine)\n      ) {\n        /** Show upsell */\n        webViewModalShowing('upsell');\n        setShowUpsellModal(true);\n        return;\n      }\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {savingStep: true},\n      });\n      const navigating = await navigateToRoute(currentRoute.nextRoute, store);\n      !navigating && stopSubmitting();\n    }\n  }, [\n    canvas,\n    valid,\n    store,\n    isPremium,\n    navigateToRoute,\n    currentRoute,\n    pristine,\n    pristineUyo,\n    premiumFeaturesPristine,\n    isPremium,\n    usedPremiumFeature,\n  ]);\n\n  const onClickTooltipCloseHandler = () => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        premiumFeaturesWarning: false,\n        ignorePremiumWarning: true,\n      },\n    });\n  };\n\n  const upgradeToPremium = () => {\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {isPremium: true, hideUpsell: true},\n    });\n    store.dispatch({\n      type: SET_UPSELL_CONFIRMED,\n      payload: true,\n    });\n    window.dataLayer.push({\n      event: 'fabric_create_upgrade_customize',\n    });\n    webViewPendingUpgradeToPremium(true);\n  };\n\n  const downgradeBackToBasic = () => {\n    store.dispatch({\n      type: REVERT_TO_BASIC,\n    });\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {isPremium: false},\n    });\n    window.dataLayer.push({\n      event: 'fabric_create_downgrade_customize',\n    });\n    webViewPendingUpgradeToPremium(false);\n    navigate(Sections.CARD_DESIGN);\n    setShowExitPremiumPreviewModal(false);\n  };\n\n  const upgradeAndContinue = async () => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {savingStep: true},\n    });\n    upgradeToPremium();\n    const navigating = await navigateToRoute(\n      inEditMode ? 'review' : currentRoute.nextRoute,\n      store\n    );\n    !navigating && stopSubmitting();\n  };\n\n  return (\n    <div className=\"create-design__nav-bottom\">\n      <div className=\"create-design__nav-bottom__buttons_wrapper\">\n        <div className=\"create-design__nav-bottom__panel\">\n          {((inPremiumPricingVariationC && !isWebview() && isDesktop) ||\n            isPremium ||\n            isProOrPartyPass) && (\n            <>\n              <NavButton\n                title=\"Card Design\"\n                icon={<CardDesign color={charcoal} />}\n                section={Sections.CARD_DESIGN}\n                disableAutoOpenEditor\n              />\n              <Tooltip\n                position=\"top\"\n                text=\"Don't forget to customize your envelope, background & more!\"\n                visible={premiumFeaturesWarning && !ignorePremiumWarning}\n                onClickClose={onClickTooltipCloseHandler}\n                dataQaId=\"premium-features-warning-close\"\n              >\n                <NavButton\n                  title=\"Envelope & Liner\"\n                  icon={<Mail color={charcoal} />}\n                  section={Sections.ENVELOPE_LINER}\n                  highLight={premiumFeaturesWarning}\n                  premiumFeature\n                  isPremium={isPremium}\n                />\n              </Tooltip>\n              <NavButton\n                title=\"Stamp & Stickers\"\n                icon={<PostStamp color={charcoal} />}\n                section={Sections.STAMP}\n                highLight={premiumFeaturesWarning}\n                premiumFeature\n                isPremium={isPremium}\n              />\n              <NavButton\n                title=\"Background\"\n                icon={<DiagonalLines color={charcoal} />}\n                section={Sections.BACKGROUND}\n                highLight={premiumFeaturesWarning}\n                premiumFeature\n                isPremium={isPremium}\n              />\n            </>\n          )}\n        </div>\n      </div>\n\n      <div className=\"create-design__nav-bottom__cta_wrapper\">\n        <Button\n          id=\"navBottom\"\n          className=\"create-design__nav-bottom__next\"\n          data-qa-id=\"nav-bottom-next\"\n          variant=\"primary\"\n          size=\"large\"\n          onClick={onClickHandler}\n        >\n          {inEditMode &&\n          inPremiumPricingVariationC &&\n          !isPremiumTemplate &&\n          isPremium &&\n          upsellConfirmed\n            ? 'Next: Checkout'\n            : currentRoute.nextButtonText}\n        </Button>\n      </div>\n      {inPremiumPricingVariationC && (\n        <>\n          {showUpsellModal && (\n            <UpsellModal\n              noAutoRestore\n              toggleUpsellModal={() => setShowUpsellModal(!showUpsellModal)}\n              closeOverlay={() => {\n                setShowUpsellModal(false);\n                setShowExitPremiumPreviewModal(true);\n              }}\n              onConfirmAction={upgradeAndContinue}\n            />\n          )}\n          {showExitPremiumPreviewModal && (\n            <ExitPremiumPreviewModal\n              closeOverlay={() => {\n                setShowExitPremiumPreviewModal(false);\n              }}\n              onConfirmAction={downgradeBackToBasic}\n            />\n          )}\n        </>\n      )}\n      <LoadingOverlay loadingMessage=\"Saving...\" show={savingStep} />\n    </div>\n  );\n};\n","import React from 'react';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {\n  selectCurrentSection,\n  selectIgnorePremiumWarning,\n  selectLoaded,\n  selectPremiumFeaturesPristine,\n} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {useNavigator} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport './NavButton.sass';\nimport {DiamondFill} from '~/common/svg/DiamondFill';\nimport {isInPremiumPricingVariationC} from '~/CreateFabricInvitation/utils/experiments';\n\nexport const NavButton = ({\n  title,\n  icon,\n  section,\n  disableAutoOpenEditor,\n  highLight = false,\n  premiumFeature = false,\n  isPremium = false,\n}) => {\n  const currentSection = useSelector(selectCurrentSection);\n  const loaded = useSelector(selectLoaded);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n  const navigate = useNavigator({isMobile, disableAutoOpenEditor});\n  const dispatch = useDispatch();\n  const ignorePremiumWarning = useSelector(selectIgnorePremiumWarning);\n  const premiumFeaturesPristine = useSelector(selectPremiumFeaturesPristine);\n\n  const onClickHandler = () => {\n    if (section !== Sections.CARD_DESIGN) {\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {\n          usedPremiumFeature: true,\n        },\n      });\n      if (!ignorePremiumWarning) {\n        dispatch({\n          type: UPDATE_DESIGN_OPTIONS,\n          payload: {\n            premiumFeaturesWarning: false,\n            ignorePremiumWarning: true,\n          },\n        });\n      }\n    } else {\n      if (premiumFeaturesPristine) {\n        dispatch({\n          type: UPDATE_DESIGN_OPTIONS,\n          payload: {\n            usedPremiumFeature: false,\n          },\n        });\n      }\n    }\n    navigate(section);\n  };\n\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC();\n\n  return (\n    <div\n      className={`create_flow__nav_bottom__section ${\n        currentSection === section\n          ? 'create_flow__nav_bottom__section--active'\n          : ''\n      }`}\n      onClick={onClickHandler}\n      role=\"button\"\n    >\n      <div className=\"create_flow__nav_bottom__section__button-wrapper\">\n        <Button\n          id=\"navBottom\"\n          className={`create_flow__nav_bottom__section__button ${\n            !isPremium && premiumFeature\n              ? 'create_flow__nav_bottom__section__button--premium-preview'\n              : ''\n          } ${highLight &&\n            'create_flow__nav_bottom__section__button--highlighted'} ${\n            currentSection === section ? 'active' : ''\n          }`}\n          variant=\"secondary\"\n          size={'small'}\n          disabled={!loaded}\n          data-qa-id={`nav-bottom-${section}`}\n        >\n          {icon}\n        </Button>\n        {!isPremium && premiumFeature && inPremiumPricingVariationC && (\n          <DiamondFill\n            className=\"premium-diamond\"\n            ratio={isDesktop ? 0.3 : 0.25}\n          />\n        )}\n      </div>\n      <p className=\"create_flow__nav_bottom__section__title\">{title}</p>\n    </div>\n  );\n};\n","import {useCallback} from 'react';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {useDispatch} from 'react-redux';\n\nexport function useNavigator({\n  isMobile = false,\n  disableAutoOpenEditor = false,\n}) {\n  const dispatch = useDispatch();\n  return useCallback(\n    (section) => {\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {\n          currentSection: section,\n        },\n      });\n      if (isMobile) {\n        dispatch({\n          type: UPDATE_DESIGN_OPTIONS,\n          payload: {editingMobile: !disableAutoOpenEditor},\n        });\n      }\n    },\n    [isMobile]\n  );\n}\n","import {local} from 'storage'; // store2 module to get/set localstorage\nimport {Overlay} from '~/common/_pb_components/atoms/Overlay';\nimport {\n  Carousel,\n  CarouselItem,\n} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Carousel/Carousel';\nimport {useCallback, useEffect, useState} from 'react';\nimport {Step} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Step/Step';\nimport './Onboarding.sass';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectTemplateName} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {selectForceShowOnboardingModal} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {isWebview} from '~/CreateFabricInvitation/webview/webview';\n\nconst steps = [\n  {\n    title: 'New design tools you’ll love',\n    subtitle: 'An improved Evite experience',\n    video: '//g5.evitecdn.com/invitation/designs/onboarding-intro',\n  },\n  {\n    title: 'Improved text editing',\n    subtitle: 'More ways to customize',\n    video: '//g5.evitecdn.com/invitation/designs/onboarding-text',\n  },\n  {\n    title: 'It’s all in the details',\n    subtitle: 'Easy-to-access info',\n    video: '//g5.evitecdn.com/invitation/designs/onboarding-eventdetails',\n  },\n  {\n    title: 'Seamless gifting',\n    subtitle: 'Effortlessly add a registry',\n    video: '//g5.evitecdn.com/invitation/designs/onboarding-gifting',\n  },\n];\n\nexport function Onboarding() {\n  const templateName = useSelector(selectTemplateName);\n  const key = `show_onboarding_creation_flow_${templateName}`;\n  const [currentIndex, setCurrentIndex] = useState(0);\n  const [open, setOpen] = useState(Boolean(local.get(key) ?? true));\n  const forceShowOnboardingModal = useSelector(selectForceShowOnboardingModal);\n  const dispatch = useDispatch();\n\n  useEffect(() => {\n    if (forceShowOnboardingModal) {\n      local(key, true);\n    }\n  }, [forceShowOnboardingModal]);\n\n  const onClickCloseHandler = useCallback(() => {\n    setOpen(false);\n    local(key, false);\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {forceShowOnboardingModal: false},\n    });\n  }, [key]);\n\n  const activeIndexCallbackHandler = useCallback(\n    (index) => setCurrentIndex(index),\n    []\n  );\n\n  if (isWebview() || (!open && !forceShowOnboardingModal)) {\n    return null;\n  }\n\n  return (\n    <Overlay\n      open={forceShowOnboardingModal}\n      title={steps[currentIndex].title}\n      modalId=\"create_flow__onboarding\"\n      onClose={onClickCloseHandler}\n      closeOnClickOutside={false}\n      closeOnEscKeyPress={false}\n      overlayCloseBtnDataQAId=\"onboard-close\"\n      overlayDataImpressionTracking=\"true\"\n    >\n      <Carousel\n        activeIndexCallback={activeIndexCallbackHandler}\n        onClickDone={onClickCloseHandler}\n      >\n        {steps.map((step, index) => (\n          <CarouselItem key={step.title}>\n            <Step step={step} isVisible={index === currentIndex} />\n          </CarouselItem>\n        ))}\n      </Carousel>\n    </Overlay>\n  );\n}\n","import React, {useState} from 'react';\nimport {useSwipeable} from 'react-swipeable';\n\nimport './Carousel.sass';\nimport {Controller} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Onboarding/components/Carousel/Controller/Controller';\n\nexport const CarouselItem = ({children, width}) => {\n  return (\n    <div className=\"create_flow__carousel__inner__item\" style={{width: width}}>\n      {children}\n    </div>\n  );\n};\n\nexport function Carousel({children, activeIndexCallback, onClickDone}) {\n  const [activeIndex, setActiveIndex] = useState(0);\n\n  const updateIndex = (newIndex) => {\n    const numberOfItems = React.Children.count(children);\n\n    if (newIndex < 0) {\n      newIndex = 0;\n    } else if (newIndex >= numberOfItems) {\n      newIndex = numberOfItems - 1;\n    }\n\n    activeIndexCallback && activeIndexCallback(newIndex);\n\n    setActiveIndex(newIndex);\n  };\n\n  const handlers = useSwipeable({\n    onSwipedLeft: () => updateIndex(activeIndex + 1),\n    onSwipedRight: () => updateIndex(activeIndex - 1),\n  });\n\n  return (\n    <div {...handlers} className=\"create_flow__carousel\">\n      <div\n        className=\"create_flow__carousel__inner\"\n        style={{transform: `translateX(-${activeIndex * 100}%)`}}\n      >\n        {children}\n      </div>\n\n      <Controller\n        updateIndex={updateIndex}\n        activeIndex={activeIndex}\n        children={children}\n        quantityOfItems={children?.length}\n        onClickDone={onClickDone}\n      />\n    </div>\n  );\n}\n","import React, {useMemo} from 'react';\n\nimport './Controller.sass';\nimport {Button} from '~/common/_pb_components/atoms/Button';\n\nexport function Controller({\n  activeIndex,\n  updateIndex,\n  quantityOfItems,\n  onClickDone,\n}) {\n  const lastItem = activeIndex === quantityOfItems - 1;\n\n  const dotsMemoized = useMemo(() => {\n    let dots = [];\n    for (let i = 0; i < quantityOfItems; i++) {\n      dots.push(\n        <button\n          className={`create_flow__carousel__indicators__center__dot ${i ===\n            activeIndex &&\n            'create_flow__carousel__indicators__center__dot--active'}`}\n          onClick={() => {\n            updateIndex(i);\n          }}\n          key={`onboard-dot-${i}`}\n          data-qa-id={`onboard-dot-${activeIndex + 1}`}\n        />\n      );\n    }\n    return dots;\n  }, [activeIndex, updateIndex, quantityOfItems]);\n\n  return (\n    <div className=\"create_flow__carousel__indicators\">\n      <div className=\"create_flow__carousel__indicators__left_button\">\n        {activeIndex !== 0 && (\n          <Button\n            onClick={() => {\n              updateIndex(activeIndex - 1);\n            }}\n            data-qa-id=\"onboard-previous\"\n            variant=\"link\"\n            size=\"large\"\n          >\n            Previous\n          </Button>\n        )}\n      </div>\n\n      <div className=\"create_flow__carousel__indicators__center\">\n        <div>{dotsMemoized}</div>\n      </div>\n\n      <div className=\"create_flow__carousel__indicators__right_button\">\n        <Button\n          onClick={() => {\n            lastItem ? onClickDone() : updateIndex(activeIndex + 1);\n          }}\n          data-qa-id=\"onboard-next\"\n          variant=\"link\"\n          size=\"large\"\n        >\n          {lastItem ? 'Done' : 'Next'}\n        </Button>\n      </div>\n    </div>\n  );\n}\n","import {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {useEffect, useRef} from 'react';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport './Step.sass';\n\nexport function Step({step, isVisible}) {\n  const videoRef = useRef();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n\n  useEffect(() => {\n    const videoCurrentRef = videoRef.current;\n    if (isVisible && videoCurrentRef) {\n      videoCurrentRef.pause();\n      videoCurrentRef.currentTime = 0;\n      videoCurrentRef.play();\n    }\n  }, [isVisible]);\n\n  return (\n    <div className=\"create_flow__carousel__step\">\n      <Typography\n        variant={isMobile ? 'header3' : 'header2'}\n        data-qa-id=\"onboardingTitle\"\n        color=\"charcoal\"\n        classNames=\"create_flow__carousel__step__title\"\n      >\n        {step.subtitle}\n      </Typography>\n\n      <div className=\"create_flow__carousel__step__content\">\n        <div className=\"create_flow__carousel__step__content__inner\">\n          <video\n            autoPlay\n            width=\"100%\"\n            height=\"100%\"\n            preload=\"auto\"\n            playsInline\n            muted\n            loop\n            className=\"create_flow__carousel__step__content__inner__video\"\n            ref={videoRef}\n          >\n            <source src={`${step.video}.webm`} type=\"video/webm\" />\n            <source src={`${step.video}.mp4`} type=\"video/mp4\" />\n            Your browser does not support HTML5 video.\n          </video>\n        </div>\n      </div>\n    </div>\n  );\n}\n","import React, {createContext, useState} from 'react';\n\nconst defaultContextValue = {\n  setCanvas: () => null,\n  canvas: null,\n};\n\nexport const EventCreateStampContext = createContext(defaultContextValue);\n\nexport const EventCreateStampParent = ({children}) => {\n  const [canvas, setCanvas] = useState();\n\n  return (\n    <EventCreateStampContext.Provider\n      value={{\n        canvas,\n        setCanvas,\n      }}\n    >\n      {children}\n    </EventCreateStampContext.Provider>\n  );\n};\n","import React from 'react';\nimport {MobileBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Background/Mobile/Contents/MobileBox';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {EditorContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Mobile/EditorContainer';\nimport {useStamp} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/actions/useStamp';\nimport {Stickers} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/components/Stickers/Stickers';\n\nexport function StampEditorMobile() {\n  const {stampIcons, onStampChange, selectedStamp} = useStamp();\n\n  return (\n    <EditorContainer>\n      <MobileBox title={'Stamps'}>\n        <Icons\n          icons={stampIcons}\n          onClick={onStampChange}\n          highlight={false}\n          selectedIcon={selectedStamp?.image}\n          square\n          height={40}\n          width={50}\n          mobile\n        />\n      </MobileBox>\n      <MobileBox title=\"Stickers\">\n        <Stickers />\n      </MobileBox>\n    </EditorContainer>\n  );\n}\n","import React, {useCallback, useContext} from 'react';\nimport {useSelector} from 'react-redux';\nimport {Card} from '~/common/canvas/Card/Card';\nimport {Envelope} from '~/CreateFabricInvitation/components/Envelope/Envelope';\nimport {selectFabricArt} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport {useStamp} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/actions/useStamp';\nimport './Stamp.sass';\nimport {EventCreateStampContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/EventCreateStampContext';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\n\nexport const Stamp = () => {\n  const {canvas} = useContext(EventCreateStampContext);\n  const fabricArt = useSelector(selectFabricArt);\n  const {selectedStamp} = useStamp();\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  const refreshCanvasDimensions = useCallback(() => {\n    canvas.setCurrentDimensions();\n  }, [canvas]);\n\n  return (\n    <div className=\"stamp\">\n      <div className=\"stamp__images\">\n        <Card\n          className=\"stamp__images__card\"\n          fabricArt={fabricArt}\n          redirectTo={isDesktop ? Sections.CARD_DESIGN : null}\n        />\n        <Envelope\n          type=\"image\"\n          className=\"stamp__images__envelope\"\n          id=\"canvas__wrapper__stickers\"\n          selectedStamp={selectedStamp?.image}\n          message=\"Guest's name will go here\"\n          canvas={true}\n          onLoad={refreshCanvasDimensions}\n          forceShowEnvelope\n        />\n      </div>\n    </div>\n  );\n};\n","import React from 'react';\nimport {Container} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Container/Container';\nimport {Stamp} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/Stamp';\nimport {StampEditor} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/StampEditor';\n\nexport const StampContainer = () => {\n  return (\n    <Container>\n      <Stamp />\n      <StampEditor />\n    </Container>\n  );\n};\n","import React from 'react';\nimport Box from '~/CreateFabricInvitation/components/Box/Box';\nimport Group from '~/CreateFabricInvitation/components/Group/Group';\nimport Header from '~/CreateFabricInvitation/components/Header/Header';\nimport Icons from '~/CreateFabricInvitation/components/Icons/Icons';\nimport {EditBox} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/EditBox/EditBox';\nimport {useStamp} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/actions/useStamp';\nimport {Stickers} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/components/Stickers/Stickers';\nimport './StampEditor.sass';\n\nexport const StampEditor = () => {\n  const {stampIcons, onStampChange, selectedStamp} = useStamp();\n\n  return (\n    <div className=\"stamp-editor\">\n      <EditBox className=\"stamp-editor__content\">\n        <Group>\n          <Header title=\"Stamps\" />\n          <Box>\n            <Icons\n              icons={stampIcons}\n              onClick={onStampChange}\n              selectedIcon={selectedStamp?.image}\n              square\n              height={40}\n              width={50}\n              className=\"stamp-editor__content__icons\"\n            />\n          </Box>\n        </Group>\n\n        <Group>\n          <Header title=\"Stickers\" />\n          <Box>\n            <Stickers className=\"stamp-editor__content__icons\" />\n          </Box>\n        </Group>\n      </EditBox>\n    </div>\n  );\n};\n","import React, {useContext, useEffect} from 'react';\nimport {EventCreateStampContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/EventCreateStampContext';\nimport {CanvasStickers} from '~/common/canvas/CanvasStickers';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {selectEnvelopeStickers} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\nimport fabric from '../../../../../common/canvas/fabric';\n\nexport const StickersCanvas = ({className}) => {\n  const {canvas, setCanvas} = useContext(EventCreateStampContext);\n  const envelopeStickers = useSelector(selectEnvelopeStickers);\n  const dispatch = useDispatch();\n  const shiftPressed = React.useRef(false);\n\n  const onChangeHandler = (envelopeStickers) => {\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {\n        envelopeStickers,\n      },\n    });\n  };\n\n  const BASE_STEP = 1;\n  const SHIFT_STEP = 10;\n\n  const Direction = {\n    LEFT: 0,\n    UP: 1,\n    RIGHT: 2,\n    DOWN: 3,\n  };\n\n  useEffect(() => {\n    const onKeyDown = (options) => {\n      if (options.repeat) {\n        return;\n      }\n      var key = options.which || options.keyCode; // key detection\n      if (key === 16) {\n        // handle Shift key\n        shiftPressed.current = true;\n      }\n      if (key === 37) {\n        // handle Left key\n        moveSelected(Direction.LEFT);\n      } else if (key === 38) {\n        // handle Up key\n        moveSelected(Direction.UP);\n      } else if (key === 39) {\n        // handle Right key\n        moveSelected(Direction.RIGHT);\n      } else if (key === 40) {\n        // handle Down key\n        moveSelected(Direction.DOWN);\n      }\n    };\n\n    const onKeyUp = (options) => {\n      if (options.repeat) {\n        return;\n      }\n      var key = options.which || options.keyCode; // key detection\n      if (key === 16) {\n        // handle Shift key\n        shiftPressed.current = false;\n      }\n    };\n\n    fabric.util.addListener(document.body, 'keydown', onKeyDown);\n    fabric.util.addListener(document.body, 'keyup', onKeyUp);\n\n    return () => {\n      fabric.util.removeListener(document.body, 'keydown', onKeyDown);\n      fabric.util.removeListener(document.body, 'keyup', onKeyUp);\n    };\n  }, [canvas, canvas?.getObjects()?.length]);\n\n  const moveSelected = (direction) => {\n    const activeObject = canvas?.getActiveObject();\n    const stepLength = shiftPressed.current ? SHIFT_STEP : BASE_STEP;\n\n    if (activeObject) {\n      switch (direction) {\n        case Direction.LEFT:\n          activeObject.left -= stepLength;\n          break;\n        case Direction.UP:\n          activeObject.top -= stepLength;\n          break;\n        case Direction.RIGHT:\n          activeObject.left += stepLength;\n          break;\n        case Direction.DOWN:\n          activeObject.top += stepLength;\n          break;\n      }\n      activeObject.setCoords();\n      canvas?.renderAll();\n      onChangeHandler(\n        canvas.toJSON(['dataUrl', 'delay', 'frameWidth', 'framesLength'])\n      );\n    }\n  };\n\n  return (\n    <div className={className}>\n      <CanvasStickers\n        configJson={envelopeStickers}\n        onChange={onChangeHandler}\n        setCanvas={setCanvas}\n      />\n    </div>\n  );\n};\n","import {useCallback, useMemo} from 'react';\nimport {selectStamps} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {selectStampId} from '~/CreateFabricInvitation/reducers/fabricDesign/selectors';\n\nexport const useStamp = () => {\n  const dispatch = useDispatch();\n  const stamps = useSelector(selectStamps);\n  const stampId = useSelector(selectStampId);\n\n  const onStampChange = useCallback((image) => {\n    const selected = stamps?.find(\n      ({media}) => media.find(({label}) => label === 'image').url === image\n    );\n    dispatch({\n      type: UPDATE_DESIGN_OPTIONS,\n      payload: {stampId: selected.id, premiumFeaturesPristine: false},\n    });\n  }, []);\n\n  const stampIcons = useMemo(\n    () =>\n      stamps?.map(({media}) => media.find(({label}) => label === 'image').url),\n    [stamps]\n  );\n\n  const selectedStamp = useMemo(() => {\n    const selected = stamps?.find(({id}) => id === stampId);\n    if (selected) {\n      const image = selected.media.find(({label}) => label === 'image').url;\n      return {...selected, image};\n    }\n  }, [stamps, stampId]);\n\n  return {stampIcons, onStampChange, selectedStamp};\n};\n","import React, {useContext, useEffect, useMemo, useState} from 'react';\nimport {EventCreateStampContext} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/Stamp/EventCreateStampContext';\nimport {fabricGif} from '~/common/canvas/animation/gif/Gif';\nimport {useDispatch, useSelector} from 'react-redux';\nimport {selectStickers} from '~/CreateFabricInvitation/reducers/fabricTemplate/selectors';\nimport IconUnit from '~/CreateFabricInvitation/components/IconUnit/IconUnit';\nimport {UPDATE_DESIGN_OPTIONS} from '~/CreateFabricInvitation/reducers/fabricDesign/constants';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport './Stickers.sass';\n\nconst ELEMENT_WIDTH = 200;\n\nexport const Stickers = () => {\n  const {canvas} = useContext(EventCreateStampContext);\n  const stickers = useSelector(selectStickers);\n  const dispatch = useDispatch();\n  const [disabled, setDisabled] = useState(false);\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n\n  useEffect(() => {\n    return () => {\n      if (canvas?.getActiveObject()) {\n        canvas?.discardActiveObject()?.requestRenderAll();\n      }\n    };\n  }, [canvas]);\n\n  const onSelectionEvent = (value) => {\n    if (isMobile) {\n      dispatch({\n        type: UPDATE_DESIGN_OPTIONS,\n        payload: {editingMobile: value},\n      });\n    }\n  };\n\n  useEffect(() => {\n    canvas?.on({\n      'selection:created': () => onSelectionEvent(true),\n      'selection:updated': () => onSelectionEvent(true),\n      // 'selection:cleared': () => onSelectionEvent(false),\n    });\n  }, [canvas, onSelectionEvent]);\n\n  const filterIconImage = (type) =>\n    stickers?.reduce((previousValue, currentValue) => {\n      const url =\n        currentValue.media.find((media) => media.label === type).url ||\n        currentValue.media.find((media) => media.label === 'image').url || // fallback if the icon doesn't exist\n        currentValue.media.find((media) => media.label === 'icon').url; // fallback if the image doesn't exist\n\n      const sticker = {\n        id: currentValue.id,\n        url,\n      };\n      return [sticker, ...previousValue];\n    }, []);\n\n  const stickersIcons = filterIconImage('icon');\n  const stickersImages = filterIconImage('image');\n  const imagesMap = stickersImages.reduce(\n    (previousValue, currentValue) => ({\n      ...previousValue,\n      [currentValue.id]: currentValue.url,\n    }),\n    {}\n  );\n\n  const addElementToCanvas = (obj, isGif) => {\n    obj.set({\n      top: isDesktop ? obj.top + 50 : obj.top + 100,\n      left: obj.left + 50,\n    });\n\n    canvas.add(obj);\n\n    if (isGif) {\n      fabric.util.requestAnimFrame(function render() {\n        canvas.renderAll();\n        fabric.util.requestAnimFrame(render);\n      });\n    }\n  };\n\n  const onClickStickerHandler = async (gif, id) => {\n    setDisabled(true);\n    const image = imagesMap[id];\n    const isGif = image.split('.').pop() === 'gif';\n\n    if (isGif) {\n      const gif = await fabricGif(image, {originalUrl: image}, ELEMENT_WIDTH);\n      setDisabled(false);\n      return addElementToCanvas(gif, isGif);\n    }\n\n    new fabric.Image.fromURL(image, (myImg) => {\n      myImg.scaleToWidth(ELEMENT_WIDTH);\n      addElementToCanvas(myImg, isGif);\n      setDisabled(false);\n    });\n  };\n\n  const iconsMemo = useMemo(() => {\n    return stickersIcons?.map((icon) => (\n      <IconUnit\n        key={icon.id}\n        icon={icon.url}\n        id={icon.id}\n        onClick={onClickStickerHandler}\n        square\n        height={40}\n        width={46}\n        disabled={disabled}\n      />\n    ));\n  }, [stickersIcons]);\n\n  return (\n    <div\n      className={`icons stamp-editor__content__stickers ${\n        isMobile ? 'icons--mobile' : ''\n      }`}\n    >\n      {iconsMemo}\n    </div>\n  );\n};\n","import {useCallback, useEffect, useState} from 'react';\nimport './Tooltip.sass';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\n\nexport const Tooltip = function({\n  children,\n  text,\n  className,\n  position = 'bottom',\n  visible = false,\n  onClickClose,\n  dataQaId,\n  hasCloseButton = true,\n}) {\n  const [localVisible, setLocalVisible] = useState(visible);\n\n  const onClickCloseHandler = useCallback(() => {\n    setLocalVisible(false);\n    onClickClose && onClickClose();\n  }, []);\n\n  useEffect(() => {\n    setLocalVisible(visible);\n  }, [visible]);\n\n  return (\n    <div className={`create-flow_tooltip-wrapper`}>\n      {children}\n      {localVisible && (\n        <div\n          data-qa-id={dataQaId}\n          onClick={onClickCloseHandler}\n          className={`\n          create-flow_tooltip-container\n          ${`create-flow_tooltip-container--${position}`}\n          ${className}\n          `}\n        >\n          <div className=\"create-flow_tooltip-container__text\">\n            <p>{text}</p>\n          </div>\n          {hasCloseButton && <PB_CloseLine ratio={0.75} />}\n        </div>\n      )}\n    </div>\n  );\n};\n","export const DEFAULT_CARD_ZOOM = 0.5;\nexport const DEFAULT_WIDTH_DESKTOP = 500;\nexport const DEFAULT_HEIGHT_DESKTOP = 680;\nexport const DEFAULT_WIDTH_MW = 265;\nexport const DEFAULT_HEIGHT_MW = 360;\nexport const DEFAULT_WIDTH_MINIFIED = 132;\nexport const DEFAULT_HEIGHT_MINIFIED = 180;\n\nexport const Sections = {\n  CARD_DESIGN: 'card_design',\n  ENVELOPE_LINER: 'enveloper_line',\n  STAMP: 'stamp',\n  BACKGROUND: 'background',\n};\n\nexport const menuMappingKeys = {\n  KEYBOARD: 'KEYBOARD',\n  FONT_STYLE: 'FONT_STYLE',\n  FONT_SIZE: 'FONT_SIZE',\n  TEXT_FORMAT: 'TEXT_FORMAT',\n  SPACING: 'SPACING',\n  COLOR: 'COLOR',\n  UYO: 'UYO',\n};\n\nexport const RECOMMENDED_FONTS = [\n  {\n    family: 'BrandonGrotesqueMedium',\n    image: '',\n    name: 'Brandon Grotesque Medium',\n    style: 'normal',\n    type: 'sans-serif',\n    url: '/assets/fonts/BrandonGrotesqueMedium.css',\n    weight: 'normal',\n  },\n  {\n    family: 'Vollkorn',\n    image: '',\n    name: 'Vollkorn Regular',\n    style: 'normal',\n    type: 'serif',\n    url: 'https://fonts.googleapis.com/css2?family=Vollkorn&display=swap',\n    weight: '400',\n  },\n  {\n    family: 'la-bohemienne',\n    image: '',\n    name: 'La Bohemienne',\n    style: 'normal',\n    type: 'script',\n    url: '',\n    weight: '400',\n  },\n];\n\nexport const textColorOptions = [\n  '#F6C3C7',\n  '#FFEDC7',\n  '#FBF8C7',\n  '#D8EAD0',\n  '#C6E0F7',\n  '#E1C3DF',\n  '#F2BFDC',\n  '#F18482',\n  '#FDD47B',\n  '#F9EF81',\n  '#AAD29F',\n  '#84C4EC',\n  '#A776B4',\n  '#DF7DB3',\n  '#E94342',\n  '#F5962F',\n  '#FAEA30',\n  '#7BBC62',\n  '#4C88CB',\n  '#854B98',\n  '#D51E86',\n  '#E51C22',\n  '#EF7E17',\n  '#F9E415',\n  '#5FB451',\n  '#3170B7',\n  '#744295',\n  '#D0026E',\n];\n","import {useEffect} from 'react';\n\n/**\n * Alert if clicked on outside of element\n */\nexport const useOutsideAlerter = (ref, action) => {\n  useEffect(() => {\n    function handleClickOutside(event) {\n      if (ref.current && !ref.current.contains(event.target)) {\n        action && action();\n      }\n    }\n\n    document.addEventListener('mousedown', handleClickOutside);\n\n    return () => {\n      document.removeEventListener('mousedown', handleClickOutside);\n    };\n  }, [ref]);\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const EventDetailsAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"EventDetails\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"EventDetails\" */ '~/CreateFabricInvitation/routes/EventDetails/EventDetails'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const EventGiftingAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"EventGifting\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"EventGifting\" */ '~/CreateFabricInvitation/routes/EventGifting/EventGifting'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const EventReviewAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"EventReview\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"EventReview\" */ '~/CreateFabricInvitation/routes/EventReview/EventReview'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const GuestOptionsAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"GuestOptions\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"GuestOptions\" */ '~/CreateFabricInvitation/routes/GuestOptions/GuestOptions'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const PreviewAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"Preview\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"Preview\" */ '~/CreateFabricInvitation/routes/Preview/Preview'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const SuccessAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"Success\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"Success\" */ '~/CreateFabricInvitation/routes/Success/Success'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const UpsellAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"Upsell\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"Upsell\" */ '~/CreateFabricInvitation/routes/Upsell/Upsell'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React, {useState} from 'react';\nimport {useSelector, useStore} from 'react-redux';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {selectUsedAs} from '~/CreateFabricInvitation/reducers/eviteEvent/selectors';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {Diamond} from '~/common/svg/Diamond';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {PB_Minus} from '~/common/svg/PB_Minus';\nimport {PB_Plus} from '~/common/svg/PB_Plus';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {zip} from 'lodash';\n\nimport {navigateToRoute} from '~/CreateFabricInvitation/navigation';\nimport {useCurrentRoute} from '~/CreateFabricInvitation/navigation';\nimport {getUsedAsTypeName} from '~/common/utils/event_utils';\n\nimport './upsell.sass';\n\nconst HEADINGS = [\n  'Remove ads for your guests',\n  'Custom envelopes, backgrounds, stickers & stamps',\n  'Remove gift suggestions from our retail partners',\n  'Shareable invitation links with RSVP tracking',\n];\nexport const PATHNAMES = [\n  'ads', // eslint-disable\n  'customize',\n  'gifting',\n  'shareable',\n];\n\nconst TRAYS = zip(HEADINGS, PATHNAMES);\n\nexport const UpsellDesktop = (props) => {\n  return (\n    <div className=\"upsell-desktop\">\n      <UpsellTrays {...props} />\n      <UpsellFooter {...props} />\n    </div>\n  );\n};\n\nexport const UpsellFooter = (props) => {\n  const store = useStore();\n  const {name} = useCurrentRoute();\n\n  return (\n    <div className=\"upsell-footer\">\n      <Button\n        size=\"large\"\n        fullWidth\n        className=\"upsell-footer__btn--upgrade\"\n        data-qa-id=\"upsell-upgrade-now\"\n        onClick={props.onUpgradeClick}\n        data-impression-tracking=\"true\"\n      >\n        Upgrade to Premium\n      </Button>\n      <Button\n        size=\"large\"\n        variant=\"link\"\n        className=\"upsell-footer__btn--skip\"\n        data-qa-id=\"upsell-back\"\n        onClick={() => {\n          props.onDecline ? props.onDecline() : navigateToRoute('next', store);\n        }}\n      >\n        {name === 'send' ? 'Skip' : 'Decline'}\n      </Button>\n    </div>\n  );\n};\n\nexport const UpsellHeader = (props) => {\n  const store = useStore();\n  const {matches: desktop} = useMatchQuery('(min-width: 48rem)');\n  const {matches: largeScreens} = useMatchQuery(`(min-width: ${largishAndUp})`);\n\n  return (\n    <div className=\"upsell-header\">\n      <Diamond ratio={desktop ? 2 : 1} />\n      <Typography\n        variant={largeScreens ? 'header2' : 'label1'}\n        as=\"h1\"\n        classNames=\"upsell-header-copy\"\n      >\n        Upgrade To Premium\n      </Typography>\n      {!desktop && (\n        <PB_CloseLine\n          ratio={3 / 4}\n          onClick={() =>\n            props.onClose ? props.onClose() : navigateToRoute('next', store)\n          }\n        />\n      )}\n    </div>\n  );\n};\n\nexport const UpsellTrays = (props) => {\n  const usedAs = useSelector(selectUsedAs);\n  const ctaWordings = getUsedAsTypeName(usedAs);\n\n  return (\n    <div className=\"upsell\">\n      <UpsellHeader {...props} />\n\n      <Typography variant=\"paragraph2\" style={{margin: '0 0 1rem 0'}}>\n        Elevate the experience by upgrading to a Premium {ctaWordings}, starting\n        at only $15.99!\n      </Typography>\n\n      <Trays trays={TRAYS} />\n    </div>\n  );\n};\n\nexport const Trays = (props) => {\n  const {name} = useCurrentRoute();\n  const {sectionToRemove: s} = useSelector(({modals}) => modals);\n  const i = PATHNAMES.findIndex((p) => [s, name].includes(p));\n  const [open, toggle] = useState(i < 0 ? 0 : i);\n\n  return (\n    <div className=\"upsell-trays\">\n      {props.trays.map(([heading, pathName], i) => (\n        <Tray\n          key={pathName}\n          heading={heading}\n          open={open === i}\n          toggle={() => toggle(open === i ? -1 : i)}\n          order={[s, name].includes(pathName) ? -1 : i}\n        >\n          <UpsellAnimation\n            src={`/assets/images/upsell/${pathName}.mp4`}\n            poster={`/assets/images/upsell/video-posters/upsell-${pathName}.png`}\n          />\n        </Tray>\n      ))}\n    </div>\n  );\n};\n\nexport const Tray = (props) => {\n  const {order} = props;\n\n  return (\n    <div className=\"upsell-tray\" style={{order}} onClick={props.toggle}>\n      <div className=\"upsell-tray-header\">\n        <Typography\n          variant=\"header3\"\n          as=\"p\"\n          classNames=\"upsell-tray-header-copy\"\n        >\n          {props.heading}\n        </Typography>\n        {props.open ? <PB_Minus ratio={2 / 3} /> : <PB_Plus ratio={2 / 3} />}\n      </div>\n      {props.open && (\n        <div className=\"upsell-tray-content\">\n          {props.children || props.content}\n        </div>\n      )}\n    </div>\n  );\n};\n\nexport const UpsellAnimation = (props) => {\n  return (\n    <video\n      className=\"upsell-animation\"\n      height=\"240\"\n      autoPlay\n      muted\n      loop\n      playsInline\n      controls={false}\n      poster={props.poster}\n    >\n      <source src={props.src} type=\"video/mp4\" />\n    </video>\n  );\n};\n","function dl_push(ev, data) {\n  window.track_event[ev] = data;\n  window.dataLayer.push(Object.assign({}, data, {event: ev}));\n}\n\nexport const pushDataLayerEventCache = () => {\n  const cookieData = evite.cookie('x-evite-gtmcache');\n  if (!cookieData) return;\n  // Remove the signing data from the end of the cookie\n  let data = cookieData\n    .split(':')\n    .slice(0, -2)\n    .join(':');\n  // Convert backslashed quotes and converted commas and remove the leading \" from the data\n  data = data\n    .replace(/\\\\054/g, ',')\n    .replace(/\\\\\\\"/g, '\"')\n    .slice(1);\n  const eventCache = JSON.parse(data);\n  for (const [key, value] of Object.entries(eventCache)) {\n    dl_push(key, value);\n  }\n  // Different environments have different domains set for this cookie.  Try them all\n  const origDomain = location.hostname;\n  for (let domain of [\n    undefined,\n    origDomain,\n    '.' + origDomain,\n    '.' +\n      origDomain\n        .split('.')\n        .slice(1)\n        .join('.'),\n  ])\n    evite.cookie('x-evite-gtmcache', null, {path: '/', domain: domain}); // Delete the cookie\n};\n\nexport const trackEventId = (eventId) => {\n  window.dataLayer.push({event_id: eventId});\n};\n\nexport const pushDataLayerEcommerceObject = (ecommerce) => {\n  const ecommerceObject = {\n    event: 'greeting_card_purchase',\n    ...ecommerce,\n  };\n\n  window.dataLayer.push(ecommerceObject);\n};\n","import {useSelector} from 'react-redux';\nimport {selectFabricArt} from '../reducers/fabricDesign/selectors';\n\n// Detect pinch gestures and invoke the provided callback\nexport const detectPinchGesture = (onPinch, scale) => {\n  let initialDistance = null; // Initial distance between two touch points\n  let previousDistance = null; // Distance between two touch points in the previous touch move event\n  let currentScale = scale || 1; // Current scaling factor\n\n  // Calculates the distance between two touch points using their client coordinates\n  const calculateDistance = (touch1, touch2) => {\n    const dx = touch2.clientX - touch1.clientX;\n    const dy = touch2.clientY - touch1.clientY;\n    return Math.hypot(dx, dy);\n  };\n\n  // Handles the touch start event and initializes the initial and previous distances\n  const handleTouchStart = (event) => {\n    const touches = event.touches;\n    if (touches.length === 2) {\n      const [touch1, touch2] = touches;\n      initialDistance = calculateDistance(touch1, touch2);\n      previousDistance = initialDistance;\n      event.preventDefault();\n    }\n  };\n\n  // Handles the touch move event and calculates the scaling factor based on the touch distances\n  const handleTouchMove = (event) => {\n    const touches = event.touches;\n    if (touches.length === 2) {\n      const [touch1, touch2] = touches;\n      const currentDistance = calculateDistance(touch1, touch2);\n\n      // Calculate the scaling factor and clamp it between 0.1 and 2\n      if (initialDistance && previousDistance) {\n        const scaleFactor = currentDistance / previousDistance;\n        const newScale = currentScale * scaleFactor;\n        const clampedScale = Math.min(Math.max(newScale, 0.1), 2);\n\n        // Invoke the onPinch callback with the clampedScale value\n        if (onPinch && typeof onPinch === 'function') {\n          onPinch(clampedScale);\n        }\n\n        currentScale = clampedScale;\n      }\n\n      previousDistance = currentDistance;\n      event.preventDefault(); // Prevents the default touch behavior\n    }\n  };\n\n  // Handles the touch end event and resets the distances\n  const handleTouchEnd = () => {\n    initialDistance = null;\n    previousDistance = null;\n  };\n\n  // Add event listeners for touch events\n  document.addEventListener('touchstart', handleTouchStart);\n  document.addEventListener('touchmove', handleTouchMove);\n  document.addEventListener('touchend', handleTouchEnd);\n\n  // Return a cleanup function to remove event listeners when the component unmounts\n  return () => {\n    document.removeEventListener('touchstart', handleTouchStart);\n    document.removeEventListener('touchmove', handleTouchMove);\n    document.removeEventListener('touchend', handleTouchEnd);\n  };\n};\n","import {isWebview} from '../webview/webview';\n\nconst {getOrSetVariation} = evite.experiments;\n\nexport const isProOrPartyPassUser = (subscriptionPlanName) =>\n  ['pro', 'party_pass'].includes(subscriptionPlanName);\n\nexport function shouldShowPremiumPricingFeaturesInWebview() {\n  return !!(\n    window?.webkit?.messageHandlers?.pendingUpgradeToPremium ||\n    window?.webview?.pendingUpgradeToPremium\n  );\n}\n\nexport const isInPremiumPricingVariationC = (bucketUser = false) => {\n  if (isWebview() && !shouldShowPremiumPricingFeaturesInWebview()) return false;\n  return getOrSetVariation('premium_adoption', 'control', !bucketUser) === 'C';\n};\n\nexport const isInGalleryPremiumAdoptionVariation = () => {\n  if (isWebview() || isProOrPartyPassUser(window?.subscriptionPlanName))\n    return false; // skip if apps or Evite Pro user or Party Pass user\n  return (\n    getOrSetVariation('gallery_premium_adoption', 'control', true) === 'variant'\n  ); // check variation in readonly mode\n};\n","import {reduxPromise} from '../middleware/PromiseResolver';\nimport {\n  HIDE_LOGIN_MODAL,\n  USER_LOGGED_IN,\n  showLoginModal,\n} from '~/common/components/LoginModal/reducer';\nimport {\n  SHOW_NOTIFY_GUESTS_OVERLAY,\n  HIDE_NOTIFY_GUESTS_OVERLAY,\n  CANCEL_NOTIFY_GUESTS_OVERLAY,\n} from '../reducers/modals/constants';\n\n// Pops the login modal and returns a promise that resolves when the user logs in via the modal (and errors if closed)\nexport const loginModalPromise = (dispatch) => {\n  const promise = reduxPromise(null, [USER_LOGGED_IN], [HIDE_LOGIN_MODAL]);\n  dispatch(showLoginModal());\n  return promise;\n};\n\n// Pops the messages modal and returns a promise that resolves when the modal is closed\nexport const NotifyGuestsOverlayPromise = (dispatch) => {\n  const promise = reduxPromise(\n    null,\n    [HIDE_NOTIFY_GUESTS_OVERLAY],\n    [CANCEL_NOTIFY_GUESTS_OVERLAY]\n  );\n  dispatch({type: SHOW_NOTIFY_GUESTS_OVERLAY});\n  return promise;\n};\n","import {history} from '~/CreateFabricInvitation/history';\n\nexport const updateEventIdInPathname = (eventId) => {\n  const components = history.location.pathname.split('/');\n  components[1] = eventId;\n  if (components[2] === 'create') components[2] = 'customize';\n  history.replace(\n    {\n      pathname: components.join('/'),\n      hash: history.location.hash,\n      search: history.location.search,\n    },\n    {}\n  );\n};\n","import {usePrevious} from '~/common/hooks/usePrevious';\nimport {useLocation} from 'react-router-dom';\nimport {useCurrentRoute} from '~/CreateFabricInvitation/navigation';\nimport {useSelector} from 'react-redux';\n\nexport function extractTab(pathname) {\n  const components = pathname.split('/');\n  if (components.length > 1) return components[components.length - 1] || '/';\n  return '/';\n}\n\nfunction trackRouteChange(tab) {\n  const pathname = window.location.pathname;\n  window.setTimeout(function() {\n    // DataOps use this to track pageviews within the app\n    window.dataLayer.push({\n      event: 'pageview',\n      page_title: 'fabric_invitation_create',\n      page_path: pathname,\n    });\n  }, 10);\n}\n\n/**\n * Reports top level route changes to google analytics.\n * @function useTrackPages\n * @return none\n */\nexport const useTrackPages = () => {\n  const location = useLocation();\n\n  const tab = extractTab(location.pathname);\n  const previousTab = usePrevious(tab);\n  if (previousTab !== tab && previousTab !== undefined) {\n    if (previousTab !== 'create' || tab !== 'customize') {\n      trackRouteChange(tab);\n    }\n  }\n  const pathObj = useCurrentRoute();\n  const isPremium = useSelector((state) => state.details.isPremium);\n  const isDraft = useSelector(\n    (state) => (state.eviteEvent?.status || 'draft') === 'draft'\n  );\n  const prevIsPremium = usePrevious(isPremium);\n  const prevPathName = usePrevious(pathObj.name);\n  if (\n    isDraft &&\n    pathObj.name &&\n    (prevPathName !== pathObj.name || prevIsPremium !== isPremium)\n  ) {\n    // We report these events to track the initial conversion funnel\n    window.setTimeout(() => {\n      if (\n        (pathObj.name === 'create' || pathObj.name == 'customize') &&\n        (prevPathName !== pathObj.name || prevIsPremium !== isPremium)\n      ) {\n        window.dataLayer.push({event_is_draft: true});\n      }\n      window.dataLayer.push({\n        event: `fabric_create_${isPremium ? 'premium' : 'free'}_${\n          pathObj.name\n        }`,\n        is_fabric_premium: isPremium,\n        tracking_product_type: window.tracking_product_type,\n      });\n    }, 10);\n  }\n};\n","/**\n * this file is for storing methods to communicate back and forth\n * between the webpage and native app (android & ios).\n */\n\nimport {saveEventThunk} from '../api/event';\nimport {removeOffer} from '../api/review';\nimport {userLoggedIn} from '../components/LoginModal/reducer';\nimport {getCurrentStep} from '../navigation';\nimport {setInEditMode} from '../navigation/utils';\nimport {UPDATE_EVENT_DETAILS} from '../reducers/details/constants';\nimport {REVERT_TO_BASIC} from '../reducers/fabricDesign/constants';\n\nexport function isWebview() {\n  return !!(\n    window?.webkit?.messageHandlers?.fabricCreateOnNav ||\n    window?.webview?.fabricCreateOnNav\n  );\n}\n\nexport function webViewOnNav(newStep, nextStep, prevStep, nextStepLabel) {\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.fabricCreateOnNav &&\n      window.webkit.messageHandlers.fabricCreateOnNav.postMessage(\n        newStep || '',\n        nextStep || '',\n        prevStep || '',\n        nextStepLabel || ''\n      );\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewOnNav(ios): ' + e);\n  }\n\n  // android\n  try {\n    window.webview?.fabricCreateOnNav &&\n      window.webview.fabricCreateOnNav(\n        newStep || '',\n        nextStep || '',\n        prevStep || '',\n        nextStepLabel || ''\n      );\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewOnNav(android): ' + e);\n  }\n}\n\nexport function webViewSetBusy(busy) {\n  // Call while saving, etc.\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.fabricCreateSetBusy &&\n      window.webkit.messageHandlers.fabricCreateSetBusy.postMessage(busy);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetBusy(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.fabricCreateSetBusy)\n      window.webview.fabricCreateSetBusy(busy);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetBusy(android): ' + e);\n  }\n}\n\nexport function webViewSetEventId(eventId) {\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.fabricCreateSetEventId &&\n      window.webkit.messageHandlers.fabricCreateSetEventId.postMessage(eventId);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetEventId(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.fabricCreateSetEventId)\n      window.webview.fabricCreateSetEventId(eventId);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetEventId(android): ' + e);\n  }\n}\n\nexport function webViewSetIsPremium(isPremium) {\n  try {\n    window.webkit?.messageHandlers?.fabricCreateIsPremium &&\n      window.webkit.messageHandlers.fabricCreateIsPremium.postMessage(\n        isPremium\n      );\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in fabricCreateIsPremium(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.fabricCreateIsPremium)\n      window.webview.fabricCreateIsPremium(isPremium);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in fabricCreateIsPremium(android): ' + e);\n  }\n}\n\nexport const isGuamWebviewOrLater = () =>\n  !!window.webkit?.messageHandlers?.pendingUpgradeToPremium || // ios\n  !!window.webview?.pendingUpgradeToPremium; // android\n\nexport function webViewPendingUpgradeToPremium(status) {\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.pendingUpgradeToPremium &&\n      window.webkit.messageHandlers.pendingUpgradeToPremium.postMessage(status);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewPendingUpgradeToPremium(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.pendingUpgradeToPremium) {\n      window.webview.pendingUpgradeToPremium(status);\n    }\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewPendingUpgradeToPremium(android): ' + e);\n  }\n}\n\n// Pass a string (modal identifier) as message\nexport function webViewModalShowing(message) {\n  console.log('modalIsShowing', message);\n\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.modalIsShowing &&\n      window.webkit.messageHandlers.modalIsShowing.postMessage(message);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in modalIsShowing(ios): ' + e);\n  }\n\n  // android\n  try {\n    window.webview?.modalIsShowing && window.webview.modalIsShowing(message);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in modalIsShowing(android): ' + e);\n  }\n}\n\nexport function webViewSetDowngradeSaveStatus(statusCode) {\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.setDowngradeSaveStatus &&\n      window.webkit.messageHandlers.setDowngradeSaveStatus.postMessage(\n        statusCode\n      );\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetDowngradeSaveStatus(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.setDowngradeSaveStatus) {\n      window.webview.setDowngradeSaveStatus(statusCode);\n    }\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetDowngradeSaveStatus(android): ' + e);\n  }\n}\n\nexport function webViewSetPostCheckoutSaveStatus(statusCode) {\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.setPostCheckoutSaveStatus &&\n      window.webkit.messageHandlers.setPostCheckoutSaveStatus.postMessage(\n        statusCode\n      );\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetPostCheckoutSaveStatus(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.setPostCheckoutSaveStatus) {\n      window.webview.setPostCheckoutSaveStatus(statusCode);\n    }\n  } catch (e) {\n    console.error(e);\n    alert(\n      'An error occurred in webViewSetPostCheckoutSaveStatus(android): ' + e\n    );\n  }\n}\n\nexport const setupWebviewDowngradeConnection = (store) => {\n  window.webview = window.webview || {};\n  window.downgradePremium = async () => {\n    store.dispatch({\n      type: REVERT_TO_BASIC,\n    });\n    store.dispatch({\n      type: UPDATE_EVENT_DETAILS,\n      payload: {isPremium: false, hasUpgraded: false},\n    });\n    let statusCode;\n    try {\n      await removeOffer(store);\n      const resp = await store.dispatch(saveEventThunk());\n      webViewPendingUpgradeToPremium(false);\n      statusCode =\n        typeof resp === 'number' ? resp : 'status' in resp ? resp.status : 412;\n    } catch (e) {\n      statusCode = 400; // Some other error not caught; just return 400 error\n    }\n    webViewSetDowngradeSaveStatus(statusCode);\n  };\n};\n\nexport const setupWebviewCheckoutCompleteConnection = (store) => {\n  window.webview = window.webview || {};\n  window.checkoutComplete = async () => {\n    let statusCode;\n    try {\n      const resp = await store.dispatch(saveEventThunk());\n      statusCode =\n        typeof resp === 'number' ? resp : 'status' in resp ? resp.status : 412;\n    } catch (e) {\n      statusCode = 400; // Some other error not caught; just return 400 error\n    }\n    webViewSetPostCheckoutSaveStatus(statusCode);\n  };\n};\n\n// Set up function for apps to call when sending free invitation is complete\nexport const setupWebviewSendCompleteConnection = (store) => {\n  window.webview = window.webview || {};\n  window.sendComplete = async () => {\n    try {\n      // Put create flow into edit mode (i.e. in edit flow now)\n      /**\n       * NOTE: We may want to do a fresh pull of the event object here, to avoid potentially making\n       * saving changes based on an outdated version of the event object.\n       * saveEventThunk writes to the backend on top of returning the latest state of the event,\n       * which is more than we want here, so we may need an API call to just return the latest\n       * state of the event object.\n       */\n      const res = await setInEditMode(store);\n      // Send apps status of changing flow into edit flow\n      webViewSetSendCompleteStatus(res);\n    } catch (e) {\n      // Something failed; cannot assume webview is safely in edit flow now\n      webViewSetSendCompleteStatus(false);\n      return false;\n    }\n  };\n};\n\nexport function webViewSetSendCompleteStatus(status) {\n  console.log('webViewSetSendCompleteStatus', status);\n\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.setSendCompleteStatus &&\n      window.webkit.messageHandlers.setSendCompleteStatus.postMessage(status);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetSendCompleteStatus(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.setSendCompleteStatus) {\n      window.webview.setSendCompleteStatus(status);\n    }\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetSendCompleteStatus(android): ' + e);\n  }\n}\n\nexport const setupWebviewUpsellAcceptConnection = (store) => {\n  window.webview = window.webview || {};\n  window.acceptPostSendUpsell = async () => {\n    try {\n      store.dispatch({\n        type: UPDATE_EVENT_DETAILS,\n        payload: {\n          isPremium: true,\n          isUpsellMode: true,\n          preventUpdateModal: true,\n        },\n      });\n      webViewPendingUpgradeToPremium(true);\n      return true;\n    } catch (err) {\n      return false;\n    }\n  };\n};\n\nexport function webViewSetShouldUserLogIn(value) {\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.setShouldUserLogIn &&\n      window.webkit.messageHandlers.setShouldUserLogIn.postMessage(value);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetShouldUserLogIn(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.setShouldUserLogIn) {\n      window.webview.setShouldUserLogIn(value);\n    }\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewSetShouldUserLogIn(android): ' + e);\n  }\n}\n\nexport const setupWebviewPostLoginSuccessConnection = (store) => {\n  window.webview = window.webview || {};\n  window.postLoginSuccess = async (data) => {\n    const {\n      userId,\n      fullName,\n      subscriptionPlanName,\n      email,\n      avatarDisk,\n      imgUrl,\n      initials,\n      firstName,\n    } = data;\n    store.dispatch(\n      userLoggedIn(\n        userId,\n        fullName,\n        subscriptionPlanName,\n        email,\n        avatarDisk,\n        imgUrl,\n        initials,\n        firstName\n      )\n    );\n    const currentStep = getCurrentStep({store});\n    await navigateToRoute(currentStep.nextRoute, store);\n  };\n};\n\nexport function webViewCloseGuestOptionsMenu(value = true) {\n  console.log('webViewCloseGuestOptionsMenu', value);\n\n  // ios\n  try {\n    window.webkit &&\n      window.webkit.messageHandlers &&\n      window.webkit.messageHandlers.closeGuestOptionsMenu &&\n      window.webkit.messageHandlers.closeGuestOptionsMenu.postMessage(value);\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewCloseGuestOptionsMenu(ios): ' + e);\n  }\n\n  // android\n  try {\n    if (window.webview?.closeGuestOptionsMenu) {\n      window.webview.closeGuestOptionsMenu(value);\n    }\n  } catch (e) {\n    console.error(e);\n    alert('An error occurred in webViewCloseGuestOptionsMenu(android): ' + e);\n  }\n}\n","export const qsArrayTransform = (property) => {\n  const urlParams = new URLSearchParams(window.location.search);\n  const newUrlParams = new URLSearchParams();\n\n  if (urlParams.has(property)) {\n    const arrayStr = urlParams.get('filter').replaceAll(`'`, `\"`);\n    const array = JSON.parse(arrayStr);\n    array.forEach((value) => newUrlParams.append('filter', value));\n  }\n\n  return newUrlParams.toString();\n};\n","import React, {useState} from 'react';\nimport PropTypes from 'prop-types';\nimport urls from 'urls';\n\nimport './LoginContainer.sass';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Input} from '~/common/_pb_components/atoms/Input';\nimport {Overlay} from '~/common/_pb_components/atoms/Overlay';\nimport {Divider} from '~/common/_pb_components/atoms/Divider';\nimport {Link} from '~/common/_pb_components/atoms/Link';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {validateEmail} from '~/ViewInvitation/utils/validateEmail';\nimport {saveUserDataToLocalStorage} from '~/common/auth/utils';\n\nexport const LoginContainer = (props) => {\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [loginFailure, setLoginFailure] = useState(false);\n  const [emailError, setEmailError] = useState('');\n  const [\n    forgotPasswordSentModalOpen,\n    setForgotPasswordSentModalOpen,\n  ] = useState(false);\n\n  const params = new URLSearchParams(window.location.search);\n  const complete = params.get('complete');\n  const showHostMessage = ['event', 'invite_more', 'view_host'].includes(\n    complete\n  );\n\n  const trackUserId = (userId, subscription_plan_name, email) => {\n    window.dataLayer.push({user_identifier: userId});\n    window.dataLayer.push({is_logged_in: 1});\n    if (subscription_plan_name) window.dataLayer.push({subscription_plan_name});\n    window.dataLayer.push({email: email});\n  };\n\n  const handleLogin = (e) => {\n    e.preventDefault();\n    setEmailError('');\n    const {valid, value} = validateEmail(email, false);\n\n    if (!valid || password.length < 6) {\n      setLoginFailure(true);\n    } else {\n      $.ajax({\n        type: 'POST',\n        url: '/ajax_login',\n        data: {email, password},\n        dataType: 'json',\n        success: (data, status, xhr) => {\n          const userId = data.user_id;\n          setLoginFailure(false);\n          trackUserId(userId, data.subscription_plan_name, data.email);\n          saveUserDataToLocalStorage(data);\n          props.onSuccess(\n            userId,\n            data.full_name,\n            data.subscription_plan_name,\n            data.email,\n            data.avatar_disk,\n            data.image_url,\n            data.initials,\n            data.first_name\n          );\n        },\n        error: (xhr, status, error) => {\n          localStorage.removeItem('userData');\n          let errorMsg = xhr.responseText;\n          if (errorMsg === 'Password update required') {\n            props.handlePwReset(true);\n          } else {\n            setLoginFailure(true);\n          }\n        },\n      });\n    }\n  };\n\n  const handleForgotPassword = (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    $.ajax({\n      url: '/modal/forgot',\n      data: {\n        email_forgot: email,\n      },\n      dataType: 'json',\n      type: 'POST',\n      success: (data, status, xhr) => {\n        if (window.mobile) {\n          alert(\n            'Please check your email and follow the instructions to reset your password.'\n          );\n          window.location = '/';\n        } else {\n          setForgotPasswordSentModalOpen(true);\n        }\n      },\n      error: (xhr, status, errorstr) => {\n        try {\n          const response = JSON.parse(xhr.responseText);\n          setEmailError(response['__all__'][0]);\n        } catch (err) {\n          // TODO: Show some sort of error message to the user?\n          console.error(err);\n        }\n      },\n    });\n  };\n\n  const hideForgotPasswordSentModal = () => {\n    setForgotPasswordSentModalOpen(false);\n  };\n\n  const {matches: largeScreen} = useMatchQuery('(min-width: 80rem)');\n\n  return (\n    <div className=\"meganav-login-modal\">\n      <div className=\"logo-header\">\n        {!props.isModal ? (\n          <a\n            id=\"logo_top\"\n            href=\"/\"\n            className=\"logo evite-logo\"\n            data-qa-id=\"evite-logo\"\n            aria-label=\"evite home\"\n          ></a>\n        ) : (\n          <span className=\"label1 large\">\n            {props.forgotPasswordMode ? 'Forgot Your Password?' : 'Sign In'}\n          </span>\n        )}\n        {props.isModal && (\n          <button\n            className=\"unstyled-button\"\n            onClick={props.onCloseModal}\n            data-qa-id=\"signupModalCloseButton\"\n          >\n            <PB_CloseLine />\n          </button>\n        )}\n      </div>\n      {!props.isModal && showHostMessage && !props.forgotPasswordMode && (\n        <>\n          <Typography variant=\"header3\">\n            Are you a guest of this event?\n          </Typography>\n          <Typography variant=\"paragraph3\">\n            <Link\n              data-qa-id={'sign-in-link'}\n              href={urls.get('view', {event_id: window.event_id})}\n            >\n              Click here\n            </Link>{' '}\n            to view \"{window.event_title}\".\n          </Typography>\n          <Divider />\n          <Typography variant=\"header3\">Are you the host?</Typography>\n          <Typography variant=\"paragraph3\">\n            Sign in to your Evite account to manage your event!\n          </Typography>\n        </>\n      )}\n\n      <div className=\"modal-body\">\n        {!props.forgotPasswordMode ? (\n          <>\n            {!props.lgWindow || props.isModal ? (\n              <Typography\n                as=\"h2\"\n                variant={largeScreen ? 'header1' : 'header2'}\n                data-qa-id=\"loginModalSignInHeaderText\"\n              >\n                Welcome back! Sign in to your account.\n              </Typography>\n            ) : (\n              ''\n            )}\n            <div className=\"social-login-group\">\n              <Button\n                variant=\"secondary\"\n                size=\"large\"\n                onClick={props.onGoogleLoginClick}\n                id=\"google\"\n                data-qa-id=\"loginModalSocialGoogleLoginButton\"\n              >\n                <span />\n                Continue with Google\n              </Button>\n              <Button\n                variant=\"secondary\"\n                size=\"large\"\n                onClick={props.onFacebookLoginClick}\n                id=\"facebook\"\n                data-qa-id=\"loginModalSocialFacebookLoginButton\"\n              >\n                <span />\n                Continue with Facebook\n              </Button>\n              <Button\n                variant=\"secondary\"\n                size=\"large\"\n                onClick={props.onAppleLoginClick}\n                id=\"apple\"\n                data-qa-id=\"loginModalSocialAppleLoginButton\"\n              >\n                <span />\n                Continue with Apple\n              </Button>\n            </div>\n          </>\n        ) : (\n          <Typography\n            as=\"p\"\n            variant=\"paragraph1\"\n            data-qa-id=\"forgotPasswordGuidingText\"\n          >\n            Enter your email address below and we will send you an email to\n            reset your password.\n          </Typography>\n        )}\n        <form\n          className=\"login-form\"\n          onSubmit={\n            props.forgotPasswordMode ? handleForgotPassword : handleLogin\n          }\n        >\n          {!props.forgotPasswordMode && (\n            <Typography\n              as=\"label\"\n              variant=\"label2\"\n              classNames=\"small\"\n              data-qa-id=\"orSignInWithEmailText\"\n            >\n              Or Sign In with Email\n            </Typography>\n          )}\n          <Input\n            id=\"login_modal_email_input\"\n            value={email}\n            type=\"email\"\n            onChange={(e) => setEmail(e.target.value)}\n            placeholder=\"Email address\"\n            error={props.forgotPasswordMode && emailError}\n            data-qa-id=\"loginModalEmailInput\"\n            autoComplete=\"email\"\n          />\n          {!props.forgotPasswordMode && (\n            <Input\n              value={password}\n              type=\"password\"\n              onChange={(e) => setPassword(e.target.value)}\n              placeholder=\"Password\"\n              error={\n                loginFailure ? 'Invalid email or password. Try again.' : ''\n              }\n              data-qa-id=\"loginModalPasswordInput\"\n              autoComplete=\"password\"\n            />\n          )}\n          {props.forgotPasswordMode ? (\n            <div className=\"forgot-password__cta-group\">\n              <Button\n                variant=\"primary\"\n                size=\"large\"\n                type=\"submit\"\n                data-qa-id=\"sendResetEmailButton\"\n              >\n                Send\n              </Button>\n              <Button\n                variant=\"secondary\"\n                size=\"large\"\n                onClick={(e) => {\n                  setEmailError('');\n                  props.onForgotPasswordCancel(e);\n                }}\n                data-qa-id=\"cancelForgotPasswordButton\"\n              >\n                Cancel\n              </Button>\n            </div>\n          ) : (\n            <>\n              <Button\n                variant=\"primary\"\n                size=\"large\"\n                type=\"submit\"\n                data-qa-id=\"loginModalSignInButton\"\n              >\n                Sign In\n              </Button>\n              <div className=\"forgot-password-wrapper\">\n                <button\n                  onClick={(e) => {\n                    setEmailError('');\n                    props.onForgotPasswordClick(e);\n                  }}\n                  className=\"unstyled-button\"\n                  data-qa-id=\"loginModalForgotPasswordButton\"\n                >\n                  <Typography\n                    as=\"p\"\n                    variant=\"link\"\n                    classNames=\"large\"\n                    data-qa-id=\"loginModalForgotPasswordButtonText\"\n                  >\n                    Forgot Password?\n                  </Typography>\n                </button>\n              </div>\n            </>\n          )}\n        </form>\n        {!props.forgotPasswordMode && (\n          <Typography\n            as=\"p\"\n            variant=\"paragraph2\"\n            classNames=\"sign-in-redirect\"\n            data-qa-id=\"loginModalDontHaveAccountText\"\n          >\n            Don't have an account?{' '}\n            <button\n              className=\"unstyled-button link\"\n              onClick={props.onCreateAccountClick}\n              data-qa-id=\"loginModalGoToCreateAccountButton\"\n            >\n              Create one\n            </button>\n          </Typography>\n        )}\n        {props.forgotPasswordMode && (\n          <Overlay open={forgotPasswordSentModalOpen}>\n            <div className=\"forgot-password__sent-modal\">\n              <div className=\"forgot-password__sent-modal__header\">\n                <Typography\n                  as=\"h2\"\n                  variant=\"header2\"\n                  data-qa-id=\"forgotPasswordSentHeaderText\"\n                >\n                  Forgot Your Password?\n                </Typography>\n                <button\n                  className=\"unstyled-button\"\n                  onClick={hideForgotPasswordSentModal}\n                  data-qa-id=\"closeForgotPasswordSentModalButton\"\n                >\n                  <PB_CloseLine />\n                </button>\n              </div>\n              <Typography\n                as=\"p\"\n                variant=\"paragraph2\"\n                data-qa-id=\"resetEmailSentGuidingText\"\n              >\n                Please check your email and follow the instructions to reset\n                your password.\n              </Typography>\n              <Button\n                id=\"closeForgotPasswordSentModalBtn\"\n                variant=\"primary\"\n                size=\"large\"\n                onClick={hideForgotPasswordSentModal}\n                data-qa-id=\"hideForgotPasswordSentModalButton\"\n              >\n                Close\n              </Button>\n            </div>\n          </Overlay>\n        )}\n      </div>\n    </div>\n  );\n};\n\nLoginContainer.propTypes = {\n  onCloseModal: PropTypes.func,\n  lgWindow: PropTypes.bool,\n  onSuccess: PropTypes.func,\n  onForgotPasswordClick: PropTypes.func,\n  onForgotPasswordCancel: PropTypes.func,\n  onCreateAccountClick: PropTypes.func,\n  onGoogleLoginClick: PropTypes.func,\n  onFacebookLoginClick: PropTypes.func,\n  onAppleLoginClick: PropTypes.func,\n  forgotPasswordMode: PropTypes.bool,\n};\n","import React, {useState} from 'react';\nimport {SignupModal} from '~/SignupModal';\nimport {LoginContainer} from './LoginContainer';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {getURLParameter} from '~/common/utils';\nimport {ResetPasswordModal} from '~/common/_pb_components/organisms/ResetPasswordModal';\n\nexport const LoginWrapper = ({\n  onSignupSuccess,\n  onLoginSuccess,\n  onCloser,\n  isModal = true,\n}) => {\n  const trackUserId = (userId, subscription_plan_name, email) => {\n    window.dataLayer.push({user_identifier: userId});\n    window.dataLayer.push({is_logged_in: 1});\n    if (subscription_plan_name) window.dataLayer.push({subscription_plan_name});\n    window.dataLayer.push({email: email});\n  };\n\n  const [forgotPasswordMode, setForgotPasswordMode] = useState(false);\n  const [signupOrLogin, setSignupOrLogin] = useState('login');\n\n  const [passwordResetOpen, setPasswordResetOpen] = useState(false);\n  const handlePwReset = () => {\n    setPasswordResetOpen(true);\n  };\n  const handlePwResetClose = (e) => {\n    setPasswordResetOpen(false);\n  };\n\n  const {matches: lgWindow} = useMatchQuery('(min-width: 80rem)', []);\n\n  const switchToLogin = () => setSignupOrLogin('login');\n  const switchToSignup = () => setSignupOrLogin('signup');\n\n  const onCloseHandler = () => {\n    onCloser();\n    setTimeout(() => {\n      setForgotPasswordMode(false);\n      setSignupOrLogin('login');\n    }, 600);\n  };\n\n  const onForgotPasswordClick = (e) => {\n    e.preventDefault();\n    setForgotPasswordMode(true);\n  };\n\n  const onForgotPasswordCancel = (e) => {\n    e.preventDefault();\n    setForgotPasswordMode(false);\n  };\n\n  const onGoogleConnect = (e) => {\n    e.preventDefault();\n    window.evite.when('sign-in-view').then((signInView) => {\n      signInView.google_plus_connect({\n        onConnect: function(\n          fullName,\n          userId,\n          subscriptionPlanName,\n          email,\n          avatarDisk,\n          imgUrl,\n          initials,\n          firstName\n        ) {\n          trackUserId(userId, subscriptionPlanName, email);\n          let next = getURLParameter('next');\n          console.warn(\n            'google connect callback with params ',\n            fullName,\n            userId,\n            subscriptionPlanName,\n            email,\n            avatarDisk,\n            imgUrl,\n            initials,\n            firstName\n          );\n          if (next) {\n            console.warn('going to next ', next);\n            window.parent.location.href = next;\n          } else {\n            console.warn('going to home ');\n            onLoginSuccess(\n              userId,\n              fullName,\n              subscriptionPlanName,\n              email,\n              avatarDisk,\n              imgUrl,\n              initials,\n              firstName\n            );\n          }\n        },\n      });\n    });\n  };\n\n  const onFacebookConnect = (e) => {\n    e.preventDefault();\n    window.evite.when('sign-in-view').then((signInView) => {\n      signInView.facebook_connect({\n        onConnect: (\n          fullName,\n          userId,\n          subscriptionPlanName,\n          email,\n          avatarDisk,\n          imgUrl,\n          initials,\n          firstName\n        ) => {\n          trackUserId(userId, subscriptionPlanName, email);\n          let next = getURLParameter('next');\n          if (next) {\n            window.parent.location = next;\n          } else {\n            onLoginSuccess(\n              userId,\n              fullName,\n              subscriptionPlanName,\n              email,\n              avatarDisk,\n              imgUrl,\n              initials,\n              firstName\n            );\n          }\n        },\n      });\n    });\n  };\n\n  const onAppleConnect = (e) => {\n    e.preventDefault();\n    window.evite.when('sign-in-view').then((signInView) => {\n      const onConnect = (\n        fullName,\n        userId,\n        subscriptionPlanName,\n        email,\n        avatarDisk,\n        imgUrl,\n        initials,\n        firstName\n      ) => {\n        console.warn('authenticated callback entered ');\n        trackUserId(userId, subscriptionPlanName, email);\n        let next = getURLParameter('next');\n        if (next) {\n          console.warn('Go to Next ', next);\n\n          window.parent.location = next;\n        } else {\n          console.warn('Go to Home');\n          onLoginSuccess(\n            userId,\n            fullName,\n            subscriptionPlanName,\n            email,\n            avatarDisk,\n            imgUrl,\n            initials,\n            firstName\n          );\n        }\n      };\n      signInView.apple_connect(onConnect);\n    });\n  };\n\n  return signupOrLogin === 'signup' ? (\n    <SignupModal\n      isModal={isModal}\n      lgWindow={lgWindow}\n      onSignInClick={switchToLogin}\n      onCloseModal={onCloseHandler}\n      privacyPolicyHref=\"/content/privacy_policy/\"\n      termsHref=\"/content/terms/\"\n      onSuccess={onSignupSuccess}\n      onGoogleLoginClick={onGoogleConnect}\n      onFacebookLoginClick={onFacebookConnect}\n      onAppleLoginClick={onAppleConnect}\n    />\n  ) : (\n    <>\n      <LoginContainer\n        isModal={isModal}\n        lgWindow={lgWindow}\n        onCreateAccountClick={switchToSignup}\n        onCloseModal={onCloseHandler}\n        onSuccess={onLoginSuccess}\n        onGoogleLoginClick={onGoogleConnect}\n        onFacebookLoginClick={onFacebookConnect}\n        onAppleLoginClick={onAppleConnect}\n        onForgotPasswordClick={onForgotPasswordClick}\n        onForgotPasswordCancel={onForgotPasswordCancel}\n        forgotPasswordMode={forgotPasswordMode}\n        handlePwReset={handlePwReset}\n      />\n      {passwordResetOpen && (\n        <ResetPasswordModal\n          isOpen={passwordResetOpen}\n          setIsOpen={setPasswordResetOpen}\n          handleClose={handlePwResetClose}\n        />\n      )}\n    </>\n  );\n};\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const MegaNavAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"MegaNav\"\n      loaderStyle={{height: 126}}\n      resolve={() => {\n        return import(/* webpackChunkName: \"MegaNav\" */ '~/MegaNav/MegaNav');\n      }}\n      {...props}\n    />\n  );\n};\n","// export {default as SignupModal} from './SignupModal';\n\nimport React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const SignupModal = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"SignupModal\"\n      // loaderStyle={{}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"signupModal\" */ '~/SignupModal/SignupModal'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import {createBrowserHistory} from 'history';\n\nexport const history = createBrowserHistory({\n  basename: `/event/${window.event_id}`,\n});\n","import urls from 'urls';\nimport * as actions from './constants';\nimport {SET_AVATARS, UPDATE_AVATARS, selectAvatar} from './avatars';\nimport {\n  LIKED_POST,\n  UNLIKED_POST,\n  POST_REPLY,\n  EDIT_POST,\n  DELETE_POST,\n} from './posts';\nimport {SET_NEW_MESSAGES} from './newMessages';\nimport {updateGuestId, updateUserId, updateRsvp} from './global';\nimport {apiFetcher} from './apiFetcher';\nimport {trackInviteRSVP, trackSubmitedRSVP} from '../utils/analytics';\nimport {INIT_APP} from '../../CreateFabricInvitation/reducers/constants';\n\nexport function fetchSinglePhotoPost(eventId, postId, callback) {\n  eventId = eventId || window.event_id;\n  const url = urls.getAPI('api_single_photo_post', {eventId, postId});\n  return apiFetcher(\n    url,\n    null,\n    [actions.FETCH_SINGLE_PHOTO_POST, callback],\n    null,\n    {postId}\n  );\n}\n\nexport function fetchMorePhotos(eventId, cursor, gid, callback) {\n  eventId = eventId || window.event_id;\n  gid = gid || window.guest_id || '';\n  const url = urls.getAPI('api_all_photos', {eventId, cursor, gid});\n  return apiFetcher(url, null, [actions.FETCH_PHOTOS, callback], null);\n}\n\nexport function fetchInvitationSummary(event_id) {\n  event_id = event_id || window.event_id;\n  let url = urls.get('api_invitation_summary', {event_id});\n  let variation = evite.experiments.getOrSetVariation('pandemic-summary');\n  if (variation == 'parallel')\n    fetch(urls.get('pandemic_invitation_summary', {event_id}));\n  else if (variation == 'appengine')\n    fetch(urls.get('pandemic_appengine_invitation_summary', {event_id}));\n  else if (variation == 'appenginelive')\n    url = urls.get('pandemic_appengine_invitation_summary', {event_id});\n  return apiFetcher(\n    url,\n    actions.FETCH_INVITATION_SUMMARY_STARTED,\n    actions.UPDATE_INVITATION_SUMMARY,\n    actions.FETCH_INVITATION_SUMMARY_FAILED\n  );\n}\n\nexport function fetchAvatars(event_id, guest_id) {\n  event_id = event_id || window.event_id;\n  guest_id = guest_id || window.guest_id;\n\n  const url = urls.get('ajax_event_avatars', {\n    event_id: event_id,\n    gid: guest_id,\n  });\n  return apiFetcher(url, null, SET_AVATARS, null);\n}\n\nexport function fetchAvatarsByUserId(event_id, guest_id, user_ids) {\n  event_id = event_id || window.event_id;\n  guest_id = guest_id || window.guest_id;\n\n  const url = urls.get('ajax_event_avatars', {\n    event_id: event_id,\n    gid: guest_id,\n    user_ids: user_ids,\n  });\n  return apiFetcher(url, null, UPDATE_AVATARS, null);\n}\n\nexport function fetchGuestlist(event_id, successCallback, failureCallback) {\n  event_id = event_id || window.event_id;\n\n  const url = urls.getAPI('api_who_is_coming', {event_id: event_id});\n  return apiFetcher(\n    url,\n    null,\n    [actions.UPDATE_GUESTLIST, successCallback],\n    failureCallback\n  );\n}\n\nexport function submitRSVP({\n  isReaction = false,\n  event_id,\n  payload,\n  successCallback,\n  failureCallback,\n}) {\n  event_id = event_id || window.event_id;\n\n  if (payload.email) payload.email = payload.email.toLowerCase();\n\n  let request = {\n    url: urls.get('ajax_view_rsvp', {event_id}),\n    method: 'POST',\n    payload: payload,\n  };\n  const updateGlobals = (dispatch, getState, {results}) => {\n    updateGuestId(results.guest.id);\n    updateUserId(results.guest.user_id);\n    updateRsvp(results.guest.response);\n  };\n  const updateAvatar = (dispatch, getState, {results}) => {\n    // Get the users avatar if we don't already have it\n    const state = getState();\n    if (selectAvatar(results.guest.user_id)(state)) return;\n    dispatch(\n      fetchAvatarsByUserId(event_id, results.guest.id, [results.guest.user_id])\n    );\n  };\n  // Dual analytics calls for RSVP are probably redundant, but keeping around for now in case\n  // some reports are using the old version.\n  const updateAnalytics1 = (dispatch, getState, {results}) => {\n    trackSubmitedRSVP(results.guest.response);\n  };\n  const updateAnalytics2 = (dispatch, getState, {results}) => {\n    trackInviteRSVP(results.guest.response, results.guest.optin);\n  };\n  return apiFetcher(\n    request,\n    null,\n    [\n      updateAnalytics1,\n      actions.SUBMIT_RSVP,\n      successCallback,\n      updateGlobals,\n      updateAnalytics2,\n      updateAvatar,\n      fetchInvitationSummary(event_id),\n    ],\n    [actions.SUBMIT_RSVP_FAILED, failureCallback],\n    null\n  );\n}\n\nexport function likePost(postId) {\n  const eventId = window.event_id;\n  const userId = window.user_id;\n  const guestId = window.guest_id;\n\n  const url = urls.get('api_like_post', {\n    postId: postId,\n    eventId: eventId,\n  });\n\n  return apiFetcher(url, null, LIKED_POST, null, {\n    postId,\n    userId,\n    guestId,\n  });\n}\n\nexport function unlikePost(postId) {\n  const eventId = window.event_id;\n  const userId = window.user_id;\n  const guestId = window.guest_id;\n\n  const url = urls.get('api_unlike_post', {\n    postId: postId,\n    eventId: eventId,\n  });\n\n  return apiFetcher(url, null, UNLIKED_POST, null, {\n    postId,\n    userId,\n    guestId,\n  });\n}\n\nexport function postReply(postId, comment) {\n  const eventId = window.event_id;\n\n  const url = urls.getAPI('api_comment', {\n    postId: postId,\n    eventId: eventId,\n    comment: comment,\n  });\n\n  return apiFetcher(url, null, POST_REPLY, null, {postId, eventId, comment});\n}\n\nexport function editPostComment(postId, comment) {\n  const eventId = window.event_id;\n\n  const url = urls.getAPI('api_edit_post_comment', {\n    postId: postId,\n    eventId: eventId,\n    comment: comment,\n  });\n\n  return apiFetcher(url, null, EDIT_POST, null, {\n    postId,\n  });\n}\n\nexport function deletePost(postId) {\n  const eventId = window.event_id;\n\n  const url = urls.getAPI('api_delete_post', {\n    postId: postId,\n    eventId: eventId,\n  });\n\n  return apiFetcher(url, null, DELETE_POST, null, {postId, eventId});\n}\n\nexport function updateGuestNotificationSettings(\n  settings,\n  successCallback,\n  failureCallback\n) {\n  const eventId = window.event_id;\n  const guestId = window.guest_id;\n\n  const url = urls.getAPI('api_patch_guest_notifications', {\n    eventId: eventId,\n    guestId: guestId,\n    payload: {\n      notifications: {\n        ...settings,\n      },\n    },\n  });\n\n  return apiFetcher(\n    url,\n    null,\n    [actions.GUEST_NOTIFICATIONS_UPDATED, successCallback],\n    failureCallback\n  );\n}\n\nexport function refreshFundraiser() {\n  const eventId = window.event_id;\n\n  const url = urls.getAPI('api_donation_refresh', {\n    eventId: eventId,\n    payload: {refresh: true},\n  });\n\n  return apiFetcher(url);\n}\n\nexport function voteForPollOption(\n  pollId,\n  pollAction,\n  payload,\n  successCallback,\n  failureCallback = null\n) {\n  const eventId = window.event_id;\n\n  failureCallback = () => {\n    console.error('unable to record poll vote');\n  };\n\n  const url = urls.getAPI('api_vote_poll_option', {\n    eventId: eventId,\n    pollId: pollId,\n    pollAction: pollAction,\n    payload: payload,\n  });\n\n  return apiFetcher(\n    url,\n    null,\n    [actions.POLL_VOTE_UPDATED, successCallback],\n    failureCallback\n  );\n}\n\nexport function checkForNewMessages() {\n  // TODO: Extend apiFetcher to support headers so we can simplify this function\n  if (!window.guest_id) return () => {};\n  const url = `/tsunami/v1/services/event/${window.event_id}/guest/${window.guest_id}/messages/status`;\n  const getMessages = {\n    method: 'GET',\n    credentials: 'include',\n    cache: 'no-cache',\n    headers: {\n      'X-CSRFToken': evite.cookie('csrftoken'),\n      Accept: 'application/json',\n    },\n  };\n  return async function(dispatch, getState) {\n    try {\n      const response = await evite.fetch(url, getMessages);\n      if (response.ok) {\n        const responseText = await response.json();\n        dispatch({\n          type: SET_NEW_MESSAGES,\n          responseText,\n        });\n        console.log('message status responseText', responseText);\n      } else {\n        // the error will only emit the blue dot, so let's just console error\n        console.error('error fetching new message status', response);\n      }\n    } catch (e) {\n      console.error('error fetching new message status');\n    }\n  };\n}\n\nexport function fetchWhatToBring(eventId) {\n  eventId = eventId || window.event_id;\n  const url = urls.getAPI('api_wtb', {eventId});\n  return apiFetcher(url, null, actions.FETCH_WTB, null);\n}\n\nexport function removeOtherWhatToBringItem(eventId, wtbListId, itemId) {\n  eventId = eventId || window.event_id;\n  const url = urls.getAPI('api_wtb_remove_other', {eventId, wtbListId, itemId});\n  return apiFetcher(url, null, actions.WTB_REMOVE_OTHER, null, {\n    wtbListId,\n  });\n}\n\nexport function postWhatToBringSignup(\n  eventId,\n  wtbListId,\n  itemId,\n  quantity,\n  {userId, userName, itemName = ''}\n) {\n  eventId = eventId || window.event_id;\n  userId = userId || window.user_id;\n  userName = userName || '';\n  const url = urls.getAPI('api_wtb_signup', {\n    eventId,\n    wtbListId,\n    itemId,\n    quantity,\n    itemName,\n  });\n  return apiFetcher(url, null, actions.WTB_UPDATED, null, {\n    userId,\n    userName,\n    itemId,\n    itemName,\n  });\n}\n\nexport function removeUserSignUp(eventId, wtbListId, itemId) {\n  eventId = eventId || window.event_id;\n  const userId = window.user_id || '';\n  const url = urls.getAPI('api_wtb_remove_user_signup', {\n    eventId,\n    wtbListId,\n    itemId,\n  });\n\n  return apiFetcher(url, null, actions.WTB_REMOVE_USER_SIGNUP, null, {\n    eventId,\n    wtbListId,\n    itemId,\n    userId,\n  });\n}\n","function dispatchActions(dispatch, action, actionPayload) {\n  // Dispatches one or more actions based on type of actions parameter (string, function or array)\n  if (!action) return;\n  if (Array.isArray(action)) {\n    for (let item of action) dispatchActions(dispatch, item, actionPayload);\n    return;\n  }\n  if (typeof action === 'string')\n    return dispatch({type: action, ...actionPayload});\n  if (typeof action === 'function')\n    return dispatch((dispatch, getState) => {\n      action(dispatch, getState, actionPayload);\n    });\n}\n\nfunction reportDataLayer(dataLayer) {\n  // TODO: Not used at the moment - I think we want to control the dataLayer pushes from the front-end, not the\n  // TODO: ajax api.  Remove?\n  if (!dataLayer) return;\n  setTimeout(() => {\n    evite\n      .when('dfp')\n      .then(function() {\n        if (window.dataLayer) {\n          window.dataLayer.push(dataLayer);\n        }\n      })\n      .catch(function(e) {\n        evite.error('Failed to update dataLayer');\n        Raven.captureException(e);\n      });\n  }, 100);\n}\n\nexport function apiFetcher(\n  resource, // url or {url, method, payload}\n  startAction,\n  successAction,\n  failureAction,\n  actionPayload, // data to include in the start/success/failure actions\n  retries = 3\n) {\n  let method = 'GET';\n  let payload, url;\n  let contentType = 'application/json';\n\n  if (typeof resource === 'string') {\n    url = resource;\n  } else {\n    method = resource.method || method;\n    payload = resource.payload || payload;\n    url = resource.url;\n    contentType = resource.contentType || contentType;\n  }\n  actionPayload = actionPayload || {};\n  return async function(dispatch, getState) {\n    // TODO: prevent multiple simultaneous calls to same API endpoint?\n    // TODO: automatically track an inProgress state for each API endpoint?\n    let results = {};\n    try {\n      dispatchActions(dispatch, startAction, {url, ...actionPayload});\n      var response = await fetch(url, {\n        method,\n        cache: 'no-store',\n        headers: {\n          'Content-Type': contentType,\n          Accept: 'application/json',\n          'X-Evite-Guest-Id': window.guest_id,\n        },\n        body:\n          payload && contentType.indexOf('json') >= 0\n            ? JSON.stringify(payload)\n            : payload,\n      });\n\n      if (!response.ok) {\n        evite.error(`Failed to retry fetch ${url}`);\n        if (response.status >= 500 && retries > 0) {\n          return apiFetcher(\n            resource,\n            null,\n            successAction,\n            failureAction,\n            retries - 1\n          );\n        }\n        try {\n          results = await response.json();\n        } catch (e) {}\n        throw response.status;\n      }\n      try {\n        results = await response.json();\n        // reportDataLayer(results && results.data_layer);  Todo: remove?\n      } catch (e) {\n        evite.error(\n          'Unable to parse JSON response - proceeding as if empty response',\n          e\n        );\n      }\n      const message = results.message || results;\n      dispatchActions(dispatch, successAction, {\n        results: message,\n        ...actionPayload,\n      });\n    } catch (e) {\n      evite.error(`Failed to fetch ${url}`, e);\n      dispatchActions(dispatch, failureAction, {\n        error: e,\n        response,\n        results,\n        ...actionPayload,\n      });\n    }\n  };\n}\n","export const SET_AVATARS = 'ViewInvitation/avatars/set_avatars';\nexport const UPDATE_AVATARS = 'ViewInvitation/avatars/update_avatars';\n\nexport function selectAvatar(userId) {\n  return (state) => state?.avatars?.userAvatars[userId] ?? '';\n}\n\nconst initialState = {\n  userAvatars: {},\n  avatarsFetched: false,\n};\n\nexport function reducer(state = initialState, action) {\n  switch (action.type) {\n    case SET_AVATARS:\n      let avatars = Object.assign({}, action.avatars || action.results);\n      delete avatars.data_layer;\n      return {\n        userAvatars: avatars,\n        avatarsFetched: true,\n      };\n    case UPDATE_AVATARS:\n      avatars = Object.assign({}, action.avatars || action.results);\n      delete avatars.data_layer;\n      return {\n        userAvatars: {\n          ...state.userAvatars,\n          ...avatars,\n        },\n        avatarsFetched: true,\n      };\n    default:\n      return state;\n  }\n}\n","export const UPDATE_INVITATION_SUMMARY =\n  'ViewInvitation/*/UpdateInvitationSummary';\nexport const FETCH_INVITATION_SUMMARY_STARTED =\n  'ViewInvitation/*/FetchInvitationSummaryStarted';\nexport const FETCH_INVITATION_SUMMARY_FAILED =\n  'ViewInvitation/*/FetchInvitationSummaryFailed';\nexport const UPDATE_GUESTLIST = 'ViewInvitation/*/UpdateGuestList';\n\nexport const SUBMIT_RSVP = 'ViewInvitation/*/SubmitRSVP';\nexport const SUBMIT_RSVP_STARTED = 'ViewInvitation/*/SubmitRSVPStarted';\nexport const SUBMIT_RSVP_FAILED = 'ViewInvitation/*/SubmitRSVPFailed';\n\nexport const SET_EVITE_EVENT = 'ViewInvitation/*/setEviteEvent';\n\nexport const GUEST_NOTIFICATIONS_UPDATED =\n  'ViewInvitation/*/GuestNotificationsUpdated';\nexport const EVENT_REMINDERS_UPDATED = 'ViewInvitation/*/EventRemindersUpdated';\n\nexport const DONATION_MADE = 'ViewInvitation/Donations/DonationMade';\nexport const TURN_ON_DONATION_LOADING =\n  'ViewInvitation/Donations/TurnOnDonationLoading';\nexport const TURN_OFF_DONATION_LOADING =\n  'ViewInvitation/Donations/TurnOffDonationLoading';\n\nexport const FETCH_PHOTOS = 'ViewInvitation/*/FetchMorePhotos';\nexport const FETCH_SINGLE_PHOTO_POST = 'ViewInvitation/*/FetchSinglePhotoPost';\nexport const UPLOAD_PHOTOS = 'ViewInvitation/*/UploadPhotos';\n\nexport const POLL_VOTE_UPDATED = 'ViewInvitaion/Polls/PollVoteUpdated';\nexport const ADD_STAGED_PHOTO = 'upload_photos/add_staged_file';\nexport const ADD_PENDING_PHOTO = 'upload_photos/add_pending_file';\nexport const CLEAR_PENDING_PHOTOS = 'upload_photos/clear_pending_files';\nexport const TOGGLE_PHOTO_SELECTED = 'upload_photos/toggle_photo_selected';\nexport const SET_FILE_FAILED = 'upload_photos/set_pending_file_failed_to_stage';\n\nexport const FETCH_WTB = 'ViewInvitation/WTB/FetchWhatToBringDetail';\nexport const WTB_UPDATE_SELECTIONS = 'ViewInvitation/WTB/UpdateSelections';\nexport const WTB_RESET_SELECTIONS = 'ViewInvitation/WTB/ResetSelections';\nexport const WTB_TOGGLE_EDITING = 'ViewInvitation/WTB/ToggleEditing';\n\nexport const WTB_UPDATED = 'ViewInvitation/WTB/Updated';\nexport const WTB_REMOVE_USER_SIGNUP = 'ViewInvitation/WTB/RemoveUserSignUp';\nexport const WTB_ADDED_OTHER = 'ViewInvitation/WTB/AddOtherItem';\nexport const WTB_REMOVE_OTHER = 'ViewInvitation/WTB/RemoveOtherItem';\nexport const INIT_PREMIUM_DESIGN = 'ViewInvitation/premiumDesign/INIT';\n\nexport const TURN_ON_READONLY_PREVIEW = 'ViewInvitation/preview/turnOnReadonly';\n","import {history} from '../history';\n\n// This file contains function functions operate on global state outside of the REDUX state tree.\n// This includes window variables, url parameters, cookies, localState, messaging store\n\nexport const updateGuestId = (guestId) => {\n  window.guest_id = guestId;\n\n  // Update the URL parameters with the gid\n  const location = history.location;\n  const params = new URLSearchParams(location.search);\n  params.set('gid', guestId);\n  history.replace(\n    {pathname: location.pathname, search: `?${params}`},\n    location.state\n  );\n  const messaging = window.evite?.stores?.messaging;\n  if (messaging) messaging.guestId = guestId;\n};\n\nexport const updateUserId = (userId) => {\n  window.user_id = userId;\n  const messaging = window.evite?.stores?.messaging;\n  if (messaging) messaging.userId = userId;\n};\n\nexport const updateRsvp = (rsvp) => {\n  // Update the Messaging store if it has been loaded.\n\n  const messaging = window.evite?.stores?.messaging;\n  if (messaging) messaging.rsvpResponse = rsvp;\n\n  // Update the dataLayer\n  const responseLookup = {YES: 'y', NO: 'n', MAYBE: 'm'};\n  window.dataLayer.push({response: responseLookup[rsvp]});\n};\n","export const SET_NEW_MESSAGES = 'SET_NEW_MESSAGES';\n\nconst initialState = {\n  hasNewMessages: false,\n};\n\nexport function reducer(state = initialState, action) {\n  switch (action.type) {\n    case SET_NEW_MESSAGES:\n      const hasNewMessages =\n        action.responseText !== undefined\n          ? action.responseText.status.has_unread\n          : action.value;\n      return {\n        hasNewMessages: hasNewMessages,\n      };\n\n    default:\n      return state;\n  }\n}\n","import {\n  UPDATE_GUESTLIST,\n  FETCH_PHOTOS,\n  FETCH_SINGLE_PHOTO_POST,\n} from './constants';\nexport const LIKED_POST = 'ViewInvitation/posts/like';\nexport const UNLIKED_POST = 'ViewInvitation/posts/unlike';\nexport const POST_REPLY = 'ViewInvitation/posts/reply';\nexport const EDIT_POST = 'ViewInvitation/posts/edit';\nexport const DELETE_POST = 'ViewInvitation/posts/delete';\n\nconst initialState = {\n  /*\n  postId: {\n    userId: '0000ANACBWOYFIQXQEPK6IHPM3ONOA',\n    likedBy: [],\n    comment: 'me too! Thanks for hosting!',\n    guestName: 'Some Guest',\n    viewDate: '',\n    when: 'just now',\n    parentPostId: null,\n    replyIds: [],\n    mentions: [],\n    postType: 'single_photo',\n  },\n  */\n};\n\nexport function selectPost(postId) {\n  return (state) => {\n    return state.posts[postId];\n  };\n}\n\nfunction* _rsvpsFromGuestList(details) {\n  for (let response of ['yes', 'no', 'maybe'])\n    for (let rsvp of details[response]) yield rsvp;\n}\n\nfunction _extractPost(post, parentId) {\n  let replyIds = [];\n\n  if (post.replies && Array.isArray(post.replies)) {\n    replyIds = post.replies.map((r) => r.post_id);\n  } else if (post.replies && post.replies.objects) {\n    replyIds = post.replies.objects.map((r) => {\n      return r.id;\n    });\n  }\n\n  let likedBy = [];\n  if (Array.isArray(post.liked_by)) likedBy = post.liked_by;\n  else if (typeof post.liked_by === 'object')\n    likedBy = Object.keys(post.liked_by);\n\n  let guestName = post.guest_name || post.guestName || '';\n  if (!guestName && post.creator)\n    guestName = `${post.creator.first_name} ${post.creator.last_name}`.trim();\n\n  return {\n    postId: post.id,\n    photoUrl: post.post_type === 'single_photo' ? post.content.url : undefined,\n    userId: post.user_id || post.creator_id,\n    likedBy: likedBy,\n    comment: post.rsvp_comment || post.comment || '',\n    guestName: guestName,\n    creatorName: post.creator\n      ? post.creator.first_name + post.creator.last_name\n      : '',\n    viewDate: post.viewDate || post.date_viewed || '',\n    when: post.rsvp_when || post.comment_when || post.created || 'just now',\n    parentPostId: parentId || String(post.parent_id),\n    replyIds: replyIds,\n    mentions: post.mentions || [],\n    postType: post.post_type ? post.post_type : '',\n  };\n}\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case UPDATE_GUESTLIST:\n      // Extract the posts from the guestlist call\n      let details = action.results?.rsvp_details;\n      if (!details) return state;\n      let newPosts = {};\n      for (let rsvp of _rsvpsFromGuestList(details)) {\n        if (!rsvp.post_id) {\n          console.log('No Post id for rsvp', rsvp);\n          continue;\n        }\n        newPosts[rsvp.post_id] = _extractPost(rsvp);\n        for (let reply of rsvp.replies || []) {\n          newPosts[reply.post_id] = _extractPost(reply, rsvp.post_id);\n        }\n      }\n      return {\n        ...state,\n        ...newPosts,\n      };\n\n    case LIKED_POST: {\n      const {postId, userId} = action;\n      const post = state[postId];\n      return {\n        ...state,\n        [postId]: {\n          ...post,\n          likedBy: post.likedBy.concat([userId]),\n        },\n      };\n    }\n    case UNLIKED_POST: {\n      const {postId, userId} = action;\n      const post = state[postId];\n      return {\n        ...state,\n        [postId]: {\n          ...post,\n          likedBy: post.likedBy.filter((id) => id !== userId),\n        },\n      };\n    }\n    case POST_REPLY: {\n      const {postId: parentPostId, results: reply} = action;\n      const parentPost = state[parentPostId];\n      const replyPost = _extractPost(reply);\n      const replyId = String(reply.id);\n      return {\n        ...state,\n        [parentPostId]: {\n          ...parentPost,\n          replyIds: parentPost.replyIds.concat([replyId]),\n        },\n        [replyId]: replyPost,\n      };\n    }\n    case EDIT_POST: {\n      const {postId: postId, results} = action;\n      const updatedPost = _extractPost(results);\n      return {\n        ...state,\n        [postId]: updatedPost,\n      };\n    }\n    case DELETE_POST: {\n      const {postId} = action;\n      const parentPostId = state[postId].parentPostId;\n      if (\n        !!parentPostId &&\n        parentPostId !== 'undefined' &&\n        parentPostId !== 'null'\n      ) {\n        const parentPost = state[parentPostId];\n\n        if (parentPost && !parentPost.replyIds) {\n          parentPost.replyIds = [];\n        }\n        const filteredReplies = parentPost\n          ? parentPost.replyIds.filter((id) => id !== postId)\n          : [];\n        console.log(\n          'just in case: parentPost, parentPostId, filteredReplies',\n          parentPost,\n          parentPostId,\n          filteredReplies\n        );\n        return {\n          ...state,\n          [postId]: undefined,\n          [parentPostId]: {\n            ...parentPost,\n            replyIds: filteredReplies || [],\n          },\n        };\n      }\n      return {\n        ...state,\n        [postId]: undefined,\n      };\n    }\n\n    case FETCH_PHOTOS: {\n      let newPosts = {};\n      for (let photo of action.results.posts) {\n        newPosts[photo.id] = _extractPost(photo);\n        for (let reply of photo.replies.objects || []) {\n          newPosts[reply.id] = _extractPost(reply, photo.id);\n        }\n      }\n\n      return {\n        ...state,\n        ...newPosts,\n      };\n    }\n\n    case FETCH_SINGLE_PHOTO_POST: {\n      const {postId} = action;\n      let singlePost = {};\n      const post = action.results;\n\n      singlePost[postId] = _extractPost(post);\n\n      for (let reply of post.replies.objects || []) {\n        singlePost[reply.id] = _extractPost(reply, postId);\n      }\n\n      return {\n        ...state,\n        ...singlePost,\n      };\n    }\n\n    default:\n      return state;\n  }\n}\n","export const trackSubmitedRSVP = (response) => {\n  if (window.tags)\n    window.tags.track_event('submit_rsvp', {\n      invite_rsvp_response: response,\n    });\n};\n\nexport const trackInviteRSVP = (response, optin) => {\n  if (window.dataLayer)\n    window.dataLayer.push({\n      event: 'invite_rsvp',\n      invite_rsvp_response: response,\n      invite_rsvp_optin: optin,\n    });\n};\n\nexport const trackPollVote = (pollEvent) => {\n  if (window.dataLayer) {\n    window.dataLayer.push({\n      event: pollEvent,\n    });\n  }\n};\n","import {CaptchaDialog} from '~/modal';\nimport {modal_ajax_error_handler} from '~/modal/_ajax_error_handler';\nimport XDate from 'xdate';\nimport {convertToIso} from '~/create/utils/formatters';\n\nconst VIDEO_CHAT_TYPE_EVITE = 'evite';\nconst VIDEO_CHAT_TYPE_CUSTOM = 'custom';\nconst VALID_VIDEO_CHAT_TYPES = [VIDEO_CHAT_TYPE_EVITE, VIDEO_CHAT_TYPE_CUSTOM];\n\nexport function eventHasPassed() {\n  return !!window.event_has_passed;\n}\n\nexport function isPremium() {\n  return !!window.is_premium;\n}\n\nexport function isMobile() {\n  return !!window.is_mobile_site;\n}\n\nexport function hasAds() {\n  return !isPremium() && !window.evite_event.remove_ads;\n}\n\nexport function isCard() {\n  return !!window.is_card;\n}\n\nexport function isCancelled() {\n  return window.evite_event.status === 'cancelled';\n}\n\nexport function isHost() {\n  return !!window.evite_event.is_host_viewing;\n}\n\nexport function canSeeGuests() {\n  return !window.evite_event.options.event_option_private_guestlist;\n}\n\nexport function canRSVP() {\n  return !isCard() && !eventHasPassed() && !isCancelled();\n}\n\nexport const isPreview = () => {\n  return !!window.is_preview;\n};\n\nexport function handleCaptchaJsonResponse(responseJson) {\n  return new Promise((resolve) => {\n    new CaptchaDialog({\n      challenge: responseJson,\n      onSubmit: (_response) => {\n        const captchaResponse = Object.assign({}, _response);\n        captchaResponse.name = undefined;\n        resolve(captchaResponse);\n      },\n    }).show();\n  });\n}\n\nexport function handleCaptcha(xhr, status, data, callback) {\n  if (xhr && xhr.status === 412) {\n    let response = JSON.parse(xhr.responseText);\n    new CaptchaDialog({\n      challenge: response,\n      onSubmit: function(captcha) {\n        captcha['name'] = void 0;\n        captcha = JSON.stringify(captcha);\n        callback(captcha);\n      },\n    }).show();\n  } else {\n    renderAjaxErrorModal(xhr, status, data);\n    if (callback) {\n      callback('');\n    }\n  }\n}\n\nexport function renderAjaxErrorModal(xhr, status, data) {\n  const hasStatus = xhr && xhr.status;\n  const isServerError = xhr && xhr.status >= 500 && xhr.status < 600;\n\n  if (hasStatus && (isMobile() || isServerError)) {\n    let message = 'Sorry, an error has occurred';\n    let responseTextMessage;\n\n    try {\n      responseTextMessage = JSON.parse(xhr.responseText).message;\n    } catch (error) {\n      responseTextMessage = xhr.responseText;\n    }\n\n    if (isServerError) {\n      let consoleTitle =\n        typeof data == 'string' ? data : 'Internal Server Error';\n      if (responseTextMessage && console && console.error) {\n        console.error(`${consoleTitle}:\\n\\n${responseTextMessage}\\n`);\n      }\n      message = 'Sorry, an internal server error has occurred';\n    } else if (responseTextMessage) {\n      message = responseTextMessage;\n    }\n\n    alert(message);\n  } else {\n    modal_ajax_error_handler(xhr, status, data);\n  }\n}\n\nexport function fixupAbsoluteURL(url) {\n  // Adds https:// to url if needed\n  if (url && !url.match(/https?:\\/\\//i)) {\n    if (url[0] !== '/') url = '//' + url;\n    url = 'https:' + url;\n  }\n  return url;\n}\n\nexport const shouldShowVideoChat = (state) => {\n  return (\n    window.evite_event.video_chat_type === 'evite' &&\n    !state.needsRsvp &&\n    !state.toEarly &&\n    (state.isJoined || state.isVideoChatTabOpened)\n  );\n};\n\nexport const isVideoChatEnabled = () => {\n  if (!Boolean(window.evite_event.video_chat_type)) return false;\n  return VALID_VIDEO_CHAT_TYPES.includes(window.evite_event.video_chat_type);\n};\n\nexport const isUsingEviteVideoChat = () => {\n  return (\n    isVideoChatEnabled() &&\n    window.evite_event.video_chat_type === VIDEO_CHAT_TYPE_EVITE\n  );\n};\n\nexport const isUsingCustomVideoChat = () => {\n  return (\n    isVideoChatEnabled() &&\n    window.evite_event.video_chat_type === VIDEO_CHAT_TYPE_CUSTOM\n  );\n};\n\nexport const isTooEarlyForVideoChat = (maxNumHoursBefore = 24) => {\n  const startDateTime = new XDate(\n    convertToIso(window.evite_event?.start_datetime || '')\n  );\n  const currentDateTime = new XDate();\n  return currentDateTime.diffHours(startDateTime) >= maxNumHoursBefore;\n};\n","import {str} from 'evite';\n\n// matching validation logic in /typhoon/assets/js/common/utils.js\nexport const validateEmail = (email, allowEmpty) => {\n  const MAX_EMAIL_LENGTH = 254;\n\n  email = str(email).trim();\n  email = email.replace(/^[\\s(<{\\[]+/, '');\n  email = email.replace(/[\\s)>}\\]]+$/, '');\n\n  if (!email && allowEmpty) {\n    return {valid: true, value: ''};\n  }\n\n  if (!email && !allowEmpty) {\n    return {valid: false, message: 'Email address is required'};\n  }\n\n  if (email.length > MAX_EMAIL_LENGTH) {\n    return {\n      valid: false,\n      message: `Email address max length is ${MAX_EMAIL_LENGTH}`,\n    };\n  }\n\n  // to match backEnd validation\n  // Server enforced regex\n  const serverRegex = /(^\\s*[a-zA-Z0-9.\\\"!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9_-]+\\.[a-zA-Z0-9-.]+\\s*$)/gm;\n  // Browser enforced regex\n  const browserRegex = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/gm;\n  const isValidFormat = browserRegex.exec(email) && serverRegex.exec(email);\n\n  if (!isValidFormat) {\n    return {valid: false, message: 'Invalid email address'};\n  }\n\n  return {valid: true, value: email};\n};\n","import React, {useState, useEffect, useRef} from 'react';\nimport PropTypes from 'prop-types';\n\nexport const Button = React.forwardRef((props, ref) => {\n  const [processing, setProcessing] = useState(false);\n  const mountedRef = useRef(true);\n\n  const onClick = async (e) => {\n    // If the props.onClick handler returns a promise we wait until it completes before allowing another click to go through.\n    if (processing) return;\n    const value = props.onClick(e);\n    if (value && typeof value.then === 'function') {\n      if (!props.disableProcessing) {\n        setProcessing(true);\n      }\n      if (props.override) {\n        e.preventDefault();\n        e.stopPropagation();\n      }\n      value.finally(() => {\n        mountedRef.current && setProcessing(false);\n      });\n    }\n    return value;\n  };\n\n  useEffect(() => {\n    // track when we are unmounted so we don't update the state after un-mounting\n    return () => {\n      mountedRef.current = false;\n    };\n  }, []);\n\n  return (\n    <button\n      id={props.id}\n      data-qa-id={props['data-qa-id']}\n      data-impression-tracking={props['data-impression-tracking']}\n      data-qa-value={props['data-qa-value']}\n      data-qa-tigran={props['data-qa-tigran']}\n      className={`button ${props.className || ''} ${props.variant ||\n        'primary'} ${props.size === 'large' ? 'large' : 'small'} ${\n        props.fullWidth ? 'wide' : ''\n      } ${props.tight ? 'tight' : ''} ${props.noTextWrap ? 'nowrap' : ''} ${\n        processing ? 'processing' : ''\n      }`}\n      onClick={props.onClick ? onClick : undefined}\n      onMouseEnter={props.onMouseEnter}\n      onMouseLeave={props.onMouseLeave}\n      disabled={props.disabled}\n      type={props.type ?? (props.formSubmit && 'submit')}\n      ref={ref}\n    >\n      {processing && <span className=\"evt-spinner inline\" />}\n      {props.icon}\n      {processing && props.processingChildren\n        ? props.processingChildren\n        : props.children}\n    </button>\n  );\n});\n\nButton.propTypes = {\n  id: PropTypes.string,\n  className: PropTypes.string,\n  variant: PropTypes.oneOf([\n    'primary',\n    'secondary',\n    'transparent',\n    'unstyled-button',\n    'link',\n  ]),\n  size: PropTypes.oneOf(['small', 'large']),\n  tight: PropTypes.bool,\n  onClick: PropTypes.func,\n  onMouseEnter: PropTypes.func,\n  onMouseLeave: PropTypes.func,\n  processingChildren: PropTypes.oneOfType([\n    PropTypes.element,\n    PropTypes.string,\n  ]),\n  children: PropTypes.oneOfType([\n    PropTypes.element,\n    PropTypes.node,\n    PropTypes.string,\n  ]).isRequired,\n  formSubmit: PropTypes.bool,\n  fullWidth: PropTypes.bool,\n  disabled: PropTypes.bool,\n  'data-qa-id': PropTypes.string.isRequired,\n  'data-impression-tracking': PropTypes.string,\n  'data-qa-value': PropTypes.string,\n  type: PropTypes.string,\n  icon: PropTypes.element,\n  override: PropTypes.bool,\n  noTextWrap: PropTypes.bool,\n  disableProcessing: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport const Divider = (props) => (\n  <hr\n    style={{\n      marginTop: props.marginTop,\n      marginBottom: props.marginBottom,\n      marginLeft: props.marginLeft,\n      marginRight: props.marginRight,\n      width: props.width === null ? props.width : props.width || '100%',\n    }}\n  />\n);\n\nDivider.propTypes = {\n  marginTop: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  marginBottom: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  marginLeft: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  marginRight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n  width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),\n};\n","import React, {useCallback, useEffect, useState} from 'react';\nimport {components} from 'react-select';\nimport CreatableSelect from 'react-select/creatable';\nimport PropTypes from 'prop-types';\nimport {\n  coin,\n  fog,\n  silver,\n  linen,\n  feedbackError,\n  charcoal,\n} from '~sass/pb_styleguide/base/_exports.sass';\nimport {PB_Chevron} from '~/common/svg/PB_Chevron';\nimport {PB_Info} from '~/common/svg/PB_Info';\nimport {\n  CardNumberElement,\n  CardCvcElement,\n  CardExpiryElement,\n} from '@stripe/react-stripe-js';\nimport Tooltip from 'rc-tooltip';\nimport 'rc-tooltip/assets/bootstrap.css';\n\nconst DropdownIndicator = (props) => (\n  <components.DropdownIndicator {...props}>\n    <PB_Chevron direction=\"down\" ratio={0.75} />\n  </components.DropdownIndicator>\n);\n\nconst SingleValue = ({children, ...props}) => {\n  const innerProps = {['data-qa-id']: props.selectProps['data-qa-id']};\n\n  if (props.selectProps.placeholder === 'PT') {\n    // if select is timezone...\n    return (\n      <components.SingleValue {...props}>\n        {props.getValue()?.[0]?.value}\n      </components.SingleValue>\n    );\n  }\n\n  return <components.SingleValue {...props}>{children}</components.SingleValue>;\n};\n\nconst CustomInput = ({selectProps, ...props}) => {\n  return (\n    <components.Input\n      {...props}\n      data-qa-id={selectProps['data-qa-id']}\n      data-label={props.getValue()?.[0]?.label}\n      data-value={props.getValue()?.[0]?.value}\n      readOnly={props.readOnly || props.readonly}\n      aria-readonly={props.readOnly || props.readonly}\n    />\n  );\n};\n\nexport const Input = React.forwardRef(({isClearable = true, ...props}, ref) => {\n  const [times, setTimes] = useState(\n    [\n      '12:00 AM',\n      '12:30 AM',\n      '1:00 AM',\n      '1:30 AM',\n      '2:00 AM',\n      '2:30 AM',\n      '3:00 AM',\n      '3:30 AM',\n      '4:00 AM',\n      '4:30 AM',\n      '5:00 AM',\n      '5:30 AM',\n      '6:00 AM',\n      '6:30 AM',\n      '7:00 AM',\n      '7:30 AM',\n      '8:00 AM',\n      '8:30 AM',\n      '9:00 AM',\n      '9:30 AM',\n      '10:00 AM',\n      '10:30 AM',\n      '11:00 AM',\n      '11:30 AM',\n      '12:00 PM',\n      '12:30 PM',\n      '1:00 PM',\n      '1:30 PM',\n      '2:00 PM',\n      '2:30 PM',\n      '3:00 PM',\n      '3:30 PM',\n      '4:00 PM',\n      '4:30 PM',\n      '5:00 PM',\n      '5:30 PM',\n      '6:00 PM',\n      '6:30 PM',\n      '7:00 PM',\n      '7:30 PM',\n      '8:00 PM',\n      '8:30 PM',\n      '9:00 PM',\n      '9:30 PM',\n      '10:00 PM',\n      '10:30 PM',\n      '11:00 PM',\n      '11:30 PM',\n    ].map((t) => ({label: t, value: t}))\n  );\n\n  useEffect(() => {\n    props.times && setTimes(props.times);\n  }, [props.times]);\n\n  const qaId = props['data-qa-id'];\n  const ariaLabel = props['aria-label'];\n  const setTimeQAData = useCallback(\n    (timeRef) => {\n      if (timeRef && qaId) {\n        if (timeRef.inputRef) {\n          if (timeRef.dataset) {\n            timeRef.inputRef.dataset.qaId = qaId;\n          }\n        }\n      }\n    },\n    [props.type]\n  );\n\n  const disabled = !!props.disabled;\n\n  return (\n    <div className={`input-wrapper ${props.className ? props.className : ''}`}>\n      {props.label && (\n        <label className=\"label2 small input-label\" htmlFor={props.id}>\n          {props.label}{' '}\n          {props.required && <span className=\"label3\">(Required) </span>}\n          {props.tooltipContent && (\n            <Tooltip\n              placement=\"top\"\n              trigger={['hover', 'click']}\n              overlay={<span>{props.tooltipContent}</span>}\n              overlayClassName={props.overlayClassName}\n              getTooltipContainer={(node) => node}\n            >\n              <span style={{position: 'relative'}}>\n                <PB_Info className=\"event-details__info\" />\n              </span>\n            </Tooltip>\n          )}\n        </label>\n      )}\n      {props.type === 'credit-card' ? (\n        <div className=\"pb-card-entry\">\n          <CardNumberElement\n            id={props.id}\n            data-qa-id={qaId}\n            onChange={props.onChange}\n          />\n        </div>\n      ) : props.type === 'expiry' ? (\n        <div className=\"pb-expiry-date-entry\">\n          <CardExpiryElement\n            id={props.id}\n            data-qa-id={qaId}\n            onChange={props.onChange}\n          />\n        </div>\n      ) : props.type === 'cvc' ? (\n        <div className=\"pb-cvc-entry\">\n          <CardCvcElement\n            id={props.id}\n            data-qa-id={qaId}\n            onChange={props.onChange}\n          />\n        </div>\n      ) : (\n        <div\n          className={`input-box${\n            props.type === 'time'\n              ? ' select'\n              : props.type === 'textarea'\n              ? ' textarea'\n              : props.type === 'toggle'\n              ? 'toggle'\n              : props.type === 'otp'\n              ? ' otp'\n              : ''\n          }`}\n        >\n          {props.startAdornment && (\n            <div className=\"start-adornment\">{props.startAdornment}</div>\n          )}\n          {['time', 'select'].includes(props.type) ? (\n            <CreatableSelect\n              isClearable={isClearable}\n              options={props.type === 'time' ? times : props.options}\n              styles={{\n                container: (provided) => ({\n                  ...provided,\n                  width: '100%',\n                  height: 48,\n                }),\n                control: (provided, {isFocused, isDisabled}) => ({\n                  ...provided,\n                  height: '100%',\n                  paddingLeft: 7,\n                  paddingRight: 7,\n                  fontFamily: 'Brut',\n                  fontWeight: 400,\n                  borderColor: props.error\n                    ? feedbackError\n                    : props.value\n                    ? coin\n                    : silver,\n                  borderWidth: isFocused ? 0 : 1,\n                  backgroundColor: isDisabled ? fog : linen,\n                  color: isDisabled ? coin : charcoal,\n                }),\n                indicatorSeparator: () => ({}),\n                option: (provided) => ({\n                  ...provided,\n                  fontFamily: 'Brut',\n                  fontWeight: 400,\n                }),\n              }}\n              value={\n                props.type === 'time'\n                  ? times.find(({value}) => value === props.value)\n                  : props.options.find((opt) => opt.value === props.value)\n              }\n              placeholder={props.placeholder}\n              components={{\n                DropdownIndicator,\n                SingleValue,\n                Input: (params) => (\n                  <CustomInput {...params} readOnly={props.readonly} />\n                ), // readonly prevents the keyboard from opening\n              }}\n              onChange={(newValue, _) => props.onChange(newValue)}\n              ref={setTimeQAData}\n              menuPlacement=\"auto\"\n              isDisabled={disabled}\n              isSearchable={props.isSearchable}\n              isValidNewOption={props.isValidNewOption}\n              data-qa-id={qaId}\n            />\n          ) : props.type === 'toggle' ? (\n            <label className=\"toggle-container\">\n              <input\n                type=\"checkbox\"\n                checked={props.checked}\n                onChange={props.onChange}\n                id={props.id}\n                disabled={disabled}\n                readOnly={props.readonly}\n              />\n              <span\n                className={`toggle ${disabled ? 'disabled' : ''}`}\n                data-qa-id={qaId}\n                data-checked={props.checked}\n              ></span>\n            </label>\n          ) : props.type === 'textarea' ? (\n            <textarea\n              className={`input-text textarea ${props.value ? ' filled' : ''}${\n                props.error ? ' error' : ''\n              }${props.endAdornment ? ' with-end-adornment' : ''}\n              ${props.startAdornment ? ' with-start-adornment' : ''}`}\n              id={props.id}\n              data-qa-id={qaId}\n              value={props.value}\n              onChange={props.onChange}\n              onFocus={props.onFocus}\n              onBlur={props.onBlur}\n              type={props.type === 'time' ? 'text' : props.type || 'text'}\n              name={props.name}\n              placeholder={props.placeholder}\n              ref={ref}\n              disabled={disabled}\n              maxLength={props.maxLength}\n              autoComplete={props.autoComplete}\n              pattern={props.pattern}\n              autoFocus={props.autoFocus}\n              rows={props.rows}\n              readOnly={props.readonly}\n            />\n          ) : props.type === 'number' ? (\n            <input\n              type=\"number\"\n              className={`input-text${props.value ? ' filled' : ''}${\n                props.error ? ' error' : ''\n              }${props.endAdornment ? ' with-end-adornment' : ''}\n              ${props.startAdornment ? ' with-start-adornment' : ''}`}\n              id={props.id}\n              data-qa-id={qaId}\n              value={props.value}\n              onChange={props.onChange}\n              onFocus={props.onFocus}\n              onBlur={props.onBlur}\n              name={props.name}\n              placeholder={props.placeholder}\n              ref={ref}\n              disabled={disabled}\n              maxLength={props.maxLength}\n              autoComplete={props.autoComplete}\n              pattern={props.pattern}\n              autoFocus={props.autoFocus}\n              onKeyPress={props.onKeyPress}\n              readOnly={props.readonly}\n              aria-label={ariaLabel}\n              min={props.min}\n              max={props.max}\n            />\n          ) : (\n            <input\n              className={`input-text${props.value ? ' filled' : ''}${\n                props.error ? ' error' : ''\n              }${props.endAdornment ? ' with-end-adornment' : ''}\n              ${props.startAdornment ? ' with-start-adornment' : ''}`}\n              id={props.id}\n              data-qa-id={qaId}\n              value={props.value}\n              onChange={props.onChange}\n              onFocus={props.onFocus}\n              onBlur={props.onBlur}\n              type={props.type === 'time' ? 'text' : props.type || 'text'}\n              name={props.name}\n              placeholder={props.placeholder}\n              ref={ref}\n              disabled={disabled}\n              maxLength={props.maxLength}\n              autoComplete={props.autoComplete}\n              pattern={props.pattern}\n              autoFocus={props.autoFocus}\n              onKeyPress={props.onKeyPress}\n              onKeyDown={props.onKeyDown}\n              onPaste={props.onPaste}\n              readOnly={props.readonly}\n              aria-label={ariaLabel}\n            />\n          )}\n          {props.endAdornment && (\n            <div className=\"end-adornment\">{props.endAdornment}</div>\n          )}\n        </div>\n      )}\n      {props.error && typeof props.error === 'string' && (\n        <span\n          className=\"input-error\"\n          data-qa-id={`${qaId || ''}_inputErrorMessage`}\n        >\n          {props.error}\n        </span>\n      )}\n    </div>\n  );\n});\n\nInput.propTypes = {\n  autoComplete: PropTypes.string,\n  autoFocus: PropTypes.bool,\n  checked: PropTypes.bool,\n  'data-qa-id': PropTypes.string.isRequired,\n  disabled: PropTypes.bool,\n  endAdornment: PropTypes.element,\n  error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),\n  getValue: PropTypes.func,\n  id: PropTypes.string,\n  isSearchable: PropTypes.bool,\n  isValidNewOption: PropTypes.func,\n  label: PropTypes.string,\n  name: PropTypes.string,\n  max: PropTypes.number, // max number allowed as value\n  maxLength: PropTypes.number, // max length of characters allowed\n  min: PropTypes.number, // min number allowed as value\n  onBlur: PropTypes.func,\n  onChange: PropTypes.func,\n  onFocus: PropTypes.func,\n  onKeyPress: PropTypes.func,\n  placeholder: PropTypes.string,\n  required: PropTypes.bool,\n  readOnly: PropTypes.bool,\n  readonly: PropTypes.bool,\n  selectProps: PropTypes.object,\n  startAdornment: PropTypes.element,\n  success: PropTypes.bool,\n  times: PropTypes.arrayOf(PropTypes.string),\n  type: PropTypes.oneOf([\n    'tel',\n    'text',\n    'toggle',\n    'email',\n    'password',\n    'number',\n    'time',\n    'credit-card',\n    'cvc',\n    'expiry',\n    'select',\n    'textarea',\n    'otp',\n  ]),\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nexport const Link = ({\n  fullWidth,\n  thickness,\n  variant,\n  as,\n  className,\n  disabled,\n  ...props\n}) => {\n  let buttonClass = '';\n\n  if (as) {\n    buttonClass =\n      as === 'primary'\n        ? 'button primary'\n        : as === 'transparent'\n        ? 'button transparent'\n        : 'button secondary';\n  }\n\n  return (\n    <a\n      className={`${!as ? 'link' : ''} ${variant || 'large'} ${thickness ||\n        ''} ${buttonClass || ''} ${disabled ? 'disabled' : ''} ${\n        fullWidth ? 'wide' : ''\n      } ${className || ''} `}\n      {...props}\n    />\n  );\n};\n\nLink.propTypes = {\n  href: PropTypes.string, // TODO this should be required & onClick removed -- Button with variant 'link' or 'transparent' should be used if not redirecting to a url\n  onClick: PropTypes.func,\n  children: PropTypes.node.isRequired,\n  variant: PropTypes.oneOf(['small', 'large']),\n  fullWidth: PropTypes.bool,\n  thickness: PropTypes.oneOf(['normal', 'thin']),\n  as: PropTypes.oneOf(['primary', 'secondary', 'transparent']), // if it should look like a button (or NOT like a link, if using 'transparent')\n  'data-qa-id': PropTypes.string.isRequired,\n  className: PropTypes.string,\n  target: PropTypes.string,\n  disabled: PropTypes.bool,\n};\n","import React, {useEffect, useRef} from 'react';\nimport PropTypes from 'prop-types';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\n\nexport const Overlay = (props) => {\n  let isOpen = props.open;\n  const overlayRef = useRef(null);\n  const {modalId} = props;\n\n  const handleClose = (e) => {\n    props.onClose ? props.onClose(e) : (isOpen = false);\n  };\n  const escHandler = (e) => {\n    if (props.closeOnEscKeyPress && e.key === 'Escape') {\n      handleClose(e);\n    }\n  };\n\n  const handleOutsideClick = (e) => {\n    if (\n      props.closeOnClickOutside &&\n      overlayRef.current &&\n      !overlayRef.current.contains(e.target)\n    ) {\n      handleClose(e);\n    }\n  };\n\n  useEffect(() => {\n    window.addEventListener('keydown', escHandler);\n    window.addEventListener('mousedown', handleOutsideClick);\n    window.dataLayer.push({event: 'overlayModalImpression'});\n\n    return () => {\n      window.removeEventListener('keydown', escHandler);\n      window.removeEventListener('mousedown', handleOutsideClick);\n    };\n  }, []);\n\n  return (\n    <div\n      className={`overlay${isOpen ? ' open' : ''} ${modalId || ''}`}\n      data-impression-tracking=\"true\"\n    >\n      <div\n        className={`${props.type ? props.type : 'popup'}${\n          props.fullPage ? ' full-page' : ''\n        }`}\n        style={{width: props.popupWidth}}\n        ref={overlayRef}\n      >\n        {props.title && (\n          <div className=\"overlay-title-row\">\n            <Typography variant=\"label1\" size=\"large\">\n              {props.title}\n            </Typography>\n            <Button\n              data-qa-id={props.overlayCloseBtnDataQAId}\n              data-impression-tracking={\n                props.overlayDataImpressionTracking ? 'true' : 'false'\n              }\n              variant=\"transparent\"\n              onClick={props.onClose}\n            >\n              <PB_CloseLine ratio={0.75} />\n            </Button>\n          </div>\n        )}\n        {props.children}\n      </div>\n    </div>\n  );\n};\n\nOverlay.defaultProps = {\n  closeOnClickOutside: true,\n  closeOnEscKeyPress: true,\n  overlayCloseBtnDataQAId: 'overlay-close',\n  overlayDataImpressionTracking: 'false',\n};\n\nOverlay.propTypes = {\n  overlayDataImpressionTracking: PropTypes.string,\n  open: PropTypes.bool.isRequired,\n  fullPage: PropTypes.bool,\n  type: PropTypes.oneOf(['popup', 'drawer']),\n  children: PropTypes.node.isRequired,\n  closeOnClickOutside: PropTypes.bool,\n  closeOnEscKeyPress: PropTypes.bool,\n  popupWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n};\n","import React from 'react';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {PB_Arrow} from '~/common/svg/PB_Arrow';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\n\nexport const PanelHeaderRow = ({\n  title,\n  onClose,\n  qaId,\n  backArrow = false,\n  titleVariant = titleVariant || 'list2',\n}) => {\n  const capitalizedTitle = () => {\n    // todo handle this more elegantly\n    // Removes dashes & capitalizes first letters\n    const headerTitle = title.replace('-', ' ');\n\n    const titleArray = headerTitle.split(' ');\n    for (var i = 0; i < titleArray.length; i++) {\n      titleArray[i] =\n        titleArray[i].charAt(0).toUpperCase() + titleArray[i].slice(1);\n    }\n\n    const splitString = titleArray.join(' ');\n    return splitString.toString();\n  };\n\n  if (backArrow) {\n    return (\n      <div className=\"panel-header-row\">\n        <Button\n          variant=\"transparent\"\n          onClick={() => onClose()}\n          data-qa-id={`${qaId}_back_button`}\n          type=\"button\"\n        >\n          <PB_Arrow direction=\"left\" ratio={0.75} />\n        </Button>\n        <Typography variant={titleVariant} size=\"large\">\n          {capitalizedTitle()}\n        </Typography>\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"panel-header-row\">\n      <Typography variant={titleVariant} size=\"large\">\n        {capitalizedTitle()}\n      </Typography>\n      <Button\n        variant=\"transparent\"\n        onClick={() => onClose()}\n        data-qa-id={`${qaId}_close_button`}\n        type=\"button\"\n      >\n        <PB_CloseLine />\n      </Button>\n    </div>\n  );\n};\n","import React from 'react';\nimport {v4} from 'uuid';\nimport PropTypes from 'prop-types';\nimport {toast} from 'react-toastify';\nimport {Typography} from './Typography';\nimport {PB_CloseLine} from '~/common/svg/PB_CloseLine';\n\nexport const toastAlert = (message, options, inToastButtonConfig = {}) => {\n  const {icon, type, title, className} = options || {};\n  let toastFunc = type ? toast[type] : toast;\n  if (!toastFunc) {\n    console.log('Error - bad type passed to toastAlert');\n    toastFunc = toast;\n  }\n  const toastId = `toast_${v4()}`;\n\n  // This is to disable the default react-toastify icon\n  // and use the icon from props inside the body\n  if (options.icon) {\n    options.icon = '';\n  }\n\n  return toast(\n    <Toast\n      type={type}\n      icon={icon}\n      message={message}\n      className={className}\n      title={title}\n      onDismiss={() => toast.dismiss(toastId)}\n      buttonText={inToastButtonConfig?.text}\n      onButtonClick={inToastButtonConfig?.onClick}\n      id={options.id}\n    />,\n    {\n      ...options,\n      toastId,\n    }\n  );\n};\n\nexport const Toast = (props) => (\n  <div\n    className={`toast ${props.type || ''} ${props.className || ''}`}\n    id={props.id}\n  >\n    {props.icon}\n    {props.title ? (\n      <div className=\"toast__content\">\n        <Typography variant=\"paragraph2\" className=\"toast__title\">\n          {props.title}\n        </Typography>\n        <Typography variant=\"paragraph2\" className=\"toast__message\">\n          {props.message}\n        </Typography>\n      </div>\n    ) : (\n      <Typography variant=\"paragraph2\" className=\"toast__message\">\n        {props.message}\n      </Typography>\n    )}\n    {props.buttonText && (\n      <button onClick={props.onButtonClick}>{props.buttonText}</button>\n    )}\n    <button className=\"unstyled-button\" onClick={props.onDismiss}>\n      <PB_CloseLine ratio={0.75} />\n    </button>\n  </div>\n);\n\nToast.propTypes = {\n  className: PropTypes.string,\n  icon: PropTypes.node,\n  type: PropTypes.oneOf(['success', 'information', 'warning', 'error']),\n  message: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired,\n  title: PropTypes.string,\n  buttonText: PropTypes.string,\n  onButtonClick: PropTypes.func,\n  onDismiss: PropTypes.func,\n};\n","import React from 'react';\nimport styled, {css} from 'styled-components';\nimport PropTypes from 'prop-types';\nimport * as colors from '~sass/pb_styleguide/base/_exports.sass';\n\n//\n//   // If there is already an h1 in the page, let's not duplicate it.\n//   // variants should ONLY be classes used in pb_styleguide/base/typography.sass\n//   // you may add one more class for page-specific margin/positioning.\n//   // TODO make rules in the component that enforces this stuff & helps prevent typos\n//\n//   // <Typography variant=\"header1\" as=\"h2\">\n//   //   This text uses an h2 element but looks like an h1!\n//   // </Typography>\n//\n//   return (\n//     <DynamicComponent tag={props.as} className={`${props.className} ${props.variant} ${props.size}`} {...props}>\n//       {props.children}\n//     </DynamicComponent>\n//   )\n// }\n\nexport const Colors = css`\n  color: ${({fontColor}) => fontColor || colors.mexican_opal};\n`;\n\nconst StyledDynamicComponent = styled.p`\n  ${Colors}\n`;\n\n// const DynamicComponent = ({tag=\"p\", color=$eviteBlue, children, ...props }) => {\n//   const WithComponent = StyledDynamicComponent.withComponent(tag, color);\n//   return <WithComponent color={color} {...props}>{children}</WithComponent>;\n// };\n\nexport const Typography = ({className, ...props}) => {\n  // If there is already an h1 in the page, let's not duplicate it.\n\n  // <Typography variant=\"h1\" as=\"h2\">\n  //   This text uses an <h2> element but looks like an <h1>\n  // </Typography>\n\n  // todo - There seems to be a race condition preventing color\n  // attributes from being respected in some nested components\n  // (unless the same color has already been used\n  // in a Typog element in a parent component)\n\n  return (\n    <StyledDynamicComponent\n      tag={props.as}\n      className={`${props.classNames || ''} ${className || ''} ${\n        props.variant\n      } ${props.size || ''} ${props.inline ? 'inline' : ''}`}\n      fontColor={colors[props.color]}\n      {...props}\n    >\n      {props.children}\n    </StyledDynamicComponent>\n  );\n};\n\nconst typo_mixins_arr = [\n  'header1',\n  'header2',\n  'header3',\n  'header4',\n  'paragraph1',\n  'paragraph2',\n  'paragraph3',\n  'paragraph4',\n  'list1',\n  'list2',\n  'label1',\n  'label2',\n  'label3',\n  'link',\n  'list1',\n  'list2',\n];\n\nTypography.propTypes = {\n  id: PropTypes.string,\n  classNames: PropTypes.string,\n  size: PropTypes.oneOf(['small', 'medium', 'large']),\n  color: PropTypes.oneOf(Object.keys(colors)), // some of the keys here are not colors but good enough...\n  variant: PropTypes.oneOf(typo_mixins_arr).isRequired,\n  children: PropTypes.oneOfType([\n    PropTypes.element,\n    PropTypes.node,\n    PropTypes.string,\n  ]).isRequired,\n  'data-qa-id': PropTypes.string,\n  as: PropTypes.string,\n  inline: PropTypes.bool,\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {largeAndUp} from '~sass/pb_styleguide/base/_exports.sass';\n\nconst LoadingOverlay = (props) => {\n  const {matches: isLarge} = useMatchQuery(`(min-width: ${largeAndUp})`);\n\n  return (\n    <>\n      {props.show && (\n        <div\n          className={\n            props.overlayClassName ? props.overlayClassName : 'loading--overlay'\n          }\n        >\n          <div\n            className={\n              props.className\n                ? `${props.className} ${isLarge ? 'large' : 'small'}`\n                : `button primary ${isLarge ? 'large' : 'small'}`\n            }\n          >\n            <span className=\"evt-spinner inline\" />\n            <p>{props.loadingMessage}</p>\n          </div>\n        </div>\n      )}\n    </>\n  );\n};\n\nLoadingOverlay.propTypes = {\n  overlayClassName: PropTypes.string,\n  className: PropTypes.string,\n  loadingMessage: PropTypes.string.isRequired,\n  show: PropTypes.bool.isRequired,\n};\n\nexport default LoadingOverlay;\n","import React from 'react';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {PanelHeaderRow} from '~/common/_pb_components/atoms/PanelHeaderRow';\n\nexport const SlideoutPanel = (props) => {\n  const {matches: mdWindow} = useMatchQuery('(min-width: 48rem)', []);\n  const {\n    isOpen,\n    onClose,\n    direction = 'right',\n    showHeader = true,\n    title,\n    qaId = 'slideout_panel',\n    modalId,\n    closeQaId,\n    showCover,\n  } = props;\n  const titleVariant = props.titleVariant || 'list2';\n\n  return (\n    <>\n      <button\n        className={`transparent slideout-panel-overlay${\n          showCover ? ' show-cover' : ''\n        }${isOpen ? ' panel-open' : ''}`}\n        onClick={() => onClose()}\n        data-qa-id={closeQaId ? closeQaId : `${modalId}-header`}\n      />\n      <div\n        className={`slideout-panel-content slideout-panel-content${\n          direction ? `--${direction}` : ''\n        }${!mdWindow ? '--mobile' : ''}${isOpen ? ' open' : ''}`}\n      >\n        {showHeader && (\n          <PanelHeaderRow\n            title={title}\n            onClose={onClose}\n            qaId={`${modalId}-header`}\n            backArrow={props.backArrow}\n            titleVariant={titleVariant}\n          />\n        )}\n        {props.children}\n      </div>\n    </>\n  );\n};\n","import React from 'react';\nimport {Footer} from '~/footer/Footer';\n\n/***\n *\n * This wrapper component allows for the Site Footer to be added into specific pages\n * of apps that wouldn't normally include it, such as the Fabric Create Flow's Confirmation page.\n *\n * To show an ad, the app's index.html file needs to include this:\n * <script type=\"text/javascript\">\n *  window.footerAd = {{ render_ad(request, 'ad-mobile-bottom') }};\n * </script>\n *  ***/\n\nexport const InjectableFooter = (showAd = false) => {\n  const adToShow = window.footerAd;\n\n  if (adToShow) {\n    adToShow.setAttribute('padding-bottom', '60px');\n  }\n\n  return (\n    <>\n      <div className=\"footer-wrap old-evite-footer\">\n        <div id=\"footer\" className=\"evt-footer\" role=\"contentinfo\">\n          {showAd && adToShow}\n          <Footer />\n        </div>\n      </div>\n      <div id=\"feedback\"></div>\n    </>\n  );\n};\n","import React from 'react';\nimport {MegaNavAsync} from '~/MegaNav/MegaNavAsync';\n\n/***\n *\n * This wrapper component allows for the MegaNav to be added into specific pages\n * of apps that wouldn't normally include the MegaNav, such as the Fabric Create Flow's Confirmation page.\n *\n * It requires that the app's index.html file include this:\n *  {% include 'nav.html' %}\n *\n *  ***/\n\nexport const InjectableMegaNav = () => {\n  return (\n    <>\n      <header id=\"header\" className=\"fixed site-header\">\n        <MegaNavAsync />\n      </header>\n      <div id=\"fixed-header-spacer\"></div>\n    </>\n  );\n};\n","import React from 'react';\nimport ReactModal from 'react-modal';\n\nconst defaultModalProps = {\n  isOpen: true,\n  className: 'EviteModal__Content-FullPage',\n  overlayClassName: 'EviteModal__Overlay',\n  closeTimeoutMS: 200,\n};\n\nReactModal.setAppElement('#pbModalRoot');\n\nexport const Modal = (props) => {\n  if (!props.onClose) console.warn('Missing required onClose prop for Modal');\n\n  const combinedProps = {\n    ...defaultModalProps,\n    ...props,\n  };\n  return <ReactModal {...combinedProps} />;\n};\n","import React from 'react';\nimport {ResponsiveModal} from '~/common/_pb_components/organisms/ResponsiveModal';\n\nexport const ResetPasswordModal = ({isOpen, setIsOpen, handleClose}) => {\n  return (\n    <ResponsiveModal\n      isOpen={isOpen}\n      title={'PASSWORD RESET REQUIRED'}\n      body={\n        'For your security, please reset your password. Please check your email for instructions'\n      }\n      primaryAction={() => setIsOpen(false)}\n      onClose={(e) => handleClose(e)}\n      modalId=\"pwResetRequired\"\n      primaryText={'Close'}\n      showSecondary={false}\n      className=\"pwResetRequiredModal\"\n    />\n  );\n};\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {Overlay} from '~/common/_pb_components/atoms/Overlay';\nimport {Spinner} from '~/common/components/Loader/Spinner';\n\n// Intended for small, single-action content, returns a popup with overlay\n// in both desktop & mobile.\n// Requires isOpen, onClose, as well as the following:\n\n// Requires either children:\n//    (will render children with X close button in upper right in an otherwise empty modal)\n// OR: all the below\n//  title: (string),\n//  body: (string),\n//  primaryAction: (func called on primary CTA),\n//  modalId: (string identifier for this modal)\n//  primaryText: (string for primary CTA text)\n\nexport const ResponsiveModal = (props) => {\n  const body = props.body || '';\n  const primaryAction = props.primaryAction || props.onClose;\n  const secondaryAction = props.secondaryAction || props.onClose;\n  const primaryText = props.primaryText || 'Submit';\n  const secondaryText = props.secondaryText || 'Cancel';\n  const showSpinner = props.showSpinner || false;\n  const actionText = props.actionText || 'One moment please...';\n  const showSecondary =\n    props.showSecondary !== undefined ? props.showSecondary : true;\n  let modalId;\n\n  let title = showSpinner\n    ? actionText\n    : props.title || `${props.primaryText}?` || 'Are you sure?';\n\n  let children = showSpinner ? <Spinner center={true} /> : props.children;\n\n  const getModalChildren = () => {\n    return (\n      <div className={props.className || null}>\n        <div className=\"responsive-modal-body\">\n          <Typography variant=\"paragraph2\">{body}</Typography>\n        </div>\n        <div className=\"responsive-modal-button-row\">\n          {showSecondary && (\n            <Button\n              variant=\"secondary\"\n              size=\"large\"\n              onClick={secondaryAction}\n              data-qa-id={`${modalId}-cancel`}\n            >\n              {secondaryText}\n            </Button>\n          )}\n          <Button\n            variant=\"primary\"\n            size=\"large\"\n            onClick={primaryAction}\n            data-qa-id={`${modalId}-submit`}\n          >\n            {primaryText}\n          </Button>\n        </div>\n      </div>\n    );\n  };\n\n  if (!children) children = getModalChildren();\n\n  return (\n    <Overlay\n      open={props.isOpen}\n      onClose={(e) => props.onClose(e)}\n      children={children}\n      modalId={`responsive-modal ${modalId ? modalId : ''}`}\n      title={showSpinner ? actionText : title || null}\n      showSpinner={showSpinner}\n    />\n  );\n};\n\nResponsiveModal.propTypes = {\n  isOpen: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  children: PropTypes.any,\n  title: PropTypes.string,\n  body: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),\n  modalId: PropTypes.string,\n  primaryAction: PropTypes.func,\n  primaryText: PropTypes.string,\n};\n","import React, {useEffect} from 'react';\nimport PropTypes from 'prop-types';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {Modal} from '~/common/_pb_components/organisms/Modal';\nimport {SlideoutPanel} from '~/common/_pb_components/molecules/SlideoutPanel';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {Spinner} from '~/common/components/Loader/Spinner';\nimport {PanelHeaderRow} from '~/common/_pb_components/atoms/PanelHeaderRow';\n\n// Intended for more complex modal data, this opens the right-side\n// slideout-panel (used for login/signup) on large screens,\n// and a full-page slide up modal in small screens.\n\n// REQUIRES isOpen, onClose, as well as the following:\n// also REQUIRES either children:\n//    (will render children with X close button in upper right in an otherwise empty modal)\n// OR: ALL the below:\n//  title: (string),\n//  body: (string),\n//  primaryAction: (func called on primary CTA),\n\n// Additional optional props:\n//  primaryText: (string:Submit - text for primary button,\n//  secondaryText: (string:Cancel - text for secondary button)\n//  primaryAction: (func:primaryAction - action for primary button),\n//  secondaryAction: (func:onClose - action for secondary button)\n//  showCover: (bool:False - If true, shows semi-transparent dark overlay when panel is open),\n//  modalId: (string:overlay - identifier for this modal, useful for custom qa-id),\n//  closeQaId: (string:overlay-header_back_button - for qa-ids on close button/X icon)\n\nexport const ResponsivePanel = (props) => {\n  const {matches: mdWindow} = useMatchQuery(`(min-width: 48rem)`);\n  const body = props.body || '';\n  const primaryAction = props.primaryAction || props.onClose;\n  const secondaryAction = props.secondaryAction || props.onClose;\n  const primaryText = props.primaryText || 'Submit';\n  const secondaryText = props.secondaryText || 'Cancel';\n  const showSpinner = props.showSpinner || false;\n  const actionText = props.actionText || 'One moment please...';\n  const {isOpen, showCover = false} = props;\n  const titleVariant = props.titleVariant || 'list2';\n  let modalId = props.modalId || 'overlay';\n\n  let title = showSpinner\n    ? actionText\n    : props.title || `${props.primaryText}?` || 'Are you sure?';\n  let children = showSpinner ? <Spinner center={true} /> : props.children;\n\n  useEffect(() => {\n    if (isOpen) {\n      document.body.classList.add('no-scroll');\n    } else {\n      document.body.classList.remove('no-scroll');\n    }\n    return () => {\n      document.body.classList.remove('no-scroll');\n    };\n  }, [isOpen]);\n\n  const getModalChildren = () => {\n    return (\n      <div className={props.className || null}>\n        <div className=\"responsive-modal-body\">\n          <Typography variant=\"paragraph2\">{body}</Typography>\n        </div>\n        <div className=\"responsive-modal-button-row\">\n          <Button\n            variant=\"secondary\"\n            size=\"large\"\n            onClick={secondaryAction}\n            data-qa-id={`${modalId}-cancel`}\n          >\n            {secondaryText}\n          </Button>\n          <Button\n            variant=\"primary\"\n            size=\"large\"\n            onClick={primaryAction}\n            data-qa-id={`${modalId}-submit`}\n          >\n            {primaryText}\n          </Button>\n        </div>\n      </div>\n    );\n  };\n\n  if (!children)\n    if (mdWindow) {\n      children = getModalChildren();\n    } else {\n      children = (\n        <>\n          <PanelHeaderRow\n            title={title}\n            onClose={props.onClose}\n            qaId={`${modalId}-header`}\n            backArrow={props.backArrow}\n            titleVariant={titleVariant}\n          />\n          {getModalChildren()}\n        </>\n      );\n    }\n\n  if (!mdWindow) {\n    if (props.children) {\n      children = (\n        <>\n          <PanelHeaderRow\n            title={title}\n            onClose={props.onClose}\n            qaId={`${modalId}-header`}\n            backArrow={props.backArrow}\n            titleVariant={titleVariant}\n          />\n          {props.children}\n        </>\n      );\n    }\n    return (\n      <>\n        <Modal\n          isOpen={isOpen}\n          onClose={() => props.onClose()}\n          onClick={() => props.onClose()}\n          children={children}\n          modalId={`responsive-modal ${modalId ? modalId : ''}`}\n        />\n      </>\n    );\n  }\n\n  return (\n    <SlideoutPanel\n      isOpen={isOpen}\n      onClose={() => props.onClose()}\n      closeQaId={`${modalId}-header`}\n      children={children}\n      modalId={`responsive-modal ${modalId ? modalId : ''}`}\n      title={showSpinner ? actionText : title || null}\n      showSpinner={showSpinner}\n      titleVariant={titleVariant}\n      qaId=\"responsive-modal-panel\"\n      backArrow={props.backArrow}\n      showCover={showCover}\n    />\n  );\n};\n\nResponsivePanel.propTypes = {\n  isOpen: PropTypes.bool.isRequired,\n  onClose: PropTypes.func.isRequired,\n  children: PropTypes.any,\n  title: PropTypes.string,\n  body: PropTypes.string,\n  modalId: PropTypes.string,\n  primaryAction: PropTypes.func,\n  primaryText: PropTypes.string,\n};\n","import React from 'react';\nimport {Button} from '~/common/_pb_components/atoms/Button';\nimport {EviteLogo} from '~/common/svg/EviteLogo';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const SimpleNav = ({prev, next}) => {\n  return (\n    <div className=\"simple-nav\">\n      <div className=\"simple-nav__inner\">\n        {prev.onClick && (\n          <Button\n            onClick={prev.onClick}\n            size=\"large\"\n            variant={prev.buttonVariant}\n            data-qa-id={prev.qaId}\n          >\n            {prev.text}\n          </Button>\n        )}\n        <span className=\"simple-nav__logo\">\n          <EviteLogo color={charcoal} />\n        </span>\n        {next.onClick && (\n          <Button\n            onClick={next.onClick}\n            size=\"large\"\n            variant={next.buttonVariant}\n            data-qa-id={next.qaId}\n          >\n            {next.text}\n          </Button>\n        )}\n      </div>\n    </div>\n  );\n};\n","/**\n * Default login time-to-live in milliseconds (7 days)\n */\nconst DEFAULT_LOGIN_TTL_MS = 604800000;\n\n/**\n * Save user data to local storage.\n *\n * @param {Object} user - The user object containing user data.\n * @param {string} user.user_id - The user's ID.\n * @param {string} user.full_name - The user's full name.\n * @param {string} user.subscription_plan_name - The user's subscription plan name.\n * @param {string} user.email - The user's email.\n * @param {string} user.avatar_disk - The user's avatar disk.\n * @param {string} user.image_url - The user's image URL.\n * @param {string} user.initials - The user's initials.\n * @param {string} user.first_name - The user's first name.\n */\nexport const saveUserDataToLocalStorage = (user) => {\n  const userData = {\n    userId: user.user_id || user.userId,\n    userName: user.full_name || user.userName,\n    email: user.email,\n    initials: user.initials,\n    firstName: user.first_name || user.firstName,\n    // assume we save data only when user is authenticated, unless isAuthenticated is explicitly set to false\n    isAuthenticated: user.isAuthenticated !== false,\n    subscriptionPlanName:\n      user.subscription_plan_name || user.subscriptionPlanName,\n    avatarDisk: user.avatar_disk || user.avatarDisk,\n    imgUrl: user.image_url || user.imgUrl,\n  };\n  const userDataObj = {\n    content: userData,\n    timestamp: Date.now(),\n  };\n  window.isAuthenticated = userData.isAuthenticated;\n  localStorage.setItem('userData', JSON.stringify(userDataObj));\n};\n\n/**\n * Load user data from local storage if it hasn't expired.\n *\n * @param {number} [ttl=DEFAULT_LOGIN_TTL_MS] - Time-to-live in milliseconds.\n * @returns {Object|null} - Returns the user data object if it exists and hasn't expired, otherwise null.\n */\nconst loadUserDataFromLocalStorage = (ttl = DEFAULT_LOGIN_TTL_MS) => {\n  const userDataObj = JSON.parse(localStorage.getItem('userData'));\n  if (\n    window.isAuthenticated !== false &&\n    userDataObj &&\n    Date.now() - userDataObj.timestamp < ttl\n  ) {\n    return userDataObj.content;\n  } else if (userDataObj) {\n    // Delete the stored userData if we are not authenticated due to deleting cookies or the data has expired\n    localStorage.removeItem('userData');\n    return null;\n  }\n};\n\n/**\n * Retrieves user data from the global window object.\n * The function tries to fetch several user-related properties from the window object,\n * and it returns a user data object with default values for any missing properties.\n *\n * @returns {Object} userData - Contains user data fetched from the window object.\n */\nconst getUserDataFromWindow = () => {\n  const userData = {\n    userId: window.user_id || '',\n    userName: window.userName || '',\n    email: typeof window.email === 'string' ? window.email : '',\n    initials: window.user_initials || '',\n    firstName: window.firstName || '',\n    isAuthenticated: window.isAuthenticated || false,\n    subscriptionPlanName: window.subscriptionPlanName || '',\n    avatarDisk: window.user_avatar_disk || '',\n    imgUrl: window.user_img_url || '',\n  };\n  return userData;\n};\n\n/**\n * checkIfAdminIsLoggedIn function.\n * This function checks if the current user is an admin and also if they are not the same as the logged in user.\n *\n * The function works with global `window` object properties `isAdmin` and `user_id`.\n *\n * @param {Object} userData - The user data object. This object should contain the user's unique identification (`userId`).\n * @property {string} userData.userId - The user's unique identification.\n *\n * @returns {boolean} If `isAdmin` property on the `window` object is true and `userId` from `userData` is not equal\n * to `user_id` property on `window` object, function will return `true`, otherwise `false`.\n */\nconst checkIfAdminIsLoggedIn = (userData) => {\n  return window.isAdmin ? userData.userId !== window.user_id : false;\n};\n\n/**\n * checkIfUserDataIsValid function.\n * This function checks whether user data should is valid or not. It checks multiple conditions\n * including if the user data exists, is non-empty, if the user is authenticated, has a userId,\n * and if the admin is not logged in.\n *\n * @param {Object} userData - The user data object.\n * @property {boolean} isAuthenticated - Indicates whether the user is authenticated.\n * @property {string} userId - The ID of the user.\n *\n * @returns {boolean} - Returns true if the user data is valid to be saved, false otherwise.\n */\nconst checkIfUserDataIsValid = (userData) => {\n  if (!userData || Object.keys(userData).length === 0) {\n    // userData is undefined or empty, so no need to check further\n    return false;\n  }\n\n  // Now we can be sure userData exists, and we can check the other conditions\n  const isUserAuthenticated = userData.isAuthenticated && userData.userId;\n  // Check if an admin is not logged in. This accounts for cstool view as host case\n  // (localStorage holds the admin user data): we should get the user data from window\n  // variables (host data) and replace userData in localStorage with it\n  const isAdminNotLoggedIn = !checkIfAdminIsLoggedIn(userData);\n\n  return isUserAuthenticated && isAdminNotLoggedIn;\n};\n\n/**\n * Retrieves user data from either local storage or the global window object, depending on data validity.\n * If the user data is valid and retrieved from the window object, it will be saved to local storage.\n * @returns {Object} An object containing the user data properties.\n */\nexport const getUserData = () => {\n  let userData = loadUserDataFromLocalStorage();\n  if (!checkIfUserDataIsValid(userData)) {\n    // Data from localStorage is not good or is not there, let's get it from window\n    userData = getUserDataFromWindow();\n    if (checkIfUserDataIsValid(userData)) {\n      // Data from window looks good, let's persist it in localStorage\n      saveUserDataToLocalStorage(userData);\n    } else {\n      // Still not good, should be anonymous viewing\n    }\n  }\n  return userData;\n};\n","import React, {useEffect, useRef, useState} from 'react';\nimport {useCanvas} from '~/common/canvas/hooks/useCanvas';\nimport {initAligningGuidelines} from './controls/align_lines';\nimport {useOutsideAlerter} from '~/CreateFabricInvitation/routes/EventCreateDesign/hooks/useOutsideAlerter';\n\nconst calcCanvasRation = (cs, canvasWrapper) => {\n  const paddingX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight);\n  const paddingY = parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom);\n\n  const borderX =\n    parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth);\n  const borderY =\n    parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth);\n\n  const width = canvasWrapper.offsetWidth - paddingX - borderX;\n  const height = canvasWrapper.offsetHeight - paddingY - borderY;\n\n  const rationHeight = width * 1.36;\n\n  return rationHeight > height\n    ? {height, width: height * 0.735}\n    : {width, height: rationHeight};\n};\nexport const Canvas = ({\n  configJson,\n  onChange,\n  setCanvas: setCanvasElem,\n  setActiveObjects,\n  onLoad,\n  saveSnapshot,\n  className = '',\n  parentNode = '',\n}) => {\n  const canvasEl = useRef(null);\n  const canvasRef = useRef();\n  const canvasWrapperRef = useRef(null);\n\n  const onClickOutsideCanvas = () => {\n    const canvasInstance = canvasRef.current;\n    if (canvasInstance) {\n      const activeObject = canvasInstance?.getActiveObject();\n      activeObject?.exitEditing?.();\n      canvasInstance?.renderAll();\n    }\n  };\n\n  useOutsideAlerter(canvasWrapperRef, onClickOutsideCanvas);\n\n  const [loading, setLoading] = useState(false);\n\n  const saveCanvas = (canvasInstance) => {\n    setCanvasElem(canvasInstance);\n    canvasRef.current = canvasInstance;\n  };\n\n  const setCurrentDimensions = () => {\n    const canvasSizer = document.getElementById(parentNode);\n\n    const canvas = canvasRef.current;\n    const canvasWrapper = canvasSizer || canvasWrapperRef.current;\n\n    if (canvasWrapper && canvas) {\n      const cs = getComputedStyle(canvasWrapper);\n\n      if (canvasWrapper.offsetWidth > 0 && canvasWrapper.offsetHeight > 0) {\n        const {width, height} = calcCanvasRation(cs, canvasWrapper);\n        const scale = width / canvas.getWidth();\n        const zoom = canvas.getZoom() * scale;\n        canvas.setDimensions({width, height});\n        canvas.setViewportTransform([zoom, 0, 0, zoom, 0, 0]);\n      }\n    }\n  };\n\n  useEffect(() => {\n    const canvasInstance = useCanvas(canvasEl.current, configJson, onLoad);\n    canvasEl.current.fabric = canvasInstance;\n\n    initAligningGuidelines(canvasInstance);\n\n    if (!evite.detects.isMobile) {\n      window.addEventListener('resize', setCurrentDimensions);\n    }\n\n    //used for automatic tests\n    window.canvasElementSelector = (index = 1) => {\n      const objects = canvasInstance.getObjects();\n      canvasInstance.setActiveObject(objects[objects.length - index]);\n      canvasInstance.renderAll();\n      return objects.length;\n    };\n\n    const onChangeHandler = () => {\n      const objectTextFilter = (object) => object.type === 'textbox';\n      if (!loading && !canvasInstance.isEmpty()) {\n        const fabricJson = canvasInstance.toJSON([\n          '_originalObject',\n          'letterCasing',\n          '_originalText',\n        ]);\n        onChange(\n          {...fabricJson},\n          configJson.objects.filter(objectTextFilter).length\n        );\n      }\n    };\n\n    const onSelectionEvent = () => {\n      setActiveObjects(canvasInstance.getActiveObjects());\n    };\n\n    const onDeselectionEvent = () => {\n      setActiveObjects(null);\n    };\n\n    const onObjectMoving = (e) => {\n      const obj = e.target;\n      const canvasWidth = canvasInstance.getWidth() / canvasInstance.getZoom();\n      const canvasHeight =\n        canvasInstance.getHeight() / canvasInstance.getZoom();\n\n      if (obj.height > canvasHeight || obj.width > canvasWidth) {\n        return;\n      }\n      obj.setCoords();\n    };\n\n    canvasInstance.on({\n      'object:modified': onChangeHandler,\n      'object:added': onChangeHandler,\n      'object:removed': onChangeHandler,\n      'selection:updated': onSelectionEvent,\n      'selection:created': onSelectionEvent,\n      'selection:cleared': onDeselectionEvent,\n      'object:moving': onObjectMoving,\n    });\n\n    saveCanvas(canvasInstance);\n\n    setCurrentDimensions();\n\n    return () => {\n      const snapshot = canvasInstance.toDataURL({\n        enableRetinaScaling: true,\n      });\n      saveSnapshot && saveSnapshot(snapshot);\n      canvasInstance.dispose();\n      Raven.setTagsContext({key: 'diposeTime', value: new Date()});\n      window.removeEventListener('resize', setCurrentDimensions);\n    };\n  }, []);\n\n  return (\n    <div ref={canvasWrapperRef} className={className}>\n      <canvas id=\"fabric-canvas\" ref={canvasEl} />\n    </div>\n  );\n};\n","import React, {useEffect, useRef, useState} from 'react';\nimport {initAligningGuidelines} from './controls/align_lines';\nimport fabric from './fabric';\n\nexport const CanvasStickers = ({configJson, onChange, setCanvas, onLoad}) => {\n  const [loading, setLoading] = useState(false);\n  const canvasEl = useRef(null);\n\n  useEffect(() => {\n    const canvasInstance = new fabric.Canvas(canvasEl.current, {\n      width: 0,\n      height: 0,\n      includeDefaultValues: false,\n      selection: !evite.detects.isMobile,\n    });\n\n    canvasInstance.setZoom(0.5);\n\n    initAligningGuidelines(canvasInstance);\n\n    const setCurrentDimensions = () => {\n      const canvasSizer = document.getElementById('canvas__wrapper__stickers');\n\n      if (canvasSizer) {\n        const width = canvasSizer.offsetWidth;\n        const height = canvasSizer.offsetHeight;\n        const scale = width / canvasInstance.getWidth();\n        const zoom = canvasInstance.getZoom() * scale;\n        canvasInstance.setDimensions({width, height});\n        canvasInstance.setViewportTransform([zoom, 0, 0, zoom, 0, 0]);\n      }\n    };\n\n    canvasInstance.setCurrentDimensions = setCurrentDimensions;\n\n    window.addEventListener('resize', setCurrentDimensions, false);\n\n    const onChangeHandler = () => {\n      if (!loading)\n        onChange(\n          canvasInstance.toJSON([\n            'dataUrl',\n            'delay',\n            'frameWidth',\n            'framesLength',\n          ])\n        );\n    };\n\n    canvasInstance.on({\n      'object:modified': onChangeHandler,\n      'object:added': onChangeHandler,\n      'object:removed': onChangeHandler,\n    });\n\n    const loadCanvas = (configJson) => {\n      setLoading(true);\n      const reviver = async (json, obj) => {\n        if (obj.type === 'gif') {\n          fabric.util.requestAnimFrame(function render() {\n            canvasInstance?.renderAll();\n            fabric.util.requestAnimFrame(render);\n          });\n        }\n\n        setLoading(false);\n        onLoad && onLoad();\n        setCurrentDimensions();\n      };\n      canvasInstance.loadFromJSON(configJson, null, reviver);\n    };\n    configJson && loadCanvas(configJson);\n\n    setCanvas(canvasInstance);\n\n    return () => {\n      canvasInstance.dispose();\n      window.removeEventListener('resize', setCurrentDimensions);\n    };\n  }, []);\n\n  return <canvas ref={canvasEl} />;\n};\n","import React from 'react';\nimport {useCanvasImage} from '~/common/canvas/hooks/useCanvasImage';\nimport './Card.sass';\nimport {useMatchQuery} from '~/common/hooks/useMatchQuery';\nimport {useNavigator} from '~/CreateFabricInvitation/routes/EventCreateDesign/components/NavBottom/useNavigator';\nimport {largishAndUp} from '~sass/pb_styleguide/base/_exports.sass';\nimport {Sections} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\nimport {useSelector} from 'react-redux';\n\nexport const Card = ({\n  className = '',\n  fabricArt,\n  imageRef,\n  redirectTo,\n  isFree = false,\n}) => {\n  const {image, loading} = useCanvasImage(fabricArt);\n  const backgroundImage = fabricArt?.backgroundImage ?? {};\n  const {matches: isDesktop} = useMatchQuery(`(min-width: ${largishAndUp})`);\n  const isMobile = !isDesktop;\n\n  const isUyo = useSelector((state) => {\n    const hasKeyword = !!state.coverData?.template?.keywords?.some(\n      (item) => item.toLowerCase() === 'uyo'\n    );\n    const hasTitleUyo = !!state.coverData?.template?.name?.includes('uyo');\n    const hasImgId = !!state.fabricDesign?.uyoImageId;\n\n    return hasKeyword || hasImgId || hasTitleUyo;\n  });\n\n  const navigate = useNavigator({\n    isMobile,\n    disableAutoOpenEditor: redirectTo === Sections.CARD_DESIGN,\n  });\n\n  return (\n    <>\n      {loading && (\n        <span className=\"fabric_user_card-spinner evt-spinner inline\" />\n      )}\n      <img\n        onClick={\n          !loading && redirectTo ? () => navigate(redirectTo) : undefined\n        }\n        src={image}\n        className={`fabric_user_card ${\n          redirectTo ? 'fabric_user_card--clickable' : ''\n        } ${className}\n          ${\n            redirectTo && loading\n              ? 'envelope_image__wrapper--clickable--disabled'\n              : ''\n          }\n          `}\n        style={{\n          backgroundImage:\n            (isUyo && window.location.href.indexOf('/customize/') > -1) ||\n            (!isUyo &&\n              `url(${backgroundImage?.src ||\n                backgroundImage?.originalUrl ||\n                ''})`),\n          height: isMobile && isFree && 'calc(512px - 2rem)',\n          width: isMobile && isFree && 'auto',\n          backgroundSize: '100% 100%',\n          backgroundRepeat: 'no-repeat',\n        }}\n        ref={imageRef}\n      />\n    </>\n  );\n};\n","import {fabric} from 'fabric';\nimport {gifToSprite} from './GifToSprite';\n\nconst generateImage = ({\n  dataUrl,\n  delay,\n  frameWidth,\n  framesLength,\n  imgOptions,\n}) => {\n  const [PLAY, PAUSE, STOP] = [0, 1, 2];\n\n  return new Promise((resolve) => {\n    fabric.Gif.fromURL(\n      dataUrl,\n      (img) => {\n        const sprite = img.getElement();\n        let framesIndex = 0;\n        let start = performance.now();\n        let status = PLAY;\n\n        img.width = frameWidth;\n        img.height = sprite.naturalHeight;\n        img.mode = 'image';\n        img.top = 0;\n        img.left = 0;\n        img.delay = delay;\n        img.frameWidth = frameWidth;\n        img.framesLength = framesLength;\n\n        img._render = function(ctx) {\n          if (status === PAUSE || (status === STOP && framesIndex === 0))\n            return;\n          const now = performance.now();\n          const delta = now - start;\n          if (delta > delay) {\n            start = now;\n            framesIndex++;\n          }\n          if (framesIndex === framesLength || status === STOP) framesIndex = 0;\n          ctx.drawImage(\n            sprite,\n            frameWidth * framesIndex,\n            0,\n            frameWidth,\n            sprite.height,\n            -this.width / 2,\n            -this.height / 2,\n            frameWidth,\n            sprite.height\n          );\n        };\n        img.play = function() {\n          status = PLAY;\n          this.dirty = true;\n        };\n        img.pause = function() {\n          status = PAUSE;\n          this.dirty = false;\n        };\n        img.stop = function() {\n          status = STOP;\n          this.dirty = false;\n        };\n        img.getStatus = () => ['Playing', 'Paused', 'Stopped'][status];\n\n        img.play();\n        resolve(img);\n      },\n      imgOptions\n    );\n  });\n};\n\nexport const fabricGif = async (\n  gif,\n  imgOptions,\n  maxWidth,\n  maxHeight,\n  maxDuration\n) => {\n  const {dataUrl, delay, frameWidth, framesLength} = await gifToSprite(\n    gif,\n    maxWidth,\n    maxHeight,\n    maxDuration\n  );\n\n  return generateImage({dataUrl, delay, frameWidth, framesLength, imgOptions});\n};\n\nexport const fabricGifFromBase64 = async (\n  dataUrl,\n  delay,\n  frameWidth,\n  framesLength,\n  imgOptions\n) => {\n  return generateImage({dataUrl, delay, frameWidth, framesLength, imgOptions});\n};\n","import {decompressFrames, parseGIF} from 'gifuct-js';\n\nexport const gifToSprite = async (gif, maxWidth, maxHeight, maxDuration) => {\n  let arrayBuffer;\n  let error;\n  let frames;\n\n  // if the gif is an input file, get the arrayBuffer with FileReader\n  if (gif.type) {\n    const reader = new FileReader();\n    try {\n      arrayBuffer = await new Promise((resolve, reject) => {\n        reader.onload = () => resolve(reader.result);\n        reader.onerror = () => reject(reader.error);\n        reader.readAsArrayBuffer(gif);\n      });\n    } catch (err) {\n      error = err;\n    }\n  } else {\n    try {\n      arrayBuffer = await fetch(gif).then((resp) => resp.arrayBuffer());\n    } catch (err) {\n      error = err;\n    }\n  }\n\n  // Parse and decompress the gif arrayBuffer to frames with the \"gifuct-js\" library\n  if (!error) frames = decompressFrames(parseGIF(arrayBuffer), true);\n  if (!error && (!frames || !frames.length)) error = 'No_frame_error';\n  if (error) {\n    console.error(error);\n    return {error};\n  }\n\n  const dataCanvas = document.createElement('canvas');\n  const dataCtx = dataCanvas.getContext('2d');\n  const frameCanvas = document.createElement('canvas');\n  const frameCtx = frameCanvas.getContext('2d');\n  const spriteCanvas = document.createElement('canvas');\n  const spriteCtx = spriteCanvas.getContext('2d');\n\n  let [width, height, delay] = [\n    frames[0].dims.width,\n    frames[0].dims.height,\n    frames.reduce((acc, cur) => (acc = !acc ? cur.delay : acc), 0),\n  ];\n\n  const duration = frames.length * delay;\n  maxDuration = maxDuration || duration;\n  if (duration > maxDuration) frames.splice(Math.ceil(maxDuration / delay));\n\n  maxWidth = maxWidth || width;\n  maxHeight = maxHeight || height;\n  const scale = Math.min(maxWidth / width, maxHeight / height);\n  width = width * scale;\n  height = height * scale;\n\n  frameCanvas.width = width;\n  frameCanvas.height = height;\n  spriteCanvas.width = width * frames.length;\n  spriteCanvas.height = height;\n\n  frames.forEach((frame, i) => {\n    const frameImageData = dataCtx.createImageData(\n      frame.dims.width,\n      frame.dims.height\n    );\n    frameImageData.data.set(frame.patch);\n    dataCanvas.width = frame.dims.width;\n    dataCanvas.height = frame.dims.height;\n    dataCtx.putImageData(frameImageData, 0, 0);\n\n    if (frame.disposalType === 2) frameCtx.clearRect(0, 0, width, height);\n    frameCtx.drawImage(\n      dataCanvas,\n      frame.dims.left * scale,\n      frame.dims.top * scale,\n      frame.dims.width * scale,\n      frame.dims.height * scale\n    );\n\n    spriteCtx.drawImage(frameCanvas, width * i, 0);\n  });\n\n  const dataUrl = spriteCanvas.toDataURL();\n\n  dataCanvas.remove();\n  frameCanvas.remove();\n  spriteCanvas.remove();\n\n  return {\n    dataUrl,\n    frameWidth: width,\n    framesLength: frames.length,\n    delay,\n  };\n};\n","import {fabric} from 'fabric';\n\n/**\n * Should objects be aligned by a bounding box?\n * [Bug] Scaled objects sometimes can not be aligned by edges\n *\n */\nexport function initAligningGuidelines(canvas) {\n  let ctx = canvas.getSelectionContext(),\n    aligningLineOffset = 5,\n    aligningLineMargin = 4,\n    aligningLineWidth = 1,\n    aligningLineColor = 'rgb(255, 0, 0)',\n    viewportTransform = canvas.viewportTransform,\n    zoom = 1;\n\n  function drawVerticalLine(coords) {\n    drawLine(\n      coords.x1 + 0.5,\n      coords.y1 > coords.y2 ? coords.y2 : coords.y1,\n      coords.x1 + 0.5,\n      coords.y2 > coords.y1 ? coords.y2 : coords.y1\n    );\n  }\n\n  function drawHorizontalLine(coords) {\n    drawLine(\n      coords.x1 > coords.x2 ? coords.x2 : coords.x1,\n      coords.y1 + 0.5,\n      coords.x2 > coords.x1 ? coords.x2 : coords.x1,\n      coords.y1 + 0.5\n    );\n  }\n\n  function drawLine(x1, y1, x2, y2) {\n    ctx.save();\n    ctx.lineWidth = aligningLineWidth;\n    ctx.strokeStyle = aligningLineColor;\n    ctx.beginPath();\n    if (viewportTransform) {\n      ctx.moveTo(\n        (x1 + viewportTransform[4]) * zoom,\n        (y1 + viewportTransform[5]) * zoom\n      );\n      ctx.lineTo(\n        (x2 + viewportTransform[4]) * zoom,\n        (y2 + viewportTransform[5]) * zoom\n      );\n    }\n    ctx.stroke();\n    ctx.restore();\n  }\n\n  function isInRange(value1, value2) {\n    value1 = Math.round(value1);\n    value2 = Math.round(value2);\n    for (\n      let i = value1 - aligningLineMargin, len = value1 + aligningLineMargin;\n      i <= len;\n      i++\n    ) {\n      if (i === value2) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  let verticalLines = [],\n    horizontalLines = [];\n\n  canvas.on('mouse:down', function() {\n    viewportTransform = canvas.viewportTransform;\n    zoom = canvas.getZoom();\n  });\n\n  canvas.on('object:moving', function(e) {\n    let activeObject = e.target;\n    if (!activeObject || !viewportTransform) return;\n\n    let canvasObjects = canvas.getObjects();\n    let activeObjectCenter = activeObject.getCenterPoint(),\n      activeObjectLeft = activeObjectCenter.x,\n      activeObjectTop = activeObjectCenter.y,\n      activeObjectBoundingRect = activeObject.getBoundingRect(),\n      activeObjectHeight =\n        activeObjectBoundingRect.height / viewportTransform[3],\n      activeObjectWidth = activeObjectBoundingRect.width / viewportTransform[0],\n      horizontalInTheRange = false,\n      verticalInTheRange = false,\n      transform = canvas.viewportTransform;\n\n    if (!transform) return;\n\n    // It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions,\n    // but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move\n\n    for (let i = canvasObjects.length; i--; ) {\n      if (canvasObjects[i] === activeObject) continue;\n\n      let objectCenter = canvasObjects[i].getCenterPoint(),\n        objectLeft = objectCenter.x,\n        objectTop = objectCenter.y,\n        objectBoundingRect = canvasObjects[i].getBoundingRect(),\n        objectHeight = objectBoundingRect.height / viewportTransform[3],\n        objectWidth = objectBoundingRect.width / viewportTransform[0];\n\n      // snap by the horizontal center line\n      if (isInRange(objectLeft, activeObjectLeft)) {\n        verticalInTheRange = true;\n        verticalLines.push({\n          x1: objectLeft,\n          y1:\n            objectTop < activeObjectTop\n              ? objectTop - objectHeight / 2 - aligningLineOffset\n              : objectTop + objectHeight / 2 + aligningLineOffset,\n          y2:\n            activeObjectTop > objectTop\n              ? activeObjectTop + activeObjectHeight / 2 + aligningLineOffset\n              : activeObjectTop - activeObjectHeight / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(objectLeft, activeObjectTop),\n          'center',\n          'center'\n        );\n      }\n\n      // snap by the left edge\n      if (\n        isInRange(\n          objectLeft - objectWidth / 2,\n          activeObjectLeft - activeObjectWidth / 2\n        )\n      ) {\n        verticalInTheRange = true;\n        verticalLines.push({\n          x1: objectLeft - objectWidth / 2,\n          y1:\n            objectTop < activeObjectTop\n              ? objectTop - objectHeight / 2 - aligningLineOffset\n              : objectTop + objectHeight / 2 + aligningLineOffset,\n          y2:\n            activeObjectTop > objectTop\n              ? activeObjectTop + activeObjectHeight / 2 + aligningLineOffset\n              : activeObjectTop - activeObjectHeight / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(\n            objectLeft - objectWidth / 2 + activeObjectWidth / 2,\n            activeObjectTop\n          ),\n          'center',\n          'center'\n        );\n      }\n\n      // snap by the right edge\n      if (\n        isInRange(\n          objectLeft + objectWidth / 2,\n          activeObjectLeft + activeObjectWidth / 2\n        )\n      ) {\n        verticalInTheRange = true;\n        verticalLines.push({\n          x1: objectLeft + objectWidth / 2,\n          y1:\n            objectTop < activeObjectTop\n              ? objectTop - objectHeight / 2 - aligningLineOffset\n              : objectTop + objectHeight / 2 + aligningLineOffset,\n          y2:\n            activeObjectTop > objectTop\n              ? activeObjectTop + activeObjectHeight / 2 + aligningLineOffset\n              : activeObjectTop - activeObjectHeight / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(\n            objectLeft + objectWidth / 2 - activeObjectWidth / 2,\n            activeObjectTop\n          ),\n          'center',\n          'center'\n        );\n      }\n\n      // snap by the vertical center line\n      if (isInRange(objectTop, activeObjectTop)) {\n        horizontalInTheRange = true;\n        horizontalLines.push({\n          y1: objectTop,\n          x1:\n            objectLeft < activeObjectLeft\n              ? objectLeft - objectWidth / 2 - aligningLineOffset\n              : objectLeft + objectWidth / 2 + aligningLineOffset,\n          x2:\n            activeObjectLeft > objectLeft\n              ? activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset\n              : activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(activeObjectLeft, objectTop),\n          'center',\n          'center'\n        );\n      }\n\n      // snap by the top edge\n      if (\n        isInRange(\n          objectTop - objectHeight / 2,\n          activeObjectTop - activeObjectHeight / 2\n        )\n      ) {\n        horizontalInTheRange = true;\n        horizontalLines.push({\n          y1: objectTop - objectHeight / 2,\n          x1:\n            objectLeft < activeObjectLeft\n              ? objectLeft - objectWidth / 2 - aligningLineOffset\n              : objectLeft + objectWidth / 2 + aligningLineOffset,\n          x2:\n            activeObjectLeft > objectLeft\n              ? activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset\n              : activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(\n            activeObjectLeft,\n            objectTop - objectHeight / 2 + activeObjectHeight / 2\n          ),\n          'center',\n          'center'\n        );\n      }\n\n      // snap by the bottom edge\n      if (\n        isInRange(\n          objectTop + objectHeight / 2,\n          activeObjectTop + activeObjectHeight / 2\n        )\n      ) {\n        horizontalInTheRange = true;\n        horizontalLines.push({\n          y1: objectTop + objectHeight / 2,\n          x1:\n            objectLeft < activeObjectLeft\n              ? objectLeft - objectWidth / 2 - aligningLineOffset\n              : objectLeft + objectWidth / 2 + aligningLineOffset,\n          x2:\n            activeObjectLeft > objectLeft\n              ? activeObjectLeft + activeObjectWidth / 2 + aligningLineOffset\n              : activeObjectLeft - activeObjectWidth / 2 - aligningLineOffset,\n        });\n        activeObject.setPositionByOrigin(\n          new fabric.Point(\n            activeObjectLeft,\n            objectTop + objectHeight / 2 - activeObjectHeight / 2\n          ),\n          'center',\n          'center'\n        );\n      }\n    }\n\n    if (!horizontalInTheRange) {\n      horizontalLines.length = 0;\n    }\n\n    if (!verticalInTheRange) {\n      verticalLines.length = 0;\n    }\n  });\n\n  canvas.on('before:render', function() {\n    canvas.clearContext(ctx);\n  });\n\n  canvas.on('after:render', function() {\n    for (let i = verticalLines.length; i--; ) {\n      drawVerticalLine(verticalLines[i]);\n    }\n    for (let i = horizontalLines.length; i--; ) {\n      drawHorizontalLine(horizontalLines[i]);\n    }\n\n    verticalLines.length = horizontalLines.length = 0;\n  });\n\n  canvas.on('mouse:up', function() {\n    verticalLines.length = horizontalLines.length = 0;\n    canvas.renderAll();\n  });\n}\n","import {renderIcon} from '~/common/canvas/renderIcon';\nimport PB_Duplicate from '~/common/svg/icons/PB_Duplicate.svg';\nimport {PB_AlertLine} from '~/common/svg/PB_AlertLine';\nimport {toastAlert} from '~/common/_pb_components/atoms/Toast';\nimport React from 'react';\n\nexport const cloneControl = () => {\n  const cloneObject = (eventData, transform) => {\n    const target = transform.target;\n    const canvas = target.canvas;\n    const textsQty = canvas.getObjects().filter((obj) => obj.type === 'textbox')\n      .length;\n    if (textsQty < 8) {\n      target.clone(function(cloned) {\n        canvas.add(\n          cloned.set({\n            left: target.left + 50,\n            top: target.top + 50,\n            letterCasing: target?.letterCasing,\n            _originalObject: JSON.parse(JSON.stringify(target)),\n          })\n        );\n        canvas.setActiveObject(cloned);\n      });\n    } else {\n      toastAlert('Maximum number of text boxes has been reached', {\n        type: 'error',\n        icon: <PB_AlertLine ratio={0.65} />,\n        position: 'top-right',\n        autoClose: 5000,\n        hideProgressBar: true,\n        closeOnClick: true,\n        pauseOnHover: true,\n        draggable: true,\n        progress: undefined,\n      });\n    }\n  };\n\n  const padding = 9;\n\n  return new fabric.Control({\n    x: 0,\n    y: -0.5,\n    offsetX: 22,\n    offsetY: -16 - padding,\n    cursorStyle: 'pointer',\n    mouseUpHandler: cloneObject,\n    render: renderIcon({icon: PB_Duplicate, padding}),\n    cornerSize: 16,\n    touchSizeX: 32,\n    touchSizeY: 32,\n    sizeX: 30,\n    sizeY: 30,\n  });\n};\n","import React from 'react';\nimport {PB_AlertLine} from '~/common/svg/PB_AlertLine';\nimport {renderIcon} from '~/common/canvas/renderIcon';\nimport PB_Delete from '~/common/svg/icons/PB_Delete.svg';\nimport {toastAlert} from '~/common/_pb_components/atoms/Toast';\n\nexport const removeControl = ({offsetX} = {}) => {\n  const removeObject = (eventData, obj) => {\n    const canvas = obj.target.canvas;\n    const allObjects = canvas.getObjects();\n    const allActiveObjects = canvas.getActiveObjects();\n\n    const filterTextBoxes = (arr = []) =>\n      arr?.filter((obj) => obj?.type === 'textbox');\n\n    const containPicture = allActiveObjects?.some(\n      (obj) => obj.type !== 'textbox'\n    );\n    const texts = filterTextBoxes(allObjects);\n    const textObjectsToBeRemoved = filterTextBoxes(allActiveObjects);\n\n    if (containPicture || texts.length - textObjectsToBeRemoved.length >= 1) {\n      allActiveObjects?.map((textObj) => canvas.remove(textObj));\n      canvas.discardActiveObject().renderAll();\n    } else {\n      toastAlert('Must have at least 1 text box', {\n        type: 'error',\n        icon: <PB_AlertLine ratio={0.65} />,\n        position: 'top-right',\n        autoClose: 5000,\n        hideProgressBar: true,\n        closeOnClick: true,\n        pauseOnHover: true,\n        draggable: true,\n        progress: undefined,\n      });\n    }\n  };\n\n  const padding = 9;\n\n  return new fabric.Control({\n    x: 0,\n    y: -0.5,\n    offsetX: offsetX ?? -22,\n    offsetY: -16 - padding,\n    cursorStyle: 'pointer',\n    mouseUpHandler: removeObject,\n    render: renderIcon({icon: PB_Delete, padding}),\n    cornerSize: 16,\n    touchSizeX: 32,\n    touchSizeY: 32,\n    sizeX: 30,\n    sizeY: 30,\n  });\n};\n","import {renderIcon} from '~/common/canvas/renderIcon';\nimport PB_Rotation from '~/common/svg/icons/PB_Rotation.svg';\n\nexport const rotationControl = () => {\n  return new fabric.Control({\n    x: 0,\n    y: 0.5,\n    offsetX: 0,\n    offsetY: 20,\n    cornerSize: 12,\n    touchSizeX: 24,\n    touchSizeY: 24,\n    withConnection: false,\n    actionName: 'rotate',\n    cursorStyle: 'pointer',\n    render: renderIcon({icon: PB_Rotation, padding: 4}),\n    actionHandler: fabric.controlsUtils.rotationWithSnapping,\n  });\n};\n","import {fabric} from 'fabric';\n\nfabric.util.object.extend(fabric.Textbox, {\n  fromObject: async function(object, callback) {\n    const styles = fabric.util.stylesFromArray(object.styles, object.text);\n    const objCopy = Object.assign({}, object, {styles: styles});\n\n    try {\n      const promises = Array.from(document.fonts.values())\n        .filter(({family}) => family === object.fontFamily)\n        .map((font) => font.load());\n      await Promise.allSettled(promises);\n    } catch (error) {\n      console.log(\n        `${object.fontFamily} Error loading font: ${error}. Ignoring and moving on...`\n      );\n    } finally {\n      return fabric.Object._fromObject('Textbox', objCopy, callback, 'text');\n    }\n  },\n});\n","import {fabric} from 'fabric';\nimport {fabricGif} from '~/common/canvas/animation/gif/Gif';\n\nfabric.Gif = fabric.util.createClass(fabric.Image, {\n  type: 'gif',\n  originalUrl: '',\n  initialize: function(options, extra) {\n    options || (options = {});\n    this.callSuper('initialize', options, extra);\n  },\n\n  toObject: function(propertiesToInclude) {\n    const {src, ...object} = this.callSuper(\n      'toObject',\n      ['originalUrl'].concat(propertiesToInclude)\n    );\n    return object;\n  },\n});\n\nfabric.Gif.fromURL = (url, callback, imgOptions) => {\n  fabric.util.loadImage(url, function(img, isError) {\n    callback && callback(new fabric.Gif(img, imgOptions), isError);\n  });\n};\n\nfabric.Gif.fromObject = (object, callback) => {\n  return fabricGif(\n    object.originalUrl,\n    {originalUrl: object.originalUrl},\n    object.frameWidth\n  ).then((gif) => {\n    gif.set({...object});\n    callback(gif, false);\n  });\n};\n","export * from './letter_casing';\nexport * from './gif';\nexport * from './fonts';\nexport * from './uyo_image';\n","import {fabric} from 'fabric';\n\nconst capitalize = (text) => {\n  const words = text.split(' ');\n  return words\n    .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n    .join(' ');\n};\n\nexport const letterCasing = {\n  capitalize,\n  upper: (text) => text.toUpperCase(),\n  lower: (text) => text.toLowerCase(),\n};\n\nconst letterCasingHandler = (operation, text) => {\n  return operation ? letterCasing[operation](text) : text;\n};\n\nfabric.util.object.extend(fabric.Textbox.prototype, {\n  enterEditing: function() {\n    if (this.hiddenTextarea) {\n      this.text = this.hiddenTextarea.value;\n    } else {\n      this.text = this._originalText ?? this.text;\n    }\n    this.callSuper('enterEditing');\n  },\n  exitEditing: function() {\n    this._originalText = this.text;\n    this.text = letterCasingHandler(this.letterCasing, this.text);\n    this.callSuper('exitEditing');\n  },\n});\n","import {fabric} from 'fabric';\n\nfabric.UYOImage = fabric.util.createClass(fabric.Image, {\n  type: 'uYOImage',\n  isError: false,\n});\n\nconst loadImage = (url, callback, options) => {\n  fabric.util.loadImage(\n    url,\n    function(img, isError) {\n      const uyoImage = new fabric.UYOImage(img, {...options, isError});\n      callback && callback(uyoImage);\n    },\n    null,\n    'anonymous'\n  );\n};\n\nfabric.UYOImage.fromURL = loadImage;\n\nfabric.UYOImage.fromObject = (object, callback) => {\n  return loadImage(object.src, callback, object);\n};\n","import {fabric} from 'fabric';\nimport {removeControl} from '~/common/canvas/controls/remove';\nimport {cloneControl} from '~/common/canvas/controls/clone';\nimport {rotationControl} from '~/common/canvas/controls/rotation';\nimport * as colors from '~sass/pb_styleguide/base/_exports.sass';\nimport './Canvas.sass';\nimport './customs';\n\nfabric.Object.prototype.setControlsVisibility({\n  tl: true, //top-left\n  mt: false, // middle-top\n  tr: true, //top-right\n  ml: true, //middle-left\n  mr: true, //middle-right\n  bl: true, // bottom-left\n  mb: false, //middle-bottom\n  br: true, //bottom-right\n  mtr: true, // rotate icon\n});\n\nfabric.Textbox.prototype.set({\n  hoverCursor: 'pointer',\n  moveCursor: 'default',\n  touchCornerSize: 40,\n  editingBorderColor: colors.tanzanite,\n});\n\nfabric.Image.prototype.set({\n  hoverCursor: 'pointer',\n  moveCursor: 'default',\n  touchCornerSize: 40,\n  editingBorderColor: colors.tanzanite,\n});\n\nfabric.Object.prototype.controls.tl.offsetX = -1;\nfabric.Object.prototype.controls.tl.offsetY = -1;\nfabric.Object.prototype.controls.tr.offsetX = 1;\nfabric.Object.prototype.controls.tr.offsetY = -1;\nfabric.Object.prototype.controls.bl.offsetX = -1;\nfabric.Object.prototype.controls.bl.offsetY = 1;\nfabric.Object.prototype.controls.br.offsetX = 1;\nfabric.Object.prototype.controls.br.offsetY = 1;\n\nfabric.Textbox.prototype.controls.mtr = rotationControl();\nfabric.Textbox.prototype.controls.remove = removeControl();\nfabric.Textbox.prototype.controls.clone = cloneControl();\n\nfabric.Image.prototype.controls.mtr = rotationControl();\nfabric.Image.prototype.controls.remove = removeControl({offsetX: 0});\n\nfabric.Object.prototype.set({\n  cornerSize: 9,\n  borderColor: colors.tanzanite,\n  transparentCorners: false,\n  cornerStrokeColor: colors.tanzanite,\n  cornerColor: colors.white,\n});\n\nconst _renderBackgroundOrOverlay =\n  fabric.StaticCanvas.prototype._renderBackgroundOrOverlay;\n\nfabric.StaticCanvas.prototype._renderBackgroundOrOverlay = function(\n  ctx,\n  property\n) {\n  if (property !== 'background') {\n    return _renderBackgroundOrOverlay.call(this, ctx, property);\n  }\n\n  if (this.backgroundImage) {\n    const {originalUrl, _originalElement} = this.backgroundImage;\n\n    ctx.canvas.style.backgroundImage = `url(${originalUrl ||\n      _originalElement.src})`;\n    ctx.canvas.style.backgroundSize = '100%';\n    ctx.canvas.style.backgroundRepeat = 'no-repeat';\n  }\n};\n\nexport default fabric;\n","import fabric from '~/common/canvas/fabric';\nimport {\n  DEFAULT_CARD_ZOOM,\n  DEFAULT_HEIGHT_DESKTOP,\n  DEFAULT_WIDTH_DESKTOP,\n} from '~/CreateFabricInvitation/routes/EventCreateDesign/constants';\n\nexport const useCanvas = (canvasEl, configJson, callback) => {\n  const canvasInstance = new fabric.Canvas(canvasEl, {\n    width: DEFAULT_WIDTH_DESKTOP,\n    height: DEFAULT_HEIGHT_DESKTOP,\n    includeDefaultValues: false,\n    preserveObjectStacking: true,\n    selection: !evite.detects.isMobile,\n  });\n\n  canvasInstance.setZoom(DEFAULT_CARD_ZOOM);\n\n  const loadCanvas = (configJson) => {\n    configJson?.objects?.forEach((obj) => {\n      if (['image', 'uYOImage'].indexOf(obj.type) > -1) {\n        obj.crossOrigin = 'anonymous';\n      }\n    });\n\n    const reviver = (json, obj) => {\n      obj._originalObject = JSON.parse(JSON.stringify(obj));\n      obj.selectable = obj.type === 'textbox';\n    };\n    canvasInstance.loadFromJSON(configJson, callback, reviver);\n  };\n\n  configJson && loadCanvas(configJson);\n\n  return canvasInstance;\n};\n","import {useEffect, useMemo, useState} from 'react';\nimport {useCanvas} from '~/common/canvas/hooks/useCanvas';\n\nexport const useCanvasImage = (fabricArt) => {\n  const [image, setImage] = useState();\n  const [loaded, setLoaded] = useState(!fabricArt);\n\n  const canvas = useMemo(\n    () =>\n      useCanvas(null, fabricArt, () => {\n        setLoaded(true);\n        const snapshot = canvas.toDataURL({\n          enableRetinaScaling: true,\n        });\n        setImage(snapshot);\n      }),\n    [fabricArt]\n  );\n\n  useEffect(() => {\n    return () => {\n      canvas.setDimensions({width: 1, height: 1});\n      canvas.clear();\n      canvas.dispose();\n    };\n  }, []);\n\n  return {image, loading: !loaded};\n};\n","import {fabric} from 'fabric';\nimport {silver, cloud} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport function renderIcon({icon, fillStyle = silver, padding = 2}) {\n  const img = document.createElement('img');\n  img.src = icon;\n  return function renderIcon(ctx, left, top, styleOverride, fabricObject) {\n    const size = this.cornerSize;\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.arc(left, top, size / 2 + padding, 0, 2 * Math.PI, false);\n    ctx.fillStyle = fillStyle;\n    ctx.fill();\n    ctx.strokeStyle = cloud;\n    ctx.lineWidth = 1;\n    ctx.stroke();\n    ctx.restore();\n\n    ctx.save();\n    ctx.translate(left, top);\n    ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle));\n    ctx.drawImage(img, -size / 2, -size / 2, size, size);\n    ctx.restore();\n  };\n}\n","export const Spinner = (props) => {\n  return (\n    <div style={{margin: props.center ? 'auto' : 0}} className=\"evt-spinner\" />\n  );\n};\n","import * as constants from './constants';\n\nexport const showLoginModal = () => {\n  return {\n    type: constants.SHOW_LOGIN_MODAL,\n  };\n};\n\nexport const hideLoginModal = () => {\n  return {\n    type: constants.HIDE_LOGIN_MODAL,\n  };\n};\n\nexport const userLoggedIn = (\n  userId,\n  userName,\n  subscriptionPlanName,\n  email,\n  avatarDisk,\n  imgUrl,\n  initials,\n  firstName\n) => {\n  return {\n    type: constants.USER_LOGGED_IN,\n    userId,\n    userName,\n    subscriptionPlanName,\n    email,\n    avatarDisk,\n    imgUrl,\n    initials,\n    firstName,\n  };\n};\n","export const SHOW_LOGIN_MODAL = 'evite/*/LOGIN_MODAL/SHOW';\nexport const HIDE_LOGIN_MODAL = 'evite/*/LOGIN_MODAL/HIDE';\nexport const USER_LOGGED_IN = 'evite/*/LOGIN_MODAL/USER_LOGGED_IN';\n","export * from './constants.js';\nexport * from './reducer.js';\nexport * from './actions.js';\n","import * as constants from './constants';\n\nlet initialState = {\n  showLoginModal: false,\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case constants.USER_LOGGED_IN:\n    case constants.HIDE_LOGIN_MODAL: {\n      return {\n        showLoginModal: false,\n      };\n    }\n    case constants.SHOW_LOGIN_MODAL: {\n      return {\n        showLoginModal: true,\n      };\n    }\n    default: {\n      return state;\n    }\n  }\n};\n","// Should align with BE's core/events/constants.py so we maintain a complete list\n\nexport const ORIGIN_DICT = {\n  AG: 3, // American Greeting\n  CEC: 4, // Chuck E. Cheese\n  CMM: 5,\n  AOLMAIL: 6,\n  VISAFT: 7,\n  YMAIL: 8,\n  EVT: 10, // Old/original evite.com java site\n  NEO: 11, // Current core site\n  EVITE: 11, // Current core site\n  SPD: 11, // Failed evite rewrite 'spd' aka 'speed'\n  IOS: 12, // iPhone Core App\n  POSTMARK: 13, // Legacy premium\n  // Plans / Evite Me / Evite Go / New Mobile App\n  // NOTE none of these events should be loaded into the new system.\n  PLANS: 14,\n  ANDROID: 15, // Android\n  GENESIS: 16, // Rudy's new mobile web\n  IOS2: 17, // updated iPhone Core App\n  ANDROID2: 18, // updated iPhone Core App\n  GIFTING: 19, // Lars' Photo Gifting App\n  GREETINGCARD2: 20, // Greeting Card 2.0\n  FABRIC: 21, // Fabric Invitation\n  FABRICGREETINGCARD: 22, // Fabric Greeting Card\n};\n\n// please add any groupings below if these don't meet future needs\nexport const CARD_ORIGINS = [\n  ORIGIN_DICT['FABRICGREETINGCARD'],\n  ORIGIN_DICT['GREETINGCARD2'],\n];\nexport const FABRIC_EVENT_ORIGINS = [ORIGIN_DICT['FABRIC']];\nexport const FABRIC_GRC_ORIGINS = [ORIGIN_DICT['FABRICGREETINGCARD']];\nexport const LEGACY_GRC_ORIGINS = [ORIGIN_DICT['GREETINGCARD2']];\nexport const LEGACY_PREMIUM_ORIGINS = [ORIGIN_DICT['POSTMARK']];\n","import React from 'react';\nimport {AsyncComponent} from 'async-component';\n\nexport const EventGuestsAsync = (props) => {\n  return (\n    <AsyncComponent\n      exportName=\"EventGuests\"\n      loaderStyle={{height: 200}}\n      resolve={() => {\n        return import(\n          /* webpackChunkName: \"EventGuests\" */ '~/common/fabric/EventGuests/EventGuests'\n        );\n      }}\n      {...props}\n    />\n  );\n};\n","import React from 'react';\nimport {UPDATE_GUESTS, UPDATE_GUESTS_UI} from '../reducers/guests/constants';\nimport {\n  contactsParams,\n  guestListParams,\n  paginatedResponseInit,\n} from '../reducers/guests';\nimport {toastAlert} from '~/common/_pb_components/atoms/Toast';\nimport {PB_Checkmark} from '~/common/svg/PB_Checkmark';\nimport {PB_AlertLine} from '~/common/svg/PB_AlertLine';\nimport {Typography} from '~/common/_pb_components/atoms/Typography';\nimport {emeraldWebText} from '~sass/pb_styleguide/base/_exports.sass';\nimport {isEmpty, isEqual, isNil, uniqWith} from 'lodash';\nimport {\n  parse_us_phone_number as isPhone,\n  valid_email as isEmail,\n} from '~/common/utils';\n\nconst alert = ({title, body, type, icon}) => {\n  return toastAlert(\n    <span>\n      <Typography as=\"span\" variant=\"paragraph2\" style={{display: 'block'}}>\n        {title}\n      </Typography>\n      <Typography as=\"span\" variant=\"paragraph2\" style={{display: 'block'}}>\n        {body}\n      </Typography>\n    </span>,\n    {\n      type,\n      icon,\n      position: 'top-right',\n      autoClose: 2500,\n      hideProgressBar: true,\n      closeOnClick: true,\n      pauseOnHover: true,\n      draggable: true,\n      progress: undefined,\n    }\n  );\n};\n\nexport const fetchContactsThunk = (params = {}, returnAll) => async (\n  dispatch,\n  getState\n) => {\n  const eventId = window.evite_event.id;\n  const {origin} = window.location;\n  const url = new URL(`/ajax/event/${eventId}/guestlist/contacts/`, origin);\n\n  if (returnAll) {\n    params.page = 1;\n    params.per_page = Number.MAX_SAFE_INTEGER;\n  }\n\n  const searchParams = new URLSearchParams({\n    ...selectContactsParams(getState()),\n    ...params,\n  });\n  url.search = searchParams.toString();\n\n  const resp = await evite.fetch(url, {\n    method: 'get',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  const {contacts, letters, all_are_guests, contact_groups} = await resp.json();\n\n  if (returnAll) {\n    return contacts;\n  } else {\n    dispatch({\n      type: UPDATE_GUESTS,\n      payload: {contacts, letters, all_are_guests, contact_groups},\n    });\n  }\n};\n\nexport const fetchGuestsListThunk = (params = {}, getAll = false) => async (\n  dispatch,\n  getState\n) => {\n  const {origin} = window.location;\n  const eventId = window.evite_event.id;\n  const {guestListParams} = getState().guests;\n  const updatedParams = {\n    ...guestListParams,\n    ...params,\n  };\n\n  if (getAll) {\n    updatedParams.page = 1;\n    updatedParams.per_page = Number.MAX_SAFE_INTEGER;\n  }\n\n  if (!isNil(params)) {\n    dispatch({\n      type: UPDATE_GUESTS,\n      payload: {\n        guestListParams: updatedParams,\n      },\n    });\n  }\n\n  // ajax_event_pagination\n  const url = new URL(`/ajax/event/${eventId}/guestlist/draft/`, origin);\n  const searchParams = new URLSearchParams(updatedParams);\n  url.search = searchParams.toString();\n\n  try {\n    const resp = await evite.fetch(url, {\n      method: 'get',\n      credentials: 'include',\n      headers: {Accept: 'application/json'},\n    });\n\n    const {guests} = await resp.json();\n\n    const url2 = new URL(`/ajax/event/${eventId}/guestlist/sent/`, origin);\n    const searchParams2 = new URLSearchParams(updatedParams);\n    url2.search = searchParams2.toString();\n\n    const resp2 = await evite.fetch(url2, {\n      method: 'GET',\n      credentials: 'include',\n      headers: {Accept: 'application/json'},\n    });\n\n    const sent = await resp2.json();\n    dispatch({type: UPDATE_GUESTS, payload: {guests, sent: sent?.guests}});\n  } catch (e) {\n    dispatch({\n      type: UPDATE_GUESTS,\n      payload: {guests: paginatedResponseInit, sent: paginatedResponseInit},\n    });\n  }\n};\n\nexport const checkIfContainsRecipients = async () => {\n  const {origin} = window.location;\n  const eventId = window.evite_event.id;\n\n  const url = new URL(`/ajax/event/${eventId}/guestlist/draft/`, origin);\n  const searchParams = new URLSearchParams({...guestListParams, per_page: 1});\n  url.search = searchParams.toString();\n\n  const resp = await evite.fetch(url, {\n    method: 'get',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  const {\n    guests: {count},\n  } = await resp.json();\n\n  return !!count;\n};\n\nexport const editGuestThunk = (guest) => async (dispatch) => {\n  const eventId = window.evite_event.id;\n  const url = `/ajax/event/${eventId}/guestlist/draft/`;\n\n  try {\n    await evite.fetch(url, {\n      method: 'PATCH',\n      credentials: 'include',\n      body: JSON.stringify(guest),\n      headers: {Accept: 'application/json'},\n    });\n    dispatch(fetchContactsThunk());\n    dispatch(fetchGuestsListThunk());\n    dispatch({type: UPDATE_GUESTS_UI, payload: {editing: null}});\n  } catch (e) {\n    evite.error('Error in posting guest');\n    evite.error(e);\n    return [];\n  }\n};\n\nexport const selectContactsParams = (state) => {\n  const {contact_group_id, contactsParams} = state?.guests;\n  return {\n    ...contactsParams,\n    contact_group_id: contact_group_id,\n  };\n};\n\nexport const addGuestsThunk = (guests = []) => async (dispatch, getState) => {\n  const eventId = window.evite_event.id;\n  const {ui} = getState().guests;\n\n  const url = `/ajax/event/${eventId}/guestlist/draft/`;\n  const {request: req, adding} = ui;\n\n  try {\n    dispatch({\n      type: UPDATE_GUESTS_UI,\n      payload: {\n        adding: [...adding, guests?.[0]?.id],\n        request: {...req, pending: true},\n      },\n    });\n    await evite.fetch(url, {\n      method: 'post',\n      credentials: 'include',\n      body: JSON.stringify(guests),\n      headers: {Accept: 'application/json'},\n    });\n    await dispatch(fetchGuestsListThunk());\n\n    await dispatch(fetchContactsThunk());\n    await dispatch(fetchGuestsImportThunk());\n\n    dispatch({\n      type: UPDATE_GUESTS_UI,\n      payload: {adding: [], request: {...req, pending: false}},\n    });\n  } catch (e) {\n    evite.error('Error in posting guest');\n    evite.error(e);\n    return [];\n  }\n};\n\nexport const deleteGuestThunk = (guestId) => async (dispatch, getState) => {\n  const {\n    ui,\n    guests: {page, current_page},\n  } = getState().guests;\n  const eventId = window.evite_event.id;\n  const url = `/ajax/event/${eventId}/guestlist/draft/${guestId}`;\n  const {request: req, deleting} = ui;\n\n  try {\n    dispatch({\n      type: UPDATE_GUESTS_UI,\n      payload: {\n        deleting: [...deleting, guestId],\n        request: {...req, pending: true},\n      },\n    });\n    await evite.fetch(url, {\n      method: 'delete',\n      credentials: 'include',\n      headers: {Accept: 'application/json'},\n    });\n\n    let curr_page = Number(current_page);\n    const previousPage = curr_page - 1;\n    if (page?.length - 1 <= 0) {\n      if (previousPage <= 0) {\n        curr_page = 1;\n      } else {\n        curr_page = previousPage;\n      }\n    }\n    await dispatch(fetchGuestsListThunk({page: curr_page}));\n\n    await dispatch(fetchContactsThunk());\n    await dispatch(fetchGuestsImportThunk());\n\n    const payload = {deleting: [], request: {...req, pending: false}};\n    dispatch({type: UPDATE_GUESTS_UI, payload});\n  } catch (e) {\n    evite.error('Error in posting guest');\n    evite.error(e);\n  }\n};\n\nexport const saveNewContactToGuestThunk = (contact) => async (\n  dispatch,\n  getState\n) => {\n  const url = '/ajax/profile/contacts';\n  const {fabricGreetingCard} = getState().guests;\n  const label = fabricGreetingCard ? 'Recipient' : 'Guest';\n\n  try {\n    const resp = await evite.fetch(url, {\n      method: 'PUT',\n      credentials: 'include',\n      body: JSON.stringify(contact),\n      headers: {Accept: 'application/json'},\n    });\n    const guest = await resp.json();\n    const guests = [\n      {\n        ...guest,\n        invite_method: contact.phone ? 'sms' : 'email',\n        phone: contact.phone,\n        selected: true,\n        import_method: 'manually_added',\n      },\n    ];\n    await dispatch(addGuestsThunk(guests));\n    dispatch({type: UPDATE_GUESTS, payload: {q: ''}});\n    await dispatch({\n      type: UPDATE_GUESTS_UI,\n      payload: {adding: [], name: '', email: '', phone: '', creating: false},\n    });\n\n    alert({\n      title: 'Success',\n      body: `1 ${label} Added.`,\n      type: 'success',\n      icon: <PB_Checkmark ratio={0.65} color={emeraldWebText} />,\n    });\n  } catch (e) {\n    evite.error('Error in creating contact');\n    evite.error(e);\n  }\n};\n\nexport const uploadGuests = (file) => async (dispatch) => {\n  const eventId = window.evite_event.id;\n\n  const token = window.evite.cookie('csrftoken');\n  const body = new FormData();\n\n  body.append('csrfmiddlewaretoken', token);\n  body.append('csv-upload', file);\n\n  const url = '/profile/contacts/import/csv';\n  const url2 = `/event/${eventId}/guests/csv/draft`;\n\n  const headers = {\n    'X-CSRFToken': token,\n    accept: 'application/json, */*',\n  };\n\n  await fetch(url, {method: 'POST', headers, body});\n  await fetch(url2, {method: 'POST', headers, body});\n  dispatch(fetchContactsThunk());\n  dispatch(fetchGuestsListThunk());\n  dispatch({type: UPDATE_GUESTS_UI, payload: {uploading: false}});\n};\n\nexport const selectImportParams = (state) => {\n  const {contactsParams} = state?.guests;\n\n  return {\n    ...contactsParams,\n    q: contactsParams.import_search_string,\n  };\n};\n\nexport const fetchGuestsImportThunk = (\n  params = {},\n  returnAll = false\n) => async (dispatch, getState) => {\n  const {origin} = window.location;\n  const eventId = window.evite_event.id;\n\n  const url = new URL(`/ajax/event/${eventId}/guestlist/import/`, origin);\n\n  if (returnAll) {\n    params.page = 1;\n    params.per_page = Number.MAX_SAFE_INTEGER;\n  }\n\n  const searchParams = new URLSearchParams({\n    ...selectImportParams(getState()),\n    ...params,\n  });\n\n  url.search = searchParams.toString();\n\n  const resp = await evite.fetch(url, {\n    method: 'get',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n  const {guests: imports, letters} = await resp.json();\n\n  dispatch({type: UPDATE_GUESTS_UI, payload: {loadingAddressBook: false}});\n  if (returnAll) {\n    return imports;\n  } else {\n    dispatch({type: UPDATE_GUESTS, payload: {imports, letters}});\n  }\n};\n\nexport const deleteImportsThunk = () => async (dispatch) => {\n  const eventId = window.evite_event.id;\n\n  const url = `/ajax/event/${eventId}/guestlist/import/all`;\n\n  await fetch(url, {\n    method: 'DELETE',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  dispatch({type: UPDATE_GUESTS, payload: {imports: paginatedResponseInit}});\n  dispatch({\n    type: UPDATE_GUESTS_UI,\n    payload: {importing: false, googleAddressBook: false},\n  });\n};\n\nexport const deleteAllContactsFromGuestlistThunk = () => async (\n  dispatch,\n  getState\n) => {\n  const {origin} = window.location;\n  const id = window.evite_event.id;\n  const deleteContactsFromListUrl = new URL(\n    `/ajax/event/${id}/guestlist/contacts/group-delete/draft/`,\n    origin\n  );\n  await fetch(deleteContactsFromListUrl, {\n    method: 'post',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  const deleteImportsFromListUrl = new URL(\n    `/ajax/event/${id}/guestlist/import/group-delete/draft/`,\n    origin\n  );\n  await fetch(deleteImportsFromListUrl, {\n    method: 'post',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  const deleteAllDraftContactsFromListUrl = new URL(\n    `ajax/event/${id}/guestlist/draft/all`,\n    origin\n  );\n  await fetch(deleteAllDraftContactsFromListUrl, {\n    method: 'DELETE',\n    credentials: 'include',\n    headers: {Accept: 'application/json'},\n  });\n\n  dispatch(fetchContactsThunk());\n  await dispatch(fetchGuestsListThunk({page: 1, q: ''}));\n};\n\nexport const toggleAllContactsThunk = (contacts) => async (\n  dispatch,\n  getState\n) => {\n  const {guestsToBeAdded} = getState().guests;\n\n  const guests = contacts\n    ?.filter((contact) => {\n      return !(\n        contact?.selected === true ||\n        contact?.invited === true ||\n        contact?.is_invited === true\n      );\n    })\n    ?.map((contact) => ({\n      ...contact,\n      invite_method:\n        contact?.invite_method || (contact.email ? 'email' : 'sms'),\n    }));\n\n  const newGuestsToBeAdded = uniqWith([...guestsToBeAdded, ...guests], isEqual);\n\n  dispatch({\n    type: UPDATE_GUESTS,\n    payload: {\n      guestsToBeAdded: newGuestsToBeAdded,\n    },\n  });\n};\n\nexport const fetchEventsThunk = (paginationParams = {}) => async (\n  dispatch,\n  getState\n) => {\n  const {origin} = window.location;\n  const {\n    fabricGreetingCard,\n    eventsParams: {sort, ...params},\n  } = getState().guests;\n\n  // ajax_event_pagination\n  const url = new URL(`/ajax/profile/events/get`, origin);\n\n  const sortTypes = {\n    event_date_desc: {\n      property: 'event_date',\n      order: 'desc',\n    },\n    event_date_asc: {\n      property: 'event_date',\n      order: 'asc',\n    },\n    title_desc: {\n      property: 'title',\n      order: 'desc',\n    },\n    title_asc: {\n      property: 'title',\n      order: 'asc',\n    },\n  };\n\n  const resp = await evite.fetch(url, {\n    method: 'POST',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({\n      ...params,\n      ...paginationParams,\n      sort: sortTypes[sort],\n    }),\n  });\n\n  const events = await resp.json();\n\n  dispatch({\n    type: UPDATE_GUESTS,\n    payload: {events},\n  });\n\n  console.log(events);\n};\n\nexport const selectAllContacts = () => async (dispatch) => {\n  const {page} = await dispatch(fetchContactsThunk({}, true));\n  await dispatch(toggleAllContactsThunk(page));\n};\n\nexport const selectAllImportContacts = () => async (dispatch) => {\n  const {page} = await dispatch(fetchGuestsImportThunk({}, true));\n  await dispatch(toggleAllContactsThunk(page));\n};\n\nexport const selectAllEventGuests = () => async (dispatch) => {\n  const {page} = await dispatch(fetchEventGuestListThunk({}, true));\n  await dispatch(toggleAllContactsThunk(page));\n};\n\nexport const fetchEventGuestListThunk = (\n  paginationParams = {},\n  returnAll\n) => async (dispatch, getState) => {\n  const {origin} = window.location;\n  const eventId = window.evite_event.id;\n  const params = getState().guests.eventGuestListParams;\n\n  if (!isNil(paginationParams)) {\n    dispatch({\n      type: UPDATE_GUESTS,\n      payload: {\n        eventGuestListParams: {\n          ...params,\n          ...paginationParams,\n        },\n      },\n    });\n  }\n\n  if (!params?.source_event_id) {\n    return;\n  }\n\n  // ajax_event_pagination\n  const url = new URL(`/ajax/event/${eventId}/guestlist/import/event/`, origin);\n\n  const body = {...params, ...paginationParams};\n\n  if (body.rsvp === 'all') {\n    body.rsvp = null;\n  }\n\n  if (returnAll) {\n    body.page = 1;\n    body.per_page = Number.MAX_SAFE_INTEGER;\n  }\n\n  const resp = await evite.fetch(url, {\n    method: 'POST',\n    credentials: 'include',\n    headers: {\n      Accept: 'application/json',\n      'X-CSRFToken': evite.cookie('csrftoken'),\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify(body),\n  });\n\n  let eventGuestList = await resp.json();\n\n  if (resp.status !== 200) {\n    eventGuestList = paginatedResponseInit;\n  }\n\n  if (returnAll) {\n    return eventGuestList;\n  } else {\n    await dispatch({\n      type: UPDATE_GUESTS,\n      payload: {\n        eventGuestList,\n      },\n    });\n  }\n};\n\nexport const addBulkGuestsThunk = () => async (dispatch, getState) => {\n  dispatch({\n    type: UPDATE_GUESTS,\n    payload: {\n      addingGuest: true,\n    },\n  });\n  const eventId = window.evite_event.id;\n  const {guestsToBeAdded, fabricGreetingCard} = getState().guests;\n  const url = `/ajax/event/${eventId}/guestlist/draft/`;\n\n  const cleanGuestsToBeAdded = () => {\n    dispatch({\n      type: UPDATE_GUESTS,\n      payload: {\n        guestsToBeAdded: [],\n        addingGuest: false,\n        contactsParams,\n        contact_group_id: '',\n      },\n    });\n    dispatch({\n      type: UPDATE_GUESTS_UI,\n      payload: {eventGuestList: false},\n    });\n  };\n\n  const validGuestsToBeAdded = guestsToBeAdded?.filter((contact) => {\n    return !!(\n      (contact.invite_method === 'email' && isEmail(contact.email).is_valid) ||\n      (contact.invite_method === 'sms' && isPhone(contact.phone).is_valid)\n    );\n  });\n\n  const label = fabricGreetingCard ? 'Recipient' : 'Guest';\n\n  if (validGuestsToBeAdded?.length === 0) {\n    cleanGuestsToBeAdded();\n\n    return alert({\n      title: 'Fail',\n      body: `0 ${label} Added.`,\n      type: 'error',\n      icon: <PB_AlertLine ratio={0.65} />,\n    });\n  }\n\n  const response = await evite.fetch(url, {\n    method: 'post',\n    credentials: 'include',\n    body: JSON.stringify(validGuestsToBeAdded),\n    headers: {Accept: 'application/json'},\n  });\n  const data = await response.json();\n\n  if (!response.ok) {\n    let e = data.message || `Unknown error when adding ${label}`;\n    evite.error('Failed Response', e);\n    return alert({\n      title: 'Fail',\n      body: e,\n      type: 'error',\n      icon: <PB_AlertLine ratio={0.65} />,\n    });\n  }\n\n  const validGuestsAdded = data.guests;\n\n  await dispatch(fetchGuestsListThunk());\n  await dispatch(fetchContactsThunk());\n  cleanGuestsToBeAdded();\n  if (!isEmpty(validGuestsAdded))\n    alert({\n      title: 'Success',\n      body: (\n        <>\n          {validGuestsAdded?.length} {label}\n          {validGuestsAdded?.length > 1 ? 's ' : ' '}\n          Added.\n        </>\n      ),\n      type: 'success',\n      icon: <PB_Checkmark ratio={0.65} color={emeraldWebText} />,\n    });\n};\n","export const eventStepsType = {\n  PREMIUM: 'premium',\n  FREEMIUM: 'freemium',\n  FREEMIUM_WITH_GUESTS: 'freemium_with_guests',\n  FREE: 'free',\n  FREE_WITH_GUESTS: 'free_with_guests',\n};\n\nexport const isWebview = () => {\n  return !!(\n    window?.webkit?.messageHandlers?.fabricCreateOnNav ||\n    window?.webview?.fabricCreateOnNav\n  );\n};\n\nexport const addGuestsPreCondition = (state, preConditions = []) => {\n  return [...preConditions, !state.fabricTemplate?.premium, !isWebview()].every(\n    Boolean\n  );\n};\n\nexport const getEventStepsType = (state) => {\n  const hasGuests = state.guests?.guests?.count > 0;\n  const {pathname} = window.location;\n  if (!addGuestsPreCondition(state)) {\n    return eventStepsType.PREMIUM;\n  } else if (hasGuests || pathname.includes('guests')) {\n    return state.details.isPremium\n      ? eventStepsType.FREEMIUM_WITH_GUESTS\n      : eventStepsType.FREE_WITH_GUESTS;\n  }\n  return state.details.isPremium\n    ? eventStepsType.FREEMIUM\n    : eventStepsType.FREE;\n};\n","export const UPDATE_GUESTS = '/EventGuests/*/UpdateGuests';\nexport const UPDATE_GUESTS_UI = '/EventGuests/*/UpdateGuestsUI';\nexport const UPDATE_CONTACT_GROUP_ID = '/EventGuests/*/UpdateContactGroupId';\n","export * from './reducer';\n","import {\n  UPDATE_GUESTS,\n  UPDATE_GUESTS_UI,\n  UPDATE_CONTACT_GROUP_ID,\n} from './constants';\n\nexport const alphabet = 'a b c d e f g h i j k l m n o p q r s t u v w x y z #'.split(\n  ' '\n);\n\nexport const paginatedResponseInit = {\n  page: [],\n  current_page: '1',\n  has_next: false,\n  count: 0,\n  num_pages: 0,\n};\n\nexport const eventGuestListResponseInit = {\n  ...paginatedResponseInit,\n  summary: {\n    maybe_count: 0,\n    no_count: 0,\n    undecided_count: 0,\n    yes_count: 0,\n  },\n};\n\nexport const guestListParams = {\n  q: '',\n  search_by: 'all',\n  search_type: 'contains',\n  sort_by: 'name',\n  reverse: false,\n  per_page: 25,\n  page: 1,\n};\n\nexport const contactsParams = {\n  ...guestListParams,\n  per_page: 55,\n  sort_by: 'name',\n  import_search_string: '',\n};\n\nconst initialState = {\n  contacts: paginatedResponseInit,\n  guests: paginatedResponseInit,\n  events: paginatedResponseInit,\n  imports: paginatedResponseInit,\n  sent: paginatedResponseInit,\n  eventGuestList: eventGuestListResponseInit,\n  guestsToBeAdded: [],\n  addingGuest: false,\n  import_search_string: '',\n  eventGuestListParams: {\n    source_event_id: null,\n    per_page: 55,\n    page: 1,\n    rsvp: null, // all | yes | no | undecided\n    search_param: '',\n  },\n  eventsParams: {\n    page: 1,\n    events_per_page: 8,\n    search_string: null,\n    sort: 'event_date_desc',\n    search_param: '',\n    past_events_only: false,\n  },\n  guestListParams,\n  letters: alphabet,\n  contactsParams,\n  contact_group_id: '',\n  ui: {\n    adding: [],\n    creating: false,\n    deleting: [],\n    editing: null,\n    uploading: false,\n    guestOptions: false,\n    eviteGuestList: false,\n    eviteAddressBook: false,\n    googleAddressBook: false,\n    newGuestContact: false,\n    eventGuestList: false,\n    eventsListScroll: false,\n    name: '',\n    email: '',\n    phone: '',\n    request: {pending: false, error: false},\n    importing: false,\n    loadingAddressBook: false,\n  },\n  showShareableLinkBanner: true,\n  eventId: null,\n  fabricGreetingCard: false,\n  hasGiftCard: false,\n};\n\nexport const selectAddingOrDeleting = (state, props) => {\n  const {guests} = state;\n  const {adding, deleting, request} = guests.ui;\n  const {pending} = request;\n\n  return (\n    pending && (adding.includes(props.id) || deleting.includes(props.guest_id))\n  );\n};\n\nexport const reducer = (state = initialState, action = {}) => {\n  switch (action.type) {\n    case UPDATE_CONTACT_GROUP_ID:\n      return {...state, contact_group_id: action.payload.contact_group_id};\n    case UPDATE_GUESTS:\n      return {...state, ...action.payload};\n    case UPDATE_GUESTS_UI:\n      return {...state, ui: {...state.ui, ...action.payload}};\n    default:\n      return state;\n  }\n};\n","export * from './constants';\nexport * from './reducer';\nexport * from './selectors';\n","import {INIT_APP} from '~/common/fabric/constants';\nimport {USER_LOGGED_IN} from '~/common/components/LoginModal/reducer';\n\nconst initialState = {\n  userId: '',\n  userName: '',\n  subscriptionPlanName: '',\n  email: '',\n  emailMd5: '',\n  emailSha256: '',\n  avatarDisk: '',\n  imgUrl: '',\n  initials: '',\n  firstName: '',\n  is_authenticated: '',\n  phoneNumber: '',\n};\n\nexport function reducer(state = initialState, action = {}) {\n  switch (action.type) {\n    case INIT_APP:\n      const user = action.payload.user;\n      const cd = window.client_data;\n      if (!user) return state;\n      return {\n        ...state,\n        userId: user.userId,\n        userName: user.userName,\n        subscriptionPlanName: user.subscriptionPlanName,\n        email: user.email,\n        emailMd5: cd.evc_h,\n        emailSha256: cd.evc_s256l,\n        avatarDisk: user.avatarDisk,\n        imgUrl: user.imgUrl,\n        initials: user.initials,\n        firstName: user.firstName,\n        is_authenticated: user.isAuthenticated,\n        phoneNumber: window.user_phone_number,\n      };\n    case USER_LOGGED_IN:\n      return {\n        ...state,\n        userId: action.userId,\n        userName: action.userName,\n        subscriptionPlanName: action.subscriptionPlanName,\n        email: action.email,\n        emailMd5: action.emailMd5,\n        emailSha256: action.emailSha256,\n        avatarDisk: action.avatarDisk,\n        imgUrl: action.imgUrl,\n        initials: action.initials,\n        firstName: action.firstName,\n        phoneNumber: action.user_phone_number,\n        is_authenticated: true,\n      };\n    default:\n      return state;\n  }\n}\n","export const userIsLoggedIn = (state) => {\n  return !!state.user.userId;\n};\n\nexport const selectUserName = (state) => {\n  return state.user.userName;\n};\n\nexport const getLoggedUserId = ({user}) => user.userId;\n\nexport const selectUserEmail = (state) => {\n  return state.user.email;\n};\n\nexport const selectUserSha256 = (state) => {\n  return state.user.emailSha256;\n};\n\nexport const selectUserFirstName = (state) => {\n  return state.user.firstName;\n};\n\nexport const selectUserPhoneNumber = (state) => {\n  return state?.user?.phoneNumber || '';\n};\n","export const INIT_APP = 'CreateFabric/*/Init';\n","import {useCallback, useEffect, useState} from 'react';\n\nexport const useMatchQuery = (query, listeners = []) => {\n  const windowSizeQuery = window.matchMedia(query);\n  const [matches, setMatches] = useState(windowSizeQuery.matches);\n\n  const handleWindowResize = useCallback((windowSizeQuery) => {\n    setMatches(windowSizeQuery.matches);\n  }, []);\n\n  listeners.push(handleWindowResize);\n\n  // support older browser versions\n  windowSizeQuery.addEventListener ||= (_, action) =>\n    windowSizeQuery.addListener(action);\n  windowSizeQuery.removeEventListener ||= (_, action) =>\n    windowSizeQuery.removeListener(action);\n\n  useEffect(() => {\n    listeners.forEach((listener) => {\n      listener(windowSizeQuery);\n      windowSizeQuery.addEventListener('change', listener);\n    });\n    return () =>\n      listeners.forEach((listener) =>\n        windowSizeQuery.removeEventListener('change', listener)\n      );\n  }, []);\n\n  return {windowSizeQuery, matches};\n};\n","import {useRef, useEffect} from 'react';\n\nexport const usePrevious = (value) => {\n  const ref = useRef();\n  useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n};\n","__webpack_public_path__ = process.env.ASSET_PATH;\n","import urls from 'urls';\n\nconst GCS_PATH_IDS = {\n  anonymous_image: 'anonymous_image',\n  event_video: 'event_video',\n  event_custom_logo: 'event_custom_logo',\n  video_preview_image: 'preview_image',\n  user_profile_photo: 'user_profile_photo',\n  event_photo_insert: 'event_photo_insert',\n  event_custom_image: 'event_custom_image',\n  premium_custom_stamp: 'premium_custom_stamp',\n  feed_photos: 'feed_photos',\n};\n\n/*\nAPI by GCS_PATH_ID:\nanonymous_image: Anonymous Image. Used to temporarily hold a UYO/DYO image during no-login event create flow, Step 1.\nevent_custom_logo: Event custom logo image\n\tevent_id: event ID\npremium_custom_stamp: Premium Event Custom Stamp Image\n\tevent_id: event ID\nevent_photo_insert: Event photo-insert image\n\tevent_id: event ID\n\timage_id: Required. Send an EMPTY STRING for new upload, or a valid id to replace.\nevent_custom_image: Event Custom (UYO/DYO) image\n\tevent_id: event ID\nevent_video: Video invitation segment\n\tvideo_id: Video invitation ID\n\tevent_context: event context name\n\tinput_name: video input name (must match the name of an input defined by the pipeline referenced by ths video template\nevent_video_with_render: Video invitation segment, with render-video as a post-upload action\n\tvideo_id: Video invitation ID\n\tevent_context: event context name\n\tinput_name: video input name (must match the name of an input defined by the pipeline referenced by ths video template\nfeed_photos: Upload a photo related to a post in the feed for one event\n\tevent_id: event ID\n\tphoto_id: PhotoDS ID referenced within the post\nuser_profile_photo: Upload a user-profile photo\n\tuser_id: user ID\npreview_image: Preview image for one video segment\n\tvideo_id: Video invitation ID\n\tevent_context: event context name\nvideo_template_asset: Video Template Asset\n\tvideo_template_id: video template ID\n\tevent_context: event context name\n\tinput_name: video input name (must match the name of an input defined by the pipeline referenced by ths video template\n */\n\nfunction getImageKeyFromPath(gcsPath) {\n  if (gcsPath) {\n    // The last part of the path.\n    let m = gcsPath.match(/\\w+$/);\n    return m ? m[0] : null;\n  }\n}\n\n/**\n * Upload an image to GCS.\n * Wraps the request and upload parts of the upload process.\n *\n * @param gcsPathId like 'event_custom_logo', 'premium_custom_stamp', etc.\n * @param params obj should match the gcsPathId (see 'API by GPS_PATH_ID')\n * @param image, must be a Blob\n * @param redirect true for automatic 'finishing' of images\n * @returns {Promise<{gcsPath: *, url: *}>}\n */\nasync function gcsUploadImage({\n  gcsPathId,\n  params = {},\n  image,\n  redirect = true,\n  forceImageKey = null,\n}) {\n  const body = {\n    redirect,\n    mimetype: image.type ? image.type : 'image/jpeg',\n  };\n\n  console.log('Making uploadRequest with:', {gcsPathId, params, image});\n  const uploadRequest = await request_access(gcsPathId, params, body);\n  console.log('Got upload uploadRequest:', uploadRequest);\n\n  if (uploadRequest instanceof Error) {\n    console.log('FAILED TO GET VALID uploadRequest.');\n    throw uploadRequest;\n  }\n  await upload_file_gcs(uploadRequest, image);\n\n  // const eventId = params ? params.event_id : '';\n  // const imageKey = gcsPath.includes('anonymous')\n  //   ? getImageKeyFromPath(gcsPath)\n  //   : eventId;\n\n  const gcsPath = uploadRequest['gcs_path'];\n  const imageKey =\n    gcsPathId == GCS_PATH_IDS.anonymous_image ||\n    gcsPathId == GCS_PATH_IDS.event_photo_insert\n      ? getImageKeyFromPath(gcsPath)\n      : forceImageKey;\n\n  const results = {\n    url: uploadRequest['access_url'],\n    gcsPath: gcsPath,\n    imageKey: imageKey,\n  };\n  console.log('Returning gcs upload results:', results);\n  return results;\n}\n\n/**\n * The first step of the upload process, returns an uploadRequest object.\n * @param gcsPathId\n * @param params obj should match the gcsPathId (see 'API by GPS_PATH_ID')\n * @param body obj containing the image and its mime type\n * @returns {Promise<Error|*>}\n */\nconst request_access = async (gcsPathId, params, body) => {\n  // Path validation\n  if (Object.values(GCS_PATH_IDS).includes(gcsPathId)) {\n    const url = urls.get('ajax_upload_request', {\n      upload_path: gcsPathId,\n      ...params, //we add any extra needed param\n    });\n\n    // console.log('Upload access request: ', {url, body});\n    const response = await evite.fetch(url, {\n      method: 'POST',\n      body: JSON.stringify(body),\n    });\n    if (!response.ok) {\n      const {status, statusText} = response;\n      return new Error(`ACCESS REQUEST FAILURE: ${status}, ${statusText}`);\n    }\n    const json = await response.json();\n    return json;\n  }\n  return new Error('path does not exist');\n};\n\n/**\n * Sends the cropped canvas image to be resized and uploaded to gcs in the backend\n * @param gcsPathId like 'event_custom_logo', 'premium_custom_stamp', etc.\n * @param params obj should match the gcsPathId (see 'API by GPS_PATH_ID')\n * @param image the cropped canvas image in base64\n * @param imageType the image mimetype\n * @param width the desired width of the resized image\n * @param height the desired height of the resized image\n * @param redirect true for automatic 'finishing' of images\n * @param forceImageKey the custom image id if from an existing event, otherwise null\n * @returns {Promise<Error|*>}\n */\nconst resizeImageAndUploadToGcs = async ({\n  gcsPathId,\n  params = {},\n  image,\n  imageType,\n  width,\n  height,\n  redirect = true,\n  forceImageKey = null,\n}) => {\n  if (!Object.values(GCS_PATH_IDS).includes(gcsPathId)) {\n    return new Error('path does not exist');\n  }\n  const url = urls.get('ajax_resize_upload_image', {\n    upload_path: gcsPathId,\n    ...params, //we add any extra needed param\n  });\n\n  let dimensions = {width: width, height: height};\n  // Fill in the form data to be sent in the ajax call\n  let form_data = new FormData();\n  form_data.append('image', image);\n  form_data.append('dimensions', JSON.stringify(dimensions));\n  form_data.append('redirect', redirect);\n  form_data.append('mimetype', imageType);\n  form_data.append('upload_path', gcsPathId);\n  form_data.append('force_image_key', forceImageKey);\n  const response = await evite.fetch(url, {\n    method: 'POST',\n    body: form_data,\n  });\n  if (!response.ok) {\n    const {status, statusText} = response;\n    return new Error(\n      `RESIZE AND UPLOAD IMAGE FAILURE: ${status}, ${statusText}`\n    );\n  }\n  const results = await response.json();\n  return results;\n};\n\n/**\n * Upload image file with uploadRequest object.\n * @param uploadRequest\n * @param file\n * @param onProgress\n * @param customXHR\n * @returns {Promise<*>}\n */\nconst upload_file_gcs = async (uploadRequest, file, onProgress, customXHR) => {\n  const data = new FormData();\n  const xhr = customXHR || new XMLHttpRequest();\n  const {upload_url, upload_form} = uploadRequest;\n  for (const [key, value] of Object.entries(upload_form)) {\n    data.append(key, value);\n  }\n  data.append('file', file, file.name);\n  return new Promise((resolve, reject) => {\n    xhr.open('POST', upload_url);\n    if (onProgress && xhr.upload) {\n      try {\n        if (evite.detects.isIE || evite.detects.isEdge) {\n          xhr.onprogress = onProgress;\n        } else {\n          xhr.upload.onprogress = onProgress;\n        }\n      } catch (e) {\n        console.error(e);\n      }\n    }\n    xhr.addEventListener('error', (e) => {\n      reject(e);\n    });\n    xhr.addEventListener('load', (res) => {\n      const {\n        target: {status},\n      } = res;\n      if (status == 200 || status == 201 || status == 204) {\n        resolve(true);\n      } else {\n        console.error('error uploading file, status: ', status);\n        reject('error uploading file, status: ', status);\n      }\n    });\n    xhr.send(data);\n  });\n};\n\n// we normally don't use it, because we normally send redirect=true on the request_access, and this will call it for us\nconst upload_gcs_finish = async (gcs_path) => {\n  const url = urls.get('ajax_upload_finish') + gcs_path;\n  const response = await evite.fetch(url, {\n    method: 'POST',\n  });\n  if (response.ok) {\n    return true;\n  }\n  return new Error('error while calling ajax_upload_finish');\n};\n\nexport {\n  GCS_PATH_IDS,\n  getImageKeyFromPath,\n  request_access,\n  upload_file_gcs,\n  upload_gcs_finish,\n  gcsUploadImage,\n  resizeImageAndUploadToGcs,\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const CardDesign = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 18;\n  const height = 20;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      className={className}\n      style={style}\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M17 20H1C0.734784 20 0.48043 19.8946 0.292893 19.7071C0.105357 19.5196 0 19.2652 0 19V1C0 0.734784 0.105357 0.48043 0.292893 0.292893C0.48043 0.105357 0.734784 0 1 0H17C17.2652 0 17.5196 0.105357 17.7071 0.292893C17.8946 0.48043 18 0.734784 18 1V19C18 19.2652 17.8946 19.5196 17.7071 19.7071C17.5196 19.8946 17.2652 20 17 20ZM16 18V2H2V18H16ZM5 5H13V7H5V5ZM5 9H13V11H5V9ZM5 13H10V15H5V13Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const DiagonalLines = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 24;\n  const height = 24;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      width={width}\n      height={height}\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      fill={color}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n    >\n      <rect width=\"24\" height=\"24\" fill=\"url(#diagonalLines)\" />\n      <defs>\n        <pattern\n          id=\"diagonalLines\"\n          patternContentUnits=\"objectBoundingBox\"\n          width=\"1\"\n          height=\"1\"\n        >\n          <use xlinkHref=\"#image0_2292_47028\" transform=\"scale(0.0104167)\" />\n        </pattern>\n        <image\n          id=\"image0_2292_47028\"\n          width=\"96\"\n          height=\"96\"\n          xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QA/wD/AP+gvaeTAAACD0lEQVR4nO2Yva4OURhGl79Cc64FESEh4TbUKq1O1CjcgRCVxhXQKvR6d0AQRCP5VKc4fo49356ZZ5t3rWSaycx+dtbzZhcbRERERERERERE9ucU8BzYNT5PgZOdmVeAz415n4BLnXnngPd/WT9KdfnRApQfLED5wQKUHyzgNPCicWM74Anryv8IXOzMuwB8aMz70pk1iamTv7b8tSf/K3C9M68Z5Su/pnzwzP/1zL/amTeZUeVvfvIPUX5QPg2bU/7CKD+M8sMoP4zywyg/jPLDKD+M8sP8b3c755l2t3OtM29oti7/oPP/Rdn6sXMAvOlcYzGqyN91rrMIleQPV0A1+UMVUFH+MAVUlT9EAZXlxwuoLj9agPKDBSg/WIDygwUo/+hzrzNvEspXvvKVv7J82P59/hT5dzvz9sLJD03+IcoPyueYTSl/JZQfRvlhlB9G+WGUH0b5YZQfZo7rhVb5Za4X1kL5QSocOw9mWGMRqsjfzbDO7FSSP1wB1eQPVcAU+d/YhvxhCpgq/0Zn3ijyhyiggvz7x6wfpbr8aAHKDxag/GAByg8WUOFu59GEvJcz5DXj5P8u/+wMmU0o/+jzCuXXkA+e+VH5NG7MyV8Q5Qfl84+NKX8FlD8jJ/b4590f3v0AbgGvO/ZyBngGXG78/jHwsCMP4DZwp/Hbt8BN4HtnpoiIiIiIiIiIFOUn500vhI90VaQAAAAASUVORK5CYII=\"\n        />\n      </defs>\n    </svg>\n  );\n};\n","import React from 'react';\nimport {roseWebText} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const Diamond = (props) => {\n  const {color = roseWebText, className = '', ratio = 1, dataId} = props;\n\n  // default dimensions\n  const width = 14;\n  const height = 14;\n\n  const style = {\n    height: `${ratio * height}px`,\n    width: `${ratio * width}px`,\n  };\n\n  return (\n    <svg\n      data-header-id={dataId}\n      className={className}\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      fill={color}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M3.06266 0.750001C2.98148 0.750004 2.9019 0.772594 2.83283 0.815244C2.76375 0.857894 2.70791 0.918922 2.67154 0.991501L0.921538 4.4915C0.883692 4.56686 0.86843 4.65155 0.877588 4.73537C0.886747 4.8192 0.919937 4.89859 0.973163 4.964L6.66066 11.964C6.70169 12.0145 6.75344 12.0552 6.81217 12.0831C6.8709 12.1111 6.93512 12.1256 7.00016 12.1256C7.0652 12.1256 7.12942 12.1111 7.18815 12.0831C7.24688 12.0552 7.29864 12.0145 7.33966 11.964L13.0272 4.964C13.0805 4.89868 13.1139 4.81933 13.1232 4.7355C13.1325 4.65167 13.1174 4.56694 13.0797 4.4915L11.3297 0.991501C11.2932 0.918789 11.2372 0.857673 11.168 0.815014C11.0988 0.772355 11.019 0.749841 10.9377 0.750001H3.06266ZM2.02054 4.25L3.33304 1.625H5.12679L4.47054 4.25H2.02054ZM2.23141 5.125H4.49154L5.90291 9.6435L2.23141 5.125ZM5.40766 5.125H8.59266L7.00016 10.2201L5.40766 5.125ZM9.50966 5.125H11.7689L8.09741 9.6435L9.50966 5.125ZM11.9798 4.25H9.52979L8.87354 1.625H10.6673L11.9798 4.25ZM8.62766 4.25H5.37266L6.02891 1.625H7.97141L8.62766 4.25Z\" />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {roseWebText, ghost} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const DiamondFill = (props) => {\n  const {\n    color = roseWebText,\n    bgColor = ghost,\n    className = '',\n    ratio = 1,\n    dataId,\n  } = props;\n\n  // default dimensions\n  const width = 64;\n  const height = 64;\n\n  const style = {\n    height: `${ratio * height}px`,\n    width: `${ratio * width}px`,\n  };\n\n  return (\n    <svg\n      data-header-id={dataId}\n      className={className}\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      fill={color}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M16.2691 4.14103H16.2693H46.0339H46.0364V7.58622C46.3928 7.68412 46.7316 7.83236 47.0431 8.02487C47.3545 8.21731 47.6385 8.45398 47.8854 8.72883C47.8855 8.72892 47.8856 8.72901 47.8857 8.72911C48.1132 8.98248 48.3092 9.26829 48.466 9.58178L53.4272 19.5044C53.7447 20.1395 53.8756 20.8379 53.8234 21.5236L54.133 22.143C54.2756 22.4282 54.3328 22.7485 54.2976 23.0653C54.2624 23.3822 54.1363 23.6822 53.9346 23.9291L52.9991 25.0805C52.9024 25.7609 52.6242 26.4164 52.1734 26.9712L38.2953 44.0512C37.8405 44.611 37.2557 45.0142 36.6149 45.2461L32.4361 50.3893C32.2811 50.5801 32.0854 50.7339 31.8634 50.8395C31.6414 50.9452 31.3987 51 31.1528 51C30.907 51 30.6642 50.9452 30.4422 50.8395C30.2202 50.7339 30.0246 50.5801 29.8695 50.3893L25.6907 45.2461C25.0499 45.0142 24.4651 44.611 24.0103 44.0512L10.1322 26.9712C9.68146 26.4164 9.40322 25.7609 9.30657 25.0805L8.37105 23.9291C8.16986 23.6818 8.0444 23.3817 8.00978 23.0648C7.97516 22.748 8.03285 22.4279 8.17591 22.143M16.2691 4.14103L46.0356 7.586C45.7075 7.49595 45.3645 7.44856 45.0144 7.44856H38.2341C37.6352 7.44856 37.053 7.58764 36.5293 7.84553C36.0114 7.59018 35.4311 7.44856 34.8241 7.44856H27.4815C26.8745 7.44856 26.2942 7.59018 25.7763 7.84553C25.2526 7.58764 24.6705 7.44856 24.0716 7.44856H17.2913C16.9408 7.44856 16.5976 7.49603 16.2693 7.58622C16.2693 7.58622 16.2693 7.58623 16.2692 7.58623C15.9131 7.68405 15.5746 7.83212 15.2633 8.0244C14.952 8.21666 14.6681 8.4531 14.4212 8.72769C14.4212 8.72778 14.4211 8.72787 14.421 8.72797C14.193 8.98162 13.9967 9.26781 13.8397 9.58178L8.87849 19.5044C8.56004 20.1413 8.42927 20.8418 8.48272 21.5294L8.17591 22.143M16.2691 4.14103C15.2462 4.14106 14.2434 4.42572 13.3731 4.96315C12.5027 5.50057 11.799 6.26957 11.3408 7.18409L11.3392 7.18713L4.72741 20.4111L8.17591 22.143M16.2691 4.14103L4.72556 20.4148M8.17591 22.143L4.72433 20.4173L4.72556 20.4148M31.8111 15.1665H34.8241V13.5786L35.7722 17.3712H32.3622M31.8111 15.1665L31.1528 12.5334L30.4946 15.1665M31.8111 15.1665L32.3622 17.3712M31.8111 15.1665H30.4946M30.4946 15.1665H27.4815V13.5786L26.5334 17.3712H29.9434M30.4946 15.1665L29.9434 17.3712M29.9434 17.3712L29.1165 20.6787H33.1891L32.3622 17.3712M29.9434 17.3712H32.3622M43.7237 17.3552L43.1765 15.1665H45.0144V12.5344L47.4327 17.3712H43.7317M43.7237 17.3552L42.6294 15.1665H39.7666L40.7147 18.9591V17.3712H43.7277M43.7237 17.3552L43.7317 17.3712M43.7237 17.3552L43.7277 17.3712M43.7277 17.3712L44.4584 20.2942L42.9205 20.6787H45.3854L43.7317 17.3712M43.7277 17.3712H43.7317M18.5779 17.3712L17.8472 20.2942L19.3851 20.6787H16.9202L18.574 17.3712M18.5779 17.3712H21.591V18.9591L22.5391 15.1665H19.6763L18.5819 17.3552M18.5779 17.3712H18.574M18.5779 17.3712L18.5819 17.3552M18.5819 17.3552L19.1291 15.1665H17.2913V12.541L14.8762 17.3712H18.574M18.5819 17.3552L18.574 17.3712M4.72556 20.4148C4.25004 21.3634 4.05838 22.4291 4.17364 23.484C4.28893 24.5392 4.70645 25.5388 5.37602 26.3625C5.37614 26.3626 5.37626 26.3628 5.37638 26.3629C5.37689 26.3636 5.37739 26.3642 5.3779 26.3648L26.8745 52.8227L26.8749 52.8233C27.3918 53.4592 28.044 53.9719 28.784 54.3241C29.5241 54.6763 30.3333 54.859 31.1528 54.859C31.9723 54.859 32.7816 54.6763 33.5216 54.3241C34.2616 53.9719 34.9138 53.4592 35.4307 52.8233L35.4311 52.8227L56.923 26.3707C56.9245 26.3688 56.926 26.3669 56.9275 26.365C57.5973 25.5431 58.0159 24.5454 58.1329 23.4915C58.2503 22.4352 58.0598 21.3675 57.5845 20.417L4.72556 20.4148ZM42.5232 12.5531L42.3497 11.859H43.9115L42.5232 12.5531ZM19.9944 32.1153L16.973 28.3966H18.8328L19.9944 32.1153ZM22.9597 30.5194L21.235 28.3966H21.6703V26.3939L22.9597 30.5194ZM45.3326 28.3966L42.3146 32.1112L43.4756 28.3966H45.3326ZM43.7582 25.0891L43.4837 25.4269L42.403 25.0891H43.7582ZM40.6386 26.3833V28.3966H41.0707L39.3459 30.5194L40.6386 26.3833ZM31.9232 28.3966L31.1528 30.8615L30.3824 28.3966H31.9232ZM18.8222 25.4273L18.5475 25.0891H19.9049L18.8222 25.4273ZM19.7824 12.5531L18.3942 11.859H19.956L19.7824 12.5531ZM29.6874 11.859H32.6183L31.1528 12.2253L29.6874 11.859Z\"\n        fill={color}\n        stroke={bgColor}\n        strokeWidth=\"7.71795\"\n        strokeLinejoin=\"round\"\n      />\n      <path\n        d=\"M16.2693 8C15.9624 8.00001 15.6616 8.0854 15.4005 8.24662C15.1394 8.40784 14.9283 8.63853 14.7908 8.91288L8.17591 22.143C8.03285 22.4279 7.97516 22.748 8.00978 23.0648C8.0444 23.3817 8.16986 23.6818 8.37105 23.9291L29.8695 50.3893C30.0246 50.5801 30.2202 50.7339 30.4422 50.8395C30.6642 50.9452 30.907 51 31.1528 51C31.3987 51 31.6414 50.9452 31.8634 50.8395C32.0854 50.7339 32.2811 50.5801 32.4361 50.3893L53.9346 23.9291C54.1363 23.6822 54.2624 23.3822 54.2976 23.0653C54.3328 22.7485 54.2756 22.4282 54.133 22.143L47.5181 8.91288C47.3804 8.63803 47.1688 8.40701 46.907 8.24575C46.6453 8.0845 46.3438 7.9994 46.0364 8H16.2693ZM12.3301 21.2301L17.2913 11.3075H24.0716L21.591 21.2301H12.3301ZM13.1272 24.5377H21.6703L27.0053 41.6177L13.1272 24.5377ZM25.1332 24.5377H37.1724L31.1528 43.7974L25.1332 24.5377ZM40.6386 24.5377H49.1785L35.3004 41.6177L40.6386 24.5377ZM49.9756 21.2301H40.7147L38.2341 11.3075H45.0144L49.9756 21.2301ZM37.3047 21.2301H25.0009L27.4815 11.3075H34.8241L37.3047 21.2301Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {white} from '~sass/reinvention_styleguide/base/_exports.sass';\n\nexport const EviteLogo = (props) => {\n  const {color = white, ratio = 1, className} = props;\n\n  // default dimensions (not sure where this size came from, but ratio .2155 makes it 119.98 x 52.66 for our footer\n  const width = 85;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        shapeRendering=\"geometricPrecision\"\n        d=\"M45.3568 6.29739C46.1779 6.30248 46.9675 5.97402 47.5528 5.38393C48.1381 4.79385 48.4713 3.99022 48.4795 3.14899C48.4806 2.73089 48.4003 2.31675 48.2432 1.93089C48.086 1.54503 47.8553 1.19522 47.5644 0.901957C47.2735 0.608696 46.9284 0.377893 46.5493 0.223109C46.1702 0.0683242 45.7648 -0.00734493 45.3568 0.000561439C43.6454 0.000561439 42.1844 1.34475 42.1844 3.14899C42.1844 4.90446 43.6454 6.29739 45.3568 6.29739Z\"\n        fill={color}\n      />\n      <path\n        shapeRendering=\"geometricPrecision\"\n        d=\"M78.992 28.9696C74.1062 28.9696 70.6814 24.4282 70.6814 18.1844V17.6183H84.4324C84.4324 13.3335 81.6615 8.63956 75.8693 8.63956C70.6318 8.63956 65.5949 13.747 65.5949 20.559C65.5777 22.5249 66.0439 24.4636 66.9504 26.1964C66.829 26.4634 66.6907 26.7218 66.5365 26.9703C65.4852 28.4544 64.4795 29.1689 62.9751 29.1689C60.6988 29.1689 59.6517 27.3625 59.6517 24.8862V10.8H66.2488L66.5323 9.1484H63.8794C62.3377 9.16536 60.6305 9.1484 59.6807 9.1484L59.6517 3H58.5943C58.5943 5.4 55.4902 9.1484 51.7447 9.1484H32.7251V10.2318C34.7386 10.2318 35.6967 10.3357 35.6967 11.4191C35.6651 12.0062 35.5247 12.5819 35.2828 13.1152L30.8006 24.5639L25.9645 12.954C25.7141 12.2311 25.563 11.7159 25.563 11.3555C25.563 10.323 26.5191 10.2191 28.2325 10.2191V9.13567H17V10.2191C19.0694 10.2191 19.3674 10.6431 20.3751 12.9032L28.1477 31.3229H29.8694L36.9445 13.1088C37.9792 10.5116 38.3248 10.2212 39.8748 10.2212C42.0683 10.2212 42.565 10.5095 42.565 13.0049V27.4537C42.565 29.983 42.0621 30.2395 39.7961 30.2395V31.3229H50.7224V30.2395C48.4564 30.2395 47.9536 29.983 47.9536 27.4537V10.7343H54.4017L54.2507 25.6452C54.2507 29.3088 56.9201 31.8381 60.3429 31.8381C63.2193 31.8381 65.5163 30.3307 67.1283 27.8099C67.2715 27.5903 67.4021 27.3623 67.5194 27.1272L68.0057 27.8099C69.0232 29.0852 70.3079 30.1096 71.7644 30.8069C73.221 31.5043 74.8121 31.8567 76.4198 31.8381C79.6418 31.8381 82.8162 30.142 84.78 26.8834L84.1261 26.2643C82.7686 28.1385 81.1069 28.9696 78.992 28.9696ZM75.7183 10.0325C78.3877 10.0325 79.65 12.6636 79.797 16.3272H70.7828C71.1863 12.1929 73.1067 10.0261 75.7183 10.0261V10.0325Z\"\n        fill={color}\n      />\n      <path\n        shapeRendering=\"geometricPrecision\"\n        d=\"M13.3971 29.1102C8.5113 29.1102 5.08649 24.5688 5.08649 18.325V17.7589H18.8354C18.8354 13.4741 16.0666 8.78015 10.2744 8.78015C5.03684 8.78015 0 13.8876 0 20.6996C0 27.3547 4.88369 31.9999 10.8269 31.9999C14.051 31.9999 17.2233 30.3038 19.1872 27.0452L18.5332 26.4261C17.1737 28.2791 15.512 29.1102 13.3971 29.1102ZM10.1233 10.1731C12.7907 10.1731 14.0551 12.8042 14.2021 16.4678H5.18582C5.58934 12.3335 7.50351 10.1667 10.1233 10.1667V10.1731Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const Mail = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 24;\n  const height = 24;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      fill={color}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n    >\n      <rect width=\"24\" height=\"24\" fill=\"url(#mail)\" />\n      <defs>\n        <pattern\n          id=\"mail\"\n          patternContentUnits=\"objectBoundingBox\"\n          width=\"1\"\n          height=\"1\"\n        >\n          <use xlinkHref=\"#image0_2292_47020\" transform=\"scale(0.0104167)\" />\n        </pattern>\n        <image\n          id=\"image0_2292_47020\"\n          width=\"96\"\n          height=\"96\"\n          xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QA/wD/AP+gvaeTAAADIklEQVR4nO2cvW4UMRSFPwJKJAT0RAo8QBJBBS8AHRENtDQgXoFXoIoCIiBaSmiQ6PiroQIJHgAihZ4kVGy0FLMWIWzi38n1zJxPutV6bd97dn3GM7sGIYQQQgghhBBCCCGEEEKI/1kGHgBfgR1gPPDYmdRiDVjKqKuXOeAxsFtB0rXGLrAOzCbW+EDmgPcVJNiVeEdhEZ5UkFTX4lFSpaewjJadlBgBi77izvgaAHcC24l/OQ7c9jUKKeyV/LkMlqu+BscCOtkGTuXPZZBsA2cOaxAiwNjzekgffSarPlrbjZEAxkgAY0oI8Ao4V6CfrnEWeHYUA4VsOn4B92iuffvODHAX+ElYbbKJ2f19Ai6VGLRSLgAfiKtJNrFb8F3gKXC6xOCVcBK4D/wmvh7ZpN4L2QRulJiAMdeAb6TXIZvcm1JdNWlnsrn5Z5M7gTHdMulYk+2EAC5qN+kUkzUXYAX4HjGhGk3ameyI8Dx+ALcC2mUTMkBKArWYdKzJug+Qu8tZhQCOi8DHiGTG2Jl0isl+Bi7v66cqAeCviW1FJHaUJp1ism5+J6b0V50AjnngRcD790bbJp36DT1/SJ/VCuCowaRzTNZH9QJAuknfLDD/FfJM1kcnBHAcpUnPU8ZkfXRKAGjfpHNMNuUioHMCONow6TZM1kdnBXCkmvTeNbpNk/XReQGgueJZI66AG8D1SWxEvG80GavUVVYvBHCkLCEll7AUeiUApJm0L9rcafdOAMc88DxgfF/kmqyP3grgiDVpF5uUMVkfvRcA4q5yYneyuQxCAIfPpC2euA1KAJi+07V85jw4ARwLwMtJLBjOI6s++n9APln10a+jjZEAxkgAYySAMRLAGAlgjAQwRgIYIwGMkQDGSABjJIAxEsAYCWCMBDBm2h8O9rPD4Qc2WT6UqZ0tX4OQb8BGgYkMFW/tQgR4U2AiQ+V1iU6WiPvNpqKJoGMrQ1mvIKGuxcOkSh/ALM1xvNZJdSXe0sL50bM0x/FqOTo4RjSf/OLF38sisAp8oTkX0zpp69ie1GKVgmu+EEIIIYQQQgghhBBCCCH6wx+fMaH7/+w3QQAAAABJRU5ErkJggg==\"\n        />\n      </defs>\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_AlertLine = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      onClick={props.onClick}\n    >\n      <path\n        d=\"M16 29.3333C8.63596 29.3333 2.66663 23.364 2.66663 16C2.66663 8.63599 8.63596 2.66666 16 2.66666C23.364 2.66666 29.3333 8.63599 29.3333 16C29.3333 23.364 23.364 29.3333 16 29.3333ZM16 26.6667C18.8289 26.6667 21.542 25.5428 23.5424 23.5425C25.5428 21.5421 26.6666 18.829 26.6666 16C26.6666 13.171 25.5428 10.4579 23.5424 8.45752C21.542 6.45713 18.8289 5.33332 16 5.33332C13.171 5.33332 10.4579 6.45713 8.45749 8.45752C6.4571 10.4579 5.33329 13.171 5.33329 16C5.33329 18.829 6.4571 21.5421 8.45749 23.5425C10.4579 25.5428 13.171 26.6667 16 26.6667ZM14.6666 20H17.3333V22.6667H14.6666V20ZM14.6666 9.33332H17.3333V17.3333H14.6666V9.33332Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Arrow = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    direction = 'right',\n  } = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  const rotateFromRight = (direction) => {\n    switch (direction) {\n      case 'right':\n        return 0;\n      case 'left':\n        return 180;\n      case 'down':\n        return 90;\n      case 'up':\n        return 270;\n    }\n  };\n\n  // Use ratio to calculate width and height\n  const style = {\n    transform: `rotate( ${rotateFromRight(direction)}deg)`,\n    height: `${ratio * height}px`,\n    width: `${ratio * width}px`,\n  };\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M21.5626 14.6666L14.4106 7.51458L16.296 5.62924L26.6666 15.9999L16.296 26.3706L14.4106 24.4852L21.5626 17.3332H5.33331V14.6666H21.5626Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Checkmark = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M13.3334 20.2293L25.5894 7.97202L27.476 9.85735L13.3334 24L4.84802 15.5147L6.73336 13.6293L13.3334 20.2293Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Chevron = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    direction = 'right',\n  } = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const rotateFromRight = (direction) => {\n    switch (direction) {\n      case 'right':\n        return 0;\n      case 'left':\n        return 180;\n      case 'down':\n        return 90;\n      case 'up':\n        return 270;\n    }\n  };\n\n  // Use ratio to calculate width and height\n  const style = {\n    transform: `rotate( ${rotateFromRight(direction)}deg)`,\n    height: `${ratio * height}px`,\n    width: `${ratio * width}px`,\n  };\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M17.5626 16L10.9626 9.39998L12.848 7.51465L21.3333 16L12.848 24.4853L10.9626 22.6L17.5626 16Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_CloseLine = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {\n    height: `${ratio * height}px`,\n    width: `${ratio * width}px`,\n    ...props.style,\n  };\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      onClick={props.onClick}\n    >\n      <path\n        d=\"M16 14.1146L22.6 7.51465L24.4853 9.39998L17.8853 16L24.4853 22.6L22.6 24.4853L16 17.8853L9.39998 24.4853L7.51465 22.6L14.1146 16L7.51465 9.39998L9.39998 7.51465L16 14.1146Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_EyeDrop = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 40;\n  const height = 40;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path d=\"M19 19V13H21V19H27V21H21V27H19V21H13V19H19Z\" fill=\"#101B21\" />\n      <rect\n        x=\"1.5\"\n        y=\"1.5\"\n        width=\"37\"\n        height=\"37\"\n        rx=\"18.5\"\n        stroke=\"url(#paint0_linear_7777_7262)\"\n        strokeWidth=\"3\"\n      />\n      <defs>\n        <linearGradient\n          id=\"paint0_linear_7777_7262\"\n          x1=\"20\"\n          y1=\"0\"\n          x2=\"20\"\n          y2=\"40\"\n          gradientUnits=\"userSpaceOnUse\"\n        >\n          <stop stopColor=\"#FF0000\" />\n          <stop offset=\"0.171875\" stopColor=\"#FF8A00\" />\n          <stop offset=\"0.307292\" stopColor=\"#FFE600\" />\n          <stop offset=\"0.46875\" stopColor=\"#38D600\" />\n          <stop offset=\"0.598958\" stopColor=\"#0085FF\" />\n          <stop offset=\"0.765625\" stopColor=\"#2A0CE3\" />\n          <stop offset=\"1\" stopColor=\"#EE00F3\" />\n        </linearGradient>\n      </defs>\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Font = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 12,\n    height = 18,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M7.03922 15V14.448C4.97522 14.448 4.66322 14.232 4.66322 13.2V7.824H6.79922C8.69522 7.824 8.81522 8.064 9.00722 9.552H9.43922V5.424H9.00722C8.81522 6.912 8.69522 7.176 6.79922 7.176H4.66322V1.128H6.89522C9.77522 1.128 10.6152 1.344 10.9512 4.056H11.3592L11.3112 0.456H0.583219V1.008C1.92722 1.008 2.45522 1.08 2.45522 2.232V13.224C2.45522 14.376 1.92722 14.448 0.583219 14.448V15H7.03922Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_FontSize = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 22,\n    height = 14,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M9.54813 11.5198H11.5801L7.29213 0.319824H5.11613L0.828125 11.5198H2.86013L3.80413 8.95982H8.60413L9.54813 11.5198ZM4.57213 6.86382C5.29213 4.92782 5.82013 3.40782 6.20413 1.95182C6.58813 3.40782 7.13213 4.92782 7.83613 6.86382L7.99613 7.27983H4.41213L4.57213 6.86382Z\"\n        fill={color}\n      />\n      <path\n        d=\"M19.9688 11.5198C19.5048 10.4478 19.4888 10.3038 19.4888 9.27983V5.87182C19.4888 4.19182 18.1927 3.32782 16.0647 3.32782C13.9207 3.32782 12.6247 4.15982 12.6247 5.82382H14.5608C14.5767 5.15182 15.1528 4.81582 16.0647 4.81582C17.0247 4.81582 17.5688 5.13582 17.5688 5.83982C17.5688 7.72782 12.3368 5.91982 12.3368 9.34382C12.3368 10.8798 13.4567 11.6798 14.9127 11.6798C16.1127 11.6798 17.0728 11.1358 17.5688 10.1918L18.0328 11.5198H19.9688ZM14.3047 9.11983C14.3047 7.79183 16.4167 7.88783 17.5688 7.16782V8.17583C17.5688 9.50383 16.6407 10.2238 15.6648 10.2238C14.8007 10.2238 14.3047 9.88783 14.3047 9.11983Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Info = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 14;\n  const height = 14;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      onClick={props.onClick}\n    >\n      <path\n        d=\"M7.00065 13.6668C3.31865 13.6668 0.333984 10.6822 0.333984 7.00016C0.333984 3.31816 3.31865 0.333496 7.00065 0.333496C10.6827 0.333496 13.6673 3.31816 13.6673 7.00016C13.6673 10.6822 10.6827 13.6668 7.00065 13.6668ZM7.00065 12.3335C8.41514 12.3335 9.77169 11.7716 10.7719 10.7714C11.7721 9.7712 12.334 8.41465 12.334 7.00016C12.334 5.58567 11.7721 4.22912 10.7719 3.22893C9.77169 2.22873 8.41514 1.66683 7.00065 1.66683C5.58616 1.66683 4.22961 2.22873 3.22941 3.22893C2.22922 4.22912 1.66732 5.58567 1.66732 7.00016C1.66732 8.41465 2.22922 9.7712 3.22941 10.7714C4.22961 11.7716 5.58616 12.3335 7.00065 12.3335V12.3335ZM6.33398 3.66683H7.66732V5.00016H6.33398V3.66683ZM6.33398 6.3335H7.66732V10.3335H6.33398V6.3335Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Keyboard = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 18,\n    height = 18,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M15.75 14.625H2.25C1.95163 14.625 1.66548 14.5065 1.4545 14.2955C1.24353 14.0845 1.125 13.7984 1.125 13.5V5.625C1.125 5.32663 1.24353 5.04048 1.4545 4.82951C1.66548 4.61853 1.95163 4.5 2.25 4.5H15.75C16.0484 4.5 16.3345 4.61853 16.5455 4.82951C16.7565 5.04048 16.875 5.32663 16.875 5.625V13.5C16.875 13.7984 16.7565 14.0845 16.5455 14.2955C16.3345 14.5065 16.0484 14.625 15.75 14.625ZM2.25 5.625V13.5H15.75V5.625H2.25Z\"\n        fill={color}\n      />\n      <path\n        d=\"M5.625 11.25H11.8125V12.375H5.625V11.25ZM3.375 6.75H4.5V7.875H3.375V6.75ZM5.625 6.75H6.75V7.875H5.625V6.75ZM7.875 6.75H9V7.875H7.875V6.75ZM10.125 6.75H11.25V7.875H10.125V6.75ZM3.375 11.25H4.5V12.375H3.375V11.25ZM3.375 9H4.5V10.125H3.375V9ZM5.625 9H6.75V10.125H5.625V9ZM7.875 9H9V10.125H7.875V9ZM12.375 6.75H14.625V7.875H12.375V6.75ZM12.375 9H14.625V10.125H12.375V9ZM10.125 9H11.25V10.125H10.125V9ZM12.9375 11.25H14.625V12.375H12.9375V11.25Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_LeftAlign = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 32,\n    height = 32,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 1C0.5 0.447715 0.947715 0 1.5 0H15.5C16.0523 0 16.5 0.447715 16.5 1C16.5 1.55228 16.0523 2 15.5 2H1.5C0.947715 2 0.5 1.55228 0.5 1Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 5C0.5 4.44772 0.947715 4 1.5 4H7.5C8.05228 4 8.5 4.44772 8.5 5C8.5 5.55228 8.05228 6 7.5 6H1.5C0.947715 6 0.5 5.55228 0.5 5Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 9C0.5 8.44772 0.947715 8 1.5 8H15.5C16.0523 8 16.5 8.44772 16.5 9C16.5 9.55228 16.0523 10 15.5 10H1.5C0.947715 10 0.5 9.55228 0.5 9Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 13C0.5 12.4477 0.947715 12 1.5 12H7.5C8.05228 12 8.5 12.4477 8.5 13C8.5 13.5523 8.05228 14 7.5 14H1.5C0.947715 14 0.5 13.5523 0.5 13Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_LineHeight = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 16,\n    height = 16,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M5.45977 3.15528C5.16688 3.42819 4.69201 3.42819 4.39911 3.15528L3.74011 2.54124L3.74011 5.55627C3.74011 5.88709 3.40433 6.15527 2.99011 6.15527C2.5759 6.15527 2.24011 5.88709 2.24011 5.55627L2.24011 2.54124L1.58111 3.15528C1.28822 3.42819 0.813344 3.42819 0.520451 3.15528C0.227558 2.88237 0.227558 2.43989 0.520451 2.16698L2.45666 0.362871L2.45977 0.359956C2.60794 0.2219 2.80267 0.153682 2.99686 0.155302C3.18655 0.15688 3.37572 0.225098 3.52045 0.359956L3.52354 0.362853L5.45977 2.16698C5.75267 2.43989 5.75267 2.88237 5.45977 3.15528ZM2.24011 13.2839L2.24011 10.0481C2.24011 9.69309 2.5759 9.40527 2.99011 9.40527C3.40433 9.40527 3.74011 9.69309 3.74011 10.0481L3.74011 13.2839L4.39911 12.6249C4.69201 12.332 5.16688 12.332 5.45977 12.6249C5.75267 12.9178 5.75267 13.3927 5.45977 13.6856L3.52355 15.6218L3.52045 15.6249C3.37343 15.772 3.18056 15.8452 2.98786 15.8446C2.79667 15.844 2.60565 15.7708 2.45977 15.6249L2.45667 15.6218L0.520451 13.6856C0.227558 13.3927 0.227558 12.9178 0.520451 12.6249C0.813344 12.332 1.28822 12.332 1.58111 12.6249L2.24011 13.2839ZM9.05078 2.15527C8.63657 2.15527 8.30078 2.49106 8.30078 2.90527C8.30078 3.31949 8.63657 3.65527 9.05078 3.65527H17.5508C17.965 3.65527 18.3008 3.31949 18.3008 2.90527C18.3008 2.49106 17.965 2.15527 17.5508 2.15527H9.05078ZM8.30078 7.90527C8.30078 7.49106 8.63657 7.15527 9.05078 7.15527H17.5508C17.965 7.15527 18.3008 7.49106 18.3008 7.90527C18.3008 8.31949 17.965 8.65527 17.5508 8.65527H9.05078C8.63657 8.65527 8.30078 8.31949 8.30078 7.90527ZM9.05078 12.1553C8.63657 12.1553 8.30078 12.4911 8.30078 12.9053C8.30078 13.3195 8.63657 13.6553 9.05078 13.6553H17.5508C17.965 13.6553 18.3008 13.3195 18.3008 12.9053C18.3008 12.4911 17.965 12.1553 17.5508 12.1553H9.05078Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_MiddleAlign = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 32,\n    height = 32,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 1C0.5 0.447715 0.947715 0 1.5 0H15.5C16.0523 0 16.5 0.447715 16.5 1C16.5 1.55228 16.0523 2 15.5 2H1.5C0.947715 2 0.5 1.55228 0.5 1Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M4.5 5C4.5 4.44772 4.94772 4 5.5 4H11.5C12.0523 4 12.5 4.44772 12.5 5C12.5 5.55228 12.0523 6 11.5 6H5.5C4.94772 6 4.5 5.55228 4.5 5Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 9C0.5 8.44772 0.947715 8 1.5 8H15.5C16.0523 8 16.5 8.44772 16.5 9C16.5 9.55228 16.0523 10 15.5 10H1.5C0.947715 10 0.5 9.55228 0.5 9Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M4.5 13C4.5 12.4477 4.94772 12 5.5 12H11.5C12.0523 12 12.5 12.4477 12.5 13C12.5 13.5523 12.0523 14 11.5 14H5.5C4.94772 14 4.5 13.5523 4.5 13Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Minus = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M0.333374 14.6667H25.3334V17.3333H6.66669V14.6667Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Plus = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M14.6667 14.6667V6.66666H17.3334V14.6667H25.3334V17.3333H17.3334V25.3333H14.6667V17.3333H6.66669V14.6667H14.6667Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_QuestionCircleUnfilled = (props) => {\n  const {color = charcoal, ratio = 1} = props;\n\n  // default dimensions\n  const width = 20;\n  const height = 20;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M10 20C4.47715 20 0 15.5228 0 10C0 4.47715 4.47715 0 10 0C15.5228 0 20 4.47715 20 10C20 15.5228 15.5228 20 10 20ZM10 18.1818C14.5187 18.1818 18.1818 14.5187 18.1818 10C18.1818 5.48131 14.5187 1.81818 10 1.81818C5.48131 1.81818 1.81818 5.48131 1.81818 10C1.81818 14.5187 5.48131 18.1818 10 18.1818ZM10.0003 14.544C9.49806 14.544 9.09091 14.1369 9.09091 13.6349C9.09091 13.1328 9.49806 12.7258 10.0003 12.7258C10.5025 12.7258 10.9097 13.1328 10.9097 13.6349C10.9097 14.1369 10.5025 14.544 10.0003 14.544ZM10.9091 11.8182H9.09091C9.09091 10.2712 9.65871 9.6088 10.9571 8.95961C11.7042 8.58607 11.8182 8.45305 11.8182 7.72727C11.8182 6.86946 11.1611 6.36364 10 6.36364C8.99585 6.36364 8.18182 7.17766 8.18182 8.18182H6.36364C6.36364 6.17351 7.99169 4.54545 10 4.54545C12.0767 4.54545 13.6364 5.74603 13.6364 7.72727C13.6364 9.27423 13.0686 9.93666 11.7702 10.5858C11.0231 10.9594 10.9091 11.0924 10.9091 11.8182Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_RightAlign = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 32,\n    height = 32,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 1C0.5 0.447715 0.947715 0 1.5 0H15.5C16.0523 0 16.5 0.447715 16.5 1C16.5 1.55228 16.0523 2 15.5 2H1.5C0.947715 2 0.5 1.55228 0.5 1Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M8.5 5C8.5 4.44772 8.94772 4 9.5 4H15.5C16.0523 4 16.5 4.44772 16.5 5C16.5 5.55228 16.0523 6 15.5 6H9.5C8.94772 6 8.5 5.55228 8.5 5Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M0.5 9C0.5 8.44772 0.947715 8 1.5 8H15.5C16.0523 8 16.5 8.44772 16.5 9C16.5 9.55228 16.0523 10 15.5 10H1.5C0.947715 10 0.5 9.55228 0.5 9Z\"\n        fill={color}\n      />\n      <path\n        style={{\n          fillRule: 'evenodd',\n          clipRule: 'evenodd',\n        }}\n        d=\"M8.5 13C8.5 12.4477 8.94772 12 9.5 12H15.5C16.0523 12 16.5 12.4477 16.5 13C16.5 13.5523 16.0523 14 15.5 14H9.5C8.94772 14 8.5 13.5523 8.5 13Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_Rotation = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 41;\n  const height = 40;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      onClick={props.onClick}\n    >\n      <rect x={1} y={0.5} width={39} height={39} rx={7.5} fill=\"white\" />\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M15 13.875C15.3452 13.875 15.625 14.1548 15.625 14.5V15.978C15.7767 15.839 15.9426 15.6955 16.1221 15.552C17.1429 14.7353 18.6529 13.875 20.5 13.875C22.1245 13.875 23.6824 14.5203 24.831 15.669C25.9797 16.8176 26.625 18.3755 26.625 20C26.625 21.6245 25.9797 23.1824 24.831 24.331C23.6824 25.4797 22.1245 26.125 20.5 26.125C18.7982 26.125 17.2754 25.3868 16.1829 24.3605C15.1007 23.3438 14.375 21.9794 14.375 20.66C14.375 20.3148 14.6548 20.035 15 20.035C15.3452 20.035 15.625 20.3148 15.625 20.66C15.625 21.5406 16.1304 22.5962 17.0388 23.4495C17.9368 24.2932 19.164 24.875 20.5 24.875C21.7929 24.875 23.0329 24.3614 23.9471 23.4471C24.8614 22.5329 25.375 21.2929 25.375 20C25.375 18.7071 24.8614 17.4671 23.9471 16.5529C23.0329 15.6386 21.7929 15.125 20.5 15.125C19.0471 15.125 17.8071 15.8047 16.9029 16.528C16.7227 16.6722 16.5579 16.8165 16.4096 16.955H17.64C17.9852 16.955 18.265 17.2348 18.265 17.58C18.265 17.9252 17.9852 18.205 17.64 18.205H15.0073C14.9855 18.2053 14.9636 18.2044 14.9417 18.2023C14.7793 18.1873 14.6348 18.1101 14.5324 17.9947C14.4345 17.8844 14.375 17.7391 14.375 17.58V14.5C14.375 14.1548 14.6548 13.875 15 13.875Z\"\n        fill={color}\n      />\n      <rect x={1} y={0.5} width={39} height={39} rx={7.5} stroke=\"#E1E3E6\" />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {fog} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_SocialFb = (props) => {\n  const {color = fog, ratio = 1, className} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        d=\"M16 2.66663C8.636 2.66663 2.66666 8.63596 2.66666 16C2.66666 22.6546 7.54266 28.1706 13.9173 29.172V19.8533H10.5307V16H13.9173V13.0626C13.9173 9.72129 15.9067 7.87596 18.9533 7.87596C20.412 7.87596 21.9373 8.13596 21.9373 8.13596V11.416H20.2573C18.6 11.416 18.084 12.444 18.084 13.4986V16H21.7813L21.1907 19.8533H18.084V29.172C24.4573 28.172 29.3333 22.6533 29.3333 16C29.3333 8.63596 23.364 2.66663 16 2.66663Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {fog} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_SocialIg = (props) => {\n  const {color = fog, ratio = 1, className} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        d=\"M16 2.66663C19.6227 2.66663 20.0747 2.67996 21.496 2.74663C22.916 2.81329 23.8827 3.03596 24.7333 3.36663C25.6133 3.70529 26.3547 4.16396 27.096 4.90396C27.774 5.57049 28.2986 6.37674 28.6333 7.26663C28.9627 8.11596 29.1867 9.08396 29.2533 10.504C29.316 11.9253 29.3333 12.3773 29.3333 16C29.3333 19.6226 29.32 20.0746 29.2533 21.496C29.1867 22.916 28.9627 23.8826 28.6333 24.7333C28.2996 25.6237 27.7748 26.4301 27.096 27.096C26.4293 27.7737 25.6231 28.2983 24.7333 28.6333C23.884 28.9626 22.916 29.1866 21.496 29.2533C20.0747 29.316 19.6227 29.3333 16 29.3333C12.3773 29.3333 11.9253 29.32 10.504 29.2533C9.084 29.1866 8.11734 28.9626 7.26667 28.6333C6.37644 28.2993 5.57004 27.7746 4.904 27.096C4.22588 26.4295 3.70125 25.6232 3.36667 24.7333C3.03601 23.884 2.81334 22.916 2.74667 21.496C2.68401 20.0746 2.66667 19.6226 2.66667 16C2.66667 12.3773 2.68001 11.9253 2.74667 10.504C2.81334 9.08263 3.03601 8.11729 3.36667 7.26663C3.70032 6.3762 4.22508 5.56972 4.904 4.90396C5.57023 4.2256 6.37658 3.70093 7.26667 3.36663C8.11734 3.03596 9.08267 2.81329 10.504 2.74663C11.9253 2.68396 12.3773 2.66663 16 2.66663ZM16 9.33329C14.2319 9.33329 12.5362 10.0357 11.286 11.2859C10.0357 12.5362 9.33334 14.2318 9.33334 16C9.33334 17.7681 10.0357 19.4638 11.286 20.714C12.5362 21.9642 14.2319 22.6666 16 22.6666C17.7681 22.6666 19.4638 21.9642 20.714 20.714C21.9643 19.4638 22.6667 17.7681 22.6667 16C22.6667 14.2318 21.9643 12.5362 20.714 11.2859C19.4638 10.0357 17.7681 9.33329 16 9.33329ZM24.6667 8.99996C24.6667 8.55793 24.4911 8.13401 24.1785 7.82145C23.866 7.50889 23.442 7.33329 23 7.33329C22.558 7.33329 22.1341 7.50889 21.8215 7.82145C21.5089 8.13401 21.3333 8.55793 21.3333 8.99996C21.3333 9.44199 21.5089 9.86591 21.8215 10.1785C22.1341 10.491 22.558 10.6666 23 10.6666C23.442 10.6666 23.866 10.491 24.1785 10.1785C24.4911 9.86591 24.6667 9.44199 24.6667 8.99996ZM16 12C17.0609 12 18.0783 12.4214 18.8284 13.1715C19.5786 13.9217 20 14.9391 20 16C20 17.0608 19.5786 18.0782 18.8284 18.8284C18.0783 19.5785 17.0609 20 16 20C14.9391 20 13.9217 19.5785 13.1716 18.8284C12.4214 18.0782 12 17.0608 12 16C12 14.9391 12.4214 13.9217 13.1716 13.1715C13.9217 12.4214 14.9391 12 16 12Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {fog} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_SocialPin = (props) => {\n  const {color = fog, ratio = 1, className} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        d=\"M17.8266 2.79206C14.6363 2.3532 11.395 3.08346 8.70107 4.84801C6.00718 6.61255 4.0427 9.2922 3.17037 12.3922C2.29804 15.4921 2.57678 18.803 3.95512 21.7135C5.33346 24.6239 7.71831 26.9374 10.6693 28.2267C10.5895 27.2025 10.6627 26.1721 10.8866 25.1694C11.1333 24.0507 12.6146 17.8854 12.6146 17.8854C12.3197 17.2242 12.1722 16.5067 12.1826 15.7827C12.1826 13.8027 13.3253 12.3254 14.7466 12.3254C15.002 12.3217 15.2551 12.373 15.4889 12.4758C15.7226 12.5787 15.9315 12.7307 16.1012 12.9214C16.271 13.1122 16.3977 13.3373 16.4727 13.5814C16.5477 13.8255 16.5693 14.0829 16.536 14.3361C16.536 15.5361 15.7653 17.3521 15.3626 19.0561C15.2831 19.3686 15.278 19.6954 15.3479 20.0102C15.4178 20.325 15.5606 20.619 15.765 20.8685C15.9693 21.118 16.2294 21.316 16.5243 21.4465C16.8192 21.5771 17.1406 21.6365 17.4626 21.6201C19.9933 21.6201 21.6893 18.3787 21.6893 14.5521C21.6893 11.6187 19.7466 9.4214 16.1653 9.4214C15.3085 9.3881 14.4538 9.52929 13.6532 9.8364C12.8526 10.1435 12.1228 10.6101 11.508 11.2079C10.8933 11.8057 10.4064 12.5222 10.0771 13.3139C9.74769 14.1056 9.58265 14.956 9.59197 15.8134C9.55379 16.7645 9.86064 17.6973 10.456 18.4401C10.5672 18.5231 10.6484 18.6401 10.6874 18.7733C10.7264 18.9065 10.7209 19.0488 10.672 19.1787C10.6106 19.4241 10.456 20.0094 10.3946 20.2241C10.3819 20.2969 10.3522 20.3656 10.308 20.4249C10.2638 20.4841 10.2063 20.5321 10.1401 20.5651C10.074 20.598 10.001 20.615 9.92711 20.6146C9.8532 20.6142 9.78042 20.5964 9.71463 20.5627C7.8693 19.8241 6.99997 17.7934 6.99997 15.4747C6.99997 11.6787 10.1786 7.13473 16.5386 7.13473C21.6 7.13473 24.9653 10.8374 24.9653 14.7974C24.9653 20.0094 22.0626 23.9281 17.7733 23.9281C17.1322 23.9486 16.4963 23.8071 15.9244 23.5167C15.3525 23.2263 14.863 22.7964 14.5013 22.2667C14.5013 22.2667 13.7306 25.3547 13.5786 25.9387C13.2684 26.9477 12.8105 27.9051 12.22 28.7801C13.4506 29.1534 14.7293 29.3401 16.0146 29.3347C17.7661 29.3361 19.5006 28.992 21.1189 28.3222C22.7371 27.6523 24.2074 26.6698 25.4454 25.4309C26.6834 24.192 27.6649 22.7211 28.3336 21.1023C29.0024 19.4836 29.3453 17.7488 29.3426 15.9974C29.341 12.7774 28.1743 9.66672 26.0581 7.23977C23.9419 4.81281 21.0191 3.23348 17.8293 2.7934L17.8266 2.79206Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {fog} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_SocialTwi = (props) => {\n  const {color = fog, ratio = 1, className} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        d=\"M29.5493 7.54124C28.5314 7.99149 27.4519 8.2872 26.3467 8.41857C27.5117 7.72181 28.3836 6.62525 28.8 5.33324C27.7067 5.9839 26.508 6.4399 25.2587 6.68657C24.4195 5.78867 23.3071 5.19319 22.0946 4.99268C20.8821 4.79218 19.6372 4.99789 18.5537 5.57784C17.4701 6.15779 16.6085 7.07948 16.1028 8.19963C15.5971 9.31977 15.4757 10.5756 15.7573 11.7719C13.5401 11.6608 11.3711 11.0846 9.39104 10.0808C7.41098 9.07698 5.66416 7.66797 4.26399 5.94524C3.76838 6.7965 3.50793 7.7642 3.50932 8.74924C3.50932 10.6826 4.49332 12.3906 5.98932 13.3906C5.104 13.3627 4.23817 13.1236 3.46399 12.6932V12.7626C3.46426 14.0502 3.90981 15.2981 4.72512 16.2946C5.54042 17.2912 6.6753 17.9752 7.93732 18.2306C7.11548 18.4533 6.25373 18.4861 5.41732 18.3266C5.77315 19.4349 6.46666 20.4042 7.40078 21.0987C8.33489 21.7933 9.46283 22.1783 10.6267 22.1999C9.46996 23.1083 8.14556 23.7799 6.72916 24.1761C5.31277 24.5724 3.83216 24.6856 2.37199 24.5092C4.92092 26.1485 7.88812 27.0187 10.9187 27.0159C21.176 27.0159 26.7853 18.5186 26.7853 11.1492C26.7853 10.9092 26.7787 10.6666 26.768 10.4292C27.8598 9.64013 28.8021 8.66259 29.5507 7.54257L29.5493 7.54124Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {fog} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_SocialYt = (props) => {\n  const {color = fog, ratio = 1, className} = props;\n\n  // default dimensions\n  const width = 32;\n  const height = 32;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      className={className}\n    >\n      <path\n        d=\"M28.724 8.66404C29.3333 11.04 29.3333 16 29.3333 16C29.3333 16 29.3333 20.96 28.724 23.336C28.3853 24.6494 27.3947 25.6827 26.14 26.032C23.8613 26.6667 16 26.6667 16 26.6667C16 26.6667 8.14267 26.6667 5.86 26.032C4.6 25.6774 3.61067 24.6454 3.27601 23.336C2.66667 20.96 2.66667 16 2.66667 16C2.66667 16 2.66667 11.04 3.27601 8.66404C3.61467 7.35071 4.60534 6.31737 5.86 5.96804C8.14267 5.33337 16 5.33337 16 5.33337C16 5.33337 23.8613 5.33337 26.14 5.96804C27.4 6.32271 28.3893 7.35471 28.724 8.66404ZM13.3333 20.6667L21.3333 16L13.3333 11.3334V20.6667Z\"\n        fill={color}\n      />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_TextColor = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 20,\n    height = 20,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M13.7631 13.3002H16.0491L11.2251 0.700195H8.77712L3.95312 13.3002H6.23913L7.30113 10.4202H12.7011L13.7631 13.3002ZM8.16512 8.0622C8.97512 5.8842 9.56913 4.1742 10.0011 2.5362C10.4331 4.1742 11.0451 5.8842 11.8371 8.0622L12.0171 8.5302H7.98513L8.16512 8.0622Z\"\n        fill=\"#101B21\"\n      />\n      <rect y=\"15.3003\" width=\"20\" height=\"4\" rx=\"2\" fill={color} />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_TextFormat = (props) => {\n  const {\n    color = charcoal,\n    className = '',\n    ratio = 1,\n    width = 28.79,\n    height = 11.2,\n  } = props;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      style={style}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n    >\n      <path\n        d=\"M5.65703 11.5999H6.92703L4.24703 4.5999H2.88703L0.207031 11.5999H1.47703L2.06703 9.9999H5.06703L5.65703 11.5999ZM2.54703 8.6899C2.99703 7.4799 3.32703 6.5299 3.56703 5.6199C3.80703 6.5299 4.14703 7.4799 4.58703 8.6899L4.68703 8.9499H2.44703L2.54703 8.6899Z\"\n        fill=\"black\"\n      />\n      <path\n        d=\"M15.9619 11.5999H17.9939L13.7059 0.399902H11.5299L7.24192 11.5999H9.27392L10.2179 9.0399H15.0179L15.9619 11.5999ZM10.9859 6.9439C11.7059 5.0079 12.2339 3.4879 12.6179 2.0319C13.0019 3.4879 13.5459 5.0079 14.2499 6.9439L14.4099 7.3599H10.8259L10.9859 6.9439Z\"\n        fill=\"black\"\n      />\n      <rect\n        x=\"18.9961\"\n        y=\"1.5\"\n        width=\"10\"\n        height=\"1.5\"\n        rx=\"0.75\"\n        fill={color}\n      />\n      <rect x=\"18.9961\" y=\"4\" width=\"6\" height=\"1.5\" rx=\"0.75\" fill={color} />\n      <rect x=\"18.9961\" y=\"6.5\" width=\"8\" height=\"1.5\" rx=\"0.75\" fill={color} />\n      <rect x=\"18.9961\" y=\"9\" width=\"5\" height=\"1.5\" rx=\"0.75\" fill={color} />\n    </svg>\n  );\n};\n","import * as React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PB_UploadSquare = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 41;\n  const height = 41;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      viewBox={`0 0 ${width} ${height}`}\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={style}\n      className={className}\n      {...props}\n    >\n      <rect x={1} y={0.5} width={40} height={40} rx={7.5} fill=\"white\" />\n      <path\n        d=\"M14.5 24.6673H26.5V26.0007H14.5V24.6673ZM21.1667 15.886V23.334H19.8333V15.886L15.786 19.934L14.8433 18.9913L20.5 13.334L26.1567 18.9907L25.214 19.9333L21.1667 15.8873V15.886Z\"\n        fill={color}\n      />\n      <rect x={1} y={0.5} width={40} height={40} rx={7.5} stroke=\"#E1E3E6\" />\n    </svg>\n  );\n};\n","import React from 'react';\nimport {charcoal} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const PostStamp = (props) => {\n  const {color = charcoal, className = '', ratio = 1} = props;\n\n  // default dimensions\n  const width = 24;\n  const height = 24;\n\n  // Use ratio to calculate width and height\n  const style = {height: `${ratio * height}px`, width: `${ratio * width}px`};\n\n  return (\n    <svg\n      width={width}\n      height={height}\n      viewBox={`0 0 ${width} ${height}`}\n      style={style}\n      fill={color}\n      className={className}\n      xmlns=\"http://www.w3.org/2000/svg\"\n      xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n    >\n      <rect width=\"24\" height=\"24\" fill=\"url(#postStamp)\" />\n      <defs>\n        <pattern\n          id=\"postStamp\"\n          patternContentUnits=\"objectBoundingBox\"\n          width=\"1\"\n          height=\"1\"\n        >\n          <use xlinkHref=\"#image0_2292_47024\" transform=\"scale(0.0104167)\" />\n        </pattern>\n        <image\n          id=\"image0_2292_47024\"\n          width=\"96\"\n          height=\"96\"\n          xlinkHref=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABmJLR0QA/wD/AP+gvaeTAAABG0lEQVR4nO3dQQ6CMBRAQTTe/8q6Z2HSUHihzBygIi+A8BPZNgAA4GleJ6z5nbwNo+udvf7UffaeuRjjBIgJEJtxPjt6jr67Q/vQERATICZATICYADEBYgLEPsFnnvH8aaZL72scATEBYgLEZlwD9uf01Z8NmQesRICYADEBYgLEBIgJEJtxH7D67/69/fc1E74zAWICxASICRATICZATICYADEBYgLEzITHmQmvRICYADEBYgLEBIgJEDMTHmcmvBIBYgLEBIgJEBMgJkBMgJgAMQFiAsTMhMeZCa9EgJgAMQFiAsQEiAkQMxMeZya8EgFiAsSK/w192jXjL0dATICYADEBYgLEBIgJEPMuSe+SfDYBYgIAAABc7AdEkBKtrp2C1QAAAABJRU5ErkJggg==\"\n        />\n      </defs>\n    </svg>\n  );\n};\n","import XDate from 'xdate';\nimport history from '../create/history';\n\nexport function pluralize(label, count) {\n  label = count === 1 ? label : `${label}s`;\n  return `${count} ${label}`;\n}\n\nexport function capitalizeFirstLetter(string) {\n  return string.charAt(0).toUpperCase() + string.slice(1);\n}\n\nexport function insertAfter(newNode, node) {\n  node.parentNode.insertBefore(newNode, node.nextSibling);\n}\n\nexport function insertBefore(newNode, node) {\n  node.parentNode.insertBefore(newNode, node);\n}\n\nexport function htmlFromString(string) {\n  let div = document.createElement('div');\n  div.innerHTML = string;\n  return div.firstChild;\n}\n\nexport function isEmpty(obj) {\n  return Object.keys(obj).length === 0;\n}\n\n// open the specified url in a popup window, with optional\n// umm, options\nexport function popupWindow(url, options = null) {\n  const defaultOptions = {\n    width: 640,\n    height: 320,\n    resizable: 'yes',\n    scrollbars: 'no',\n    toolbar: 'no',\n    dependent: 'no',\n    window_name: 'DependentWindow',\n    location_bar: 'no',\n    status_bar: 'no',\n    align: 'topcenter',\n  };\n\n  const opts = Object.assign({}, defaultOptions, options || {});\n  let left_position = 1;\n  let top_position = 1;\n\n  if (opts.align === 'center') {\n    left_position = screen.width ? (screen.width - opts.width) / 2 : 0;\n    top_position = screen.height ? (screen.height - opts.height) / 2 : 0;\n  } else if (opts.align === 'topright') {\n    left_position = screen.width ? screen.width - opts.width : 0;\n    top_position = 1;\n  } else if (opts.align === 'topcenter') {\n    left_position = screen.width ? (screen.width - opts.width) / 2 : 0;\n    top_position = 1;\n  }\n\n  let align_value = `top=${top_position},left=${left_position}`;\n  let win = eval(\n    `window.open(url, '${opts.window_name}','width=${opts.width},height=${opts.height},resizable=${opts.resizable},scrollbars=` +\n      opts.scrollbars +\n      ',toolbar=' +\n      opts.toolbar +\n      ',dependent=' +\n      opts.dependent +\n      `,screenX=1,screenY=1,${align_value},location=${opts.location_bar},status=${opts.status_bar}')`\n  );\n  win.focus();\n}\n\nconst MAX_EMAIL_LENGTH = 254;\n\n/**\n * valid_email(email)\n *\n * - says whether the provided email address is valid or not, and if not,\n *   why\n * - returns an Object with three attributes:\n *   {\n *      is_valid: <boolean>,\n *      error_code: <string>\n *      error_message: <string>\n *   }\n *  - possible error codes (strings):\n *    - 'email_empty'\n *    - 'email_invalid'\n *    - 'email_too_long'\n *  - callers can use those error codes to provide their own,\n *    context-specific error messaging\n *\n **/\nexport function valid_email(email) {\n  if (!Boolean(email)) {\n    return {\n      is_valid: false,\n      error_code: 'email_empty',\n      error_message: 'Email address is required',\n    };\n  }\n\n  const email_invalid_message = 'The email address is invalid';\n  const ret_email_invalid = {\n    is_valid: false,\n    error_code: 'email_invalid',\n    error_message: email_invalid_message,\n  };\n\n  // W3C HTML5 Validation\n  if (\n    !/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i.test(\n      email\n    )\n  ) {\n    return ret_email_invalid;\n  }\n\n  // can't start with a dash\n  if (/^\\-/i.test(email)) {\n    return ret_email_invalid;\n  }\n\n  // require a tld\n  if (email.split('@')[1].split('.').length < 2) {\n    return ret_email_invalid;\n  }\n\n  if (email.length > MAX_EMAIL_LENGTH) {\n    return {\n      is_valid: false,\n      error_code: 'email_too_long',\n      error_message: `The email address is too long. Max length is ${MAX_EMAIL_LENGTH} characters.`,\n    };\n  }\n\n  if (email.search(/\\.\\./g) != -1) {\n    return {\n      is_valid: false,\n      error_code: 'two_consecutive_dots_not_allowed',\n      error_message: `Two consecutive dots are not allowed in an email address.`,\n    };\n  }\n\n  if (email.search(/.*\\.@/g) != -1) {\n    return {\n      is_valid: false,\n      error_code: 'cannot_end_with_period',\n      error_message: `Email address cannot end with a dot.`,\n    };\n  }\n\n  if (\n    [\n      'abuse@evite.com',\n      'postmaster@evite.com',\n      'hostmaster@evite.com',\n      'webmaster@evite.com',\n    ].includes(email.toLowerCase())\n  ) {\n    return {\n      is_valid: false,\n      error_code: 'not_valid_email_for_guest',\n      error_message: `Email address cannot be used`,\n    };\n  }\n  if ((email.match(/.*@.*\\.com.com$/g) || []).length > 1) {\n    return {\n      is_valid: false,\n      error_code: 'cannot_have_more_than_one_dot_com',\n      error_message: `Email address cannot have more than one .com parts`,\n    };\n  }\n\n  return {is_valid: true, error_code: '', error_message: ''};\n}\n\n/**\n * parse_us_phone_number(phone_number_text)\n *\n * (also works for canadian phone numbers)\n *\n * - pulls out a 10-digit number sequence (string) from the text entered,\n *   if possible\n * - if an 11-digit sequence is found and the first is a 1 (old school\n *   for \"long distance\"), the first digit (1) is discarded\n * - returns an Object with three attributes:\n *   {\n *      is_valid: <boolean>,\n *      formatted: <string>\n *      digits: <string>\n *   }\n *\n * Examples:\n * - parse_us_phone_number('  310.123-4567 ') returns:\n *   {\n *      \"is_valid\": true,\n *      \"formatted\": \"(310) 123-4567\",\n *      \"digits\": \"3101234567\"\n *   }\n * - parse_us_phone_number('3456 tom ugh') returns:\n *   {\n *      \"is_valid\": false,\n *      \"formatted\": \"\",\n *      \"digits\": \"3456\"\n *   }\n *\n **/\nexport function parse_us_phone_number(phone_number_text) {\n  let digits = _get_digits_from(phone_number_text);\n  const is_standard_length = digits.length === 10;\n  const is_1_prefixed_standard_length =\n    digits.length === 11 && digits.charAt(0) === '1';\n  if (\n    !(is_standard_length || is_1_prefixed_standard_length) ||\n    phone_number_text.indexOf('@') > 0\n  ) {\n    return {\n      is_valid: false,\n      formatted: '',\n      digits,\n    };\n  }\n  if (is_1_prefixed_standard_length) {\n    digits = digits.slice(1, 11); // toss the leading 1\n  }\n  // TODO should this also make sure a 10-digit digit sequence is a valid\n  // phone number, or is that overkill?\n  return {\n    is_valid: true,\n    formatted: _format_to_us_phone_number(digits),\n    digits,\n  };\n}\n\nexport function normalize_phone_number(phone_number_string) {\n  // Returns the original string if it doesn't validate\n  let parsed = parse_us_phone_number(phone_number_string);\n  if (parsed.is_valid) return '+1' + parsed.digits;\n  return phone_number_string;\n}\n\n// return just the digit characters from the given string\nexport function _get_digits_from(string_with_digits) {\n  const allDigitChars = string_with_digits.match(/\\d+/g) || [];\n  return allDigitChars.join('');\n}\n\nexport function pretty_format_phone_number(phone_digits_string) {\n  // Returns a pretty formatted phone number, or the original if it is not a normalized phone number\n  if (!phone_digits_string) return phone_digits_string;\n  let digits = phone_digits_string.trim();\n  if (digits[0] === '+') digits = digits.slice(1);\n  if (digits[0] === '1' && digits.length === 11) digits = digits.slice(1);\n  if (digits.match(/\\D/) || digits.length !== 10)\n    // Not a proper phone number, so return the original string\n    return phone_digits_string;\n  return _format_to_us_phone_number(digits);\n}\n\n// Ex: \"3101234567\" ==> \"(310) 123-4567\"\nfunction _format_to_us_phone_number(digits) {\n  return (\n    '(' +\n    digits.slice(0, 3) +\n    ') ' +\n    digits.slice(3, 6) +\n    '-' +\n    digits.slice(6, 10)\n  );\n}\n\nexport function getURLParameter(name) {\n  // mocks\n  let search = window.mock_location_search || window.location.search;\n  const regex = new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)');\n  let matches = regex.exec(search) || [null, ''];\n  let data = decodeURIComponent(matches[1].replace(/\\+/g, '%20'));\n  if (data) return data;\n  return null;\n}\n\n/**\n * checks if the url contains a certain string\n * @param url\n * @param str\n */\nexport function hasStringInUrl(url, str) {\n  const urlArr = url.split('/');\n  if (urlArr.length) {\n    return urlArr.includes(str);\n  }\n  return false;\n}\n\n/**\n * stolen from the plugin jquery.parseParams\n *\n * @param query the url query (minus the ?)\n * @returns object of url parameters\n */\nexport function parseParams(query) {\n  const re = /([^&=]+)=?([^&]*)/g;\n  const decodeRE = /\\+/g; // Regex for replacing addition symbol with a space\n  function decode(str) {\n    return decodeURIComponent(str.replace(decodeRE, ' '));\n  }\n\n  let params = {},\n    e;\n  while ((e = re.exec(query))) {\n    let k = decode(e[1]),\n      v = decode(e[2]);\n    if (k.substring(k.length - 2) === '[]') {\n      k = k.substring(0, k.length - 2);\n    }\n    (params[k] || (params[k] = [])).push(v);\n  }\n  for (let key in params) {\n    if (params[key].length === 1) {\n      params[key] = params[key][0];\n    }\n  }\n  return params;\n}\n\nexport function stringifyParams(params) {\n  let paramList = [];\n  for (let key in params) {\n    if (params.hasOwnProperty(key)) {\n      if (typeof params[key] == 'object') {\n        for (let i = 0; i < params[key].length; ++i) {\n          let value = encodeURIComponent(params[key][i]);\n          paramList.push(`${key}=${value}`);\n        }\n      } else {\n        let value = encodeURIComponent(params[key]);\n        paramList.push(`${key}=${value}`);\n      }\n    }\n  }\n  paramList.sort();\n  return Array.from(new Set(paramList).values()).join('&');\n}\n\nexport const addParamsToUrl = (url, params) => {\n  // adds the given parameters (string like \"color=red&size=medium\"\n  // or object like {color: \"red\", size: \"medium\"}) and adds to the\n  // given url (which can have params already or not)\n  const paramsType = typeof params;\n  switch (paramsType) {\n    case 'string':\n      if (!url.includes('?')) {\n        url += '?';\n      }\n\n      const [path, currentQuery] = url.split('?');\n      let paramsToAdd = currentQuery ? currentQuery + '&' + params : params;\n      url = path + '?' + stringifyParams(parseParams(paramsToAdd));\n      break;\n\n    case 'object':\n      const keyNames = Object.keys(params);\n      for (let idx in keyNames) {\n        const key = keyNames[idx];\n        const val = params[key] || '';\n        url = addParamsToUrl(url, `${key}=${val}`);\n      }\n      break;\n\n    default:\n      throw \"Unsupported data type! addParamsToUrl() only supports strings and objects for the 'params' argument.\";\n  }\n  return url;\n};\n\nexport function isFunction(value) {\n  return typeof value === 'function' || value instanceof Function;\n}\n\n/**\n * server side expects offset timezones in formats like -0700\n *\n * * the sign must always be present\n * * server does not expect a : to separate minutes and hours\n *\n * @param date\n * @returns {string}\n */\nexport function formatTimezoneOffset(date = null) {\n  date = date || new Date();\n\n  // I had code to do this, but it seems with the native date object very difficult\n  // to figure out the offset reliably given that getTimezoneOffset returns the local\n  // offset no matter what\n  date = new XDate(date);\n\n  let result = date.toString('zzz');\n  if (result === 'Z') {\n    result = '+0000';\n  }\n  return result.replace(':', '');\n}\n\nexport function isJson(str) {\n  try {\n    JSON.parse(str);\n  } catch (e) {\n    return false;\n  }\n  return true;\n}\n\nexport function isStringEmptyOrAllWhitespace(inputString) {\n  return !/\\S/.test(inputString);\n}\n\nexport function numberWithCommas(x) {\n  return x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n}\n\nexport function areEqual(array, otherArray) {\n  const s = new Set(array);\n  return (\n    otherArray.length === array.length && otherArray.every((e) => s.has(e))\n  );\n}\n\nexport function isValidURL(url_string) {\n  return /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test(\n    url_string\n  );\n}\n\nfunction pad(value) {\n  return value < 10 ? '0' + value : value;\n}\n\nfunction createUtcOffsetFromDate(date) {\n  var sign = date.getTimezoneOffset() > 0 ? '-' : '+';\n  var offset = Math.abs(date.getTimezoneOffset());\n  var hours = pad(Math.floor(offset / 60));\n  var minutes = pad(offset % 60);\n  return sign + hours + ':' + minutes;\n}\n\nexport function getTimezone() {\n  const TIMEZONES = window.TIMEZONES;\n  const localUtcOffset = createUtcOffsetFromDate(new Date());\n  let timezoneId;\n  let timezoneAbbr;\n\n  for (let i = 0; i < TIMEZONES.length; i++) {\n    const utc_offset = TIMEZONES[i].utc_offset;\n\n    if (localUtcOffset === utc_offset) {\n      timezoneId = TIMEZONES[i].timezone_id;\n      timezoneAbbr = TIMEZONES[i].timezone_abbr;\n      return {timezoneId, timezoneAbbr};\n    }\n  }\n}\n\nexport const hasRegistry = (registriesData) => {\n  return !!(\n    window.has_gift_registries ||\n    (registriesData?.registry_urls?.length &&\n      registriesData?.registry_name?.length)\n  );\n};\n\nexport function registryUrl(registry, qa_id) {\n  // EVT-25885 some data has been corrupted when registry toggled off then on; it was saved only with a name.\n  // Prevents guests from seeing blank RSVP success page.\n  if (!registry) return null;\n\n  const {url} = registry;\n\n  // If amazon & asc_campaign then add qa-id if possible\n  if (\n    !qa_id ||\n    qa_id.length == 0 ||\n    url.indexOf('amazon') == -1 ||\n    url.indexOf('asc_source=') == -1\n  )\n    return url;\n\n  // Note that this assumes the last http get argument is asc_source and appends to it\n  return url + '%7C' + qa_id;\n}\n\nexport function changePage(newPage) {\n  // Change the current url\n  history.push(newPage);\n\n  // Tell Google Analytics about being on a new page\n  dataLayer.push({event: 'pageview', page_title: 'drryl', page_path: newPage});\n}\n\nexport function virtualPageview(newPage, pageTitle) {\n  dataLayer.push({\n    event: 'pageview',\n    page_title: pageTitle,\n    page_path: newPage,\n  });\n}\n\n/**\n * This function recursively deletes a property from an object, no matter how deeply it's nested.\n *\n * @param {Object} obj - The object from which to delete the property.\n * @param {string} propertyName - The name of the property to delete.\n */\nexport function removeNestedProperty(obj, propertyName) {\n  for (let prop in obj) {\n    if (prop === propertyName) {\n      delete obj[prop];\n    } else if (typeof obj[prop] === 'object') {\n      removeNestedProperty(obj[prop], propertyName);\n    }\n  }\n}\n","import * as c from '../constants/event-origins';\n\n// This file intended to hold all event util functions shared across various apps\n\nexport const getUsedAsTypeName = (used_as) => {\n  // Logic should match the corresponding backend function, _get_used_as_type_name\n\n  if (used_as === 'save_the_date') {\n    return 'Save the Date';\n  } else if (used_as === 'card') {\n    return 'Card';\n  } else return 'Invitation';\n};\n\n// ORIGIN-BASED HELPERS\nexport const isGreetingCard = (origin) => {\n  return c.CARD_ORIGINS.includes(origin);\n};\n\nexport const isLegacyGreetingCard = (origin) => {\n  return c.LEGACY_GRC_ORIGINS.includes(origin);\n};\n\nexport const isFabricGreetingCard = (origin) => {\n  return c.FABRIC_GRC_ORIGINS.includes(origin);\n};\n\nexport const isFabric = (origin) => {\n  return c.FABRIC_EVENT_ORIGINS.includes(origin);\n};\n\nexport const isLegacyPremium = (origin) => {\n  return c.LEGACY_PREMIUM_ORIGINS.includes(origin);\n};\n\n// EVENT STATUS HELPERS\nexport const isPast = (status) => {\n  return status === 'past';\n};\n\nexport const isDraft = (status) => {\n  return status === 'draft';\n};\n\nexport const isCanceled = (status) => {\n  return status === 'cancelled';\n};\n\n// GUEST vs HOST, GID vs UID HELPERS\n","import {createBrowserHistory} from 'history';\n\nconst history = createBrowserHistory();\nexport default history;\n","import XDate from 'xdate';\n\nexport const cityAddressLine = (event) => {\n  let line = '';\n\n  if (event.city) line += `${event.city}, `;\n\n  if (event.state) line += event.state;\n\n  if (event.zip_code) line += ` ${event.zip_code}`;\n\n  return line;\n};\n\nexport const cityZip = (event) => {\n  let cityZip = '';\n  if (event.city) {\n    cityZip += event.city;\n    if (event.state || event.zip_code) cityZip += ', ';\n  }\n  if (event.state) {\n    cityZip += event.state;\n    if (event.zip_code) cityZip += ' ';\n  }\n  if (event.zip_code) cityZip += ' ' + event.zip_code;\n  return cityZip;\n};\n\n// convert to a valid ISO string format from a date string\n// that is formatted like \"20171114T193000\"\nexport const convertToIso = (dateTimeStr) => {\n  const isAlreadyFormatted =\n    !dateTimeStr || (dateTimeStr && dateTimeStr.split('-').length > 2);\n  if (isAlreadyFormatted) return dateTimeStr;\n\n  const eviteDatePattern = /(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})(\\d{2})/;\n  return dateTimeStr.replace(\n    eviteDatePattern,\n    (match, year, month, date, hour, min, sec) => {\n      return `${year}-${month}-${date}T${hour}:${min}:${sec}`;\n    }\n  );\n};\n\nexport const templateDates = (\n  _startDateTime,\n  _endDateTime,\n  timezone,\n  dateFormat,\n  timeFormat\n) => {\n  let startDateTime = new XDate(_startDateTime || '');\n  let endDateTime = new XDate(_endDateTime || '');\n  const dateFormatStr = dateFormat || 'dddd, MMMM d ';\n  const timeFormatStr = timeFormat || 'h:mm TT';\n\n  const isValidStart = startDateTime.toString('i') !== 'Invalid Date';\n  const isValidEnd = endDateTime.toString('i') !== 'Invalid Date';\n\n  let startDateStr;\n  let startTimeStr = '';\n  let datesLineOne = '';\n  if (isValidStart) {\n    startDateStr = startDateTime.toString(dateFormatStr);\n    if (_startDateTime.length >= 16)\n      startTimeStr = startDateTime.toString(timeFormatStr);\n    datesLineOne = `${startDateStr} at ${startTimeStr} ${\n      !isValidEnd ? ' ' + timezone : ''\n    }`;\n  }\n\n  let datesLineTwo = '';\n  if (isValidEnd) {\n    datesLineOne = datesLineOne.replace(' at', ' from');\n\n    const endDateStr = endDateTime.toString(dateFormatStr);\n    const endTimeStr =\n      _endDateTime.length >= 16 ? endDateTime.toString(timeFormatStr) : '';\n\n    if (isValidStart && startDateStr === endDateStr) {\n      datesLineTwo = ' to ' + endTimeStr + ' ' + timezone;\n    } else {\n      datesLineTwo = ' to ' + endDateStr + ' at ' + endTimeStr + ' ' + timezone;\n    }\n  }\n  // Monday, May 10 from 6:00 PM to 10:00 PM PT\n  // Monday, May 10 from 10:00 PM to Tuesday, May 11 at 2:00 AM PT\n  return {start_formatted: datesLineOne, end_formatted: datesLineTwo};\n};\n\nexport const inviteStatus = () => {\n  // Use 'Sent' for cards, and 'Invited' for invitations\n  if (window.is_invite === false) return 'Sent';\n  return 'Invited';\n};\n\nexport const guestTitle = () => {\n  // Use 'Recipient' for cards, and 'Guest' for invitations\n  if (window.is_invite === false) return 'Recipient';\n  return 'Guest';\n};\n\nexport function formatCents(cents) {\n  let neg = '';\n  if (cents < 0) {\n    neg = '-';\n    cents *= -1;\n  }\n  cents = (cents < 10 ? '0' : '') + cents;\n  return `${neg}$${cents.substring(0, cents.length - 2)}.${cents.substring(\n    cents.length - 2\n  )}`;\n}\n\n/*\n  Display the year only if it is not the current year,\n  and end date only if its a different day.\n*/\nexport function dateTimesWithCurrentYear(event) {\n  if (!event.start_datetime) return {start_formatted: '', end_formatted: ''};\n\n  try {\n    const currentYear = new Date().getFullYear();\n    const startYear = Number.parseInt(event.start_datetime.substring(0, 4), 10);\n    const dateFormat =\n      currentYear === startYear ? 'dddd, MMMM d' : 'dddd, MMMM d, yyyy';\n    const timezone = event.known_timezone_abbr;\n\n    let {start_formatted, end_formatted} = templateDates(\n      convertToIso(event.start_datetime),\n      convertToIso(event.end_datetime),\n      timezone,\n      dateFormat\n    );\n    return {start_formatted, end_formatted};\n  } catch (e) {\n    evite.warn('Failed to parse date: ' + e);\n  }\n}\n","import React from 'react';\nimport {shallowEqual, useSelector} from 'react-redux';\n\nexport const BlockThisHost = () => {\n  const isMobile = evite.detects.isMobile;\n  const eventId = window.event_id || '';\n\n  const {isHost, guestId} = useSelector(({user: s}) => {\n    return {isHost: s.isHost, guestId: s.guestId};\n  }, shallowEqual);\n\n  if (!guestId || isHost) return null;\n\n  const hostUserId = useSelector((state) => {\n    return state.eventDetails?.hostUserId ?? null;\n  });\n\n  const url = `/profile/block_host/?host_user_id=${hostUserId}&event_id=${eventId}&gid=${guestId}`;\n\n  return (\n    <div\n      className={`block-host-message ${isMobile ? 'mobile' : ''}`}\n      id=\"block-host-message\"\n    >\n      Don't want to receive Evite communication from this person?{' '}\n      <a href={url}>Block this host</a>\n    </div>\n  );\n};\n","import React from 'react';\nimport urls from 'urls';\nimport {SocialButtons} from '~/footer/SocialButtons';\nimport {MobileApps} from '~/footer/MobileApps';\nimport {LegalCopy} from '~/footer/LegalCopy';\nimport {BlockThisHost} from '~/footer/BlockThisHost';\nimport {NewsletterSignup} from '~/footer/NewsletterSignup';\nimport * as utils from '~/ViewInvitation/utils';\n\nexport const Footer = () => {\n  const preview = utils.isPreview();\n  const cmsUrl = urls.get('content_pages');\n\n  return (\n    <div className=\"home-row\">\n      <div className=\"top-row social-and-apps\">\n        <SocialButtons />\n        <MobileApps />\n      </div>\n      <div className=\"second-row\">\n        <ul className=\"links\">\n          <li>\n            <a\n              href={urls.get('home')}\n              aria-label=\"evite home\"\n              className=\"footer-logo\"\n              data-qa-id=\"footer_logo\"\n            />\n          </li>\n          <li>\n            <a href={`${cmsUrl}/about-us`} data-qa-id=\"footer_aboutus\">\n              About Us\n            </a>\n          </li>\n          <li>\n            <a href={`${cmsUrl}/careers`} data-qa-id=\"footer_careers\">\n              Careers\n            </a>\n          </li>\n          <li>\n            <a href={`${cmsUrl}/press`} data-qa-id=\"footer_press\">\n              Press\n            </a>\n          </li>\n          <li>\n            <a href={`${cmsUrl}/blog`} data-qa-id=\"footer_blog\">\n              Blog\n            </a>\n          </li>\n          <li>\n            <a href=\"/egift-cards/\" data-qa-id=\"footer_giftcards\">\n              eGift Cards\n            </a>\n          </li>\n          <li>\n            <a href={`${cmsUrl}/affiliate`} data-qa-id=\"footer_affiliate\">\n              Affiliate\n            </a>\n          </li>\n          <li>\n            <a href=\"https://help.evite.com/\" data-qa-id=\"footer_help\">\n              Help\n            </a>\n          </li>\n          <li>\n            <a href={urls.get('site_map')} data-qa-id=\"footer_sitemap\">\n              Site Map\n            </a>\n          </li>\n        </ul>\n\n        <NewsletterSignup />\n      </div>\n      {!preview && <BlockThisHost />}\n      <LegalCopy />\n    </div>\n  );\n};\n","import React from 'react';\nimport urls from 'urls';\n\nexport const LegalCopy = () => {\n  const currentYear = new Date().getFullYear();\n  return (\n    <>\n      <p className=\"legal\">\n        Evite&reg; and Life's Better Together<sup>&trade;</sup> are trademarks\n        of Evite, Inc. in the United States and other countries. The Evite logo\n        and all other Evite-related trademarks are trademarks of Evite, Inc.\n        Please use this mark only to refer to our services.\n      </p>\n      <br />\n      <p className=\"legal--privacy legal\">\n        <a href={urls.get('privacy')} data-qa-id=\"footer_privacy\">\n          Privacy Policy\n        </a>\n        <a href={urls.get('terms')} data-qa-id=\"footer_terms\">\n          Terms of Service\n        </a>\n        <a\n          href={`${urls.get(\n            'site_map'\n          )}/#information_collected_by_third_parties`}\n          data-qa-id=\"footer_ads\"\n        >\n          About Ads\n        </a>\n\n        {window.isAuthenticated ? (\n          <a href={urls.get('data_privacy')} data-qa-id=\"footer_donotsell\">\n            Do Not Sell My Info\n          </a>\n        ) : (\n          <a\n            href={urls.get('logged_out_data_privacy')}\n            target=\"_blank\"\n            rel=\"noreferrer noopener\"\n            data-qa-id=\"footer_donotsell\"\n          >\n            Do Not Sell My Info\n          </a>\n        )}\n      </p>\n      <p className=\"legal copyright\">\n        &copy; {currentYear} Evite. All Rights Reserved.\n      </p>\n    </>\n  );\n};\n","import React from 'react';\nimport urls from 'urls';\n\n/*\n * When shown on desktop, both buttons show and link to the /mobileapps page\n * If shown on a mobile device, only the appropriate app store button will show\n *  */\n\nexport const MobileApps = () => {\n  const isMobile = evite.detects.isMobile;\n  const isIOS = evite.detects.isIOS;\n\n  const appLandingForWeb = urls.get('apps_landing_page');\n  const googleUrl =\n    !isIOS && isMobile ? urls.get('google_app_link_footer') : appLandingForWeb;\n  const iosUrl =\n    isIOS && isMobile\n      ? urls.get('apple_store_app_link_footer', {\n          referrer: 'MW_Reinvention_Footer',\n        })\n      : appLandingForWeb;\n\n  const appStores = [\n    {\n      id: 'google',\n      title: 'Android',\n      url: googleUrl,\n      alt: 'Evite App on Google Play',\n      src: urls.get('google_app_icon'),\n      show: !isMobile || (isIOS && isMobile),\n    },\n    {\n      id: 'apple',\n      title: 'iTunes',\n      url: iosUrl,\n      alt: 'Available on the App Store',\n      src: urls.get('apple_store_app_icon'),\n      show: !isMobile || (!isIOS && isMobile),\n    },\n  ];\n  const buttonsToShow = appStores.filter((a) => a.show);\n\n  return (\n    <ul className=\"apps\">\n      {buttonsToShow.map((a, i) => (\n        <li key={`${a.id}-${i}`}>\n          <a\n            href={a.url}\n            title={a.title}\n            data-qa-id={`footer_${a.id}_download`}\n            target=\"_blank\"\n          >\n            <img src={a.src} alt={a.alt} loading=\"lazy\" />\n          </a>\n        </li>\n      ))}\n    </ul>\n  );\n};\n","import React, {useState, useEffect} from 'react';\n\nconst defaultSubscribeMessage =\n  'Join our email list for party tips, updates, and offers.';\n\nexport const NewsletterSignup = (props) => {\n  const {\n    isSmallButton = false,\n    subscribeMessage = defaultSubscribeMessage,\n    subscribeButtonMessage = 'Submit',\n  } = props;\n  const [inputValue, setInputValue] = useState('');\n  const [showFeedback, setShowFeedback] = useState(false);\n  const [messageText, setMessageText] = useState(null);\n  const [isSuccess, setIsSuccess] = useState(false);\n\n  const ariaProps = {\n    'aria-describedby': `${isSuccess ? 'success' : 'error'}_message`,\n  };\n  let feedbackBlock = document.getElementById('newsletter-feedback');\n\n  useEffect(() => {\n    if (showFeedback && !isSuccess) {\n      ariaProps['aria-invalid'] = true;\n    }\n  }, [showFeedback, isSuccess]);\n\n  const handleAjaxResponse = (message, isSuccess = true) => {\n    console.log('message', message);\n    setMessageText(message);\n    setIsSuccess(isSuccess);\n    setShowFeedback(true);\n    evite.removeClass(feedbackBlock, 'hidden');\n  };\n\n  const subscribe = function(e) {\n    e.preventDefault();\n\n    const data = {\n      email_addr: inputValue,\n      marketing_source: 'site_footer',\n    };\n\n    $.ajax({\n      url: '/ajax/subscribe/',\n      dataType: 'json',\n      type: 'POST',\n      timeout: 10000,\n      data: data,\n      success: function(data) {\n        handleAjaxResponse(data.message);\n      },\n      error: function(xhr, textStatus, errorThrown) {\n        handleAjaxResponse(xhr.responseJSON.message, false);\n      },\n    });\n  };\n\n  const handleInputChange = (e) => {\n    setShowFeedback(false);\n    setMessageText('');\n    setInputValue(e.target.value);\n    evite.addClass(feedbackBlock, 'hidden');\n  };\n\n  return (\n    <form className=\"evite-form\" onSubmit={subscribe}>\n      <ul\n        id=\"newsletter-signup\"\n        className=\"newsletter-signup\"\n        role=\"presentation\"\n      >\n        <li className=\"font_28 subscribe-message\" id=\"subscribe_message\">\n          {subscribeMessage}\n        </li>\n        <li className=\"newsletter-email\">\n          <p className=\"visually-hidden\" id=\"enter_email\">\n            Enter your email address\n          </p>\n          <input\n            data-qa-id=\"footer_email\"\n            className=\"newsletter-email-input\"\n            type=\"text\"\n            id=\"footer-email\"\n            placeholder=\"Enter your email address\"\n            aria-labelledby=\"subscribe_message enter_email\"\n            onChange={handleInputChange}\n            value={inputValue}\n            {...ariaProps}\n          />\n          <button\n            type=\"submit\"\n            data-qa-id=\"footer_submit\"\n            className={`${\n              isSmallButton ? 'small' : ''\n            } secondary-button button secondary`}\n            id=\"subscribe\"\n            disabled={!inputValue}\n          >\n            {subscribeButtonMessage}\n          </button>\n        </li>\n        <li id=\"newsletter-feedback\" className=\"newsletter-feedback hidden\">\n          <span\n            id={`${isSuccess ? 'success' : 'error'}_message`}\n            className={`${isSuccess ? 'success' : 'error'}-message`}\n            role=\"region\"\n            aria-live=\"polite\"\n            aria-relevant=\"additions\"\n          >\n            {messageText}\n          </span>\n        </li>\n      </ul>\n    </form>\n  );\n};\n","import React from 'react';\nimport {PB_SocialFb} from '~/common/svg/PB_SocialFb';\nimport {PB_SocialTwi} from '~/common/svg/PB_SocialTwi';\nimport {PB_SocialPin} from '~/common/svg/PB_SocialPin';\nimport {PB_SocialIg} from '~/common/svg/PB_SocialIg';\nimport {PB_SocialYt} from '~/common/svg/PB_SocialYt';\nimport {pebble} from '~sass/pb_styleguide/base/_exports.sass';\n\nexport const SocialButtons = () => {\n  return (\n    <ul className=\"social\">\n      <li>\n        <a\n          href=\"https://www.facebook.com/evite\"\n          title=\"Facebook\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"facebook\"\n          data-qa-id=\"footer_fb\"\n        >\n          <PB_SocialFb color={pebble} ratio={0.75} />\n        </a>\n      </li>\n      <li>\n        <a\n          href=\"https://twitter.com/evite\"\n          title=\"Twitter\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"twitter\"\n          data-qa-id=\"footer_twitter\"\n        >\n          <PB_SocialTwi color={pebble} ratio={0.75} />\n        </a>\n      </li>\n      <li>\n        <a\n          href=\"https://pinterest.com/evite/\"\n          title=\"Pinterest\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"pinterest\"\n          data-qa-id=\"footer_pinterest\"\n        >\n          <PB_SocialPin color={pebble} ratio={0.75} />\n        </a>\n      </li>\n      <li>\n        <a\n          href=\"https://instagram.com/evite/\"\n          title=\"Instagram\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"instagram\"\n          data-qa-id=\"footer_instagram\"\n        >\n          <PB_SocialIg color={pebble} ratio={0.75} />\n        </a>\n      </li>\n      <li>\n        <a\n          href=\"https://youtube.com/evite/\"\n          title=\"YouTube\"\n          target=\"_blank\"\n          rel=\"noopener noreferrer\"\n          className=\"youtube\"\n          data-qa-id=\"footer_youtube\"\n        >\n          <PB_SocialYt color={pebble} ratio={0.75} />\n        </a>\n      </li>\n    </ul>\n  );\n};\n","import {ModalAjaxError} from '../modal/index';\nimport PopupModal from '~/modal/popup_modal';\n\nexport function modal_ajax_error_handler(xhr, status, errorstr, body, title) {\n  let modalBody;\n  let modalTitle = title || 'Error';\n\n  if (body) {\n    modalBody = body;\n  } else {\n    try {\n      modalBody = JSON.parse(xhr.responseText).message;\n    } catch (error) {\n      console.error('Modal err:', error);\n      console.error('Modal response:', xhr);\n      modalBody = 'Sorry, an error has occurred!';\n    }\n  }\n\n  new ModalAjaxError({\n    title: modalTitle,\n    body: modalBody,\n    popup: true,\n    buttons: ['Okay'],\n    url_parameters: {\n      response: xhr && xhr.responseText ? xhr.responseText : '',\n      status: status,\n      error: errorstr,\n    },\n  }).show();\n}\n\n/**\n * Show a modal dialog for a failed fetch. Should not require a server page render\n *\n * @param response\n * @param title\n * @param body\n */\nexport async function failedFetchModal(response, title = 'Error', body = null) {\n  try {\n    if (!response.responseJSON) {\n      response.responseJSON = await response.json();\n    }\n\n    body = body || response.responseJSON.message;\n  } catch (e) {\n    /* probably read already */\n  }\n\n  new PopupModal({\n    buttons: ['Okay'],\n    title: title,\n    body: body,\n    html: true,\n    dataQaId: 'failedFetchModal',\n  }).show();\n}\n","import {EviteModal} from './index';\nimport urls from 'urls';\n\nexport class ModalAjaxError {\n  settings = {\n    url: urls.get('modal_ajax_error'),\n    buttons: ['Okay'],\n    title: null,\n    html: false,\n    width: '480px',\n    dialog: {},\n    url_parameters: {},\n  };\n\n  constructor(settings) {\n    this.settings = Object.assign({}, this.settings, settings);\n    this.settings.url_parameters.dialog = {\n      body: settings.body || '',\n      title: settings.title || this.settings.title,\n      buttons: settings.buttons || this.settings.buttons,\n      html: settings.html || this.settings.html,\n    };\n\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default ModalAjaxError;\n","import EviteModal from './evite_modal';\nimport urls from 'urls';\n\nclass AuthModal {\n  settings = {\n    clickOutside: true,\n    width: '460px',\n    title: null,\n    url: urls.get('login_modal'),\n  };\n\n  constructor(settings) {\n    this.settings = {\n      ...this.settings,\n      ...settings,\n    };\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default AuthModal;\n","const defaults = {\n  modal: '.evite-modal-container',\n  modalInner: '.modal-inner',\n  modalContent: '.modal-content',\n  open: '[data-modal-open]',\n  close: '[data-modal-close]',\n  closeAction: '[data-close-action]',\n  dataAttribute: 'data-current-modal',\n  page: 'body',\n  class: 'modal-visible',\n  loadClass: 'evite-modal',\n  clickOutside: true,\n  closeKeys: [27],\n  transitions: true,\n  transitionEnd: null,\n  onBeforeOpen: null,\n  onBeforeClose: null,\n  onOpen: null,\n  onClose: null,\n  allowClose: true,\n};\n\nfunction throwError(message) {\n  // eslint-disable-next-line no-console\n  console.error(`ModalView: ${message}`);\n}\n\nfunction find(arr, callback) {\n  return (key) => {\n    const filteredArray = arr.filter(callback);\n    return filteredArray[0] ? filteredArray[0][key] : undefined;\n  };\n}\n\nfunction transitionEndVendorSniff() {\n  const el = document.createElement('div');\n  const transitions = [\n    {key: 'transition', value: 'transitionend'},\n    {key: 'OTransition', value: 'otransitionend'},\n    {key: 'MozTransition', value: 'transitionend'},\n    {key: 'WebkitTransition', value: 'webkitTransitionEnd'},\n  ];\n  return find(\n    transitions,\n    ({key}) => typeof el.style[key] !== 'undefined'\n  )('value');\n}\n\nfunction isPopulatedArray(arr) {\n  return Object.prototype.toString.call(arr) === '[object Array]' && arr.length;\n}\n\nfunction getNode(selector, parent, skipError = false) {\n  const targetNode = parent || document;\n  const node = targetNode.querySelector(selector);\n  if (!node && !skipError) {\n    throwError(`${selector} not found in document.`);\n  }\n  return node;\n}\n\nfunction addClass(el, className) {\n  if (!(el instanceof HTMLElement)) {\n    throwError('Not a valid HTML element.');\n  }\n  el.setAttribute(\n    'class',\n    el.className\n      .split(' ')\n      .filter((cn) => cn !== className)\n      .concat(className)\n      .join(' ')\n  );\n}\n\nfunction removeClass(el, className) {\n  if (!(el instanceof HTMLElement)) {\n    throwError('Not a valid HTML element.');\n  }\n  el.setAttribute(\n    'class',\n    el.className\n      .split(' ')\n      .filter((cn) => cn !== className)\n      .join(' ')\n  );\n}\n\nfunction getElementContext(e) {\n  if (e && typeof e.hash === 'string') {\n    return document.querySelector(e.hash);\n  } else if (typeof e === 'string') {\n    return document.querySelector(e);\n  }\n  throwError('No selector supplied to open()');\n  return null;\n}\n\nfunction applyModalSettings(settings) {\n  return {\n    ...defaults,\n    ...settings,\n    transitionEnd: transitionEndVendorSniff(),\n  };\n}\n\nfunction matches(e, selector) {\n  const allMatches = (\n    e.target.document || e.target.ownerDocument\n  ).querySelectorAll(selector);\n  for (let i = 0; i < allMatches.length; i += 1) {\n    let node = e.target;\n    while (node && node !== document.body) {\n      if (node === allMatches[i]) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n  }\n  return null;\n}\n\nexport default class ModalBase {\n  currentInstance = null;\n  parser = null;\n  openCloseQueue = null;\n\n  constructor(options) {\n    if (options && options.loader) {\n      if (!window.EviteLoadingModal) {\n        window.EviteLoadingModal = this;\n      } else {\n        return window.EviteLoadingModal;\n      }\n    } else {\n      if (!window.EviteModal) {\n        window.EviteModal = this;\n      } else {\n        return window.EviteModal;\n      }\n    }\n\n    this.parser = new DOMParser();\n    this.openCloseQueue = Promise.resolve();\n\n    this.open = this.open.bind(this);\n    this.close = this.close.bind(this);\n    this.closeKeyHandler = this.closeKeyHandler.bind(this);\n    this.outsideClickHandler = this.outsideClickHandler.bind(this);\n    this.delegateOpen = this.delegateOpen.bind(this);\n    this.delegateClose = this.delegateClose.bind(this);\n    this.listen = this.listen.bind(this);\n    this.destroy = this.destroy.bind(this);\n  }\n\n  static getInstance() {\n    return window.EviteModal || new ModalBase();\n  }\n\n  initialize(modalInstance) {\n    this.current = null;\n\n    this.settings = applyModalSettings(modalInstance.settings);\n    this.dom = this.getDomNodes();\n    this.currentInstance = modalInstance;\n\n    this.addLoadedCssClass();\n    this.listen();\n  }\n\n  getDomNodes() {\n    const {modal, page, modalInner, modalContent} = this.settings;\n    return {\n      modal: getNode(modal),\n      page: getNode(page),\n      modalInner: getNode(modalInner, getNode(modal)),\n      modalContent: getNode(modalContent, getNode(modal)),\n    };\n  }\n\n  addLoadedCssClass() {\n    addClass(this.dom.page, this.settings.loadClass);\n  }\n\n  setOpenId(id) {\n    const {page} = this.dom;\n    page.setAttribute(this.settings.dataAttribute, id || 'anonymous');\n  }\n\n  removeOpenId() {\n    const {page} = this.dom;\n    page.removeAttribute(this.settings.dataAttribute);\n  }\n\n  open(allMatches, e) {\n    return this.openCloseQueue.then(() => {\n      // Try to blur any active elements before opening modal\n      if (document.activeElement) document.activeElement.blur();\n\n      const {page, modalContent, modalInner} = this.dom;\n      const {onBeforeOpen, onOpen} = this.settings;\n      if (!(this.current instanceof HTMLElement === false)) {\n        throwError('ModalView target must exist on page.');\n        return;\n      }\n      if (this.current) this.releaseNode(this.current);\n      this.current = getElementContext(allMatches);\n\n      if (!this.current) {\n        evite.error(`Could not locate node: ${allMatches}`);\n        return;\n      }\n\n      if (!this.settings.allowClose) {\n        getNode(this.settings.close).style.display = 'none';\n      }\n      if (typeof onBeforeOpen === 'function') {\n        onBeforeOpen.call(this, e);\n      }\n\n      this.captureNode(this.current);\n      this.setOpenId(this.current.id);\n      this.isOpen = true;\n      addClass(page, this.settings.class);\n      if (evite.detects.isMobile) {\n        // this is part of a fix for ios Safari devices that have webkit bugs on input fields\n        // when this is finally fixed we can remove this and the absolute positioning in SimpleModal/styles.sass\n        //   https://hackernoon.com/how-to-fix-the-ios-11-input-element-in-fixed-modals-bug-aaf66c7ba3f8\n        // until then, switching from fixed to absolute messes up the positioning, with modals sometimes appearing\n        // offscreen when fixed would have positioned them in viewport.\n        evite.css(modalInner, {\n          position: 'absolute',\n          left: '2.5%',\n          top: window.scrollY + 40,\n          // the modal is not visible on ios without this\n          'z-index': '-1',\n        });\n\n        // centers the modal for mobile / tablet\n        evite.css(modalContent, {\n          'max-width': '430px',\n          margin: '0px auto',\n        });\n      }\n\n      // set focus on last input element or anchor in the modal EVT-10809\n      const lastInput = Array.from(\n        modalContent.querySelectorAll('input, button, a')\n      ).pop();\n      if (lastInput) lastInput.focus();\n\n      if (typeof onOpen === 'function') {\n        onOpen.call(this, e);\n      }\n    });\n  }\n\n  detectTransition() {\n    const {modal} = this.dom;\n    const css = window.getComputedStyle(modal, null);\n    return Boolean(\n      [\n        'transitionDuration',\n        'oTransitionDuration',\n        'MozTransitionDuration',\n        'webkitTransitionDuration',\n      ].filter((i) => typeof css[i] === 'string' && parseFloat(css[i]) > 0)\n        .length\n    );\n  }\n\n  close(e) {\n    return this.openCloseQueue.then(() => {\n      return new Promise((resolve) => {\n        const {transitions, transitionEnd, onBeforeClose} = this.settings;\n        const hasTransition = this.detectTransition();\n        if (this.isOpen) {\n          if (typeof onBeforeClose === 'function') {\n            onBeforeClose.call(this, e);\n          }\n          if (transitions && transitionEnd && hasTransition) {\n            this.closeModalWithTransition(e).then(resolve);\n          } else {\n            this.closeModal(e).then(resolve);\n          }\n          removeClass(this.dom.page, this.settings.class);\n        } else {\n          resolve();\n        }\n      });\n    });\n  }\n\n  closeModal(e) {\n    return this.openCloseQueue.then(() => {\n      return new Promise((resolve) => {\n        const {onClose} = this.settings;\n        this.removeOpenId(this.dom.page);\n        this.releaseNode(this.current);\n        removeClass(this.dom.page, this.settings.loadClass);\n        if (typeof onClose === 'function') {\n          onClose.call(this, e);\n        }\n        this.current = null;\n        this.isOpen = false;\n        resolve();\n      });\n    });\n  }\n\n  closeTransitionHandler = (e) => {\n    if (this.resolveTransition) {\n      this.resolveTransition(this.closeModal(e));\n      this.resolveTransition = null;\n    }\n  };\n\n  closeModalWithTransition(e) {\n    return this.openCloseQueue.then(() => {\n      return new Promise((resolve) => {\n        this.resolveTransition = resolve;\n      });\n    });\n  }\n\n  captureNode(node) {\n    const {modalContent} = this.dom;\n    while (node.childNodes.length) {\n      modalContent.appendChild(node.childNodes[0]);\n    }\n  }\n\n  releaseNode(node) {\n    const {modalContent} = this.dom;\n    while (modalContent.childNodes.length) {\n      modalContent.removeChild(modalContent.childNodes[0]);\n    }\n  }\n\n  closeKeyHandler(e) {\n    const {closeKeys, closeAction} = this.settings;\n\n    if (\n      isPopulatedArray(closeKeys) &&\n      closeKeys.indexOf(e.which) > -1 &&\n      this.isOpen === true\n    ) {\n      e.preventDefault();\n      this.doCancel();\n    }\n  }\n\n  outsideClickHandler(e) {\n    const {clickOutside} = this.settings;\n    const {modalInner} = this.dom;\n\n    if (clickOutside) {\n      let node = e.target;\n      while (node && node !== document.body) {\n        if (node === modalInner) {\n          return;\n        }\n        node = node.parentNode;\n      }\n      this.doCancel();\n    }\n  }\n\n  doCancel() {\n    const {onCancel, closeAction} = this.settings;\n    const closeNode = getNode(closeAction, document, true);\n\n    if (typeof onCancel === 'function') {\n      onCancel();\n    }\n    // if an element has been identified as the close-action node, click that instead of closing\n    if (closeNode) {\n      closeNode.click();\n    } else {\n      this.close();\n    }\n  }\n\n  delegateOpen(e) {\n    const {open} = this.settings;\n    const matchedNode = matches(e, open);\n    if (matchedNode) {\n      e.preventDefault();\n      this.open(matchedNode, e);\n    }\n  }\n\n  delegateClose(e) {\n    const {close} = this.settings;\n    if (matches(e, close)) {\n      e.preventDefault();\n      this.doCancel();\n    }\n  }\n\n  listen() {\n    if (this.isListening) {\n      this.unlisten();\n    }\n    const {modal} = this.dom;\n    const {transitionEnd} = this.settings;\n    if (!this.isListening) {\n      modal.addEventListener(transitionEnd, this.closeTransitionHandler);\n      modal.addEventListener('click', this.outsideClickHandler, false);\n      document.addEventListener('keydown', this.closeKeyHandler, false);\n      document.addEventListener('click', this.delegateOpen, false);\n      document.addEventListener('click', this.delegateClose, false);\n      this.isListening = true;\n    } else {\n      throwError('Event listeners already applied.');\n    }\n  }\n\n  unlisten() {\n    const {modal} = this.dom;\n    const {transitionEnd} = this.settings;\n    modal.removeEventListener('click', this.outsideClickHandler);\n    modal.removeEventListener(transitionEnd, this.closeTransitionHandler);\n    document.removeEventListener('keydown', this.closeKeyHandler);\n    document.removeEventListener('click', this.delegateOpen);\n    document.removeEventListener('click', this.delegateClose);\n    this.isListening = false;\n  }\n\n  respond(response, settings, e) {\n    let useSettings = this.settings;\n    if (settings) {\n      useSettings = Object.assign(useSettings, settings);\n    }\n    this.close().then(() => {\n      window.tags.page_event(useSettings.url, response.name);\n      let name = response.name.split(' ').join(''); // remove spaces\n      let on_response = useSettings[`on${name}`];\n      if (on_response) {\n        on_response(response, e);\n      } else if (useSettings.onResponse) {\n        useSettings.onResponse(response, e);\n      }\n    });\n  }\n\n  destroy() {\n    if (this.isListening) {\n      this.close();\n      this.unlisten();\n    } else {\n      throwError('Event listeners already removed.');\n    }\n  }\n}\n","import EviteModal from './evite_modal';\nimport urls from 'urls';\n\nclass CaptchaDialog {\n  constructor(settings) {\n    this.settings = {\n      width: '520px',\n      ...settings,\n    };\n    if (this.settings.challenge.type === 'sms') {\n      this.settings.url = urls.get('sms_captcha');\n    } else if (this.settings.challenge.type === 'ad') {\n      this.settings.url = urls.get('ad_captcha');\n    } else {\n      this.settings.url = urls.get('recaptcha');\n    }\n    if (this.settings.challenge.captcha_event) {\n      this.settings.url =\n        this.settings.url + this.settings.challenge.captcha_event + '/';\n      if (this.settings.challenge.retry) {\n        this.settings.url = this.settings.url + 'retry/';\n      }\n    }\n    this.settings.url_parameters = {\n      challenge: this.settings.challenge,\n    };\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default CaptchaDialog;\n","import {EviteModal} from './index';\nimport urls from 'urls';\n\n// Example simple usage:\n//\n//  delete_modal = new ModalDialog\n//    title:      'Delete Group'\n//    body:       'Are you sure you wish to delete this group?'\n//    buttons:    ['Cancel', 'Delete Group']\n//    onResponse: (response) ->\n//      if response.index == 1\n//        console.log 'delete group'\n//  delete_modal.show()\n\nclass ModalDialog {\n  settings = {\n    url: urls.get('modal_dialog'),\n    buttons: ['Cancel', 'Yes'],\n    title: null,\n    html: false,\n    width: '480px',\n    dialog: {},\n    footer: false,\n    eventId: null,\n  };\n\n  constructor(settings) {\n    if (!this.settings.url_parameters) {\n      this.settings.url_parameters = {};\n    }\n    this.settings.url_parameters.dialog = {\n      body: settings.body || '',\n      title: settings.title || this.settings.title,\n      buttons: settings.buttons || this.settings.buttons,\n      html: settings.html || this.settings.html,\n      footer: settings.footer || this.settings.footer,\n    };\n    return new EviteModal(Object.assign({}, this.settings, settings));\n  }\n}\n\nexport default ModalDialog;\n","import ModalBase from './base';\nimport evite, {buildScriptTag} from 'evite';\nimport {htmlFromString} from '~/common/utils';\n\nclass EviteModal {\n  target = null;\n  modalHead = null;\n  modalBody = null;\n  parser = null;\n  open = false;\n  id = null;\n  defaults = {\n    popup: false,\n    width: '480px',\n    parse: true,\n    buttonLocators: {},\n    dataQaId: null,\n    buttonsDataImpression: [],\n  };\n\n  constructor(settings) {\n    this.settings = {\n      ...this.defaults,\n      ...settings,\n    };\n    this.id = evite.guid();\n    this.modal = ModalBase.getInstance();\n    this.parser = this.modal.parser;\n    this.buildContainer();\n  }\n\n  overwrites() {\n    this.settings.overwrites.forEach((ow) => {\n      document.getElementById(ow.id).innerHTML = ow.text;\n    });\n  }\n\n  buildContainer() {\n    this.target = htmlFromString(\n      `<div id=\"eviteModal-${\n        this.id\n      }\" class=\"eviteModalContentOuter\"><div class=\"eviteModalContainer ${\n        this.settings.className ? this.settings.className : ''\n      }\" ${\n        this.settings.dataQaId ? `data-qa-id=\"${this.settings.dataQaId}\"` : ''\n      }>${\n        this.settings.closeBtn\n          ? '<button id=\"eviteModalCloseBtn\" class=\"eviteModalCloseBtn\">X</button>'\n          : ''\n      }<div class=\"eviteModalContent\"></div></div></div>`\n    );\n    this.target.querySelector('.eviteModalContainer').style.cssText = `\n            max-width: ${this.settings.width};`;\n  }\n\n  encodeUrlParams(data) {\n    let ret = [];\n    for (let d in data)\n      ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n    return ret.join('&');\n  }\n\n  _query_string() {\n    let params = {\n      p: JSON.stringify(this.settings.url_parameters),\n      parent_url: document.location.href,\n    };\n    return '?' + this.encodeUrlParams(params);\n  }\n\n  fetchContent = () => {\n    let url = this.settings.url;\n    if (this.settings.forceDesktop) {\n      url += '_desktop';\n    }\n    url += this.settings.url_parameters ? this._query_string() : '';\n    return new Promise((resolve, reject) => {\n      evite\n        .fetch(url, {\n          method: 'get',\n          credentials: 'same-origin',\n          cache: 'no-cache',\n        })\n        .then((response) => {\n          resolve(response.text());\n        })\n        .catch((message) => {\n          reject(message);\n        });\n    });\n  };\n\n  parseContent = (text) => {\n    return this.parser.parseFromString(text, 'text/html');\n  };\n\n  injectContent = (page) => {\n    this.modalHead = page.head;\n    this.modalBody = page.body.innerHTML;\n    this.target.querySelector('.eviteModalContent').innerHTML = this.modalBody;\n    return this;\n  };\n\n  buildPopup() {\n    return new Promise((resolve, reject) => {\n      if (!this.settings.body) {\n        reject('\"body\" is required');\n      }\n      if (!this.settings.title) {\n        reject('\"title\" is required');\n      }\n      if (!this.settings.buttons && !this.settings.buttonMarkup) {\n        reject('\"buttons\" or \"button markup\" is required');\n      }\n      const buttons = this.settings.buttons;\n      const buttonLocators = this.settings.buttonLocators;\n      const buttonsDataImpression = this.settings.buttonsDataImpression;\n      let button_markup = this.settings.buttonMarkup\n        ? this.settings.buttonMarkup\n        : '';\n      if (!button_markup && buttons) {\n        for (let key in buttons) {\n          let button = buttons[key];\n          let buttonLocator = buttonLocators[key];\n          let buttonDataImpression = buttonsDataImpression[key];\n          let buttonId = button\n            .toLowerCase()\n            .split(' ')\n            .join('-')\n            .trim();\n          const dataImpression = buttonDataImpression\n            ? 'data-impression-tracking=\"true\"'\n            : '';\n          if (buttons.length === 1 * key + 1) {\n            button_markup += `<button class=\"button-primary primary-button button-group-item ${\n              evite.detects.isMobile ? 'small' : ''\n            }\" data-qa-id=\"${buttonLocator ||\n              buttonId}\" data-name=\"${button}\" data-index=\"${key}\" ${dataImpression}>${button}</button>`;\n          } else {\n            button_markup += `<button class=\"button-primary-inverse secondary-button button-group-item ${\n              evite.detects.isMobile ? 'small' : ''\n            }\" data-qa-id=\"${buttonLocator ||\n              buttonId}\" data-name=\"${button}\" data-index=\"${key}\" ${dataImpression}>${button}</button>`;\n          }\n        }\n      }\n      let modalContent;\n      if (this.settings.parse) {\n        modalContent = `<p>${this.settings.body}</p>`;\n      }\n      const container = this.target.querySelector('.eviteModalContent');\n      container.innerHTML = `\n        <div data-qa-id='${\n          this.settings.dataQaId ? this.settings.dataQaId : 'popup-modal'\n        }' class='popup-modal evite-modal-content-container'>\n          <div class=\"modal-header\">\n            <h1 class=\"subtitle\">${this.settings.title}</h1>\n          </div>\n          <div class=\"modal-body\">\n            <div class=\"wrapper\">${modalContent || ''}</div>\n          </div>\n          <div class=\"modal-footer\"><div class=\"button-group\">${button_markup}</div></div>\n        </div>`;\n\n      if (!this.settings.parse) {\n        container.querySelector('.wrapper').appendChild(this.settings.body);\n      }\n\n      let self = this;\n      function respondToPopup(e) {\n        self.close();\n        let name = e.currentTarget.innerText\n          .split(' ')\n          .join('')\n          .replace(/[^\\w\\s]/gi, ''); // remove spaces and special characters\n        let on_response = self.settings[`on${name}`];\n        if (on_response) {\n          on_response(name, e);\n        } else if (self.settings.onResponse) {\n          self.settings.onResponse.apply(self, [e, self, name]);\n        }\n      }\n      const buttonsEl = container.querySelectorAll('.modal-footer button')\n        .length\n        ? container.querySelectorAll('.modal-footer button')\n        : container.querySelectorAll('.modal-footer a');\n      for (let key of Object.keys(this.settings.buttons)) {\n        buttonsEl[key].addEventListener('click', respondToPopup);\n      }\n      resolve(true);\n    });\n  }\n\n  parseDependencies = () => {\n    let scripts = Array.from(this.modalHead.querySelectorAll('script'));\n    let links = Array.from(this.modalHead.querySelectorAll('link'));\n    let styles = links.filter((link) => link.type === 'text/css');\n    styles.forEach((style) => {\n      style.className = 'eviteModalStyle';\n      document.head.appendChild(style);\n    });\n\n    scripts.forEach((script) => {\n      let scriptTag;\n      let src = script.getAttribute('src');\n      if (src) {\n        scriptTag = buildScriptTag({\n          src: src,\n          type: 'text/javascript',\n          async: true,\n          className: 'eviteModalScript',\n          onLoad: () => false,\n        });\n      } else {\n        scriptTag = buildScriptTag({\n          type: 'text/javascript',\n          innerHTML: script.innerHTML,\n          className: 'eviteModalScript',\n          onLoad: () => false,\n        });\n      }\n      document.head.appendChild(scriptTag);\n    });\n\n    return this;\n  };\n\n  buildRemote() {\n    return new Promise((resolve, reject) => {\n      this.fetchContent()\n        .then((text) => this.parseContent(text))\n        .then((page) => this.injectContent(page))\n        .then(this.parseDependencies)\n        .then(resolve)\n        .catch((msg) => reject(msg));\n    });\n  }\n\n  buildFromResponse = (serverResponse) => {\n    const page = this.parseContent(serverResponse);\n    this.injectContent(page);\n    this.parseDependencies();\n  };\n\n  close = () => {\n    return new Promise((resolve, reject) => {\n      if (this.open) {\n        this.modal.close().then(() => {\n          this.open = false;\n          const modalDom = document.getElementById(`eviteModal-${this.id}`);\n          const styles = document.querySelectorAll('.eviteModalStyle');\n          const scripts = document.querySelectorAll('.eviteModalScript');\n          Array.from(styles).forEach((el) => el.parentNode.removeChild(el));\n          Array.from(scripts).forEach((el) => el.parentNode.removeChild(el));\n          if (modalDom) modalDom.parentNode.removeChild(modalDom);\n          resolve();\n        });\n      }\n    });\n  };\n\n  respond = (options, settings, event) => {\n    this.modal.respond(options, settings, event);\n  };\n\n  show(htmlResponse) {\n    document.querySelector('body').appendChild(this.target);\n    this.modal.initialize(this);\n    if (htmlResponse && !this.settings.popup) {\n      this.buildFromResponse(htmlResponse);\n      this.modal.open(`#eviteModal-${this.id}`);\n      this.open = true;\n      return;\n    }\n    if (this.settings.popup) {\n      this.buildPopup().then(() => {\n        this.modal.open(`#eviteModal-${this.id}`);\n        this.open = true;\n        if (this.settings.overwrites && this.settings.overwrites.length) {\n          this.overwrites();\n        }\n      });\n    } else {\n      this.buildRemote().then(() => {\n        this.modal.open(`#eviteModal-${this.id}`);\n        this.open = true;\n        if (this.settings.overwrites && this.settings.overwrites.length) {\n          this.overwrites();\n        }\n      });\n    }\n  }\n}\n\nexport default EviteModal;\n","import EviteModal from './evite_modal';\nimport CaptchaDialog from './captcha_modal';\nimport PopupModal from './popup_modal';\nimport ModalWarning from './warning_modal';\nimport ModalAjaxError from './ajax_error_modal';\nimport LoadingModal from './loading_modal';\nimport SendMessageModal from './send_message_modal';\nimport ModalDialog from './dialog_modal';\nimport AuthModal from './auth_modal';\n\nexport {\n  EviteModal,\n  AuthModal,\n  CaptchaDialog,\n  PopupModal,\n  ModalWarning,\n  ModalAjaxError,\n  LoadingModal,\n  ModalDialog,\n  SendMessageModal,\n};\n","import {htmlFromString} from '../common/utils';\nimport ModalBase from './base';\n\nclass LoadingModal {\n  loadingModalDefaults = {\n    message: 'Loading...',\n    allowClose: false,\n    clickOutside: false,\n    width:\n      Math.min(\n        window.screen.width - Math.ceil(window.screen.width * 0.05),\n        420\n      ) + 'px',\n  };\n  open = false;\n\n  constructor(settings = {}) {\n    if (typeof settings === 'string') {\n      settings = {message: settings};\n    }\n    this.settings = {\n      ...this.loadingModalDefaults,\n      ...settings,\n    };\n    const contents = htmlFromString(\n      `<div id=\"loadingModal\" class=\"eviteModalContent\"><div class=\"loadingContainer\"><div class=\"evt-spinner\"></div><div class=\"loader heading\">${this.settings.message}</div></div></div>`\n    );\n    contents.querySelector('.loadingContainer').style.cssText = `\n      background: white;\n      width: ${this.settings.width};\n      height: 233px;\n      border: 1px solid #A8A8A8;\n      border-radius: 6px;\n      overflow: hidden;`;\n\n    this.target = contents;\n    return this;\n  }\n\n  close = () => {\n    if (this.open) {\n      this.open = false;\n      const modalDom = document.getElementById('loadingModal');\n      if (modalDom) {\n        // Use this instead of remove for ie11 support\n        modalDom.parentNode.removeChild(modalDom);\n      }\n    }\n    return ModalBase.getInstance().close();\n  };\n\n  show = (message) => {\n    return new Promise((resolve, reject) => {\n      document.querySelector('body').appendChild(this.target);\n      let modal = ModalBase.getInstance();\n      modal.initialize(this);\n      this.setMessage(message);\n      modal.open(`#loadingModal`);\n      this.open = true;\n      resolve();\n    });\n  };\n\n  setMessage = (message) => {\n    if (message && this.target.querySelector('.loader')) {\n      this.target.querySelector('.loader').innerHTML = message;\n    }\n  };\n}\n\nexport default LoadingModal;\n","import EviteModal from './evite_modal';\n\nexport class PopupModal {\n  settings = {\n    buttons: ['Cancel', 'Yes'],\n    buttonMarkup: '',\n    html: false,\n    title: null,\n    body: '',\n    width: '520px',\n    popup: true,\n  };\n\n  constructor(settings) {\n    return new EviteModal(Object.assign({}, this.settings, settings));\n  }\n}\n\nexport default PopupModal;\n","import EviteModal from './evite_modal';\nimport urls from 'urls';\n\nclass SendMessageModal {\n  settings = {\n    clickOutside: false,\n    allowClose: false,\n    width: '800px',\n    title: 'Send a Message',\n    cancel: 'Cancel',\n    subject: 'Message about {subject}',\n    className: 'send-message-modal',\n    dataQaId: 'send-message-modal',\n    message: '',\n    guests: [],\n  };\n\n  constructor(settings) {\n    this.settings = {\n      ...this.settings,\n      ...settings,\n    };\n    this.settings.url_parameters = {\n      subject: this.settings.subject,\n      message: this.settings.message,\n      title: this.settings.title,\n      cancel: this.settings.cancel,\n      template: this.settings.template,\n    };\n    this.settings.url = urls.get('send_message_modal', {\n      event_id: settings.event_id || window.event_id,\n    });\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default SendMessageModal;\n","import {EviteModal} from './index';\nimport urls from 'urls';\n\nclass ModalWarning {\n  settings = {\n    url: urls.get('modal_warning'),\n    buttons: ['Okay'],\n    title: null,\n    html: false,\n    width: '480px',\n    dialog: {},\n    url_parameters: {},\n  };\n\n  constructor(settings) {\n    this.settings = Object.assign({}, this.settings, settings);\n    this.settings.url_parameters.dialog = {\n      body: settings.body || '',\n      title: settings.title || this.settings.title,\n      buttons: settings.buttons || this.settings.buttons,\n      html: settings.html || this.settings.html,\n    };\n\n    return new EviteModal(this.settings);\n  }\n}\n\nexport default ModalWarning;\n","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e))for(t=0;t<e.length;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f);else for(t in e)e[t]&&(n&&(n+=\" \"),n+=t);return n}export function clsx(){for(var e,t,f=0,n=\"\";f<arguments.length;)(e=arguments[f++])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","function ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      _defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n  return target;\n}\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\n\nvar vendorPrefix;\nvar jsCssMap = {\n  Webkit: '-webkit-',\n  Moz: '-moz-',\n  // IE did it wrong again ...\n  ms: '-ms-',\n  O: '-o-'\n};\nfunction getVendorPrefix() {\n  if (vendorPrefix !== undefined) {\n    return vendorPrefix;\n  }\n  vendorPrefix = '';\n  var style = document.createElement('p').style;\n  var testProp = 'Transform';\n  for (var key in jsCssMap) {\n    if (key + testProp in style) {\n      vendorPrefix = key;\n    }\n  }\n  return vendorPrefix;\n}\nfunction getTransitionName() {\n  return getVendorPrefix() ? \"\".concat(getVendorPrefix(), \"TransitionProperty\") : 'transitionProperty';\n}\nfunction getTransformName() {\n  return getVendorPrefix() ? \"\".concat(getVendorPrefix(), \"Transform\") : 'transform';\n}\nfunction setTransitionProperty(node, value) {\n  var name = getTransitionName();\n  if (name) {\n    node.style[name] = value;\n    if (name !== 'transitionProperty') {\n      node.style.transitionProperty = value;\n    }\n  }\n}\nfunction setTransform(node, value) {\n  var name = getTransformName();\n  if (name) {\n    node.style[name] = value;\n    if (name !== 'transform') {\n      node.style.transform = value;\n    }\n  }\n}\nfunction getTransitionProperty(node) {\n  return node.style.transitionProperty || node.style[getTransitionName()];\n}\nfunction getTransformXY(node) {\n  var style = window.getComputedStyle(node, null);\n  var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());\n  if (transform && transform !== 'none') {\n    var matrix = transform.replace(/[^0-9\\-.,]/g, '').split(',');\n    return {\n      x: parseFloat(matrix[12] || matrix[4], 0),\n      y: parseFloat(matrix[13] || matrix[5], 0)\n    };\n  }\n  return {\n    x: 0,\n    y: 0\n  };\n}\nvar matrix2d = /matrix\\((.*)\\)/;\nvar matrix3d = /matrix3d\\((.*)\\)/;\nfunction setTransformXY(node, xy) {\n  var style = window.getComputedStyle(node, null);\n  var transform = style.getPropertyValue('transform') || style.getPropertyValue(getTransformName());\n  if (transform && transform !== 'none') {\n    var arr;\n    var match2d = transform.match(matrix2d);\n    if (match2d) {\n      match2d = match2d[1];\n      arr = match2d.split(',').map(function (item) {\n        return parseFloat(item, 10);\n      });\n      arr[4] = xy.x;\n      arr[5] = xy.y;\n      setTransform(node, \"matrix(\".concat(arr.join(','), \")\"));\n    } else {\n      var match3d = transform.match(matrix3d)[1];\n      arr = match3d.split(',').map(function (item) {\n        return parseFloat(item, 10);\n      });\n      arr[12] = xy.x;\n      arr[13] = xy.y;\n      setTransform(node, \"matrix3d(\".concat(arr.join(','), \")\"));\n    }\n  } else {\n    setTransform(node, \"translateX(\".concat(xy.x, \"px) translateY(\").concat(xy.y, \"px) translateZ(0)\"));\n  }\n}\n\nvar RE_NUM = /[\\-+]?(?:\\d*\\.|)\\d+(?:[eE][\\-+]?\\d+|)/.source;\nvar getComputedStyleX;\n\n// https://stackoverflow.com/a/3485654/3040605\nfunction forceRelayout(elem) {\n  var originalStyle = elem.style.display;\n  elem.style.display = 'none';\n  elem.offsetHeight; // eslint-disable-line\n  elem.style.display = originalStyle;\n}\nfunction css(el, name, v) {\n  var value = v;\n  if (_typeof(name) === 'object') {\n    for (var i in name) {\n      if (name.hasOwnProperty(i)) {\n        css(el, i, name[i]);\n      }\n    }\n    return undefined;\n  }\n  if (typeof value !== 'undefined') {\n    if (typeof value === 'number') {\n      value = \"\".concat(value, \"px\");\n    }\n    el.style[name] = value;\n    return undefined;\n  }\n  return getComputedStyleX(el, name);\n}\nfunction getClientPosition(elem) {\n  var box;\n  var x;\n  var y;\n  var doc = elem.ownerDocument;\n  var body = doc.body;\n  var docElem = doc && doc.documentElement;\n  // 根据 GBS 最新数据，A-Grade Browsers 都已支持 getBoundingClientRect 方法，不用再考虑传统的实现方式\n  box = elem.getBoundingClientRect();\n\n  // 注：jQuery 还考虑减去 docElem.clientLeft/clientTop\n  // 但测试发现，这样反而会导致当 html 和 body 有边距/边框样式时，获取的值不正确\n  // 此外，ie6 会忽略 html 的 margin 值，幸运地是没有谁会去设置 html 的 margin\n\n  x = Math.floor(box.left);\n  y = Math.floor(box.top);\n\n  // In IE, most of the time, 2 extra pixels are added to the top and left\n  // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n  // IE6 standards mode, this border can be overridden by setting the\n  // document element's border to zero -- thus, we cannot rely on the\n  // offset always being 2 pixels.\n\n  // In quirks mode, the offset can be determined by querying the body's\n  // clientLeft/clientTop, but in standards mode, it is found by querying\n  // the document element's clientLeft/clientTop.  Since we already called\n  // getClientBoundingRect we have already forced a reflow, so it is not\n  // too expensive just to query them all.\n\n  // ie 下应该减去窗口的边框吧，毕竟默认 absolute 都是相对窗口定位的\n  // 窗口边框标准是设 documentElement ,quirks 时设置 body\n  // 最好禁止在 body 和 html 上边框 ，但 ie < 9 html 默认有 2px ，减去\n  // 但是非 ie 不可能设置窗口边框，body html 也不是窗口 ,ie 可以通过 html,body 设置\n  // 标准 ie 下 docElem.clientTop 就是 border-top\n  // ie7 html 即窗口边框改变不了。永远为 2\n  // 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框，即使设了 border-top 也为 0\n\n  x -= docElem.clientLeft || body.clientLeft || 0;\n  y -= docElem.clientTop || body.clientTop || 0;\n  return {\n    left: x,\n    top: y\n  };\n}\nfunction getScroll(w, top) {\n  var ret = w[\"page\".concat(top ? 'Y' : 'X', \"Offset\")];\n  var method = \"scroll\".concat(top ? 'Top' : 'Left');\n  if (typeof ret !== 'number') {\n    var d = w.document;\n    // ie6,7,8 standard mode\n    ret = d.documentElement[method];\n    if (typeof ret !== 'number') {\n      // quirks mode\n      ret = d.body[method];\n    }\n  }\n  return ret;\n}\nfunction getScrollLeft(w) {\n  return getScroll(w);\n}\nfunction getScrollTop(w) {\n  return getScroll(w, true);\n}\nfunction getOffset(el) {\n  var pos = getClientPosition(el);\n  var doc = el.ownerDocument;\n  var w = doc.defaultView || doc.parentWindow;\n  pos.left += getScrollLeft(w);\n  pos.top += getScrollTop(w);\n  return pos;\n}\n\n/**\n * A crude way of determining if an object is a window\n * @member util\n */\nfunction isWindow(obj) {\n  // must use == for ie8\n  /* eslint eqeqeq:0 */\n  return obj !== null && obj !== undefined && obj == obj.window;\n}\nfunction getDocument(node) {\n  if (isWindow(node)) {\n    return node.document;\n  }\n  if (node.nodeType === 9) {\n    return node;\n  }\n  return node.ownerDocument;\n}\nfunction _getComputedStyle(elem, name, cs) {\n  var computedStyle = cs;\n  var val = '';\n  var d = getDocument(elem);\n  computedStyle = computedStyle || d.defaultView.getComputedStyle(elem, null);\n\n  // https://github.com/kissyteam/kissy/issues/61\n  if (computedStyle) {\n    val = computedStyle.getPropertyValue(name) || computedStyle[name];\n  }\n  return val;\n}\nvar _RE_NUM_NO_PX = new RegExp(\"^(\".concat(RE_NUM, \")(?!px)[a-z%]+$\"), 'i');\nvar RE_POS = /^(top|right|bottom|left)$/;\nvar CURRENT_STYLE = 'currentStyle';\nvar RUNTIME_STYLE = 'runtimeStyle';\nvar LEFT = 'left';\nvar PX = 'px';\nfunction _getComputedStyleIE(elem, name) {\n  // currentStyle maybe null\n  // http://msdn.microsoft.com/en-us/library/ms535231.aspx\n  var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name];\n\n  // 当 width/height 设置为百分比时，通过 pixelLeft 方式转换的 width/height 值\n  // 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19\n  // 在 ie 下不对，需要直接用 offset 方式\n  // borderWidth 等值也有问题，但考虑到 borderWidth 设为百分比的概率很小，这里就不考虑了\n\n  // From the awesome hack by Dean Edwards\n  // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n  // If we're not dealing with a regular pixel number\n  // but a number that has a weird ending, we need to convert it to pixels\n  // exclude left right for relativity\n  if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) {\n    // Remember the original values\n    var style = elem.style;\n    var left = style[LEFT];\n    var rsLeft = elem[RUNTIME_STYLE][LEFT];\n\n    // prevent flashing of content\n    elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT];\n\n    // Put in the new values to get a computed value out\n    style[LEFT] = name === 'fontSize' ? '1em' : ret || 0;\n    ret = style.pixelLeft + PX;\n\n    // Revert the changed values\n    style[LEFT] = left;\n    elem[RUNTIME_STYLE][LEFT] = rsLeft;\n  }\n  return ret === '' ? 'auto' : ret;\n}\nif (typeof window !== 'undefined') {\n  getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;\n}\nfunction getOffsetDirection(dir, option) {\n  if (dir === 'left') {\n    return option.useCssRight ? 'right' : dir;\n  }\n  return option.useCssBottom ? 'bottom' : dir;\n}\nfunction oppositeOffsetDirection(dir) {\n  if (dir === 'left') {\n    return 'right';\n  } else if (dir === 'right') {\n    return 'left';\n  } else if (dir === 'top') {\n    return 'bottom';\n  } else if (dir === 'bottom') {\n    return 'top';\n  }\n}\n\n// 设置 elem 相对 elem.ownerDocument 的坐标\nfunction setLeftTop(elem, offset, option) {\n  // set position first, in-case top/left are set even on static elem\n  if (css(elem, 'position') === 'static') {\n    elem.style.position = 'relative';\n  }\n  var presetH = -999;\n  var presetV = -999;\n  var horizontalProperty = getOffsetDirection('left', option);\n  var verticalProperty = getOffsetDirection('top', option);\n  var oppositeHorizontalProperty = oppositeOffsetDirection(horizontalProperty);\n  var oppositeVerticalProperty = oppositeOffsetDirection(verticalProperty);\n  if (horizontalProperty !== 'left') {\n    presetH = 999;\n  }\n  if (verticalProperty !== 'top') {\n    presetV = 999;\n  }\n  var originalTransition = '';\n  var originalOffset = getOffset(elem);\n  if ('left' in offset || 'top' in offset) {\n    originalTransition = getTransitionProperty(elem) || '';\n    setTransitionProperty(elem, 'none');\n  }\n  if ('left' in offset) {\n    elem.style[oppositeHorizontalProperty] = '';\n    elem.style[horizontalProperty] = \"\".concat(presetH, \"px\");\n  }\n  if ('top' in offset) {\n    elem.style[oppositeVerticalProperty] = '';\n    elem.style[verticalProperty] = \"\".concat(presetV, \"px\");\n  }\n  // force relayout\n  forceRelayout(elem);\n  var old = getOffset(elem);\n  var originalStyle = {};\n  for (var key in offset) {\n    if (offset.hasOwnProperty(key)) {\n      var dir = getOffsetDirection(key, option);\n      var preset = key === 'left' ? presetH : presetV;\n      var off = originalOffset[key] - old[key];\n      if (dir === key) {\n        originalStyle[dir] = preset + off;\n      } else {\n        originalStyle[dir] = preset - off;\n      }\n    }\n  }\n  css(elem, originalStyle);\n  // force relayout\n  forceRelayout(elem);\n  if ('left' in offset || 'top' in offset) {\n    setTransitionProperty(elem, originalTransition);\n  }\n  var ret = {};\n  for (var _key in offset) {\n    if (offset.hasOwnProperty(_key)) {\n      var _dir = getOffsetDirection(_key, option);\n      var _off = offset[_key] - originalOffset[_key];\n      if (_key === _dir) {\n        ret[_dir] = originalStyle[_dir] + _off;\n      } else {\n        ret[_dir] = originalStyle[_dir] - _off;\n      }\n    }\n  }\n  css(elem, ret);\n}\nfunction setTransform$1(elem, offset) {\n  var originalOffset = getOffset(elem);\n  var originalXY = getTransformXY(elem);\n  var resultXY = {\n    x: originalXY.x,\n    y: originalXY.y\n  };\n  if ('left' in offset) {\n    resultXY.x = originalXY.x + offset.left - originalOffset.left;\n  }\n  if ('top' in offset) {\n    resultXY.y = originalXY.y + offset.top - originalOffset.top;\n  }\n  setTransformXY(elem, resultXY);\n}\nfunction setOffset(elem, offset, option) {\n  if (option.ignoreShake) {\n    var oriOffset = getOffset(elem);\n    var oLeft = oriOffset.left.toFixed(0);\n    var oTop = oriOffset.top.toFixed(0);\n    var tLeft = offset.left.toFixed(0);\n    var tTop = offset.top.toFixed(0);\n    if (oLeft === tLeft && oTop === tTop) {\n      return;\n    }\n  }\n  if (option.useCssRight || option.useCssBottom) {\n    setLeftTop(elem, offset, option);\n  } else if (option.useCssTransform && getTransformName() in document.body.style) {\n    setTransform$1(elem, offset);\n  } else {\n    setLeftTop(elem, offset, option);\n  }\n}\nfunction each(arr, fn) {\n  for (var i = 0; i < arr.length; i++) {\n    fn(arr[i]);\n  }\n}\nfunction isBorderBoxFn(elem) {\n  return getComputedStyleX(elem, 'boxSizing') === 'border-box';\n}\nvar BOX_MODELS = ['margin', 'border', 'padding'];\nvar CONTENT_INDEX = -1;\nvar PADDING_INDEX = 2;\nvar BORDER_INDEX = 1;\nvar MARGIN_INDEX = 0;\nfunction swap(elem, options, callback) {\n  var old = {};\n  var style = elem.style;\n  var name;\n\n  // Remember the old values, and insert the new ones\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      old[name] = style[name];\n      style[name] = options[name];\n    }\n  }\n  callback.call(elem);\n\n  // Revert the old values\n  for (name in options) {\n    if (options.hasOwnProperty(name)) {\n      style[name] = old[name];\n    }\n  }\n}\nfunction getPBMWidth(elem, props, which) {\n  var value = 0;\n  var prop;\n  var j;\n  var i;\n  for (j = 0; j < props.length; j++) {\n    prop = props[j];\n    if (prop) {\n      for (i = 0; i < which.length; i++) {\n        var cssProp = void 0;\n        if (prop === 'border') {\n          cssProp = \"\".concat(prop).concat(which[i], \"Width\");\n        } else {\n          cssProp = prop + which[i];\n        }\n        value += parseFloat(getComputedStyleX(elem, cssProp)) || 0;\n      }\n    }\n  }\n  return value;\n}\nvar domUtils = {\n  getParent: function getParent(element) {\n    var parent = element;\n    do {\n      if (parent.nodeType === 11 && parent.host) {\n        parent = parent.host;\n      } else {\n        parent = parent.parentNode;\n      }\n    } while (parent && parent.nodeType !== 1 && parent.nodeType !== 9);\n    return parent;\n  }\n};\neach(['Width', 'Height'], function (name) {\n  domUtils[\"doc\".concat(name)] = function (refWin) {\n    var d = refWin.document;\n    return Math.max(\n    // firefox chrome documentElement.scrollHeight< body.scrollHeight\n    // ie standard mode : documentElement.scrollHeight> body.scrollHeight\n    d.documentElement[\"scroll\".concat(name)],\n    // quirks : documentElement.scrollHeight 最大等于可视窗口多一点？\n    d.body[\"scroll\".concat(name)], domUtils[\"viewport\".concat(name)](d));\n  };\n  domUtils[\"viewport\".concat(name)] = function (win) {\n    // pc browser includes scrollbar in window.innerWidth\n    var prop = \"client\".concat(name);\n    var doc = win.document;\n    var body = doc.body;\n    var documentElement = doc.documentElement;\n    var documentElementProp = documentElement[prop];\n    // 标准模式取 documentElement\n    // backcompat 取 body\n    return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp;\n  };\n});\n\n/*\n 得到元素的大小信息\n @param elem\n @param name\n @param {String} [extra]  'padding' : (css width) + padding\n 'border' : (css width) + padding + border\n 'margin' : (css width) + padding + border + margin\n */\nfunction getWH(elem, name, ex) {\n  var extra = ex;\n  if (isWindow(elem)) {\n    return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem);\n  } else if (elem.nodeType === 9) {\n    return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem);\n  }\n  var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  var borderBoxValue = name === 'width' ? Math.floor(elem.getBoundingClientRect().width) : Math.floor(elem.getBoundingClientRect().height);\n  var isBorderBox = isBorderBoxFn(elem);\n  var cssBoxValue = 0;\n  if (borderBoxValue === null || borderBoxValue === undefined || borderBoxValue <= 0) {\n    borderBoxValue = undefined;\n    // Fall back to computed then un computed css if necessary\n    cssBoxValue = getComputedStyleX(elem, name);\n    if (cssBoxValue === null || cssBoxValue === undefined || Number(cssBoxValue) < 0) {\n      cssBoxValue = elem.style[name] || 0;\n    }\n    // Normalize '', auto, and prepare for extra\n    cssBoxValue = Math.floor(parseFloat(cssBoxValue)) || 0;\n  }\n  if (extra === undefined) {\n    extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX;\n  }\n  var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox;\n  var val = borderBoxValue || cssBoxValue;\n  if (extra === CONTENT_INDEX) {\n    if (borderBoxValueOrIsBorderBox) {\n      return val - getPBMWidth(elem, ['border', 'padding'], which);\n    }\n    return cssBoxValue;\n  } else if (borderBoxValueOrIsBorderBox) {\n    if (extra === BORDER_INDEX) {\n      return val;\n    }\n    return val + (extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which) : getPBMWidth(elem, ['margin'], which));\n  }\n  return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which);\n}\nvar cssShow = {\n  position: 'absolute',\n  visibility: 'hidden',\n  display: 'block'\n};\n\n// fix #119 : https://github.com/kissyteam/kissy/issues/119\nfunction getWHIgnoreDisplay() {\n  for (var _len = arguments.length, args = new Array(_len), _key2 = 0; _key2 < _len; _key2++) {\n    args[_key2] = arguments[_key2];\n  }\n  var val;\n  var elem = args[0];\n  // in case elem is window\n  // elem.offsetWidth === undefined\n  if (elem.offsetWidth !== 0) {\n    val = getWH.apply(undefined, args);\n  } else {\n    swap(elem, cssShow, function () {\n      val = getWH.apply(undefined, args);\n    });\n  }\n  return val;\n}\neach(['width', 'height'], function (name) {\n  var first = name.charAt(0).toUpperCase() + name.slice(1);\n  domUtils[\"outer\".concat(first)] = function (el, includeMargin) {\n    return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX);\n  };\n  var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom'];\n  domUtils[name] = function (elem, v) {\n    var val = v;\n    if (val !== undefined) {\n      if (elem) {\n        var isBorderBox = isBorderBoxFn(elem);\n        if (isBorderBox) {\n          val += getPBMWidth(elem, ['padding', 'border'], which);\n        }\n        return css(elem, name, val);\n      }\n      return undefined;\n    }\n    return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX);\n  };\n});\nfunction mix(to, from) {\n  for (var i in from) {\n    if (from.hasOwnProperty(i)) {\n      to[i] = from[i];\n    }\n  }\n  return to;\n}\nvar utils = {\n  getWindow: function getWindow(node) {\n    if (node && node.document && node.setTimeout) {\n      return node;\n    }\n    var doc = node.ownerDocument || node;\n    return doc.defaultView || doc.parentWindow;\n  },\n  getDocument: getDocument,\n  offset: function offset(el, value, option) {\n    if (typeof value !== 'undefined') {\n      setOffset(el, value, option || {});\n    } else {\n      return getOffset(el);\n    }\n  },\n  isWindow: isWindow,\n  each: each,\n  css: css,\n  clone: function clone(obj) {\n    var i;\n    var ret = {};\n    for (i in obj) {\n      if (obj.hasOwnProperty(i)) {\n        ret[i] = obj[i];\n      }\n    }\n    var overflow = obj.overflow;\n    if (overflow) {\n      for (i in obj) {\n        if (obj.hasOwnProperty(i)) {\n          ret.overflow[i] = obj.overflow[i];\n        }\n      }\n    }\n    return ret;\n  },\n  mix: mix,\n  getWindowScrollLeft: function getWindowScrollLeft(w) {\n    return getScrollLeft(w);\n  },\n  getWindowScrollTop: function getWindowScrollTop(w) {\n    return getScrollTop(w);\n  },\n  merge: function merge() {\n    var ret = {};\n    for (var i = 0; i < arguments.length; i++) {\n      utils.mix(ret, i < 0 || arguments.length <= i ? undefined : arguments[i]);\n    }\n    return ret;\n  },\n  viewportWidth: 0,\n  viewportHeight: 0\n};\nmix(utils, domUtils);\n\n/**\n * 得到会导致元素显示不全的祖先元素\n */\nvar getParent = utils.getParent;\nfunction getOffsetParent(element) {\n  if (utils.isWindow(element) || element.nodeType === 9) {\n    return null;\n  }\n  // ie 这个也不是完全可行\n  /*\n   <div style=\"width: 50px;height: 100px;overflow: hidden\">\n   <div style=\"width: 50px;height: 100px;position: relative;\" id=\"d6\">\n   元素 6 高 100px 宽 50px<br/>\n   </div>\n   </div>\n   */\n  // element.offsetParent does the right thing in ie7 and below. Return parent with layout!\n  //  In other browsers it only includes elements with position absolute, relative or\n  // fixed, not elements with overflow set to auto or scroll.\n  //        if (UA.ie && ieMode < 8) {\n  //            return element.offsetParent;\n  //        }\n  // 统一的 offsetParent 方法\n  var doc = utils.getDocument(element);\n  var body = doc.body;\n  var parent;\n  var positionStyle = utils.css(element, 'position');\n  var skipStatic = positionStyle === 'fixed' || positionStyle === 'absolute';\n  if (!skipStatic) {\n    return element.nodeName.toLowerCase() === 'html' ? null : getParent(element);\n  }\n  for (parent = getParent(element); parent && parent !== body && parent.nodeType !== 9; parent = getParent(parent)) {\n    positionStyle = utils.css(parent, 'position');\n    if (positionStyle !== 'static') {\n      return parent;\n    }\n  }\n  return null;\n}\n\nvar getParent$1 = utils.getParent;\nfunction isAncestorFixed(element) {\n  if (utils.isWindow(element) || element.nodeType === 9) {\n    return false;\n  }\n  var doc = utils.getDocument(element);\n  var body = doc.body;\n  var parent = null;\n  for (parent = getParent$1(element);\n  // 修复元素位于 document.documentElement 下导致崩溃问题\n  parent && parent !== body && parent !== doc; parent = getParent$1(parent)) {\n    var positionStyle = utils.css(parent, 'position');\n    if (positionStyle === 'fixed') {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * 获得元素的显示部分的区域\n */\nfunction getVisibleRectForElement(element, alwaysByViewport) {\n  var visibleRect = {\n    left: 0,\n    right: Infinity,\n    top: 0,\n    bottom: Infinity\n  };\n  var el = getOffsetParent(element);\n  var doc = utils.getDocument(element);\n  var win = doc.defaultView || doc.parentWindow;\n  var body = doc.body;\n  var documentElement = doc.documentElement;\n\n  // Determine the size of the visible rect by climbing the dom accounting for\n  // all scrollable containers.\n  while (el) {\n    // clientWidth is zero for inline block elements in ie.\n    if ((navigator.userAgent.indexOf('MSIE') === -1 || el.clientWidth !== 0) &&\n    // body may have overflow set on it, yet we still get the entire\n    // viewport. In some browsers, el.offsetParent may be\n    // document.documentElement, so check for that too.\n    el !== body && el !== documentElement && utils.css(el, 'overflow') !== 'visible') {\n      var pos = utils.offset(el);\n      // add border\n      pos.left += el.clientLeft;\n      pos.top += el.clientTop;\n      visibleRect.top = Math.max(visibleRect.top, pos.top);\n      visibleRect.right = Math.min(visibleRect.right,\n      // consider area without scrollBar\n      pos.left + el.clientWidth);\n      visibleRect.bottom = Math.min(visibleRect.bottom, pos.top + el.clientHeight);\n      visibleRect.left = Math.max(visibleRect.left, pos.left);\n    } else if (el === body || el === documentElement) {\n      break;\n    }\n    el = getOffsetParent(el);\n  }\n\n  // Set element position to fixed\n  // make sure absolute element itself don't affect it's visible area\n  // https://github.com/ant-design/ant-design/issues/7601\n  var originalPosition = null;\n  if (!utils.isWindow(element) && element.nodeType !== 9) {\n    originalPosition = element.style.position;\n    var position = utils.css(element, 'position');\n    if (position === 'absolute') {\n      element.style.position = 'fixed';\n    }\n  }\n  var scrollX = utils.getWindowScrollLeft(win);\n  var scrollY = utils.getWindowScrollTop(win);\n  var viewportWidth = utils.viewportWidth(win);\n  var viewportHeight = utils.viewportHeight(win);\n  var documentWidth = documentElement.scrollWidth;\n  var documentHeight = documentElement.scrollHeight;\n\n  // scrollXXX on html is sync with body which means overflow: hidden on body gets wrong scrollXXX.\n  // We should cut this ourself.\n  var bodyStyle = window.getComputedStyle(body);\n  if (bodyStyle.overflowX === 'hidden') {\n    documentWidth = win.innerWidth;\n  }\n  if (bodyStyle.overflowY === 'hidden') {\n    documentHeight = win.innerHeight;\n  }\n\n  // Reset element position after calculate the visible area\n  if (element.style) {\n    element.style.position = originalPosition;\n  }\n  if (alwaysByViewport || isAncestorFixed(element)) {\n    // Clip by viewport's size.\n    visibleRect.left = Math.max(visibleRect.left, scrollX);\n    visibleRect.top = Math.max(visibleRect.top, scrollY);\n    visibleRect.right = Math.min(visibleRect.right, scrollX + viewportWidth);\n    visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + viewportHeight);\n  } else {\n    // Clip by document's size.\n    var maxVisibleWidth = Math.max(documentWidth, scrollX + viewportWidth);\n    visibleRect.right = Math.min(visibleRect.right, maxVisibleWidth);\n    var maxVisibleHeight = Math.max(documentHeight, scrollY + viewportHeight);\n    visibleRect.bottom = Math.min(visibleRect.bottom, maxVisibleHeight);\n  }\n  return visibleRect.top >= 0 && visibleRect.left >= 0 && visibleRect.bottom > visibleRect.top && visibleRect.right > visibleRect.left ? visibleRect : null;\n}\n\nfunction adjustForViewport(elFuturePos, elRegion, visibleRect, overflow) {\n  var pos = utils.clone(elFuturePos);\n  var size = {\n    width: elRegion.width,\n    height: elRegion.height\n  };\n  if (overflow.adjustX && pos.left < visibleRect.left) {\n    pos.left = visibleRect.left;\n  }\n\n  // Left edge inside and right edge outside viewport, try to resize it.\n  if (overflow.resizeWidth && pos.left >= visibleRect.left && pos.left + size.width > visibleRect.right) {\n    size.width -= pos.left + size.width - visibleRect.right;\n  }\n\n  // Right edge outside viewport, try to move it.\n  if (overflow.adjustX && pos.left + size.width > visibleRect.right) {\n    // 保证左边界和可视区域左边界对齐\n    pos.left = Math.max(visibleRect.right - size.width, visibleRect.left);\n  }\n\n  // Top edge outside viewport, try to move it.\n  if (overflow.adjustY && pos.top < visibleRect.top) {\n    pos.top = visibleRect.top;\n  }\n\n  // Top edge inside and bottom edge outside viewport, try to resize it.\n  if (overflow.resizeHeight && pos.top >= visibleRect.top && pos.top + size.height > visibleRect.bottom) {\n    size.height -= pos.top + size.height - visibleRect.bottom;\n  }\n\n  // Bottom edge outside viewport, try to move it.\n  if (overflow.adjustY && pos.top + size.height > visibleRect.bottom) {\n    // 保证上边界和可视区域上边界对齐\n    pos.top = Math.max(visibleRect.bottom - size.height, visibleRect.top);\n  }\n  return utils.mix(pos, size);\n}\n\nfunction getRegion(node) {\n  var offset;\n  var w;\n  var h;\n  if (!utils.isWindow(node) && node.nodeType !== 9) {\n    offset = utils.offset(node);\n    w = utils.outerWidth(node);\n    h = utils.outerHeight(node);\n  } else {\n    var win = utils.getWindow(node);\n    offset = {\n      left: utils.getWindowScrollLeft(win),\n      top: utils.getWindowScrollTop(win)\n    };\n    w = utils.viewportWidth(win);\n    h = utils.viewportHeight(win);\n  }\n  offset.width = w;\n  offset.height = h;\n  return offset;\n}\n\n/**\n * 获取 node 上的 align 对齐点 相对于页面的坐标\n */\n\nfunction getAlignOffset(region, align) {\n  var V = align.charAt(0);\n  var H = align.charAt(1);\n  var w = region.width;\n  var h = region.height;\n  var x = region.left;\n  var y = region.top;\n  if (V === 'c') {\n    y += h / 2;\n  } else if (V === 'b') {\n    y += h;\n  }\n  if (H === 'c') {\n    x += w / 2;\n  } else if (H === 'r') {\n    x += w;\n  }\n  return {\n    left: x,\n    top: y\n  };\n}\n\nfunction getElFuturePos(elRegion, refNodeRegion, points, offset, targetOffset) {\n  var p1 = getAlignOffset(refNodeRegion, points[1]);\n  var p2 = getAlignOffset(elRegion, points[0]);\n  var diff = [p2.left - p1.left, p2.top - p1.top];\n  return {\n    left: Math.round(elRegion.left - diff[0] + offset[0] - targetOffset[0]),\n    top: Math.round(elRegion.top - diff[1] + offset[1] - targetOffset[1])\n  };\n}\n\n/**\n * align dom node flexibly\n * @author yiminghe@gmail.com\n */\n\n// http://yiminghe.iteye.com/blog/1124720\n\nfunction isFailX(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.left < visibleRect.left || elFuturePos.left + elRegion.width > visibleRect.right;\n}\nfunction isFailY(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.top < visibleRect.top || elFuturePos.top + elRegion.height > visibleRect.bottom;\n}\nfunction isCompleteFailX(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.left > visibleRect.right || elFuturePos.left + elRegion.width < visibleRect.left;\n}\nfunction isCompleteFailY(elFuturePos, elRegion, visibleRect) {\n  return elFuturePos.top > visibleRect.bottom || elFuturePos.top + elRegion.height < visibleRect.top;\n}\nfunction flip(points, reg, map) {\n  var ret = [];\n  utils.each(points, function (p) {\n    ret.push(p.replace(reg, function (m) {\n      return map[m];\n    }));\n  });\n  return ret;\n}\nfunction flipOffset(offset, index) {\n  offset[index] = -offset[index];\n  return offset;\n}\nfunction convertOffset(str, offsetLen) {\n  var n;\n  if (/%$/.test(str)) {\n    n = parseInt(str.substring(0, str.length - 1), 10) / 100 * offsetLen;\n  } else {\n    n = parseInt(str, 10);\n  }\n  return n || 0;\n}\nfunction normalizeOffset(offset, el) {\n  offset[0] = convertOffset(offset[0], el.width);\n  offset[1] = convertOffset(offset[1], el.height);\n}\n\n/**\n * @param el\n * @param tgtRegion 参照节点所占的区域: { left, top, width, height }\n * @param align\n */\nfunction doAlign(el, tgtRegion, align, isTgtRegionVisible) {\n  var points = align.points;\n  var offset = align.offset || [0, 0];\n  var targetOffset = align.targetOffset || [0, 0];\n  var overflow = align.overflow;\n  var source = align.source || el;\n  offset = [].concat(offset);\n  targetOffset = [].concat(targetOffset);\n  overflow = overflow || {};\n  var newOverflowCfg = {};\n  var fail = 0;\n  var alwaysByViewport = !!(overflow && overflow.alwaysByViewport);\n  // 当前节点可以被放置的显示区域\n  var visibleRect = getVisibleRectForElement(source, alwaysByViewport);\n  // 当前节点所占的区域, left/top/width/height\n  var elRegion = getRegion(source);\n  // 将 offset 转换成数值，支持百分比\n  normalizeOffset(offset, elRegion);\n  normalizeOffset(targetOffset, tgtRegion);\n  // 当前节点将要被放置的位置\n  var elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset);\n  // 当前节点将要所处的区域\n  var newElRegion = utils.merge(elRegion, elFuturePos);\n\n  // 如果可视区域不能完全放置当前节点时允许调整\n  if (visibleRect && (overflow.adjustX || overflow.adjustY) && isTgtRegionVisible) {\n    if (overflow.adjustX) {\n      // 如果横向不能放下\n      if (isFailX(elFuturePos, elRegion, visibleRect)) {\n        // 对齐位置反下\n        var newPoints = flip(points, /[lr]/gi, {\n          l: 'r',\n          r: 'l'\n        });\n        // 偏移量也反下\n        var newOffset = flipOffset(offset, 0);\n        var newTargetOffset = flipOffset(targetOffset, 0);\n        var newElFuturePos = getElFuturePos(elRegion, tgtRegion, newPoints, newOffset, newTargetOffset);\n        if (!isCompleteFailX(newElFuturePos, elRegion, visibleRect)) {\n          fail = 1;\n          points = newPoints;\n          offset = newOffset;\n          targetOffset = newTargetOffset;\n        }\n      }\n    }\n    if (overflow.adjustY) {\n      // 如果纵向不能放下\n      if (isFailY(elFuturePos, elRegion, visibleRect)) {\n        // 对齐位置反下\n        var _newPoints = flip(points, /[tb]/gi, {\n          t: 'b',\n          b: 't'\n        });\n        // 偏移量也反下\n        var _newOffset = flipOffset(offset, 1);\n        var _newTargetOffset = flipOffset(targetOffset, 1);\n        var _newElFuturePos = getElFuturePos(elRegion, tgtRegion, _newPoints, _newOffset, _newTargetOffset);\n        if (!isCompleteFailY(_newElFuturePos, elRegion, visibleRect)) {\n          fail = 1;\n          points = _newPoints;\n          offset = _newOffset;\n          targetOffset = _newTargetOffset;\n        }\n      }\n    }\n\n    // 如果失败，重新计算当前节点将要被放置的位置\n    if (fail) {\n      elFuturePos = getElFuturePos(elRegion, tgtRegion, points, offset, targetOffset);\n      utils.mix(newElRegion, elFuturePos);\n    }\n    var isStillFailX = isFailX(elFuturePos, elRegion, visibleRect);\n    var isStillFailY = isFailY(elFuturePos, elRegion, visibleRect);\n    // 检查反下后的位置是否可以放下了，如果仍然放不下：\n    // 1. 复原修改过的定位参数\n    if (isStillFailX || isStillFailY) {\n      var _newPoints2 = points;\n\n      // 重置对应部分的翻转逻辑\n      if (isStillFailX) {\n        _newPoints2 = flip(points, /[lr]/gi, {\n          l: 'r',\n          r: 'l'\n        });\n      }\n      if (isStillFailY) {\n        _newPoints2 = flip(points, /[tb]/gi, {\n          t: 'b',\n          b: 't'\n        });\n      }\n      points = _newPoints2;\n      offset = align.offset || [0, 0];\n      targetOffset = align.targetOffset || [0, 0];\n    }\n    // 2. 只有指定了可以调整当前方向才调整\n    newOverflowCfg.adjustX = overflow.adjustX && isStillFailX;\n    newOverflowCfg.adjustY = overflow.adjustY && isStillFailY;\n\n    // 确实要调整，甚至可能会调整高度宽度\n    if (newOverflowCfg.adjustX || newOverflowCfg.adjustY) {\n      newElRegion = adjustForViewport(elFuturePos, elRegion, visibleRect, newOverflowCfg);\n    }\n  }\n\n  // need judge to in case set fixed with in css on height auto element\n  if (newElRegion.width !== elRegion.width) {\n    utils.css(source, 'width', utils.width(source) + newElRegion.width - elRegion.width);\n  }\n  if (newElRegion.height !== elRegion.height) {\n    utils.css(source, 'height', utils.height(source) + newElRegion.height - elRegion.height);\n  }\n\n  // https://github.com/kissyteam/kissy/issues/190\n  // 相对于屏幕位置没变，而 left/top 变了\n  // 例如 <div 'relative'><el absolute></div>\n  utils.offset(source, {\n    left: newElRegion.left,\n    top: newElRegion.top\n  }, {\n    useCssRight: align.useCssRight,\n    useCssBottom: align.useCssBottom,\n    useCssTransform: align.useCssTransform,\n    ignoreShake: align.ignoreShake\n  });\n  return {\n    points: points,\n    offset: offset,\n    targetOffset: targetOffset,\n    overflow: newOverflowCfg\n  };\n}\n/**\n *  2012-04-26 yiminghe@gmail.com\n *   - 优化智能对齐算法\n *   - 慎用 resizeXX\n *\n *  2011-07-13 yiminghe@gmail.com note:\n *   - 增加智能对齐，以及大小调整选项\n **/\n\nfunction isOutOfVisibleRect(target, alwaysByViewport) {\n  var visibleRect = getVisibleRectForElement(target, alwaysByViewport);\n  var targetRegion = getRegion(target);\n  return !visibleRect || targetRegion.left + targetRegion.width <= visibleRect.left || targetRegion.top + targetRegion.height <= visibleRect.top || targetRegion.left >= visibleRect.right || targetRegion.top >= visibleRect.bottom;\n}\nfunction alignElement(el, refNode, align) {\n  var target = align.target || refNode;\n  var refNodeRegion = getRegion(target);\n  var isTargetNotOutOfVisible = !isOutOfVisibleRect(target, align.overflow && align.overflow.alwaysByViewport);\n  return doAlign(el, refNodeRegion, align, isTargetNotOutOfVisible);\n}\nalignElement.__getOffsetParent = getOffsetParent;\nalignElement.__getVisibleRectForElement = getVisibleRectForElement;\n\n/**\n * `tgtPoint`: { pageX, pageY } or { clientX, clientY }.\n * If client position provided, will internal convert to page position.\n */\n\nfunction alignPoint(el, tgtPoint, align) {\n  var pageX;\n  var pageY;\n  var doc = utils.getDocument(el);\n  var win = doc.defaultView || doc.parentWindow;\n  var scrollX = utils.getWindowScrollLeft(win);\n  var scrollY = utils.getWindowScrollTop(win);\n  var viewportWidth = utils.viewportWidth(win);\n  var viewportHeight = utils.viewportHeight(win);\n  if ('pageX' in tgtPoint) {\n    pageX = tgtPoint.pageX;\n  } else {\n    pageX = scrollX + tgtPoint.clientX;\n  }\n  if ('pageY' in tgtPoint) {\n    pageY = tgtPoint.pageY;\n  } else {\n    pageY = scrollY + tgtPoint.clientY;\n  }\n  var tgtRegion = {\n    left: pageX,\n    top: pageY,\n    width: 0,\n    height: 0\n  };\n  var pointInView = pageX >= 0 && pageX <= scrollX + viewportWidth && pageY >= 0 && pageY <= scrollY + viewportHeight;\n\n  // Provide default target point\n  var points = [align.points[0], 'cc'];\n  return doAlign(el, tgtRegion, _objectSpread2(_objectSpread2({}, align), {}, {\n    points: points\n  }), pointInView);\n}\n\nexport default alignElement;\nexport { alignElement, alignPoint };\n//# sourceMappingURL=index.js.map\n","/*!\n  Copyright (c) 2015 Jed Watson.\n  Based on code that is Copyright 2013-2015, Facebook, Inc.\n  All rights reserved.\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar canUseDOM = !!(\n\t\ttypeof window !== 'undefined' &&\n\t\twindow.document &&\n\t\twindow.document.createElement\n\t);\n\n\tvar ExecutionEnvironment = {\n\n\t\tcanUseDOM: canUseDOM,\n\n\t\tcanUseWorkers: typeof Worker !== 'undefined',\n\n\t\tcanUseEventListeners:\n\t\t\tcanUseDOM && !!(window.addEventListener || window.attachEvent),\n\n\t\tcanUseViewport: canUseDOM && !!window.screen\n\n\t};\n\n\tif (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\tdefine(function () {\n\t\t\treturn ExecutionEnvironment;\n\t\t});\n\t} else if (typeof module !== 'undefined' && module.exports) {\n\t\tmodule.exports = ExecutionEnvironment;\n\t} else {\n\t\twindow.ExecutionEnvironment = ExecutionEnvironment;\n\t}\n\n}());\n","/* build: `node build.js modules=ALL exclude=gestures,accessors,erasing requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '5.2.4' };\nif (typeof exports !== 'undefined') {\n  exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n  define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n  if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n    fabric.document = document;\n  }\n  else {\n    fabric.document = document.implementation.createHTMLDocument('');\n  }\n  fabric.window = window;\n}\nelse {\n  // assume we're running under node.js when document/window are not present\n  var jsdom = require('jsdom');\n  var virtualWindow = new jsdom.JSDOM(\n    decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n    {\n      features: {\n        FetchExternalResources: ['img']\n      },\n      resources: 'usable'\n    }).window;\n  fabric.document = virtualWindow.document;\n  fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n  fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n  fabric.window = virtualWindow;\n  DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n  (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n                      typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n  'display',\n  'transform',\n  'fill', 'fill-opacity', 'fill-rule',\n  'opacity',\n  'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n  'stroke-linejoin', 'stroke-miterlimit',\n  'stroke-opacity', 'stroke-width',\n  'id', 'paint-order', 'vector-effect',\n  'instantiated_by_use', 'clip-path',\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n                          fabric.window.webkitDevicePixelRatio ||\n                          fabric.window.mozDevicePixelRatio ||\n                          1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n  if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n    console.log('max texture size: ' + fabric.maxTextureSize);\n    return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n  }\n  else if (fabric.Canvas2dFilterBackend) {\n    return (new fabric.Canvas2dFilterBackend());\n  }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n  // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n  window.fabric = fabric;\n}\n\n\n(function() {\n\n  /**\n   * @private\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  function _removeEventListener(eventName, handler) {\n    if (!this.__eventListeners[eventName]) {\n      return;\n    }\n    var eventListener = this.__eventListeners[eventName];\n    if (handler) {\n      eventListener[eventListener.indexOf(handler)] = false;\n    }\n    else {\n      fabric.util.array.fill(eventListener, false);\n    }\n  }\n\n  /**\n   * Observes specified event\n   * @memberOf fabric.Observable\n   * @alias on\n   * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function on(eventName, handler) {\n    if (!this.__eventListeners) {\n      this.__eventListeners = { };\n    }\n    // one object with key/value pairs was passed\n    if (arguments.length === 1) {\n      for (var prop in eventName) {\n        this.on(prop, eventName[prop]);\n      }\n    }\n    else {\n      if (!this.__eventListeners[eventName]) {\n        this.__eventListeners[eventName] = [];\n      }\n      this.__eventListeners[eventName].push(handler);\n    }\n    return this;\n  }\n\n  function _once(eventName, handler) {\n    var _handler = function () {\n      handler.apply(this, arguments);\n      this.off(eventName, _handler);\n    }.bind(this);\n    this.on(eventName, _handler);\n  }\n\n  function once(eventName, handler) {\n    // one object with key/value pairs was passed\n    if (arguments.length === 1) {\n      for (var prop in eventName) {\n        _once.call(this, prop, eventName[prop]);\n      }\n    }\n    else {\n      _once.call(this, eventName, handler);\n    }\n    return this;\n  }\n\n  /**\n   * Stops event observing for a particular event handler. Calling this method\n   * without arguments removes all handlers for all events\n   * @memberOf fabric.Observable\n   * @alias off\n   * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n   * @param {Function} handler Function to be deleted from EventListeners\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function off(eventName, handler) {\n    if (!this.__eventListeners) {\n      return this;\n    }\n\n    // remove all key/value pairs (event name -> event handler)\n    if (arguments.length === 0) {\n      for (eventName in this.__eventListeners) {\n        _removeEventListener.call(this, eventName);\n      }\n    }\n    // one object with key/value pairs was passed\n    else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n      for (var prop in eventName) {\n        _removeEventListener.call(this, prop, eventName[prop]);\n      }\n    }\n    else {\n      _removeEventListener.call(this, eventName, handler);\n    }\n    return this;\n  }\n\n  /**\n   * Fires event with an optional options object\n   * @memberOf fabric.Observable\n   * @param {String} eventName Event name to fire\n   * @param {Object} [options] Options object\n   * @return {Self} thisArg\n   * @chainable\n   */\n  function fire(eventName, options) {\n    if (!this.__eventListeners) {\n      return this;\n    }\n\n    var listenersForEvent = this.__eventListeners[eventName];\n    if (!listenersForEvent) {\n      return this;\n    }\n\n    for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n      listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n    }\n    this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n      return value !== false;\n    });\n    return this;\n  }\n\n  /**\n   * @namespace fabric.Observable\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n   * @see {@link http://fabricjs.com/events|Events demo}\n   */\n  fabric.Observable = {\n    fire: fire,\n    on: on,\n    once: once,\n    off: off,\n  };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n  _objects: [],\n\n  /**\n   * Adds objects to collection, Canvas or Group, then renders canvas\n   * (if `renderOnAddRemove` is not `false`).\n   * in case of Group no changes to bounding box are made.\n   * Objects should be instances of (or inherit from) fabric.Object\n   * Use of this function is highly discouraged for groups.\n   * you can add a bunch of objects with the add method but then you NEED\n   * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n   * @param {...fabric.Object} object Zero or more fabric instances\n   * @return {Self} thisArg\n   * @chainable\n   */\n  add: function () {\n    this._objects.push.apply(this._objects, arguments);\n    if (this._onObjectAdded) {\n      for (var i = 0, length = arguments.length; i < length; i++) {\n        this._onObjectAdded(arguments[i]);\n      }\n    }\n    this.renderOnAddRemove && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n   * An object should be an instance of (or inherit from) fabric.Object\n   * Use of this function is highly discouraged for groups.\n   * you can add a bunch of objects with the insertAt method but then you NEED\n   * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n   * @param {Object} object Object to insert\n   * @param {Number} index Index to insert object at\n   * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n   * @return {Self} thisArg\n   * @chainable\n   */\n  insertAt: function (object, index, nonSplicing) {\n    var objects = this._objects;\n    if (nonSplicing) {\n      objects[index] = object;\n    }\n    else {\n      objects.splice(index, 0, object);\n    }\n    this._onObjectAdded && this._onObjectAdded(object);\n    this.renderOnAddRemove && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n   * @param {...fabric.Object} object Zero or more fabric instances\n   * @return {Self} thisArg\n   * @chainable\n   */\n  remove: function() {\n    var objects = this._objects,\n        index, somethingRemoved = false;\n\n    for (var i = 0, length = arguments.length; i < length; i++) {\n      index = objects.indexOf(arguments[i]);\n\n      // only call onObjectRemoved if an object was actually removed\n      if (index !== -1) {\n        somethingRemoved = true;\n        objects.splice(index, 1);\n        this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n      }\n    }\n\n    this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Executes given function for each object in this group\n   * @param {Function} callback\n   *                   Callback invoked with current object as first argument,\n   *                   index - as second and an array of all objects - as third.\n   *                   Callback is invoked in a context of Global Object (e.g. `window`)\n   *                   when no `context` argument is given\n   *\n   * @param {Object} context Context (aka thisObject)\n   * @return {Self} thisArg\n   * @chainable\n   */\n  forEachObject: function(callback, context) {\n    var objects = this.getObjects();\n    for (var i = 0, len = objects.length; i < len; i++) {\n      callback.call(context, objects[i], i, objects);\n    }\n    return this;\n  },\n\n  /**\n   * Returns an array of children objects of this instance\n   * Type parameter introduced in 1.3.10\n   * since 2.3.5 this method return always a COPY of the array;\n   * @param {String} [type] When specified, only objects of this type are returned\n   * @return {Array}\n   */\n  getObjects: function(type) {\n    if (typeof type === 'undefined') {\n      return this._objects.concat();\n    }\n    return this._objects.filter(function(o) {\n      return o.type === type;\n    });\n  },\n\n  /**\n   * Returns object at specified index\n   * @param {Number} index\n   * @return {Self} thisArg\n   */\n  item: function (index) {\n    return this._objects[index];\n  },\n\n  /**\n   * Returns true if collection contains no objects\n   * @return {Boolean} true if collection is empty\n   */\n  isEmpty: function () {\n    return this._objects.length === 0;\n  },\n\n  /**\n   * Returns a size of a collection (i.e: length of an array containing its objects)\n   * @return {Number} Collection size\n   */\n  size: function() {\n    return this._objects.length;\n  },\n\n  /**\n   * Returns true if collection contains an object\n   * @param {Object} object Object to check against\n   * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n   * @return {Boolean} `true` if collection contains an object\n   */\n  contains: function (object, deep) {\n    if (this._objects.indexOf(object) > -1) {\n      return true;\n    }\n    else if (deep) {\n      return this._objects.some(function (obj) {\n        return typeof obj.contains === 'function' && obj.contains(object, true);\n      });\n    }\n    return false;\n  },\n\n  /**\n   * Returns number representation of a collection complexity\n   * @return {Number} complexity\n   */\n  complexity: function () {\n    return this._objects.reduce(function (memo, current) {\n      memo += current.complexity ? current.complexity() : 0;\n      return memo;\n    }, 0);\n  }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n  /**\n   * Sets object's properties from options\n   * @param {Object} [options] Options object\n   */\n  _setOptions: function(options) {\n    for (var prop in options) {\n      this.set(prop, options[prop]);\n    }\n  },\n\n  /**\n   * @private\n   * @param {Object} [filler] Options object\n   * @param {String} [property] property to set the Gradient to\n   */\n  _initGradient: function(filler, property) {\n    if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n      this.set(property, new fabric.Gradient(filler));\n    }\n  },\n\n  /**\n   * @private\n   * @param {Object} [filler] Options object\n   * @param {String} [property] property to set the Pattern to\n   * @param {Function} [callback] callback to invoke after pattern load\n   */\n  _initPattern: function(filler, property, callback) {\n    if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n      this.set(property, new fabric.Pattern(filler, callback));\n    }\n    else {\n      callback && callback();\n    }\n  },\n\n  /**\n   * @private\n   */\n  _setObject: function(obj) {\n    for (var prop in obj) {\n      this._set(prop, obj[prop]);\n    }\n  },\n\n  /**\n   * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n   * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n   * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  set: function(key, value) {\n    if (typeof key === 'object') {\n      this._setObject(key);\n    }\n    else {\n      this._set(key, value);\n    }\n    return this;\n  },\n\n  _set: function(key, value) {\n    this[key] = value;\n  },\n\n  /**\n   * Toggles specified property from `true` to `false` or from `false` to `true`\n   * @param {String} property Property to toggle\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  toggle: function(property) {\n    var value = this.get(property);\n    if (typeof value === 'boolean') {\n      this.set(property, !value);\n    }\n    return this;\n  },\n\n  /**\n   * Basic getter\n   * @param {String} property Property name\n   * @return {*} value of a property\n   */\n  get: function(property) {\n    return this[property];\n  }\n};\n\n\n(function(global) {\n\n  var sqrt = Math.sqrt,\n      atan2 = Math.atan2,\n      pow = Math.pow,\n      PiBy180 = Math.PI / 180,\n      PiBy2 = Math.PI / 2;\n\n  /**\n   * @namespace fabric.util\n   */\n  fabric.util = {\n\n    /**\n     * Calculate the cos of an angle, avoiding returning floats for known results\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} angle the angle in radians or in degree\n     * @return {Number}\n     */\n    cos: function(angle) {\n      if (angle === 0) { return 1; }\n      if (angle < 0) {\n        // cos(a) = cos(-a)\n        angle = -angle;\n      }\n      var angleSlice = angle / PiBy2;\n      switch (angleSlice) {\n        case 1: case 3: return 0;\n        case 2: return -1;\n      }\n      return Math.cos(angle);\n    },\n\n    /**\n     * Calculate the sin of an angle, avoiding returning floats for known results\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} angle the angle in radians or in degree\n     * @return {Number}\n     */\n    sin: function(angle) {\n      if (angle === 0) { return 0; }\n      var angleSlice = angle / PiBy2, sign = 1;\n      if (angle < 0) {\n        // sin(-a) = -sin(a)\n        sign = -1;\n      }\n      switch (angleSlice) {\n        case 1: return sign;\n        case 2: return 0;\n        case 3: return -sign;\n      }\n      return Math.sin(angle);\n    },\n\n    /**\n     * Removes value from an array.\n     * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} array\n     * @param {*} value\n     * @return {Array} original array\n     */\n    removeFromArray: function(array, value) {\n      var idx = array.indexOf(value);\n      if (idx !== -1) {\n        array.splice(idx, 1);\n      }\n      return array;\n    },\n\n    /**\n     * Returns random number between 2 specified ones.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} min lower limit\n     * @param {Number} max upper limit\n     * @return {Number} random value (between min and max)\n     */\n    getRandomInt: function(min, max) {\n      return Math.floor(Math.random() * (max - min + 1)) + min;\n    },\n\n    /**\n     * Transforms degrees to radians.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} degrees value in degrees\n     * @return {Number} value in radians\n     */\n    degreesToRadians: function(degrees) {\n      return degrees * PiBy180;\n    },\n\n    /**\n     * Transforms radians to degrees.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number} radians value in radians\n     * @return {Number} value in degrees\n     */\n    radiansToDegrees: function(radians) {\n      return radians / PiBy180;\n    },\n\n    /**\n     * Rotates `point` around `origin` with `radians`\n     * @static\n     * @memberOf fabric.util\n     * @param {fabric.Point} point The point to rotate\n     * @param {fabric.Point} origin The origin of the rotation\n     * @param {Number} radians The radians of the angle for the rotation\n     * @return {fabric.Point} The new rotated point\n     */\n    rotatePoint: function(point, origin, radians) {\n      var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y),\n          v = fabric.util.rotateVector(newPoint, radians);\n      return new fabric.Point(v.x, v.y).addEquals(origin);\n    },\n\n    /**\n     * Rotates `vector` with `radians`\n     * @static\n     * @memberOf fabric.util\n     * @param {Object} vector The vector to rotate (x and y)\n     * @param {Number} radians The radians of the angle for the rotation\n     * @return {Object} The new rotated point\n     */\n    rotateVector: function(vector, radians) {\n      var sin = fabric.util.sin(radians),\n          cos = fabric.util.cos(radians),\n          rx = vector.x * cos - vector.y * sin,\n          ry = vector.x * sin + vector.y * cos;\n      return {\n        x: rx,\n        y: ry\n      };\n    },\n\n    /**\n     * Creates a vetor from points represented as a point\n     * @static\n     * @memberOf fabric.util\n     *\n     * @typedef {Object} Point\n     * @property {number} x\n     * @property {number} y\n     *\n     * @param {Point} from\n     * @param {Point} to\n     * @returns {Point} vector\n     */\n    createVector: function (from, to) {\n      return new fabric.Point(to.x - from.x, to.y - from.y);\n    },\n\n    /**\n     * Calculates angle between 2 vectors using dot product\n     * @static\n     * @memberOf fabric.util\n     * @param {Point} a\n     * @param {Point} b\n     * @returns the angle in radian between the vectors\n     */\n    calcAngleBetweenVectors: function (a, b) {\n      return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y)));\n    },\n\n    /**\n     * @static\n     * @memberOf fabric.util\n     * @param {Point} v\n     * @returns {Point} vector representing the unit vector of pointing to the direction of `v`\n     */\n    getHatVector: function (v) {\n      return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y));\n    },\n\n    /**\n     * @static\n     * @memberOf fabric.util\n     * @param {Point} A\n     * @param {Point} B\n     * @param {Point} C\n     * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle\n     */\n    getBisector: function (A, B, C) {\n      var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C);\n      var alpha = fabric.util.calcAngleBetweenVectors(AB, AC);\n      //  check if alpha is relative to AB->BC\n      var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC);\n      var phi = alpha * (ro === 0 ? 1 : -1) / 2;\n      return {\n        vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)),\n        angle: alpha\n      };\n    },\n\n    /**\n     * Project stroke width on points returning 2 projections for each point as follows:\n     * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke.\n     * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector.\n     * - `round`: same as `bevel`\n     * Used to calculate object's bounding box\n     * @static\n     * @memberOf fabric.util\n     * @param {Point[]} points\n     * @param {Object} options\n     * @param {number} options.strokeWidth\n     * @param {'miter'|'bevel'|'round'} options.strokeLineJoin\n     * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n     * @param {boolean} options.strokeUniform\n     * @param {number} options.scaleX\n     * @param {number} options.scaleY\n     * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points\n     * @returns {fabric.Point[]} array of size 2n/4n of all suspected points\n     */\n    projectStrokeOnPoints: function (points, options, openPath) {\n      var coords = [], s = options.strokeWidth / 2,\n          strokeUniformScalar = options.strokeUniform ?\n            new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1),\n          getStrokeHatVector = function (v) {\n            var scalar = s / (Math.hypot(v.x, v.y));\n            return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y);\n          };\n      if (points.length <= 1) {return coords;}\n      points.forEach(function (p, index) {\n        var A = new fabric.Point(p.x, p.y), B, C;\n        if (index === 0) {\n          C = points[index + 1];\n          B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1];\n        }\n        else if (index === points.length - 1) {\n          B = points[index - 1];\n          C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0];\n        }\n        else {\n          B = points[index - 1];\n          C = points[index + 1];\n        }\n        var bisector = fabric.util.getBisector(A, B, C),\n            bisectorVector = bisector.vector,\n            alpha = bisector.angle,\n            scalar,\n            miterVector;\n        if (options.strokeLineJoin === 'miter') {\n          scalar = -s / Math.sin(alpha / 2);\n          miterVector = new fabric.Point(\n            bisectorVector.x * scalar * strokeUniformScalar.x,\n            bisectorVector.y * scalar * strokeUniformScalar.y\n          );\n          if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) {\n            coords.push(A.add(miterVector));\n            coords.push(A.subtract(miterVector));\n            return;\n          }\n        }\n        scalar = -s * Math.SQRT2;\n        miterVector = new fabric.Point(\n          bisectorVector.x * scalar * strokeUniformScalar.x,\n          bisectorVector.y * scalar * strokeUniformScalar.y\n        );\n        coords.push(A.add(miterVector));\n        coords.push(A.subtract(miterVector));\n      });\n      return coords;\n    },\n\n    /**\n     * Apply transform t to point p\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Point} p The point to transform\n     * @param  {Array} t The transform\n     * @param  {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n     * @return {fabric.Point} The transformed point\n     */\n    transformPoint: function(p, t, ignoreOffset) {\n      if (ignoreOffset) {\n        return new fabric.Point(\n          t[0] * p.x + t[2] * p.y,\n          t[1] * p.x + t[3] * p.y\n        );\n      }\n      return new fabric.Point(\n        t[0] * p.x + t[2] * p.y + t[4],\n        t[1] * p.x + t[3] * p.y + t[5]\n      );\n    },\n\n    /**\n     * Returns coordinates of points's bounding rectangle (left, top, width, height)\n     * @param {Array} points 4 points array\n     * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n     * @return {Object} Object with left, top, width, height properties\n     */\n    makeBoundingBoxFromPoints: function(points, transform) {\n      if (transform) {\n        for (var i = 0; i < points.length; i++) {\n          points[i] = fabric.util.transformPoint(points[i], transform);\n        }\n      }\n      var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n          minX = fabric.util.array.min(xPoints),\n          maxX = fabric.util.array.max(xPoints),\n          width = maxX - minX,\n          yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n          minY = fabric.util.array.min(yPoints),\n          maxY = fabric.util.array.max(yPoints),\n          height = maxY - minY;\n\n      return {\n        left: minX,\n        top: minY,\n        width: width,\n        height: height\n      };\n    },\n\n    /**\n     * Invert transformation t\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} t The transform\n     * @return {Array} The inverted transform\n     */\n    invertTransform: function(t) {\n      var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n          r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n          o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n      r[4] = -o.x;\n      r[5] = -o.y;\n      return r;\n    },\n\n    /**\n     * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n     * @static\n     * @memberOf fabric.util\n     * @param {Number|String} number number to operate on\n     * @param {Number} fractionDigits number of fraction digits to \"leave\"\n     * @return {Number}\n     */\n    toFixed: function(number, fractionDigits) {\n      return parseFloat(Number(number).toFixed(fractionDigits));\n    },\n\n    /**\n     * Converts from attribute value to pixel value if applicable.\n     * Returns converted pixels or original value not converted.\n     * @param {Number|String} value number to operate on\n     * @param {Number} fontSize\n     * @return {Number|String}\n     */\n    parseUnit: function(value, fontSize) {\n      var unit = /\\D{0,2}$/.exec(value),\n          number = parseFloat(value);\n      if (!fontSize) {\n        fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n      }\n      switch (unit[0]) {\n        case 'mm':\n          return number * fabric.DPI / 25.4;\n\n        case 'cm':\n          return number * fabric.DPI / 2.54;\n\n        case 'in':\n          return number * fabric.DPI;\n\n        case 'pt':\n          return number * fabric.DPI / 72; // or * 4 / 3\n\n        case 'pc':\n          return number * fabric.DPI / 72 * 12; // or * 16\n\n        case 'em':\n          return number * fontSize;\n\n        default:\n          return number;\n      }\n    },\n\n    /**\n     * Function which always returns `false`.\n     * @static\n     * @memberOf fabric.util\n     * @return {Boolean}\n     */\n    falseFunction: function() {\n      return false;\n    },\n\n    /**\n     * Returns klass \"Class\" object of given namespace\n     * @memberOf fabric.util\n     * @param {String} type Type of object (eg. 'circle')\n     * @param {String} namespace Namespace to get klass \"Class\" object from\n     * @return {Object} klass \"Class\"\n     */\n    getKlass: function(type, namespace) {\n      // capitalize first letter only\n      type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n      return fabric.util.resolveNamespace(namespace)[type];\n    },\n\n    /**\n     * Returns array of attributes for given svg that fabric parses\n     * @memberOf fabric.util\n     * @param {String} type Type of svg element (eg. 'circle')\n     * @return {Array} string names of supported attributes\n     */\n    getSvgAttributes: function(type) {\n      var attributes = [\n        'instantiated_by_use',\n        'style',\n        'id',\n        'class'\n      ];\n      switch (type) {\n        case 'linearGradient':\n          attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n          break;\n        case 'radialGradient':\n          attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n          break;\n        case 'stop':\n          attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n          break;\n      }\n      return attributes;\n    },\n\n    /**\n     * Returns object of given namespace\n     * @memberOf fabric.util\n     * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n     * @return {Object} Object for given namespace (default fabric)\n     */\n    resolveNamespace: function(namespace) {\n      if (!namespace) {\n        return fabric;\n      }\n\n      var parts = namespace.split('.'),\n          len = parts.length, i,\n          obj = global || fabric.window;\n\n      for (i = 0; i < len; ++i) {\n        obj = obj[parts[i]];\n      }\n\n      return obj;\n    },\n\n    /**\n     * Loads image element from given url and passes it to a callback\n     * @memberOf fabric.util\n     * @param {String} url URL representing an image\n     * @param {Function} callback Callback; invoked with loaded image\n     * @param {*} [context] Context to invoke callback in\n     * @param {Object} [crossOrigin] crossOrigin value to set image element to\n     */\n    loadImage: function(url, callback, context, crossOrigin) {\n      if (!url) {\n        callback && callback.call(context, url);\n        return;\n      }\n\n      var img = fabric.util.createImage();\n\n      /** @ignore */\n      var onLoadCallback = function () {\n        callback && callback.call(context, img, false);\n        img = img.onload = img.onerror = null;\n      };\n\n      img.onload = onLoadCallback;\n      /** @ignore */\n      img.onerror = function() {\n        fabric.log('Error loading ' + img.src);\n        callback && callback.call(context, null, true);\n        img = img.onload = img.onerror = null;\n      };\n\n      // data-urls appear to be buggy with crossOrigin\n      // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n      // see https://code.google.com/p/chromium/issues/detail?id=315152\n      //     https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n      // crossOrigin null is the same as not set.\n      if (url.indexOf('data') !== 0 &&\n        crossOrigin !== undefined &&\n        crossOrigin !== null) {\n        img.crossOrigin = crossOrigin;\n      }\n\n      // IE10 / IE11-Fix: SVG contents from data: URI\n      // will only be available if the IMG is present\n      // in the DOM (and visible)\n      if (url.substring(0,14) === 'data:image/svg') {\n        img.onload = null;\n        fabric.util.loadImageInDom(img, onLoadCallback);\n      }\n\n      img.src = url;\n    },\n\n    /**\n     * Attaches SVG image with data: URL to the dom\n     * @memberOf fabric.util\n     * @param {Object} img Image object with data:image/svg src\n     * @param {Function} callback Callback; invoked with loaded image\n     * @return {Object} DOM element (div containing the SVG image)\n     */\n    loadImageInDom: function(img, onLoadCallback) {\n      var div = fabric.document.createElement('div');\n      div.style.width = div.style.height = '1px';\n      div.style.left = div.style.top = '-100%';\n      div.style.position = 'absolute';\n      div.appendChild(img);\n      fabric.document.querySelector('body').appendChild(div);\n      /**\n       * Wrap in function to:\n       *   1. Call existing callback\n       *   2. Cleanup DOM\n       */\n      img.onload = function () {\n        onLoadCallback();\n        div.parentNode.removeChild(div);\n        div = null;\n      };\n    },\n\n    /**\n     * Creates corresponding fabric instances from their object representations\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} objects Objects to enliven\n     * @param {Function} callback Callback to invoke when all objects are created\n     * @param {String} namespace Namespace to get klass \"Class\" object from\n     * @param {Function} reviver Method for further parsing of object elements,\n     * called after each fabric object created.\n     */\n    enlivenObjects: function(objects, callback, namespace, reviver) {\n      objects = objects || [];\n\n      var enlivenedObjects = [],\n          numLoadedObjects = 0,\n          numTotalObjects = objects.length;\n\n      function onLoaded() {\n        if (++numLoadedObjects === numTotalObjects) {\n          callback && callback(enlivenedObjects.filter(function(obj) {\n            // filter out undefined objects (objects that gave error)\n            return obj;\n          }));\n        }\n      }\n\n      if (!numTotalObjects) {\n        callback && callback(enlivenedObjects);\n        return;\n      }\n\n      objects.forEach(function (o, index) {\n        // if sparse array\n        if (!o || !o.type) {\n          onLoaded();\n          return;\n        }\n        var klass = fabric.util.getKlass(o.type, namespace);\n        klass.fromObject(o, function (obj, error) {\n          error || (enlivenedObjects[index] = obj);\n          reviver && reviver(o, obj, error);\n          onLoaded();\n        });\n      });\n    },\n\n    /**\n     * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n     * @see {@link fabric.Object.ENLIVEN_PROPS}\n     * @param {Object} object\n     * @param {Object} [context] assign enlived props to this object (pass null to skip this)\n     * @param {(objects:fabric.Object[]) => void} callback\n     */\n    enlivenObjectEnlivables: function (object, context, callback) {\n      var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; });\n      fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) {\n        var objects = {};\n        enlivenProps.forEach(function (key, index) {\n          objects[key] = enlivedProps[index];\n          context && (context[key] = enlivedProps[index]);\n        });\n        callback && callback(objects);\n      });\n    },\n\n    /**\n     * Create and wait for loading of patterns\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} patterns Objects to enliven\n     * @param {Function} callback Callback to invoke when all objects are created\n     * called after each fabric object created.\n     */\n    enlivenPatterns: function(patterns, callback) {\n      patterns = patterns || [];\n\n      function onLoaded() {\n        if (++numLoadedPatterns === numPatterns) {\n          callback && callback(enlivenedPatterns);\n        }\n      }\n\n      var enlivenedPatterns = [],\n          numLoadedPatterns = 0,\n          numPatterns = patterns.length;\n\n      if (!numPatterns) {\n        callback && callback(enlivenedPatterns);\n        return;\n      }\n\n      patterns.forEach(function (p, index) {\n        if (p && p.source) {\n          new fabric.Pattern(p, function(pattern) {\n            enlivenedPatterns[index] = pattern;\n            onLoaded();\n          });\n        }\n        else {\n          enlivenedPatterns[index] = p;\n          onLoaded();\n        }\n      });\n    },\n\n    /**\n     * Groups SVG elements (usually those retrieved from SVG document)\n     * @static\n     * @memberOf fabric.util\n     * @param {Array} elements SVG elements to group\n     * @param {Object} [options] Options object\n     * @param {String} path Value to set sourcePath to\n     * @return {fabric.Object|fabric.Group}\n     */\n    groupSVGElements: function(elements, options, path) {\n      var object;\n      if (elements && elements.length === 1) {\n        if (typeof path !== 'undefined') {\n          elements[0].sourcePath = path;\n        }\n        return elements[0];\n      }\n      if (options) {\n        if (options.width && options.height) {\n          options.centerPoint = {\n            x: options.width / 2,\n            y: options.height / 2\n          };\n        }\n        else {\n          delete options.width;\n          delete options.height;\n        }\n      }\n      object = new fabric.Group(elements, options);\n      if (typeof path !== 'undefined') {\n        object.sourcePath = path;\n      }\n      return object;\n    },\n\n    /**\n     * Populates an object with properties of another object\n     * @static\n     * @memberOf fabric.util\n     * @param {Object} source Source object\n     * @param {Object} destination Destination object\n     * @return {Array} properties Properties names to include\n     */\n    populateWithProperties: function(source, destination, properties) {\n      if (properties && Array.isArray(properties)) {\n        for (var i = 0, len = properties.length; i < len; i++) {\n          if (properties[i] in source) {\n            destination[properties[i]] = source[properties[i]];\n          }\n        }\n      }\n    },\n\n    /**\n     * Creates canvas element\n     * @static\n     * @memberOf fabric.util\n     * @return {CanvasElement} initialized canvas element\n     */\n    createCanvasElement: function() {\n      return fabric.document.createElement('canvas');\n    },\n\n    /**\n     * Creates a canvas element that is a copy of another and is also painted\n     * @param {CanvasElement} canvas to copy size and content of\n     * @static\n     * @memberOf fabric.util\n     * @return {CanvasElement} initialized canvas element\n     */\n    copyCanvasElement: function(canvas) {\n      var newCanvas = fabric.util.createCanvasElement();\n      newCanvas.width = canvas.width;\n      newCanvas.height = canvas.height;\n      newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n      return newCanvas;\n    },\n\n    /**\n     * since 2.6.0 moved from canvas instance to utility.\n     * @param {CanvasElement} canvasEl to copy size and content of\n     * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n     * @param {Number} quality <= 1 and > 0\n     * @static\n     * @memberOf fabric.util\n     * @return {String} data url\n     */\n    toDataURL: function(canvasEl, format, quality) {\n      return canvasEl.toDataURL('image/' + format, quality);\n    },\n\n    /**\n     * Creates image element (works on client and node)\n     * @static\n     * @memberOf fabric.util\n     * @return {HTMLImageElement} HTML image element\n     */\n    createImage: function() {\n      return fabric.document.createElement('img');\n    },\n\n    /**\n     * Multiply matrix A by matrix B to nest transformations\n     * @static\n     * @memberOf fabric.util\n     * @param  {Array} a First transformMatrix\n     * @param  {Array} b Second transformMatrix\n     * @param  {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n     * @return {Array} The product of the two transform matrices\n     */\n    multiplyTransformMatrices: function(a, b, is2x2) {\n      // Matrix multiply a * b\n      return [\n        a[0] * b[0] + a[2] * b[1],\n        a[1] * b[0] + a[3] * b[1],\n        a[0] * b[2] + a[2] * b[3],\n        a[1] * b[2] + a[3] * b[3],\n        is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n        is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n      ];\n    },\n\n    /**\n     * Decomposes standard 2x3 matrix into transform components\n     * @static\n     * @memberOf fabric.util\n     * @param  {Array} a transformMatrix\n     * @return {Object} Components of transform\n     */\n    qrDecompose: function(a) {\n      var angle = atan2(a[1], a[0]),\n          denom = pow(a[0], 2) + pow(a[1], 2),\n          scaleX = sqrt(denom),\n          scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n          skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n      return {\n        angle: angle / PiBy180,\n        scaleX: scaleX,\n        scaleY: scaleY,\n        skewX: skewX / PiBy180,\n        skewY: 0,\n        translateX: a[4],\n        translateY: a[5]\n      };\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.angle] angle in degrees\n     * @return {Number[]} transform matrix\n     */\n    calcRotateMatrix: function(options) {\n      if (!options.angle) {\n        return fabric.iMatrix.concat();\n      }\n      var theta = fabric.util.degreesToRadians(options.angle),\n          cos = fabric.util.cos(theta),\n          sin = fabric.util.sin(theta);\n      return [cos, sin, -sin, cos, 0, 0];\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet.\n     * is called DimensionsTransformMatrix because those properties are the one that influence\n     * the size of the resulting box of the object.\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.scaleX]\n     * @param  {Number} [options.scaleY]\n     * @param  {Boolean} [options.flipX]\n     * @param  {Boolean} [options.flipY]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.skewY]\n     * @return {Number[]} transform matrix\n     */\n    calcDimensionsMatrix: function(options) {\n      var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n          scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n          scaleMatrix = [\n            options.flipX ? -scaleX : scaleX,\n            0,\n            0,\n            options.flipY ? -scaleY : scaleY,\n            0,\n            0],\n          multiply = fabric.util.multiplyTransformMatrices,\n          degreesToRadians = fabric.util.degreesToRadians;\n      if (options.skewX) {\n        scaleMatrix = multiply(\n          scaleMatrix,\n          [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n          true);\n      }\n      if (options.skewY) {\n        scaleMatrix = multiply(\n          scaleMatrix,\n          [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n          true);\n      }\n      return scaleMatrix;\n    },\n\n    /**\n     * Returns a transform matrix starting from an object of the same kind of\n     * the one returned from qrDecompose, useful also if you want to calculate some\n     * transformations from an object that is not enlived yet\n     * @static\n     * @memberOf fabric.util\n     * @param  {Object} options\n     * @param  {Number} [options.angle]\n     * @param  {Number} [options.scaleX]\n     * @param  {Number} [options.scaleY]\n     * @param  {Boolean} [options.flipX]\n     * @param  {Boolean} [options.flipY]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.skewX]\n     * @param  {Number} [options.translateX]\n     * @param  {Number} [options.translateY]\n     * @return {Number[]} transform matrix\n     */\n    composeMatrix: function(options) {\n      var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n          multiply = fabric.util.multiplyTransformMatrices;\n      if (options.angle) {\n        matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n      }\n      if (options.scaleX !== 1 || options.scaleY !== 1 ||\n          options.skewX || options.skewY || options.flipX || options.flipY) {\n        matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n      }\n      return matrix;\n    },\n\n    /**\n     * reset an object transform state to neutral. Top and left are not accounted for\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Object} target object to transform\n     */\n    resetObjectTransform: function (target) {\n      target.scaleX = 1;\n      target.scaleY = 1;\n      target.skewX = 0;\n      target.skewY = 0;\n      target.flipX = false;\n      target.flipY = false;\n      target.rotate(0);\n    },\n\n    /**\n     * Extract Object transform values\n     * @static\n     * @memberOf fabric.util\n     * @param  {fabric.Object} target object to read from\n     * @return {Object} Components of transform\n     */\n    saveObjectTransform: function (target) {\n      return {\n        scaleX: target.scaleX,\n        scaleY: target.scaleY,\n        skewX: target.skewX,\n        skewY: target.skewY,\n        angle: target.angle,\n        left: target.left,\n        flipX: target.flipX,\n        flipY: target.flipY,\n        top: target.top\n      };\n    },\n\n    /**\n     * Returns true if context has transparent pixel\n     * at specified location (taking tolerance into account)\n     * @param {CanvasRenderingContext2D} ctx context\n     * @param {Number} x x coordinate\n     * @param {Number} y y coordinate\n     * @param {Number} tolerance Tolerance\n     */\n    isTransparent: function(ctx, x, y, tolerance) {\n\n      // If tolerance is > 0 adjust start coords to take into account.\n      // If moves off Canvas fix to 0\n      if (tolerance > 0) {\n        if (x > tolerance) {\n          x -= tolerance;\n        }\n        else {\n          x = 0;\n        }\n        if (y > tolerance) {\n          y -= tolerance;\n        }\n        else {\n          y = 0;\n        }\n      }\n\n      var _isTransparent = true, i, temp,\n          imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n          l = imageData.data.length;\n\n      // Split image data - for tolerance > 1, pixelDataSize = 4;\n      for (i = 3; i < l; i += 4) {\n        temp = imageData.data[i];\n        _isTransparent = temp <= 0;\n        if (_isTransparent === false) {\n          break; // Stop if colour found\n        }\n      }\n\n      imageData = null;\n\n      return _isTransparent;\n    },\n\n    /**\n     * Parse preserveAspectRatio attribute from element\n     * @param {string} attribute to be parsed\n     * @return {Object} an object containing align and meetOrSlice attribute\n     */\n    parsePreserveAspectRatioAttribute: function(attribute) {\n      var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n          aspectRatioAttrs = attribute.split(' '), align;\n\n      if (aspectRatioAttrs && aspectRatioAttrs.length) {\n        meetOrSlice = aspectRatioAttrs.pop();\n        if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n          align = meetOrSlice;\n          meetOrSlice = 'meet';\n        }\n        else if (aspectRatioAttrs.length) {\n          align = aspectRatioAttrs.pop();\n        }\n      }\n      //divide align in alignX and alignY\n      alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n      alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n      return {\n        meetOrSlice: meetOrSlice,\n        alignX: alignX,\n        alignY: alignY\n      };\n    },\n\n    /**\n     * Clear char widths cache for the given font family or all the cache if no\n     * fontFamily is specified.\n     * Use it if you know you are loading fonts in a lazy way and you are not waiting\n     * for custom fonts to load properly when adding text objects to the canvas.\n     * If a text object is added when its own font is not loaded yet, you will get wrong\n     * measurement and so wrong bounding boxes.\n     * After the font cache is cleared, either change the textObject text content or call\n     * initDimensions() to trigger a recalculation\n     * @memberOf fabric.util\n     * @param {String} [fontFamily] font family to clear\n     */\n    clearFabricFontCache: function(fontFamily) {\n      fontFamily = (fontFamily || '').toLowerCase();\n      if (!fontFamily) {\n        fabric.charWidthsCache = { };\n      }\n      else if (fabric.charWidthsCache[fontFamily]) {\n        delete fabric.charWidthsCache[fontFamily];\n      }\n    },\n\n    /**\n     * Given current aspect ratio, determines the max width and height that can\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Number} ar aspect ratio\n     * @param {Number} maximumArea Maximum area you want to achieve\n     * @return {Object.x} Limited dimensions by X\n     * @return {Object.y} Limited dimensions by Y\n     */\n    limitDimsByArea: function(ar, maximumArea) {\n      var roughWidth = Math.sqrt(maximumArea * ar),\n          perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n      return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n    },\n\n    capValue: function(min, value, max) {\n      return Math.max(min, Math.min(value, max));\n    },\n\n    /**\n     * Finds the scale for the object source to fit inside the object destination,\n     * keeping aspect ratio intact.\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Object | fabric.Object} source\n     * @param {Number} source.height natural unscaled height of the object\n     * @param {Number} source.width natural unscaled width of the object\n     * @param {Object | fabric.Object} destination\n     * @param {Number} destination.height natural unscaled height of the object\n     * @param {Number} destination.width natural unscaled width of the object\n     * @return {Number} scale factor to apply to source to fit into destination\n     */\n    findScaleToFit: function(source, destination) {\n      return Math.min(destination.width / source.width, destination.height / source.height);\n    },\n\n    /**\n     * Finds the scale for the object source to cover entirely the object destination,\n     * keeping aspect ratio intact.\n     * respect the total allowed area for the cache.\n     * @memberOf fabric.util\n     * @param {Object | fabric.Object} source\n     * @param {Number} source.height natural unscaled height of the object\n     * @param {Number} source.width natural unscaled width of the object\n     * @param {Object | fabric.Object} destination\n     * @param {Number} destination.height natural unscaled height of the object\n     * @param {Number} destination.width natural unscaled width of the object\n     * @return {Number} scale factor to apply to source to cover destination\n     */\n    findScaleToCover: function(source, destination) {\n      return Math.max(destination.width / source.width, destination.height / source.height);\n    },\n\n    /**\n     * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n     * @memberOf fabric.util\n     * @param {Array} transform an array with 6 numbers\n     * @return {String} transform matrix for svg\n     * @return {Object.y} Limited dimensions by Y\n     */\n    matrixToSVG: function(transform) {\n      return 'matrix(' + transform.map(function(value) {\n        return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n      }).join(' ') + ')';\n    },\n\n    /**\n     * given an object and a transform, apply the inverse transform to the object,\n     * this is equivalent to remove from that object that transformation, so that\n     * added in a space with the removed transform, the object will be the same as before.\n     * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n     * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg\n     * in the opposite direction.\n     * This util is used to add objects inside transformed groups or nested groups.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    removeTransformFromObject: function(object, transform) {\n      var inverted = fabric.util.invertTransform(transform),\n          finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix());\n      fabric.util.applyTransformToObject(object, finalTransform);\n    },\n\n    /**\n     * given an object and a transform, apply the transform to the object.\n     * this is equivalent to change the space where the object is drawn.\n     * Adding to an object a transform that scale by 2 is like scaling it by 2.\n     * This is used when removing an object from an active selection for example.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    addTransformToObject: function(object, transform) {\n      fabric.util.applyTransformToObject(\n        object,\n        fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix())\n      );\n    },\n\n    /**\n     * discard an object transform state and apply the one from the matrix.\n     * @memberOf fabric.util\n     * @param {fabric.Object} object the object you want to transform\n     * @param {Array} transform the destination transform\n     */\n    applyTransformToObject: function(object, transform) {\n      var options = fabric.util.qrDecompose(transform),\n          center = new fabric.Point(options.translateX, options.translateY);\n      object.flipX = false;\n      object.flipY = false;\n      object.set('scaleX', options.scaleX);\n      object.set('scaleY', options.scaleY);\n      object.skewX = options.skewX;\n      object.skewY = options.skewY;\n      object.angle = options.angle;\n      object.setPositionByOrigin(center, 'center', 'center');\n    },\n\n    /**\n     * given a width and height, return the size of the bounding box\n     * that can contains the box with width/height with applied transform\n     * described in options.\n     * Use to calculate the boxes around objects for controls.\n     * @memberOf fabric.util\n     * @param {Number} width\n     * @param {Number} height\n     * @param {Object} options\n     * @param {Number} options.scaleX\n     * @param {Number} options.scaleY\n     * @param {Number} options.skewX\n     * @param {Number} options.skewY\n     * @return {Object.x} width of containing\n     * @return {Object.y} height of containing\n     */\n    sizeAfterTransform: function(width, height, options) {\n      var dimX = width / 2, dimY = height / 2,\n          points = [\n            {\n              x: -dimX,\n              y: -dimY\n            },\n            {\n              x: dimX,\n              y: -dimY\n            },\n            {\n              x: -dimX,\n              y: dimY\n            },\n            {\n              x: dimX,\n              y: dimY\n            }],\n          transformMatrix = fabric.util.calcDimensionsMatrix(options),\n          bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n      return {\n        x: bbox.width,\n        y: bbox.height,\n      };\n    },\n\n    /**\n     * Merges 2 clip paths into one visually equal clip path\n     *\n     * **IMPORTANT**:\\\n     * Does **NOT** clone the arguments, clone them proir if necessary.\n     *\n     * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n     * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n     *\n     * In order to handle the `inverted` property we follow logic described in the following cases:\\\n     * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n     * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n     * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n     *\n     * @memberOf fabric.util\n     * @param {fabric.Object} c1\n     * @param {fabric.Object} c2\n     * @returns {fabric.Object} merged clip path\n     */\n    mergeClipPaths: function (c1, c2) {\n      var a = c1, b = c2;\n      if (a.inverted && !b.inverted) {\n        //  case (2)\n        a = c2;\n        b = c1;\n      }\n      //  `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n      fabric.util.applyTransformToObject(\n        b,\n        fabric.util.multiplyTransformMatrices(\n          fabric.util.invertTransform(a.calcTransformMatrix()),\n          b.calcTransformMatrix()\n        )\n      );\n      //  assign the `inverted` prop to the wrapping group\n      var inverted = a.inverted && b.inverted;\n      if (inverted) {\n        //  case (1)\n        a.inverted = b.inverted = false;\n      }\n      return new fabric.Group([a], { clipPath: b, inverted: inverted });\n    },\n\n    /**\n     * @memberOf fabric.util\n     * @param {Object} prevStyle first style to compare\n     * @param {Object} thisStyle second style to compare\n     * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n     * @return {boolean} true if the style changed\n     */\n    hasStyleChanged: function(prevStyle, thisStyle, forTextSpans) {\n      forTextSpans = forTextSpans || false;\n      return (prevStyle.fill !== thisStyle.fill ||\n              prevStyle.stroke !== thisStyle.stroke ||\n              prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n              prevStyle.fontSize !== thisStyle.fontSize ||\n              prevStyle.fontFamily !== thisStyle.fontFamily ||\n              prevStyle.fontWeight !== thisStyle.fontWeight ||\n              prevStyle.fontStyle !== thisStyle.fontStyle ||\n              prevStyle.deltaY !== thisStyle.deltaY) ||\n              (forTextSpans &&\n                (prevStyle.overline !== thisStyle.overline ||\n                prevStyle.underline !== thisStyle.underline ||\n                prevStyle.linethrough !== thisStyle.linethrough));\n    },\n\n    /**\n     * Returns the array form of a text object's inline styles property with styles grouped in ranges\n     * rather than per character. This format is less verbose, and is better suited for storage\n     * so it is used in serialization (not during runtime).\n     * @memberOf fabric.util\n     * @param {object} styles per character styles for a text object\n     * @param {String} text the text string that the styles are applied to\n     * @return {{start: number, end: number, style: object}[]}\n     */\n    stylesToArray: function(styles, text) {\n      // clone style structure to prevent mutation\n      var styles = fabric.util.object.clone(styles, true),\n          textLines = text.split('\\n'),\n          charIndex = -1, prevStyle = {}, stylesArray = [];\n      //loop through each textLine\n      for (var i = 0; i < textLines.length; i++) {\n        if (!styles[i]) {\n          //no styles exist for this line, so add the line's length to the charIndex total\n          charIndex += textLines[i].length;\n          continue;\n        }\n        //loop through each character of the current line\n        for (var c = 0; c < textLines[i].length; c++) {\n          charIndex++;\n          var thisStyle = styles[i][c];\n          //check if style exists for this character\n          if (thisStyle) {\n            var styleChanged = fabric.util.hasStyleChanged(prevStyle, thisStyle, true);\n            if (styleChanged) {\n              stylesArray.push({\n                start: charIndex,\n                end: charIndex + 1,\n                style: thisStyle\n              });\n            }\n            else {\n              //if style is the same as previous character, increase end index\n              stylesArray[stylesArray.length - 1].end++;\n            }\n          }\n          prevStyle = thisStyle || {};\n        }\n      }\n      return stylesArray;\n    },\n\n    /**\n     * Returns the object form of the styles property with styles that are assigned per\n     * character rather than grouped by range. This format is more verbose, and is\n     * only used during runtime (not for serialization/storage)\n     * @memberOf fabric.util\n     * @param {Array} styles the serialized form of a text object's styles\n     * @param {String} text the text string that the styles are applied to\n     * @return {Object}\n     */\n    stylesFromArray: function(styles, text) {\n      if (!Array.isArray(styles)) {\n        return styles;\n      }\n      var textLines = text.split('\\n'),\n          charIndex = -1, styleIndex = 0, stylesObject = {};\n      //loop through each textLine\n      for (var i = 0; i < textLines.length; i++) {\n        //loop through each character of the current line\n        for (var c = 0; c < textLines[i].length; c++) {\n          charIndex++;\n          //check if there's a style collection that includes the current character\n          if (styles[styleIndex]\n            && styles[styleIndex].start <= charIndex\n            && charIndex < styles[styleIndex].end) {\n            //create object for line index if it doesn't exist\n            stylesObject[i] = stylesObject[i] || {};\n            //assign a style at this character's index\n            stylesObject[i][c] = Object.assign({}, styles[styleIndex].style);\n            //if character is at the end of the current style collection, move to the next\n            if (charIndex === styles[styleIndex].end - 1) {\n              styleIndex++;\n            }\n          }\n        }\n      }\n      return stylesObject;\n    }\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n  var _join = Array.prototype.join,\n      commandLengths = {\n        m: 2,\n        l: 2,\n        h: 1,\n        v: 1,\n        c: 6,\n        s: 4,\n        q: 4,\n        t: 2,\n        a: 7\n      },\n      repeatedCommands = {\n        m: 'l',\n        M: 'L'\n      };\n  function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n    var costh2 = fabric.util.cos(th2),\n        sinth2 = fabric.util.sin(th2),\n        costh3 = fabric.util.cos(th3),\n        sinth3 = fabric.util.sin(th3),\n        toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n        toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n        cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n        cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n        cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n        cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n    return ['C',\n      cp1X, cp1Y,\n      cp2X, cp2Y,\n      toX, toY\n    ];\n  }\n\n  /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n   * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n   * http://mozilla.org/MPL/2.0/\n   */\n  function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n    var PI = Math.PI, th = rotateX * PI / 180,\n        sinTh = fabric.util.sin(th),\n        cosTh = fabric.util.cos(th),\n        fromX = 0, fromY = 0;\n\n    rx = Math.abs(rx);\n    ry = Math.abs(ry);\n\n    var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n        py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n        rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n        pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n        root = 0;\n\n    if (pl < 0) {\n      var s = Math.sqrt(1 - pl / (rx2 * ry2));\n      rx *= s;\n      ry *= s;\n    }\n    else {\n      root = (large === sweep ? -1.0 : 1.0) *\n              Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n    }\n\n    var cx = root * rx * py / ry,\n        cy = -root * ry * px / rx,\n        cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n        cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n        mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n        dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n    if (sweep === 0 && dtheta > 0) {\n      dtheta -= 2 * PI;\n    }\n    else if (sweep === 1 && dtheta < 0) {\n      dtheta += 2 * PI;\n    }\n\n    // Convert into cubic bezier segments <= 90deg\n    var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n        result = [], mDelta = dtheta / segments,\n        mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n        th3 = mTheta + mDelta;\n\n    for (var i = 0; i < segments; i++) {\n      result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n      fromX = result[i][5];\n      fromY = result[i][6];\n      mTheta = th3;\n      th3 += mDelta;\n    }\n    return result;\n  }\n\n  /*\n   * Private\n   */\n  function calcVectorAngle(ux, uy, vx, vy) {\n    var ta = Math.atan2(uy, ux),\n        tb = Math.atan2(vy, vx);\n    if (tb >= ta) {\n      return tb - ta;\n    }\n    else {\n      return 2 * Math.PI - (ta - tb);\n    }\n  }\n\n  /**\n   * Calculate bounding box of a beziercurve\n   * @param {Number} x0 starting point\n   * @param {Number} y0\n   * @param {Number} x1 first control point\n   * @param {Number} y1\n   * @param {Number} x2 secondo control point\n   * @param {Number} y2\n   * @param {Number} x3 end of bezier\n   * @param {Number} y3\n   */\n  // taken from http://jsbin.com/ivomiq/56/edit  no credits available for that.\n  // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n  function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n    var argsString;\n    if (fabric.cachesBoundsOfCurve) {\n      argsString = _join.call(arguments);\n      if (fabric.boundsOfCurveCache[argsString]) {\n        return fabric.boundsOfCurveCache[argsString];\n      }\n    }\n\n    var sqrt = Math.sqrt,\n        min = Math.min, max = Math.max,\n        abs = Math.abs, tvalues = [],\n        bounds = [[], []],\n        a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n    b = 6 * x0 - 12 * x1 + 6 * x2;\n    a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n    c = 3 * x1 - 3 * x0;\n\n    for (var i = 0; i < 2; ++i) {\n      if (i > 0) {\n        b = 6 * y0 - 12 * y1 + 6 * y2;\n        a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n        c = 3 * y1 - 3 * y0;\n      }\n\n      if (abs(a) < 1e-12) {\n        if (abs(b) < 1e-12) {\n          continue;\n        }\n        t = -c / b;\n        if (0 < t && t < 1) {\n          tvalues.push(t);\n        }\n        continue;\n      }\n      b2ac = b * b - 4 * c * a;\n      if (b2ac < 0) {\n        continue;\n      }\n      sqrtb2ac = sqrt(b2ac);\n      t1 = (-b + sqrtb2ac) / (2 * a);\n      if (0 < t1 && t1 < 1) {\n        tvalues.push(t1);\n      }\n      t2 = (-b - sqrtb2ac) / (2 * a);\n      if (0 < t2 && t2 < 1) {\n        tvalues.push(t2);\n      }\n    }\n\n    var x, y, j = tvalues.length, jlen = j, mt;\n    while (j--) {\n      t = tvalues[j];\n      mt = 1 - t;\n      x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n      bounds[0][j] = x;\n\n      y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n      bounds[1][j] = y;\n    }\n\n    bounds[0][jlen] = x0;\n    bounds[1][jlen] = y0;\n    bounds[0][jlen + 1] = x3;\n    bounds[1][jlen + 1] = y3;\n    var result = [\n      {\n        x: min.apply(null, bounds[0]),\n        y: min.apply(null, bounds[1])\n      },\n      {\n        x: max.apply(null, bounds[0]),\n        y: max.apply(null, bounds[1])\n      }\n    ];\n    if (fabric.cachesBoundsOfCurve) {\n      fabric.boundsOfCurveCache[argsString] = result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts arc to a bunch of bezier curves\n   * @param {Number} fx starting point x\n   * @param {Number} fy starting point y\n   * @param {Array} coords Arc command\n   */\n  function fromArcToBeziers(fx, fy, coords) {\n    var rx = coords[1],\n        ry = coords[2],\n        rot = coords[3],\n        large = coords[4],\n        sweep = coords[5],\n        tx = coords[6],\n        ty = coords[7],\n        segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n    for (var i = 0, len = segsNorm.length; i < len; i++) {\n      segsNorm[i][1] += fx;\n      segsNorm[i][2] += fy;\n      segsNorm[i][3] += fx;\n      segsNorm[i][4] += fy;\n      segsNorm[i][5] += fx;\n      segsNorm[i][6] += fy;\n    }\n    return segsNorm;\n  };\n\n  /**\n   * This function take a parsed SVG path and make it simpler for fabricJS logic.\n   * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )\n   * S converted in C, T converted in Q, A converted in C.\n   * @param {Array} path the array of commands of a parsed svg path for fabric.Path\n   * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path\n   */\n  function makePathSimpler(path) {\n    // x and y represent the last point of the path. the previous command point.\n    // we add them to each relative command to make it an absolute comment.\n    // we also swap the v V h H with L, because are easier to transform.\n    var x = 0, y = 0, len = path.length,\n        // x1 and y1 represent the last point of the subpath. the subpath is started with\n        // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n        // the last x1 and y1.\n        x1 = 0, y1 = 0, current, i, converted,\n        // previous will host the letter of the previous command, to handle S and T.\n        // controlX and controlY will host the previous reflected control point\n        destinationPath = [], previous, controlX, controlY;\n    for (i = 0; i < len; ++i) {\n      converted = false;\n      current = path[i].slice(0);\n      switch (current[0]) { // first letter\n        case 'l': // lineto, relative\n          current[0] = 'L';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'L':\n          x = current[1];\n          y = current[2];\n          break;\n        case 'h': // horizontal lineto, relative\n          current[1] += x;\n          // falls through\n        case 'H':\n          current[0] = 'L';\n          current[2] = y;\n          x = current[1];\n          break;\n        case 'v': // vertical lineto, relative\n          current[1] += y;\n          // falls through\n        case 'V':\n          current[0] = 'L';\n          y = current[1];\n          current[1] = x;\n          current[2] = y;\n          break;\n        case 'm': // moveTo, relative\n          current[0] = 'M';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'M':\n          x = current[1];\n          y = current[2];\n          x1 = current[1];\n          y1 = current[2];\n          break;\n        case 'c': // bezierCurveTo, relative\n          current[0] = 'C';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          current[5] += x;\n          current[6] += y;\n          // falls through\n        case 'C':\n          controlX = current[3];\n          controlY = current[4];\n          x = current[5];\n          y = current[6];\n          break;\n        case 's': // shorthand cubic bezierCurveTo, relative\n          current[0] = 'S';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          // falls through\n        case 'S':\n          // would be sScC but since we are swapping sSc for C, we check just that.\n          if (previous === 'C') {\n            // calculate reflection of previous control points\n            controlX = 2 * x - controlX;\n            controlY = 2 * y - controlY;\n          }\n          else {\n            // If there is no previous command or if the previous command was not a C, c, S, or s,\n            // the control point is coincident with the current point\n            controlX = x;\n            controlY = y;\n          }\n          x = current[3];\n          y = current[4];\n          current[0] = 'C';\n          current[5] = current[3];\n          current[6] = current[4];\n          current[3] = current[1];\n          current[4] = current[2];\n          current[1] = controlX;\n          current[2] = controlY;\n          // current[3] and current[4] are NOW the second control point.\n          // we keep it for the next reflection.\n          controlX = current[3];\n          controlY = current[4];\n          break;\n        case 'q': // quadraticCurveTo, relative\n          current[0] = 'Q';\n          current[1] += x;\n          current[2] += y;\n          current[3] += x;\n          current[4] += y;\n          // falls through\n        case 'Q':\n          controlX = current[1];\n          controlY = current[2];\n          x = current[3];\n          y = current[4];\n          break;\n        case 't': // shorthand quadraticCurveTo, relative\n          current[0] = 'T';\n          current[1] += x;\n          current[2] += y;\n          // falls through\n        case 'T':\n          if (previous === 'Q') {\n            // calculate reflection of previous control point\n            controlX = 2 * x - controlX;\n            controlY = 2 * y - controlY;\n          }\n          else {\n            // If there is no previous command or if the previous command was not a Q, q, T or t,\n            // assume the control point is coincident with the current point\n            controlX = x;\n            controlY = y;\n          }\n          current[0] = 'Q';\n          x = current[1];\n          y = current[2];\n          current[1] = controlX;\n          current[2] = controlY;\n          current[3] = x;\n          current[4] = y;\n          break;\n        case 'a':\n          current[0] = 'A';\n          current[6] += x;\n          current[7] += y;\n          // falls through\n        case 'A':\n          converted = true;\n          destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));\n          x = current[6];\n          y = current[7];\n          break;\n        case 'z':\n        case 'Z':\n          x = x1;\n          y = y1;\n          break;\n        default:\n      }\n      if (!converted) {\n        destinationPath.push(current);\n      }\n      previous = current[0];\n    }\n    return destinationPath;\n  };\n\n  /**\n   * Calc length from point x1,y1 to x2,y2\n   * @param {Number} x1 starting point x\n   * @param {Number} y1 starting point y\n   * @param {Number} x2 starting point x\n   * @param {Number} y2 starting point y\n   * @return {Number} length of segment\n   */\n  function calcLineLength(x1, y1, x2, y2) {\n    return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n  }\n\n  // functions for the Cubic beizer\n  // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\n  function CB1(t) {\n    return t * t * t;\n  }\n  function CB2(t) {\n    return 3 * t * t * (1 - t);\n  }\n  function CB3(t) {\n    return 3 * t * (1 - t) * (1 - t);\n  }\n  function CB4(t) {\n    return (1 - t) * (1 - t) * (1 - t);\n  }\n\n  function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n    return function(pct) {\n      var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);\n      return {\n        x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,\n        y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4\n      };\n    };\n  }\n\n  function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n    return function (pct) {\n      var invT = 1 - pct,\n          tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +\n          (3 * pct * pct * (p4x - p3x)),\n          tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +\n          (3 * pct * pct * (p4y - p3y));\n      return Math.atan2(tangentY, tangentX);\n    };\n  }\n\n  function QB1(t) {\n    return t * t;\n  }\n\n  function QB2(t) {\n    return 2 * t * (1 - t);\n  }\n\n  function QB3(t) {\n    return (1 - t) * (1 - t);\n  }\n\n  function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n    return function(pct) {\n      var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);\n      return {\n        x: p3x * c1 + p2x * c2 + p1x * c3,\n        y: p3y * c1 + p2y * c2 + p1y * c3\n      };\n    };\n  }\n\n  function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n    return function (pct) {\n      var invT = 1 - pct,\n          tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),\n          tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));\n      return Math.atan2(tangentY, tangentX);\n    };\n  }\n\n\n  // this will run over a path segment ( a cubic or quadratic segment) and approximate it\n  // with 100 segemnts. This will good enough to calculate the length of the curve\n  function pathIterator(iterator, x1, y1) {\n    var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;\n    for (perc = 1; perc <= 100; perc += 1) {\n      p = iterator(perc / 100);\n      tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n      tempP = p;\n    }\n    return tmpLen;\n  }\n\n  /**\n   * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n   * that correspond to that pixels run over the path.\n   * The percentage will be then used to find the correct point on the canvas for the path.\n   * @param {Array} segInfo fabricJS collection of information on a parsed path\n   * @param {Number} distance from starting point, in pixels.\n   * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n   */\n  function findPercentageForDistance(segInfo, distance) {\n    var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },\n        p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;\n    // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n    // the path\n    while (tmpLen < distance && nextStep > 0.0001) {\n      p = iterator(perc);\n      lastPerc = perc;\n      nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n      // compare tmpLen each cycle with distance, decide next perc to test.\n      if ((nextLen + tmpLen) > distance) {\n        // we discard this step and we make smaller steps.\n        perc -= nextStep;\n        nextStep /= 2;\n      }\n      else {\n        tempP = p;\n        perc += nextStep;\n        tmpLen += nextLen;\n      }\n    }\n    p.angle = angleFinder(lastPerc);\n    return p;\n  }\n\n  /**\n   * Run over a parsed and simplifed path and extrac some informations.\n   * informations are length of each command and starting point\n   * @param {Array} path fabricJS parsed path commands\n   * @return {Array} path commands informations\n   */\n  function getPathSegmentsInfo(path) {\n    var totalLength = 0, len = path.length, current,\n        //x2 and y2 are the coords of segment start\n        //x1 and y1 are the coords of the current point\n        x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;\n    for (var i = 0; i < len; i++) {\n      current = path[i];\n      tempInfo = {\n        x: x1,\n        y: y1,\n        command: current[0],\n      };\n      switch (current[0]) { //first letter\n        case 'M':\n          tempInfo.length = 0;\n          x2 = x1 = current[1];\n          y2 = y1 = current[2];\n          break;\n        case 'L':\n          tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n          x1 = current[1];\n          y1 = current[2];\n          break;\n        case 'C':\n          iterator = getPointOnCubicBezierIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4],\n            current[5],\n            current[6]\n          );\n          angleFinder = getTangentCubicIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4],\n            current[5],\n            current[6]\n          );\n          tempInfo.iterator = iterator;\n          tempInfo.angleFinder = angleFinder;\n          tempInfo.length = pathIterator(iterator, x1, y1);\n          x1 = current[5];\n          y1 = current[6];\n          break;\n        case 'Q':\n          iterator = getPointOnQuadraticBezierIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4]\n          );\n          angleFinder = getTangentQuadraticIterator(\n            x1,\n            y1,\n            current[1],\n            current[2],\n            current[3],\n            current[4]\n          );\n          tempInfo.iterator = iterator;\n          tempInfo.angleFinder = angleFinder;\n          tempInfo.length = pathIterator(iterator, x1, y1);\n          x1 = current[3];\n          y1 = current[4];\n          break;\n        case 'Z':\n        case 'z':\n          // we add those in order to ease calculations later\n          tempInfo.destX = x2;\n          tempInfo.destY = y2;\n          tempInfo.length = calcLineLength(x1, y1, x2, y2);\n          x1 = x2;\n          y1 = y2;\n          break;\n      }\n      totalLength += tempInfo.length;\n      info.push(tempInfo);\n    }\n    info.push({ length: totalLength, x: x1, y: y1 });\n    return info;\n  }\n\n  function getPointOnPath(path, distance, infos) {\n    if (!infos) {\n      infos = getPathSegmentsInfo(path);\n    }\n    var i = 0;\n    while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {\n      distance -= infos[i].length;\n      i++;\n    }\n    // var distance = infos[infos.length - 1] * perc;\n    var segInfo = infos[i], segPercent = distance / segInfo.length,\n        command = segInfo.command, segment = path[i], info;\n\n    switch (command) {\n      case 'M':\n        return { x: segInfo.x, y: segInfo.y, angle: 0 };\n      case 'Z':\n      case 'z':\n        info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n          new fabric.Point(segInfo.destX, segInfo.destY),\n          segPercent\n        );\n        info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);\n        return info;\n      case 'L':\n        info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n          new fabric.Point(segment[1], segment[2]),\n          segPercent\n        );\n        info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);\n        return info;\n      case 'C':\n        return findPercentageForDistance(segInfo, distance);\n      case 'Q':\n        return findPercentageForDistance(segInfo, distance);\n    }\n  }\n\n  /**\n   *\n   * @param {string} pathString\n   * @return {(string|number)[][]} An array of SVG path commands\n   * @example <caption>Usage</caption>\n   * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n   *   ['M', 3, 4],\n   *   ['Q', 3, 5, 2, 1, 4, 0],\n   *   ['Q', 9, 12, 2, 1, 4, 0],\n   * ];\n   *\n   */\n  function parsePath(pathString) {\n    var result = [],\n        coords = [],\n        currentPath,\n        parsed,\n        re = fabric.rePathCommand,\n        rNumber = '[-+]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][-+]?\\\\d+)?\\\\s*',\n        rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,\n        rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',\n        rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +\n          rNumberCommaWsp + '?(' + rNumber + ')',\n        regArcArgumentSequence = new RegExp(rArcSeq, 'g'),\n        match,\n        coordsStr,\n        // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n        path;\n    if (!pathString || !pathString.match) {\n      return result;\n    }\n    path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n    for (var i = 0, coordsParsed, len = path.length; i < len; i++) {\n      currentPath = path[i];\n\n      coordsStr = currentPath.slice(1).trim();\n      coords.length = 0;\n\n      var command = currentPath.charAt(0);\n      coordsParsed = [command];\n\n      if (command.toLowerCase() === 'a') {\n        // arcs have special flags that apparently don't require spaces so handle special\n        for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {\n          for (var j = 1; j < args.length; j++) {\n            coords.push(args[j]);\n          }\n        }\n      }\n      else {\n        while ((match = re.exec(coordsStr))) {\n          coords.push(match[0]);\n        }\n      }\n\n      for (var j = 0, jlen = coords.length; j < jlen; j++) {\n        parsed = parseFloat(coords[j]);\n        if (!isNaN(parsed)) {\n          coordsParsed.push(parsed);\n        }\n      }\n\n      var commandLength = commandLengths[command.toLowerCase()],\n          repeatedCommand = repeatedCommands[command] || command;\n\n      if (coordsParsed.length - 1 > commandLength) {\n        for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n          result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n          command = repeatedCommand;\n        }\n      }\n      else {\n        result.push(coordsParsed);\n      }\n    }\n\n    return result;\n  };\n\n  /**\n   *\n   * Converts points to a smooth SVG path\n   * @param {{ x: number,y: number }[]} points Array of points\n   * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n   * @return {(string|number)[][]} An array of SVG path commands\n   */\n  function getSmoothPathFromPoints(points, correction) {\n    var path = [], i,\n        p1 = new fabric.Point(points[0].x, points[0].y),\n        p2 = new fabric.Point(points[1].x, points[1].y),\n        len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n    correction = correction || 0;\n\n    if (manyPoints) {\n      multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n      multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n    }\n    path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);\n    for (i = 1; i < len; i++) {\n      if (!p1.eq(p2)) {\n        var midPoint = p1.midPointFrom(p2);\n        // p1 is our bezier control point\n        // midpoint is our endpoint\n        // start point is p(i-1) value.\n        path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n      }\n      p1 = points[i];\n      if ((i + 1) < points.length) {\n        p2 = points[i + 1];\n      }\n    }\n    if (manyPoints) {\n      multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n      multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n    }\n    path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);\n    return path;\n  }\n  /**\n   * Transform a path by transforming each segment.\n   * it has to be a simplified path or it won't work.\n   * WARNING: this depends from pathOffset for correct operation\n   * @param {Array} path fabricJS parsed and simplified path commands\n   * @param {Array} transform matrix that represent the transformation\n   * @param {Object} [pathOffset] the fabric.Path pathOffset\n   * @param {Number} pathOffset.x\n   * @param {Number} pathOffset.y\n   * @returns {Array} the transformed path\n   */\n  function transformPath(path, transform, pathOffset) {\n    if (pathOffset) {\n      transform = fabric.util.multiplyTransformMatrices(\n        transform,\n        [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]\n      );\n    }\n    return path.map(function(pathSegment) {\n      var newSegment = pathSegment.slice(0), point = {};\n      for (var i = 1; i < pathSegment.length - 1; i += 2) {\n        point.x = pathSegment[i];\n        point.y = pathSegment[i + 1];\n        point = fabric.util.transformPoint(point, transform);\n        newSegment[i] = point.x;\n        newSegment[i + 1] = point.y;\n      }\n      return newSegment;\n    });\n  }\n\n  /**\n   * Join path commands to go back to svg format\n   * @param {Array} pathData fabricJS parsed path commands\n   * @return {String} joined path 'M 0 0 L 20 30'\n   */\n  fabric.util.joinPath = function(pathData) {\n    return pathData.map(function (segment) { return segment.join(' '); }).join(' ');\n  };\n  fabric.util.parsePath = parsePath;\n  fabric.util.makePathSimpler = makePathSimpler;\n  fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;\n  fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;\n  fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n  fabric.util.getPointOnPath = getPointOnPath;\n  fabric.util.transformPath = transformPath;\n})();\n\n\n(function() {\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * Invokes method on all items in a given array\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} method Name of a method to invoke\n   * @return {Array}\n   */\n  function invoke(array, method) {\n    var args = slice.call(arguments, 2), result = [];\n    for (var i = 0, len = array.length; i < len; i++) {\n      result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n    }\n    return result;\n  }\n\n  /**\n   * Finds maximum value in array (not necessarily \"first\" one)\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} byProperty\n   * @return {*}\n   */\n  function max(array, byProperty) {\n    return find(array, byProperty, function(value1, value2) {\n      return value1 >= value2;\n    });\n  }\n\n  /**\n   * Finds minimum value in array (not necessarily \"first\" one)\n   * @memberOf fabric.util.array\n   * @param {Array} array Array to iterate over\n   * @param {String} byProperty\n   * @return {*}\n   */\n  function min(array, byProperty) {\n    return find(array, byProperty, function(value1, value2) {\n      return value1 < value2;\n    });\n  }\n\n  /**\n   * @private\n   */\n  function fill(array, value) {\n    var k = array.length;\n    while (k--) {\n      array[k] = value;\n    }\n    return array;\n  }\n\n  /**\n   * @private\n   */\n  function find(array, byProperty, condition) {\n    if (!array || array.length === 0) {\n      return;\n    }\n\n    var i = array.length - 1,\n        result = byProperty ? array[i][byProperty] : array[i];\n    if (byProperty) {\n      while (i--) {\n        if (condition(array[i][byProperty], result)) {\n          result = array[i][byProperty];\n        }\n      }\n    }\n    else {\n      while (i--) {\n        if (condition(array[i], result)) {\n          result = array[i];\n        }\n      }\n    }\n    return result;\n  }\n\n  /**\n   * @namespace fabric.util.array\n   */\n  fabric.util.array = {\n    fill: fill,\n    invoke: invoke,\n    min: min,\n    max: max\n  };\n\n})();\n\n\n(function() {\n  /**\n   * Copies all enumerable properties of one js object to another\n   * this does not and cannot compete with generic utils.\n   * Does not clone or extend fabric.Object subclasses.\n   * This is mostly for internal use and has extra handling for fabricJS objects\n   * it skips the canvas and group properties in deep cloning.\n   * @memberOf fabric.util.object\n   * @param {Object} destination Where to copy to\n   * @param {Object} source Where to copy from\n   * @param {Boolean} [deep] Whether to extend nested objects\n   * @return {Object}\n   */\n\n  function extend(destination, source, deep) {\n    // JScript DontEnum bug is not taken care of\n    // the deep clone is for internal use, is not meant to avoid\n    // javascript traps or cloning html element or self referenced objects.\n    if (deep) {\n      if (!fabric.isLikelyNode && source instanceof Element) {\n        // avoid cloning deep images, canvases,\n        destination = source;\n      }\n      else if (source instanceof Array) {\n        destination = [];\n        for (var i = 0, len = source.length; i < len; i++) {\n          destination[i] = extend({ }, source[i], deep);\n        }\n      }\n      else if (source && typeof source === 'object') {\n        for (var property in source) {\n          if (property === 'canvas' || property === 'group') {\n            // we do not want to clone this props at all.\n            // we want to keep the keys in the copy\n            destination[property] = null;\n          }\n          else if (source.hasOwnProperty(property)) {\n            destination[property] = extend({ }, source[property], deep);\n          }\n        }\n      }\n      else {\n        // this sounds odd for an extend but is ok for recursive use\n        destination = source;\n      }\n    }\n    else {\n      for (var property in source) {\n        destination[property] = source[property];\n      }\n    }\n    return destination;\n  }\n\n  /**\n   * Creates an empty object and copies all enumerable properties of another object to it\n   * This method is mostly for internal use, and not intended for duplicating shapes in canvas. \n   * @memberOf fabric.util.object\n   * @param {Object} object Object to clone\n   * @param {Boolean} [deep] Whether to clone nested objects\n   * @return {Object}\n   */\n\n  //TODO: this function return an empty object if you try to clone null\n  function clone(object, deep) {\n    return extend({ }, object, deep);\n  }\n\n  /** @namespace fabric.util.object */\n  fabric.util.object = {\n    extend: extend,\n    clone: clone\n  };\n  fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n  /**\n   * Camelizes a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to camelize\n   * @return {String} Camelized version of a string\n   */\n  function camelize(string) {\n    return string.replace(/-+(.)?/g, function(match, character) {\n      return character ? character.toUpperCase() : '';\n    });\n  }\n\n  /**\n   * Capitalizes a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to capitalize\n   * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n   * and other letters stay untouched, if false first letter is capitalized\n   * and other letters are converted to lowercase.\n   * @return {String} Capitalized version of a string\n   */\n  function capitalize(string, firstLetterOnly) {\n    return string.charAt(0).toUpperCase() +\n      (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n  }\n\n  /**\n   * Escapes XML in a string\n   * @memberOf fabric.util.string\n   * @param {String} string String to escape\n   * @return {String} Escaped version of a string\n   */\n  function escapeXml(string) {\n    return string.replace(/&/g, '&amp;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&apos;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;');\n  }\n\n  /**\n   * Divide a string in the user perceived single units\n   * @memberOf fabric.util.string\n   * @param {String} textstring String to escape\n   * @return {Array} array containing the graphemes\n   */\n  function graphemeSplit(textstring) {\n    var i = 0, chr, graphemes = [];\n    for (i = 0, chr; i < textstring.length; i++) {\n      if ((chr = getWholeChar(textstring, i)) === false) {\n        continue;\n      }\n      graphemes.push(chr);\n    }\n    return graphemes;\n  }\n\n  // taken from mdn in the charAt doc page.\n  function getWholeChar(str, i) {\n    var code = str.charCodeAt(i);\n\n    if (isNaN(code)) {\n      return ''; // Position not found\n    }\n    if (code < 0xD800 || code > 0xDFFF) {\n      return str.charAt(i);\n    }\n\n    // High surrogate (could change last hex to 0xDB7F to treat high private\n    // surrogates as single characters)\n    if (0xD800 <= code && code <= 0xDBFF) {\n      if (str.length <= (i + 1)) {\n        throw 'High surrogate without following low surrogate';\n      }\n      var next = str.charCodeAt(i + 1);\n      if (0xDC00 > next || next > 0xDFFF) {\n        throw 'High surrogate without following low surrogate';\n      }\n      return str.charAt(i) + str.charAt(i + 1);\n    }\n    // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n    if (i === 0) {\n      throw 'Low surrogate without preceding high surrogate';\n    }\n    var prev = str.charCodeAt(i - 1);\n\n    // (could change last hex to 0xDB7F to treat high private\n    // surrogates as single characters)\n    if (0xD800 > prev || prev > 0xDBFF) {\n      throw 'Low surrogate without preceding high surrogate';\n    }\n    // We can pass over low surrogates now as the second component\n    // in a pair which we have already processed\n    return false;\n  }\n\n\n  /**\n   * String utilities\n   * @namespace fabric.util.string\n   */\n  fabric.util.string = {\n    camelize: camelize,\n    capitalize: capitalize,\n    escapeXml: escapeXml,\n    graphemeSplit: graphemeSplit\n  };\n})();\n\n\n(function() {\n\n  var slice = Array.prototype.slice, emptyFunction = function() { },\n\n      IS_DONTENUM_BUGGY = (function() {\n        for (var p in { toString: 1 }) {\n          if (p === 'toString') {\n            return false;\n          }\n        }\n        return true;\n      })(),\n\n      /** @ignore */\n      addMethods = function(klass, source, parent) {\n        for (var property in source) {\n\n          if (property in klass.prototype &&\n              typeof klass.prototype[property] === 'function' &&\n              (source[property] + '').indexOf('callSuper') > -1) {\n\n            klass.prototype[property] = (function(property) {\n              return function() {\n\n                var superclass = this.constructor.superclass;\n                this.constructor.superclass = parent;\n                var returnValue = source[property].apply(this, arguments);\n                this.constructor.superclass = superclass;\n\n                if (property !== 'initialize') {\n                  return returnValue;\n                }\n              };\n            })(property);\n          }\n          else {\n            klass.prototype[property] = source[property];\n          }\n\n          if (IS_DONTENUM_BUGGY) {\n            if (source.toString !== Object.prototype.toString) {\n              klass.prototype.toString = source.toString;\n            }\n            if (source.valueOf !== Object.prototype.valueOf) {\n              klass.prototype.valueOf = source.valueOf;\n            }\n          }\n        }\n      };\n\n  function Subclass() { }\n\n  function callSuper(methodName) {\n    var parentMethod = null,\n        _this = this;\n\n    // climb prototype chain to find method not equal to callee's method\n    while (_this.constructor.superclass) {\n      var superClassMethod = _this.constructor.superclass.prototype[methodName];\n      if (_this[methodName] !== superClassMethod) {\n        parentMethod = superClassMethod;\n        break;\n      }\n      // eslint-disable-next-line\n      _this = _this.constructor.superclass.prototype;\n    }\n\n    if (!parentMethod) {\n      return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n    }\n\n    return (arguments.length > 1)\n      ? parentMethod.apply(this, slice.call(arguments, 1))\n      : parentMethod.call(this);\n  }\n\n  /**\n   * Helper for creation of \"classes\".\n   * @memberOf fabric.util\n   * @param {Function} [parent] optional \"Class\" to inherit from\n   * @param {Object} [properties] Properties shared by all instances of this class\n   *                  (be careful modifying objects defined here as this would affect all instances)\n   */\n  function createClass() {\n    var parent = null,\n        properties = slice.call(arguments, 0);\n\n    if (typeof properties[0] === 'function') {\n      parent = properties.shift();\n    }\n    function klass() {\n      this.initialize.apply(this, arguments);\n    }\n\n    klass.superclass = parent;\n    klass.subclasses = [];\n\n    if (parent) {\n      Subclass.prototype = parent.prototype;\n      klass.prototype = new Subclass();\n      parent.subclasses.push(klass);\n    }\n    for (var i = 0, length = properties.length; i < length; i++) {\n      addMethods(klass, properties[i], parent);\n    }\n    if (!klass.prototype.initialize) {\n      klass.prototype.initialize = emptyFunction;\n    }\n    klass.prototype.constructor = klass;\n    klass.prototype.callSuper = callSuper;\n    return klass;\n  }\n\n  fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n  // since ie11 can use addEventListener but they do not support options, i need to check\n  var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent,\n      touchEvents = ['touchstart', 'touchmove', 'touchend'];\n  /**\n   * Adds an event listener to an element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  fabric.util.addListener = function(element, eventName, handler, options) {\n    element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n  };\n\n  /**\n   * Removes an event listener from an element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {String} eventName\n   * @param {Function} handler\n   */\n  fabric.util.removeListener = function(element, eventName, handler, options) {\n    element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n  };\n\n  function getTouchInfo(event) {\n    var touchProp = event.changedTouches;\n    if (touchProp && touchProp[0]) {\n      return touchProp[0];\n    }\n    return event;\n  }\n\n  fabric.util.getPointer = function(event) {\n    var element = event.target,\n        scroll = fabric.util.getScrollLeftTop(element),\n        _evt = getTouchInfo(event);\n    return {\n      x: _evt.clientX + scroll.left,\n      y: _evt.clientY + scroll.top\n    };\n  };\n\n  fabric.util.isTouchEvent = function(event) {\n    return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch';\n  };\n})();\n\n\n(function () {\n\n  /**\n   * Cross-browser wrapper for setting element's style\n   * @memberOf fabric.util\n   * @param {HTMLElement} element\n   * @param {Object} styles\n   * @return {HTMLElement} Element that was passed as a first argument\n   */\n  function setStyle(element, styles) {\n    var elementStyle = element.style;\n    if (!elementStyle) {\n      return element;\n    }\n    if (typeof styles === 'string') {\n      element.style.cssText += ';' + styles;\n      return styles.indexOf('opacity') > -1\n        ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n        : element;\n    }\n    for (var property in styles) {\n      if (property === 'opacity') {\n        setOpacity(element, styles[property]);\n      }\n      else {\n        var normalizedProperty = (property === 'float' || property === 'cssFloat')\n          ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n          : property;\n        elementStyle.setProperty(normalizedProperty, styles[property]);\n      }\n    }\n    return element;\n  }\n\n  var parseEl = fabric.document.createElement('div'),\n      supportsOpacity = typeof parseEl.style.opacity === 'string',\n      supportsFilters = typeof parseEl.style.filter === 'string',\n      reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n      /** @ignore */\n      setOpacity = function (element) { return element; };\n\n  if (supportsOpacity) {\n    /** @ignore */\n    setOpacity = function(element, value) {\n      element.style.opacity = value;\n      return element;\n    };\n  }\n  else if (supportsFilters) {\n    /** @ignore */\n    setOpacity = function(element, value) {\n      var es = element.style;\n      if (element.currentStyle && !element.currentStyle.hasLayout) {\n        es.zoom = 1;\n      }\n      if (reOpacity.test(es.filter)) {\n        value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n        es.filter = es.filter.replace(reOpacity, value);\n      }\n      else {\n        es.filter += ' alpha(opacity=' + (value * 100) + ')';\n      }\n      return element;\n    };\n  }\n\n  fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n  var _slice = Array.prototype.slice;\n\n  /**\n   * Takes id and returns an element with that id (if one exists in a document)\n   * @memberOf fabric.util\n   * @param {String|HTMLElement} id\n   * @return {HTMLElement|null}\n   */\n  function getById(id) {\n    return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n  }\n\n  var sliceCanConvertNodelists,\n      /**\n       * Converts an array-like object (e.g. arguments or NodeList) to an array\n       * @memberOf fabric.util\n       * @param {Object} arrayLike\n       * @return {Array}\n       */\n      toArray = function(arrayLike) {\n        return _slice.call(arrayLike, 0);\n      };\n\n  try {\n    sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n  }\n  catch (err) { }\n\n  if (!sliceCanConvertNodelists) {\n    toArray = function(arrayLike) {\n      var arr = new Array(arrayLike.length), i = arrayLike.length;\n      while (i--) {\n        arr[i] = arrayLike[i];\n      }\n      return arr;\n    };\n  }\n\n  /**\n   * Creates specified element with specified attributes\n   * @memberOf fabric.util\n   * @param {String} tagName Type of an element to create\n   * @param {Object} [attributes] Attributes to set on an element\n   * @return {HTMLElement} Newly created element\n   */\n  function makeElement(tagName, attributes) {\n    var el = fabric.document.createElement(tagName);\n    for (var prop in attributes) {\n      if (prop === 'class') {\n        el.className = attributes[prop];\n      }\n      else if (prop === 'for') {\n        el.htmlFor = attributes[prop];\n      }\n      else {\n        el.setAttribute(prop, attributes[prop]);\n      }\n    }\n    return el;\n  }\n\n  /**\n   * Adds class to an element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to add class to\n   * @param {String} className Class to add to an element\n   */\n  function addClass(element, className) {\n    if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n      element.className += (element.className ? ' ' : '') + className;\n    }\n  }\n\n  /**\n   * Wraps element with another element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to wrap\n   * @param {HTMLElement|String} wrapper Element to wrap with\n   * @param {Object} [attributes] Attributes to set on a wrapper\n   * @return {HTMLElement} wrapper\n   */\n  function wrapElement(element, wrapper, attributes) {\n    if (typeof wrapper === 'string') {\n      wrapper = makeElement(wrapper, attributes);\n    }\n    if (element.parentNode) {\n      element.parentNode.replaceChild(wrapper, element);\n    }\n    wrapper.appendChild(element);\n    return wrapper;\n  }\n\n  /**\n   * Returns element scroll offsets\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to operate on\n   * @return {Object} Object with left/top values\n   */\n  function getScrollLeftTop(element) {\n\n    var left = 0,\n        top = 0,\n        docElement = fabric.document.documentElement,\n        body = fabric.document.body || {\n          scrollLeft: 0, scrollTop: 0\n        };\n\n    // While loop checks (and then sets element to) .parentNode OR .host\n    //  to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n    //  but the .parentNode of a root ShadowDOM node will always be null, instead\n    //  it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n    while (element && (element.parentNode || element.host)) {\n\n      // Set element to element parent, or 'host' in case of ShadowDOM\n      element = element.parentNode || element.host;\n\n      if (element === fabric.document) {\n        left = body.scrollLeft || docElement.scrollLeft || 0;\n        top = body.scrollTop ||  docElement.scrollTop || 0;\n      }\n      else {\n        left += element.scrollLeft || 0;\n        top += element.scrollTop || 0;\n      }\n\n      if (element.nodeType === 1 && element.style.position === 'fixed') {\n        break;\n      }\n    }\n\n    return { left: left, top: top };\n  }\n\n  /**\n   * Returns offset for a given element\n   * @function\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to get offset for\n   * @return {Object} Object with \"left\" and \"top\" properties\n   */\n  function getElementOffset(element) {\n    var docElem,\n        doc = element && element.ownerDocument,\n        box = { left: 0, top: 0 },\n        offset = { left: 0, top: 0 },\n        scrollLeftTop,\n        offsetAttributes = {\n          borderLeftWidth: 'left',\n          borderTopWidth:  'top',\n          paddingLeft:     'left',\n          paddingTop:      'top'\n        };\n\n    if (!doc) {\n      return offset;\n    }\n\n    for (var attr in offsetAttributes) {\n      offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n    }\n\n    docElem = doc.documentElement;\n    if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n      box = element.getBoundingClientRect();\n    }\n\n    scrollLeftTop = getScrollLeftTop(element);\n\n    return {\n      left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n      top: box.top + scrollLeftTop.top - (docElem.clientTop || 0)  + offset.top\n    };\n  }\n\n  /**\n   * Returns style attribute value of a given element\n   * @memberOf fabric.util\n   * @param {HTMLElement} element Element to get style attribute for\n   * @param {String} attr Style attribute to get for element\n   * @return {String} Style attribute value of the given element.\n   */\n  var getElementStyle;\n  if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n    getElementStyle = function(element, attr) {\n      var style = fabric.document.defaultView.getComputedStyle(element, null);\n      return style ? style[attr] : undefined;\n    };\n  }\n  else {\n    getElementStyle = function(element, attr) {\n      var value = element.style[attr];\n      if (!value && element.currentStyle) {\n        value = element.currentStyle[attr];\n      }\n      return value;\n    };\n  }\n\n  (function () {\n    var style = fabric.document.documentElement.style,\n        selectProp = 'userSelect' in style\n          ? 'userSelect'\n          : 'MozUserSelect' in style\n            ? 'MozUserSelect'\n            : 'WebkitUserSelect' in style\n              ? 'WebkitUserSelect'\n              : 'KhtmlUserSelect' in style\n                ? 'KhtmlUserSelect'\n                : '';\n\n    /**\n     * Makes element unselectable\n     * @memberOf fabric.util\n     * @param {HTMLElement} element Element to make unselectable\n     * @return {HTMLElement} Element that was passed in\n     */\n    function makeElementUnselectable(element) {\n      if (typeof element.onselectstart !== 'undefined') {\n        element.onselectstart = fabric.util.falseFunction;\n      }\n      if (selectProp) {\n        element.style[selectProp] = 'none';\n      }\n      else if (typeof element.unselectable === 'string') {\n        element.unselectable = 'on';\n      }\n      return element;\n    }\n\n    /**\n     * Makes element selectable\n     * @memberOf fabric.util\n     * @param {HTMLElement} element Element to make selectable\n     * @return {HTMLElement} Element that was passed in\n     */\n    function makeElementSelectable(element) {\n      if (typeof element.onselectstart !== 'undefined') {\n        element.onselectstart = null;\n      }\n      if (selectProp) {\n        element.style[selectProp] = '';\n      }\n      else if (typeof element.unselectable === 'string') {\n        element.unselectable = '';\n      }\n      return element;\n    }\n\n    fabric.util.makeElementUnselectable = makeElementUnselectable;\n    fabric.util.makeElementSelectable = makeElementSelectable;\n  })();\n\n  function getNodeCanvas(element) {\n    var impl = fabric.jsdomImplForWrapper(element);\n    return impl._canvas || impl._image;\n  };\n\n  function cleanUpJsdomNode(element) {\n    if (!fabric.isLikelyNode) {\n      return;\n    }\n    var impl = fabric.jsdomImplForWrapper(element);\n    if (impl) {\n      impl._image = null;\n      impl._canvas = null;\n      // unsure if necessary\n      impl._currentSrc = null;\n      impl._attributes = null;\n      impl._classList = null;\n    }\n  }\n\n  function setImageSmoothing(ctx, value) {\n    ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n      || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n    ctx.imageSmoothingEnabled = value;\n  }\n\n  /**\n   * setImageSmoothing sets the context imageSmoothingEnabled property.\n   * Used by canvas and by ImageObject.\n   * @memberOf fabric.util\n   * @since 4.0.0\n   * @param {HTMLRenderingContext2D} ctx to set on\n   * @param {Boolean} value true or false\n   */\n  fabric.util.setImageSmoothing = setImageSmoothing;\n  fabric.util.getById = getById;\n  fabric.util.toArray = toArray;\n  fabric.util.addClass = addClass;\n  fabric.util.makeElement = makeElement;\n  fabric.util.wrapElement = wrapElement;\n  fabric.util.getScrollLeftTop = getScrollLeftTop;\n  fabric.util.getElementOffset = getElementOffset;\n  fabric.util.getNodeCanvas = getNodeCanvas;\n  fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n  function addParamToUrl(url, param) {\n    return url + (/\\?/.test(url) ? '&' : '?') + param;\n  }\n\n  function emptyFn() { }\n\n  /**\n   * Cross-browser abstraction for sending XMLHttpRequest\n   * @memberOf fabric.util\n   * @param {String} url URL to send XMLHttpRequest to\n   * @param {Object} [options] Options object\n   * @param {String} [options.method=\"GET\"]\n   * @param {String} [options.parameters] parameters to append to url in GET or in body\n   * @param {String} [options.body] body to send with POST or PUT request\n   * @param {Function} options.onComplete Callback to invoke when request is completed\n   * @return {XMLHttpRequest} request\n   */\n  function request(url, options) {\n    options || (options = { });\n\n    var method = options.method ? options.method.toUpperCase() : 'GET',\n        onComplete = options.onComplete || function() { },\n        xhr = new fabric.window.XMLHttpRequest(),\n        body = options.body || options.parameters;\n\n    /** @ignore */\n    xhr.onreadystatechange = function() {\n      if (xhr.readyState === 4) {\n        onComplete(xhr);\n        xhr.onreadystatechange = emptyFn;\n      }\n    };\n\n    if (method === 'GET') {\n      body = null;\n      if (typeof options.parameters === 'string') {\n        url = addParamToUrl(url, options.parameters);\n      }\n    }\n\n    xhr.open(method, url, true);\n\n    if (method === 'POST' || method === 'PUT') {\n      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n    }\n\n    xhr.send(body);\n    return xhr;\n  }\n\n  fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function () {\n\n  var extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone;\n\n  /**\n   * @typedef {Object} AnimationOptions\n   * Animation of a value or list of values.\n   * When using lists, think of something like this:\n   * fabric.util.animate({\n   *   startValue: [1, 2, 3],\n   *   endValue: [2, 4, 6],\n   *   onChange: function([a, b, c]) {\n   *     canvas.zoomToPoint({x: b, y: c}, a)\n   *     canvas.renderAll()\n   *   }\n   * });\n   * @example\n   * @property {Function} [onChange] Callback; invoked on every value change\n   * @property {Function} [onComplete] Callback; invoked when value change is completed\n   * @example\n   * // Note: startValue, endValue, and byValue must match the type\n   * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 }\n   * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }\n   * @property {number | number[]} [startValue=0] Starting value\n   * @property {number | number[]} [endValue=100] Ending value\n   * @property {number | number[]} [byValue=100] Value to modify the property by\n   * @property {Function} [easing] Easing function\n   * @property {Number} [duration=500] Duration of change (in ms)\n   * @property {Function} [abort] Additional function with logic. If returns true, animation aborts.\n   *\n   * @typedef {() => void} CancelFunction\n   *\n   * @typedef {Object} AnimationCurrentState\n   * @property {number | number[]} currentValue value in range [`startValue`, `endValue`]\n   * @property {number} completionRate value in range [0, 1]\n   * @property {number} durationRate value in range [0, 1]\n   *\n   * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext\n   */\n\n  /**\n   * Array holding all running animations\n   * @memberof fabric\n   * @type {AnimationContext[]}\n   */\n  var RUNNING_ANIMATIONS = [];\n  fabric.util.object.extend(RUNNING_ANIMATIONS, {\n\n    /**\n     * cancel all running animations at the next requestAnimFrame\n     * @returns {AnimationContext[]}\n     */\n    cancelAll: function () {\n      var animations = this.splice(0);\n      animations.forEach(function (animation) {\n        animation.cancel();\n      });\n      return animations;\n    },\n\n    /**\n     * cancel all running animations attached to canvas at the next requestAnimFrame\n     * @param {fabric.Canvas} canvas\n     * @returns {AnimationContext[]}\n     */\n    cancelByCanvas: function (canvas) {\n      if (!canvas) {\n        return [];\n      }\n      var cancelled = this.filter(function (animation) {\n        return typeof animation.target === 'object' && animation.target.canvas === canvas;\n      });\n      cancelled.forEach(function (animation) {\n        animation.cancel();\n      });\n      return cancelled;\n    },\n\n    /**\n     * cancel all running animations for target at the next requestAnimFrame\n     * @param {*} target\n     * @returns {AnimationContext[]}\n     */\n    cancelByTarget: function (target) {\n      var cancelled = this.findAnimationsByTarget(target);\n      cancelled.forEach(function (animation) {\n        animation.cancel();\n      });\n      return cancelled;\n    },\n\n    /**\n     *\n     * @param {CancelFunction} cancelFunc the function returned by animate\n     * @returns {number}\n     */\n    findAnimationIndex: function (cancelFunc) {\n      return this.indexOf(this.findAnimation(cancelFunc));\n    },\n\n    /**\n     *\n     * @param {CancelFunction} cancelFunc the function returned by animate\n     * @returns {AnimationContext | undefined} animation's options object\n     */\n    findAnimation: function (cancelFunc) {\n      return this.find(function (animation) {\n        return animation.cancel === cancelFunc;\n      });\n    },\n\n    /**\n     *\n     * @param {*} target the object that is assigned to the target property of the animation context\n     * @returns {AnimationContext[]} array of animation options object associated with target\n     */\n    findAnimationsByTarget: function (target) {\n      if (!target) {\n        return [];\n      }\n      return this.filter(function (animation) {\n        return animation.target === target;\n      });\n    }\n  });\n\n  function noop() {\n    return false;\n  }\n\n  function defaultEasing(t, b, c, d) {\n    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n  }\n\n  /**\n   * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n   * @memberOf fabric.util\n   * @param {AnimationOptions} [options] Animation options\n   * @example\n   * // Note: startValue, endValue, and byValue must match the type\n   * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 })\n   * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] })\n   * @returns {CancelFunction} cancel function\n   */\n  function animate(options) {\n    options || (options = {});\n    var cancel = false,\n        context,\n        removeFromRegistry = function () {\n          var index = fabric.runningAnimations.indexOf(context);\n          return index > -1 && fabric.runningAnimations.splice(index, 1)[0];\n        };\n\n    context = extend(clone(options), {\n      cancel: function () {\n        cancel = true;\n        return removeFromRegistry();\n      },\n      currentValue: 'startValue' in options ? options.startValue : 0,\n      completionRate: 0,\n      durationRate: 0\n    });\n    fabric.runningAnimations.push(context);\n\n    requestAnimFrame(function(timestamp) {\n      var start = timestamp || +new Date(),\n          duration = options.duration || 500,\n          finish = start + duration, time,\n          onChange = options.onChange || noop,\n          abort = options.abort || noop,\n          onComplete = options.onComplete || noop,\n          easing = options.easing || defaultEasing,\n          isMany = 'startValue' in options ? options.startValue.length > 0 : false,\n          startValue = 'startValue' in options ? options.startValue : 0,\n          endValue = 'endValue' in options ? options.endValue : 100,\n          byValue = options.byValue || (isMany ? startValue.map(function(value, i) {\n            return endValue[i] - startValue[i];\n          }) : endValue - startValue);\n\n      options.onStart && options.onStart();\n\n      (function tick(ticktime) {\n        time = ticktime || +new Date();\n        var currentTime = time > finish ? duration : (time - start),\n            timePerc = currentTime / duration,\n            current = isMany ? startValue.map(function(_value, i) {\n              return easing(currentTime, startValue[i], byValue[i], duration);\n            }) : easing(currentTime, startValue, byValue, duration),\n            valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0])\n              : Math.abs((current - startValue) / byValue);\n        //  update context\n        context.currentValue = isMany ? current.slice() : current;\n        context.completionRate = valuePerc;\n        context.durationRate = timePerc;\n        if (cancel) {\n          return;\n        }\n        if (abort(current, valuePerc, timePerc)) {\n          removeFromRegistry();\n          return;\n        }\n        if (time > finish) {\n          //  update context\n          context.currentValue = isMany ? endValue.slice() : endValue;\n          context.completionRate = 1;\n          context.durationRate = 1;\n          //  execute callbacks\n          onChange(isMany ? endValue.slice() : endValue, 1, 1);\n          onComplete(endValue, 1, 1);\n          removeFromRegistry();\n          return;\n        }\n        else {\n          onChange(current, valuePerc, timePerc);\n          requestAnimFrame(tick);\n        }\n      })(start);\n    });\n\n    return context.cancel;\n  }\n\n  var _requestAnimFrame = fabric.window.requestAnimationFrame       ||\n                          fabric.window.webkitRequestAnimationFrame ||\n                          fabric.window.mozRequestAnimationFrame    ||\n                          fabric.window.oRequestAnimationFrame      ||\n                          fabric.window.msRequestAnimationFrame     ||\n                          function(callback) {\n                            return fabric.window.setTimeout(callback, 1000 / 60);\n                          };\n\n  var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n  /**\n   * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n   * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n   * @memberOf fabric.util\n   * @param {Function} callback Callback to invoke\n   * @param {DOMElement} element optional Element to associate with animation\n   */\n  function requestAnimFrame() {\n    return _requestAnimFrame.apply(fabric.window, arguments);\n  }\n\n  function cancelAnimFrame() {\n    return _cancelAnimFrame.apply(fabric.window, arguments);\n  }\n\n  fabric.util.animate = animate;\n  fabric.util.requestAnimFrame = requestAnimFrame;\n  fabric.util.cancelAnimFrame = cancelAnimFrame;\n  fabric.runningAnimations = RUNNING_ANIMATIONS;\n})();\n\n\n(function() {\n  // Calculate an in-between color. Returns a \"rgba()\" string.\n  // Credit: Edwin Martin <edwin@bitstorm.org>\n  //         http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n  function calculateColor(begin, end, pos) {\n    var color = 'rgba('\n        + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n        + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n        + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n    color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n    color += ')';\n    return color;\n  }\n\n  /**\n   * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n   * @memberOf fabric.util\n   * @param {String} fromColor The starting color in hex or rgb(a) format.\n   * @param {String} toColor The starting color in hex or rgb(a) format.\n   * @param {Number} [duration] Duration of change (in ms).\n   * @param {Object} [options] Animation options\n   * @param {Function} [options.onChange] Callback; invoked on every value change\n   * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n   * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n   * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n   * @returns {Function} abort function\n   */\n  function animateColor(fromColor, toColor, duration, options) {\n    var startColor = new fabric.Color(fromColor).getSource(),\n        endColor = new fabric.Color(toColor).getSource(),\n        originalOnComplete = options.onComplete,\n        originalOnChange = options.onChange;\n    options = options || {};\n\n    return fabric.util.animate(fabric.util.object.extend(options, {\n      duration: duration || 500,\n      startValue: startColor,\n      endValue: endColor,\n      byValue: endColor,\n      easing: function (currentTime, startValue, byValue, duration) {\n        var posValue = options.colorEasing\n          ? options.colorEasing(currentTime, duration)\n          : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n        return calculateColor(startValue, byValue, posValue);\n      },\n      // has to take in account for color restoring;\n      onComplete: function(current, valuePerc, timePerc) {\n        if (originalOnComplete) {\n          return originalOnComplete(\n            calculateColor(endColor, endColor, 0),\n            valuePerc,\n            timePerc\n          );\n        }\n      },\n      onChange: function(current, valuePerc, timePerc) {\n        if (originalOnChange) {\n          if (Array.isArray(current)) {\n            return originalOnChange(\n              calculateColor(current, current, 0),\n              valuePerc,\n              timePerc\n            );\n          }\n          originalOnChange(current, valuePerc, timePerc);\n        }\n      }\n    }));\n  }\n\n  fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n  function normalize(a, c, p, s) {\n    if (a < Math.abs(c)) {\n      a = c;\n      s = p / 4;\n    }\n    else {\n      //handle the 0/0 case:\n      if (c === 0 && a === 0) {\n        s = p / (2 * Math.PI) * Math.asin(1);\n      }\n      else {\n        s = p / (2 * Math.PI) * Math.asin(c / a);\n      }\n    }\n    return { a: a, c: c, p: p, s: s };\n  }\n\n  function elastic(opts, t, d) {\n    return opts.a *\n      Math.pow(2, 10 * (t -= 1)) *\n      Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n  }\n\n  /**\n   * Cubic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutCubic(t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t + 1) + b;\n  }\n\n  /**\n   * Cubic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutCubic(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t + b;\n    }\n    return c / 2 * ((t -= 2) * t * t + 2) + b;\n  }\n\n  /**\n   * Quartic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInQuart(t, b, c, d) {\n    return c * (t /= d) * t * t * t + b;\n  }\n\n  /**\n   * Quartic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutQuart(t, b, c, d) {\n    return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n  }\n\n  /**\n   * Quartic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutQuart(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t * t + b;\n    }\n    return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n  }\n\n  /**\n   * Quintic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInQuint(t, b, c, d) {\n    return c * (t /= d) * t * t * t * t + b;\n  }\n\n  /**\n   * Quintic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutQuint(t, b, c, d) {\n    return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n  }\n\n  /**\n   * Quintic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutQuint(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * t * t * t * t * t + b;\n    }\n    return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n  }\n\n  /**\n   * Sinusoidal easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInSine(t, b, c, d) {\n    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n  }\n\n  /**\n   * Sinusoidal easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutSine(t, b, c, d) {\n    return c * Math.sin(t / d * (Math.PI / 2)) + b;\n  }\n\n  /**\n   * Sinusoidal easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutSine(t, b, c, d) {\n    return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n  }\n\n  /**\n   * Exponential easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInExpo(t, b, c, d) {\n    return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n  }\n\n  /**\n   * Exponential easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutExpo(t, b, c, d) {\n    return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n  }\n\n  /**\n   * Exponential easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutExpo(t, b, c, d) {\n    if (t === 0) {\n      return b;\n    }\n    if (t === d) {\n      return b + c;\n    }\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n    }\n    return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n  }\n\n  /**\n   * Circular easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInCirc(t, b, c, d) {\n    return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n  }\n\n  /**\n   * Circular easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutCirc(t, b, c, d) {\n    return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n  }\n\n  /**\n   * Circular easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutCirc(t, b, c, d) {\n    t /= d / 2;\n    if (t < 1) {\n      return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n    }\n    return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n  }\n\n  /**\n   * Elastic easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d;\n    if (t === 1) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * 0.3;\n    }\n    var opts = normalize(a, c, p, s);\n    return -elastic(opts, t, d) + b;\n  }\n\n  /**\n   * Elastic easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d;\n    if (t === 1) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * 0.3;\n    }\n    var opts = normalize(a, c, p, s);\n    return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n  }\n\n  /**\n   * Elastic easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutElastic(t, b, c, d) {\n    var s = 1.70158, p = 0, a = c;\n    if (t === 0) {\n      return b;\n    }\n    t /= d / 2;\n    if (t === 2) {\n      return b + c;\n    }\n    if (!p) {\n      p = d * (0.3 * 1.5);\n    }\n    var opts = normalize(a, c, p, s);\n    if (t < 1) {\n      return -0.5 * elastic(opts, t, d) + b;\n    }\n    return opts.a * Math.pow(2, -10 * (t -= 1)) *\n      Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n  }\n\n  /**\n   * Backwards easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    return c * (t /= d) * t * ((s + 1) * t - s) + b;\n  }\n\n  /**\n   * Backwards easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n  }\n\n  /**\n   * Backwards easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutBack(t, b, c, d, s) {\n    if (s === undefined) {\n      s = 1.70158;\n    }\n    t /= d / 2;\n    if (t < 1) {\n      return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n    }\n    return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n  }\n\n  /**\n   * Bouncing easing in\n   * @memberOf fabric.util.ease\n   */\n  function easeInBounce(t, b, c, d) {\n    return c - easeOutBounce (d - t, 0, c, d) + b;\n  }\n\n  /**\n   * Bouncing easing out\n   * @memberOf fabric.util.ease\n   */\n  function easeOutBounce(t, b, c, d) {\n    if ((t /= d) < (1 / 2.75)) {\n      return c * (7.5625 * t * t) + b;\n    }\n    else if (t < (2 / 2.75)) {\n      return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n    }\n    else if (t < (2.5 / 2.75)) {\n      return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n    }\n    else {\n      return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n    }\n  }\n\n  /**\n   * Bouncing easing in and out\n   * @memberOf fabric.util.ease\n   */\n  function easeInOutBounce(t, b, c, d) {\n    if (t < d / 2) {\n      return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n    }\n    return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n  }\n\n  /**\n   * Easing functions\n   * See <a href=\"http://gizma.com/easing/\">Easing Equations by Robert Penner</a>\n   * @namespace fabric.util.ease\n   */\n  fabric.util.ease = {\n\n    /**\n     * Quadratic easing in\n     * @memberOf fabric.util.ease\n     */\n    easeInQuad: function(t, b, c, d) {\n      return c * (t /= d) * t + b;\n    },\n\n    /**\n     * Quadratic easing out\n     * @memberOf fabric.util.ease\n     */\n    easeOutQuad: function(t, b, c, d) {\n      return -c * (t /= d) * (t - 2) + b;\n    },\n\n    /**\n     * Quadratic easing in and out\n     * @memberOf fabric.util.ease\n     */\n    easeInOutQuad: function(t, b, c, d) {\n      t /= (d / 2);\n      if (t < 1) {\n        return c / 2 * t * t + b;\n      }\n      return -c / 2 * ((--t) * (t - 2) - 1) + b;\n    },\n\n    /**\n     * Cubic easing in\n     * @memberOf fabric.util.ease\n     */\n    easeInCubic: function(t, b, c, d) {\n      return c * (t /= d) * t * t + b;\n    },\n\n    easeOutCubic: easeOutCubic,\n    easeInOutCubic: easeInOutCubic,\n    easeInQuart: easeInQuart,\n    easeOutQuart: easeOutQuart,\n    easeInOutQuart: easeInOutQuart,\n    easeInQuint: easeInQuint,\n    easeOutQuint: easeOutQuint,\n    easeInOutQuint: easeInOutQuint,\n    easeInSine: easeInSine,\n    easeOutSine: easeOutSine,\n    easeInOutSine: easeInOutSine,\n    easeInExpo: easeInExpo,\n    easeOutExpo: easeOutExpo,\n    easeInOutExpo: easeInOutExpo,\n    easeInCirc: easeInCirc,\n    easeOutCirc: easeOutCirc,\n    easeInOutCirc: easeInOutCirc,\n    easeInElastic: easeInElastic,\n    easeOutElastic: easeOutElastic,\n    easeInOutElastic: easeInOutElastic,\n    easeInBack: easeInBack,\n    easeOutBack: easeOutBack,\n    easeInOutBack: easeInOutBack,\n    easeInBounce: easeInBounce,\n    easeOutBounce: easeOutBounce,\n    easeInOutBounce: easeInOutBounce\n  };\n\n})();\n\n\n(function(global) {\n\n  'use strict';\n\n  /**\n   * @name fabric\n   * @namespace\n   */\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      toFixed = fabric.util.toFixed,\n      parseUnit = fabric.util.parseUnit,\n      multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n      svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n        'image', 'text'],\n      svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n      svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n      svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n      attributesMap = {\n        cx:                   'left',\n        x:                    'left',\n        r:                    'radius',\n        cy:                   'top',\n        y:                    'top',\n        display:              'visible',\n        visibility:           'visible',\n        transform:            'transformMatrix',\n        'fill-opacity':       'fillOpacity',\n        'fill-rule':          'fillRule',\n        'font-family':        'fontFamily',\n        'font-size':          'fontSize',\n        'font-style':         'fontStyle',\n        'font-weight':        'fontWeight',\n        'letter-spacing':     'charSpacing',\n        'paint-order':        'paintFirst',\n        'stroke-dasharray':   'strokeDashArray',\n        'stroke-dashoffset':  'strokeDashOffset',\n        'stroke-linecap':     'strokeLineCap',\n        'stroke-linejoin':    'strokeLineJoin',\n        'stroke-miterlimit':  'strokeMiterLimit',\n        'stroke-opacity':     'strokeOpacity',\n        'stroke-width':       'strokeWidth',\n        'text-decoration':    'textDecoration',\n        'text-anchor':        'textAnchor',\n        opacity:              'opacity',\n        'clip-path':          'clipPath',\n        'clip-rule':          'clipRule',\n        'vector-effect':      'strokeUniform',\n        'image-rendering':    'imageSmoothing',\n      },\n\n      colorAttributes = {\n        stroke: 'strokeOpacity',\n        fill:   'fillOpacity'\n      },\n\n      fSize = 'font-size', cPath = 'clip-path';\n\n  fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n  fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n  fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n  fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n  fabric.cssRules = { };\n  fabric.gradientDefs = { };\n  fabric.clipPaths = { };\n\n  function normalizeAttr(attr) {\n    // transform attribute names\n    if (attr in attributesMap) {\n      return attributesMap[attr];\n    }\n    return attr;\n  }\n\n  function normalizeValue(attr, value, parentAttributes, fontSize) {\n    var isArray = Array.isArray(value), parsed;\n\n    if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n      value = '';\n    }\n    else if (attr === 'strokeUniform') {\n      return (value === 'non-scaling-stroke');\n    }\n    else if (attr === 'strokeDashArray') {\n      if (value === 'none') {\n        value = null;\n      }\n      else {\n        value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n      }\n    }\n    else if (attr === 'transformMatrix') {\n      if (parentAttributes && parentAttributes.transformMatrix) {\n        value = multiplyTransformMatrices(\n          parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n      }\n      else {\n        value = fabric.parseTransformAttribute(value);\n      }\n    }\n    else if (attr === 'visible') {\n      value = value !== 'none' && value !== 'hidden';\n      // display=none on parent element always takes precedence over child element\n      if (parentAttributes && parentAttributes.visible === false) {\n        value = false;\n      }\n    }\n    else if (attr === 'opacity') {\n      value = parseFloat(value);\n      if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n        value *= parentAttributes.opacity;\n      }\n    }\n    else if (attr === 'textAnchor' /* text-anchor */) {\n      value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n    }\n    else if (attr === 'charSpacing') {\n      // parseUnit returns px and we convert it to em\n      parsed = parseUnit(value, fontSize) / fontSize * 1000;\n    }\n    else if (attr === 'paintFirst') {\n      var fillIndex = value.indexOf('fill');\n      var strokeIndex = value.indexOf('stroke');\n      var value = 'fill';\n      if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n        value = 'stroke';\n      }\n      else if (fillIndex === -1 && strokeIndex > -1) {\n        value = 'stroke';\n      }\n    }\n    else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {\n      return value;\n    }\n    else if (attr === 'imageSmoothing') {\n      return (value === 'optimizeQuality');\n    }\n    else {\n      parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n    }\n\n    return (!isArray && isNaN(parsed) ? value : parsed);\n  }\n\n  /**\n    * @private\n    */\n  function getSvgRegex(arr) {\n    return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n  }\n\n  /**\n   * @private\n   * @param {Object} attributes Array of attributes to parse\n   */\n  function _setStrokeFillOpacity(attributes) {\n    for (var attr in colorAttributes) {\n\n      if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n        continue;\n      }\n\n      if (typeof attributes[attr] === 'undefined') {\n        if (!fabric.Object.prototype[attr]) {\n          continue;\n        }\n        attributes[attr] = fabric.Object.prototype[attr];\n      }\n\n      if (attributes[attr].indexOf('url(') === 0) {\n        continue;\n      }\n\n      var color = new fabric.Color(attributes[attr]);\n      attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n    }\n    return attributes;\n  }\n\n  /**\n   * @private\n   */\n  function _getMultipleNodes(doc, nodeNames) {\n    var nodeName, nodeArray = [], nodeList, i, len;\n    for (i = 0, len = nodeNames.length; i < len; i++) {\n      nodeName = nodeNames[i];\n      nodeList = doc.getElementsByTagName(nodeName);\n      nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n    }\n    return nodeArray;\n  }\n\n  /**\n   * Parses \"transform\" attribute, returning an array of values\n   * @static\n   * @function\n   * @memberOf fabric\n   * @param {String} attributeValue String containing attribute value\n   * @return {Array} Array of 6 elements representing transformation matrix\n   */\n  fabric.parseTransformAttribute = (function() {\n    function rotateMatrix(matrix, args) {\n      var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n          x = 0, y = 0;\n      if (args.length === 3) {\n        x = args[1];\n        y = args[2];\n      }\n\n      matrix[0] = cos;\n      matrix[1] = sin;\n      matrix[2] = -sin;\n      matrix[3] = cos;\n      matrix[4] = x - (cos * x - sin * y);\n      matrix[5] = y - (sin * x + cos * y);\n    }\n\n    function scaleMatrix(matrix, args) {\n      var multiplierX = args[0],\n          multiplierY = (args.length === 2) ? args[1] : args[0];\n\n      matrix[0] = multiplierX;\n      matrix[3] = multiplierY;\n    }\n\n    function skewMatrix(matrix, args, pos) {\n      matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n    }\n\n    function translateMatrix(matrix, args) {\n      matrix[4] = args[0];\n      if (args.length === 2) {\n        matrix[5] = args[1];\n      }\n    }\n\n    // identity matrix\n    var iMatrix = fabric.iMatrix,\n\n        // == begin transform regexp\n        number = fabric.reNum,\n\n        commaWsp = fabric.commaWsp,\n\n        skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n        skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n        rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + ')' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n                    commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n        matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' + commaWsp +\n                  '(' + number + ')' +\n                  '\\\\s*\\\\))',\n\n        transform = '(?:' +\n                    matrix + '|' +\n                    translate + '|' +\n                    scale + '|' +\n                    rotate + '|' +\n                    skewX + '|' +\n                    skewY +\n                    ')',\n\n        transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n        transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n        // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n        reTransformList = new RegExp(transformList),\n        // == end transform regexp\n\n        reTransform = new RegExp(transform, 'g');\n\n    return function(attributeValue) {\n\n      // start with identity matrix\n      var matrix = iMatrix.concat(),\n          matrices = [];\n\n      // return if no argument was given or\n      // an argument does not match transform attribute regexp\n      if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n        return matrix;\n      }\n\n      attributeValue.replace(reTransform, function(match) {\n\n        var m = new RegExp(transform).exec(match).filter(function (match) {\n              // match !== '' && match != null\n              return (!!match);\n            }),\n            operation = m[1],\n            args = m.slice(2).map(parseFloat);\n\n        switch (operation) {\n          case 'translate':\n            translateMatrix(matrix, args);\n            break;\n          case 'rotate':\n            args[0] = fabric.util.degreesToRadians(args[0]);\n            rotateMatrix(matrix, args);\n            break;\n          case 'scale':\n            scaleMatrix(matrix, args);\n            break;\n          case 'skewX':\n            skewMatrix(matrix, args, 2);\n            break;\n          case 'skewY':\n            skewMatrix(matrix, args, 1);\n            break;\n          case 'matrix':\n            matrix = args;\n            break;\n        }\n\n        // snapshot current matrix into matrices array\n        matrices.push(matrix.concat());\n        // reset\n        matrix = iMatrix.concat();\n      });\n\n      var combinedMatrix = matrices[0];\n      while (matrices.length > 1) {\n        matrices.shift();\n        combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n      }\n      return combinedMatrix;\n    };\n  })();\n\n  /**\n   * @private\n   */\n  function parseStyleString(style, oStyle) {\n    var attr, value;\n    style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n      var pair = chunk.split(':');\n\n      attr = pair[0].trim().toLowerCase();\n      value =  pair[1].trim();\n\n      oStyle[attr] = value;\n    });\n  }\n\n  /**\n   * @private\n   */\n  function parseStyleObject(style, oStyle) {\n    var attr, value;\n    for (var prop in style) {\n      if (typeof style[prop] === 'undefined') {\n        continue;\n      }\n\n      attr = prop.toLowerCase();\n      value = style[prop];\n\n      oStyle[attr] = value;\n    }\n  }\n\n  /**\n   * @private\n   */\n  function getGlobalStylesForElement(element, svgUid) {\n    var styles = { };\n    for (var rule in fabric.cssRules[svgUid]) {\n      if (elementMatchesRule(element, rule.split(' '))) {\n        for (var property in fabric.cssRules[svgUid][rule]) {\n          styles[property] = fabric.cssRules[svgUid][rule][property];\n        }\n      }\n    }\n    return styles;\n  }\n\n  /**\n   * @private\n   */\n  function elementMatchesRule(element, selectors) {\n    var firstMatching, parentMatching = true;\n    //start from rightmost selector.\n    firstMatching = selectorMatches(element, selectors.pop());\n    if (firstMatching && selectors.length) {\n      parentMatching = doesSomeParentMatch(element, selectors);\n    }\n    return firstMatching && parentMatching && (selectors.length === 0);\n  }\n\n  function doesSomeParentMatch(element, selectors) {\n    var selector, parentMatching = true;\n    while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n      if (parentMatching) {\n        selector = selectors.pop();\n      }\n      element = element.parentNode;\n      parentMatching = selectorMatches(element, selector);\n    }\n    return selectors.length === 0;\n  }\n\n  /**\n   * @private\n   */\n  function selectorMatches(element, selector) {\n    var nodeName = element.nodeName,\n        classNames = element.getAttribute('class'),\n        id = element.getAttribute('id'), matcher, i;\n    // i check if a selector matches slicing away part from it.\n    // if i get empty string i should match\n    matcher = new RegExp('^' + nodeName, 'i');\n    selector = selector.replace(matcher, '');\n    if (id && selector.length) {\n      matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n      selector = selector.replace(matcher, '');\n    }\n    if (classNames && selector.length) {\n      classNames = classNames.split(' ');\n      for (i = classNames.length; i--;) {\n        matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n        selector = selector.replace(matcher, '');\n      }\n    }\n    return selector.length === 0;\n  }\n\n  /**\n   * @private\n   * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n   */\n  function elementById(doc, id) {\n    var el;\n    doc.getElementById && (el = doc.getElementById(id));\n    if (el) {\n      return el;\n    }\n    var node, i, len, nodelist = doc.getElementsByTagName('*');\n    for (i = 0, len = nodelist.length; i < len; i++) {\n      node = nodelist[i];\n      if (id === node.getAttribute('id')) {\n        return node;\n      }\n    }\n  }\n\n  /**\n   * @private\n   */\n  function parseUseDirectives(doc) {\n    var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n    while (nodelist.length && i < nodelist.length) {\n      var el = nodelist[i],\n          xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');\n\n      if (xlinkAttribute === null) {\n        return;\n      }\n\n      var xlink = xlinkAttribute.slice(1),\n          x = el.getAttribute('x') || 0,\n          y = el.getAttribute('y') || 0,\n          el2 = elementById(doc, xlink).cloneNode(true),\n          currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n          parentNode,\n          oldLength = nodelist.length, attr,\n          j,\n          attrs,\n          len,\n          namespace = fabric.svgNS;\n\n      applyViewboxTransform(el2);\n      if (/^svg$/i.test(el2.nodeName)) {\n        var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n        for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n          attr = attrs.item(j);\n          el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n        }\n        // el2.firstChild != null\n        while (el2.firstChild) {\n          el3.appendChild(el2.firstChild);\n        }\n        el2 = el3;\n      }\n\n      for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n        attr = attrs.item(j);\n        if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n          attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n          continue;\n        }\n\n        if (attr.nodeName === 'transform') {\n          currentTrans = attr.nodeValue + ' ' + currentTrans;\n        }\n        else {\n          el2.setAttribute(attr.nodeName, attr.nodeValue);\n        }\n      }\n\n      el2.setAttribute('transform', currentTrans);\n      el2.setAttribute('instantiated_by_use', '1');\n      el2.removeAttribute('id');\n      parentNode = el.parentNode;\n      parentNode.replaceChild(el2, el);\n      // some browsers do not shorten nodelist after replaceChild (IE8)\n      if (nodelist.length === oldLength) {\n        i++;\n      }\n    }\n  }\n\n  // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n  // matches, e.g.: +14.56e-12, etc.\n  var reViewBoxAttrValue = new RegExp(\n    '^' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n    '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n    '$'\n  );\n\n  /**\n   * Add a <g> element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n   */\n  function applyViewboxTransform(element) {\n    if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {\n      return {};\n    }\n    var viewBoxAttr = element.getAttribute('viewBox'),\n        scaleX = 1,\n        scaleY = 1,\n        minX = 0,\n        minY = 0,\n        viewBoxWidth, viewBoxHeight, matrix, el,\n        widthAttr = element.getAttribute('width'),\n        heightAttr = element.getAttribute('height'),\n        x = element.getAttribute('x') || 0,\n        y = element.getAttribute('y') || 0,\n        preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n        missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n        missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n        toBeParsed = missingViewBox && missingDimAttr,\n        parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n    parsedDim.width = 0;\n    parsedDim.height = 0;\n    parsedDim.toBeParsed = toBeParsed;\n\n    if (missingViewBox) {\n      if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {\n        translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n        matrix = (element.getAttribute('transform') || '') + translateMatrix;\n        element.setAttribute('transform', matrix);\n        element.removeAttribute('x');\n        element.removeAttribute('y');\n      }\n    }\n\n    if (toBeParsed) {\n      return parsedDim;\n    }\n\n    if (missingViewBox) {\n      parsedDim.width = parseUnit(widthAttr);\n      parsedDim.height = parseUnit(heightAttr);\n      // set a transform for elements that have x y and are inner(only) SVGs\n      return parsedDim;\n    }\n    minX = -parseFloat(viewBoxAttr[1]);\n    minY = -parseFloat(viewBoxAttr[2]);\n    viewBoxWidth = parseFloat(viewBoxAttr[3]);\n    viewBoxHeight = parseFloat(viewBoxAttr[4]);\n    parsedDim.minX = minX;\n    parsedDim.minY = minY;\n    parsedDim.viewBoxWidth = viewBoxWidth;\n    parsedDim.viewBoxHeight = viewBoxHeight;\n    if (!missingDimAttr) {\n      parsedDim.width = parseUnit(widthAttr);\n      parsedDim.height = parseUnit(heightAttr);\n      scaleX = parsedDim.width / viewBoxWidth;\n      scaleY = parsedDim.height / viewBoxHeight;\n    }\n    else {\n      parsedDim.width = viewBoxWidth;\n      parsedDim.height = viewBoxHeight;\n    }\n\n    // default is to preserve aspect ratio\n    preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n    if (preserveAspectRatio.alignX !== 'none') {\n      //translate all container for the effect of Mid, Min, Max\n      if (preserveAspectRatio.meetOrSlice === 'meet') {\n        scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n        // calculate additional translation to move the viewbox\n      }\n      if (preserveAspectRatio.meetOrSlice === 'slice') {\n        scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n        // calculate additional translation to move the viewbox\n      }\n      widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n      heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n      if (preserveAspectRatio.alignX === 'Mid') {\n        widthDiff /= 2;\n      }\n      if (preserveAspectRatio.alignY === 'Mid') {\n        heightDiff /= 2;\n      }\n      if (preserveAspectRatio.alignX === 'Min') {\n        widthDiff = 0;\n      }\n      if (preserveAspectRatio.alignY === 'Min') {\n        heightDiff = 0;\n      }\n    }\n\n    if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n      return parsedDim;\n    }\n    if ((x || y) && element.parentNode.nodeName !== '#document') {\n      translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n    }\n\n    matrix = translateMatrix + ' matrix(' + scaleX +\n                  ' 0' +\n                  ' 0 ' +\n                  scaleY + ' ' +\n                  (minX * scaleX + widthDiff) + ' ' +\n                  (minY * scaleY + heightDiff) + ') ';\n    // seems unused.\n    // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n    if (element.nodeName === 'svg') {\n      el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n      // element.firstChild != null\n      while (element.firstChild) {\n        el.appendChild(element.firstChild);\n      }\n      element.appendChild(el);\n    }\n    else {\n      el = element;\n      el.removeAttribute('x');\n      el.removeAttribute('y');\n      matrix = el.getAttribute('transform') + matrix;\n    }\n    el.setAttribute('transform', matrix);\n    return parsedDim;\n  }\n\n  function hasAncestorWithNodeName(element, nodeName) {\n    while (element && (element = element.parentNode)) {\n      if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n        && !element.getAttribute('instantiated_by_use')) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n   * @static\n   * @function\n   * @memberOf fabric\n   * @param {SVGDocument} doc SVG document to parse\n   * @param {Function} callback Callback to call when parsing is finished;\n   * It's being passed an array of elements (parsed from a document).\n   * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n   * @param {Object} [parsingOptions] options for parsing document\n   * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n   */\n  fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n    if (!doc) {\n      return;\n    }\n\n    parseUseDirectives(doc);\n\n    var svgUid =  fabric.Object.__uid++, i, len,\n        options = applyViewboxTransform(doc),\n        descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n    options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n    options.svgUid = svgUid;\n\n    if (descendants.length === 0 && fabric.isLikelyNode) {\n      // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n      // https://github.com/ajaxorg/node-o3-xml/issues/21\n      descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n      var arr = [];\n      for (i = 0, len = descendants.length; i < len; i++) {\n        arr[i] = descendants[i];\n      }\n      descendants = arr;\n    }\n\n    var elements = descendants.filter(function(el) {\n      applyViewboxTransform(el);\n      return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n            !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n    });\n    if (!elements || (elements && !elements.length)) {\n      callback && callback([], {});\n      return;\n    }\n    var clipPaths = { };\n    descendants.filter(function(el) {\n      return el.nodeName.replace('svg:', '') === 'clipPath';\n    }).forEach(function(el) {\n      var id = el.getAttribute('id');\n      clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n        return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n      });\n    });\n    fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n    fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n    fabric.clipPaths[svgUid] = clipPaths;\n    // Precedence of rules:   style > class > attribute\n    fabric.parseElements(elements, function(instances, elements) {\n      if (callback) {\n        callback(instances, options, elements, descendants);\n        delete fabric.gradientDefs[svgUid];\n        delete fabric.cssRules[svgUid];\n        delete fabric.clipPaths[svgUid];\n      }\n    }, clone(options), reviver, parsingOptions);\n  };\n\n  function recursivelyParseGradientsXlink(doc, gradient) {\n    var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n        xlinkAttr = 'xlink:href',\n        xLink = gradient.getAttribute(xlinkAttr).slice(1),\n        referencedGradient = elementById(doc, xLink);\n    if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n      recursivelyParseGradientsXlink(doc, referencedGradient);\n    }\n    gradientsAttrs.forEach(function(attr) {\n      if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n        gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n      }\n    });\n    if (!gradient.children.length) {\n      var referenceClone = referencedGradient.cloneNode(true);\n      while (referenceClone.firstChild) {\n        gradient.appendChild(referenceClone.firstChild);\n      }\n    }\n    gradient.removeAttribute(xlinkAttr);\n  }\n\n  var reFontDeclaration = new RegExp(\n    '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n    '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n      fabric.reNum +\n    '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n  extend(fabric, {\n    /**\n     * Parses a short font declaration, building adding its properties to a style object\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {String} value font declaration\n     * @param {Object} oStyle definition\n     */\n    parseFontDeclaration: function(value, oStyle) {\n      var match = value.match(reFontDeclaration);\n\n      if (!match) {\n        return;\n      }\n      var fontStyle = match[1],\n          // font variant is not used\n          // fontVariant = match[2],\n          fontWeight = match[3],\n          fontSize = match[4],\n          lineHeight = match[5],\n          fontFamily = match[6];\n\n      if (fontStyle) {\n        oStyle.fontStyle = fontStyle;\n      }\n      if (fontWeight) {\n        oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n      }\n      if (fontSize) {\n        oStyle.fontSize = parseUnit(fontSize);\n      }\n      if (fontFamily) {\n        oStyle.fontFamily = fontFamily;\n      }\n      if (lineHeight) {\n        oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n      }\n    },\n\n    /**\n     * Parses an SVG document, returning all of the gradient declarations found in it\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {SVGDocument} doc SVG document to parse\n     * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n     */\n    getGradientDefs: function(doc) {\n      var tagArray = [\n            'linearGradient',\n            'radialGradient',\n            'svg:linearGradient',\n            'svg:radialGradient'],\n          elList = _getMultipleNodes(doc, tagArray),\n          el, j = 0, gradientDefs = { };\n      j = elList.length;\n      while (j--) {\n        el = elList[j];\n        if (el.getAttribute('xlink:href')) {\n          recursivelyParseGradientsXlink(doc, el);\n        }\n        gradientDefs[el.getAttribute('id')] = el;\n      }\n      return gradientDefs;\n    },\n\n    /**\n     * Returns an object of attributes' name/value, given element and an array of attribute names;\n     * Parses parent \"g\" nodes recursively upwards.\n     * @static\n     * @memberOf fabric\n     * @param {DOMElement} element Element to parse\n     * @param {Array} attributes Array of attributes to parse\n     * @return {Object} object containing parsed attributes' names/values\n     */\n    parseAttributes: function(element, attributes, svgUid) {\n\n      if (!element) {\n        return;\n      }\n\n      var value,\n          parentAttributes = { },\n          fontSize, parentFontSize;\n\n      if (typeof svgUid === 'undefined') {\n        svgUid = element.getAttribute('svgUid');\n      }\n      // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n      if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n        parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n      }\n\n      var ownAttributes = attributes.reduce(function(memo, attr) {\n        value = element.getAttribute(attr);\n        if (value) { // eslint-disable-line\n          memo[attr] = value;\n        }\n        return memo;\n      }, { });\n      // add values parsed from style, which take precedence over attributes\n      // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n      var cssAttrs = extend(\n        getGlobalStylesForElement(element, svgUid),\n        fabric.parseStyleAttribute(element)\n      );\n      ownAttributes = extend(\n        ownAttributes,\n        cssAttrs\n      );\n      if (cssAttrs[cPath]) {\n        element.setAttribute(cPath, cssAttrs[cPath]);\n      }\n      fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n      if (ownAttributes[fSize]) {\n        // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n        ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n      }\n\n      var normalizedAttr, normalizedValue, normalizedStyle = {};\n      for (var attr in ownAttributes) {\n        normalizedAttr = normalizeAttr(attr);\n        normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n        normalizedStyle[normalizedAttr] = normalizedValue;\n      }\n      if (normalizedStyle && normalizedStyle.font) {\n        fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n      }\n      var mergedAttrs = extend(parentAttributes, normalizedStyle);\n      return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n    },\n\n    /**\n     * Transforms an array of svg elements to corresponding fabric.* instances\n     * @static\n     * @memberOf fabric\n     * @param {Array} elements Array of elements to parse\n     * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n     * @param {Object} [options] Options object\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     */\n    parseElements: function(elements, callback, options, reviver, parsingOptions) {\n      new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n    },\n\n    /**\n     * Parses \"style\" attribute, retuning an object with values\n     * @static\n     * @memberOf fabric\n     * @param {SVGElement} element Element to parse\n     * @return {Object} Objects with values parsed from style attribute of an element\n     */\n    parseStyleAttribute: function(element) {\n      var oStyle = { },\n          style = element.getAttribute('style');\n\n      if (!style) {\n        return oStyle;\n      }\n\n      if (typeof style === 'string') {\n        parseStyleString(style, oStyle);\n      }\n      else {\n        parseStyleObject(style, oStyle);\n      }\n\n      return oStyle;\n    },\n\n    /**\n     * Parses \"points\" attribute, returning an array of values\n     * @static\n     * @memberOf fabric\n     * @param {String} points points attribute string\n     * @return {Array} array of points\n     */\n    parsePointsAttribute: function(points) {\n\n      // points attribute is required and must not be empty\n      if (!points) {\n        return null;\n      }\n\n      // replace commas with whitespace and remove bookending whitespace\n      points = points.replace(/,/g, ' ').trim();\n\n      points = points.split(/\\s+/);\n      var parsedPoints = [], i, len;\n\n      for (i = 0, len = points.length; i < len; i += 2) {\n        parsedPoints.push({\n          x: parseFloat(points[i]),\n          y: parseFloat(points[i + 1])\n        });\n      }\n\n      // odd number of points is an error\n      // if (parsedPoints.length % 2 !== 0) {\n      //   return null;\n      // }\n\n      return parsedPoints;\n    },\n\n    /**\n     * Returns CSS rules for a given SVG document\n     * @static\n     * @function\n     * @memberOf fabric\n     * @param {SVGDocument} doc SVG document to parse\n     * @return {Object} CSS rules of this document\n     */\n    getCSSRules: function(doc) {\n      var styles = doc.getElementsByTagName('style'), i, len,\n          allRules = { }, rules;\n\n      // very crude parsing of style contents\n      for (i = 0, len = styles.length; i < len; i++) {\n        var styleContents = styles[i].textContent;\n\n        // remove comments\n        styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n        if (styleContents.trim() === '') {\n          continue;\n        }\n        // recovers all the rule in this form `body { style code... }`\n        // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n        rules = styleContents.split('}');\n        // remove empty rules.\n        rules = rules.filter(function(rule) { return rule.trim(); });\n        // at this point we have hopefully an array of rules `body { style code... `\n        // eslint-disable-next-line no-loop-func\n        rules.forEach(function(rule) {\n\n          var match = rule.split('{'),\n              ruleObj = { }, declaration = match[1].trim(),\n              propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); });\n\n          for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n            var pair = propertyValuePairs[i].split(':'),\n                property = pair[0].trim(),\n                value = pair[1].trim();\n            ruleObj[property] = value;\n          }\n          rule = match[0].trim();\n          rule.split(',').forEach(function(_rule) {\n            _rule = _rule.replace(/^svg/i, '').trim();\n            if (_rule === '') {\n              return;\n            }\n            if (allRules[_rule]) {\n              fabric.util.object.extend(allRules[_rule], ruleObj);\n            }\n            else {\n              allRules[_rule] = fabric.util.object.clone(ruleObj);\n            }\n          });\n        });\n      }\n      return allRules;\n    },\n\n    /**\n     * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n     * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n     * @memberOf fabric\n     * @param {String} url\n     * @param {Function} callback\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     * @param {Object} [options] Object containing options for parsing\n     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n     */\n    loadSVGFromURL: function(url, callback, reviver, options) {\n\n      url = url.replace(/^\\n\\s*/, '').trim();\n      new fabric.util.request(url, {\n        method: 'get',\n        onComplete: onComplete\n      });\n\n      function onComplete(r) {\n\n        var xml = r.responseXML;\n        if (!xml || !xml.documentElement) {\n          callback && callback(null);\n          return false;\n        }\n\n        fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n          callback && callback(results, _options, elements, allElements);\n        }, reviver, options);\n      }\n    },\n\n    /**\n     * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n     * @memberOf fabric\n     * @param {String} string\n     * @param {Function} callback\n     * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n     * @param {Object} [options] Object containing options for parsing\n     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n     */\n    loadSVGFromString: function(string, callback, reviver, options) {\n      var parser = new fabric.window.DOMParser(),\n          doc = parser.parseFromString(string.trim(), 'text/xml');\n      fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n        callback(results, _options, elements, allElements);\n      }, reviver, options);\n    }\n  });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) {\n  this.elements = elements;\n  this.callback = callback;\n  this.options = options;\n  this.reviver = reviver;\n  this.svgUid = (options && options.svgUid) || 0;\n  this.parsingOptions = parsingOptions;\n  this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n  this.doc = doc;\n};\n\n(function(proto) {\n  proto.parse = function() {\n    this.instances = new Array(this.elements.length);\n    this.numElements = this.elements.length;\n    this.createObjects();\n  };\n\n  proto.createObjects = function() {\n    var _this = this;\n    this.elements.forEach(function(element, i) {\n      element.setAttribute('svgUid', _this.svgUid);\n      _this.createObject(element, i);\n    });\n  };\n\n  proto.findTag = function(el) {\n    return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n  };\n\n  proto.createObject = function(el, index) {\n    var klass = this.findTag(el);\n    if (klass && klass.fromElement) {\n      try {\n        klass.fromElement(el, this.createCallback(index, el), this.options);\n      }\n      catch (err) {\n        fabric.log(err);\n      }\n    }\n    else {\n      this.checkIfDone();\n    }\n  };\n\n  proto.createCallback = function(index, el) {\n    var _this = this;\n    return function(obj) {\n      var _options;\n      _this.resolveGradient(obj, el, 'fill');\n      _this.resolveGradient(obj, el, 'stroke');\n      if (obj instanceof fabric.Image && obj._originalElement) {\n        _options = obj.parsePreserveAspectRatioAttribute(el);\n      }\n      obj._removeTransformMatrix(_options);\n      _this.resolveClipPath(obj, el);\n      _this.reviver && _this.reviver(el, obj);\n      _this.instances[index] = obj;\n      _this.checkIfDone();\n    };\n  };\n\n  proto.extractPropertyDefinition = function(obj, property, storage) {\n    var value = obj[property], regex = this.regexUrl;\n    if (!regex.test(value)) {\n      return;\n    }\n    regex.lastIndex = 0;\n    var id = regex.exec(value)[1];\n    regex.lastIndex = 0;\n    return fabric[storage][this.svgUid][id];\n  };\n\n  proto.resolveGradient = function(obj, el, property) {\n    var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n    if (gradientDef) {\n      var opacityAttr = el.getAttribute(property + '-opacity');\n      var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n      obj.set(property, gradient);\n    }\n  };\n\n  proto.createClipPathCallback = function(obj, container) {\n    return function(_newObj) {\n      _newObj._removeTransformMatrix();\n      _newObj.fillRule = _newObj.clipRule;\n      container.push(_newObj);\n    };\n  };\n\n  proto.resolveClipPath = function(obj, usingElement) {\n    var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n        element, klass, objTransformInv, container, gTransform, options;\n    if (clipPath) {\n      container = [];\n      objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n      // move the clipPath tag as sibling to the real element that is using it\n      var clipPathTag = clipPath[0].parentNode;\n      var clipPathOwner = usingElement;\n      while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) {\n        clipPathOwner = clipPathOwner.parentNode;\n      }\n      clipPathOwner.parentNode.appendChild(clipPathTag);\n      for (var i = 0; i < clipPath.length; i++) {\n        element = clipPath[i];\n        klass = this.findTag(element);\n        klass.fromElement(\n          element,\n          this.createClipPathCallback(obj, container),\n          this.options\n        );\n      }\n      if (container.length === 1) {\n        clipPath = container[0];\n      }\n      else {\n        clipPath = new fabric.Group(container);\n      }\n      gTransform = fabric.util.multiplyTransformMatrices(\n        objTransformInv,\n        clipPath.calcTransformMatrix()\n      );\n      if (clipPath.clipPath) {\n        this.resolveClipPath(clipPath, clipPathOwner);\n      }\n      var options = fabric.util.qrDecompose(gTransform);\n      clipPath.flipX = false;\n      clipPath.flipY = false;\n      clipPath.set('scaleX', options.scaleX);\n      clipPath.set('scaleY', options.scaleY);\n      clipPath.angle = options.angle;\n      clipPath.skewX = options.skewX;\n      clipPath.skewY = 0;\n      clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n      obj.clipPath = clipPath;\n    }\n    else {\n      // if clip-path does not resolve to any element, delete the property.\n      delete obj.clipPath;\n    }\n  };\n\n  proto.checkIfDone = function() {\n    if (--this.numElements === 0) {\n      this.instances = this.instances.filter(function(el) {\n        // eslint-disable-next-line no-eq-null, eqeqeq\n        return el != null;\n      });\n      this.callback(this.instances, this.elements);\n    }\n  };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n  'use strict';\n\n  /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Point) {\n    fabric.warn('fabric.Point is already defined');\n    return;\n  }\n\n  fabric.Point = Point;\n\n  /**\n   * Point class\n   * @class fabric.Point\n   * @memberOf fabric\n   * @constructor\n   * @param {Number} x\n   * @param {Number} y\n   * @return {fabric.Point} thisArg\n   */\n  function Point(x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  Point.prototype = /** @lends fabric.Point.prototype */ {\n\n    type: 'point',\n\n    constructor: Point,\n\n    /**\n     * Adds another point to this one and returns another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} new Point instance with added values\n     */\n    add: function (that) {\n      return new Point(this.x + that.x, this.y + that.y);\n    },\n\n    /**\n     * Adds another point to this one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    addEquals: function (that) {\n      this.x += that.x;\n      this.y += that.y;\n      return this;\n    },\n\n    /**\n     * Adds value to this point and returns a new one\n     * @param {Number} scalar\n     * @return {fabric.Point} new Point with added value\n     */\n    scalarAdd: function (scalar) {\n      return new Point(this.x + scalar, this.y + scalar);\n    },\n\n    /**\n     * Adds value to this point\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    scalarAddEquals: function (scalar) {\n      this.x += scalar;\n      this.y += scalar;\n      return this;\n    },\n\n    /**\n     * Subtracts another point from this point and returns a new one\n     * @param {fabric.Point} that\n     * @return {fabric.Point} new Point object with subtracted values\n     */\n    subtract: function (that) {\n      return new Point(this.x - that.x, this.y - that.y);\n    },\n\n    /**\n     * Subtracts another point from this point\n     * @param {fabric.Point} that\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    subtractEquals: function (that) {\n      this.x -= that.x;\n      this.y -= that.y;\n      return this;\n    },\n\n    /**\n     * Subtracts value from this point and returns a new one\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    scalarSubtract: function (scalar) {\n      return new Point(this.x - scalar, this.y - scalar);\n    },\n\n    /**\n     * Subtracts value from this point\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    scalarSubtractEquals: function (scalar) {\n      this.x -= scalar;\n      this.y -= scalar;\n      return this;\n    },\n\n    /**\n     * Multiplies this point by a value and returns a new one\n     * TODO: rename in scalarMultiply in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    multiply: function (scalar) {\n      return new Point(this.x * scalar, this.y * scalar);\n    },\n\n    /**\n     * Multiplies this point by a value\n     * TODO: rename in scalarMultiplyEquals in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    multiplyEquals: function (scalar) {\n      this.x *= scalar;\n      this.y *= scalar;\n      return this;\n    },\n\n    /**\n     * Divides this point by a value and returns a new one\n     * TODO: rename in scalarDivide in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point}\n     */\n    divide: function (scalar) {\n      return new Point(this.x / scalar, this.y / scalar);\n    },\n\n    /**\n     * Divides this point by a value\n     * TODO: rename in scalarDivideEquals in 2.0\n     * @param {Number} scalar\n     * @return {fabric.Point} thisArg\n     * @chainable\n     */\n    divideEquals: function (scalar) {\n      this.x /= scalar;\n      this.y /= scalar;\n      return this;\n    },\n\n    /**\n     * Returns true if this point is equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    eq: function (that) {\n      return (this.x === that.x && this.y === that.y);\n    },\n\n    /**\n     * Returns true if this point is less than another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    lt: function (that) {\n      return (this.x < that.x && this.y < that.y);\n    },\n\n    /**\n     * Returns true if this point is less than or equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    lte: function (that) {\n      return (this.x <= that.x && this.y <= that.y);\n    },\n\n    /**\n\n     * Returns true if this point is greater another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    gt: function (that) {\n      return (this.x > that.x && this.y > that.y);\n    },\n\n    /**\n     * Returns true if this point is greater than or equal to another one\n     * @param {fabric.Point} that\n     * @return {Boolean}\n     */\n    gte: function (that) {\n      return (this.x >= that.x && this.y >= that.y);\n    },\n\n    /**\n     * Returns new point which is the result of linear interpolation with this one and another one\n     * @param {fabric.Point} that\n     * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n     * @return {fabric.Point}\n     */\n    lerp: function (that, t) {\n      if (typeof t === 'undefined') {\n        t = 0.5;\n      }\n      t = Math.max(Math.min(1, t), 0);\n      return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n    },\n\n    /**\n     * Returns distance from this point and another one\n     * @param {fabric.Point} that\n     * @return {Number}\n     */\n    distanceFrom: function (that) {\n      var dx = this.x - that.x,\n          dy = this.y - that.y;\n      return Math.sqrt(dx * dx + dy * dy);\n    },\n\n    /**\n     * Returns the point between this point and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    midPointFrom: function (that) {\n      return this.lerp(that);\n    },\n\n    /**\n     * Returns a new point which is the min of this and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    min: function (that) {\n      return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n    },\n\n    /**\n     * Returns a new point which is the max of this and another one\n     * @param {fabric.Point} that\n     * @return {fabric.Point}\n     */\n    max: function (that) {\n      return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n    },\n\n    /**\n     * Returns string representation of this point\n     * @return {String}\n     */\n    toString: function () {\n      return this.x + ',' + this.y;\n    },\n\n    /**\n     * Sets x/y of this point\n     * @param {Number} x\n     * @param {Number} y\n     * @chainable\n     */\n    setXY: function (x, y) {\n      this.x = x;\n      this.y = y;\n      return this;\n    },\n\n    /**\n     * Sets x of this point\n     * @param {Number} x\n     * @chainable\n     */\n    setX: function (x) {\n      this.x = x;\n      return this;\n    },\n\n    /**\n     * Sets y of this point\n     * @param {Number} y\n     * @chainable\n     */\n    setY: function (y) {\n      this.y = y;\n      return this;\n    },\n\n    /**\n     * Sets x/y of this point from another point\n     * @param {fabric.Point} that\n     * @chainable\n     */\n    setFromPoint: function (that) {\n      this.x = that.x;\n      this.y = that.y;\n      return this;\n    },\n\n    /**\n     * Swaps x/y of this point and another point\n     * @param {fabric.Point} that\n     */\n    swap: function (that) {\n      var x = this.x,\n          y = this.y;\n      this.x = that.x;\n      this.y = that.y;\n      that.x = x;\n      that.y = y;\n    },\n\n    /**\n     * return a cloned instance of the point\n     * @return {fabric.Point}\n     */\n    clone: function () {\n      return new Point(this.x, this.y);\n    }\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Intersection) {\n    fabric.warn('fabric.Intersection is already defined');\n    return;\n  }\n\n  /**\n   * Intersection class\n   * @class fabric.Intersection\n   * @memberOf fabric\n   * @constructor\n   */\n  function Intersection(status) {\n    this.status = status;\n    this.points = [];\n  }\n\n  fabric.Intersection = Intersection;\n\n  fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n    constructor: Intersection,\n\n    /**\n     * Appends a point to intersection\n     * @param {fabric.Point} point\n     * @return {fabric.Intersection} thisArg\n     * @chainable\n     */\n    appendPoint: function (point) {\n      this.points.push(point);\n      return this;\n    },\n\n    /**\n     * Appends points to intersection\n     * @param {Array} points\n     * @return {fabric.Intersection} thisArg\n     * @chainable\n     */\n    appendPoints: function (points) {\n      this.points = this.points.concat(points);\n      return this;\n    }\n  };\n\n  /**\n   * Checks if one line intersects another\n   * TODO: rename in intersectSegmentSegment\n   * @static\n   * @param {fabric.Point} a1\n   * @param {fabric.Point} a2\n   * @param {fabric.Point} b1\n   * @param {fabric.Point} b2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n    var result,\n        uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n        ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n        uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n    if (uB !== 0) {\n      var ua = uaT / uB,\n          ub = ubT / uB;\n      if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n        result = new Intersection('Intersection');\n        result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n      }\n      else {\n        result = new Intersection();\n      }\n    }\n    else {\n      if (uaT === 0 || ubT === 0) {\n        result = new Intersection('Coincident');\n      }\n      else {\n        result = new Intersection('Parallel');\n      }\n    }\n    return result;\n  };\n\n  /**\n   * Checks if line intersects polygon\n   * TODO: rename in intersectSegmentPolygon\n   * fix detection of coincident\n   * @static\n   * @param {fabric.Point} a1\n   * @param {fabric.Point} a2\n   * @param {Array} points\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n    var result = new Intersection(),\n        length = points.length,\n        b1, b2, inter, i;\n\n    for (i = 0; i < length; i++) {\n      b1 = points[i];\n      b2 = points[(i + 1) % length];\n      inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n      result.appendPoints(inter.points);\n    }\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n  /**\n   * Checks if polygon intersects another polygon\n   * @static\n   * @param {Array} points1\n   * @param {Array} points2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n    var result = new Intersection(),\n        length = points1.length, i;\n\n    for (i = 0; i < length; i++) {\n      var a1 = points1[i],\n          a2 = points1[(i + 1) % length],\n          inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n      result.appendPoints(inter.points);\n    }\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n  /**\n   * Checks if polygon intersects rectangle\n   * @static\n   * @param {Array} points\n   * @param {fabric.Point} r1\n   * @param {fabric.Point} r2\n   * @return {fabric.Intersection}\n   */\n  fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n    var min = r1.min(r2),\n        max = r1.max(r2),\n        topRight = new fabric.Point(max.x, min.y),\n        bottomLeft = new fabric.Point(min.x, max.y),\n        inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n        inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n        inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n        inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n        result = new Intersection();\n\n    result.appendPoints(inter1.points);\n    result.appendPoints(inter2.points);\n    result.appendPoints(inter3.points);\n    result.appendPoints(inter4.points);\n\n    if (result.points.length > 0) {\n      result.status = 'Intersection';\n    }\n    return result;\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Color) {\n    fabric.warn('fabric.Color is already defined.');\n    return;\n  }\n\n  /**\n   * Color class\n   * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n   * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n   *\n   * @class fabric.Color\n   * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n   * @return {fabric.Color} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n   */\n  function Color(color) {\n    if (!color) {\n      this.setSource([0, 0, 0, 1]);\n    }\n    else {\n      this._tryParsingColor(color);\n    }\n  }\n\n  fabric.Color = Color;\n\n  fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n    /**\n     * @private\n     * @param {String|Array} color Color value to parse\n     */\n    _tryParsingColor: function(color) {\n      var source;\n\n      if (color in Color.colorNameMap) {\n        color = Color.colorNameMap[color];\n      }\n\n      if (color === 'transparent') {\n        source = [255, 255, 255, 0];\n      }\n\n      if (!source) {\n        source = Color.sourceFromHex(color);\n      }\n      if (!source) {\n        source = Color.sourceFromRgb(color);\n      }\n      if (!source) {\n        source = Color.sourceFromHsl(color);\n      }\n      if (!source) {\n        //if color is not recognize let's make black as canvas does\n        source = [0, 0, 0, 1];\n      }\n      if (source) {\n        this.setSource(source);\n      }\n    },\n\n    /**\n     * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n     * @private\n     * @param {Number} r Red color value\n     * @param {Number} g Green color value\n     * @param {Number} b Blue color value\n     * @return {Array} Hsl color\n     */\n    _rgbToHsl: function(r, g, b) {\n      r /= 255; g /= 255; b /= 255;\n\n      var h, s, l,\n          max = fabric.util.array.max([r, g, b]),\n          min = fabric.util.array.min([r, g, b]);\n\n      l = (max + min) / 2;\n\n      if (max === min) {\n        h = s = 0; // achromatic\n      }\n      else {\n        var d = max - min;\n        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n        switch (max) {\n          case r:\n            h = (g - b) / d + (g < b ? 6 : 0);\n            break;\n          case g:\n            h = (b - r) / d + 2;\n            break;\n          case b:\n            h = (r - g) / d + 4;\n            break;\n        }\n        h /= 6;\n      }\n\n      return [\n        Math.round(h * 360),\n        Math.round(s * 100),\n        Math.round(l * 100)\n      ];\n    },\n\n    /**\n     * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n     * @return {Array}\n     */\n    getSource: function() {\n      return this._source;\n    },\n\n    /**\n     * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n     * @param {Array} source\n     */\n    setSource: function(source) {\n      this._source = source;\n    },\n\n    /**\n     * Returns color representation in RGB format\n     * @return {String} ex: rgb(0-255,0-255,0-255)\n     */\n    toRgb: function() {\n      var source = this.getSource();\n      return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n    },\n\n    /**\n     * Returns color representation in RGBA format\n     * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n     */\n    toRgba: function() {\n      var source = this.getSource();\n      return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n    },\n\n    /**\n     * Returns color representation in HSL format\n     * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n     */\n    toHsl: function() {\n      var source = this.getSource(),\n          hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n      return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n    },\n\n    /**\n     * Returns color representation in HSLA format\n     * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n     */\n    toHsla: function() {\n      var source = this.getSource(),\n          hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n      return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n    },\n\n    /**\n     * Returns color representation in HEX format\n     * @return {String} ex: FF5555\n     */\n    toHex: function() {\n      var source = this.getSource(), r, g, b;\n\n      r = source[0].toString(16);\n      r = (r.length === 1) ? ('0' + r) : r;\n\n      g = source[1].toString(16);\n      g = (g.length === 1) ? ('0' + g) : g;\n\n      b = source[2].toString(16);\n      b = (b.length === 1) ? ('0' + b) : b;\n\n      return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n    },\n\n    /**\n     * Returns color representation in HEXA format\n     * @return {String} ex: FF5555CC\n     */\n    toHexa: function() {\n      var source = this.getSource(), a;\n\n      a = Math.round(source[3] * 255);\n      a = a.toString(16);\n      a = (a.length === 1) ? ('0' + a) : a;\n\n      return this.toHex() + a.toUpperCase();\n    },\n\n    /**\n     * Gets value of alpha channel for this color\n     * @return {Number} 0-1\n     */\n    getAlpha: function() {\n      return this.getSource()[3];\n    },\n\n    /**\n     * Sets value of alpha channel for this color\n     * @param {Number} alpha Alpha value 0-1\n     * @return {fabric.Color} thisArg\n     */\n    setAlpha: function(alpha) {\n      var source = this.getSource();\n      source[3] = alpha;\n      this.setSource(source);\n      return this;\n    },\n\n    /**\n     * Transforms color to its grayscale representation\n     * @return {fabric.Color} thisArg\n     */\n    toGrayscale: function() {\n      var source = this.getSource(),\n          average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n          currentAlpha = source[3];\n      this.setSource([average, average, average, currentAlpha]);\n      return this;\n    },\n\n    /**\n     * Transforms color to its black and white representation\n     * @param {Number} threshold\n     * @return {fabric.Color} thisArg\n     */\n    toBlackWhite: function(threshold) {\n      var source = this.getSource(),\n          average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n          currentAlpha = source[3];\n\n      threshold = threshold || 127;\n\n      average = (Number(average) < Number(threshold)) ? 0 : 255;\n      this.setSource([average, average, average, currentAlpha]);\n      return this;\n    },\n\n    /**\n     * Overlays color with another color\n     * @param {String|fabric.Color} otherColor\n     * @return {fabric.Color} thisArg\n     */\n    overlayWith: function(otherColor) {\n      if (!(otherColor instanceof Color)) {\n        otherColor = new Color(otherColor);\n      }\n\n      var result = [],\n          alpha = this.getAlpha(),\n          otherAlpha = 0.5,\n          source = this.getSource(),\n          otherSource = otherColor.getSource(), i;\n\n      for (i = 0; i < 3; i++) {\n        result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n      }\n\n      result[3] = alpha;\n      this.setSource(result);\n      return this;\n    }\n  };\n\n  /**\n   * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  // eslint-disable-next-line max-len\n  fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n  /**\n   * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n  /**\n   * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   */\n  fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n  /**\n   * Map of the 148 color names with HEX code\n   * @static\n   * @field\n   * @memberOf fabric.Color\n   * @see: https://www.w3.org/TR/css3-color/#svg-color\n   */\n  fabric.Color.colorNameMap = {\n    aliceblue:            '#F0F8FF',\n    antiquewhite:         '#FAEBD7',\n    aqua:                 '#00FFFF',\n    aquamarine:           '#7FFFD4',\n    azure:                '#F0FFFF',\n    beige:                '#F5F5DC',\n    bisque:               '#FFE4C4',\n    black:                '#000000',\n    blanchedalmond:       '#FFEBCD',\n    blue:                 '#0000FF',\n    blueviolet:           '#8A2BE2',\n    brown:                '#A52A2A',\n    burlywood:            '#DEB887',\n    cadetblue:            '#5F9EA0',\n    chartreuse:           '#7FFF00',\n    chocolate:            '#D2691E',\n    coral:                '#FF7F50',\n    cornflowerblue:       '#6495ED',\n    cornsilk:             '#FFF8DC',\n    crimson:              '#DC143C',\n    cyan:                 '#00FFFF',\n    darkblue:             '#00008B',\n    darkcyan:             '#008B8B',\n    darkgoldenrod:        '#B8860B',\n    darkgray:             '#A9A9A9',\n    darkgrey:             '#A9A9A9',\n    darkgreen:            '#006400',\n    darkkhaki:            '#BDB76B',\n    darkmagenta:          '#8B008B',\n    darkolivegreen:       '#556B2F',\n    darkorange:           '#FF8C00',\n    darkorchid:           '#9932CC',\n    darkred:              '#8B0000',\n    darksalmon:           '#E9967A',\n    darkseagreen:         '#8FBC8F',\n    darkslateblue:        '#483D8B',\n    darkslategray:        '#2F4F4F',\n    darkslategrey:        '#2F4F4F',\n    darkturquoise:        '#00CED1',\n    darkviolet:           '#9400D3',\n    deeppink:             '#FF1493',\n    deepskyblue:          '#00BFFF',\n    dimgray:              '#696969',\n    dimgrey:              '#696969',\n    dodgerblue:           '#1E90FF',\n    firebrick:            '#B22222',\n    floralwhite:          '#FFFAF0',\n    forestgreen:          '#228B22',\n    fuchsia:              '#FF00FF',\n    gainsboro:            '#DCDCDC',\n    ghostwhite:           '#F8F8FF',\n    gold:                 '#FFD700',\n    goldenrod:            '#DAA520',\n    gray:                 '#808080',\n    grey:                 '#808080',\n    green:                '#008000',\n    greenyellow:          '#ADFF2F',\n    honeydew:             '#F0FFF0',\n    hotpink:              '#FF69B4',\n    indianred:            '#CD5C5C',\n    indigo:               '#4B0082',\n    ivory:                '#FFFFF0',\n    khaki:                '#F0E68C',\n    lavender:             '#E6E6FA',\n    lavenderblush:        '#FFF0F5',\n    lawngreen:            '#7CFC00',\n    lemonchiffon:         '#FFFACD',\n    lightblue:            '#ADD8E6',\n    lightcoral:           '#F08080',\n    lightcyan:            '#E0FFFF',\n    lightgoldenrodyellow: '#FAFAD2',\n    lightgray:            '#D3D3D3',\n    lightgrey:            '#D3D3D3',\n    lightgreen:           '#90EE90',\n    lightpink:            '#FFB6C1',\n    lightsalmon:          '#FFA07A',\n    lightseagreen:        '#20B2AA',\n    lightskyblue:         '#87CEFA',\n    lightslategray:       '#778899',\n    lightslategrey:       '#778899',\n    lightsteelblue:       '#B0C4DE',\n    lightyellow:          '#FFFFE0',\n    lime:                 '#00FF00',\n    limegreen:            '#32CD32',\n    linen:                '#FAF0E6',\n    magenta:              '#FF00FF',\n    maroon:               '#800000',\n    mediumaquamarine:     '#66CDAA',\n    mediumblue:           '#0000CD',\n    mediumorchid:         '#BA55D3',\n    mediumpurple:         '#9370DB',\n    mediumseagreen:       '#3CB371',\n    mediumslateblue:      '#7B68EE',\n    mediumspringgreen:    '#00FA9A',\n    mediumturquoise:      '#48D1CC',\n    mediumvioletred:      '#C71585',\n    midnightblue:         '#191970',\n    mintcream:            '#F5FFFA',\n    mistyrose:            '#FFE4E1',\n    moccasin:             '#FFE4B5',\n    navajowhite:          '#FFDEAD',\n    navy:                 '#000080',\n    oldlace:              '#FDF5E6',\n    olive:                '#808000',\n    olivedrab:            '#6B8E23',\n    orange:               '#FFA500',\n    orangered:            '#FF4500',\n    orchid:               '#DA70D6',\n    palegoldenrod:        '#EEE8AA',\n    palegreen:            '#98FB98',\n    paleturquoise:        '#AFEEEE',\n    palevioletred:        '#DB7093',\n    papayawhip:           '#FFEFD5',\n    peachpuff:            '#FFDAB9',\n    peru:                 '#CD853F',\n    pink:                 '#FFC0CB',\n    plum:                 '#DDA0DD',\n    powderblue:           '#B0E0E6',\n    purple:               '#800080',\n    rebeccapurple:        '#663399',\n    red:                  '#FF0000',\n    rosybrown:            '#BC8F8F',\n    royalblue:            '#4169E1',\n    saddlebrown:          '#8B4513',\n    salmon:               '#FA8072',\n    sandybrown:           '#F4A460',\n    seagreen:             '#2E8B57',\n    seashell:             '#FFF5EE',\n    sienna:               '#A0522D',\n    silver:               '#C0C0C0',\n    skyblue:              '#87CEEB',\n    slateblue:            '#6A5ACD',\n    slategray:            '#708090',\n    slategrey:            '#708090',\n    snow:                 '#FFFAFA',\n    springgreen:          '#00FF7F',\n    steelblue:            '#4682B4',\n    tan:                  '#D2B48C',\n    teal:                 '#008080',\n    thistle:              '#D8BFD8',\n    tomato:               '#FF6347',\n    turquoise:            '#40E0D0',\n    violet:               '#EE82EE',\n    wheat:                '#F5DEB3',\n    white:                '#FFFFFF',\n    whitesmoke:           '#F5F5F5',\n    yellow:               '#FFFF00',\n    yellowgreen:          '#9ACD32'\n  };\n\n  /**\n   * @private\n   * @param {Number} p\n   * @param {Number} q\n   * @param {Number} t\n   * @return {Number}\n   */\n  function hue2rgb(p, q, t) {\n    if (t < 0) {\n      t += 1;\n    }\n    if (t > 1) {\n      t -= 1;\n    }\n    if (t < 1 / 6) {\n      return p + (q - p) * 6 * t;\n    }\n    if (t < 1 / 2) {\n      return q;\n    }\n    if (t < 2 / 3) {\n      return p + (q - p) * (2 / 3 - t) * 6;\n    }\n    return p;\n  }\n\n  /**\n   * Returns new color object, when given a color in RGB format\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromRgb = function(color) {\n    return Color.fromSource(Color.sourceFromRgb(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n   * @return {Array} source\n   */\n  fabric.Color.sourceFromRgb = function(color) {\n    var match = color.match(Color.reRGBa);\n    if (match) {\n      var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n          g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n          b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n      return [\n        parseInt(r, 10),\n        parseInt(g, 10),\n        parseInt(b, 10),\n        match[4] ? parseFloat(match[4]) : 1\n      ];\n    }\n  };\n\n  /**\n   * Returns new color object, when given a color in RGBA format\n   * @static\n   * @function\n   * @memberOf fabric.Color\n   * @param {String} color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromRgba = Color.fromRgb;\n\n  /**\n   * Returns new color object, when given a color in HSL format\n   * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n   * @memberOf fabric.Color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHsl = function(color) {\n    return Color.fromSource(Color.sourceFromHsl(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n   * Adapted from <a href=\"https://rawgithub.com/mjijackson/mjijackson.github.com/master/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript.html\">https://github.com/mjijackson</a>\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n   * @return {Array} source\n   * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n   */\n  fabric.Color.sourceFromHsl = function(color) {\n    var match = color.match(Color.reHSLa);\n    if (!match) {\n      return;\n    }\n\n    var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n        s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n        l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n        r, g, b;\n\n    if (s === 0) {\n      r = g = b = l;\n    }\n    else {\n      var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n          p = l * 2 - q;\n\n      r = hue2rgb(p, q, h + 1 / 3);\n      g = hue2rgb(p, q, h);\n      b = hue2rgb(p, q, h - 1 / 3);\n    }\n\n    return [\n      Math.round(r * 255),\n      Math.round(g * 255),\n      Math.round(b * 255),\n      match[4] ? parseFloat(match[4]) : 1\n    ];\n  };\n\n  /**\n   * Returns new color object, when given a color in HSLA format\n   * @static\n   * @function\n   * @memberOf fabric.Color\n   * @param {String} color\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHsla = Color.fromHsl;\n\n  /**\n   * Returns new color object, when given a color in HEX format\n   * @static\n   * @memberOf fabric.Color\n   * @param {String} color Color value ex: FF5555\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromHex = function(color) {\n    return Color.fromSource(Color.sourceFromHex(color));\n  };\n\n  /**\n   * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n   * @static\n   * @memberOf fabric.Color\n   * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n   * @return {Array} source\n   */\n  fabric.Color.sourceFromHex = function(color) {\n    if (color.match(Color.reHex)) {\n      var value = color.slice(color.indexOf('#') + 1),\n          isShortNotation = (value.length === 3 || value.length === 4),\n          isRGBa = (value.length === 8 || value.length === 4),\n          r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n          g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n          b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n          a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n      return [\n        parseInt(r, 16),\n        parseInt(g, 16),\n        parseInt(b, 16),\n        parseFloat((parseInt(a, 16) / 255).toFixed(2))\n      ];\n    }\n  };\n\n  /**\n   * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n   * @static\n   * @memberOf fabric.Color\n   * @param {Array} source\n   * @return {fabric.Color}\n   */\n  fabric.Color.fromSource = function(source) {\n    var oColor = new Color();\n    oColor.setSource(source);\n    return oColor;\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'],\n      skewMap = ['ns', 'nesw', 'ew', 'nwse'],\n      controls = {},\n      LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center',\n      opposite = {\n        top: BOTTOM,\n        bottom: TOP,\n        left: RIGHT,\n        right: LEFT,\n        center: CENTER,\n      }, radiansToDegrees = fabric.util.radiansToDegrees,\n      sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; });\n\n  /**\n   * Combine control position and object angle to find the control direction compared\n   * to the object center.\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   * @param {fabric.Control} control the control class\n   * @return {Number} 0 - 7 a quadrant number\n   */\n  function findCornerQuadrant(fabricObject, control) {\n    var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360;\n    return Math.round((cornerAngle % 360) / 45);\n  }\n\n  function fireEvent(eventName, options) {\n    var target = options.transform.target,\n        canvas = target.canvas,\n        canvasOptions = fabric.util.object.clone(options);\n    canvasOptions.target = target;\n    canvas && canvas.fire('object:' + eventName, canvasOptions);\n    target.fire(eventName, options);\n  }\n\n  /**\n   * Inspect event and fabricObject properties to understand if the scaling action\n   * @param {Event} eventData from the user action\n   * @param {fabric.Object} fabricObject the fabric object about to scale\n   * @return {Boolean} true if scale is proportional\n   */\n  function scaleIsProportional(eventData, fabricObject) {\n    var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey,\n        uniformIsToggled = eventData[uniScaleKey];\n    return (canvas.uniformScaling && !uniformIsToggled) ||\n    (!canvas.uniformScaling && uniformIsToggled);\n  }\n\n  /**\n   * Checks if transform is centered\n   * @param {Object} transform transform data\n   * @return {Boolean} true if transform is centered\n   */\n  function isTransformCentered(transform) {\n    return transform.originX === CENTER && transform.originY === CENTER;\n  }\n\n  /**\n   * Inspect fabricObject to understand if the current scaling action is allowed\n   * @param {fabric.Object} fabricObject the fabric object about to scale\n   * @param {String} by 'x' or 'y' or ''\n   * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n   * @return {Boolean} true if scaling is not allowed at current conditions\n   */\n  function scalingIsForbidden(fabricObject, by, scaleProportionally) {\n    var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY;\n    if (lockX && lockY) {\n      return true;\n    }\n    if (!by && (lockX || lockY) && scaleProportionally) {\n      return true;\n    }\n    if (lockX && by === 'x') {\n      return true;\n    }\n    if (lockY && by === 'y') {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * return the correct cursor style for the scale action\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function scaleCursorStyleHandler(eventData, control, fabricObject) {\n    var notAllowed = 'not-allowed',\n        scaleProportionally = scaleIsProportional(eventData, fabricObject),\n        by = '';\n    if (control.x !== 0 && control.y === 0) {\n      by = 'x';\n    }\n    else if (control.x === 0 && control.y !== 0) {\n      by = 'y';\n    }\n    if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n      return notAllowed;\n    }\n    var n = findCornerQuadrant(fabricObject, control);\n    return scaleMap[n] + '-resize';\n  }\n\n  /**\n   * return the correct cursor style for the skew action\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function skewCursorStyleHandler(eventData, control, fabricObject) {\n    var notAllowed = 'not-allowed';\n    if (control.x !== 0 && fabricObject.lockSkewingY) {\n      return notAllowed;\n    }\n    if (control.y !== 0 && fabricObject.lockSkewingX) {\n      return notAllowed;\n    }\n    var n = findCornerQuadrant(fabricObject, control) % 4;\n    return skewMap[n] + '-resize';\n  }\n\n  /**\n   * Combine skew and scale style handlers to cover fabric standard use case\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function scaleSkewCursorStyleHandler(eventData, control, fabricObject) {\n    if (eventData[fabricObject.canvas.altActionKey]) {\n      return controls.skewCursorStyleHandler(eventData, control, fabricObject);\n    }\n    return controls.scaleCursorStyleHandler(eventData, control, fabricObject);\n  }\n\n  /**\n   * Inspect event, control and fabricObject to return the correct action name\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} an action name\n   */\n  function scaleOrSkewActionName(eventData, control, fabricObject) {\n    var isAlternative = eventData[fabricObject.canvas.altActionKey];\n    if (control.x === 0) {\n      // then is scaleY or skewX\n      return isAlternative ? 'skewX' : 'scaleY';\n    }\n    if (control.y === 0) {\n      // then is scaleY or skewX\n      return isAlternative ? 'skewY' : 'scaleX';\n    }\n  }\n\n  /**\n   * Find the correct style for the control that is used for rotation.\n   * this function is very simple and it just take care of not-allowed or standard cursor\n   * @param {Event} eventData the javascript event that is causing the scale\n   * @param {fabric.Control} control the control that is interested in the action\n   * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n   * @return {String} a valid css string for the cursor\n   */\n  function rotationStyleHandler(eventData, control, fabricObject) {\n    if (fabricObject.lockRotation) {\n      return 'not-allowed';\n    }\n    return control.cursorStyle;\n  }\n\n  function commonEventInfo(eventData, transform, x, y) {\n    return {\n      e: eventData,\n      transform: transform,\n      pointer: {\n        x: x,\n        y: y,\n      }\n    };\n  }\n\n  /**\n   * Wrap an action handler with saving/restoring object position on the transform.\n   * this is the code that permits to objects to keep their position while transforming.\n   * @param {Function} actionHandler the function to wrap\n   * @return {Function} a function with an action handler signature\n   */\n  function wrapWithFixedAnchor(actionHandler) {\n    return function(eventData, transform, x, y) {\n      var target = transform.target, centerPoint = target.getCenterPoint(),\n          constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY),\n          actionPerformed = actionHandler(eventData, transform, x, y);\n      target.setPositionByOrigin(constraint, transform.originX, transform.originY);\n      return actionPerformed;\n    };\n  }\n\n  /**\n   * Wrap an action handler with firing an event if the action is performed\n   * @param {Function} actionHandler the function to wrap\n   * @return {Function} a function with an action handler signature\n   */\n  function wrapWithFireEvent(eventName, actionHandler) {\n    return function(eventData, transform, x, y) {\n      var actionPerformed = actionHandler(eventData, transform, x, y);\n      if (actionPerformed) {\n        fireEvent(eventName, commonEventInfo(eventData, transform, x, y));\n      }\n      return actionPerformed;\n    };\n  }\n\n  /**\n   * Transforms a point described by x and y in a distance from the top left corner of the object\n   * bounding box.\n   * @param {Object} transform\n   * @param {String} originX\n   * @param {String} originY\n   * @param {number} x\n   * @param {number} y\n   * @return {Fabric.Point} the normalized point\n   */\n  function getLocalPoint(transform, originX, originY, x, y) {\n    var target = transform.target,\n        control = target.controls[transform.corner],\n        zoom = target.canvas.getZoom(),\n        padding = target.padding / zoom,\n        localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY);\n    if (localPoint.x >= padding) {\n      localPoint.x -= padding;\n    }\n    if (localPoint.x <= -padding) {\n      localPoint.x += padding;\n    }\n    if (localPoint.y >= padding) {\n      localPoint.y -= padding;\n    }\n    if (localPoint.y <= padding) {\n      localPoint.y += padding;\n    }\n    localPoint.x -= control.offsetX;\n    localPoint.y -= control.offsetY;\n    return localPoint;\n  }\n\n  /**\n   * Detect if the fabric object is flipped on one side.\n   * @param {fabric.Object} target\n   * @return {Boolean} true if one flip, but not two.\n   */\n  function targetHasOneFlip(target) {\n    return target.flipX !== target.flipY;\n  }\n\n  /**\n   * Utility function to compensate the scale factor when skew is applied on both axes\n   * @private\n   */\n  function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) {\n    if (target[oppositeSkew] !== 0) {\n      var newDim = target._getTransformedDimensions()[axis];\n      var newValue = reference / newDim * target[scaleToCompensate];\n      target.set(scaleToCompensate, newValue);\n    }\n  }\n\n  /**\n   * Action handler for skewing on the X axis\n   * @private\n   */\n  function skewObjectX(eventData, transform, x, y) {\n    var target = transform.target,\n        // find how big the object would be, if there was no skewX. takes in account scaling\n        dimNoSkew = target._getTransformedDimensions(0, target.skewY),\n        localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        // the mouse is in the center of the object, and we want it to stay there.\n        // so the object will grow twice as much as the mouse.\n        // this makes the skew growth to localPoint * 2 - dimNoSkew.\n        totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x,\n        currentSkew = target.skewX, newSkew;\n    if (totalSkewSize < 2) {\n      // let's make it easy to go back to position 0.\n      newSkew = 0;\n    }\n    else {\n      newSkew = radiansToDegrees(\n        Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY))\n      );\n      // now we have to find the sign of the skew.\n      // it mostly depend on the origin of transformation.\n      if (transform.originX === LEFT && transform.originY === BOTTOM) {\n        newSkew = -newSkew;\n      }\n      if (transform.originX === RIGHT && transform.originY === TOP) {\n        newSkew = -newSkew;\n      }\n      if (targetHasOneFlip(target)) {\n        newSkew = -newSkew;\n      }\n    }\n    var hasSkewed = currentSkew !== newSkew;\n    if (hasSkewed) {\n      var dimBeforeSkewing = target._getTransformedDimensions().y;\n      target.set('skewX', newSkew);\n      compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing);\n    }\n    return hasSkewed;\n  }\n\n  /**\n   * Action handler for skewing on the Y axis\n   * @private\n   */\n  function skewObjectY(eventData, transform, x, y) {\n    var target = transform.target,\n        // find how big the object would be, if there was no skewX. takes in account scaling\n        dimNoSkew = target._getTransformedDimensions(target.skewX, 0),\n        localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        // the mouse is in the center of the object, and we want it to stay there.\n        // so the object will grow twice as much as the mouse.\n        // this makes the skew growth to localPoint * 2 - dimNoSkew.\n        totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y,\n        currentSkew = target.skewY, newSkew;\n    if (totalSkewSize < 2) {\n      // let's make it easy to go back to position 0.\n      newSkew = 0;\n    }\n    else {\n      newSkew = radiansToDegrees(\n        Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX))\n      );\n      // now we have to find the sign of the skew.\n      // it mostly depend on the origin of transformation.\n      if (transform.originX === LEFT && transform.originY === BOTTOM) {\n        newSkew = -newSkew;\n      }\n      if (transform.originX === RIGHT && transform.originY === TOP) {\n        newSkew = -newSkew;\n      }\n      if (targetHasOneFlip(target)) {\n        newSkew = -newSkew;\n      }\n    }\n    var hasSkewed = currentSkew !== newSkew;\n    if (hasSkewed) {\n      var dimBeforeSkewing = target._getTransformedDimensions().x;\n      target.set('skewY', newSkew);\n      compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing);\n    }\n    return hasSkewed;\n  }\n\n  /**\n   * Wrapped Action handler for skewing on the Y axis, takes care of the\n   * skew direction and determine the correct transform origin for the anchor point\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function skewHandlerX(eventData, transform, x, y) {\n    // step1 figure out and change transform origin.\n    // if skewX > 0 and originY bottom we anchor on right\n    // if skewX > 0 and originY top we anchor on left\n    // if skewX < 0 and originY bottom we anchor on left\n    // if skewX < 0 and originY top we anchor on right\n    // if skewX is 0, we look for mouse position to understand where are we going.\n    var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY;\n    if (target.lockSkewingX) {\n      return false;\n    }\n    if (currentSkew === 0) {\n      var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n      if (localPointFromCenter.x > 0) {\n        // we are pulling right, anchor left;\n        originX = LEFT;\n      }\n      else {\n        // we are pulling right, anchor right\n        originX = RIGHT;\n      }\n    }\n    else {\n      if (currentSkew > 0) {\n        originX = originY === TOP ? LEFT : RIGHT;\n      }\n      if (currentSkew < 0) {\n        originX = originY === TOP ? RIGHT : LEFT;\n      }\n      // is the object flipped on one side only? swap the origin.\n      if (targetHasOneFlip(target)) {\n        originX = originX === LEFT ? RIGHT : LEFT;\n      }\n    }\n\n    // once we have the origin, we find the anchor point\n    transform.originX = originX;\n    var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX));\n    return finalHandler(eventData, transform, x, y);\n  }\n\n  /**\n   * Wrapped Action handler for skewing on the Y axis, takes care of the\n   * skew direction and determine the correct transform origin for the anchor point\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function skewHandlerY(eventData, transform, x, y) {\n    // step1 figure out and change transform origin.\n    // if skewY > 0 and originX left we anchor on top\n    // if skewY > 0 and originX right we anchor on bottom\n    // if skewY < 0 and originX left we anchor on bottom\n    // if skewY < 0 and originX right we anchor on top\n    // if skewY is 0, we look for mouse position to understand where are we going.\n    var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX;\n    if (target.lockSkewingY) {\n      return false;\n    }\n    if (currentSkew === 0) {\n      var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n      if (localPointFromCenter.y > 0) {\n        // we are pulling down, anchor up;\n        originY = TOP;\n      }\n      else {\n        // we are pulling up, anchor down\n        originY = BOTTOM;\n      }\n    }\n    else {\n      if (currentSkew > 0) {\n        originY = originX === LEFT ? TOP : BOTTOM;\n      }\n      if (currentSkew < 0) {\n        originY = originX === LEFT ? BOTTOM : TOP;\n      }\n      // is the object flipped on one side only? swap the origin.\n      if (targetHasOneFlip(target)) {\n        originY = originY === TOP ? BOTTOM : TOP;\n      }\n    }\n\n    // once we have the origin, we find the anchor point\n    transform.originY = originY;\n    var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY));\n    return finalHandler(eventData, transform, x, y);\n  }\n\n  /**\n   * Action handler for rotation and snapping, without anchor point.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   * @private\n   */\n  function rotationWithSnapping(eventData, transform, x, y) {\n    var t = transform,\n        target = t.target,\n        pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n    if (target.lockRotation) {\n      return false;\n    }\n\n    var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x),\n        curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x),\n        angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n        hasRotated = true;\n\n    if (target.snapAngle > 0) {\n      var snapAngle  = target.snapAngle,\n          snapThreshold  = target.snapThreshold || snapAngle,\n          rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n          leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n      if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n        angle = leftAngleLocked;\n      }\n      else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n        angle = rightAngleLocked;\n      }\n    }\n\n    // normalize angle to positive value\n    if (angle < 0) {\n      angle = 360 + angle;\n    }\n    angle %= 360;\n\n    hasRotated = target.angle !== angle;\n    target.angle = angle;\n    return hasRotated;\n  }\n\n  /**\n   * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @param {Object} options additional information for scaling\n   * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n   * @return {Boolean} true if some change happened\n   * @private\n   */\n  function scaleObject(eventData, transform, x, y, options) {\n    options = options || {};\n    var target = transform.target,\n        lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY,\n        by = options.by, newPoint, scaleX, scaleY, dim,\n        scaleProportionally = scaleIsProportional(eventData, target),\n        forbidScaling = scalingIsForbidden(target, by, scaleProportionally),\n        signX, signY, gestureScale = transform.gestureScale;\n\n    if (forbidScaling) {\n      return false;\n    }\n    if (gestureScale) {\n      scaleX = transform.scaleX * gestureScale;\n      scaleY = transform.scaleY * gestureScale;\n    }\n    else {\n      newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y);\n      // use of sign: We use sign to detect change of direction of an action. sign usually change when\n      // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n      // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n      // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n      // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n      signX = by !== 'y' ? sign(newPoint.x) : 1;\n      signY = by !== 'x' ? sign(newPoint.y) : 1;\n      if (!transform.signX) {\n        transform.signX = signX;\n      }\n      if (!transform.signY) {\n        transform.signY = signY;\n      }\n\n      if (target.lockScalingFlip &&\n        (transform.signX !== signX || transform.signY !== signY)\n      ) {\n        return false;\n      }\n\n      dim = target._getTransformedDimensions();\n      // missing detection of flip and logic to switch the origin\n      if (scaleProportionally && !by) {\n        // uniform scaling\n        var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n            original = transform.original,\n            originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) +\n              Math.abs(dim.y * original.scaleY / target.scaleY),\n            scale = distance / originalDistance;\n        scaleX = original.scaleX * scale;\n        scaleY = original.scaleY * scale;\n      }\n      else {\n        scaleX = Math.abs(newPoint.x * target.scaleX / dim.x);\n        scaleY = Math.abs(newPoint.y * target.scaleY / dim.y);\n      }\n      // if we are scaling by center, we need to double the scale\n      if (isTransformCentered(transform)) {\n        scaleX *= 2;\n        scaleY *= 2;\n      }\n      if (transform.signX !== signX && by !== 'y') {\n        transform.originX = opposite[transform.originX];\n        scaleX *= -1;\n        transform.signX = signX;\n      }\n      if (transform.signY !== signY && by !== 'x') {\n        transform.originY = opposite[transform.originY];\n        scaleY *= -1;\n        transform.signY = signY;\n      }\n    }\n    // minScale is taken are in the setter.\n    var oldScaleX = target.scaleX, oldScaleY = target.scaleY;\n    if (!by) {\n      !lockScalingX && target.set('scaleX', scaleX);\n      !lockScalingY && target.set('scaleY', scaleY);\n    }\n    else {\n      // forbidden cases already handled on top here.\n      by === 'x' && target.set('scaleX', scaleX);\n      by === 'y' && target.set('scaleY', scaleY);\n    }\n    return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n  }\n\n  /**\n   * Generic scaling logic, to scale from corners either equally or freely.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectFromCorner(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y);\n  }\n\n  /**\n   * Scaling logic for the X axis.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectX(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y , { by: 'x' });\n  }\n\n  /**\n   * Scaling logic for the Y axis.\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scaleObjectY(eventData, transform, x, y) {\n    return scaleObject(eventData, transform, x, y , { by: 'y' });\n  }\n\n  /**\n   * Composed action handler to either scale Y or skew X\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scalingYOrSkewingX(eventData, transform, x, y) {\n    // ok some safety needed here.\n    if (eventData[transform.target.canvas.altActionKey]) {\n      return controls.skewHandlerX(eventData, transform, x, y);\n    }\n    return controls.scalingY(eventData, transform, x, y);\n  }\n\n  /**\n   * Composed action handler to either scale X or skew Y\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function scalingXOrSkewingY(eventData, transform, x, y) {\n    // ok some safety needed here.\n    if (eventData[transform.target.canvas.altActionKey]) {\n      return controls.skewHandlerY(eventData, transform, x, y);\n    }\n    return controls.scalingX(eventData, transform, x, y);\n  }\n\n  /**\n   * Action handler to change textbox width\n   * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if some change happened\n   */\n  function changeWidth(eventData, transform, x, y) {\n    var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n        strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n        multiplier = isTransformCentered(transform) ? 2 : 1,\n        oldWidth = target.width,\n        newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding;\n    target.set('width', Math.max(newWidth, 0));\n    return oldWidth !== newWidth;\n  }\n\n  /**\n   * Action handler\n   * @private\n   * @param {Event} eventData javascript event that is doing the transform\n   * @param {Object} transform javascript object containing a series of information around the current transform\n   * @param {number} x current mouse x position, canvas normalized\n   * @param {number} y current mouse y position, canvas normalized\n   * @return {Boolean} true if the translation occurred\n   */\n  function dragHandler(eventData, transform, x, y) {\n    var target = transform.target,\n        newLeft = x - transform.offsetX,\n        newTop = y - transform.offsetY,\n        moveX = !target.get('lockMovementX') && target.left !== newLeft,\n        moveY = !target.get('lockMovementY') && target.top !== newTop;\n    moveX && target.set('left', newLeft);\n    moveY && target.set('top', newTop);\n    if (moveX || moveY) {\n      fireEvent('moving', commonEventInfo(eventData, transform, x, y));\n    }\n    return moveX || moveY;\n  }\n\n  controls.scaleCursorStyleHandler = scaleCursorStyleHandler;\n  controls.skewCursorStyleHandler = skewCursorStyleHandler;\n  controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler;\n  controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping));\n  controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner));\n  controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX));\n  controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY));\n  controls.scalingYOrSkewingX = scalingYOrSkewingX;\n  controls.scalingXOrSkewingY = scalingXOrSkewingY;\n  controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth));\n  controls.skewHandlerX = skewHandlerX;\n  controls.skewHandlerY = skewHandlerY;\n  controls.dragHandler = dragHandler;\n  controls.scaleOrSkewActionName = scaleOrSkewActionName;\n  controls.rotationStyleHandler = rotationStyleHandler;\n  controls.fireEvent = fireEvent;\n  controls.wrapWithFixedAnchor = wrapWithFixedAnchor;\n  controls.wrapWithFireEvent = wrapWithFireEvent;\n  controls.getLocalPoint = getLocalPoint;\n  fabric.controlsUtils = controls;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      degreesToRadians = fabric.util.degreesToRadians,\n      controls = fabric.controlsUtils;\n\n  /**\n   * Render a round control, as per fabric features.\n   * This function is written to respect object properties like transparentCorners, cornerSize\n   * cornerColor, cornerStrokeColor\n   * plus the addition of offsetY and offsetX.\n   * @param {CanvasRenderingContext2D} ctx context to render on\n   * @param {Number} left x coordinate where the control center should be\n   * @param {Number} top y coordinate where the control center should be\n   * @param {Object} styleOverride override for fabric.Object controls style\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   */\n  function renderCircleControl (ctx, left, top, styleOverride, fabricObject) {\n    styleOverride = styleOverride || {};\n    var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n        ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n        transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n          styleOverride.transparentCorners : fabricObject.transparentCorners,\n        methodName = transparentCorners ? 'stroke' : 'fill',\n        stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n        myLeft = left,\n        myTop = top, size;\n    ctx.save();\n    ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n    ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n    // as soon as fabric react v5, remove ie11, use proper ellipse code.\n    if (xSize > ySize) {\n      size = xSize;\n      ctx.scale(1.0, ySize / xSize);\n      myTop = top * xSize / ySize;\n    }\n    else if (ySize > xSize) {\n      size = ySize;\n      ctx.scale(xSize / ySize, 1.0);\n      myLeft = left * ySize / xSize;\n    }\n    else {\n      size = xSize;\n    }\n    // this is still wrong\n    ctx.lineWidth = 1;\n    ctx.beginPath();\n    ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false);\n    ctx[methodName]();\n    if (stroke) {\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  /**\n   * Render a square control, as per fabric features.\n   * This function is written to respect object properties like transparentCorners, cornerSize\n   * cornerColor, cornerStrokeColor\n   * plus the addition of offsetY and offsetX.\n   * @param {CanvasRenderingContext2D} ctx context to render on\n   * @param {Number} left x coordinate where the control center should be\n   * @param {Number} top y coordinate where the control center should be\n   * @param {Object} styleOverride override for fabric.Object controls style\n   * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n   */\n  function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {\n    styleOverride = styleOverride || {};\n    var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n        ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n        transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n          styleOverride.transparentCorners : fabricObject.transparentCorners,\n        methodName = transparentCorners ? 'stroke' : 'fill',\n        stroke = !transparentCorners && (\n          styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor\n        ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2;\n    ctx.save();\n    ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n    ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n    // this is still wrong\n    ctx.lineWidth = 1;\n    ctx.translate(left, top);\n    ctx.rotate(degreesToRadians(fabricObject.angle));\n    // this does not work, and fixed with ( && ) does not make sense.\n    // to have real transparent corners we need the controls on upperCanvas\n    // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n    ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize);\n    if (stroke) {\n      ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n    }\n    ctx.restore();\n  }\n\n  controls.renderCircleControl = renderCircleControl;\n  controls.renderSquareControl = renderSquareControl;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  function Control(options) {\n    for (var i in options) {\n      this[i] = options[i];\n    }\n  }\n\n  fabric.Control = Control;\n\n  fabric.Control.prototype = /** @lends fabric.Control.prototype */ {\n\n    /**\n     * keep track of control visibility.\n     * mainly for backward compatibility.\n     * if you do not want to see a control, you can remove it\n     * from the controlset.\n     * @type {Boolean}\n     * @default true\n     */\n    visible: true,\n\n    /**\n     * Name of the action that the control will likely execute.\n     * This is optional. FabricJS uses to identify what the user is doing for some\n     * extra optimizations. If you are writing a custom control and you want to know\n     * somewhere else in the code what is going on, you can use this string here.\n     * you can also provide a custom getActionName if your control run multiple actions\n     * depending on some external state.\n     * default to scale since is the most common, used on 4 corners by default\n     * @type {String}\n     * @default 'scale'\n     */\n    actionName: 'scale',\n\n    /**\n     * Drawing angle of the control.\n     * NOT used for now, but name marked as needed for internal logic\n     * example: to reuse the same drawing function for different rotated controls\n     * @type {Number}\n     * @default 0\n     */\n    angle: 0,\n\n    /**\n     * Relative position of the control. X\n     * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    x: 0,\n\n    /**\n     * Relative position of the control. Y\n     * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    y: 0,\n\n    /**\n     * Horizontal offset of the control from the defined position. In pixels\n     * Positive offset moves the control to the right, negative to the left.\n     * It used when you want to have position of control that does not scale with\n     * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n     * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will\n     * stay 30 pixels no matter how the object is big. Another example is having 2\n     * controls in the corner, that stay in the same position when the object scale.\n     * of the bounding box.\n     * @type {Number}\n     * @default 0\n     */\n    offsetX: 0,\n\n    /**\n     * Vertical offset of the control from the defined position. In pixels\n     * Positive offset moves the control to the bottom, negative to the top.\n     * @type {Number}\n     * @default 0\n     */\n    offsetY: 0,\n\n    /**\n     * Sets the length of the control. If null, defaults to object's cornerSize.\n     * Expects both sizeX and sizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    sizeX: null,\n\n    /**\n     * Sets the height of the control. If null, defaults to object's cornerSize.\n     * Expects both sizeX and sizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    sizeY: null,\n\n    /**\n     * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n     * Expects both touchSizeX and touchSizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    touchSizeX: null,\n\n    /**\n     * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n     * Expects both touchSizeX and touchSizeY to be set when set.\n     * @type {?Number}\n     * @default null\n     */\n    touchSizeY: null,\n\n    /**\n     * Css cursor style to display when the control is hovered.\n     * if the method `cursorStyleHandler` is provided, this property is ignored.\n     * @type {String}\n     * @default 'crosshair'\n     */\n    cursorStyle: 'crosshair',\n\n    /**\n     * If controls has an offsetY or offsetX, draw a line that connects\n     * the control to the bounding box\n     * @type {Boolean}\n     * @default false\n     */\n    withConnection: false,\n\n    /**\n     * The control actionHandler, provide one to handle action ( control being moved )\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    actionHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * The control handler for mouse down, provide one to handle mouse down on control\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    mouseDownHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * The control mouseUpHandler, provide one to handle an effect on mouse up.\n     * @param {Event} eventData the native mouse event\n     * @param {Object} transformData properties of the current transform\n     * @param {Number} x x position of the cursor\n     * @param {Number} y y position of the cursor\n     * @return {Boolean} true if the action/event modified the object\n     */\n    mouseUpHandler: function(/* eventData, transformData, x, y */) { },\n\n    /**\n     * Returns control actionHandler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getActionHandler: function(/* eventData, fabricObject, control */) {\n      return this.actionHandler;\n    },\n\n    /**\n     * Returns control mouseDown handler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getMouseDownHandler: function(/* eventData, fabricObject, control */) {\n      return this.mouseDownHandler;\n    },\n\n    /**\n     * Returns control mouseUp handler\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Object} fabricObject on which the control is displayed\n     * @param {fabric.Control} control control for which the action handler is being asked\n     * @return {Function} the action handler\n     */\n    getMouseUpHandler: function(/* eventData, fabricObject, control */) {\n      return this.mouseUpHandler;\n    },\n\n    /**\n     * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n     * function you can pass one in the constructor\n     * the cursorStyle property\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Control} control the current control ( likely this)\n     * @param {fabric.Object} object on which the control is displayed\n     * @return {String}\n     */\n    cursorStyleHandler: function(eventData, control /* fabricObject */) {\n      return control.cursorStyle;\n    },\n\n    /**\n     * Returns the action name. The basic implementation just return the actionName property.\n     * @param {Event} eventData the native mouse event\n     * @param {fabric.Control} control the current control ( likely this)\n     * @param {fabric.Object} object on which the control is displayed\n     * @return {String}\n     */\n    getActionName: function(eventData, control /* fabricObject */) {\n      return control.actionName;\n    },\n\n    /**\n     * Returns controls visibility\n     * @param {fabric.Object} object on which the control is displayed\n     * @param {String} controlKey key where the control is memorized on the\n     * @return {Boolean}\n     */\n    getVisibility: function(fabricObject, controlKey) {\n      var objectVisibility = fabricObject._controlsVisibility;\n      if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') {\n        return objectVisibility[controlKey];\n      }\n      return this.visible;\n    },\n\n    /**\n     * Sets controls visibility\n     * @param {Boolean} visibility for the object\n     * @return {Void}\n     */\n    setVisibility: function(visibility /* name, fabricObject */) {\n      this.visible = visibility;\n    },\n\n\n    positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) {\n      var point = fabric.util.transformPoint({\n        x: this.x * dim.x + this.offsetX,\n        y: this.y * dim.y + this.offsetY }, finalMatrix);\n      return point;\n    },\n\n    /**\n     * Returns the coords for this control based on object values.\n     * @param {Number} objectAngle angle from the fabric object holding the control\n     * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n     *   isTouch is true)\n     * @param {Number} centerX x coordinate where the control center should be\n     * @param {Number} centerY y coordinate where the control center should be\n     * @param {boolean} isTouch true if touch corner, false if normal corner\n     */\n    calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) {\n      var cosHalfOffset,\n          sinHalfOffset,\n          cosHalfOffsetComp,\n          sinHalfOffsetComp,\n          xSize = (isTouch) ? this.touchSizeX : this.sizeX,\n          ySize = (isTouch) ? this.touchSizeY : this.sizeY;\n      if (xSize && ySize && xSize !== ySize) {\n        // handle rectangular corners\n        var controlTriangleAngle = Math.atan2(ySize, xSize);\n        var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;\n        var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n        var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n        cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta);\n        sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta);\n        // use complementary angle for two corners\n        cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp);\n        sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp);\n      }\n      else {\n        // handle square corners\n        // use default object corner size unless size is defined\n        var cornerSize = (xSize && ySize) ? xSize : objectCornerSize;\n        /* 0.7071067812 stands for sqrt(2)/2 */\n        cornerHypotenuse = cornerSize * 0.7071067812;\n        // complementary angles are equal since they're both 45 degrees\n        var newTheta = fabric.util.degreesToRadians(45 - objectAngle);\n        cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta);\n        sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta);\n      }\n\n      return {\n        tl: {\n          x: centerX - sinHalfOffsetComp,\n          y: centerY - cosHalfOffsetComp,\n        },\n        tr: {\n          x: centerX + cosHalfOffset,\n          y: centerY - sinHalfOffset,\n        },\n        bl: {\n          x: centerX - cosHalfOffset,\n          y: centerY + sinHalfOffset,\n        },\n        br: {\n          x: centerX + sinHalfOffsetComp,\n          y: centerY + cosHalfOffsetComp,\n        },\n      };\n    },\n\n    /**\n    * Render function for the control.\n    * When this function runs the context is unscaled. unrotate. Just retina scaled.\n    * all the functions will have to translate to the point left,top before starting Drawing\n    * if they want to draw a control where the position is detected.\n    * left and top are the result of the positionHandler function\n    * @param {RenderingContext2D} ctx the context where the control will be drawn\n    * @param {Number} left position of the canvas where we are about to render the control.\n    * @param {Number} top position of the canvas where we are about to render the control.\n    * @param {Object} styleOverride\n    * @param {fabric.Object} fabricObject the object where the control is about to be rendered\n    */\n    render: function(ctx, left, top, styleOverride, fabricObject) {\n      styleOverride = styleOverride || {};\n      switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n        case 'circle':\n          fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject);\n          break;\n        default:\n          fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject);\n      }\n    },\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  /* _FROM_SVG_START_ */\n  function getColorStop(el, multiplier) {\n    var style = el.getAttribute('style'),\n        offset = el.getAttribute('offset') || 0,\n        color, colorAlpha, opacity, i;\n\n    // convert percents to absolute values\n    offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n    offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n    if (style) {\n      var keyValuePairs = style.split(/\\s*;\\s*/);\n\n      if (keyValuePairs[keyValuePairs.length - 1] === '') {\n        keyValuePairs.pop();\n      }\n\n      for (i = keyValuePairs.length; i--; ) {\n\n        var split = keyValuePairs[i].split(/\\s*:\\s*/),\n            key = split[0].trim(),\n            value = split[1].trim();\n\n        if (key === 'stop-color') {\n          color = value;\n        }\n        else if (key === 'stop-opacity') {\n          opacity = value;\n        }\n      }\n    }\n\n    if (!color) {\n      color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n    }\n    if (!opacity) {\n      opacity = el.getAttribute('stop-opacity');\n    }\n\n    color = new fabric.Color(color);\n    colorAlpha = color.getAlpha();\n    opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n    opacity *= colorAlpha * multiplier;\n\n    return {\n      offset: offset,\n      color: color.toRgb(),\n      opacity: opacity\n    };\n  }\n\n  function getLinearCoords(el) {\n    return {\n      x1: el.getAttribute('x1') || 0,\n      y1: el.getAttribute('y1') || 0,\n      x2: el.getAttribute('x2') || '100%',\n      y2: el.getAttribute('y2') || 0\n    };\n  }\n\n  function getRadialCoords(el) {\n    return {\n      x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n      y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n      r1: 0,\n      x2: el.getAttribute('cx') || '50%',\n      y2: el.getAttribute('cy') || '50%',\n      r2: el.getAttribute('r') || '50%'\n    };\n  }\n  /* _FROM_SVG_END_ */\n\n  var clone = fabric.util.object.clone;\n\n  /**\n   * Gradient class\n   * @class fabric.Gradient\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n   * @see {@link fabric.Gradient#initialize} for constructor definition\n   */\n  fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n    /**\n     * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n     * @type Number\n     * @default 0\n     */\n    offsetX: 0,\n\n    /**\n     * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n     * @type Number\n     * @default 0\n     */\n    offsetY: 0,\n\n    /**\n     * A transform matrix to apply to the gradient before painting.\n     * Imported from svg gradients, is not applied with the current transform in the center.\n     * Before this transform is applied, the origin point is at the top left corner of the object\n     * plus the addition of offsetY and offsetX.\n     * @type Number[]\n     * @default null\n     */\n    gradientTransform: null,\n\n    /**\n     * coordinates units for coords.\n     * If `pixels`, the number of coords are in the same unit of width / height.\n     * If set as `percentage` the coords are still a number, but 1 means 100% of width\n     * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n     * allowed values pixels or percentage.\n     * @type String\n     * @default 'pixels'\n     */\n    gradientUnits: 'pixels',\n\n    /**\n     * Gradient type linear or radial\n     * @type String\n     * @default 'pixels'\n     */\n    type: 'linear',\n\n    /**\n     * Constructor\n     * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n     * @param {Object} [options.type] gradient type linear or radial\n     * @param {Object} [options.gradientUnits] gradient units\n     * @param {Object} [options.offsetX] SVG import compatibility\n     * @param {Object} [options.offsetY] SVG import compatibility\n     * @param {Object[]} options.colorStops contains the colorstops.\n     * @param {Object} options.coords contains the coords of the gradient\n     * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n     * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n     * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n     * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n     * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n     * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n     * @return {fabric.Gradient} thisArg\n     */\n    initialize: function(options) {\n      options || (options = { });\n      options.coords || (options.coords = { });\n\n      var coords, _this = this;\n\n      // sets everything, then coords and colorstops get sets again\n      Object.keys(options).forEach(function(option) {\n        _this[option] = options[option];\n      });\n\n      if (this.id) {\n        this.id += '_' + fabric.Object.__uid++;\n      }\n      else {\n        this.id = fabric.Object.__uid++;\n      }\n\n      coords = {\n        x1: options.coords.x1 || 0,\n        y1: options.coords.y1 || 0,\n        x2: options.coords.x2 || 0,\n        y2: options.coords.y2 || 0\n      };\n\n      if (this.type === 'radial') {\n        coords.r1 = options.coords.r1 || 0;\n        coords.r2 = options.coords.r2 || 0;\n      }\n\n      this.coords = coords;\n      this.colorStops = options.colorStops.slice();\n    },\n\n    /**\n     * Adds another colorStop\n     * @param {Object} colorStop Object with offset and color\n     * @return {fabric.Gradient} thisArg\n     */\n    addColorStop: function(colorStops) {\n      for (var position in colorStops) {\n        var color = new fabric.Color(colorStops[position]);\n        this.colorStops.push({\n          offset: parseFloat(position),\n          color: color.toRgb(),\n          opacity: color.getAlpha()\n        });\n      }\n      return this;\n    },\n\n    /**\n     * Returns object representation of a gradient\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object}\n     */\n    toObject: function(propertiesToInclude) {\n      var object = {\n        type: this.type,\n        coords: this.coords,\n        colorStops: this.colorStops,\n        offsetX: this.offsetX,\n        offsetY: this.offsetY,\n        gradientUnits: this.gradientUnits,\n        gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n      };\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n      return object;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of an gradient\n     * @param {Object} object Object to create a gradient for\n     * @return {String} SVG representation of an gradient (linear/radial)\n     */\n    toSVG: function(object, options) {\n      var coords = clone(this.coords, true), i, len, options = options || {},\n          markup, commonAttributes, colorStops = clone(this.colorStops, true),\n          needsSwap = coords.r1 > coords.r2,\n          transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n          offsetX = -this.offsetX, offsetY = -this.offsetY,\n          withViewport = !!options.additionalTransform,\n          gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n      // colorStops must be sorted ascending\n      colorStops.sort(function(a, b) {\n        return a.offset - b.offset;\n      });\n\n      if (gradientUnits === 'objectBoundingBox') {\n        offsetX /= object.width;\n        offsetY /= object.height;\n      }\n      else {\n        offsetX += object.width / 2;\n        offsetY += object.height / 2;\n      }\n      if (object.type === 'path' && this.gradientUnits !== 'percentage') {\n        offsetX -= object.pathOffset.x;\n        offsetY -= object.pathOffset.y;\n      }\n\n\n      transform[4] -= offsetX;\n      transform[5] -= offsetY;\n\n      commonAttributes = 'id=\"SVGID_' + this.id +\n                     '\" gradientUnits=\"' + gradientUnits + '\"';\n      commonAttributes += ' gradientTransform=\"' + (withViewport ?\n        options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n      if (this.type === 'linear') {\n        markup = [\n          '<linearGradient ',\n          commonAttributes,\n          ' x1=\"', coords.x1,\n          '\" y1=\"', coords.y1,\n          '\" x2=\"', coords.x2,\n          '\" y2=\"', coords.y2,\n          '\">\\n'\n        ];\n      }\n      else if (this.type === 'radial') {\n        // svg radial gradient has just 1 radius. the biggest.\n        markup = [\n          '<radialGradient ',\n          commonAttributes,\n          ' cx=\"', needsSwap ? coords.x1 : coords.x2,\n          '\" cy=\"', needsSwap ? coords.y1 : coords.y2,\n          '\" r=\"', needsSwap ? coords.r1 : coords.r2,\n          '\" fx=\"', needsSwap ? coords.x2 : coords.x1,\n          '\" fy=\"', needsSwap ? coords.y2 : coords.y1,\n          '\">\\n'\n        ];\n      }\n\n      if (this.type === 'radial') {\n        if (needsSwap) {\n          // svg goes from internal to external radius. if radius are inverted, swap color stops.\n          colorStops = colorStops.concat();\n          colorStops.reverse();\n          for (i = 0, len = colorStops.length; i < len; i++) {\n            colorStops[i].offset = 1 - colorStops[i].offset;\n          }\n        }\n        var minRadius = Math.min(coords.r1, coords.r2);\n        if (minRadius > 0) {\n          // i have to shift all colorStops and add new one in 0.\n          var maxRadius = Math.max(coords.r1, coords.r2),\n              percentageShift = minRadius / maxRadius;\n          for (i = 0, len = colorStops.length; i < len; i++) {\n            colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n          }\n        }\n      }\n\n      for (i = 0, len = colorStops.length; i < len; i++) {\n        var colorStop = colorStops[i];\n        markup.push(\n          '<stop ',\n          'offset=\"', (colorStop.offset * 100) + '%',\n          '\" style=\"stop-color:', colorStop.color,\n          (typeof colorStop.opacity !== 'undefined' ? ';stop-opacity: ' + colorStop.opacity : ';'),\n          '\"/>\\n'\n        );\n      }\n\n      markup.push((this.type === 'linear' ? '</linearGradient>\\n' : '</radialGradient>\\n'));\n\n      return markup.join('');\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns an instance of CanvasGradient\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @return {CanvasGradient}\n     */\n    toLive: function(ctx) {\n      var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n      if (!this.type) {\n        return;\n      }\n\n      if (this.type === 'linear') {\n        gradient = ctx.createLinearGradient(\n          coords.x1, coords.y1, coords.x2, coords.y2);\n      }\n      else if (this.type === 'radial') {\n        gradient = ctx.createRadialGradient(\n          coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n      }\n\n      for (i = 0, len = this.colorStops.length; i < len; i++) {\n        var color = this.colorStops[i].color,\n            opacity = this.colorStops[i].opacity,\n            offset = this.colorStops[i].offset;\n\n        if (typeof opacity !== 'undefined') {\n          color = new fabric.Color(color).setAlpha(opacity).toRgba();\n        }\n        gradient.addColorStop(offset, color);\n      }\n\n      return gradient;\n    }\n  });\n\n  fabric.util.object.extend(fabric.Gradient, {\n\n    /* _FROM_SVG_START_ */\n    /**\n     * Returns {@link fabric.Gradient} instance from an SVG element\n     * @static\n     * @memberOf fabric.Gradient\n     * @param {SVGGradientElement} el SVG gradient element\n     * @param {fabric.Object} instance\n     * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n     * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n     * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n     * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n     * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n     * @param {Object.number} width width part of the svg tag if viewBox is not specified\n     * @param {Object.number} height height part of the svg tag if viewBox is not specified\n     * @return {fabric.Gradient} Gradient instance\n     * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n     * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n     */\n    fromElement: function(el, instance, opacityAttr, svgOptions) {\n      /**\n       *  @example:\n       *\n       *  <linearGradient id=\"linearGrad1\">\n       *    <stop offset=\"0%\" stop-color=\"white\"/>\n       *    <stop offset=\"100%\" stop-color=\"black\"/>\n       *  </linearGradient>\n       *\n       *  OR\n       *\n       *  <linearGradient id=\"linearGrad2\">\n       *    <stop offset=\"0\" style=\"stop-color:rgb(255,255,255)\"/>\n       *    <stop offset=\"1\" style=\"stop-color:rgb(0,0,0)\"/>\n       *  </linearGradient>\n       *\n       *  OR\n       *\n       *  <radialGradient id=\"radialGrad1\">\n       *    <stop offset=\"0%\" stop-color=\"white\" stop-opacity=\"1\" />\n       *    <stop offset=\"50%\" stop-color=\"black\" stop-opacity=\"0.5\" />\n       *    <stop offset=\"100%\" stop-color=\"white\" stop-opacity=\"1\" />\n       *  </radialGradient>\n       *\n       *  OR\n       *\n       *  <radialGradient id=\"radialGrad2\">\n       *    <stop offset=\"0\" stop-color=\"rgb(255,255,255)\" />\n       *    <stop offset=\"0.5\" stop-color=\"rgb(0,0,0)\" />\n       *    <stop offset=\"1\" stop-color=\"rgb(255,255,255)\" />\n       *  </radialGradient>\n       *\n       */\n\n      var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n      multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n      if (isNaN(multiplier)) {\n        multiplier = 1;\n      }\n\n      var colorStopEls = el.getElementsByTagName('stop'),\n          type,\n          gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n            'pixels' : 'percentage',\n          gradientTransform = el.getAttribute('gradientTransform') || '',\n          colorStops = [],\n          coords, i, offsetX = 0, offsetY = 0,\n          transformMatrix;\n      if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n        type = 'linear';\n        coords = getLinearCoords(el);\n      }\n      else {\n        type = 'radial';\n        coords = getRadialCoords(el);\n      }\n\n      for (i = colorStopEls.length; i--; ) {\n        colorStops.push(getColorStop(colorStopEls[i], multiplier));\n      }\n\n      transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n      __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n      if (gradientUnits === 'pixels') {\n        offsetX = -instance.left;\n        offsetY = -instance.top;\n      }\n\n      var gradient = new fabric.Gradient({\n        id: el.getAttribute('id'),\n        type: type,\n        coords: coords,\n        colorStops: colorStops,\n        gradientUnits: gradientUnits,\n        gradientTransform: transformMatrix,\n        offsetX: offsetX,\n        offsetY: offsetY,\n      });\n\n      return gradient;\n    }\n    /* _FROM_SVG_END_ */\n  });\n\n  /**\n   * @private\n   */\n  function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n    var propValue, finalValue;\n    Object.keys(options).forEach(function(prop) {\n      propValue = options[prop];\n      if (propValue === 'Infinity') {\n        finalValue = 1;\n      }\n      else if (propValue === '-Infinity') {\n        finalValue = 0;\n      }\n      else {\n        finalValue = parseFloat(options[prop], 10);\n        if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n          finalValue *= 0.01;\n          if (gradientUnits === 'pixels') {\n            // then we need to fix those percentages here in svg parsing\n            if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n              finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n            }\n            if (prop === 'y1' || prop === 'y2') {\n              finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n            }\n          }\n        }\n      }\n      options[prop] = finalValue;\n    });\n  }\n})();\n\n\n(function() {\n\n  'use strict';\n\n  var toFixed = fabric.util.toFixed;\n\n  /**\n   * Pattern class\n   * @class fabric.Pattern\n   * @see {@link http://fabricjs.com/patterns|Pattern demo}\n   * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n   * @see {@link fabric.Pattern#initialize} for constructor definition\n   */\n\n\n  fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n    /**\n     * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n     * @type String\n     * @default\n     */\n    repeat: 'repeat',\n\n    /**\n     * Pattern horizontal offset from object's left/top corner\n     * @type Number\n     * @default\n     */\n    offsetX: 0,\n\n    /**\n     * Pattern vertical offset from object's left/top corner\n     * @type Number\n     * @default\n     */\n    offsetY: 0,\n\n    /**\n     * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n     * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n     * @type String\n     * @default\n     */\n    crossOrigin: '',\n\n    /**\n     * transform matrix to change the pattern, imported from svgs.\n     * @type Array\n     * @default\n     */\n    patternTransform: null,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @param {Function} [callback] function to invoke after callback init.\n     * @return {fabric.Pattern} thisArg\n     */\n    initialize: function(options, callback) {\n      options || (options = { });\n\n      this.id = fabric.Object.__uid++;\n      this.setOptions(options);\n      if (!options.source || (options.source && typeof options.source !== 'string')) {\n        callback && callback(this);\n        return;\n      }\n      else {\n        // img src string\n        var _this = this;\n        this.source = fabric.util.createImage();\n        fabric.util.loadImage(options.source, function(img, isError) {\n          _this.source = img;\n          callback && callback(_this, isError);\n        }, null, this.crossOrigin);\n      }\n    },\n\n    /**\n     * Returns object representation of a pattern\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of a pattern instance\n     */\n    toObject: function(propertiesToInclude) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n          source, object;\n\n      // <img> element\n      if (typeof this.source.src === 'string') {\n        source = this.source.src;\n      }\n      // <canvas> element\n      else if (typeof this.source === 'object' && this.source.toDataURL) {\n        source = this.source.toDataURL();\n      }\n\n      object = {\n        type: 'pattern',\n        source: source,\n        repeat: this.repeat,\n        crossOrigin: this.crossOrigin,\n        offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n        offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n        patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n      };\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n      return object;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of a pattern\n     * @param {fabric.Object} object\n     * @return {String} SVG representation of a pattern\n     */\n    toSVG: function(object) {\n      var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n          patternWidth = patternSource.width / object.width,\n          patternHeight = patternSource.height / object.height,\n          patternOffsetX = this.offsetX / object.width,\n          patternOffsetY = this.offsetY / object.height,\n          patternImgSrc = '';\n      if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n        patternHeight = 1;\n        if (patternOffsetY) {\n          patternHeight += Math.abs(patternOffsetY);\n        }\n      }\n      if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n        patternWidth = 1;\n        if (patternOffsetX) {\n          patternWidth += Math.abs(patternOffsetX);\n        }\n\n      }\n      if (patternSource.src) {\n        patternImgSrc = patternSource.src;\n      }\n      else if (patternSource.toDataURL) {\n        patternImgSrc = patternSource.toDataURL();\n      }\n\n      return '<pattern id=\"SVGID_' + this.id +\n                    '\" x=\"' + patternOffsetX +\n                    '\" y=\"' + patternOffsetY +\n                    '\" width=\"' + patternWidth +\n                    '\" height=\"' + patternHeight + '\">\\n' +\n               '<image x=\"0\" y=\"0\"' +\n                      ' width=\"' + patternSource.width +\n                      '\" height=\"' + patternSource.height +\n                      '\" xlink:href=\"' + patternImgSrc +\n               '\"></image>\\n' +\n             '</pattern>\\n';\n    },\n    /* _TO_SVG_END_ */\n\n    setOptions: function(options) {\n      for (var prop in options) {\n        this[prop] = options[prop];\n      }\n    },\n\n    /**\n     * Returns an instance of CanvasPattern\n     * @param {CanvasRenderingContext2D} ctx Context to create pattern\n     * @return {CanvasPattern}\n     */\n    toLive: function(ctx) {\n      var source = this.source;\n      // if the image failed to load, return, and allow rest to continue loading\n      if (!source) {\n        return '';\n      }\n\n      // if an image\n      if (typeof source.src !== 'undefined') {\n        if (!source.complete) {\n          return '';\n        }\n        if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n          return '';\n        }\n      }\n      return ctx.createPattern(source, this.repeat);\n    }\n  });\n})();\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      toFixed = fabric.util.toFixed;\n\n  if (fabric.Shadow) {\n    fabric.warn('fabric.Shadow is already defined.');\n    return;\n  }\n\n  /**\n   * Shadow class\n   * @class fabric.Shadow\n   * @see {@link http://fabricjs.com/shadows|Shadow demo}\n   * @see {@link fabric.Shadow#initialize} for constructor definition\n   */\n  fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n    /**\n     * Shadow color\n     * @type String\n     * @default\n     */\n    color: 'rgb(0,0,0)',\n\n    /**\n     * Shadow blur\n     * @type Number\n     */\n    blur: 0,\n\n    /**\n     * Shadow horizontal offset\n     * @type Number\n     * @default\n     */\n    offsetX: 0,\n\n    /**\n     * Shadow vertical offset\n     * @type Number\n     * @default\n     */\n    offsetY: 0,\n\n    /**\n     * Whether the shadow should affect stroke operations\n     * @type Boolean\n     * @default\n     */\n    affectStroke: false,\n\n    /**\n     * Indicates whether toObject should include default values\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues: true,\n\n    /**\n     * When `false`, the shadow will scale with the object.\n     * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n     * default to false\n     * @type Boolean\n     * @default\n     */\n    nonScaling: false,\n\n    /**\n     * Constructor\n     * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n     * @return {fabric.Shadow} thisArg\n     */\n    initialize: function(options) {\n\n      if (typeof options === 'string') {\n        options = this._parseShadow(options);\n      }\n\n      for (var prop in options) {\n        this[prop] = options[prop];\n      }\n\n      this.id = fabric.Object.__uid++;\n    },\n\n    /**\n     * @private\n     * @param {String} shadow Shadow value to parse\n     * @return {Object} Shadow object with color, offsetX, offsetY and blur\n     */\n    _parseShadow: function(shadow) {\n      var shadowStr = shadow.trim(),\n          offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n          color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n      return {\n        color: color.trim(),\n        offsetX: parseFloat(offsetsAndBlur[1], 10) || 0,\n        offsetY: parseFloat(offsetsAndBlur[2], 10) || 0,\n        blur: parseFloat(offsetsAndBlur[3], 10) || 0\n      };\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n     * @return {String} Returns CSS3 text-shadow declaration\n     */\n    toString: function() {\n      return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns SVG representation of a shadow\n     * @param {fabric.Object} object\n     * @return {String} SVG representation of a shadow\n     */\n    toSVG: function(object) {\n      var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n          offset = fabric.util.rotateVector(\n            { x: this.offsetX, y: this.offsetY },\n            fabric.util.degreesToRadians(-object.angle)),\n          BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n      if (object.width && object.height) {\n        //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n        // we add some extra space to filter box to contain the blur ( 20 )\n        fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n        fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n      }\n      if (object.flipX) {\n        offset.x *= -1;\n      }\n      if (object.flipY) {\n        offset.y *= -1;\n      }\n\n      return (\n        '<filter id=\"SVGID_' + this.id + '\" y=\"-' + fBoxY + '%\" height=\"' + (100 + 2 * fBoxY) + '%\" ' +\n          'x=\"-' + fBoxX + '%\" width=\"' + (100 + 2 * fBoxX) + '%\" ' + '>\\n' +\n          '\\t<feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"' +\n            toFixed(this.blur ? this.blur / 2 : 0, NUM_FRACTION_DIGITS) + '\"></feGaussianBlur>\\n' +\n          '\\t<feOffset dx=\"' + toFixed(offset.x, NUM_FRACTION_DIGITS) +\n          '\" dy=\"' + toFixed(offset.y, NUM_FRACTION_DIGITS) + '\" result=\"oBlur\" ></feOffset>\\n' +\n          '\\t<feFlood flood-color=\"' + color.toRgb() + '\" flood-opacity=\"' + color.getAlpha() + '\"/>\\n' +\n          '\\t<feComposite in2=\"oBlur\" operator=\"in\" />\\n' +\n          '\\t<feMerge>\\n' +\n            '\\t\\t<feMergeNode></feMergeNode>\\n' +\n            '\\t\\t<feMergeNode in=\"SourceGraphic\"></feMergeNode>\\n' +\n          '\\t</feMerge>\\n' +\n        '</filter>\\n');\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns object representation of a shadow\n     * @return {Object} Object representation of a shadow instance\n     */\n    toObject: function() {\n      if (this.includeDefaultValues) {\n        return {\n          color: this.color,\n          blur: this.blur,\n          offsetX: this.offsetX,\n          offsetY: this.offsetY,\n          affectStroke: this.affectStroke,\n          nonScaling: this.nonScaling\n        };\n      }\n      var obj = { }, proto = fabric.Shadow.prototype;\n\n      ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n        if (this[prop] !== proto[prop]) {\n          obj[prop] = this[prop];\n        }\n      }, this);\n\n      return obj;\n    }\n  });\n\n  /**\n   * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n   * @static\n   * @field\n   * @memberOf fabric.Shadow\n   */\n  // eslint-disable-next-line max-len\n  fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(\\d+(?:\\.\\d*)?(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n  'use strict';\n\n  if (fabric.StaticCanvas) {\n    fabric.warn('fabric.StaticCanvas is already defined.');\n    return;\n  }\n\n  // aliases for faster resolution\n  var extend = fabric.util.object.extend,\n      getElementOffset = fabric.util.getElementOffset,\n      removeFromArray = fabric.util.removeFromArray,\n      toFixed = fabric.util.toFixed,\n      transformPoint = fabric.util.transformPoint,\n      invertTransform = fabric.util.invertTransform,\n      getNodeCanvas = fabric.util.getNodeCanvas,\n      createCanvasElement = fabric.util.createCanvasElement,\n\n      CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n  /**\n   * Static canvas class\n   * @class fabric.StaticCanvas\n   * @mixes fabric.Collection\n   * @mixes fabric.Observable\n   * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n   * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n   * @fires before:render\n   * @fires after:render\n   * @fires canvas:cleared\n   * @fires object:added\n   * @fires object:removed\n   */\n  fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n    /**\n     * Constructor\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(el, options) {\n      options || (options = { });\n      this.renderAndResetBound = this.renderAndReset.bind(this);\n      this.requestRenderAllBound = this.requestRenderAll.bind(this);\n      this._initStatic(el, options);\n    },\n\n    /**\n     * Background color of canvas instance.\n     * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n     * @type {(String|fabric.Pattern)}\n     * @default\n     */\n    backgroundColor: '',\n\n    /**\n     * Background image of canvas instance.\n     * since 2.4.0 image caching is active, please when putting an image as background, add to the\n     * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n     * vale. As an alternative you can disable image objectCaching\n     * @type fabric.Image\n     * @default\n     */\n    backgroundImage: null,\n\n    /**\n     * Overlay color of canvas instance.\n     * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n     * @since 1.3.9\n     * @type {(String|fabric.Pattern)}\n     * @default\n     */\n    overlayColor: '',\n\n    /**\n     * Overlay image of canvas instance.\n     * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n     * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n     * vale. As an alternative you can disable image objectCaching\n     * @type fabric.Image\n     * @default\n     */\n    overlayImage: null,\n\n    /**\n     * Indicates whether toObject/toDatalessObject should include default values\n     * if set to false, takes precedence over the object value.\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues: true,\n\n    /**\n     * Indicates whether objects' state should be saved\n     * @type Boolean\n     * @default\n     */\n    stateful: false,\n\n    /**\n     * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n     * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n     * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n     * since the renders are quequed and executed one per frame.\n     * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n     * Left default to true to do not break documentation and old app, fiddles.\n     * @type Boolean\n     * @default\n     */\n    renderOnAddRemove: true,\n\n    /**\n     * Indicates whether object controls (borders/controls) are rendered above overlay image\n     * @type Boolean\n     * @default\n     */\n    controlsAboveOverlay: false,\n\n    /**\n     * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n     * @type Boolean\n     * @default\n     */\n    allowTouchScrolling: false,\n\n    /**\n     * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n     * @type Boolean\n     * @default\n     */\n    imageSmoothingEnabled: true,\n\n    /**\n     * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n     * @type Array\n     * @example <caption>Default transform</caption>\n     * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n     * @example <caption>Scale by 70% and translate toward bottom-right by 50, without skewing</caption>\n     * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n     * @default\n     */\n    viewportTransform: fabric.iMatrix.concat(),\n\n    /**\n     * if set to false background image is not affected by viewport transform\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    backgroundVpt: true,\n\n    /**\n     * if set to false overlya image is not affected by viewport transform\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    overlayVpt: true,\n\n    /**\n     * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n     * @type Boolean\n     * @default\n     */\n    enableRetinaScaling: true,\n\n    /**\n     * Describe canvas element extension over design\n     * properties are tl,tr,bl,br.\n     * if canvas is not zoomed/panned those points are the four corner of canvas\n     * if canvas is viewportTransformed you those points indicate the extension\n     * of canvas element in plain untrasformed coordinates\n     * The coordinates get updated with @method calcViewportBoundaries.\n     * @memberOf fabric.StaticCanvas.prototype\n     */\n    vptCoords: { },\n\n    /**\n     * Based on vptCoords and object.aCoords, skip rendering of objects that\n     * are not included in current viewport.\n     * May greatly help in applications with crowded canvas and use of zoom/pan\n     * If One of the corner of the bounding box of the object is on the canvas\n     * the objects get rendered.\n     * @memberOf fabric.StaticCanvas.prototype\n     * @type Boolean\n     * @default\n     */\n    skipOffscreen: true,\n\n    /**\n     * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n     * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n     * top left corner of the canvas.\n     * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n     * @type fabric.Object\n     */\n    clipPath: undefined,\n\n    /**\n     * @private\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     */\n    _initStatic: function(el, options) {\n      var cb = this.requestRenderAllBound;\n      this._objects = [];\n      this._createLowerCanvas(el);\n      this._initOptions(options);\n      // only initialize retina scaling once\n      if (!this.interactive) {\n        this._initRetinaScaling();\n      }\n\n      if (options.overlayImage) {\n        this.setOverlayImage(options.overlayImage, cb);\n      }\n      if (options.backgroundImage) {\n        this.setBackgroundImage(options.backgroundImage, cb);\n      }\n      if (options.backgroundColor) {\n        this.setBackgroundColor(options.backgroundColor, cb);\n      }\n      if (options.overlayColor) {\n        this.setOverlayColor(options.overlayColor, cb);\n      }\n      this.calcOffset();\n    },\n\n    /**\n     * @private\n     */\n    _isRetinaScaling: function() {\n      return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling);\n    },\n\n    /**\n     * @private\n     * @return {Number} retinaScaling if applied, otherwise 1;\n     */\n    getRetinaScaling: function() {\n      return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1;\n    },\n\n    /**\n     * @private\n     */\n    _initRetinaScaling: function() {\n      if (!this._isRetinaScaling()) {\n        return;\n      }\n      var scaleRatio = fabric.devicePixelRatio;\n      this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer);\n      if (this.upperCanvasEl) {\n        this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop);\n      }\n    },\n\n    __initRetinaScaling: function(scaleRatio, canvas, context) {\n      canvas.setAttribute('width', this.width * scaleRatio);\n      canvas.setAttribute('height', this.height * scaleRatio);\n      context.scale(scaleRatio, scaleRatio);\n    },\n\n\n    /**\n     * Calculates canvas element offset relative to the document\n     * This method is also attached as \"resize\" event handler of window\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    calcOffset: function () {\n      this._offset = getElementOffset(this.lowerCanvasEl);\n      return this;\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n     * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n     * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n     * @example <caption>Normal overlayImage with left/top = 0</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   // Needed to position overlayImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>overlayImage with different properties</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>Stretched overlayImage #1 - width/height correspond to canvas width/height</caption>\n     * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) {\n     *    img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n     *    canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n     * });\n     * @example <caption>Stretched overlayImage #2 - width/height correspond to canvas width/height</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   width: canvas.width,\n     *   height: canvas.height,\n     *   // Needed to position overlayImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>overlayImage loaded from cross-origin</caption>\n     * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top',\n     *   crossOrigin: 'anonymous'\n     * });\n     */\n    setOverlayImage: function (image, callback, options) {\n      return this.__setBgOverlayImage('overlayImage', image, callback, options);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n     * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n     * @param {Function} callback Callback to invoke when image is loaded and set as background\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n     * @example <caption>Normal backgroundImage with left/top = 0</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   // Needed to position backgroundImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>backgroundImage with different properties</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>Stretched backgroundImage #1 - width/height correspond to canvas width/height</caption>\n     * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) {\n     *    img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n     *    canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n     * });\n     * @example <caption>Stretched backgroundImage #2 - width/height correspond to canvas width/height</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   width: canvas.width,\n     *   height: canvas.height,\n     *   // Needed to position backgroundImage at 0/0\n     *   originX: 'left',\n     *   originY: 'top'\n     * });\n     * @example <caption>backgroundImage loaded from cross-origin</caption>\n     * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n     *   opacity: 0.5,\n     *   angle: 45,\n     *   left: 400,\n     *   top: 400,\n     *   originX: 'left',\n     *   originY: 'top',\n     *   crossOrigin: 'anonymous'\n     * });\n     */\n    // TODO: fix stretched examples\n    setBackgroundImage: function (image, callback, options) {\n      return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n     * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n     * @param {Function} callback Callback to invoke when foreground color is set\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n     * @example <caption>Normal overlayColor - color value</caption>\n     * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as overlayColor</caption>\n     * canvas.setOverlayColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png'\n     * }, canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as overlayColor with repeat and offset</caption>\n     * canvas.setOverlayColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png',\n     *   repeat: 'repeat',\n     *   offsetX: 200,\n     *   offsetY: 100\n     * }, canvas.renderAll.bind(canvas));\n     */\n    setOverlayColor: function(overlayColor, callback) {\n      return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n    },\n\n    /**\n     * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n     * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n     * @param {Function} callback Callback to invoke when background color is set\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n     * @example <caption>Normal backgroundColor - color value</caption>\n     * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as backgroundColor</caption>\n     * canvas.setBackgroundColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png'\n     * }, canvas.renderAll.bind(canvas));\n     * @example <caption>fabric.Pattern used as backgroundColor with repeat and offset</caption>\n     * canvas.setBackgroundColor({\n     *   source: 'http://fabricjs.com/assets/escheresque_ste.png',\n     *   repeat: 'repeat',\n     *   offsetX: 200,\n     *   offsetY: 100\n     * }, canvas.renderAll.bind(canvas));\n     */\n    setBackgroundColor: function(backgroundColor, callback) {\n      return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n    },\n\n    /**\n     * @private\n     * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n     * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n     * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n     * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not.\n     * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n     */\n    __setBgOverlayImage: function(property, image, callback, options) {\n      if (typeof image === 'string') {\n        fabric.util.loadImage(image, function(img, isError) {\n          if (img) {\n            var instance = new fabric.Image(img, options);\n            this[property] = instance;\n            instance.canvas = this;\n          }\n          callback && callback(img, isError);\n        }, this, options && options.crossOrigin);\n      }\n      else {\n        options && image.setOptions(options);\n        this[property] = image;\n        image && (image.canvas = this);\n        callback && callback(image, false);\n      }\n\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n     * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n     * @param {(Object|String|null)} color Object with pattern information, color value or null\n     * @param {Function} [callback] Callback is invoked when color is set\n     */\n    __setBgOverlayColor: function(property, color, callback) {\n      this[property] = color;\n      this._initGradient(color, property);\n      this._initPattern(color, property, callback);\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _createCanvasElement: function() {\n      var element = createCanvasElement();\n      if (!element) {\n        throw CANVAS_INIT_ERROR;\n      }\n      if (!element.style) {\n        element.style = { };\n      }\n      if (typeof element.getContext === 'undefined') {\n        throw CANVAS_INIT_ERROR;\n      }\n      return element;\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options object\n     */\n    _initOptions: function (options) {\n      var lowerCanvasEl = this.lowerCanvasEl;\n      this._setOptions(options);\n\n      this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n      this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n      if (!this.lowerCanvasEl.style) {\n        return;\n      }\n\n      lowerCanvasEl.width = this.width;\n      lowerCanvasEl.height = this.height;\n\n      lowerCanvasEl.style.width = this.width + 'px';\n      lowerCanvasEl.style.height = this.height + 'px';\n\n      this.viewportTransform = this.viewportTransform.slice();\n    },\n\n    /**\n     * Creates a bottom canvas\n     * @private\n     * @param {HTMLElement} [canvasEl]\n     */\n    _createLowerCanvas: function (canvasEl) {\n      // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n      if (canvasEl && canvasEl.getContext) {\n        this.lowerCanvasEl = canvasEl;\n      }\n      else {\n        this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n      }\n\n      fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n      this._originalCanvasStyle = this.lowerCanvasEl.style;\n      if (this.interactive) {\n        this._applyCanvasStyle(this.lowerCanvasEl);\n      }\n\n      this.contextContainer = this.lowerCanvasEl.getContext('2d');\n    },\n\n    /**\n     * Returns canvas width (in px)\n     * @return {Number}\n     */\n    getWidth: function () {\n      return this.width;\n    },\n\n    /**\n     * Returns canvas height (in px)\n     * @return {Number}\n     */\n    getHeight: function () {\n      return this.height;\n    },\n\n    /**\n     * Sets width of this canvas instance\n     * @param {Number|String} value                         Value to set width to\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setWidth: function (value, options) {\n      return this.setDimensions({ width: value }, options);\n    },\n\n    /**\n     * Sets height of this canvas instance\n     * @param {Number|String} value                         Value to set height to\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setHeight: function (value, options) {\n      return this.setDimensions({ height: value }, options);\n    },\n\n    /**\n     * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n     * @param {Object}        dimensions                    Object with width/height properties\n     * @param {Number|String} [dimensions.width]            Width of canvas element\n     * @param {Number|String} [dimensions.height]           Height of canvas element\n     * @param {Object}        [options]                     Options object\n     * @param {Boolean}       [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n     * @param {Boolean}       [options.cssOnly=false]       Set the given dimensions only as css dimensions\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    setDimensions: function (dimensions, options) {\n      var cssValue;\n\n      options = options || {};\n\n      for (var prop in dimensions) {\n        cssValue = dimensions[prop];\n\n        if (!options.cssOnly) {\n          this._setBackstoreDimension(prop, dimensions[prop]);\n          cssValue += 'px';\n          this.hasLostContext = true;\n        }\n\n        if (!options.backstoreOnly) {\n          this._setCssDimension(prop, cssValue);\n        }\n      }\n      if (this._isCurrentlyDrawing) {\n        this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop);\n      }\n      this._initRetinaScaling();\n      this.calcOffset();\n\n      if (!options.cssOnly) {\n        this.requestRenderAll();\n      }\n\n      return this;\n    },\n\n    /**\n     * Helper for setting width/height\n     * @private\n     * @param {String} prop property (width|height)\n     * @param {Number} value value to set property to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    _setBackstoreDimension: function (prop, value) {\n      this.lowerCanvasEl[prop] = value;\n\n      if (this.upperCanvasEl) {\n        this.upperCanvasEl[prop] = value;\n      }\n\n      if (this.cacheCanvasEl) {\n        this.cacheCanvasEl[prop] = value;\n      }\n\n      this[prop] = value;\n\n      return this;\n    },\n\n    /**\n     * Helper for setting css width/height\n     * @private\n     * @param {String} prop property (width|height)\n     * @param {String} value value to set property to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    _setCssDimension: function (prop, value) {\n      this.lowerCanvasEl.style[prop] = value;\n\n      if (this.upperCanvasEl) {\n        this.upperCanvasEl.style[prop] = value;\n      }\n\n      if (this.wrapperEl) {\n        this.wrapperEl.style[prop] = value;\n      }\n\n      return this;\n    },\n\n    /**\n     * Returns canvas zoom level\n     * @return {Number}\n     */\n    getZoom: function () {\n      return this.viewportTransform[0];\n    },\n\n    /**\n     * Sets viewport transformation of this canvas instance\n     * @param {Array} vpt a Canvas 2D API transform matrix\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setViewportTransform: function (vpt) {\n      var activeObject = this._activeObject,\n          backgroundObject = this.backgroundImage,\n          overlayObject = this.overlayImage,\n          object, i, len;\n      this.viewportTransform = vpt;\n      for (i = 0, len = this._objects.length; i < len; i++) {\n        object = this._objects[i];\n        object.group || object.setCoords(true);\n      }\n      if (activeObject) {\n        activeObject.setCoords();\n      }\n      if (backgroundObject) {\n        backgroundObject.setCoords(true);\n      }\n      if (overlayObject) {\n        overlayObject.setCoords(true);\n      }\n      this.calcViewportBoundaries();\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Sets zoom level of this canvas instance, the zoom centered around point\n     * meaning that following zoom to point with the same point will have the visual\n     * effect of the zoom originating from that point. The point won't move.\n     * It has nothing to do with canvas center or visual center of the viewport.\n     * @param {fabric.Point} point to zoom with respect to\n     * @param {Number} value to set zoom to, less than 1 zooms out\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    zoomToPoint: function (point, value) {\n      // TODO: just change the scale, preserve other transformations\n      var before = point, vpt = this.viewportTransform.slice(0);\n      point = transformPoint(point, invertTransform(this.viewportTransform));\n      vpt[0] = value;\n      vpt[3] = value;\n      var after = transformPoint(point, vpt);\n      vpt[4] += before.x - after.x;\n      vpt[5] += before.y - after.y;\n      return this.setViewportTransform(vpt);\n    },\n\n    /**\n     * Sets zoom level of this canvas instance\n     * @param {Number} value to set zoom to, less than 1 zooms out\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    setZoom: function (value) {\n      this.zoomToPoint(new fabric.Point(0, 0), value);\n      return this;\n    },\n\n    /**\n     * Pan viewport so as to place point at top left corner of canvas\n     * @param {fabric.Point} point to move to\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    absolutePan: function (point) {\n      var vpt = this.viewportTransform.slice(0);\n      vpt[4] = -point.x;\n      vpt[5] = -point.y;\n      return this.setViewportTransform(vpt);\n    },\n\n    /**\n     * Pans viewpoint relatively\n     * @param {fabric.Point} point (position vector) to move by\n     * @return {fabric.Canvas} instance\n     * @chainable true\n     */\n    relativePan: function (point) {\n      return this.absolutePan(new fabric.Point(\n        -point.x - this.viewportTransform[4],\n        -point.y - this.viewportTransform[5]\n      ));\n    },\n\n    /**\n     * Returns &lt;canvas> element corresponding to this instance\n     * @return {HTMLCanvasElement}\n     */\n    getElement: function () {\n      return this.lowerCanvasEl;\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was added\n     */\n    _onObjectAdded: function(obj) {\n      this.stateful && obj.setupState();\n      obj._set('canvas', this);\n      obj.setCoords();\n      this.fire('object:added', { target: obj });\n      obj.fire('added');\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was removed\n     */\n    _onObjectRemoved: function(obj) {\n      this.fire('object:removed', { target: obj });\n      obj.fire('removed');\n      delete obj.canvas;\n    },\n\n    /**\n     * Clears specified context of canvas element\n     * @param {CanvasRenderingContext2D} ctx Context to clear\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clearContext: function(ctx) {\n      ctx.clearRect(0, 0, this.width, this.height);\n      return this;\n    },\n\n    /**\n     * Returns context of canvas where objects are drawn\n     * @return {CanvasRenderingContext2D}\n     */\n    getContext: function () {\n      return this.contextContainer;\n    },\n\n    /**\n     * Clears all contexts (background, main, top) of an instance\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clear: function () {\n      this.remove.apply(this, this.getObjects());\n      this.backgroundImage = null;\n      this.overlayImage = null;\n      this.backgroundColor = '';\n      this.overlayColor = '';\n      if (this._hasITextHandlers) {\n        this.off('mouse:up', this._mouseUpITextHandler);\n        this._iTextInstances = null;\n        this._hasITextHandlers = false;\n      }\n      this.clearContext(this.contextContainer);\n      this.fire('canvas:cleared');\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Renders the canvas\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAll: function () {\n      var canvasToDrawOn = this.contextContainer;\n      this.renderCanvas(canvasToDrawOn, this._objects);\n      return this;\n    },\n\n    /**\n     * Function created to be instance bound at initialization\n     * used in requestAnimationFrame rendering\n     * Let the fabricJS call it. If you call it manually you could have more\n     * animationFrame stacking on to of each other\n     * for an imperative rendering, use canvas.renderAll\n     * @private\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAndReset: function() {\n      this.isRendering = 0;\n      this.renderAll();\n    },\n\n    /**\n     * Append a renderAll request to next animation frame.\n     * unless one is already in progress, in that case nothing is done\n     * a boolean flag will avoid appending more.\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    requestRenderAll: function () {\n      if (!this.isRendering) {\n        this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n      }\n      return this;\n    },\n\n    /**\n     * Calculate the position of the 4 corner of canvas with current viewportTransform.\n     * helps to determinate when an object is in the current rendering viewport using\n     * object absolute coordinates ( aCoords )\n     * @return {Object} points.tl\n     * @chainable\n     */\n    calcViewportBoundaries: function() {\n      var points = { }, width = this.width, height = this.height,\n          iVpt = invertTransform(this.viewportTransform);\n      points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n      points.br = transformPoint({ x: width, y: height }, iVpt);\n      points.tr = new fabric.Point(points.br.x, points.tl.y);\n      points.bl = new fabric.Point(points.tl.x, points.br.y);\n      this.vptCoords = points;\n      return points;\n    },\n\n    cancelRequestedRender: function() {\n      if (this.isRendering) {\n        fabric.util.cancelAnimFrame(this.isRendering);\n        this.isRendering = 0;\n      }\n    },\n\n    /**\n     * Renders background, objects, overlay and controls.\n     * @param {CanvasRenderingContext2D} ctx\n     * @param {Array} objects to render\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderCanvas: function(ctx, objects) {\n      var v = this.viewportTransform, path = this.clipPath;\n      this.cancelRequestedRender();\n      this.calcViewportBoundaries();\n      this.clearContext(ctx);\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled);\n      this.fire('before:render', { ctx: ctx, });\n      this._renderBackground(ctx);\n\n      ctx.save();\n      //apply viewport transform once for all rendering process\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      this._renderObjects(ctx, objects);\n      ctx.restore();\n      if (!this.controlsAboveOverlay && this.interactive) {\n        this.drawControls(ctx);\n      }\n      if (path) {\n        path.canvas = this;\n        // needed to setup a couple of variables\n        path.shouldCache();\n        path._transformDone = true;\n        path.renderCache({ forClipping: true });\n        this.drawClipPathOnCanvas(ctx);\n      }\n      this._renderOverlay(ctx);\n      if (this.controlsAboveOverlay && this.interactive) {\n        this.drawControls(ctx);\n      }\n      this.fire('after:render', { ctx: ctx, });\n    },\n\n    /**\n     * Paint the cached clipPath on the lowerCanvasEl\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawClipPathOnCanvas: function(ctx) {\n      var v = this.viewportTransform, path = this.clipPath;\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      // DEBUG: uncomment this line, comment the following\n      // ctx.globalAlpha = 0.4;\n      ctx.globalCompositeOperation = 'destination-in';\n      path.transform(ctx);\n      ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n      ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Array} objects to render\n     */\n    _renderObjects: function(ctx, objects) {\n      var i, len;\n      for (i = 0, len = objects.length; i < len; ++i) {\n        objects[i] && objects[i].render(ctx);\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {string} property 'background' or 'overlay'\n     */\n    _renderBackgroundOrOverlay: function(ctx, property) {\n      var fill = this[property + 'Color'], object = this[property + 'Image'],\n          v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n      if (!fill && !object) {\n        return;\n      }\n      if (fill) {\n        ctx.save();\n        ctx.beginPath();\n        ctx.moveTo(0, 0);\n        ctx.lineTo(this.width, 0);\n        ctx.lineTo(this.width, this.height);\n        ctx.lineTo(0, this.height);\n        ctx.closePath();\n        ctx.fillStyle = fill.toLive\n          ? fill.toLive(ctx, this)\n          : fill;\n        if (needsVpt) {\n          ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n        }\n        ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n        var m = fill.gradientTransform || fill.patternTransform;\n        m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n        ctx.fill();\n        ctx.restore();\n      }\n      if (object) {\n        ctx.save();\n        if (needsVpt) {\n          ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n        }\n        object.render(ctx);\n        ctx.restore();\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderBackground: function(ctx) {\n      this._renderBackgroundOrOverlay(ctx, 'background');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderOverlay: function(ctx) {\n      this._renderBackgroundOrOverlay(ctx, 'overlay');\n    },\n\n    /**\n     * Returns coordinates of a center of canvas.\n     * Returned value is an object with top and left properties\n     * @return {Object} object with \"top\" and \"left\" number values\n     * @deprecated migrate to `getCenterPoint`\n     */\n    getCenter: function () {\n      return {\n        top: this.height / 2,\n        left: this.width / 2\n      };\n    },\n\n    /**\n     * Returns coordinates of a center of canvas.\n     * @return {fabric.Point} \n     */\n    getCenterPoint: function () {\n      return new fabric.Point(this.width / 2, this.height / 2);\n    },\n\n    /**\n     * Centers object horizontally in the canvas\n     * @param {fabric.Object} object Object to center horizontally\n     * @return {fabric.Canvas} thisArg\n     */\n    centerObjectH: function (object) {\n      return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y));\n    },\n\n    /**\n     * Centers object vertically in the canvas\n     * @param {fabric.Object} object Object to center vertically\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    centerObjectV: function (object) {\n      return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y));\n    },\n\n    /**\n     * Centers object vertically and horizontally in the canvas\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    centerObject: function(object) {\n      var center = this.getCenterPoint();\n      return this._centerObject(object, center);\n    },\n\n    /**\n     * Centers object vertically and horizontally in the viewport\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObject: function(object) {\n      var vpCenter = this.getVpCenter();\n      return this._centerObject(object, vpCenter);\n    },\n\n    /**\n     * Centers object horizontally in the viewport, object.top is unchanged\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObjectH: function(object) {\n      var vpCenter = this.getVpCenter();\n      this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n      return this;\n    },\n\n    /**\n     * Centers object Vertically in the viewport, object.top is unchanged\n     * @param {fabric.Object} object Object to center vertically and horizontally\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    viewportCenterObjectV: function(object) {\n      var vpCenter = this.getVpCenter();\n\n      return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n    },\n\n    /**\n     * Calculate the point in canvas that correspond to the center of actual viewport.\n     * @return {fabric.Point} vpCenter, viewport center\n     * @chainable\n     */\n    getVpCenter: function() {\n      var center = this.getCenterPoint(),\n          iVpt = invertTransform(this.viewportTransform);\n      return transformPoint(center, iVpt);\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} object Object to center\n     * @param {fabric.Point} center Center point\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    _centerObject: function(object, center) {\n      object.setPositionByOrigin(center, 'center', 'center');\n      object.setCoords();\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Returns dataless JSON representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {String} json string\n     */\n    toDatalessJSON: function (propertiesToInclude) {\n      return this.toDatalessObject(propertiesToInclude);\n    },\n\n    /**\n     * Returns object representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function (propertiesToInclude) {\n      return this._toObjectMethod('toObject', propertiesToInclude);\n    },\n\n    /**\n     * Returns dataless object representation of canvas\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function (propertiesToInclude) {\n      return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n    },\n\n    /**\n     * @private\n     */\n    _toObjectMethod: function (methodName, propertiesToInclude) {\n\n      var clipPath = this.clipPath, data = {\n        version: fabric.version,\n        objects: this._toObjects(methodName, propertiesToInclude),\n      };\n      if (clipPath && !clipPath.excludeFromExport) {\n        data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n      }\n      extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n      fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n      return data;\n    },\n\n    /**\n     * @private\n     */\n    _toObjects: function(methodName, propertiesToInclude) {\n      return this._objects.filter(function(object) {\n        return !object.excludeFromExport;\n      }).map(function(instance) {\n        return this._toObject(instance, methodName, propertiesToInclude);\n      }, this);\n    },\n\n    /**\n     * @private\n     */\n    _toObject: function(instance, methodName, propertiesToInclude) {\n      var originalValue;\n\n      if (!this.includeDefaultValues) {\n        originalValue = instance.includeDefaultValues;\n        instance.includeDefaultValues = false;\n      }\n\n      var object = instance[methodName](propertiesToInclude);\n      if (!this.includeDefaultValues) {\n        instance.includeDefaultValues = originalValue;\n      }\n      return object;\n    },\n\n    /**\n     * @private\n     */\n    __serializeBgOverlay: function(methodName, propertiesToInclude) {\n      var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage,\n          bgColor = this.backgroundColor, overlayColor = this.overlayColor;\n\n      if (bgColor && bgColor.toObject) {\n        if (!bgColor.excludeFromExport) {\n          data.background = bgColor.toObject(propertiesToInclude);\n        }\n      }\n      else if (bgColor) {\n        data.background = bgColor;\n      }\n\n      if (overlayColor && overlayColor.toObject) {\n        if (!overlayColor.excludeFromExport) {\n          data.overlay = overlayColor.toObject(propertiesToInclude);\n        }\n      }\n      else if (overlayColor) {\n        data.overlay = overlayColor;\n      }\n\n      if (bgImage && !bgImage.excludeFromExport) {\n        data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n      }\n      if (overlayImage && !overlayImage.excludeFromExport) {\n        data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude);\n      }\n\n      return data;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n     * a zoomed canvas will then produce zoomed SVG output.\n     * @type Boolean\n     * @default\n     */\n    svgViewportTransformation: true,\n\n    /**\n     * Returns SVG representation of canvas\n     * @function\n     * @param {Object} [options] Options object for SVG output\n     * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n     * @param {Object} [options.viewBox] SVG viewbox object\n     * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n     * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n     * @param {Number} [options.viewBox.width] Width of viewbox\n     * @param {Number} [options.viewBox.height] Height of viewbox\n     * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n     * @param {String} [options.width] desired width of svg with or without units\n     * @param {String} [options.height] desired height of svg with or without units\n     * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n     * @return {String} SVG string\n     * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n     * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n     * @example <caption>Normal SVG output</caption>\n     * var svg = canvas.toSVG();\n     * @example <caption>SVG output without preamble (without &lt;?xml ../>)</caption>\n     * var svg = canvas.toSVG({suppressPreamble: true});\n     * @example <caption>SVG output with viewBox attribute</caption>\n     * var svg = canvas.toSVG({\n     *   viewBox: {\n     *     x: 100,\n     *     y: 100,\n     *     width: 200,\n     *     height: 300\n     *   }\n     * });\n     * @example <caption>SVG output with different encoding (default: UTF-8)</caption>\n     * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n     * @example <caption>Modify SVG output with reviver function</caption>\n     * var svg = canvas.toSVG(null, function(svg) {\n     *   return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n     * });\n     */\n    toSVG: function(options, reviver) {\n      options || (options = { });\n      options.reviver = reviver;\n      var markup = [];\n\n      this._setSVGPreamble(markup, options);\n      this._setSVGHeader(markup, options);\n      if (this.clipPath) {\n        markup.push('<g clip-path=\"url(#' + this.clipPath.clipPathId + ')\" >\\n');\n      }\n      this._setSVGBgOverlayColor(markup, 'background');\n      this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n      this._setSVGObjects(markup, reviver);\n      if (this.clipPath) {\n        markup.push('</g>\\n');\n      }\n      this._setSVGBgOverlayColor(markup, 'overlay');\n      this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n      markup.push('</svg>');\n\n      return markup.join('');\n    },\n\n    /**\n     * @private\n     */\n    _setSVGPreamble: function(markup, options) {\n      if (options.suppressPreamble) {\n        return;\n      }\n      markup.push(\n        '<?xml version=\"1.0\" encoding=\"', (options.encoding || 'UTF-8'), '\" standalone=\"no\" ?>\\n',\n        '<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" ',\n        '\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\\n'\n      );\n    },\n\n    /**\n     * @private\n     */\n    _setSVGHeader: function(markup, options) {\n      var width = options.width || this.width,\n          height = options.height || this.height,\n          vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n      if (options.viewBox) {\n        viewBox = 'viewBox=\"' +\n                options.viewBox.x + ' ' +\n                options.viewBox.y + ' ' +\n                options.viewBox.width + ' ' +\n                options.viewBox.height + '\" ';\n      }\n      else {\n        if (this.svgViewportTransformation) {\n          vpt = this.viewportTransform;\n          viewBox = 'viewBox=\"' +\n                  toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n                  toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n        }\n      }\n\n      markup.push(\n        '<svg ',\n        'xmlns=\"http://www.w3.org/2000/svg\" ',\n        'xmlns:xlink=\"http://www.w3.org/1999/xlink\" ',\n        'version=\"1.1\" ',\n        'width=\"', width, '\" ',\n        'height=\"', height, '\" ',\n        viewBox,\n        'xml:space=\"preserve\">\\n',\n        '<desc>Created with Fabric.js ', fabric.version, '</desc>\\n',\n        '<defs>\\n',\n        this.createSVGFontFacesMarkup(),\n        this.createSVGRefElementsMarkup(),\n        this.createSVGClipPathMarkup(options),\n        '</defs>\\n'\n      );\n    },\n\n    createSVGClipPathMarkup: function(options) {\n      var clipPath = this.clipPath;\n      if (clipPath) {\n        clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n        return  '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n          this.clipPath.toClipPathSVG(options.reviver) +\n          '</clipPath>\\n';\n      }\n      return '';\n    },\n\n    /**\n     * Creates markup containing SVG referenced elements like patterns, gradients etc.\n     * @return {String}\n     */\n    createSVGRefElementsMarkup: function() {\n      var _this = this,\n          markup = ['background', 'overlay'].map(function(prop) {\n            var fill = _this[prop + 'Color'];\n            if (fill && fill.toLive) {\n              var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n                  object = {\n                    width: _this.width / (shouldTransform ? vpt[0] : 1),\n                    height: _this.height / (shouldTransform ? vpt[3] : 1)\n                  };\n              return fill.toSVG(\n                object,\n                { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n              );\n            }\n          });\n      return markup.join('');\n    },\n\n    /**\n     * Creates markup containing SVG font faces,\n     * font URLs for font faces must be collected by developers\n     * and are not extracted from the DOM by fabricjs\n     * @param {Array} objects Array of fabric objects\n     * @return {String}\n     */\n    createSVGFontFacesMarkup: function() {\n      var markup = '', fontList = { }, obj, fontFamily,\n          style, row, rowIndex, _char, charIndex, i, len,\n          fontPaths = fabric.fontPaths, objects = [];\n\n      this._objects.forEach(function add(object) {\n        objects.push(object);\n        if (object._objects) {\n          object._objects.forEach(add);\n        }\n      });\n\n      for (i = 0, len = objects.length; i < len; i++) {\n        obj = objects[i];\n        fontFamily = obj.fontFamily;\n        if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n          continue;\n        }\n        fontList[fontFamily] = true;\n        if (!obj.styles) {\n          continue;\n        }\n        style = obj.styles;\n        for (rowIndex in style) {\n          row = style[rowIndex];\n          for (charIndex in row) {\n            _char = row[charIndex];\n            fontFamily = _char.fontFamily;\n            if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n              fontList[fontFamily] = true;\n            }\n          }\n        }\n      }\n\n      for (var j in fontList) {\n        markup += [\n          '\\t\\t@font-face {\\n',\n          '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n          '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n          '\\t\\t}\\n'\n        ].join('');\n      }\n\n      if (markup) {\n        markup = [\n          '\\t<style type=\"text/css\">',\n          '<![CDATA[\\n',\n          markup,\n          ']]>',\n          '</style>\\n'\n        ].join('');\n      }\n\n      return markup;\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObjects: function(markup, reviver) {\n      var instance, i, len, objects = this._objects;\n      for (i = 0, len = objects.length; i < len; i++) {\n        instance = objects[i];\n        if (instance.excludeFromExport) {\n          continue;\n        }\n        this._setSVGObject(markup, instance, reviver);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObject: function(markup, instance, reviver) {\n      markup.push(instance.toSVG(reviver));\n    },\n\n    /**\n     * @private\n     */\n    _setSVGBgOverlayImage: function(markup, property, reviver) {\n      if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n        markup.push(this[property].toSVG(reviver));\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGBgOverlayColor: function(markup, property) {\n      var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n          finalHeight = this.height;\n      if (!filler) {\n        return;\n      }\n      if (filler.toLive) {\n        var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n            additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n        markup.push(\n          '<rect transform=\"' + additionalTransform + ' translate(', finalWidth / 2, ',', finalHeight / 2, ')\"',\n          ' x=\"', filler.offsetX - finalWidth / 2,\n          '\" y=\"', filler.offsetY - finalHeight / 2, '\" ',\n          'width=\"',\n          (repeat === 'repeat-y' || repeat === 'no-repeat'\n            ? filler.source.width\n            : finalWidth ),\n          '\" height=\"',\n          (repeat === 'repeat-x' || repeat === 'no-repeat'\n            ? filler.source.height\n            : finalHeight),\n          '\" fill=\"url(#SVGID_' + filler.id + ')\"',\n          '></rect>\\n'\n        );\n      }\n      else {\n        markup.push(\n          '<rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" ',\n          'fill=\"', filler, '\"',\n          '></rect>\\n'\n        );\n      }\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Moves an object or the objects of a multiple selection\n     * to the bottom of the stack of drawn objects\n     * @param {fabric.Object} object Object to send to back\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    sendToBack: function (object) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, objs;\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = objs.length; i--;) {\n          obj = objs[i];\n          removeFromArray(this._objects, obj);\n          this._objects.unshift(obj);\n        }\n      }\n      else {\n        removeFromArray(this._objects, object);\n        this._objects.unshift(object);\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Moves an object or the objects of a multiple selection\n     * to the top of the stack of drawn objects\n     * @param {fabric.Object} object Object to send\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    bringToFront: function (object) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, objs;\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = 0; i < objs.length; i++) {\n          obj = objs[i];\n          removeFromArray(this._objects, obj);\n          this._objects.push(obj);\n        }\n      }\n      else {\n        removeFromArray(this._objects, object);\n        this._objects.push(object);\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * Moves an object or a selection down in stack of drawn objects\n     * An optional parameter, intersecting allows to move the object in behind\n     * the first intersecting object. Where intersection is calculated with\n     * bounding box. If no intersection is found, there will not be change in the\n     * stack.\n     * @param {fabric.Object} object Object to send\n     * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    sendBackwards: function (object, intersecting) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, idx, newIdx, objs, objsMoved = 0;\n\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = 0; i < objs.length; i++) {\n          obj = objs[i];\n          idx = this._objects.indexOf(obj);\n          if (idx > 0 + objsMoved) {\n            newIdx = idx - 1;\n            removeFromArray(this._objects, obj);\n            this._objects.splice(newIdx, 0, obj);\n          }\n          objsMoved++;\n        }\n      }\n      else {\n        idx = this._objects.indexOf(object);\n        if (idx !== 0) {\n          // if object is not on the bottom of stack\n          newIdx = this._findNewLowerIndex(object, idx, intersecting);\n          removeFromArray(this._objects, object);\n          this._objects.splice(newIdx, 0, object);\n        }\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _findNewLowerIndex: function(object, idx, intersecting) {\n      var newIdx, i;\n\n      if (intersecting) {\n        newIdx = idx;\n\n        // traverse down the stack looking for the nearest intersecting object\n        for (i = idx - 1; i >= 0; --i) {\n\n          var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n                               object.isContainedWithinObject(this._objects[i]) ||\n                               this._objects[i].isContainedWithinObject(object);\n\n          if (isIntersecting) {\n            newIdx = i;\n            break;\n          }\n        }\n      }\n      else {\n        newIdx = idx - 1;\n      }\n\n      return newIdx;\n    },\n\n    /**\n     * Moves an object or a selection up in stack of drawn objects\n     * An optional parameter, intersecting allows to move the object in front\n     * of the first intersecting object. Where intersection is calculated with\n     * bounding box. If no intersection is found, there will not be change in the\n     * stack.\n     * @param {fabric.Object} object Object to send\n     * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    bringForward: function (object, intersecting) {\n      if (!object) {\n        return this;\n      }\n      var activeSelection = this._activeObject,\n          i, obj, idx, newIdx, objs, objsMoved = 0;\n\n      if (object === activeSelection && object.type === 'activeSelection') {\n        objs = activeSelection._objects;\n        for (i = objs.length; i--;) {\n          obj = objs[i];\n          idx = this._objects.indexOf(obj);\n          if (idx < this._objects.length - 1 - objsMoved) {\n            newIdx = idx + 1;\n            removeFromArray(this._objects, obj);\n            this._objects.splice(newIdx, 0, obj);\n          }\n          objsMoved++;\n        }\n      }\n      else {\n        idx = this._objects.indexOf(object);\n        if (idx !== this._objects.length - 1) {\n          // if object is not on top of stack (last item in an array)\n          newIdx = this._findNewUpperIndex(object, idx, intersecting);\n          removeFromArray(this._objects, object);\n          this._objects.splice(newIdx, 0, object);\n        }\n      }\n      this.renderOnAddRemove && this.requestRenderAll();\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _findNewUpperIndex: function(object, idx, intersecting) {\n      var newIdx, i, len;\n\n      if (intersecting) {\n        newIdx = idx;\n\n        // traverse up the stack looking for the nearest intersecting object\n        for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n          var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n                               object.isContainedWithinObject(this._objects[i]) ||\n                               this._objects[i].isContainedWithinObject(object);\n\n          if (isIntersecting) {\n            newIdx = i;\n            break;\n          }\n        }\n      }\n      else {\n        newIdx = idx + 1;\n      }\n\n      return newIdx;\n    },\n\n    /**\n     * Moves an object to specified level in stack of drawn objects\n     * @param {fabric.Object} object Object to send\n     * @param {Number} index Position to move to\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    moveTo: function (object, index) {\n      removeFromArray(this._objects, object);\n      this._objects.splice(index, 0, object);\n      return this.renderOnAddRemove && this.requestRenderAll();\n    },\n\n    /**\n     * Clears a canvas element and dispose objects\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    dispose: function () {\n      // cancel eventually ongoing renders\n      if (this.isRendering) {\n        fabric.util.cancelAnimFrame(this.isRendering);\n        this.isRendering = 0;\n      }\n      this.forEachObject(function(object) {\n        object.dispose && object.dispose();\n      });\n      this._objects = [];\n      if (this.backgroundImage && this.backgroundImage.dispose) {\n        this.backgroundImage.dispose();\n      }\n      this.backgroundImage = null;\n      if (this.overlayImage && this.overlayImage.dispose) {\n        this.overlayImage.dispose();\n      }\n      this.overlayImage = null;\n      this._iTextInstances = null;\n      this.contextContainer = null;\n      // restore canvas style\n      this.lowerCanvasEl.classList.remove('lower-canvas');\n      fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle);\n      delete this._originalCanvasStyle;\n      // restore canvas size to original size in case retina scaling was applied\n      this.lowerCanvasEl.setAttribute('width', this.width);\n      this.lowerCanvasEl.setAttribute('height', this.height);\n      fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n      this.lowerCanvasEl = undefined;\n      return this;\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @return {String} string representation of an instance\n     */\n    toString: function () {\n      return '#<fabric.Canvas (' + this.complexity() + '): ' +\n               '{ objects: ' + this._objects.length + ' }>';\n    }\n  });\n\n  extend(fabric.StaticCanvas.prototype, fabric.Observable);\n  extend(fabric.StaticCanvas.prototype, fabric.Collection);\n  extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n  extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n    /**\n     * @static\n     * @type String\n     * @default\n     */\n    EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n    /**\n     * Provides a way to check support of some of the canvas methods\n     * (either those of HTMLCanvasElement itself, or rendering context)\n     *\n     * @param {String} methodName Method to check support for;\n     *                            Could be one of \"setLineDash\"\n     * @return {Boolean | null} `true` if method is supported (or at least exists),\n     *                          `null` if canvas element or context can not be initialized\n     */\n    supports: function (methodName) {\n      var el = createCanvasElement();\n\n      if (!el || !el.getContext) {\n        return null;\n      }\n\n      var ctx = el.getContext('2d');\n      if (!ctx) {\n        return null;\n      }\n\n      switch (methodName) {\n\n        case 'setLineDash':\n          return typeof ctx.setLineDash !== 'undefined';\n\n        default:\n          return null;\n      }\n    }\n  });\n\n  /**\n   * Returns Object representation of canvas\n   * this alias is provided because if you call JSON.stringify on an instance,\n   * the toJSON object will be invoked if it exists.\n   * Having a toJSON method means you can do JSON.stringify(myCanvas)\n   * @function\n   * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n   * @return {Object} JSON compatible object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n   * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n   * @example <caption>JSON without additional properties</caption>\n   * var json = canvas.toJSON();\n   * @example <caption>JSON with additional properties included</caption>\n   * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']);\n   * @example <caption>JSON without default values</caption>\n   * canvas.includeDefaultValues = false;\n   * var json = canvas.toJSON();\n   */\n  fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n  if (fabric.isLikelyNode) {\n    fabric.StaticCanvas.prototype.createPNGStream = function() {\n      var impl = getNodeCanvas(this.lowerCanvasEl);\n      return impl && impl.createPNGStream();\n    };\n    fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n      var impl = getNodeCanvas(this.lowerCanvasEl);\n      return impl && impl.createJPEGStream(opts);\n    };\n  }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n  /**\n   * Color of a brush\n   * @type String\n   * @default\n   */\n  color: 'rgb(0, 0, 0)',\n\n  /**\n   * Width of a brush, has to be a Number, no string literals\n   * @type Number\n   * @default\n   */\n  width: 1,\n\n  /**\n   * Shadow object representing shadow of this shape.\n   * <b>Backwards incompatibility note:</b> This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n   * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n   * @type fabric.Shadow\n   * @default\n   */\n  shadow: null,\n\n  /**\n   * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n   * @type String\n   * @default\n   */\n  strokeLineCap: 'round',\n\n  /**\n   * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n   * @type String\n   * @default\n   */\n  strokeLineJoin: 'round',\n\n  /**\n   * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n   * @type Number\n   * @default\n   */\n  strokeMiterLimit:         10,\n\n  /**\n   * Stroke Dash Array.\n   * @type Array\n   * @default\n   */\n  strokeDashArray: null,\n\n  /**\n   * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n   * @type Boolean\n   * @default false\n  */\n\n  limitedToCanvasSize: false,\n\n\n  /**\n   * Sets brush styles\n   * @private\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  _setBrushStyles: function (ctx) {\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = this.width;\n    ctx.lineCap = this.strokeLineCap;\n    ctx.miterLimit = this.strokeMiterLimit;\n    ctx.lineJoin = this.strokeLineJoin;\n    ctx.setLineDash(this.strokeDashArray || []);\n  },\n\n  /**\n   * Sets the transformation on given context\n   * @param {RenderingContext2d} ctx context to render on\n   * @private\n   */\n  _saveAndTransform: function(ctx) {\n    var v = this.canvas.viewportTransform;\n    ctx.save();\n    ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n  },\n\n  /**\n   * Sets brush shadow styles\n   * @private\n   */\n  _setShadow: function() {\n    if (!this.shadow) {\n      return;\n    }\n\n    var canvas = this.canvas,\n        shadow = this.shadow,\n        ctx = canvas.contextTop,\n        zoom = canvas.getZoom();\n    if (canvas && canvas._isRetinaScaling()) {\n      zoom *= fabric.devicePixelRatio;\n    }\n\n    ctx.shadowColor = shadow.color;\n    ctx.shadowBlur = shadow.blur * zoom;\n    ctx.shadowOffsetX = shadow.offsetX * zoom;\n    ctx.shadowOffsetY = shadow.offsetY * zoom;\n  },\n\n  needsFullRender: function() {\n    var color = new fabric.Color(this.color);\n    return color.getAlpha() < 1 || !!this.shadow;\n  },\n\n  /**\n   * Removes brush shadow styles\n   * @private\n   */\n  _resetShadow: function() {\n    var ctx = this.canvas.contextTop;\n\n    ctx.shadowColor = '';\n    ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n  },\n\n  /**\n   * Check is pointer is outside canvas boundaries\n   * @param {Object} pointer\n   * @private\n  */\n  _isOutSideCanvas: function(pointer) {\n    return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight();\n  }\n});\n\n\n(function() {\n  /**\n   * PencilBrush class\n   * @class fabric.PencilBrush\n   * @extends fabric.BaseBrush\n   */\n  fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n    /**\n     * Discard points that are less than `decimate` pixel distant from each other\n     * @type Number\n     * @default 0.4\n     */\n    decimate: 0.4,\n\n    /**\n     * Draws a straight line between last recorded point to current pointer\n     * Used for `shift` functionality\n     *\n     * @type boolean\n     * @default false\n     */\n    drawStraightLine: false,\n\n    /**\n     * The event modifier key that makes the brush draw a straight line.\n     * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n     * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null}\n     */\n    straightLineKey: 'shiftKey',\n\n    /**\n     * Constructor\n     * @param {fabric.Canvas} canvas\n     * @return {fabric.PencilBrush} Instance of a pencil brush\n     */\n    initialize: function(canvas) {\n      this.canvas = canvas;\n      this._points = [];\n    },\n\n    needsFullRender: function () {\n      return this.callSuper('needsFullRender') || this._hasStraightLine;\n    },\n\n    /**\n     * Invoked inside on mouse down and mouse move\n     * @param {Object} pointer\n     */\n    _drawSegment: function (ctx, p1, p2) {\n      var midPoint = p1.midPointFrom(p2);\n      ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n      return midPoint;\n    },\n\n    /**\n     * Invoked on mouse down\n     * @param {Object} pointer\n     */\n    onMouseDown: function(pointer, options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return;\n      }\n      this.drawStraightLine = options.e[this.straightLineKey];\n      this._prepareForDrawing(pointer);\n      // capture coordinates immediately\n      // this allows to draw dots (when movement never occurs)\n      this._captureDrawingPath(pointer);\n      this._render();\n    },\n\n    /**\n     * Invoked on mouse move\n     * @param {Object} pointer\n     */\n    onMouseMove: function(pointer, options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return;\n      }\n      this.drawStraightLine = options.e[this.straightLineKey];\n      if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n        return;\n      }\n      if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n        if (this.needsFullRender()) {\n          // redraw curve\n          // clear top canvas\n          this.canvas.clearContext(this.canvas.contextTop);\n          this._render();\n        }\n        else {\n          var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n          // draw the curve update\n          this._saveAndTransform(ctx);\n          if (this.oldEnd) {\n            ctx.beginPath();\n            ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n          }\n          this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n          ctx.stroke();\n          ctx.restore();\n        }\n      }\n    },\n\n    /**\n     * Invoked on mouse up\n     */\n    onMouseUp: function(options) {\n      if (!this.canvas._isMainEvent(options.e)) {\n        return true;\n      }\n      this.drawStraightLine = false;\n      this.oldEnd = undefined;\n      this._finalizeAndAddPath();\n      return false;\n    },\n\n    /**\n     * @private\n     * @param {Object} pointer Actual mouse position related to the canvas.\n     */\n    _prepareForDrawing: function(pointer) {\n\n      var p = new fabric.Point(pointer.x, pointer.y);\n\n      this._reset();\n      this._addPoint(p);\n      this.canvas.contextTop.moveTo(p.x, p.y);\n    },\n\n    /**\n     * @private\n     * @param {fabric.Point} point Point to be added to points array\n     */\n    _addPoint: function(point) {\n      if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n        return false;\n      }\n      if (this.drawStraightLine && this._points.length > 1) {\n        this._hasStraightLine = true;\n        this._points.pop();\n      }\n      this._points.push(point);\n      return true;\n    },\n\n    /**\n     * Clear points array and set contextTop canvas style.\n     * @private\n     */\n    _reset: function() {\n      this._points = [];\n      this._setBrushStyles(this.canvas.contextTop);\n      this._setShadow();\n      this._hasStraightLine = false;\n    },\n\n    /**\n     * @private\n     * @param {Object} pointer Actual mouse position related to the canvas.\n     */\n    _captureDrawingPath: function(pointer) {\n      var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n      return this._addPoint(pointerPoint);\n    },\n\n    /**\n     * Draw a smooth path on the topCanvas using quadraticCurveTo\n     * @private\n     * @param {CanvasRenderingContext2D} [ctx]\n     */\n    _render: function(ctx) {\n      var i, len,\n          p1 = this._points[0],\n          p2 = this._points[1];\n      ctx = ctx || this.canvas.contextTop;\n      this._saveAndTransform(ctx);\n      ctx.beginPath();\n      //if we only have 2 points in the path and they are the same\n      //it means that the user only clicked the canvas without moving the mouse\n      //then we should be drawing a dot. A path isn't drawn between two identical dots\n      //that's why we set them apart a bit\n      if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n        var width = this.width / 1000;\n        p1 = new fabric.Point(p1.x, p1.y);\n        p2 = new fabric.Point(p2.x, p2.y);\n        p1.x -= width;\n        p2.x += width;\n      }\n      ctx.moveTo(p1.x, p1.y);\n\n      for (i = 1, len = this._points.length; i < len; i++) {\n        // we pick the point between pi + 1 & pi + 2 as the\n        // end point and p1 as our control point.\n        this._drawSegment(ctx, p1, p2);\n        p1 = this._points[i];\n        p2 = this._points[i + 1];\n      }\n      // Draw last line as a straight line while\n      // we wait for the next point to be able to calculate\n      // the bezier control point\n      ctx.lineTo(p1.x, p1.y);\n      ctx.stroke();\n      ctx.restore();\n    },\n\n    /**\n     * Converts points to SVG path\n     * @param {Array} points Array of points\n     * @return {(string|number)[][]} SVG path commands\n     */\n    convertPointsToSVGPath: function (points) {\n      var correction = this.width / 1000;\n      return fabric.util.getSmoothPathFromPoints(points, correction);\n    },\n\n    /**\n     * @private\n     * @param {(string|number)[][]} pathData SVG path commands\n     * @returns {boolean}\n     */\n    _isEmptySVGPath: function (pathData) {\n      var pathString = fabric.util.joinPath(pathData);\n      return pathString === 'M 0 0 Q 0 0 0 0 L 0 0';\n    },\n\n    /**\n     * Creates fabric.Path object to add on canvas\n     * @param {(string|number)[][]} pathData Path data\n     * @return {fabric.Path} Path to add on canvas\n     */\n    createPath: function(pathData) {\n      var path = new fabric.Path(pathData, {\n        fill: null,\n        stroke: this.color,\n        strokeWidth: this.width,\n        strokeLineCap: this.strokeLineCap,\n        strokeMiterLimit: this.strokeMiterLimit,\n        strokeLineJoin: this.strokeLineJoin,\n        strokeDashArray: this.strokeDashArray,\n      });\n      if (this.shadow) {\n        this.shadow.affectStroke = true;\n        path.shadow = new fabric.Shadow(this.shadow);\n      }\n\n      return path;\n    },\n\n    /**\n     * Decimate points array with the decimate value\n     */\n    decimatePoints: function(points, distance) {\n      if (points.length <= 2) {\n        return points;\n      }\n      var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n          i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n          cDistance;\n      for (i = 1; i < l - 1; i++) {\n        cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n        if (cDistance >= adjustedDistance) {\n          lastPoint = points[i];\n          newPoints.push(lastPoint);\n        }\n      }\n      /**\n       * Add the last point from the original line to the end of the array.\n       * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n       */\n      newPoints.push(points[l]);\n      return newPoints;\n    },\n\n    /**\n     * On mouseup after drawing the path on contextTop canvas\n     * we use the points captured to create an new fabric path object\n     * and add it to the fabric canvas.\n     */\n    _finalizeAndAddPath: function() {\n      var ctx = this.canvas.contextTop;\n      ctx.closePath();\n      if (this.decimate) {\n        this._points = this.decimatePoints(this._points, this.decimate);\n      }\n      var pathData = this.convertPointsToSVGPath(this._points);\n      if (this._isEmptySVGPath(pathData)) {\n        // do not create 0 width/height paths, as they are\n        // rendered inconsistently across browsers\n        // Firefox 4, for example, renders a dot,\n        // whereas Chrome 10 renders nothing\n        this.canvas.requestRenderAll();\n        return;\n      }\n\n      var path = this.createPath(pathData);\n      this.canvas.clearContext(this.canvas.contextTop);\n      this.canvas.fire('before:path:created', { path: path });\n      this.canvas.add(path);\n      this.canvas.requestRenderAll();\n      path.setCoords();\n      this._resetShadow();\n\n\n      // fire event 'path' created\n      this.canvas.fire('path:created', { path: path });\n    }\n  });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n  /**\n   * Width of a brush\n   * @type Number\n   * @default\n   */\n  width: 10,\n\n  /**\n   * Constructor\n   * @param {fabric.Canvas} canvas\n   * @return {fabric.CircleBrush} Instance of a circle brush\n   */\n  initialize: function(canvas) {\n    this.canvas = canvas;\n    this.points = [];\n  },\n\n  /**\n   * Invoked inside on mouse down and mouse move\n   * @param {Object} pointer\n   */\n  drawDot: function(pointer) {\n    var point = this.addPoint(pointer),\n        ctx = this.canvas.contextTop;\n    this._saveAndTransform(ctx);\n    this.dot(ctx, point);\n    ctx.restore();\n  },\n\n  dot: function(ctx, point) {\n    ctx.fillStyle = point.fill;\n    ctx.beginPath();\n    ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n    ctx.closePath();\n    ctx.fill();\n  },\n\n  /**\n   * Invoked on mouse down\n   */\n  onMouseDown: function(pointer) {\n    this.points.length = 0;\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._setShadow();\n    this.drawDot(pointer);\n  },\n\n  /**\n   * Render the full state of the brush\n   * @private\n   */\n  _render: function() {\n    var ctx  = this.canvas.contextTop, i, len,\n        points = this.points;\n    this._saveAndTransform(ctx);\n    for (i = 0, len = points.length; i < len; i++) {\n      this.dot(ctx, points[i]);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * Invoked on mouse move\n   * @param {Object} pointer\n   */\n  onMouseMove: function(pointer) {\n    if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n      return;\n    }\n    if (this.needsFullRender()) {\n      this.canvas.clearContext(this.canvas.contextTop);\n      this.addPoint(pointer);\n      this._render();\n    }\n    else {\n      this.drawDot(pointer);\n    }\n  },\n\n  /**\n   * Invoked on mouse up\n   */\n  onMouseUp: function() {\n    var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n    this.canvas.renderOnAddRemove = false;\n\n    var circles = [];\n\n    for (i = 0, len = this.points.length; i < len; i++) {\n      var point = this.points[i],\n          circle = new fabric.Circle({\n            radius: point.radius,\n            left: point.x,\n            top: point.y,\n            originX: 'center',\n            originY: 'center',\n            fill: point.fill\n          });\n\n      this.shadow && (circle.shadow = new fabric.Shadow(this.shadow));\n\n      circles.push(circle);\n    }\n    var group = new fabric.Group(circles);\n    group.canvas = this.canvas;\n\n    this.canvas.fire('before:path:created', { path: group });\n    this.canvas.add(group);\n    this.canvas.fire('path:created', { path: group });\n\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._resetShadow();\n    this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n    this.canvas.requestRenderAll();\n  },\n\n  /**\n   * @param {Object} pointer\n   * @return {fabric.Point} Just added pointer point\n   */\n  addPoint: function(pointer) {\n    var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n        circleRadius = fabric.util.getRandomInt(\n          Math.max(0, this.width - 20), this.width + 20) / 2,\n\n        circleColor = new fabric.Color(this.color)\n          .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n          .toRgba();\n\n    pointerPoint.radius = circleRadius;\n    pointerPoint.fill = circleColor;\n\n    this.points.push(pointerPoint);\n\n    return pointerPoint;\n  }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n  /**\n   * Width of a spray\n   * @type Number\n   * @default\n   */\n  width:              10,\n\n  /**\n   * Density of a spray (number of dots per chunk)\n   * @type Number\n   * @default\n   */\n  density:            20,\n\n  /**\n   * Width of spray dots\n   * @type Number\n   * @default\n   */\n  dotWidth:           1,\n\n  /**\n   * Width variance of spray dots\n   * @type Number\n   * @default\n   */\n  dotWidthVariance:   1,\n\n  /**\n   * Whether opacity of a dot should be random\n   * @type Boolean\n   * @default\n   */\n  randomOpacity:        false,\n\n  /**\n   * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n   * @type Boolean\n   * @default\n   */\n  optimizeOverlapping:  true,\n\n  /**\n   * Constructor\n   * @param {fabric.Canvas} canvas\n   * @return {fabric.SprayBrush} Instance of a spray brush\n   */\n  initialize: function(canvas) {\n    this.canvas = canvas;\n    this.sprayChunks = [];\n  },\n\n  /**\n   * Invoked on mouse down\n   * @param {Object} pointer\n   */\n  onMouseDown: function(pointer) {\n    this.sprayChunks.length = 0;\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._setShadow();\n\n    this.addSprayChunk(pointer);\n    this.render(this.sprayChunkPoints);\n  },\n\n  /**\n   * Invoked on mouse move\n   * @param {Object} pointer\n   */\n  onMouseMove: function(pointer) {\n    if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n      return;\n    }\n    this.addSprayChunk(pointer);\n    this.render(this.sprayChunkPoints);\n  },\n\n  /**\n   * Invoked on mouse up\n   */\n  onMouseUp: function() {\n    var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n    this.canvas.renderOnAddRemove = false;\n\n    var rects = [];\n\n    for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n      var sprayChunk = this.sprayChunks[i];\n\n      for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n        var rect = new fabric.Rect({\n          width: sprayChunk[j].width,\n          height: sprayChunk[j].width,\n          left: sprayChunk[j].x + 1,\n          top: sprayChunk[j].y + 1,\n          originX: 'center',\n          originY: 'center',\n          fill: this.color\n        });\n        rects.push(rect);\n      }\n    }\n\n    if (this.optimizeOverlapping) {\n      rects = this._getOptimizedRects(rects);\n    }\n\n    var group = new fabric.Group(rects);\n    this.shadow && group.set('shadow', new fabric.Shadow(this.shadow));\n    this.canvas.fire('before:path:created', { path: group });\n    this.canvas.add(group);\n    this.canvas.fire('path:created', { path: group });\n\n    this.canvas.clearContext(this.canvas.contextTop);\n    this._resetShadow();\n    this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n    this.canvas.requestRenderAll();\n  },\n\n  /**\n   * @private\n   * @param {Array} rects\n   */\n  _getOptimizedRects: function(rects) {\n\n    // avoid creating duplicate rects at the same coordinates\n    var uniqueRects = { }, key, i, len;\n\n    for (i = 0, len = rects.length; i < len; i++) {\n      key = rects[i].left + '' + rects[i].top;\n      if (!uniqueRects[key]) {\n        uniqueRects[key] = rects[i];\n      }\n    }\n    var uniqueRectsArray = [];\n    for (key in uniqueRects) {\n      uniqueRectsArray.push(uniqueRects[key]);\n    }\n\n    return uniqueRectsArray;\n  },\n\n  /**\n   * Render new chunk of spray brush\n   */\n  render: function(sprayChunk) {\n    var ctx = this.canvas.contextTop, i, len;\n    ctx.fillStyle = this.color;\n\n    this._saveAndTransform(ctx);\n\n    for (i = 0, len = sprayChunk.length; i < len; i++) {\n      var point = sprayChunk[i];\n      if (typeof point.opacity !== 'undefined') {\n        ctx.globalAlpha = point.opacity;\n      }\n      ctx.fillRect(point.x, point.y, point.width, point.width);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * Render all spray chunks\n   */\n  _render: function() {\n    var ctx = this.canvas.contextTop, i, ilen;\n    ctx.fillStyle = this.color;\n\n    this._saveAndTransform(ctx);\n\n    for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n      this.render(this.sprayChunks[i]);\n    }\n    ctx.restore();\n  },\n\n  /**\n   * @param {Object} pointer\n   */\n  addSprayChunk: function(pointer) {\n    this.sprayChunkPoints = [];\n\n    var x, y, width, radius = this.width / 2, i;\n\n    for (i = 0; i < this.density; i++) {\n\n      x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n      y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n      if (this.dotWidthVariance) {\n        width = fabric.util.getRandomInt(\n          // bottom clamp width to 1\n          Math.max(1, this.dotWidth - this.dotWidthVariance),\n          this.dotWidth + this.dotWidthVariance);\n      }\n      else {\n        width = this.dotWidth;\n      }\n\n      var point = new fabric.Point(x, y);\n      point.width = width;\n\n      if (this.randomOpacity) {\n        point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n      }\n\n      this.sprayChunkPoints.push(point);\n    }\n\n    this.sprayChunks.push(this.sprayChunkPoints);\n  }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n  getPatternSrc: function() {\n\n    var dotWidth = 20,\n        dotDistance = 5,\n        patternCanvas = fabric.util.createCanvasElement(),\n        patternCtx = patternCanvas.getContext('2d');\n\n    patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n    patternCtx.fillStyle = this.color;\n    patternCtx.beginPath();\n    patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n    patternCtx.closePath();\n    patternCtx.fill();\n\n    return patternCanvas;\n  },\n\n  getPatternSrcFunction: function() {\n    return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n  },\n\n  /**\n   * Creates \"pattern\" instance property\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  getPattern: function(ctx) {\n    return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n  },\n\n  /**\n   * Sets brush styles\n   * @param {CanvasRenderingContext2D} ctx\n   */\n  _setBrushStyles: function(ctx) {\n    this.callSuper('_setBrushStyles', ctx);\n    ctx.strokeStyle = this.getPattern(ctx);\n  },\n\n  /**\n   * Creates path\n   */\n  createPath: function(pathData) {\n    var path = this.callSuper('createPath', pathData),\n        topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n    path.stroke = new fabric.Pattern({\n      source: this.source || this.getPatternSrcFunction(),\n      offsetX: -topLeft.x,\n      offsetY: -topLeft.y\n    });\n    return path;\n  }\n});\n\n\n(function() {\n\n  var getPointer = fabric.util.getPointer,\n      degreesToRadians = fabric.util.degreesToRadians,\n      isTouchEvent = fabric.util.isTouchEvent;\n\n  /**\n   * Canvas class\n   * @class fabric.Canvas\n   * @extends fabric.StaticCanvas\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n   * @see {@link fabric.Canvas#initialize} for constructor definition\n   *\n   * @fires object:modified at the end of a transform or any change when statefull is true\n   * @fires object:rotating while an object is being rotated from the control\n   * @fires object:scaling while an object is being scaled by controls\n   * @fires object:moving while an object is being dragged\n   * @fires object:skewing while an object is being skewed from the controls\n   *\n   * @fires before:transform before a transform is is started\n   * @fires before:selection:cleared\n   * @fires selection:cleared\n   * @fires selection:updated\n   * @fires selection:created\n   *\n   * @fires path:created after a drawing operation ends and the path is added\n   * @fires mouse:down\n   * @fires mouse:move\n   * @fires mouse:up\n   * @fires mouse:down:before  on mouse down, before the inner fabric logic runs\n   * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n   * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n   * @fires mouse:over\n   * @fires mouse:out\n   * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n   *\n   * @fires dragover\n   * @fires dragenter\n   * @fires dragleave\n   * @fires drop:before before drop event. same native event. This is added to handle edge cases\n   * @fires drop\n   * @fires after:render at the end of the render process, receives the context in the callback\n   * @fires before:render at start the render process, receives the context in the callback\n   *\n   */\n  fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * Constructor\n     * @param {HTMLElement | String} el &lt;canvas> element to initialize instance on\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(el, options) {\n      options || (options = { });\n      this.renderAndResetBound = this.renderAndReset.bind(this);\n      this.requestRenderAllBound = this.requestRenderAll.bind(this);\n      this._initStatic(el, options);\n      this._initInteractive();\n      this._createCacheCanvas();\n    },\n\n    /**\n     * When true, objects can be transformed by one side (unproportionally)\n     * when dragged on the corners that normally would not do that.\n     * @type Boolean\n     * @default\n     * @since fabric 4.0 // changed name and default value\n     */\n    uniformScaling:      true,\n\n    /**\n     * Indicates which key switches uniform scaling.\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled.\n     * totally wrong named. this sounds like `uniform scaling`\n     * if Canvas.uniformScaling is true, pressing this will set it to false\n     * and viceversa.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    uniScaleKey:           'shiftKey',\n\n    /**\n     * When true, objects use center point as the origin of scale transformation.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredScaling:        false,\n\n    /**\n     * When true, objects use center point as the origin of rotate transformation.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredRotation:       false,\n\n    /**\n     * Indicates which key enable centered Transform\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled feature disabled.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    centeredKey:           'altKey',\n\n    /**\n     * Indicates which key enable alternate action on corner\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled feature disabled.\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    altActionKey:           'shiftKey',\n\n    /**\n     * Indicates that canvas is interactive. This property should not be changed.\n     * @type Boolean\n     * @default\n     */\n    interactive:            true,\n\n    /**\n     * Indicates whether group selection should be enabled\n     * @type Boolean\n     * @default\n     */\n    selection:              true,\n\n    /**\n     * Indicates which key or keys enable multiple click selection\n     * Pass value as a string or array of strings\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * If `null` or empty or containing any other string that is not a modifier key\n     * feature is disabled.\n     * @since 1.6.2\n     * @type String|Array\n     * @default\n     */\n    selectionKey:           'shiftKey',\n\n    /**\n     * Indicates which key enable alternative selection\n     * in case of target overlapping with active object\n     * values: 'altKey', 'shiftKey', 'ctrlKey'.\n     * For a series of reason that come from the general expectations on how\n     * things should work, this feature works only for preserveObjectStacking true.\n     * If `null` or 'none' or any other string that is not a modifier key\n     * feature is disabled.\n     * @since 1.6.5\n     * @type null|String\n     * @default\n     */\n    altSelectionKey:           null,\n\n    /**\n     * Color of selection\n     * @type String\n     * @default\n     */\n    selectionColor:         'rgba(100, 100, 255, 0.3)', // blue\n\n    /**\n     * Default dash array pattern\n     * If not empty the selection border is dashed\n     * @type Array\n     */\n    selectionDashArray:     [],\n\n    /**\n     * Color of the border of selection (usually slightly darker than color of selection itself)\n     * @type String\n     * @default\n     */\n    selectionBorderColor:   'rgba(255, 255, 255, 0.3)',\n\n    /**\n     * Width of a line used in object/group selection\n     * @type Number\n     * @default\n     */\n    selectionLineWidth:     1,\n\n    /**\n     * Select only shapes that are fully contained in the dragged selection rectangle.\n     * @type Boolean\n     * @default\n     */\n    selectionFullyContained: false,\n\n    /**\n     * Default cursor value used when hovering over an object on canvas\n     * @type String\n     * @default\n     */\n    hoverCursor:            'move',\n\n    /**\n     * Default cursor value used when moving an object on canvas\n     * @type String\n     * @default\n     */\n    moveCursor:             'move',\n\n    /**\n     * Default cursor value used for the entire canvas\n     * @type String\n     * @default\n     */\n    defaultCursor:          'default',\n\n    /**\n     * Cursor value used during free drawing\n     * @type String\n     * @default\n     */\n    freeDrawingCursor:      'crosshair',\n\n    /**\n     * Cursor value used for disabled elements ( corners with disabled action )\n     * @type String\n     * @since 2.0.0\n     * @default\n     */\n    notAllowedCursor:         'not-allowed',\n\n    /**\n     * Default element class that's given to wrapper (div) element of canvas\n     * @type String\n     * @default\n     */\n    containerClass:         'canvas-container',\n\n    /**\n     * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n     * @type Boolean\n     * @default\n     */\n    perPixelTargetFind:     false,\n\n    /**\n     * Number of pixels around target pixel to tolerate (consider active) during object detection\n     * @type Number\n     * @default\n     */\n    targetFindTolerance:    0,\n\n    /**\n     * When true, target detection is skipped. Target detection will return always undefined.\n     * click selection won't work anymore, events will fire with no targets.\n     * if something is selected before setting it to true, it will be deselected at the first click.\n     * area selection will still work. check the `selection` property too.\n     * if you deactivate both, you should look into staticCanvas.\n     * @type Boolean\n     * @default\n     */\n    skipTargetFind:         false,\n\n    /**\n     * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n     * After mousedown, mousemove creates a shape,\n     * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n     * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n     * @type Boolean\n     * @default\n     */\n    isDrawingMode:          false,\n\n    /**\n     * Indicates whether objects should remain in current stack position when selected.\n     * When false objects are brought to top and rendered as part of the selection group\n     * @type Boolean\n     * @default\n     */\n    preserveObjectStacking: false,\n\n    /**\n     * Indicates the angle that an object will lock to while rotating.\n     * @type Number\n     * @since 1.6.7\n     * @default\n     */\n    snapAngle: 0,\n\n    /**\n     * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n     * When `null`, the snapThreshold will default to the snapAngle.\n     * @type null|Number\n     * @since 1.6.7\n     * @default\n     */\n    snapThreshold: null,\n\n    /**\n     * Indicates if the right click on canvas can output the context menu or not\n     * @type Boolean\n     * @since 1.6.5\n     * @default\n     */\n    stopContextMenu: false,\n\n    /**\n     * Indicates if the canvas can fire right click events\n     * @type Boolean\n     * @since 1.6.5\n     * @default\n     */\n    fireRightClick: false,\n\n    /**\n     * Indicates if the canvas can fire middle click events\n     * @type Boolean\n     * @since 1.7.8\n     * @default\n     */\n    fireMiddleClick: false,\n\n    /**\n     * Keep track of the subTargets for Mouse Events\n     * @type fabric.Object[]\n     */\n    targets: [],\n\n    /**\n     * When the option is enabled, PointerEvent is used instead of MouseEvent.\n     * @type Boolean\n     * @default\n     */\n    enablePointerEvents: false,\n\n    /**\n     * Keep track of the hovered target\n     * @type fabric.Object\n     * @private\n     */\n    _hoveredTarget: null,\n\n    /**\n     * hold the list of nested targets hovered\n     * @type fabric.Object[]\n     * @private\n     */\n    _hoveredTargets: [],\n\n    /**\n     * @private\n     */\n    _initInteractive: function() {\n      this._currentTransform = null;\n      this._groupSelector = null;\n      this._initWrapperElement();\n      this._createUpperCanvas();\n      this._initEventListeners();\n\n      this._initRetinaScaling();\n\n      this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n      this.calcOffset();\n    },\n\n    /**\n     * Divides objects in two groups, one to render immediately\n     * and one to render as activeGroup.\n     * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n     */\n    _chooseObjectsToRender: function() {\n      var activeObjects = this.getActiveObjects(),\n          object, objsToRender, activeGroupObjects;\n\n      if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n        objsToRender = [];\n        activeGroupObjects = [];\n        for (var i = 0, length = this._objects.length; i < length; i++) {\n          object = this._objects[i];\n          if (activeObjects.indexOf(object) === -1 ) {\n            objsToRender.push(object);\n          }\n          else {\n            activeGroupObjects.push(object);\n          }\n        }\n        if (activeObjects.length > 1) {\n          this._activeObject._objects = activeGroupObjects;\n        }\n        objsToRender.push.apply(objsToRender, activeGroupObjects);\n      }\n      else {\n        objsToRender = this._objects;\n      }\n      return objsToRender;\n    },\n\n    /**\n     * Renders both the top canvas and the secondary container canvas.\n     * @return {fabric.Canvas} instance\n     * @chainable\n     */\n    renderAll: function () {\n      if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n        this.clearContext(this.contextTop);\n        this.contextTopDirty = false;\n      }\n      if (this.hasLostContext) {\n        this.renderTopLayer(this.contextTop);\n        this.hasLostContext = false;\n      }\n      var canvasToDrawOn = this.contextContainer;\n      this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n      return this;\n    },\n\n    renderTopLayer: function(ctx) {\n      ctx.save();\n      if (this.isDrawingMode && this._isCurrentlyDrawing) {\n        this.freeDrawingBrush && this.freeDrawingBrush._render();\n        this.contextTopDirty = true;\n      }\n      // we render the top context - last object\n      if (this.selection && this._groupSelector) {\n        this._drawSelection(ctx);\n        this.contextTopDirty = true;\n      }\n      ctx.restore();\n    },\n\n    /**\n     * Method to render only the top canvas.\n     * Also used to render the group selection box.\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    renderTop: function () {\n      var ctx = this.contextTop;\n      this.clearContext(ctx);\n      this.renderTopLayer(ctx);\n      this.fire('after:render');\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _normalizePointer: function (object, pointer) {\n      var m = object.calcTransformMatrix(),\n          invertedM = fabric.util.invertTransform(m),\n          vptPointer = this.restorePointerVpt(pointer);\n      return fabric.util.transformPoint(vptPointer, invertedM);\n    },\n\n    /**\n     * Returns true if object is transparent at a certain location\n     * @param {fabric.Object} target Object to check\n     * @param {Number} x Left coordinate\n     * @param {Number} y Top coordinate\n     * @return {Boolean}\n     */\n    isTargetTransparent: function (target, x, y) {\n      // in case the target is the activeObject, we cannot execute this optimization\n      // because we need to draw controls too.\n      if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n        var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n            targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n            targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n        var isTransparent = fabric.util.isTransparent(\n          target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n        return isTransparent;\n      }\n\n      var ctx = this.contextCache,\n          originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n      target.selectionBackgroundColor = '';\n\n      this.clearContext(ctx);\n\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      target.render(ctx);\n      ctx.restore();\n\n      target.selectionBackgroundColor = originalColor;\n\n      var isTransparent = fabric.util.isTransparent(\n        ctx, x, y, this.targetFindTolerance);\n\n      return isTransparent;\n    },\n\n    /**\n     * takes an event and determines if selection key has been pressed\n     * @private\n     * @param {Event} e Event object\n     */\n    _isSelectionKeyPressed: function(e) {\n      var selectionKeyPressed = false;\n\n      if (Array.isArray(this.selectionKey)) {\n        selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n      }\n      else {\n        selectionKeyPressed = e[this.selectionKey];\n      }\n\n      return selectionKeyPressed;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _shouldClearSelection: function (e, target) {\n      var activeObjects = this.getActiveObjects(),\n          activeObject = this._activeObject;\n\n      return (\n        !target\n        ||\n        (target &&\n          activeObject &&\n          activeObjects.length > 1 &&\n          activeObjects.indexOf(target) === -1 &&\n          activeObject !== target &&\n          !this._isSelectionKeyPressed(e))\n        ||\n        (target && !target.evented)\n        ||\n        (target &&\n          !target.selectable &&\n          activeObject &&\n          activeObject !== target)\n      );\n    },\n\n    /**\n     * centeredScaling from object can't override centeredScaling from canvas.\n     * this should be fixed, since object setting should take precedence over canvas.\n     * also this should be something that will be migrated in the control properties.\n     * as ability to define the origin of the transformation that the control provide.\n     * @private\n     * @param {fabric.Object} target\n     * @param {String} action\n     * @param {Boolean} altKey\n     */\n    _shouldCenterTransform: function (target, action, altKey) {\n      if (!target) {\n        return;\n      }\n\n      var centerTransform;\n\n      if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {\n        centerTransform = this.centeredScaling || target.centeredScaling;\n      }\n      else if (action === 'rotate') {\n        centerTransform = this.centeredRotation || target.centeredRotation;\n      }\n\n      return centerTransform ? !altKey : altKey;\n    },\n\n    /**\n     * should disappear before release 4.0\n     * @private\n     */\n    _getOriginFromCorner: function(target, corner) {\n      var origin = {\n        x: target.originX,\n        y: target.originY\n      };\n\n      if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n        origin.x = 'right';\n      }\n      else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n        origin.x = 'left';\n      }\n\n      if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n        origin.y = 'bottom';\n      }\n      else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n        origin.y = 'top';\n      }\n      return origin;\n    },\n\n    /**\n     * @private\n     * @param {Boolean} alreadySelected true if target is already selected\n     * @param {String} corner a string representing the corner ml, mr, tl ...\n     * @param {Event} e Event object\n     * @param {fabric.Object} [target] inserted back to help overriding. Unused\n     */\n    _getActionFromCorner: function(alreadySelected, corner, e, target) {\n      if (!corner || !alreadySelected) {\n        return 'drag';\n      }\n      var control = target.controls[corner];\n      return control.getActionName(e, control, target);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _setupCurrentTransform: function (e, target, alreadySelected) {\n      if (!target) {\n        return;\n      }\n\n      var pointer = this.getPointer(e), corner = target.__corner,\n          control = target.controls[corner],\n          actionHandler = (alreadySelected && corner) ?\n            control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,\n          action = this._getActionFromCorner(alreadySelected, corner, e, target),\n          origin = this._getOriginFromCorner(target, corner),\n          altKey = e[this.centeredKey],\n          transform = {\n            target: target,\n            action: action,\n            actionHandler: actionHandler,\n            corner: corner,\n            scaleX: target.scaleX,\n            scaleY: target.scaleY,\n            skewX: target.skewX,\n            skewY: target.skewY,\n            // used by transation\n            offsetX: pointer.x - target.left,\n            offsetY: pointer.y - target.top,\n            originX: origin.x,\n            originY: origin.y,\n            ex: pointer.x,\n            ey: pointer.y,\n            lastX: pointer.x,\n            lastY: pointer.y,\n            // unsure they are useful anymore.\n            // left: target.left,\n            // top: target.top,\n            theta: degreesToRadians(target.angle),\n            // end of unsure\n            width: target.width * target.scaleX,\n            shiftKey: e.shiftKey,\n            altKey: altKey,\n            original: fabric.util.saveObjectTransform(target),\n          };\n\n      if (this._shouldCenterTransform(target, action, altKey)) {\n        transform.originX = 'center';\n        transform.originY = 'center';\n      }\n      transform.original.originX = origin.x;\n      transform.original.originY = origin.y;\n      this._currentTransform = transform;\n      this._beforeTransform(e);\n    },\n\n    /**\n     * Set the cursor type of the canvas element\n     * @param {String} value Cursor type of the canvas element.\n     * @see http://www.w3.org/TR/css3-ui/#cursor\n     */\n    setCursor: function (value) {\n      this.upperCanvasEl.style.cursor = value;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx to draw the selection on\n     */\n    _drawSelection: function (ctx) {\n      var selector = this._groupSelector,\n          viewportStart = new fabric.Point(selector.ex, selector.ey),\n          start = fabric.util.transformPoint(viewportStart, this.viewportTransform),\n          viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),\n          extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),\n          minX = Math.min(start.x, extent.x),\n          minY = Math.min(start.y, extent.y),\n          maxX = Math.max(start.x, extent.x),\n          maxY = Math.max(start.y, extent.y),\n          strokeOffset = this.selectionLineWidth / 2;\n\n      if (this.selectionColor) {\n        ctx.fillStyle = this.selectionColor;\n        ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n      }\n\n      if (!this.selectionLineWidth || !this.selectionBorderColor) {\n        return;\n      }\n      ctx.lineWidth = this.selectionLineWidth;\n      ctx.strokeStyle = this.selectionBorderColor;\n\n      minX += strokeOffset;\n      minY += strokeOffset;\n      maxX -= strokeOffset;\n      maxY -= strokeOffset;\n      // selection border\n      fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n      ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n    },\n\n    /**\n     * Method that determines what object we are clicking on\n     * the skipGroup parameter is for internal use, is needed for shift+click action\n     * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n     * or the outside part of the corner.\n     * @param {Event} e mouse event\n     * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n     * @return {fabric.Object} the target found\n     */\n    findTarget: function (e, skipGroup) {\n      if (this.skipTargetFind) {\n        return;\n      }\n\n      var ignoreZoom = true,\n          pointer = this.getPointer(e, ignoreZoom),\n          activeObject = this._activeObject,\n          aObjects = this.getActiveObjects(),\n          activeTarget, activeTargetSubs,\n          isTouch = isTouchEvent(e),\n          shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n      // first check current group (if one exists)\n      // active group does not check sub targets like normal groups.\n      // if active group just exits.\n      this.targets = [];\n\n      // if we hit the corner of an activeObject, let's return that.\n      if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {\n        return activeObject;\n      }\n      if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n        return activeObject;\n      }\n      if (aObjects.length === 1 &&\n        activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n        if (!this.preserveObjectStacking) {\n          return activeObject;\n        }\n        else {\n          activeTarget = activeObject;\n          activeTargetSubs = this.targets;\n          this.targets = [];\n        }\n      }\n      var target = this._searchPossibleTargets(this._objects, pointer);\n      if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n        target = activeTarget;\n        this.targets = activeTargetSubs;\n      }\n      return target;\n    },\n\n    /**\n     * Checks point is inside the object.\n     * @param {Object} [pointer] x,y object of point coordinates we want to check.\n     * @param {fabric.Object} obj Object to test against\n     * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n     * @return {Boolean} true if point is contained within an area of given object\n     * @private\n     */\n    _checkTarget: function(pointer, obj, globalPointer) {\n      if (obj &&\n          obj.visible &&\n          obj.evented &&\n          // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n          // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n          obj.containsPoint(pointer)\n      ) {\n        if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n          var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n          if (!isTransparent) {\n            return true;\n          }\n        }\n        else {\n          return true;\n        }\n      }\n    },\n\n    /**\n     * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n     * @param {Array} [objects] objects array to look into\n     * @param {Object} [pointer] x,y object of point coordinates we want to check.\n     * @return {fabric.Object} object that contains pointer\n     * @private\n     */\n    _searchPossibleTargets: function(objects, pointer) {\n      // Cache all targets where their bounding box contains point.\n      var target, i = objects.length, subTarget;\n      // Do not check for currently grouped objects, since we check the parent group itself.\n      // until we call this function specifically to search inside the activeGroup\n      while (i--) {\n        var objToCheck = objects[i];\n        var pointerToUse = objToCheck.group ?\n          this._normalizePointer(objToCheck.group, pointer) : pointer;\n        if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n          target = objects[i];\n          if (target.subTargetCheck && target instanceof fabric.Group) {\n            subTarget = this._searchPossibleTargets(target._objects, pointer);\n            subTarget && this.targets.push(subTarget);\n          }\n          break;\n        }\n      }\n      return target;\n    },\n\n    /**\n     * Returns pointer coordinates without the effect of the viewport\n     * @param {Object} pointer with \"x\" and \"y\" number values\n     * @return {Object} object with \"x\" and \"y\" number values\n     */\n    restorePointerVpt: function(pointer) {\n      return fabric.util.transformPoint(\n        pointer,\n        fabric.util.invertTransform(this.viewportTransform)\n      );\n    },\n\n    /**\n     * Returns pointer coordinates relative to canvas.\n     * Can return coordinates with or without viewportTransform.\n     * ignoreZoom false gives back coordinates that represent\n     * the point clicked on canvas element.\n     * ignoreZoom true gives back coordinates after being processed\n     * by the viewportTransform ( sort of coordinates of what is displayed\n     * on the canvas where you are clicking.\n     * ignoreZoom true = HTMLElement coordinates relative to top,left\n     * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n     * To interact with your shapes top and left you want to use ignoreZoom true\n     * most of the time, while ignoreZoom false will give you coordinates\n     * compatible with the object.oCoords system.\n     * of the time.\n     * @param {Event} e\n     * @param {Boolean} ignoreZoom\n     * @return {Object} object with \"x\" and \"y\" number values\n     */\n    getPointer: function (e, ignoreZoom) {\n      // return cached values if we are in the event processing chain\n      if (this._absolutePointer && !ignoreZoom) {\n        return this._absolutePointer;\n      }\n      if (this._pointer && ignoreZoom) {\n        return this._pointer;\n      }\n\n      var pointer = getPointer(e),\n          upperCanvasEl = this.upperCanvasEl,\n          bounds = upperCanvasEl.getBoundingClientRect(),\n          boundsWidth = bounds.width || 0,\n          boundsHeight = bounds.height || 0,\n          cssScale;\n\n      if (!boundsWidth || !boundsHeight ) {\n        if ('top' in bounds && 'bottom' in bounds) {\n          boundsHeight = Math.abs( bounds.top - bounds.bottom );\n        }\n        if ('right' in bounds && 'left' in bounds) {\n          boundsWidth = Math.abs( bounds.right - bounds.left );\n        }\n      }\n\n      this.calcOffset();\n      pointer.x = pointer.x - this._offset.left;\n      pointer.y = pointer.y - this._offset.top;\n      if (!ignoreZoom) {\n        pointer = this.restorePointerVpt(pointer);\n      }\n\n      var retinaScaling = this.getRetinaScaling();\n      if (retinaScaling !== 1) {\n        pointer.x /= retinaScaling;\n        pointer.y /= retinaScaling;\n      }\n\n      if (boundsWidth === 0 || boundsHeight === 0) {\n        // If bounds are not available (i.e. not visible), do not apply scale.\n        cssScale = { width: 1, height: 1 };\n      }\n      else {\n        cssScale = {\n          width: upperCanvasEl.width / boundsWidth,\n          height: upperCanvasEl.height / boundsHeight\n        };\n      }\n\n      return {\n        x: pointer.x * cssScale.width,\n        y: pointer.y * cssScale.height\n      };\n    },\n\n    /**\n     * @private\n     * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n     */\n    _createUpperCanvas: function () {\n      var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n          lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n      // there is no need to create a new upperCanvas element if we have already one.\n      if (upperCanvasEl) {\n        upperCanvasEl.className = '';\n      }\n      else {\n        upperCanvasEl = this._createCanvasElement();\n        this.upperCanvasEl = upperCanvasEl;\n      }\n      fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n      this.wrapperEl.appendChild(upperCanvasEl);\n\n      this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n      this._applyCanvasStyle(upperCanvasEl);\n      this.contextTop = upperCanvasEl.getContext('2d');\n    },\n\n    /**\n     * Returns context of top canvas where interactions are drawn\n     * @returns {CanvasRenderingContext2D}\n     */\n    getTopContext: function () {\n      return this.contextTop;\n    },\n\n    /**\n     * @private\n     */\n    _createCacheCanvas: function () {\n      this.cacheCanvasEl = this._createCanvasElement();\n      this.cacheCanvasEl.setAttribute('width', this.width);\n      this.cacheCanvasEl.setAttribute('height', this.height);\n      this.contextCache = this.cacheCanvasEl.getContext('2d');\n    },\n\n    /**\n     * @private\n     */\n    _initWrapperElement: function () {\n      this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n        'class': this.containerClass\n      });\n      fabric.util.setStyle(this.wrapperEl, {\n        width: this.width + 'px',\n        height: this.height + 'px',\n        position: 'relative'\n      });\n      fabric.util.makeElementUnselectable(this.wrapperEl);\n    },\n\n    /**\n     * @private\n     * @param {HTMLElement} element canvas element to apply styles on\n     */\n    _applyCanvasStyle: function (element) {\n      var width = this.width || element.width,\n          height = this.height || element.height;\n\n      fabric.util.setStyle(element, {\n        position: 'absolute',\n        width: width + 'px',\n        height: height + 'px',\n        left: 0,\n        top: 0,\n        'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n        '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n      });\n      element.width = width;\n      element.height = height;\n      fabric.util.makeElementUnselectable(element);\n    },\n\n    /**\n     * Copy the entire inline style from one element (fromEl) to another (toEl)\n     * @private\n     * @param {Element} fromEl Element style is copied from\n     * @param {Element} toEl Element copied style is applied to\n     */\n    _copyCanvasStyle: function (fromEl, toEl) {\n      toEl.style.cssText = fromEl.style.cssText;\n    },\n\n    /**\n     * Returns context of canvas where object selection is drawn\n     * @return {CanvasRenderingContext2D}\n     */\n    getSelectionContext: function() {\n      return this.contextTop;\n    },\n\n    /**\n     * Returns &lt;canvas> element on which object selection is drawn\n     * @return {HTMLCanvasElement}\n     */\n    getSelectionElement: function () {\n      return this.upperCanvasEl;\n    },\n\n    /**\n     * Returns currently active object\n     * @return {fabric.Object} active object\n     */\n    getActiveObject: function () {\n      return this._activeObject;\n    },\n\n    /**\n     * Returns an array with the current selected objects\n     * @return {fabric.Object} active object\n     */\n    getActiveObjects: function () {\n      var active = this._activeObject;\n      if (active) {\n        if (active.type === 'activeSelection' && active._objects) {\n          return active._objects.slice(0);\n        }\n        else {\n          return [active];\n        }\n      }\n      return [];\n    },\n\n    /**\n     * @private\n     * @param {fabric.Object} obj Object that was removed\n     */\n    _onObjectRemoved: function(obj) {\n      // removing active object should fire \"selection:cleared\" events\n      if (obj === this._activeObject) {\n        this.fire('before:selection:cleared', { target: obj });\n        this._discardActiveObject();\n        this.fire('selection:cleared', { target: obj });\n        obj.fire('deselected');\n      }\n      if (obj === this._hoveredTarget){\n        this._hoveredTarget = null;\n        this._hoveredTargets = [];\n      }\n      this.callSuper('_onObjectRemoved', obj);\n    },\n\n    /**\n     * @private\n     * Compares the old activeObject with the current one and fires correct events\n     * @param {fabric.Object} obj old activeObject\n     */\n    _fireSelectionEvents: function(oldObjects, e) {\n      var somethingChanged = false, objects = this.getActiveObjects(),\n          added = [], removed = [];\n      oldObjects.forEach(function(oldObject) {\n        if (objects.indexOf(oldObject) === -1) {\n          somethingChanged = true;\n          oldObject.fire('deselected', {\n            e: e,\n            target: oldObject\n          });\n          removed.push(oldObject);\n        }\n      });\n      objects.forEach(function(object) {\n        if (oldObjects.indexOf(object) === -1) {\n          somethingChanged = true;\n          object.fire('selected', {\n            e: e,\n            target: object\n          });\n          added.push(object);\n        }\n      });\n      if (oldObjects.length > 0 && objects.length > 0) {\n        somethingChanged && this.fire('selection:updated', {\n          e: e,\n          selected: added,\n          deselected: removed,\n        });\n      }\n      else if (objects.length > 0) {\n        this.fire('selection:created', {\n          e: e,\n          selected: added,\n        });\n      }\n      else if (oldObjects.length > 0) {\n        this.fire('selection:cleared', {\n          e: e,\n          deselected: removed,\n        });\n      }\n    },\n\n    /**\n     * Sets given object as the only active object on canvas\n     * @param {fabric.Object} object Object to set as an active one\n     * @param {Event} [e] Event (passed along when firing \"object:selected\")\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    setActiveObject: function (object, e) {\n      var currentActives = this.getActiveObjects();\n      this._setActiveObject(object, e);\n      this._fireSelectionEvents(currentActives, e);\n      return this;\n    },\n\n    /**\n     * This is a private method for now.\n     * This is supposed to be equivalent to setActiveObject but without firing\n     * any event. There is commitment to have this stay this way.\n     * This is the functional part of setActiveObject.\n     * @private\n     * @param {Object} object to set as active\n     * @param {Event} [e] Event (passed along when firing \"object:selected\")\n     * @return {Boolean} true if the selection happened\n     */\n    _setActiveObject: function(object, e) {\n      if (this._activeObject === object) {\n        return false;\n      }\n      if (!this._discardActiveObject(e, object)) {\n        return false;\n      }\n      if (object.onSelect({ e: e })) {\n        return false;\n      }\n      this._activeObject = object;\n      return true;\n    },\n\n    /**\n     * This is a private method for now.\n     * This is supposed to be equivalent to discardActiveObject but without firing\n     * any events. There is commitment to have this stay this way.\n     * This is the functional part of discardActiveObject.\n     * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n     * @param {Object} object to set as active\n     * @return {Boolean} true if the selection happened\n     * @private\n     */\n    _discardActiveObject: function(e, object) {\n      var obj = this._activeObject;\n      if (obj) {\n        // onDeselect return TRUE to cancel selection;\n        if (obj.onDeselect({ e: e, object: object })) {\n          return false;\n        }\n        this._activeObject = null;\n      }\n      return true;\n    },\n\n    /**\n     * Discards currently active object and fire events. If the function is called by fabric\n     * as a consequence of a mouse event, the event is passed as a parameter and\n     * sent to the fire function for the custom events. When used as a method the\n     * e param does not have any application.\n     * @param {event} e\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    discardActiveObject: function (e) {\n      var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n      if (currentActives.length) {\n        this.fire('before:selection:cleared', { target: activeObject, e: e });\n      }\n      this._discardActiveObject(e);\n      this._fireSelectionEvents(currentActives, e);\n      return this;\n    },\n\n    /**\n     * Clears a canvas element and removes all event listeners\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    dispose: function () {\n      var wrapper = this.wrapperEl;\n      this.removeListeners();\n      wrapper.removeChild(this.upperCanvasEl);\n      wrapper.removeChild(this.lowerCanvasEl);\n      this.contextCache = null;\n      this.contextTop = null;\n      ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n        fabric.util.cleanUpJsdomNode(this[element]);\n        this[element] = undefined;\n      }).bind(this));\n      if (wrapper.parentNode) {\n        wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n      }\n      delete this.wrapperEl;\n      fabric.StaticCanvas.prototype.dispose.call(this);\n      return this;\n    },\n\n    /**\n     * Clears all contexts (background, main, top) of an instance\n     * @return {fabric.Canvas} thisArg\n     * @chainable\n     */\n    clear: function () {\n      // this.discardActiveGroup();\n      this.discardActiveObject();\n      this.clearContext(this.contextTop);\n      return this.callSuper('clear');\n    },\n\n    /**\n     * Draws objects' controls (borders/controls)\n     * @param {CanvasRenderingContext2D} ctx Context to render controls on\n     */\n    drawControls: function(ctx) {\n      var activeObject = this._activeObject;\n\n      if (activeObject) {\n        activeObject._renderControls(ctx);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _toObject: function(instance, methodName, propertiesToInclude) {\n      //If the object is part of the current selection group, it should\n      //be transformed appropriately\n      //i.e. it should be serialised as it would appear if the selection group\n      //were to be destroyed.\n      var originalProperties = this._realizeGroupTransformOnObject(instance),\n          object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n      //Undo the damage we did by changing all of its properties\n      this._unwindGroupTransformOnObject(instance, originalProperties);\n      return object;\n    },\n\n    /**\n     * Realises an object's group transformation on it\n     * @private\n     * @param {fabric.Object} [instance] the object to transform (gets mutated)\n     * @returns the original values of instance which were changed\n     */\n    _realizeGroupTransformOnObject: function(instance) {\n      if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n        var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n        //Copy all the positionally relevant properties across now\n        var originalValues = {};\n        layoutProps.forEach(function(prop) {\n          originalValues[prop] = instance[prop];\n        });\n        fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());\n        return originalValues;\n      }\n      else {\n        return null;\n      }\n    },\n\n    /**\n     * Restores the changed properties of instance\n     * @private\n     * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n     * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n     */\n    _unwindGroupTransformOnObject: function(instance, originalValues) {\n      if (originalValues) {\n        instance.set(originalValues);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setSVGObject: function(markup, instance, reviver) {\n      //If the object is in a selection group, simulate what would happen to that\n      //object when the group is deselected\n      var originalProperties = this._realizeGroupTransformOnObject(instance);\n      this.callSuper('_setSVGObject', markup, instance, reviver);\n      this._unwindGroupTransformOnObject(instance, originalProperties);\n    },\n\n    setViewportTransform: function (vpt) {\n      if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n        this._activeObject.clearContextTop();\n      }\n      fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n    }\n  });\n\n  // copying static properties manually to work around Opera's bug,\n  // where \"prototype\" property is enumerable and overrides existing prototype\n  for (var prop in fabric.StaticCanvas) {\n    if (prop !== 'prototype') {\n      fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n    }\n  }\n})();\n\n\n(function() {\n\n  var addListener = fabric.util.addListener,\n      removeListener = fabric.util.removeListener,\n      RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n      addEventOptions = { passive: false };\n\n  function checkClick(e, value) {\n    return e.button && (e.button === value - 1);\n  }\n\n  fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * Contains the id of the touch event that owns the fabric transform\n     * @type Number\n     * @private\n     */\n    mainTouchId: null,\n\n    /**\n     * Adds mouse listeners to canvas\n     * @private\n     */\n    _initEventListeners: function () {\n      // in case we initialized the class twice. This should not happen normally\n      // but in some kind of applications where the canvas element may be changed\n      // this is a workaround to having double listeners.\n      this.removeListeners();\n      this._bindEvents();\n      this.addOrRemove(addListener, 'add');\n    },\n\n    /**\n     * return an event prefix pointer or mouse.\n     * @private\n     */\n    _getEventPrefix: function () {\n      return this.enablePointerEvents ? 'pointer' : 'mouse';\n    },\n\n    addOrRemove: function(functor, eventjsFunctor) {\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      functor(fabric.window, 'resize', this._onResize);\n      functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n      functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n      functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n      functor(canvasElement, 'wheel', this._onMouseWheel);\n      functor(canvasElement, 'contextmenu', this._onContextMenu);\n      functor(canvasElement, 'dblclick', this._onDoubleClick);\n      functor(canvasElement, 'dragover', this._onDragOver);\n      functor(canvasElement, 'dragenter', this._onDragEnter);\n      functor(canvasElement, 'dragleave', this._onDragLeave);\n      functor(canvasElement, 'drop', this._onDrop);\n      if (!this.enablePointerEvents) {\n        functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n      }\n      if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n        eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n        eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n        eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n        eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n        eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n      }\n    },\n\n    /**\n     * Removes all event listeners\n     */\n    removeListeners: function() {\n      this.addOrRemove(removeListener, 'remove');\n      // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n      var eventTypePrefix = this._getEventPrefix();\n      removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n      removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n    },\n\n    /**\n     * @private\n     */\n    _bindEvents: function() {\n      if (this.eventsBound) {\n        // for any reason we pass here twice we do not want to bind events twice.\n        return;\n      }\n      this._onMouseDown = this._onMouseDown.bind(this);\n      this._onTouchStart = this._onTouchStart.bind(this);\n      this._onMouseMove = this._onMouseMove.bind(this);\n      this._onMouseUp = this._onMouseUp.bind(this);\n      this._onTouchEnd = this._onTouchEnd.bind(this);\n      this._onResize = this._onResize.bind(this);\n      this._onGesture = this._onGesture.bind(this);\n      this._onDrag = this._onDrag.bind(this);\n      this._onShake = this._onShake.bind(this);\n      this._onLongPress = this._onLongPress.bind(this);\n      this._onOrientationChange = this._onOrientationChange.bind(this);\n      this._onMouseWheel = this._onMouseWheel.bind(this);\n      this._onMouseOut = this._onMouseOut.bind(this);\n      this._onMouseEnter = this._onMouseEnter.bind(this);\n      this._onContextMenu = this._onContextMenu.bind(this);\n      this._onDoubleClick = this._onDoubleClick.bind(this);\n      this._onDragOver = this._onDragOver.bind(this);\n      this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n      this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n      this._onDrop = this._onDrop.bind(this);\n      this.eventsBound = true;\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js gesture\n     * @param {Event} [self] Inner Event object\n     */\n    _onGesture: function(e, self) {\n      this.__onTransformGesture && this.__onTransformGesture(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js drag\n     * @param {Event} [self] Inner Event object\n     */\n    _onDrag: function(e, self) {\n      this.__onDrag && this.__onDrag(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on wheel event\n     */\n    _onMouseWheel: function(e) {\n      this.__onMouseWheel(e);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseOut: function(e) {\n      var target = this._hoveredTarget;\n      this.fire('mouse:out', { target: target, e: e });\n      this._hoveredTarget = null;\n      target && target.fire('mouseout', { e: e });\n\n      var _this = this;\n      this._hoveredTargets.forEach(function(_target){\n        _this.fire('mouse:out', { target: target, e: e });\n        _target && target.fire('mouseout', { e: e });\n      });\n      this._hoveredTargets = [];\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseenter\n     */\n    _onMouseEnter: function(e) {\n      // This find target and consequent 'mouse:over' is used to\n      // clear old instances on hovered target.\n      // calling findTarget has the side effect of killing target.__corner.\n      // as a short term fix we are not firing this if we are currently transforming.\n      // as a long term fix we need to separate the action of finding a target with the\n      // side effects we added to it.\n      if (!this._currentTransform && !this.findTarget(e)) {\n        this.fire('mouse:over', { target: null, e: e });\n        this._hoveredTarget = null;\n        this._hoveredTargets = [];\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js orientation change\n     * @param {Event} [self] Inner Event object\n     */\n    _onOrientationChange: function(e, self) {\n      this.__onOrientationChange && this.__onOrientationChange(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     * @param {Event} [self] Inner Event object\n     */\n    _onShake: function(e, self) {\n      this.__onShake && this.__onShake(e, self);\n    },\n\n    /**\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     * @param {Event} [self] Inner Event object\n     */\n    _onLongPress: function(e, self) {\n      this.__onLongPress && this.__onLongPress(e, self);\n    },\n\n    /**\n     * prevent default to allow drop event to be fired\n     * @private\n     * @param {Event} [e] Event object fired on Event.js shake\n     */\n    _onDragOver: function(e) {\n      e.preventDefault();\n      var target = this._simpleEventHandler('dragover', e);\n      this._fireEnterLeaveEvents(target, e);\n    },\n\n    /**\n     * `drop:before` is a an event that allow you to schedule logic\n     * before the `drop` event. Prefer `drop` event always, but if you need\n     * to run some drop-disabling logic on an event, since there is no way\n     * to handle event handlers ordering, use `drop:before`\n     * @param {Event} e\n     */\n    _onDrop: function (e) {\n      this._simpleEventHandler('drop:before', e);\n      return this._simpleEventHandler('drop', e);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onContextMenu: function (e) {\n      if (this.stopContextMenu) {\n        e.stopPropagation();\n        e.preventDefault();\n      }\n      return false;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onDoubleClick: function (e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'dblclick');\n      this._resetTransformEventData(e);\n    },\n\n    /**\n     * Return a the id of an event.\n     * returns either the pointerId or the identifier or 0 for the mouse event\n     * @private\n     * @param {Event} evt Event object\n     */\n    getPointerId: function(evt) {\n      var changedTouches = evt.changedTouches;\n\n      if (changedTouches) {\n        return changedTouches[0] && changedTouches[0].identifier;\n      }\n\n      if (this.enablePointerEvents) {\n        return evt.pointerId;\n      }\n\n      return -1;\n    },\n\n    /**\n     * Determines if an event has the id of the event that is considered main\n     * @private\n     * @param {evt} event Event object\n     */\n    _isMainEvent: function(evt) {\n      if (evt.isPrimary === true) {\n        return true;\n      }\n      if (evt.isPrimary === false) {\n        return false;\n      }\n      if (evt.type === 'touchend' && evt.touches.length === 0) {\n        return true;\n      }\n      if (evt.changedTouches) {\n        return evt.changedTouches[0].identifier === this.mainTouchId;\n      }\n      return true;\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onTouchStart: function(e) {\n      e.preventDefault();\n      if (this.mainTouchId === null) {\n        this.mainTouchId = this.getPointerId(e);\n      }\n      this.__onMouseDown(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n      // Unbind mousedown to prevent double triggers from touch devices\n      removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseDown: function (e) {\n      this.__onMouseDown(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n      addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onTouchEnd: function(e) {\n      if (e.touches.length > 0) {\n        // if there are still touches stop here\n        return;\n      }\n      this.__onMouseUp(e);\n      this._resetTransformEventData();\n      this.mainTouchId = null;\n      var eventTypePrefix = this._getEventPrefix();\n      removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n      removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n      var _this = this;\n      if (this._willAddMouseDown) {\n        clearTimeout(this._willAddMouseDown);\n      }\n      this._willAddMouseDown = setTimeout(function() {\n        // Wait 400ms before rebinding mousedown to prevent double triggers\n        // from touch devices\n        addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n        _this._willAddMouseDown = 0;\n      }, 400);\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    _onMouseUp: function (e) {\n      this.__onMouseUp(e);\n      this._resetTransformEventData();\n      var canvasElement = this.upperCanvasEl,\n          eventTypePrefix = this._getEventPrefix();\n      if (this._isMainEvent(e)) {\n        removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n        removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n        addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    _onMouseMove: function (e) {\n      !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n      this.__onMouseMove(e);\n    },\n\n    /**\n     * @private\n     */\n    _onResize: function () {\n      this.calcOffset();\n    },\n\n    /**\n     * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n     * @private\n     * @param {Object} target\n     */\n    _shouldRender: function(target) {\n      var activeObject = this._activeObject;\n\n      if (\n        !!activeObject !== !!target ||\n        (activeObject && target && (activeObject !== target))\n      ) {\n        // this covers: switch of target, from target to no target, selection of target\n        // multiSelection with key and mouse\n        return true;\n      }\n      else if (activeObject && activeObject.isEditing) {\n        // if we mouse up/down over a editing textbox a cursor change,\n        // there is no need to re render\n        return false;\n      }\n      return false;\n    },\n\n    /**\n     * Method that defines the actions when mouse is released on canvas.\n     * The method resets the currentTransform parameters, store the image corner\n     * position in the image object and render the canvas on top.\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    __onMouseUp: function (e) {\n      var target, transform = this._currentTransform,\n          groupSelector = this._groupSelector, shouldRender = false,\n          isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n      this._cacheTransformEventData(e);\n      target = this._target;\n      this._handleEvent(e, 'up:before');\n      // if right/middle click just fire events and return\n      // target undefined will make the _handleEvent search the target\n      if (checkClick(e, RIGHT_CLICK)) {\n        if (this.fireRightClick) {\n          this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n        }\n        return;\n      }\n\n      if (checkClick(e, MIDDLE_CLICK)) {\n        if (this.fireMiddleClick) {\n          this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n        }\n        this._resetTransformEventData();\n        return;\n      }\n\n      if (this.isDrawingMode && this._isCurrentlyDrawing) {\n        this._onMouseUpInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n      if (transform) {\n        this._finalizeCurrentTransform(e);\n        shouldRender = transform.actionPerformed;\n      }\n      if (!isClick) {\n        var targetWasActive = target === this._activeObject;\n        this._maybeGroupObjects(e);\n        if (!shouldRender) {\n          shouldRender = (\n            this._shouldRender(target) ||\n            (!targetWasActive && target === this._activeObject)\n          );\n        }\n      }\n      var corner, pointer;\n      if (target) {\n        corner = target._findTargetCorner(\n          this.getPointer(e, true),\n          fabric.util.isTouchEvent(e)\n        );\n        if (target.selectable && target !== this._activeObject && target.activeOn === 'up') {\n          this.setActiveObject(target, e);\n          shouldRender = true;\n        }\n        else {\n          var control = target.controls[corner],\n              mouseUpHandler = control && control.getMouseUpHandler(e, target, control);\n          if (mouseUpHandler) {\n            pointer = this.getPointer(e);\n            mouseUpHandler(e, transform, pointer.x, pointer.y);\n          }\n        }\n        target.isMoving = false;\n      }\n      // if we are ending up a transform on a different control or a new object\n      // fire the original mouse up from the corner that started the transform\n      if (transform && (transform.target !== target || transform.corner !== corner)) {\n        var originalControl = transform.target && transform.target.controls[transform.corner],\n            originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control);\n        pointer = pointer || this.getPointer(e);\n        originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y);\n      }\n      this._setCursorFromEvent(e, target);\n      this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n      this._groupSelector = null;\n      this._currentTransform = null;\n      // reset the target information about which corner is selected\n      target && (target.__corner = 0);\n      if (shouldRender) {\n        this.requestRenderAll();\n      }\n      else if (!isClick) {\n        this.renderTop();\n      }\n    },\n\n    /**\n     * @private\n     * Handle event firing for target and subtargets\n     * @param {Event} e event from mouse\n     * @param {String} eventType event to fire (up, down or move)\n     * @return {Fabric.Object} target return the the target found, for internal reasons.\n     */\n    _simpleEventHandler: function(eventType, e) {\n      var target = this.findTarget(e),\n          targets = this.targets,\n          options = {\n            e: e,\n            target: target,\n            subTargets: targets,\n          };\n      this.fire(eventType, options);\n      target && target.fire(eventType, options);\n      if (!targets) {\n        return target;\n      }\n      for (var i = 0; i < targets.length; i++) {\n        targets[i].fire(eventType, options);\n      }\n      return target;\n    },\n\n    /**\n     * @private\n     * Handle event firing for target and subtargets\n     * @param {Event} e event from mouse\n     * @param {String} eventType event to fire (up, down or move)\n     * @param {fabric.Object} targetObj receiving event\n     * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n     * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n     */\n    _handleEvent: function(e, eventType, button, isClick) {\n      var target = this._target,\n          targets = this.targets || [],\n          options = {\n            e: e,\n            target: target,\n            subTargets: targets,\n            button: button || LEFT_CLICK,\n            isClick: isClick || false,\n            pointer: this._pointer,\n            absolutePointer: this._absolutePointer,\n            transform: this._currentTransform\n          };\n      if (eventType === 'up') {\n        options.currentTarget = this.findTarget(e);\n        options.currentSubTargets = this.targets;\n      }\n      this.fire('mouse:' + eventType, options);\n      target && target.fire('mouse' + eventType, options);\n      for (var i = 0; i < targets.length; i++) {\n        targets[i].fire('mouse' + eventType, options);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n     */\n    _finalizeCurrentTransform: function(e) {\n\n      var transform = this._currentTransform,\n          target = transform.target,\n          options = {\n            e: e,\n            target: target,\n            transform: transform,\n            action: transform.action,\n          };\n\n      if (target._scaling) {\n        target._scaling = false;\n      }\n\n      target.setCoords();\n\n      if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n        this._fire('modified', options);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    _onMouseDownInDrawingMode: function(e) {\n      this._isCurrentlyDrawing = true;\n      if (this.getActiveObject()) {\n        this.discardActiveObject(e).requestRenderAll();\n      }\n      var pointer = this.getPointer(e);\n      this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n      this._handleEvent(e, 'down');\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    _onMouseMoveInDrawingMode: function(e) {\n      if (this._isCurrentlyDrawing) {\n        var pointer = this.getPointer(e);\n        this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n      }\n      this.setCursor(this.freeDrawingCursor);\n      this._handleEvent(e, 'move');\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object fired on mouseup\n     */\n    _onMouseUpInDrawingMode: function(e) {\n      var pointer = this.getPointer(e);\n      this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n      this._handleEvent(e, 'up');\n    },\n\n    /**\n     * Method that defines the actions when mouse is clicked on canvas.\n     * The method inits the currentTransform parameters and renders all the\n     * canvas so the current image can be placed on the top canvas and the rest\n     * in on the container one.\n     * @private\n     * @param {Event} e Event object fired on mousedown\n     */\n    __onMouseDown: function (e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'down:before');\n      var target = this._target;\n      // if right click just fire events\n      if (checkClick(e, RIGHT_CLICK)) {\n        if (this.fireRightClick) {\n          this._handleEvent(e, 'down', RIGHT_CLICK);\n        }\n        return;\n      }\n\n      if (checkClick(e, MIDDLE_CLICK)) {\n        if (this.fireMiddleClick) {\n          this._handleEvent(e, 'down', MIDDLE_CLICK);\n        }\n        return;\n      }\n\n      if (this.isDrawingMode) {\n        this._onMouseDownInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n\n      // ignore if some object is being transformed at this moment\n      if (this._currentTransform) {\n        return;\n      }\n\n      var pointer = this._pointer;\n      // save pointer for check in __onMouseUp event\n      this._previousPointer = pointer;\n      var shouldRender = this._shouldRender(target),\n          shouldGroup = this._shouldGroup(e, target);\n      if (this._shouldClearSelection(e, target)) {\n        this.discardActiveObject(e);\n      }\n      else if (shouldGroup) {\n        this._handleGrouping(e, target);\n        target = this._activeObject;\n      }\n\n      if (this.selection && (!target ||\n        (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n        this._groupSelector = {\n          ex: this._absolutePointer.x,\n          ey: this._absolutePointer.y,\n          top: 0,\n          left: 0\n        };\n      }\n\n      if (target) {\n        var alreadySelected = target === this._activeObject;\n        if (target.selectable && target.activeOn === 'down') {\n          this.setActiveObject(target, e);\n        }\n        var corner = target._findTargetCorner(\n          this.getPointer(e, true),\n          fabric.util.isTouchEvent(e)\n        );\n        target.__corner = corner;\n        if (target === this._activeObject && (corner || !shouldGroup)) {\n          this._setupCurrentTransform(e, target, alreadySelected);\n          var control = target.controls[corner],\n              pointer = this.getPointer(e),\n              mouseDownHandler = control && control.getMouseDownHandler(e, target, control);\n          if (mouseDownHandler) {\n            mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y);\n          }\n        }\n      }\n      this._handleEvent(e, 'down');\n      // we must renderAll so that we update the visuals\n      (shouldRender || shouldGroup) && this.requestRenderAll();\n    },\n\n    /**\n     * reset cache form common information needed during event processing\n     * @private\n     */\n    _resetTransformEventData: function() {\n      this._target = null;\n      this._pointer = null;\n      this._absolutePointer = null;\n    },\n\n    /**\n     * Cache common information needed during event processing\n     * @private\n     * @param {Event} e Event object fired on event\n     */\n    _cacheTransformEventData: function(e) {\n      // reset in order to avoid stale caching\n      this._resetTransformEventData();\n      this._pointer = this.getPointer(e, true);\n      this._absolutePointer = this.restorePointerVpt(this._pointer);\n      this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n    },\n\n    /**\n     * @private\n     */\n    _beforeTransform: function(e) {\n      var t = this._currentTransform;\n      this.stateful && t.target.saveState();\n      this.fire('before:transform', {\n        e: e,\n        transform: t,\n      });\n    },\n\n    /**\n     * Method that defines the actions when mouse is hovering the canvas.\n     * The currentTransform parameter will define whether the user is rotating/scaling/translating\n     * an image or neither of them (only hovering). A group selection is also possible and would cancel\n     * all any other type of action.\n     * In case of an image transformation only the top canvas will be rendered.\n     * @private\n     * @param {Event} e Event object fired on mousemove\n     */\n    __onMouseMove: function (e) {\n      this._handleEvent(e, 'move:before');\n      this._cacheTransformEventData(e);\n      var target, pointer;\n\n      if (this.isDrawingMode) {\n        this._onMouseMoveInDrawingMode(e);\n        return;\n      }\n\n      if (!this._isMainEvent(e)) {\n        return;\n      }\n\n      var groupSelector = this._groupSelector;\n\n      // We initially clicked in an empty area, so we draw a box for multiple selection\n      if (groupSelector) {\n        pointer = this._absolutePointer;\n\n        groupSelector.left = pointer.x - groupSelector.ex;\n        groupSelector.top = pointer.y - groupSelector.ey;\n\n        this.renderTop();\n      }\n      else if (!this._currentTransform) {\n        target = this.findTarget(e) || null;\n        this._setCursorFromEvent(e, target);\n        this._fireOverOutEvents(target, e);\n      }\n      else {\n        this._transformObject(e);\n      }\n      this._handleEvent(e, 'move');\n      this._resetTransformEventData();\n    },\n\n    /**\n     * Manage the mouseout, mouseover events for the fabric object on the canvas\n     * @param {Fabric.Object} target the target where the target from the mousemove event\n     * @param {Event} e Event object fired on mousemove\n     * @private\n     */\n    _fireOverOutEvents: function(target, e) {\n      var _hoveredTarget = this._hoveredTarget,\n          _hoveredTargets = this._hoveredTargets, targets = this.targets,\n          length = Math.max(_hoveredTargets.length, targets.length);\n\n      this.fireSyntheticInOutEvents(target, e, {\n        oldTarget: _hoveredTarget,\n        evtOut: 'mouseout',\n        canvasEvtOut: 'mouse:out',\n        evtIn: 'mouseover',\n        canvasEvtIn: 'mouse:over',\n      });\n      for (var i = 0; i < length; i++){\n        this.fireSyntheticInOutEvents(targets[i], e, {\n          oldTarget: _hoveredTargets[i],\n          evtOut: 'mouseout',\n          evtIn: 'mouseover',\n        });\n      }\n      this._hoveredTarget = target;\n      this._hoveredTargets = this.targets.concat();\n    },\n\n    /**\n     * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n     * @param {Fabric.Object} target the target where the target from the onDrag event\n     * @param {Event} e Event object fired on ondrag\n     * @private\n     */\n    _fireEnterLeaveEvents: function(target, e) {\n      var _draggedoverTarget = this._draggedoverTarget,\n          _hoveredTargets = this._hoveredTargets, targets = this.targets,\n          length = Math.max(_hoveredTargets.length, targets.length);\n\n      this.fireSyntheticInOutEvents(target, e, {\n        oldTarget: _draggedoverTarget,\n        evtOut: 'dragleave',\n        evtIn: 'dragenter',\n      });\n      for (var i = 0; i < length; i++) {\n        this.fireSyntheticInOutEvents(targets[i], e, {\n          oldTarget: _hoveredTargets[i],\n          evtOut: 'dragleave',\n          evtIn: 'dragenter',\n        });\n      }\n      this._draggedoverTarget = target;\n    },\n\n    /**\n     * Manage the synthetic in/out events for the fabric objects on the canvas\n     * @param {Fabric.Object} target the target where the target from the supported events\n     * @param {Event} e Event object fired\n     * @param {Object} config configuration for the function to work\n     * @param {String} config.targetName property on the canvas where the old target is stored\n     * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n     * @param {String} config.evtOut name of the event to fire for out\n     * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n     * @param {String} config.evtIn name of the event to fire for in\n     * @private\n     */\n    fireSyntheticInOutEvents: function(target, e, config) {\n      var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n          targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n      if (targetChanged) {\n        inOpt = { e: e, target: target, previousTarget: oldTarget };\n        outOpt = { e: e, target: oldTarget, nextTarget: target };\n      }\n      inFires = target && targetChanged;\n      outFires = oldTarget && targetChanged;\n      if (outFires) {\n        canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n        oldTarget.fire(config.evtOut, outOpt);\n      }\n      if (inFires) {\n        canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n        target.fire(config.evtIn, inOpt);\n      }\n    },\n\n    /**\n     * Method that defines actions when an Event Mouse Wheel\n     * @param {Event} e Event object fired on mouseup\n     */\n    __onMouseWheel: function(e) {\n      this._cacheTransformEventData(e);\n      this._handleEvent(e, 'wheel');\n      this._resetTransformEventData();\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event fired on mousemove\n     */\n    _transformObject: function(e) {\n      var pointer = this.getPointer(e),\n          transform = this._currentTransform;\n\n      transform.reset = false;\n      transform.shiftKey = e.shiftKey;\n      transform.altKey = e[this.centeredKey];\n\n      this._performTransformAction(e, transform, pointer);\n      transform.actionPerformed && this.requestRenderAll();\n    },\n\n    /**\n     * @private\n     */\n    _performTransformAction: function(e, transform, pointer) {\n      var x = pointer.x,\n          y = pointer.y,\n          action = transform.action,\n          actionPerformed = false,\n          actionHandler = transform.actionHandler;\n          // this object could be created from the function in the control handlers\n\n\n      if (actionHandler) {\n        actionPerformed = actionHandler(e, transform, x, y);\n      }\n      if (action === 'drag' && actionPerformed) {\n        transform.target.isMoving = true;\n        this.setCursor(transform.target.moveCursor || this.moveCursor);\n      }\n      transform.actionPerformed = transform.actionPerformed || actionPerformed;\n    },\n\n    /**\n     * @private\n     */\n    _fire: fabric.controlsUtils.fireEvent,\n\n    /**\n     * Sets the cursor depending on where the canvas is being hovered.\n     * Note: very buggy in Opera\n     * @param {Event} e Event object\n     * @param {Object} target Object that the mouse is hovering, if so.\n     */\n    _setCursorFromEvent: function (e, target) {\n      if (!target) {\n        this.setCursor(this.defaultCursor);\n        return false;\n      }\n      var hoverCursor = target.hoverCursor || this.hoverCursor,\n          activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n            this._activeObject : null,\n          // only show proper corner when group selection is not active\n          corner = (!activeSelection || !activeSelection.contains(target))\n          // here we call findTargetCorner always with undefined for the touch parameter.\n          // we assume that if you are using a cursor you do not need to interact with\n          // the bigger touch area.\n                    && target._findTargetCorner(this.getPointer(e, true));\n\n      if (!corner) {\n        if (target.subTargetCheck){\n          // hoverCursor should come from top-most subTarget,\n          // so we walk the array backwards\n          this.targets.concat().reverse().map(function(_target){\n            hoverCursor = _target.hoverCursor || hoverCursor;\n          });\n        }\n        this.setCursor(hoverCursor);\n      }\n      else {\n        this.setCursor(this.getCornerCursor(corner, target, e));\n      }\n    },\n\n    /**\n     * @private\n     */\n    getCornerCursor: function(corner, target, e) {\n      var control = target.controls[corner];\n      return control.cursorStyleHandler(e, control, target);\n    }\n  });\n})();\n\n\n(function() {\n\n  var min = Math.min,\n      max = Math.max;\n\n  fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     * @return {Boolean}\n     */\n    _shouldGroup: function(e, target) {\n      var activeObject = this._activeObject;\n      return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n            (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n    },\n\n    /**\n     * @private\n     * @param {Event} e Event object\n     * @param {fabric.Object} target\n     */\n    _handleGrouping: function (e, target) {\n      var activeObject = this._activeObject;\n      // avoid multi select when shift click on a corner\n      if (activeObject.__corner) {\n        return;\n      }\n      if (target === activeObject) {\n        // if it's a group, find target again, using activeGroup objects\n        target = this.findTarget(e, true);\n        // if even object is not found or we are on activeObjectCorner, bail out\n        if (!target || !target.selectable) {\n          return;\n        }\n      }\n      if (activeObject && activeObject.type === 'activeSelection') {\n        this._updateActiveSelection(target, e);\n      }\n      else {\n        this._createActiveSelection(target, e);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _updateActiveSelection: function(target, e) {\n      var activeSelection = this._activeObject,\n          currentActiveObjects = activeSelection._objects.slice(0);\n      if (activeSelection.contains(target)) {\n        activeSelection.removeWithUpdate(target);\n        this._hoveredTarget = target;\n        this._hoveredTargets = this.targets.concat();\n        if (activeSelection.size() === 1) {\n          // activate last remaining object\n          this._setActiveObject(activeSelection.item(0), e);\n        }\n      }\n      else {\n        activeSelection.addWithUpdate(target);\n        this._hoveredTarget = activeSelection;\n        this._hoveredTargets = this.targets.concat();\n      }\n      this._fireSelectionEvents(currentActiveObjects, e);\n    },\n\n    /**\n     * @private\n     */\n    _createActiveSelection: function(target, e) {\n      var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n      this._hoveredTarget = group;\n      // ISSUE 4115: should we consider subTargets here?\n      // this._hoveredTargets = [];\n      // this._hoveredTargets = this.targets.concat();\n      this._setActiveObject(group, e);\n      this._fireSelectionEvents(currentActives, e);\n    },\n\n    /**\n     * @private\n     * @param {Object} target\n     */\n    _createGroup: function(target) {\n      var objects = this._objects,\n          isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n          groupObjects = isActiveLower\n            ? [this._activeObject, target]\n            : [target, this._activeObject];\n      this._activeObject.isEditing && this._activeObject.exitEditing();\n      return new fabric.ActiveSelection(groupObjects, {\n        canvas: this\n      });\n    },\n\n    /**\n     * @private\n     * @param {Event} e mouse event\n     */\n    _groupSelectedObjects: function (e) {\n\n      var group = this._collectObjects(e),\n          aGroup;\n\n      // do not create group for 1 element only\n      if (group.length === 1) {\n        this.setActiveObject(group[0], e);\n      }\n      else if (group.length > 1) {\n        aGroup = new fabric.ActiveSelection(group.reverse(), {\n          canvas: this\n        });\n        this.setActiveObject(aGroup, e);\n      }\n    },\n\n    /**\n     * @private\n     */\n    _collectObjects: function(e) {\n      var group = [],\n          currentObject,\n          x1 = this._groupSelector.ex,\n          y1 = this._groupSelector.ey,\n          x2 = x1 + this._groupSelector.left,\n          y2 = y1 + this._groupSelector.top,\n          selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n          selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n          allowIntersect = !this.selectionFullyContained,\n          isClick = x1 === x2 && y1 === y2;\n      // we iterate reverse order to collect top first in case of click.\n      for (var i = this._objects.length; i--; ) {\n        currentObject = this._objects[i];\n\n        if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n          continue;\n        }\n\n        if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) ||\n            currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) ||\n            (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) ||\n            (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true))\n        ) {\n          group.push(currentObject);\n          // only add one object if it's a click\n          if (isClick) {\n            break;\n          }\n        }\n      }\n\n      if (group.length > 1) {\n        group = group.filter(function(object) {\n          return !object.onSelect({ e: e });\n        });\n      }\n\n      return group;\n    },\n\n    /**\n     * @private\n     */\n    _maybeGroupObjects: function(e) {\n      if (this.selection && this._groupSelector) {\n        this._groupSelectedObjects(e);\n      }\n      this.setCursor(this.defaultCursor);\n      // clear selection and current transformation\n      this._groupSelector = null;\n    }\n  });\n\n})();\n\n\n(function () {\n  fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n    /**\n     * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n     * @param {Object} [options] Options object\n     * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n     * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n     * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n     * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n     * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n     * @example <caption>Generate jpeg dataURL with lower quality</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'jpeg',\n     *   quality: 0.8\n     * });\n     * @example <caption>Generate cropped png dataURL (clipping of canvas)</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'png',\n     *   left: 100,\n     *   top: 100,\n     *   width: 200,\n     *   height: 200\n     * });\n     * @example <caption>Generate double scaled png dataURL</caption>\n     * var dataURL = canvas.toDataURL({\n     *   format: 'png',\n     *   multiplier: 2\n     * });\n     */\n    toDataURL: function (options) {\n      options || (options = { });\n\n      var format = options.format || 'png',\n          quality = options.quality || 1,\n          multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n          canvasEl = this.toCanvasElement(multiplier, options);\n      return fabric.util.toDataURL(canvasEl, format, quality);\n    },\n\n    /**\n     * Create a new HTMLCanvas element painted with the current canvas content.\n     * No need to resize the actual one or repaint it.\n     * Will transfer object ownership to a new canvas, paint it, and set everything back.\n     * This is an intermediary step used to get to a dataUrl but also it is useful to\n     * create quick image copies of a canvas without passing for the dataUrl string\n     * @param {Number} [multiplier] a zoom factor.\n     * @param {Object} [cropping] Cropping informations\n     * @param {Number} [cropping.left] Cropping left offset.\n     * @param {Number} [cropping.top] Cropping top offset.\n     * @param {Number} [cropping.width] Cropping width.\n     * @param {Number} [cropping.height] Cropping height.\n     */\n    toCanvasElement: function(multiplier, cropping) {\n      multiplier = multiplier || 1;\n      cropping = cropping || { };\n      var scaledWidth = (cropping.width || this.width) * multiplier,\n          scaledHeight = (cropping.height || this.height) * multiplier,\n          zoom = this.getZoom(),\n          originalWidth = this.width,\n          originalHeight = this.height,\n          newZoom = zoom * multiplier,\n          vp = this.viewportTransform,\n          translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n          translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n          originalInteractive = this.interactive,\n          newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n          originalRetina = this.enableRetinaScaling,\n          canvasEl = fabric.util.createCanvasElement(),\n          originalContextTop = this.contextTop;\n      canvasEl.width = scaledWidth;\n      canvasEl.height = scaledHeight;\n      this.contextTop = null;\n      this.enableRetinaScaling = false;\n      this.interactive = false;\n      this.viewportTransform = newVp;\n      this.width = scaledWidth;\n      this.height = scaledHeight;\n      this.calcViewportBoundaries();\n      this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n      this.viewportTransform = vp;\n      this.width = originalWidth;\n      this.height = originalHeight;\n      this.calcViewportBoundaries();\n      this.interactive = originalInteractive;\n      this.enableRetinaScaling = originalRetina;\n      this.contextTop = originalContextTop;\n      return canvasEl;\n    },\n  });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n  /**\n   * Populates canvas with data from the specified JSON.\n   * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n   * @param {String|Object} json JSON string or object\n   * @param {Function} callback Callback, invoked when json is parsed\n   *                            and corresponding objects (e.g: {@link fabric.Image})\n   *                            are initialized\n   * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n   * @return {fabric.Canvas} instance\n   * @chainable\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n   * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n   * @example <caption>loadFromJSON</caption>\n   * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n   * @example <caption>loadFromJSON with reviver</caption>\n   * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n   *   // `o` = json object\n   *   // `object` = fabric.Object instance\n   *   // ... do some stuff ...\n   * });\n   */\n  loadFromJSON: function (json, callback, reviver) {\n    if (!json) {\n      return;\n    }\n\n    // serialize if it wasn't already\n    var serialized = (typeof json === 'string')\n      ? JSON.parse(json)\n      : fabric.util.object.clone(json);\n\n    var _this = this,\n        clipPath = serialized.clipPath,\n        renderOnAddRemove = this.renderOnAddRemove;\n\n    this.renderOnAddRemove = false;\n\n    delete serialized.clipPath;\n\n    this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n      _this.clear();\n      _this._setBgOverlay(serialized, function () {\n        if (clipPath) {\n          _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n            _this.clipPath = enlivenedCanvasClip[0];\n            _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n          });\n        }\n        else {\n          _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n        }\n      });\n    }, reviver);\n    return this;\n  },\n\n  /**\n   * @private\n   * @param {Object} serialized Object with background and overlay information\n   * @param {Array} restored canvas objects\n   * @param {Function} cached renderOnAddRemove callback\n   * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n   */\n  __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n    var _this = this;\n    enlivenedObjects.forEach(function(obj, index) {\n      // we splice the array just in case some custom classes restored from JSON\n      // will add more object to canvas at canvas init.\n      _this.insertAt(obj, index);\n    });\n    this.renderOnAddRemove = renderOnAddRemove;\n    // remove parts i cannot set as options\n    delete serialized.objects;\n    delete serialized.backgroundImage;\n    delete serialized.overlayImage;\n    delete serialized.background;\n    delete serialized.overlay;\n    // this._initOptions does too many things to just\n    // call it. Normally loading an Object from JSON\n    // create the Object instance. Here the Canvas is\n    // already an instance and we are just loading things over it\n    this._setOptions(serialized);\n    this.renderAll();\n    callback && callback();\n  },\n\n  /**\n   * @private\n   * @param {Object} serialized Object with background and overlay information\n   * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n   */\n  _setBgOverlay: function(serialized, callback) {\n    var loaded = {\n      backgroundColor: false,\n      overlayColor: false,\n      backgroundImage: false,\n      overlayImage: false\n    };\n\n    if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n      callback && callback();\n      return;\n    }\n\n    var cbIfLoaded = function () {\n      if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n        callback && callback();\n      }\n    };\n\n    this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n    this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n    this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n    this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n  },\n\n  /**\n   * @private\n   * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n   * @param {(Object|String)} value Value to set\n   * @param {Object} loaded Set loaded property to true if property is set\n   * @param {Object} callback Callback function to invoke after property is set\n   */\n  __setBgOverlay: function(property, value, loaded, callback) {\n    var _this = this;\n\n    if (!value) {\n      loaded[property] = true;\n      callback && callback();\n      return;\n    }\n\n    if (property === 'backgroundImage' || property === 'overlayImage') {\n      fabric.util.enlivenObjects([value], function(enlivedObject){\n        _this[property] = enlivedObject[0];\n        loaded[property] = true;\n        callback && callback();\n      });\n    }\n    else {\n      this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n        loaded[property] = true;\n        callback && callback();\n      });\n    }\n  },\n\n  /**\n   * @private\n   * @param {Array} objects\n   * @param {Function} callback\n   * @param {Function} [reviver]\n   */\n  _enlivenObjects: function (objects, callback, reviver) {\n    if (!objects || objects.length === 0) {\n      callback && callback([]);\n      return;\n    }\n\n    fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n      callback && callback(enlivenedObjects);\n    }, null, reviver);\n  },\n\n  /**\n   * @private\n   * @param {String} format\n   * @param {Function} callback\n   */\n  _toDataURL: function (format, callback) {\n    this.clone(function (clone) {\n      callback(clone.toDataURL(format));\n    });\n  },\n\n  /**\n   * @private\n   * @param {String} format\n   * @param {Number} multiplier\n   * @param {Function} callback\n   */\n  _toDataURLWithMultiplier: function (format, multiplier, callback) {\n    this.clone(function (clone) {\n      callback(clone.toDataURLWithMultiplier(format, multiplier));\n    });\n  },\n\n  /**\n   * Clones canvas instance\n   * @param {Object} [callback] Receives cloned instance as a first argument\n   * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n   */\n  clone: function (callback, properties) {\n    var data = JSON.stringify(this.toJSON(properties));\n    this.cloneWithoutData(function(clone) {\n      clone.loadFromJSON(data, function() {\n        callback && callback(clone);\n      });\n    });\n  },\n\n  /**\n   * Clones canvas instance without cloning existing data.\n   * This essentially copies canvas dimensions, clipping properties, etc.\n   * but leaves data empty (so that you can populate it with your own)\n   * @param {Object} [callback] Receives cloned instance as a first argument\n   */\n  cloneWithoutData: function(callback) {\n    var el = fabric.util.createCanvasElement();\n\n    el.width = this.width;\n    el.height = this.height;\n\n    var clone = new fabric.Canvas(el);\n    if (this.backgroundImage) {\n      clone.setBackgroundImage(this.backgroundImage.src, function() {\n        clone.renderAll();\n        callback && callback(clone);\n      });\n      clone.backgroundImageOpacity = this.backgroundImageOpacity;\n      clone.backgroundImageStretch = this.backgroundImageStretch;\n    }\n    else {\n      callback && callback(clone);\n    }\n  }\n});\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      toFixed = fabric.util.toFixed,\n      capitalize = fabric.util.string.capitalize,\n      degreesToRadians = fabric.util.degreesToRadians,\n      objectCaching = !fabric.isLikelyNode,\n      ALIASING_LIMIT = 2;\n\n  if (fabric.Object) {\n    return;\n  }\n\n  /**\n   * Root object class from which all 2d shape classes inherit from\n   * @class fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n   * @see {@link fabric.Object#initialize} for constructor definition\n   *\n   * @fires added\n   * @fires removed\n   *\n   * @fires selected\n   * @fires deselected\n   * @fires modified\n   * @fires modified\n   * @fires moved\n   * @fires scaled\n   * @fires rotated\n   * @fires skewed\n   *\n   * @fires rotating\n   * @fires scaling\n   * @fires moving\n   * @fires skewing\n   *\n   * @fires mousedown\n   * @fires mouseup\n   * @fires mouseover\n   * @fires mouseout\n   * @fires mousewheel\n   * @fires mousedblclick\n   *\n   * @fires dragover\n   * @fires dragenter\n   * @fires dragleave\n   * @fires drop\n   */\n  fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Type of an object (rect, circle, path, etc.).\n     * Note that this property is meant to be read-only and not meant to be modified.\n     * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n     * @type String\n     * @default\n     */\n    type:                     'object',\n\n    /**\n     * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n     * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n     * @type String\n     * @default\n     */\n    originX:                  'left',\n\n    /**\n     * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n     * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n     * @type String\n     * @default\n     */\n    originY:                  'top',\n\n    /**\n     * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n     * @type Number\n     * @default\n     */\n    top:                      0,\n\n    /**\n     * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n     * @type Number\n     * @default\n     */\n    left:                     0,\n\n    /**\n     * Object width\n     * @type Number\n     * @default\n     */\n    width:                    0,\n\n    /**\n     * Object height\n     * @type Number\n     * @default\n     */\n    height:                   0,\n\n    /**\n     * Object scale factor (horizontal)\n     * @type Number\n     * @default\n     */\n    scaleX:                   1,\n\n    /**\n     * Object scale factor (vertical)\n     * @type Number\n     * @default\n     */\n    scaleY:                   1,\n\n    /**\n     * When true, an object is rendered as flipped horizontally\n     * @type Boolean\n     * @default\n     */\n    flipX:                    false,\n\n    /**\n     * When true, an object is rendered as flipped vertically\n     * @type Boolean\n     * @default\n     */\n    flipY:                    false,\n\n    /**\n     * Opacity of an object\n     * @type Number\n     * @default\n     */\n    opacity:                  1,\n\n    /**\n     * Angle of rotation of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    angle:                    0,\n\n    /**\n     * Angle of skew on x axes of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    skewX:                    0,\n\n    /**\n     * Angle of skew on y axes of an object (in degrees)\n     * @type Number\n     * @default\n     */\n    skewY:                    0,\n\n    /**\n     * Size of object's controlling corners (in pixels)\n     * @type Number\n     * @default\n     */\n    cornerSize:               13,\n\n    /**\n     * Size of object's controlling corners when touch interaction is detected\n     * @type Number\n     * @default\n     */\n    touchCornerSize:               24,\n\n    /**\n     * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n     * @type Boolean\n     * @default\n     */\n    transparentCorners:       true,\n\n    /**\n     * Default cursor value used when hovering over this object on canvas\n     * @type String\n     * @default\n     */\n    hoverCursor:              null,\n\n    /**\n     * Default cursor value used when moving this object on canvas\n     * @type String\n     * @default\n     */\n    moveCursor:               null,\n\n    /**\n     * Padding between object and its controlling borders (in pixels)\n     * @type Number\n     * @default\n     */\n    padding:                  0,\n\n    /**\n     * Color of controlling borders of an object (when it's active)\n     * @type String\n     * @default\n     */\n    borderColor:              'rgb(178,204,255)',\n\n    /**\n     * Array specifying dash pattern of an object's borders (hasBorder must be true)\n     * @since 1.6.2\n     * @type Array\n     */\n    borderDashArray:          null,\n\n    /**\n     * Color of controlling corners of an object (when it's active)\n     * @type String\n     * @default\n     */\n    cornerColor:              'rgb(178,204,255)',\n\n    /**\n     * Color of controlling corners of an object (when it's active and transparentCorners false)\n     * @since 1.6.2\n     * @type String\n     * @default\n     */\n    cornerStrokeColor:        null,\n\n    /**\n     * Specify style of control, 'rect' or 'circle'\n     * @since 1.6.2\n     * @type String\n     */\n    cornerStyle:          'rect',\n\n    /**\n     * Array specifying dash pattern of an object's control (hasBorder must be true)\n     * @since 1.6.2\n     * @type Array\n     */\n    cornerDashArray:          null,\n\n    /**\n     * When true, this object will use center point as the origin of transformation\n     * when being scaled via the controls.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredScaling:          false,\n\n    /**\n     * When true, this object will use center point as the origin of transformation\n     * when being rotated via the controls.\n     * <b>Backwards incompatibility note:</b> This property replaces \"centerTransform\" (Boolean).\n     * @since 1.3.4\n     * @type Boolean\n     * @default\n     */\n    centeredRotation:         true,\n\n    /**\n     * Color of object's fill\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    fill:                     'rgb(0,0,0)',\n\n    /**\n     * Fill rule used to fill an object\n     * accepted values are nonzero, evenodd\n     * <b>Backwards incompatibility note:</b> This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n     * @type String\n     * @default\n     */\n    fillRule:                 'nonzero',\n\n    /**\n     * Composite rule used for canvas globalCompositeOperation\n     * @type String\n     * @default\n     */\n    globalCompositeOperation: 'source-over',\n\n    /**\n     * Background color of an object.\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    backgroundColor:          '',\n\n    /**\n     * Selection Background color of an object. colored layer behind the object when it is active.\n     * does not mix good with globalCompositeOperation methods.\n     * @type String\n     * @default\n     */\n    selectionBackgroundColor:          '',\n\n    /**\n     * When defined, an object is rendered via stroke and this property specifies its color\n     * takes css colors https://www.w3.org/TR/css-color-3/\n     * @type String\n     * @default\n     */\n    stroke:                   null,\n\n    /**\n     * Width of a stroke used to render this object\n     * @type Number\n     * @default\n     */\n    strokeWidth:              1,\n\n    /**\n     * Array specifying dash pattern of an object's stroke (stroke must be defined)\n     * @type Array\n     */\n    strokeDashArray:          null,\n\n    /**\n     * Line offset of an object's stroke\n     * @type Number\n     * @default\n     */\n    strokeDashOffset: 0,\n\n    /**\n     * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n     * @type String\n     * @default\n     */\n    strokeLineCap:            'butt',\n\n    /**\n     * Corner style of an object's stroke (one of \"bevel\", \"round\", \"miter\")\n     * @type String\n     * @default\n     */\n    strokeLineJoin:           'miter',\n\n    /**\n     * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n     * @type Number\n     * @default\n     */\n    strokeMiterLimit:         4,\n\n    /**\n     * Shadow object representing shadow of this shape\n     * @type fabric.Shadow\n     * @default\n     */\n    shadow:                   null,\n\n    /**\n     * Opacity of object's controlling borders when object is active and moving\n     * @type Number\n     * @default\n     */\n    borderOpacityWhenMoving:  0.4,\n\n    /**\n     * Scale factor of object's controlling borders\n     * bigger number will make a thicker border\n     * border is 1, so this is basically a border thickness\n     * since there is no way to change the border itself.\n     * @type Number\n     * @default\n     */\n    borderScaleFactor:        1,\n\n    /**\n     * Minimum allowed scale value of an object\n     * @type Number\n     * @default\n     */\n    minScaleLimit:            0,\n\n    /**\n     * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n     * But events still fire on it.\n     * @type Boolean\n     * @default\n     */\n    selectable:               true,\n\n    /**\n     * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n     * @type Boolean\n     * @default\n     */\n    evented:                  true,\n\n    /**\n     * When set to `false`, an object is not rendered on canvas\n     * @type Boolean\n     * @default\n     */\n    visible:                  true,\n\n    /**\n     * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n     * @type Boolean\n     * @default\n     */\n    hasControls:              true,\n\n    /**\n     * When set to `false`, object's controlling borders are not rendered\n     * @type Boolean\n     * @default\n     */\n    hasBorders:               true,\n\n    /**\n     * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n     * @type Boolean\n     * @default\n     */\n    perPixelTargetFind:       false,\n\n    /**\n     * When `false`, default object's values are not included in its serialization\n     * @type Boolean\n     * @default\n     */\n    includeDefaultValues:     true,\n\n    /**\n     * When `true`, object horizontal movement is locked\n     * @type Boolean\n     * @default\n     */\n    lockMovementX:            false,\n\n    /**\n     * When `true`, object vertical movement is locked\n     * @type Boolean\n     * @default\n     */\n    lockMovementY:            false,\n\n    /**\n     * When `true`, object rotation is locked\n     * @type Boolean\n     * @default\n     */\n    lockRotation:             false,\n\n    /**\n     * When `true`, object horizontal scaling is locked\n     * @type Boolean\n     * @default\n     */\n    lockScalingX:             false,\n\n    /**\n     * When `true`, object vertical scaling is locked\n     * @type Boolean\n     * @default\n     */\n    lockScalingY:             false,\n\n    /**\n     * When `true`, object horizontal skewing is locked\n     * @type Boolean\n     * @default\n     */\n    lockSkewingX:             false,\n\n    /**\n     * When `true`, object vertical skewing is locked\n     * @type Boolean\n     * @default\n     */\n    lockSkewingY:             false,\n\n    /**\n     * When `true`, object cannot be flipped by scaling into negative values\n     * @type Boolean\n     * @default\n     */\n    lockScalingFlip:          false,\n\n    /**\n     * When `true`, object is not exported in OBJECT/JSON\n     * @since 1.6.3\n     * @type Boolean\n     * @default\n     */\n    excludeFromExport:        false,\n\n    /**\n     * When `true`, object is cached on an additional canvas.\n     * When `false`, object is not cached unless necessary ( clipPath )\n     * default to true\n     * @since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    objectCaching:            objectCaching,\n\n    /**\n     * When `true`, object properties are checked for cache invalidation. In some particular\n     * situation you may want this to be disabled ( spray brush, very big, groups)\n     * or if your application does not allow you to modify properties for groups child you want\n     * to disable it for groups.\n     * default to false\n     * since 1.7.0\n     * @type Boolean\n     * @default false\n     */\n    statefullCache:            false,\n\n    /**\n     * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n     * too much and will be redrawn with correct details at the end of scaling.\n     * this setting is performance and application dependant.\n     * default to true\n     * since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    noScaleCache:              true,\n\n    /**\n     * When `false`, the stoke width will scale with the object.\n     * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n     * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods\n     * default to false\n     * @since 2.6.0\n     * @type Boolean\n     * @default false\n     * @type Boolean\n     * @default false\n     */\n    strokeUniform:              false,\n\n    /**\n     * When set to `true`, object's cache will be rerendered next render call.\n     * since 1.7.0\n     * @type Boolean\n     * @default true\n     */\n    dirty:                true,\n\n    /**\n     * keeps the value of the last hovered corner during mouse move.\n     * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n     * It should be private, but there is no harm in using it as\n     * a read-only property.\n     * @type number|string|any\n     * @default 0\n     */\n    __corner: 0,\n\n    /**\n     * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n     * @type String\n     * @default\n     */\n    paintFirst:           'fill',\n\n    /**\n     * When 'down', object is set to active on mousedown/touchstart\n     * When 'up', object is set to active on mouseup/touchend\n     * Experimental. Let's see if this breaks anything before supporting officially\n     * @private\n     * since 4.4.0\n     * @type String\n     * @default 'down'\n     */\n    activeOn:           'down',\n\n    /**\n     * List of properties to consider when checking if state\n     * of an object is changed (fabric.Object#hasStateChanged)\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: (\n      'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n      'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n      'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' +\n      'skewX skewY fillRule paintFirst clipPath strokeUniform'\n    ).split(' '),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n     * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n     * and refreshed at the next render\n     * @type Array\n     */\n    cacheProperties: (\n      'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n      ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n    ).split(' '),\n\n    /**\n     * List of properties to consider for animating colors.\n     * @type Array\n     */\n    colorProperties: (\n      'fill stroke backgroundColor'\n    ).split(' '),\n\n    /**\n     * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n     * the clipPath object gets used when the object has rendered, and the context is placed in the center\n     * of the object cacheCanvas.\n     * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n     * @type fabric.Object\n     */\n    clipPath: undefined,\n\n    /**\n     * Meaningful ONLY when the object is used as clipPath.\n     * if true, the clipPath will make the object clip to the outside of the clipPath\n     * since 2.4.0\n     * @type boolean\n     * @default false\n     */\n    inverted: false,\n\n    /**\n     * Meaningful ONLY when the object is used as clipPath.\n     * if true, the clipPath will have its top and left relative to canvas, and will\n     * not be influenced by the object transform. This will make the clipPath relative\n     * to the canvas, but clipping just a particular object.\n     * WARNING this is beta, this feature may change or be renamed.\n     * since 2.4.0\n     * @type boolean\n     * @default false\n     */\n    absolutePositioned: false,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      if (options) {\n        this.setOptions(options);\n      }\n    },\n\n    /**\n     * Create a the canvas used to keep the cached copy of the object\n     * @private\n     */\n    _createCacheCanvas: function() {\n      this._cacheProperties = {};\n      this._cacheCanvas = fabric.util.createCanvasElement();\n      this._cacheContext = this._cacheCanvas.getContext('2d');\n      this._updateCacheCanvas();\n      // if canvas gets created, is empty, so dirty.\n      this.dirty = true;\n    },\n\n    /**\n     * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n     * and each side do not cross fabric.cacheSideLimit\n     * those numbers are configurable so that you can get as much detail as you want\n     * making bargain with performances.\n     * @param {Object} dims\n     * @param {Object} dims.width width of canvas\n     * @param {Object} dims.height height of canvas\n     * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _limitCacheSize: function(dims) {\n      var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n          width = dims.width, height = dims.height,\n          max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n      if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n        if (width < min) {\n          dims.width = min;\n        }\n        if (height < min) {\n          dims.height = min;\n        }\n        return dims;\n      }\n      var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n          capValue = fabric.util.capValue,\n          x = capValue(min, limitedDims.x, max),\n          y = capValue(min, limitedDims.y, max);\n      if (width > x) {\n        dims.zoomX /= width / x;\n        dims.width = x;\n        dims.capped = true;\n      }\n      if (height > y) {\n        dims.zoomY /= height / y;\n        dims.height = y;\n        dims.capped = true;\n      }\n      return dims;\n    },\n\n    /**\n     * Return the dimension and the zoom level needed to create a cache canvas\n     * big enough to host the object to be cached.\n     * @private\n     * @return {Object}.x width of object to be cached\n     * @return {Object}.y height of object to be cached\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _getCacheCanvasDimensions: function() {\n      var objectScale = this.getTotalObjectScaling(),\n          // caculate dimensions without skewing\n          dim = this._getTransformedDimensions(0, 0),\n          neededX = dim.x * objectScale.scaleX / this.scaleX,\n          neededY = dim.y * objectScale.scaleY / this.scaleY;\n      return {\n        // for sure this ALIASING_LIMIT is slightly creating problem\n        // in situation in which the cache canvas gets an upper limit\n        // also objectScale contains already scaleX and scaleY\n        width: neededX + ALIASING_LIMIT,\n        height: neededY + ALIASING_LIMIT,\n        zoomX: objectScale.scaleX,\n        zoomY: objectScale.scaleY,\n        x: neededX,\n        y: neededY\n      };\n    },\n\n    /**\n     * Update width and height of the canvas for cache\n     * returns true or false if canvas needed resize.\n     * @private\n     * @return {Boolean} true if the canvas has been resized\n     */\n    _updateCacheCanvas: function() {\n      var targetCanvas = this.canvas;\n      if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n        var target = targetCanvas._currentTransform.target,\n            action = targetCanvas._currentTransform.action;\n        if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n          return false;\n        }\n      }\n      var canvas = this._cacheCanvas,\n          dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n          minCacheSize = fabric.minCacheSideLimit,\n          width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n          zoomX = dims.zoomX, zoomY = dims.zoomY,\n          dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n          zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n          shouldRedraw = dimensionsChanged || zoomChanged,\n          additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n      if (dimensionsChanged) {\n        var canvasWidth = this._cacheCanvas.width,\n            canvasHeight = this._cacheCanvas.height,\n            sizeGrowing = width > canvasWidth || height > canvasHeight,\n            sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n              canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n        shouldResizeCanvas = sizeGrowing || sizeShrinking;\n        if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n          additionalWidth = width * 0.1;\n          additionalHeight = height * 0.1;\n        }\n      }\n      if (this instanceof fabric.Text && this.path) {\n        shouldRedraw = true;\n        shouldResizeCanvas = true;\n        additionalWidth += this.getHeightOfLine(0) * this.zoomX;\n        additionalHeight += this.getHeightOfLine(0) * this.zoomY;\n      }\n      if (shouldRedraw) {\n        if (shouldResizeCanvas) {\n          canvas.width = Math.ceil(width + additionalWidth);\n          canvas.height = Math.ceil(height + additionalHeight);\n        }\n        else {\n          this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n          this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n        }\n        drawingWidth = dims.x / 2;\n        drawingHeight = dims.y / 2;\n        this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n        this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n        this.cacheWidth = width;\n        this.cacheHeight = height;\n        this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n        this._cacheContext.scale(zoomX, zoomY);\n        this.zoomX = zoomX;\n        this.zoomY = zoomY;\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Sets object's properties from options\n     * @param {Object} [options] Options object\n     */\n    setOptions: function(options) {\n      this._setOptions(options);\n      this._initGradient(options.fill, 'fill');\n      this._initGradient(options.stroke, 'stroke');\n      this._initPattern(options.fill, 'fill');\n      this._initPattern(options.stroke, 'stroke');\n    },\n\n    /**\n     * Transforms context when rendering an object\n     * @param {CanvasRenderingContext2D} ctx Context\n     */\n    transform: function(ctx) {\n      var needFullTransform = (this.group && !this.group._transformDone) ||\n         (this.group && this.canvas && ctx === this.canvas.contextTop);\n      var m = this.calcTransformMatrix(!needFullTransform);\n      ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n    },\n\n    /**\n     * Returns an object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n          object = {\n            type:                     this.type,\n            version:                  fabric.version,\n            originX:                  this.originX,\n            originY:                  this.originY,\n            left:                     toFixed(this.left, NUM_FRACTION_DIGITS),\n            top:                      toFixed(this.top, NUM_FRACTION_DIGITS),\n            width:                    toFixed(this.width, NUM_FRACTION_DIGITS),\n            height:                   toFixed(this.height, NUM_FRACTION_DIGITS),\n            fill:                     (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n            stroke:                   (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n            strokeWidth:              toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n            strokeDashArray:          this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n            strokeLineCap:            this.strokeLineCap,\n            strokeDashOffset:         this.strokeDashOffset,\n            strokeLineJoin:           this.strokeLineJoin,\n            strokeUniform:            this.strokeUniform,\n            strokeMiterLimit:         toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n            scaleX:                   toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n            scaleY:                   toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n            angle:                    toFixed(this.angle, NUM_FRACTION_DIGITS),\n            flipX:                    this.flipX,\n            flipY:                    this.flipY,\n            opacity:                  toFixed(this.opacity, NUM_FRACTION_DIGITS),\n            shadow:                   (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n            visible:                  this.visible,\n            backgroundColor:          this.backgroundColor,\n            fillRule:                 this.fillRule,\n            paintFirst:               this.paintFirst,\n            globalCompositeOperation: this.globalCompositeOperation,\n            skewX:                    toFixed(this.skewX, NUM_FRACTION_DIGITS),\n            skewY:                    toFixed(this.skewY, NUM_FRACTION_DIGITS),\n          };\n\n      if (this.clipPath && !this.clipPath.excludeFromExport) {\n        object.clipPath = this.clipPath.toObject(propertiesToInclude);\n        object.clipPath.inverted = this.clipPath.inverted;\n        object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n      }\n\n      fabric.util.populateWithProperties(this, object, propertiesToInclude);\n      if (!this.includeDefaultValues) {\n        object = this._removeDefaultValues(object);\n      }\n\n      return object;\n    },\n\n    /**\n     * Returns (dataless) object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      // will be overwritten by subclasses\n      return this.toObject(propertiesToInclude);\n    },\n\n    /**\n     * @private\n     * @param {Object} object\n     */\n    _removeDefaultValues: function(object) {\n      var prototype = fabric.util.getKlass(object.type).prototype,\n          stateProperties = prototype.stateProperties;\n      stateProperties.forEach(function(prop) {\n        if (prop === 'left' || prop === 'top') {\n          return;\n        }\n        if (object[prop] === prototype[prop]) {\n          delete object[prop];\n        }\n        // basically a check for [] === []\n        if (Array.isArray(object[prop]) && Array.isArray(prototype[prop])\n          && object[prop].length === 0 && prototype[prop].length === 0) {\n          delete object[prop];\n        }\n      });\n\n      return object;\n    },\n\n    /**\n     * Returns a string representation of an instance\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.' + capitalize(this.type) + '>';\n    },\n\n    /**\n     * Return the object scale factor counting also the group scaling\n     * @return {Object} object with scaleX and scaleY properties\n     */\n    getObjectScaling: function() {\n      // if the object is a top level one, on the canvas, we go for simple aritmetic\n      // otherwise the complex method with angles will return approximations and decimals\n      // and will likely kill the cache when not needed\n      // https://github.com/fabricjs/fabric.js/issues/7157\n      if (!this.group) {\n        return {\n          scaleX: this.scaleX,\n          scaleY: this.scaleY,\n        };\n      }\n      // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n      var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n      return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n    },\n\n    /**\n     * Return the object scale factor counting also the group scaling, zoom and retina\n     * @return {Object} object with scaleX and scaleY properties\n     */\n    getTotalObjectScaling: function() {\n      var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n      if (this.canvas) {\n        var zoom = this.canvas.getZoom();\n        var retina = this.canvas.getRetinaScaling();\n        scaleX *= zoom * retina;\n        scaleY *= zoom * retina;\n      }\n      return { scaleX: scaleX, scaleY: scaleY };\n    },\n\n    /**\n     * Return the object opacity counting also the group property\n     * @return {Number}\n     */\n    getObjectOpacity: function() {\n      var opacity = this.opacity;\n      if (this.group) {\n        opacity *= this.group.getObjectOpacity();\n      }\n      return opacity;\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Object} thisArg\n     */\n    _set: function(key, value) {\n      var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n          isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n      if (shouldConstrainValue) {\n        value = this._constrainScale(value);\n      }\n      if (key === 'scaleX' && value < 0) {\n        this.flipX = !this.flipX;\n        value *= -1;\n      }\n      else if (key === 'scaleY' && value < 0) {\n        this.flipY = !this.flipY;\n        value *= -1;\n      }\n      else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n        value = new fabric.Shadow(value);\n      }\n      else if (key === 'dirty' && this.group) {\n        this.group.set('dirty', value);\n      }\n\n      this[key] = value;\n\n      if (isChanged) {\n        groupNeedsUpdate = this.group && this.group.isOnACache();\n        if (this.cacheProperties.indexOf(key) > -1) {\n          this.dirty = true;\n          groupNeedsUpdate && this.group.set('dirty', true);\n        }\n        else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n          this.group.set('dirty', true);\n        }\n      }\n      return this;\n    },\n\n    /**\n     * This callback function is called by the parent group of an object every\n     * time a non-delegated property changes on the group. It is passed the key\n     * and value as parameters. Not adding in this function's signature to avoid\n     * Travis build error about unused variables.\n     */\n    setOnGroup: function() {\n      // implemented by sub-classes, as needed.\n    },\n\n    /**\n     * Retrieves viewportTransform from Object's canvas if possible\n     * @method getViewportTransform\n     * @memberOf fabric.Object.prototype\n     * @return {Array}\n     */\n    getViewportTransform: function() {\n      if (this.canvas && this.canvas.viewportTransform) {\n        return this.canvas.viewportTransform;\n      }\n      return fabric.iMatrix.concat();\n    },\n\n    /*\n     * @private\n     * return if the object would be visible in rendering\n     * @memberOf fabric.Object.prototype\n     * @return {Boolean}\n     */\n    isNotVisible: function() {\n      return this.opacity === 0 ||\n        (!this.width && !this.height && this.strokeWidth === 0) ||\n        !this.visible;\n    },\n\n    /**\n     * Renders an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      // do not render if width/height are zeros or object is not visible\n      if (this.isNotVisible()) {\n        return;\n      }\n      if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n        return;\n      }\n      ctx.save();\n      this._setupCompositeOperation(ctx);\n      this.drawSelectionBackground(ctx);\n      this.transform(ctx);\n      this._setOpacity(ctx);\n      this._setShadow(ctx, this);\n      if (this.shouldCache()) {\n        this.renderCache();\n        this.drawCacheOnCanvas(ctx);\n      }\n      else {\n        this._removeCacheCanvas();\n        this.dirty = false;\n        this.drawObject(ctx);\n        if (this.objectCaching && this.statefullCache) {\n          this.saveState({ propertySet: 'cacheProperties' });\n        }\n      }\n      ctx.restore();\n    },\n\n    renderCache: function(options) {\n      options = options || {};\n      if (!this._cacheCanvas || !this._cacheContext) {\n        this._createCacheCanvas();\n      }\n      if (this.isCacheDirty()) {\n        this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n        this.drawObject(this._cacheContext, options.forClipping);\n        this.dirty = false;\n      }\n    },\n\n    /**\n     * Remove cacheCanvas and its dimensions from the objects\n     */\n    _removeCacheCanvas: function() {\n      this._cacheCanvas = null;\n      this._cacheContext = null;\n      this.cacheWidth = 0;\n      this.cacheHeight = 0;\n    },\n\n    /**\n     * return true if the object will draw a stroke\n     * Does not consider text styles. This is just a shortcut used at rendering time\n     * We want it to be an approximation and be fast.\n     * wrote to avoid extra caching, it has to return true when stroke happens,\n     * can guess when it will not happen at 100% chance, does not matter if it misses\n     * some use case where the stroke is invisible.\n     * @since 3.0.0\n     * @returns Boolean\n     */\n    hasStroke: function() {\n      return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n    },\n\n    /**\n     * return true if the object will draw a fill\n     * Does not consider text styles. This is just a shortcut used at rendering time\n     * We want it to be an approximation and be fast.\n     * wrote to avoid extra caching, it has to return true when fill happens,\n     * can guess when it will not happen at 100% chance, does not matter if it misses\n     * some use case where the fill is invisible.\n     * @since 3.0.0\n     * @returns Boolean\n     */\n    hasFill: function() {\n      return this.fill && this.fill !== 'transparent';\n    },\n\n    /**\n     * When set to `true`, force the object to have its own cache, even if it is inside a group\n     * it may be needed when your object behave in a particular way on the cache and always needs\n     * its own isolated canvas to render correctly.\n     * Created to be overridden\n     * since 1.7.12\n     * @returns Boolean\n     */\n    needsItsOwnCache: function() {\n      if (this.paintFirst === 'stroke' &&\n        this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n        return true;\n      }\n      if (this.clipPath) {\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * objectCaching is a global flag, wins over everything\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      this.ownCaching = this.needsItsOwnCache() || (\n        this.objectCaching &&\n        (!this.group || !this.group.isOnACache())\n      );\n      return this.ownCaching;\n    },\n\n    /**\n     * Check if this object or a child object will cast a shadow\n     * used by Group.shouldCache to know if child has a shadow recursively\n     * @return {Boolean}\n     */\n    willDrawShadow: function() {\n      return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n    },\n\n    /**\n     * Execute the drawing operation for an object clipPath\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {fabric.Object} clipPath\n     */\n    drawClipPathOnCache: function(ctx, clipPath) {\n      ctx.save();\n      // DEBUG: uncomment this line, comment the following\n      // ctx.globalAlpha = 0.4\n      if (clipPath.inverted) {\n        ctx.globalCompositeOperation = 'destination-out';\n      }\n      else {\n        ctx.globalCompositeOperation = 'destination-in';\n      }\n      //ctx.scale(1 / 2, 1 / 2);\n      if (clipPath.absolutePositioned) {\n        var m = fabric.util.invertTransform(this.calcTransformMatrix());\n        ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n      }\n      clipPath.transform(ctx);\n      ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n      ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY);\n      ctx.restore();\n    },\n\n    /**\n     * Execute the drawing operation for an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawObject: function(ctx, forClipping) {\n      var originalFill = this.fill, originalStroke = this.stroke;\n      if (forClipping) {\n        this.fill = 'black';\n        this.stroke = '';\n        this._setClippingProperties(ctx);\n      }\n      else {\n        this._renderBackground(ctx);\n      }\n      this._render(ctx);\n      this._drawClipPath(ctx, this.clipPath);\n      this.fill = originalFill;\n      this.stroke = originalStroke;\n    },\n\n    /**\n     * Prepare clipPath state and cache and draw it on instance's cache\n     * @param {CanvasRenderingContext2D} ctx\n     * @param {fabric.Object} clipPath\n     */\n    _drawClipPath: function (ctx, clipPath) {\n      if (!clipPath) { return; }\n      // needed to setup a couple of variables\n      // path canvas gets overridden with this one.\n      // TODO find a better solution?\n      clipPath.canvas = this.canvas;\n      clipPath.shouldCache();\n      clipPath._transformDone = true;\n      clipPath.renderCache({ forClipping: true });\n      this.drawClipPathOnCache(ctx, clipPath);\n    },\n\n    /**\n     * Paint the cached copy of the object on the target context.\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawCacheOnCanvas: function(ctx) {\n      ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n      ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n    },\n\n    /**\n     * Check if cache is dirty\n     * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n     * on parent canvas.\n     */\n    isCacheDirty: function(skipCanvas) {\n      if (this.isNotVisible()) {\n        return false;\n      }\n      if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) {\n        // in this case the context is already cleared.\n        return true;\n      }\n      else {\n        if (this.dirty ||\n          (this.clipPath && this.clipPath.absolutePositioned) ||\n          (this.statefullCache && this.hasStateChanged('cacheProperties'))\n        ) {\n          if (this._cacheCanvas && this._cacheContext && !skipCanvas) {\n            var width = this.cacheWidth / this.zoomX;\n            var height = this.cacheHeight / this.zoomY;\n            this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n          }\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Draws a background for the object big as its untransformed dimensions\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderBackground: function(ctx) {\n      if (!this.backgroundColor) {\n        return;\n      }\n      var dim = this._getNonTransformedDimensions();\n      ctx.fillStyle = this.backgroundColor;\n\n      ctx.fillRect(\n        -dim.x / 2,\n        -dim.y / 2,\n        dim.x,\n        dim.y\n      );\n      // if there is background color no other shadows\n      // should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _setOpacity: function(ctx) {\n      if (this.group && !this.group._transformDone) {\n        ctx.globalAlpha = this.getObjectOpacity();\n      }\n      else {\n        ctx.globalAlpha *= this.opacity;\n      }\n    },\n\n    _setStrokeStyles: function(ctx, decl) {\n      var stroke = decl.stroke;\n      if (stroke) {\n        ctx.lineWidth = decl.strokeWidth;\n        ctx.lineCap = decl.strokeLineCap;\n        ctx.lineDashOffset = decl.strokeDashOffset;\n        ctx.lineJoin = decl.strokeLineJoin;\n        ctx.miterLimit = decl.strokeMiterLimit;\n        if (stroke.toLive) {\n          if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) {\n            // need to transform gradient in a pattern.\n            // this is a slow process. If you are hitting this codepath, and the object\n            // is not using caching, you should consider switching it on.\n            // we need a canvas as big as the current object caching canvas.\n            this._applyPatternForTransformedGradient(ctx, stroke);\n          }\n          else {\n            // is a simple gradient or pattern\n            ctx.strokeStyle = stroke.toLive(ctx, this);\n            this._applyPatternGradientTransform(ctx, stroke);\n          }\n        }\n        else {\n          // is a color\n          ctx.strokeStyle = decl.stroke;\n        }\n      }\n    },\n\n    _setFillStyles: function(ctx, decl) {\n      var fill = decl.fill;\n      if (fill) {\n        if (fill.toLive) {\n          ctx.fillStyle = fill.toLive(ctx, this);\n          this._applyPatternGradientTransform(ctx, decl.fill);\n        }\n        else {\n          ctx.fillStyle = fill;\n        }\n      }\n    },\n\n    _setClippingProperties: function(ctx) {\n      ctx.globalAlpha = 1;\n      ctx.strokeStyle = 'transparent';\n      ctx.fillStyle = '#000000';\n    },\n\n    /**\n     * @private\n     * Sets line dash\n     * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n     * @param {Array} dashArray array representing dashes\n     */\n    _setLineDash: function(ctx, dashArray) {\n      if (!dashArray || dashArray.length === 0) {\n        return;\n      }\n      // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n      if (1 & dashArray.length) {\n        dashArray.push.apply(dashArray, dashArray);\n      }\n      ctx.setLineDash(dashArray);\n    },\n\n    /**\n     * Renders controls and borders for the object\n     * the context here is not transformed\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [styleOverride] properties to override the object style\n     */\n    _renderControls: function(ctx, styleOverride) {\n      var vpt = this.getViewportTransform(),\n          matrix = this.calcTransformMatrix(),\n          options, drawBorders, drawControls;\n      styleOverride = styleOverride || { };\n      drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n      drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n      matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n      options = fabric.util.qrDecompose(matrix);\n      ctx.save();\n      ctx.translate(options.translateX, options.translateY);\n      ctx.lineWidth = 1 * this.borderScaleFactor;\n      if (!this.group) {\n        ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n      }\n      if (this.flipX) {\n        options.angle -= 180;\n      }\n      ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n      if (styleOverride.forActiveSelection || this.group) {\n        drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n      }\n      else {\n        drawBorders && this.drawBorders(ctx, styleOverride);\n      }\n      drawControls && this.drawControls(ctx, styleOverride);\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _setShadow: function(ctx) {\n      if (!this.shadow) {\n        return;\n      }\n\n      var shadow = this.shadow, canvas = this.canvas, scaling,\n          multX = (canvas && canvas.viewportTransform[0]) || 1,\n          multY = (canvas && canvas.viewportTransform[3]) || 1;\n      if (shadow.nonScaling) {\n        scaling = { scaleX: 1, scaleY: 1 };\n      }\n      else {\n        scaling = this.getObjectScaling();\n      }\n      if (canvas && canvas._isRetinaScaling()) {\n        multX *= fabric.devicePixelRatio;\n        multY *= fabric.devicePixelRatio;\n      }\n      ctx.shadowColor = shadow.color;\n      ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n        (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n      ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n      ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _removeShadow: function(ctx) {\n      if (!this.shadow) {\n        return;\n      }\n\n      ctx.shadowColor = '';\n      ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} filler fabric.Pattern or fabric.Gradient\n     * @return {Object} offset.offsetX offset for text rendering\n     * @return {Object} offset.offsetY offset for text rendering\n     */\n    _applyPatternGradientTransform: function(ctx, filler) {\n      if (!filler || !filler.toLive) {\n        return { offsetX: 0, offsetY: 0 };\n      }\n      var t = filler.gradientTransform || filler.patternTransform;\n      var offsetX = -this.width / 2 + filler.offsetX || 0,\n          offsetY = -this.height / 2 + filler.offsetY || 0;\n\n      if (filler.gradientUnits === 'percentage') {\n        ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n      }\n      else {\n        ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n      }\n      if (t) {\n        ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n      }\n      return { offsetX: offsetX, offsetY: offsetY };\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderPaintInOrder: function(ctx) {\n      if (this.paintFirst === 'stroke') {\n        this._renderStroke(ctx);\n        this._renderFill(ctx);\n      }\n      else {\n        this._renderFill(ctx);\n        this._renderStroke(ctx);\n      }\n    },\n\n    /**\n     * @private\n     * function that actually render something on the context.\n     * empty here to allow Obects to work on tests to benchmark fabric functionalites\n     * not related to rendering\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(/* ctx */) {\n\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderFill: function(ctx) {\n      if (!this.fill) {\n        return;\n      }\n\n      ctx.save();\n      this._setFillStyles(ctx, this);\n      if (this.fillRule === 'evenodd') {\n        ctx.fill('evenodd');\n      }\n      else {\n        ctx.fill();\n      }\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderStroke: function(ctx) {\n      if (!this.stroke || this.strokeWidth === 0) {\n        return;\n      }\n\n      if (this.shadow && !this.shadow.affectStroke) {\n        this._removeShadow(ctx);\n      }\n\n      ctx.save();\n      if (this.strokeUniform && this.group) {\n        var scaling = this.getObjectScaling();\n        ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n      }\n      else if (this.strokeUniform) {\n        ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n      }\n      this._setLineDash(ctx, this.strokeDashArray);\n      this._setStrokeStyles(ctx, this);\n      ctx.stroke();\n      ctx.restore();\n    },\n\n    /**\n     * This function try to patch the missing gradientTransform on canvas gradients.\n     * transforming a context to transform the gradient, is going to transform the stroke too.\n     * we want to transform the gradient but not the stroke operation, so we create\n     * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n     * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n     * is limited.\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {fabric.Gradient} filler a fabric gradient instance\n     */\n    _applyPatternForTransformedGradient: function(ctx, filler) {\n      var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n          pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n          width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n      pCanvas.width = width;\n      pCanvas.height = height;\n      pCtx = pCanvas.getContext('2d');\n      pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n      pCtx.lineTo(0, height); pCtx.closePath();\n      pCtx.translate(width / 2, height / 2);\n      pCtx.scale(\n        dims.zoomX / this.scaleX / retinaScaling,\n        dims.zoomY / this.scaleY / retinaScaling\n      );\n      this._applyPatternGradientTransform(pCtx, filler);\n      pCtx.fillStyle = filler.toLive(ctx);\n      pCtx.fill();\n      ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n      ctx.scale(\n        retinaScaling * this.scaleX / dims.zoomX,\n        retinaScaling * this.scaleY / dims.zoomY\n      );\n      ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n    },\n\n    /**\n     * This function is an helper for svg import. it returns the center of the object in the svg\n     * untransformed coordinates\n     * @private\n     * @return {Object} center point from element coordinates\n     */\n    _findCenterFromElement: function() {\n      return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n    },\n\n    /**\n     * This function is an helper for svg import. it decompose the transformMatrix\n     * and assign properties to object.\n     * untransformed coordinates\n     * @private\n     * @chainable\n     */\n    _assignTransformMatrixProps: function() {\n      if (this.transformMatrix) {\n        var options = fabric.util.qrDecompose(this.transformMatrix);\n        this.flipX = false;\n        this.flipY = false;\n        this.set('scaleX', options.scaleX);\n        this.set('scaleY', options.scaleY);\n        this.angle = options.angle;\n        this.skewX = options.skewX;\n        this.skewY = 0;\n      }\n    },\n\n    /**\n     * This function is an helper for svg import. it removes the transform matrix\n     * and set to object properties that fabricjs can handle\n     * @private\n     * @param {Object} preserveAspectRatioOptions\n     * @return {thisArg}\n     */\n    _removeTransformMatrix: function(preserveAspectRatioOptions) {\n      var center = this._findCenterFromElement();\n      if (this.transformMatrix) {\n        this._assignTransformMatrixProps();\n        center = fabric.util.transformPoint(center, this.transformMatrix);\n      }\n      this.transformMatrix = null;\n      if (preserveAspectRatioOptions) {\n        this.scaleX *= preserveAspectRatioOptions.scaleX;\n        this.scaleY *= preserveAspectRatioOptions.scaleY;\n        this.cropX = preserveAspectRatioOptions.cropX;\n        this.cropY = preserveAspectRatioOptions.cropY;\n        center.x += preserveAspectRatioOptions.offsetLeft;\n        center.y += preserveAspectRatioOptions.offsetTop;\n        this.width = preserveAspectRatioOptions.width;\n        this.height = preserveAspectRatioOptions.height;\n      }\n      this.setPositionByOrigin(center, 'center', 'center');\n    },\n\n    /**\n     * Clones an instance, using a callback method will work for every object.\n     * @param {Function} callback Callback is invoked with a clone as a first argument\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     */\n    clone: function(callback, propertiesToInclude) {\n      var objectForm = this.toObject(propertiesToInclude);\n      if (this.constructor.fromObject) {\n        this.constructor.fromObject(objectForm, callback);\n      }\n      else {\n        fabric.Object._fromObject('Object', objectForm, callback);\n      }\n    },\n\n    /**\n     * Creates an instance of fabric.Image out of an object\n     * makes use of toCanvasElement.\n     * Once this method was based on toDataUrl and loadImage, so it also had a quality\n     * and format option. toCanvasElement is faster and produce no loss of quality.\n     * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n     * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n     * This method is sync now, but still support the callback because we did not want to break.\n     * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback.\n     * @param {Function} callback callback, invoked with an instance as a first argument\n     * @param {Object} [options] for clone as image, passed to toDataURL\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {fabric.Object} thisArg\n     */\n    cloneAsImage: function(callback, options) {\n      var canvasEl = this.toCanvasElement(options);\n      if (callback) {\n        callback(new fabric.Image(canvasEl));\n      }\n      return this;\n    },\n\n    /**\n     * Converts an object into a HTMLCanvas element\n     * @param {Object} options Options object\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {HTMLCanvasElement} Returns DOM element <canvas> with the fabric.Object\n     */\n    toCanvasElement: function(options) {\n      options || (options = { });\n\n      var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n          originalGroup = this.group,\n          originalShadow = this.shadow, abs = Math.abs,\n          multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n      delete this.group;\n      if (options.withoutTransform) {\n        utils.resetObjectTransform(this);\n      }\n      if (options.withoutShadow) {\n        this.shadow = null;\n      }\n\n      var el = fabric.util.createCanvasElement(),\n          // skip canvas zoom and calculate with setCoords now.\n          boundingRect = this.getBoundingRect(true, true),\n          shadow = this.shadow, scaling,\n          shadowOffset = { x: 0, y: 0 }, shadowBlur,\n          width, height;\n\n      if (shadow) {\n        shadowBlur = shadow.blur;\n        if (shadow.nonScaling) {\n          scaling = { scaleX: 1, scaleY: 1 };\n        }\n        else {\n          scaling = this.getObjectScaling();\n        }\n        // consider non scaling shadow.\n        shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n        shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n      }\n      width = boundingRect.width + shadowOffset.x;\n      height = boundingRect.height + shadowOffset.y;\n      // if the current width/height is not an integer\n      // we need to make it so.\n      el.width = Math.ceil(width);\n      el.height = Math.ceil(height);\n      var canvas = new fabric.StaticCanvas(el, {\n        enableRetinaScaling: false,\n        renderOnAddRemove: false,\n        skipOffscreen: false,\n      });\n      if (options.format === 'jpeg') {\n        canvas.backgroundColor = '#fff';\n      }\n      this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n      var originalCanvas = this.canvas;\n      canvas.add(this);\n      var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n      this.shadow = originalShadow;\n      this.set('canvas', originalCanvas);\n      if (originalGroup) {\n        this.group = originalGroup;\n      }\n      this.set(origParams).setCoords();\n      // canvas.dispose will call image.dispose that will nullify the elements\n      // since this canvas is a simple element for the process, we remove references\n      // to objects in this way in order to avoid object trashing.\n      canvas._objects = [];\n      canvas.dispose();\n      canvas = null;\n\n      return canvasEl;\n    },\n\n    /**\n     * Converts an object into a data-url-like string\n     * @param {Object} options Options object\n     * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n     * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n     * @param {Number} [options.multiplier=1] Multiplier to scale by\n     * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n     * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n     * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n     * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n     * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n     * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n     * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n     * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n     */\n    toDataURL: function(options) {\n      options || (options = { });\n      return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n    },\n\n    /**\n     * Returns true if specified type is identical to the type of an instance\n     * @param {String} type Type to check against\n     * @return {Boolean}\n     */\n    isType: function(type) {\n      return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type;\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity of this instance (is 1 unless subclassed)\n     */\n    complexity: function() {\n      return 1;\n    },\n\n    /**\n     * Returns a JSON representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} JSON\n     */\n    toJSON: function(propertiesToInclude) {\n      // delegate, not alias\n      return this.toObject(propertiesToInclude);\n    },\n\n    /**\n     * Sets \"angle\" of an instance with centered rotation\n     * @param {Number} angle Angle value (in degrees)\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    rotate: function(angle) {\n      var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n      if (shouldCenterOrigin) {\n        this._setOriginToCenter();\n      }\n\n      this.set('angle', angle);\n\n      if (shouldCenterOrigin) {\n        this._resetOrigin();\n      }\n\n      return this;\n    },\n\n    /**\n     * Centers object horizontally on canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    centerH: function () {\n      this.canvas && this.canvas.centerObjectH(this);\n      return this;\n    },\n\n    /**\n     * Centers object horizontally on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenterH: function () {\n      this.canvas && this.canvas.viewportCenterObjectH(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically on canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    centerV: function () {\n      this.canvas && this.canvas.centerObjectV(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenterV: function () {\n      this.canvas && this.canvas.viewportCenterObjectV(this);\n      return this;\n    },\n\n    /**\n     * Centers object vertically and horizontally on canvas to which is was added last\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    center: function () {\n      this.canvas && this.canvas.centerObject(this);\n      return this;\n    },\n\n    /**\n     * Centers object on current viewport of canvas to which it was added last.\n     * You might need to call `setCoords` on an object after centering, to update controls area.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    viewportCenter: function () {\n      this.canvas && this.canvas.viewportCenterObject(this);\n      return this;\n    },\n\n    /**\n     * Returns coordinates of a pointer relative to an object\n     * @param {Event} e Event to operate upon\n     * @param {Object} [pointer] Pointer to operate upon (instead of event)\n     * @return {Object} Coordinates of a pointer (x, y)\n     */\n    getLocalPointer: function(e, pointer) {\n      pointer = pointer || this.canvas.getPointer(e);\n      var pClicked = new fabric.Point(pointer.x, pointer.y),\n          objectLeftTop = this._getLeftTopCoords();\n      if (this.angle) {\n        pClicked = fabric.util.rotatePoint(\n          pClicked, objectLeftTop, degreesToRadians(-this.angle));\n      }\n      return {\n        x: pClicked.x - objectLeftTop.x,\n        y: pClicked.y - objectLeftTop.y\n      };\n    },\n\n    /**\n     * Sets canvas globalCompositeOperation for specific object\n     * custom composition operation for the particular object can be specified using globalCompositeOperation property\n     * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n     */\n    _setupCompositeOperation: function (ctx) {\n      if (this.globalCompositeOperation) {\n        ctx.globalCompositeOperation = this.globalCompositeOperation;\n      }\n    },\n\n    /**\n     * cancel instance's running animations\n     * override if necessary to dispose artifacts such as `clipPath`\n     */\n    dispose: function () {\n      if (fabric.runningAnimations) {\n        fabric.runningAnimations.cancelByTarget(this);\n      }\n    }\n  });\n\n  fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n  extend(fabric.Object.prototype, fabric.Observable);\n\n  /**\n   * Defines the number of fraction digits to use when serializing object values.\n   * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n   * @static\n   * @memberOf fabric.Object\n   * @constant\n   * @type Number\n   */\n  fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n  /**\n   * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject}\n   * @static\n   * @memberOf fabric.Object\n   * @constant\n   * @type string[]\n   */\n  fabric.Object.ENLIVEN_PROPS = ['clipPath'];\n\n  fabric.Object._fromObject = function(className, object, callback, extraParam) {\n    var klass = fabric[className];\n    object = clone(object, true);\n    fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n      if (typeof patterns[0] !== 'undefined') {\n        object.fill = patterns[0];\n      }\n      if (typeof patterns[1] !== 'undefined') {\n        object.stroke = patterns[1];\n      }\n      fabric.util.enlivenObjectEnlivables(object, object, function () {\n        var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n        callback && callback(instance);\n      });\n    });\n  };\n\n  /**\n   * Unique id used internally when creating SVG elements\n   * @static\n   * @memberOf fabric.Object\n   * @type Number\n   */\n  fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  var degreesToRadians = fabric.util.degreesToRadians,\n      originXOffset = {\n        left: -0.5,\n        center: 0,\n        right: 0.5\n      },\n      originYOffset = {\n        top: -0.5,\n        center: 0,\n        bottom: 0.5\n      };\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n     * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n      var x = point.x,\n          y = point.y,\n          offsetX, offsetY, dim;\n\n      if (typeof fromOriginX === 'string') {\n        fromOriginX = originXOffset[fromOriginX];\n      }\n      else {\n        fromOriginX -= 0.5;\n      }\n\n      if (typeof toOriginX === 'string') {\n        toOriginX = originXOffset[toOriginX];\n      }\n      else {\n        toOriginX -= 0.5;\n      }\n\n      offsetX = toOriginX - fromOriginX;\n\n      if (typeof fromOriginY === 'string') {\n        fromOriginY = originYOffset[fromOriginY];\n      }\n      else {\n        fromOriginY -= 0.5;\n      }\n\n      if (typeof toOriginY === 'string') {\n        toOriginY = originYOffset[toOriginY];\n      }\n      else {\n        toOriginY -= 0.5;\n      }\n\n      offsetY = toOriginY - fromOriginY;\n\n      if (offsetX || offsetY) {\n        dim = this._getTransformedDimensions();\n        x = point.x + offsetX * dim.x;\n        y = point.y + offsetY * dim.y;\n      }\n\n      return new fabric.Point(x, y);\n    },\n\n    /**\n     * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToCenterPoint: function(point, originX, originY) {\n      var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n      if (this.angle) {\n        return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n      }\n      return p;\n    },\n\n    /**\n     * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n     * @param {fabric.Point} center The point which corresponds to center of the object\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    translateToOriginPoint: function(center, originX, originY) {\n      var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n      if (this.angle) {\n        return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n      }\n      return p;\n    },\n\n    /**\n     * Returns the real center coordinates of the object\n     * @return {fabric.Point}\n     */\n    getCenterPoint: function() {\n      var leftTop = new fabric.Point(this.left, this.top);\n      return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n    },\n\n    /**\n     * Returns the coordinates of the object based on center coordinates\n     * @param {fabric.Point} point The point which corresponds to the originX and originY params\n     * @return {fabric.Point}\n     */\n    // getOriginPoint: function(center) {\n    //   return this.translateToOriginPoint(center, this.originX, this.originY);\n    // },\n\n    /**\n     * Returns the coordinates of the object as if it has a different origin\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    getPointByOrigin: function(originX, originY) {\n      var center = this.getCenterPoint();\n      return this.translateToOriginPoint(center, originX, originY);\n    },\n\n    /**\n     * Returns the point in local coordinates\n     * @param {fabric.Point} point The point relative to the global coordinate system\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {fabric.Point}\n     */\n    toLocalPoint: function(point, originX, originY) {\n      var center = this.getCenterPoint(),\n          p, p2;\n\n      if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n        p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n      }\n      else {\n        p = new fabric.Point(this.left, this.top);\n      }\n\n      p2 = new fabric.Point(point.x, point.y);\n      if (this.angle) {\n        p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n      }\n      return p2.subtractEquals(p);\n    },\n\n    /**\n     * Returns the point in global coordinates\n     * @param {fabric.Point} The point relative to the local coordinate system\n     * @return {fabric.Point}\n     */\n    // toGlobalPoint: function(point) {\n    //   return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n    // },\n\n    /**\n     * Sets the position of the object taking into consideration the object's origin\n     * @param {fabric.Point} pos The new position of the object\n     * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n     * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n     * @return {void}\n     */\n    setPositionByOrigin: function(pos, originX, originY) {\n      var center = this.translateToCenterPoint(pos, originX, originY),\n          position = this.translateToOriginPoint(center, this.originX, this.originY);\n      this.set('left', position.x);\n      this.set('top', position.y);\n    },\n\n    /**\n     * @param {String} to One of 'left', 'center', 'right'\n     */\n    adjustPosition: function(to) {\n      var angle = degreesToRadians(this.angle),\n          hypotFull = this.getScaledWidth(),\n          xFull = fabric.util.cos(angle) * hypotFull,\n          yFull = fabric.util.sin(angle) * hypotFull,\n          offsetFrom, offsetTo;\n\n      //TODO: this function does not consider mixed situation like top, center.\n      if (typeof this.originX === 'string') {\n        offsetFrom = originXOffset[this.originX];\n      }\n      else {\n        offsetFrom = this.originX - 0.5;\n      }\n      if (typeof to === 'string') {\n        offsetTo = originXOffset[to];\n      }\n      else {\n        offsetTo = to - 0.5;\n      }\n      this.left += xFull * (offsetTo - offsetFrom);\n      this.top += yFull * (offsetTo - offsetFrom);\n      this.setCoords();\n      this.originX = to;\n    },\n\n    /**\n     * Sets the origin/position of the object to it's center point\n     * @private\n     * @return {void}\n     */\n    _setOriginToCenter: function() {\n      this._originalOriginX = this.originX;\n      this._originalOriginY = this.originY;\n\n      var center = this.getCenterPoint();\n\n      this.originX = 'center';\n      this.originY = 'center';\n\n      this.left = center.x;\n      this.top = center.y;\n    },\n\n    /**\n     * Resets the origin/position of the object to it's original origin\n     * @private\n     * @return {void}\n     */\n    _resetOrigin: function() {\n      var originPoint = this.translateToOriginPoint(\n        this.getCenterPoint(),\n        this._originalOriginX,\n        this._originalOriginY);\n\n      this.originX = this._originalOriginX;\n      this.originY = this._originalOriginY;\n\n      this.left = originPoint.x;\n      this.top = originPoint.y;\n\n      this._originalOriginX = null;\n      this._originalOriginY = null;\n    },\n\n    /**\n     * @private\n     */\n    _getLeftTopCoords: function() {\n      return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n    },\n  });\n\n})();\n\n\n(function() {\n\n  function arrayFromCoords(coords) {\n    return [\n      new fabric.Point(coords.tl.x, coords.tl.y),\n      new fabric.Point(coords.tr.x, coords.tr.y),\n      new fabric.Point(coords.br.x, coords.br.y),\n      new fabric.Point(coords.bl.x, coords.bl.y)\n    ];\n  }\n\n  var util = fabric.util,\n      degreesToRadians = util.degreesToRadians,\n      multiplyMatrices = util.multiplyTransformMatrices,\n      transformPoint = util.transformPoint;\n\n  util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Describe object's corner position in canvas element coordinates.\n     * properties are depending on control keys and padding the main controls.\n     * each property is an object with x, y and corner.\n     * The `corner` property contains in a similar manner the 4 points of the\n     * interactive area of the corner.\n     * The coordinates depends from the controls positionHandler and are used\n     * to draw and locate controls\n     * @memberOf fabric.Object.prototype\n     */\n    oCoords: null,\n\n    /**\n     * Describe object's corner position in canvas object absolute coordinates\n     * properties are tl,tr,bl,br and describe the four main corner.\n     * each property is an object with x, y, instance of Fabric.Point.\n     * The coordinates depends from this properties: width, height, scaleX, scaleY\n     * skewX, skewY, angle, strokeWidth, top, left.\n     * Those coordinates are useful to understand where an object is. They get updated\n     * with oCoords but they do not need to be updated when zoom or panning change.\n     * The coordinates get updated with @method setCoords.\n     * You can calculate them without updating with @method calcACoords();\n     * @memberOf fabric.Object.prototype\n     */\n    aCoords: null,\n\n    /**\n     * Describe object's corner position in canvas element coordinates.\n     * includes padding. Used of object detection.\n     * set and refreshed with setCoords.\n     * @memberOf fabric.Object.prototype\n     */\n    lineCoords: null,\n\n    /**\n     * storage for object transform matrix\n     */\n    ownMatrixCache: null,\n\n    /**\n     * storage for object full transform matrix\n     */\n    matrixCache: null,\n\n    /**\n     * custom controls interface\n     * controls are added by default_controls.js\n     */\n    controls: { },\n\n    /**\n     * return correct set of coordinates for intersection\n     * this will return either aCoords or lineCoords.\n     * @param {Boolean} absolute will return aCoords if true or lineCoords\n     * @return {Object} {tl, tr, br, bl} points\n     */\n    _getCoords: function(absolute, calculate) {\n      if (calculate) {\n        return (absolute ? this.calcACoords() : this.calcLineCoords());\n      }\n      if (!this.aCoords || !this.lineCoords) {\n        this.setCoords(true);\n      }\n      return (absolute ? this.aCoords : this.lineCoords);\n    },\n\n    /**\n     * return correct set of coordinates for intersection\n     * this will return either aCoords or lineCoords.\n     * The coords are returned in an array.\n     * @return {Array} [tl, tr, br, bl] of points\n     */\n    getCoords: function(absolute, calculate) {\n      return arrayFromCoords(this._getCoords(absolute, calculate));\n    },\n\n    /**\n     * Checks if object intersects with an area formed by 2 points\n     * @param {Object} pointTL top-left point of area\n     * @param {Object} pointBR bottom-right point of area\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object intersects with an area formed by 2 points\n     */\n    intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n      var coords = this.getCoords(absolute, calculate),\n          intersection = fabric.Intersection.intersectPolygonRectangle(\n            coords,\n            pointTL,\n            pointBR\n          );\n      return intersection.status === 'Intersection';\n    },\n\n    /**\n     * Checks if object intersects with another object\n     * @param {Object} other Object to test\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object intersects with another object\n     */\n    intersectsWithObject: function(other, absolute, calculate) {\n      var intersection = fabric.Intersection.intersectPolygonPolygon(\n        this.getCoords(absolute, calculate),\n        other.getCoords(absolute, calculate)\n      );\n\n      return intersection.status === 'Intersection'\n        || other.isContainedWithinObject(this, absolute, calculate)\n        || this.isContainedWithinObject(other, absolute, calculate);\n    },\n\n    /**\n     * Checks if object is fully contained within area of another object\n     * @param {Object} other Object to test\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is fully contained within area of another object\n     */\n    isContainedWithinObject: function(other, absolute, calculate) {\n      var points = this.getCoords(absolute, calculate),\n          otherCoords = absolute ? other.aCoords : other.lineCoords,\n          i = 0, lines = other._getImageLines(otherCoords);\n      for (; i < 4; i++) {\n        if (!other.containsPoint(points[i], lines)) {\n          return false;\n        }\n      }\n      return true;\n    },\n\n    /**\n     * Checks if object is fully contained within area formed by 2 points\n     * @param {Object} pointTL top-left point of area\n     * @param {Object} pointBR bottom-right point of area\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is fully contained within area formed by 2 points\n     */\n    isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n      var boundingRect = this.getBoundingRect(absolute, calculate);\n\n      return (\n        boundingRect.left >= pointTL.x &&\n        boundingRect.left + boundingRect.width <= pointBR.x &&\n        boundingRect.top >= pointTL.y &&\n        boundingRect.top + boundingRect.height <= pointBR.y\n      );\n    },\n\n    /**\n     * Checks if point is inside the object\n     * @param {fabric.Point} point Point to check against\n     * @param {Object} [lines] object returned from @method _getImageLines\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if point is inside the object\n     */\n    containsPoint: function(point, lines, absolute, calculate) {\n      var coords = this._getCoords(absolute, calculate),\n          lines = lines || this._getImageLines(coords),\n          xPoints = this._findCrossPoints(point, lines);\n      // if xPoints is odd then point is inside the object\n      return (xPoints !== 0 && xPoints % 2 === 1);\n    },\n\n    /**\n     * Checks if object is contained within the canvas with current viewportTransform\n     * the check is done stopping at first point that appears on screen\n     * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n     * @return {Boolean} true if object is fully or partially contained within canvas\n     */\n    isOnScreen: function(calculate) {\n      if (!this.canvas) {\n        return false;\n      }\n      var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n      var points = this.getCoords(true, calculate);\n      // if some point is on screen, the object is on screen.\n      if (points.some(function(point) {\n        return point.x <= pointBR.x && point.x >= pointTL.x &&\n        point.y <= pointBR.y && point.y >= pointTL.y;\n      })) {\n        return true;\n      }\n      // no points on screen, check intersection with absolute coordinates\n      if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n        return true;\n      }\n      return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n    },\n\n    /**\n     * Checks if the object contains the midpoint between canvas extremities\n     * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n     * @private\n     * @param {Fabric.Point} pointTL Top Left point\n     * @param {Fabric.Point} pointBR Top Right point\n     * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if the object contains the point\n     */\n    _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n      // worst case scenario the object is so big that contains the screen\n      var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n      if (this.containsPoint(centerPoint, null, true, calculate)) {\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Checks if object is partially contained within the canvas with current viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n     * @return {Boolean} true if object is partially contained within canvas\n     */\n    isPartiallyOnScreen: function(calculate) {\n      if (!this.canvas) {\n        return false;\n      }\n      var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n      if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n        return true;\n      }\n      var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) {\n        return (point.x >= pointBR.x || point.x <= pointTL.x) &&\n        (point.y >= pointBR.y || point.y <= pointTL.y);\n      });\n      return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n    },\n\n    /**\n     * Method that returns an object with the object edges in it, given the coordinates of the corners\n     * @private\n     * @param {Object} oCoords Coordinates of the object corners\n     */\n    _getImageLines: function(oCoords) {\n\n      var lines = {\n        topline: {\n          o: oCoords.tl,\n          d: oCoords.tr\n        },\n        rightline: {\n          o: oCoords.tr,\n          d: oCoords.br\n        },\n        bottomline: {\n          o: oCoords.br,\n          d: oCoords.bl\n        },\n        leftline: {\n          o: oCoords.bl,\n          d: oCoords.tl\n        }\n      };\n\n      // // debugging\n      // if (this.canvas.contextTop) {\n      //   this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n      //\n      //   this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n      //   this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n      // }\n\n      return lines;\n    },\n\n    /**\n     * Helper method to determine how many cross points are between the 4 object edges\n     * and the horizontal line determined by a point on canvas\n     * @private\n     * @param {fabric.Point} point Point to check\n     * @param {Object} lines Coordinates of the object being evaluated\n     */\n    // remove yi, not used but left code here just in case.\n    _findCrossPoints: function(point, lines) {\n      var b1, b2, a1, a2, xi, // yi,\n          xcount = 0,\n          iLine;\n\n      for (var lineKey in lines) {\n        iLine = lines[lineKey];\n        // optimisation 1: line below point. no cross\n        if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n          continue;\n        }\n        // optimisation 2: line above point. no cross\n        if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n          continue;\n        }\n        // optimisation 3: vertical line case\n        if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n          xi = iLine.o.x;\n          // yi = point.y;\n        }\n        // calculate the intersection point\n        else {\n          b1 = 0;\n          b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n          a1 = point.y - b1 * point.x;\n          a2 = iLine.o.y - b2 * iLine.o.x;\n\n          xi = -(a1 - a2) / (b1 - b2);\n          // yi = a1 + b1 * xi;\n        }\n        // dont count xi < point.x cases\n        if (xi >= point.x) {\n          xcount += 1;\n        }\n        // optimisation 4: specific for square images\n        if (xcount === 2) {\n          break;\n        }\n      }\n      return xcount;\n    },\n\n    /**\n     * Returns coordinates of object's bounding rectangle (left, top, width, height)\n     * the box is intended as aligned to axis of canvas.\n     * @param {Boolean} [absolute] use coordinates without viewportTransform\n     * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n     * @return {Object} Object with left, top, width, height properties\n     */\n    getBoundingRect: function(absolute, calculate) {\n      var coords = this.getCoords(absolute, calculate);\n      return util.makeBoundingBoxFromPoints(coords);\n    },\n\n    /**\n     * Returns width of an object's bounding box counting transformations\n     * before 2.0 it was named getWidth();\n     * @return {Number} width value\n     */\n    getScaledWidth: function() {\n      return this._getTransformedDimensions().x;\n    },\n\n    /**\n     * Returns height of an object bounding box counting transformations\n     * before 2.0 it was named getHeight();\n     * @return {Number} height value\n     */\n    getScaledHeight: function() {\n      return this._getTransformedDimensions().y;\n    },\n\n    /**\n     * Makes sure the scale is valid and modifies it if necessary\n     * @private\n     * @param {Number} value\n     * @return {Number}\n     */\n    _constrainScale: function(value) {\n      if (Math.abs(value) < this.minScaleLimit) {\n        if (value < 0) {\n          return -this.minScaleLimit;\n        }\n        else {\n          return this.minScaleLimit;\n        }\n      }\n      else if (value === 0) {\n        return 0.0001;\n      }\n      return value;\n    },\n\n    /**\n     * Scales an object (equally by x and y)\n     * @param {Number} value Scale factor\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scale: function(value) {\n      this._set('scaleX', value);\n      this._set('scaleY', value);\n      return this.setCoords();\n    },\n\n    /**\n     * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n     * @param {Number} value New width value\n     * @param {Boolean} absolute ignore viewport\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scaleToWidth: function(value, absolute) {\n      // adjust to bounding rect factor so that rotated shapes would fit as well\n      var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n      return this.scale(value / this.width / boundingRectFactor);\n    },\n\n    /**\n     * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n     * @param {Number} value New height value\n     * @param {Boolean} absolute ignore viewport\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    scaleToHeight: function(value, absolute) {\n      // adjust to bounding rect factor so that rotated shapes would fit as well\n      var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n      return this.scale(value / this.height / boundingRectFactor);\n    },\n\n    calcLineCoords: function() {\n      var vpt = this.getViewportTransform(),\n          padding = this.padding, angle = degreesToRadians(this.angle),\n          cos = util.cos(angle), sin = util.sin(angle),\n          cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n          cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords();\n\n      var lineCoords = {\n        tl: transformPoint(aCoords.tl, vpt),\n        tr: transformPoint(aCoords.tr, vpt),\n        bl: transformPoint(aCoords.bl, vpt),\n        br: transformPoint(aCoords.br, vpt),\n      };\n\n      if (padding) {\n        lineCoords.tl.x -= cosPMinusSinP;\n        lineCoords.tl.y -= cosPSinP;\n        lineCoords.tr.x += cosPSinP;\n        lineCoords.tr.y -= cosPMinusSinP;\n        lineCoords.bl.x -= cosPSinP;\n        lineCoords.bl.y += cosPMinusSinP;\n        lineCoords.br.x += cosPMinusSinP;\n        lineCoords.br.y += cosPSinP;\n      }\n\n      return lineCoords;\n    },\n\n    calcOCoords: function() {\n      var rotateMatrix = this._calcRotateMatrix(),\n          translateMatrix = this._calcTranslateMatrix(),\n          vpt = this.getViewportTransform(),\n          startMatrix = multiplyMatrices(vpt, translateMatrix),\n          finalMatrix = multiplyMatrices(startMatrix, rotateMatrix),\n          finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]),\n          dim = this._calculateCurrentDimensions(),\n          coords = {};\n      this.forEachControl(function(control, key, fabricObject) {\n        coords[key] = control.positionHandler(dim, finalMatrix, fabricObject);\n      });\n\n      // debug code\n      // var canvas = this.canvas;\n      // setTimeout(function() {\n      //   canvas.contextTop.clearRect(0, 0, 700, 700);\n      //   canvas.contextTop.fillStyle = 'green';\n      //   Object.keys(coords).forEach(function(key) {\n      //     var control = coords[key];\n      //     canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n      //   });\n      // }, 50);\n      return coords;\n    },\n\n    calcACoords: function() {\n      var rotateMatrix = this._calcRotateMatrix(),\n          translateMatrix = this._calcTranslateMatrix(),\n          finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n          dim = this._getTransformedDimensions(),\n          w = dim.x / 2, h = dim.y / 2;\n      return {\n        // corners\n        tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n        tr: transformPoint({ x: w, y: -h }, finalMatrix),\n        bl: transformPoint({ x: -w, y: h }, finalMatrix),\n        br: transformPoint({ x: w, y: h }, finalMatrix)\n      };\n    },\n\n    /**\n     * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n     * oCoords are used to find the corners\n     * aCoords are used to quickly find an object on the canvas\n     * lineCoords are used to quickly find object during pointer events.\n     * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n     *\n     * @param {Boolean} [skipCorners] skip calculation of oCoords.\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setCoords: function(skipCorners) {\n      this.aCoords = this.calcACoords();\n      // in case we are in a group, for how the inner group target check works,\n      // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.\n      this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();\n      if (skipCorners) {\n        return this;\n      }\n      // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n      this.oCoords = this.calcOCoords();\n      this._setCornerCoords && this._setCornerCoords();\n      return this;\n    },\n\n    /**\n     * calculate rotation matrix of an object\n     * @return {Array} rotation matrix for the object\n     */\n    _calcRotateMatrix: function() {\n      return util.calcRotateMatrix(this);\n    },\n\n    /**\n     * calculate the translation matrix for an object transform\n     * @return {Array} rotation matrix for the object\n     */\n    _calcTranslateMatrix: function() {\n      var center = this.getCenterPoint();\n      return [1, 0, 0, 1, center.x, center.y];\n    },\n\n    transformMatrixKey: function(skipGroup) {\n      var sep = '_', prefix = '';\n      if (!skipGroup && this.group) {\n        prefix = this.group.transformMatrixKey(skipGroup) + sep;\n      };\n      return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n        sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n        sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n    },\n\n    /**\n     * calculate transform matrix that represents the current transformations from the\n     * object's properties.\n     * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n     * There are some situation in which this is useful to avoid the fake rotation.\n     * @return {Array} transform matrix for the object\n     */\n    calcTransformMatrix: function(skipGroup) {\n      var matrix = this.calcOwnMatrix();\n      if (skipGroup || !this.group) {\n        return matrix;\n      }\n      var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {});\n      if (cache.key === key) {\n        return cache.value;\n      }\n      if (this.group) {\n        matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix);\n      }\n      cache.key = key;\n      cache.value = matrix;\n      return matrix;\n    },\n\n    /**\n     * calculate transform matrix that represents the current transformations from the\n     * object's properties, this matrix does not include the group transformation\n     * @return {Array} transform matrix for the object\n     */\n    calcOwnMatrix: function() {\n      var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n      if (cache.key === key) {\n        return cache.value;\n      }\n      var tMatrix = this._calcTranslateMatrix(),\n          options = {\n            angle: this.angle,\n            translateX: tMatrix[4],\n            translateY: tMatrix[5],\n            scaleX: this.scaleX,\n            scaleY: this.scaleY,\n            skewX: this.skewX,\n            skewY: this.skewY,\n            flipX: this.flipX,\n            flipY: this.flipY,\n          };\n      cache.key = key;\n      cache.value = util.composeMatrix(options);\n      return cache.value;\n    },\n\n    /*\n     * Calculate object dimensions from its properties\n     * @private\n     * @return {Object} .x width dimension\n     * @return {Object} .y height dimension\n     */\n    _getNonTransformedDimensions: function() {\n      var strokeWidth = this.strokeWidth,\n          w = this.width + strokeWidth,\n          h = this.height + strokeWidth;\n      return { x: w, y: h };\n    },\n\n    /*\n     * Calculate object bounding box dimensions from its properties scale, skew.\n     * @param {Number} skewX, a value to override current skewX\n     * @param {Number} skewY, a value to override current skewY\n     * @private\n     * @return {Object} .x width dimension\n     * @return {Object} .y height dimension\n     */\n    _getTransformedDimensions: function(skewX, skewY) {\n      if (typeof skewX === 'undefined') {\n        skewX = this.skewX;\n      }\n      if (typeof skewY === 'undefined') {\n        skewY = this.skewY;\n      }\n      var dimensions, dimX, dimY,\n          noSkew = skewX === 0 && skewY === 0;\n\n      if (this.strokeUniform) {\n        dimX = this.width;\n        dimY = this.height;\n      }\n      else {\n        dimensions = this._getNonTransformedDimensions();\n        dimX = dimensions.x;\n        dimY = dimensions.y;\n      }\n      if (noSkew) {\n        return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n      }\n      var bbox = util.sizeAfterTransform(dimX, dimY, {\n        scaleX: this.scaleX,\n        scaleY: this.scaleY,\n        skewX: skewX,\n        skewY: skewY,\n      });\n      return this._finalizeDimensions(bbox.x, bbox.y);\n    },\n\n    /*\n     * Calculate object bounding box dimensions from its properties scale, skew.\n     * @param Number width width of the bbox\n     * @param Number height height of the bbox\n     * @private\n     * @return {Object} .x finalized width dimension\n     * @return {Object} .y finalized height dimension\n     */\n    _finalizeDimensions: function(width, height) {\n      return this.strokeUniform ?\n        { x: width + this.strokeWidth, y: height + this.strokeWidth }\n        :\n        { x: width, y: height };\n    },\n\n    /*\n     * Calculate object dimensions for controls box, including padding and canvas zoom.\n     * and active selection\n     * private\n     */\n    _calculateCurrentDimensions: function()  {\n      var vpt = this.getViewportTransform(),\n          dim = this._getTransformedDimensions(),\n          p = transformPoint(dim, vpt, true);\n      return p.scalarAdd(2 * this.padding);\n    },\n  });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n  /**\n   * Moves an object to the bottom of the stack of drawn objects\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  sendToBack: function() {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n    }\n    else if (this.canvas) {\n      this.canvas.sendToBack(this);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object to the top of the stack of drawn objects\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  bringToFront: function() {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n    }\n    else if (this.canvas) {\n      this.canvas.bringToFront(this);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object down in stack of drawn objects\n   * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  sendBackwards: function(intersecting) {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n    }\n    else if (this.canvas) {\n      this.canvas.sendBackwards(this, intersecting);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object up in stack of drawn objects\n   * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  bringForward: function(intersecting) {\n    if (this.group) {\n      fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n    }\n    else if (this.canvas) {\n      this.canvas.bringForward(this, intersecting);\n    }\n    return this;\n  },\n\n  /**\n   * Moves an object to specified level in stack of drawn objects\n   * @param {Number} index New position of object\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  moveTo: function(index) {\n    if (this.group && this.group.type !== 'activeSelection') {\n      fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n    }\n    else if (this.canvas) {\n      this.canvas.moveTo(this, index);\n    }\n    return this;\n  }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n  function getSvgColorString(prop, value) {\n    if (!value) {\n      return prop + ': none; ';\n    }\n    else if (value.toLive) {\n      return prop + ': url(#SVGID_' + value.id + '); ';\n    }\n    else {\n      var color = new fabric.Color(value),\n          str = prop + ': ' + color.toRgb() + '; ',\n          opacity = color.getAlpha();\n      if (opacity !== 1) {\n        //change the color in rgb + opacity\n        str += prop + '-opacity: ' + opacity.toString() + '; ';\n      }\n      return str;\n    }\n  }\n\n  var toFixed = fabric.util.toFixed;\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n    /**\n     * Returns styles-string for svg-export\n     * @param {Boolean} skipShadow a boolean to skip shadow filter output\n     * @return {String}\n     */\n    getSvgStyles: function(skipShadow) {\n\n      var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n          strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n          strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n          strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n          strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n          strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n          strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n          opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n          visibility = this.visible ? '' : ' visibility: hidden;',\n          filter = skipShadow ? '' : this.getSvgFilter(),\n          fill = getSvgColorString('fill', this.fill),\n          stroke = getSvgColorString('stroke', this.stroke);\n\n      return [\n        stroke,\n        'stroke-width: ', strokeWidth, '; ',\n        'stroke-dasharray: ', strokeDashArray, '; ',\n        'stroke-linecap: ', strokeLineCap, '; ',\n        'stroke-dashoffset: ', strokeDashOffset, '; ',\n        'stroke-linejoin: ', strokeLineJoin, '; ',\n        'stroke-miterlimit: ', strokeMiterLimit, '; ',\n        fill,\n        'fill-rule: ', fillRule, '; ',\n        'opacity: ', opacity, ';',\n        filter,\n        visibility\n      ].join('');\n    },\n\n    /**\n     * Returns styles-string for svg-export\n     * @param {Object} style the object from which to retrieve style properties\n     * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n     * @return {String}\n     */\n    getSvgSpanStyles: function(style, useWhiteSpace) {\n      var term = '; ';\n      var fontFamily = style.fontFamily ?\n        'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n          '\\'' + style.fontFamily  + '\\'' : style.fontFamily)) + term : '';\n      var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n          fontFamily = fontFamily,\n          fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n          fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n          fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n          fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n          stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n          textDecoration = this.getSvgTextDecoration(style),\n          deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n      if (textDecoration) {\n        textDecoration = 'text-decoration: ' + textDecoration + term;\n      }\n\n      return [\n        stroke,\n        strokeWidth,\n        fontFamily,\n        fontSize,\n        fontStyle,\n        fontWeight,\n        textDecoration,\n        fill,\n        deltaY,\n        useWhiteSpace ? 'white-space: pre; ' : ''\n      ].join('');\n    },\n\n    /**\n     * Returns text-decoration property for svg-export\n     * @param {Object} style the object from which to retrieve style properties\n     * @return {String}\n     */\n    getSvgTextDecoration: function(style) {\n      return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n        return style[decoration.replace('-', '')];\n      }).join(' ');\n    },\n\n    /**\n     * Returns filter for svg shadow\n     * @return {String}\n     */\n    getSvgFilter: function() {\n      return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n    },\n\n    /**\n     * Returns id attribute for svg output\n     * @return {String}\n     */\n    getSvgCommons: function() {\n      return [\n        this.id ? 'id=\"' + this.id + '\" ' : '',\n        this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n      ].join('');\n    },\n\n    /**\n     * Returns transform-string for svg-export\n     * @param {Boolean} use the full transform or the single object one.\n     * @return {String}\n     */\n    getSvgTransform: function(full, additionalTransform) {\n      var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n          svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n      return svgTransform +\n        (additionalTransform || '') + '\" ';\n    },\n\n    _setSVGBg: function(textBgRects) {\n      if (this.backgroundColor) {\n        var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n        textBgRects.push(\n          '\\t\\t<rect ',\n          this._getFillAttributes(this.backgroundColor),\n          ' x=\"',\n          toFixed(-this.width / 2, NUM_FRACTION_DIGITS),\n          '\" y=\"',\n          toFixed(-this.height / 2, NUM_FRACTION_DIGITS),\n          '\" width=\"',\n          toFixed(this.width, NUM_FRACTION_DIGITS),\n          '\" height=\"',\n          toFixed(this.height, NUM_FRACTION_DIGITS),\n          '\"></rect>\\n');\n      }\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n    },\n\n    /**\n     * @private\n     */\n    _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n      options = options || {};\n      var reviver = options.reviver,\n          additionalTransform = options.additionalTransform || '',\n          commonPieces = [\n            this.getSvgTransform(true, additionalTransform),\n            this.getSvgCommons(),\n          ].join(''),\n          // insert commons in the markup, style and svgCommons\n          index = objectMarkup.indexOf('COMMON_PARTS');\n      objectMarkup[index] = commonPieces;\n      return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n    },\n\n    /**\n     * @private\n     */\n    _createBaseSVGMarkup: function(objectMarkup, options) {\n      options = options || {};\n      var noStyle = options.noStyle,\n          reviver = options.reviver,\n          styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n          shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n          clipPath = this.clipPath,\n          vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n          absoluteClipPath = clipPath && clipPath.absolutePositioned,\n          stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n          commonPieces, markup = [], clipPathMarkup,\n          // insert commons in the markup, style and svgCommons\n          index = objectMarkup.indexOf('COMMON_PARTS'),\n          additionalTransform = options.additionalTransform;\n      if (clipPath) {\n        clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n        clipPathMarkup = '<clipPath id=\"' + clipPath.clipPathId + '\" >\\n' +\n          clipPath.toClipPathSVG(reviver) +\n          '</clipPath>\\n';\n      }\n      if (absoluteClipPath) {\n        markup.push(\n          '<g ', shadowInfo, this.getSvgCommons(), ' >\\n'\n        );\n      }\n      markup.push(\n        '<g ',\n        this.getSvgTransform(false),\n        !absoluteClipPath ? shadowInfo + this.getSvgCommons() : '',\n        ' >\\n'\n      );\n      commonPieces = [\n        styleInfo,\n        vectorEffect,\n        noStyle ? '' : this.addPaintOrder(), ' ',\n        additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n      ].join('');\n      objectMarkup[index] = commonPieces;\n      if (fill && fill.toLive) {\n        markup.push(fill.toSVG(this));\n      }\n      if (stroke && stroke.toLive) {\n        markup.push(stroke.toSVG(this));\n      }\n      if (shadow) {\n        markup.push(shadow.toSVG(this));\n      }\n      if (clipPath) {\n        markup.push(clipPathMarkup);\n      }\n      markup.push(objectMarkup.join(''));\n      markup.push('</g>\\n');\n      absoluteClipPath && markup.push('</g>\\n');\n      return reviver ? reviver(markup.join('')) : markup.join('');\n    },\n\n    addPaintOrder: function() {\n      return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n    }\n  });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n  var extend = fabric.util.object.extend,\n      originalSet = 'stateProperties';\n\n  /*\n    Depends on `stateProperties`\n  */\n  function saveProps(origin, destination, props) {\n    var tmpObj = { }, deep = true;\n    props.forEach(function(prop) {\n      tmpObj[prop] = origin[prop];\n    });\n\n    extend(origin[destination], tmpObj, deep);\n  }\n\n  function _isEqual(origValue, currentValue, firstPass) {\n    if (origValue === currentValue) {\n      // if the objects are identical, return\n      return true;\n    }\n    else if (Array.isArray(origValue)) {\n      if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n        return false;\n      }\n      for (var i = 0, len = origValue.length; i < len; i++) {\n        if (!_isEqual(origValue[i], currentValue[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    else if (origValue && typeof origValue === 'object') {\n      var keys = Object.keys(origValue), key;\n      if (!currentValue ||\n          typeof currentValue !== 'object' ||\n          (!firstPass && keys.length !== Object.keys(currentValue).length)\n      ) {\n        return false;\n      }\n      for (var i = 0, len = keys.length; i < len; i++) {\n        key = keys[i];\n        // since clipPath is in the statefull cache list and the clipPath objects\n        // would be iterated as an object, this would lead to possible infinite recursion\n        // we do not want to compare those.\n        if (key === 'canvas' || key === 'group') {\n          continue;\n        }\n        if (!_isEqual(origValue[key], currentValue[key])) {\n          return false;\n        }\n      }\n      return true;\n    }\n  }\n\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n    /**\n     * Returns true if object state (one of its state properties) was changed\n     * @param {String} [propertySet] optional name for the set of property we want to save\n     * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n     */\n    hasStateChanged: function(propertySet) {\n      propertySet = propertySet || originalSet;\n      var dashedPropertySet = '_' + propertySet;\n      if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n        return true;\n      }\n      return !_isEqual(this[dashedPropertySet], this, true);\n    },\n\n    /**\n     * Saves state of an object\n     * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n     * @return {fabric.Object} thisArg\n     */\n    saveState: function(options) {\n      var propertySet = options && options.propertySet || originalSet,\n          destination = '_' + propertySet;\n      if (!this[destination]) {\n        return this.setupState(options);\n      }\n      saveProps(this, destination, this[propertySet]);\n      if (options && options.stateProperties) {\n        saveProps(this, destination, options.stateProperties);\n      }\n      return this;\n    },\n\n    /**\n     * Setups state of an object\n     * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n     * @return {fabric.Object} thisArg\n     */\n    setupState: function(options) {\n      options = options || { };\n      var propertySet = options.propertySet || originalSet;\n      options.propertySet = propertySet;\n      this['_' + propertySet] = { };\n      this.saveState(options);\n      return this;\n    }\n  });\n})();\n\n\n(function() {\n\n  var degreesToRadians = fabric.util.degreesToRadians;\n\n  fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n    /**\n     * Determines which corner has been clicked\n     * @private\n     * @param {Object} pointer The pointer indicating the mouse position\n     * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n     */\n    _findTargetCorner: function(pointer, forTouch) {\n      // objects in group, anykind, are not self modificable,\n      // must not return an hovered corner.\n      if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n        return false;\n      }\n\n      var ex = pointer.x,\n          ey = pointer.y,\n          xPoints,\n          lines, keys = Object.keys(this.oCoords),\n          j = keys.length - 1, i;\n      this.__corner = 0;\n\n      // cycle in reverse order so we pick first the one on top\n      for (; j >= 0; j--) {\n        i = keys[j];\n        if (!this.isControlVisible(i)) {\n          continue;\n        }\n\n        lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner);\n        // // debugging\n        //\n        // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n        //\n        // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n        // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n        xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n        if (xPoints !== 0 && xPoints % 2 === 1) {\n          this.__corner = i;\n          return i;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Calls a function for each control. The function gets called,\n     * with the control, the object that is calling the iterator and the control's key\n     * @param {Function} fn function to iterate over the controls over\n     */\n    forEachControl: function(fn) {\n      for (var i in this.controls) {\n        fn(this.controls[i], i, this);\n      };\n    },\n\n    /**\n     * Sets the coordinates of the draggable boxes in the corners of\n     * the image used to scale/rotate it.\n     * note: if we would switch to ROUND corner area, all of this would disappear.\n     * everything would resolve to a single point and a pythagorean theorem for the distance\n     * @private\n     */\n    _setCornerCoords: function() {\n      var coords = this.oCoords;\n\n      for (var control in coords) {\n        var controlObject = this.controls[control];\n        coords[control].corner = controlObject.calcCornerCoords(\n          this.angle, this.cornerSize, coords[control].x, coords[control].y, false);\n        coords[control].touchCorner = controlObject.calcCornerCoords(\n          this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true);\n      }\n    },\n\n    /**\n     * Draws a colored layer behind the object, inside its selection borders.\n     * Requires public options: padding, selectionBackgroundColor\n     * this function is called when the context is transformed\n     * has checks to be skipped when the object is on a staticCanvas\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawSelectionBackground: function(ctx) {\n      if (!this.selectionBackgroundColor ||\n        (this.canvas && !this.canvas.interactive) ||\n        (this.canvas && this.canvas._activeObject !== this)\n      ) {\n        return this;\n      }\n      ctx.save();\n      var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n          vpt = this.canvas.viewportTransform;\n      ctx.translate(center.x, center.y);\n      ctx.scale(1 / vpt[0], 1 / vpt[3]);\n      ctx.rotate(degreesToRadians(this.angle));\n      ctx.fillStyle = this.selectionBackgroundColor;\n      ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws borders of an object's bounding box.\n     * Requires public properties: width, height\n     * Requires public options: padding, borderColor\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawBorders: function(ctx, styleOverride) {\n      styleOverride = styleOverride || {};\n      var wh = this._calculateCurrentDimensions(),\n          strokeWidth = this.borderScaleFactor,\n          width = wh.x + strokeWidth,\n          height = wh.y + strokeWidth,\n          hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n            styleOverride.hasControls : this.hasControls,\n          shouldStroke = false;\n\n      ctx.save();\n      ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n      this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n\n      ctx.strokeRect(\n        -width / 2,\n        -height / 2,\n        width,\n        height\n      );\n\n      if (hasControls) {\n        ctx.beginPath();\n        this.forEachControl(function(control, key, fabricObject) {\n          // in this moment, the ctx is centered on the object.\n          // width and height of the above function are the size of the bbox.\n          if (control.withConnection && control.getVisibility(fabricObject, key)) {\n            // reset movement for each control\n            shouldStroke = true;\n            ctx.moveTo(control.x * width, control.y * height);\n            ctx.lineTo(\n              control.x * width + control.offsetX,\n              control.y * height + control.offsetY\n            );\n          }\n        });\n        if (shouldStroke) {\n          ctx.stroke();\n        }\n      }\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws borders of an object's bounding box when it is inside a group.\n     * Requires public properties: width, height\n     * Requires public options: padding, borderColor\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {object} options object representing current object parameters\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawBordersInGroup: function(ctx, options, styleOverride) {\n      styleOverride = styleOverride || {};\n      var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n          strokeWidth = this.strokeWidth,\n          strokeUniform = this.strokeUniform,\n          borderScaleFactor = this.borderScaleFactor,\n          width =\n            bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n          height =\n            bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n      ctx.save();\n      this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n      ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n      ctx.strokeRect(\n        -width / 2,\n        -height / 2,\n        width,\n        height\n      );\n\n      ctx.restore();\n      return this;\n    },\n\n    /**\n     * Draws corners of an object's bounding box.\n     * Requires public properties: width, height\n     * Requires public options: cornerSize, padding\n     * @param {CanvasRenderingContext2D} ctx Context to draw on\n     * @param {Object} styleOverride object to override the object style\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    drawControls: function(ctx, styleOverride) {\n      styleOverride = styleOverride || {};\n      ctx.save();\n      var retinaScaling = this.canvas.getRetinaScaling(), matrix, p;\n      ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n      ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n      if (!this.transparentCorners) {\n        ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n      }\n      this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray);\n      this.setCoords();\n      if (this.group) {\n        // fabricJS does not really support drawing controls inside groups,\n        // this piece of code here helps having at least the control in places.\n        // If an application needs to show some objects as selected because of some UI state\n        // can still call Object._renderControls() on any object they desire, independently of groups.\n        // using no padding, circular controls and hiding the rotating cursor is higly suggested,\n        matrix = this.group.calcTransformMatrix();\n      }\n      this.forEachControl(function(control, key, fabricObject) {\n        p = fabricObject.oCoords[key];\n        if (control.getVisibility(fabricObject, key)) {\n          if (matrix) {\n            p = fabric.util.transformPoint(p, matrix);\n          }\n          control.render(ctx, p.x, p.y, styleOverride, fabricObject);\n        }\n      });\n      ctx.restore();\n\n      return this;\n    },\n\n    /**\n     * Returns true if the specified control is visible, false otherwise.\n     * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n     * @returns {Boolean} true if the specified control is visible, false otherwise\n     */\n    isControlVisible: function(controlKey) {\n      return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey);\n    },\n\n    /**\n     * Sets the visibility of the specified control.\n     * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n     * @param {Boolean} visible true to set the specified control visible, false otherwise\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setControlVisible: function(controlKey, visible) {\n      if (!this._controlsVisibility) {\n        this._controlsVisibility = {};\n      }\n      this._controlsVisibility[controlKey] = visible;\n      return this;\n    },\n\n    /**\n     * Sets the visibility state of object controls.\n     * @param {Object} [options] Options object\n     * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n     * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n     * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n     * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n     * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n     * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n     * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n     * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n     * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    setControlsVisibility: function(options) {\n      options || (options = { });\n\n      for (var p in options) {\n        this.setControlVisible(p, options[p]);\n      }\n      return this;\n    },\n\n\n    /**\n     * This callback function is called every time _discardActiveObject or _setActiveObject\n     * try to to deselect this object. If the function returns true, the process is cancelled\n     * @param {Object} [options] options sent from the upper functions\n     * @param {Event} [options.e] event if the process is generated by an event\n     */\n    onDeselect: function() {\n      // implemented by sub-classes, as needed.\n    },\n\n\n    /**\n     * This callback function is called every time _discardActiveObject or _setActiveObject\n     * try to to select this object. If the function returns true, the process is cancelled\n     * @param {Object} [options] options sent from the upper functions\n     * @param {Event} [options.e] event if the process is generated by an event\n     */\n    onSelect: function() {\n      // implemented by sub-classes, as needed.\n    }\n  });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n  /**\n   * Animation duration (in ms) for fx* methods\n   * @type Number\n   * @default\n   */\n  FX_DURATION: 500,\n\n  /**\n   * Centers object horizontally with animation.\n   * @param {fabric.Object} object Object to center\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.AnimationContext} context\n   */\n  fxCenterObjectH: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    return fabric.util.animate({\n      target: this,\n      startValue: object.left,\n      endValue: this.getCenterPoint().x,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('left', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function() {\n        object.setCoords();\n        onComplete();\n      }\n    });\n  },\n\n  /**\n   * Centers object vertically with animation.\n   * @param {fabric.Object} object Object to center\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.AnimationContext} context\n   */\n  fxCenterObjectV: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    return fabric.util.animate({\n      target: this,\n      startValue: object.top,\n      endValue: this.getCenterPoint().y,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('top', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function() {\n        object.setCoords();\n        onComplete();\n      }\n    });\n  },\n\n  /**\n   * Same as `fabric.Canvas#remove` but animated\n   * @param {fabric.Object} object Object to remove\n   * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.AnimationContext} context\n   */\n  fxRemove: function (object, callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    return fabric.util.animate({\n      target: this,\n      startValue: object.opacity,\n      endValue: 0,\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        object.set('opacity', value);\n        _this.requestRenderAll();\n        onChange();\n      },\n      onComplete: function () {\n        _this.remove(object);\n        onComplete();\n      }\n    });\n  }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n  /**\n   * Animates object's properties\n   * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n   * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n   * @return {fabric.Object} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n   * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties)\n   *\n   * As object — multiple properties\n   *\n   * object.animate({ left: ..., top: ... });\n   * object.animate({ left: ..., top: ... }, { duration: ... });\n   *\n   * As string — one property\n   *\n   * object.animate('left', ...);\n   * object.animate('left', { duration: ... });\n   *\n   */\n  animate: function () {\n    if (arguments[0] && typeof arguments[0] === 'object') {\n      var propsToAnimate = [], prop, skipCallbacks, out = [];\n      for (prop in arguments[0]) {\n        propsToAnimate.push(prop);\n      }\n      for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n        prop = propsToAnimate[i];\n        skipCallbacks = i !== len - 1;\n        out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks));\n      }\n      return out;\n    }\n    else {\n      return this._animate.apply(this, arguments);\n    }\n  },\n\n  /**\n   * @private\n   * @param {String} property Property to animate\n   * @param {String} to Value to animate to\n   * @param {Object} [options] Options object\n   * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n   */\n  _animate: function(property, to, options, skipCallbacks) {\n    var _this = this, propPair;\n\n    to = to.toString();\n\n    if (!options) {\n      options = { };\n    }\n    else {\n      options = fabric.util.object.clone(options);\n    }\n\n    if (~property.indexOf('.')) {\n      propPair = property.split('.');\n    }\n\n    var propIsColor =\n      _this.colorProperties.indexOf(property) > -1 ||\n      (propPair && _this.colorProperties.indexOf(propPair[1]) > -1);\n\n    var currentValue = propPair\n      ? this.get(propPair[0])[propPair[1]]\n      : this.get(property);\n\n    if (!('from' in options)) {\n      options.from = currentValue;\n    }\n\n    if (!propIsColor) {\n      if (~to.indexOf('=')) {\n        to = currentValue + parseFloat(to.replace('=', ''));\n      }\n      else {\n        to = parseFloat(to);\n      }\n    }\n\n    var _options = {\n      target: this,\n      startValue: options.from,\n      endValue: to,\n      byValue: options.by,\n      easing: options.easing,\n      duration: options.duration,\n      abort: options.abort && function(value, valueProgress, timeProgress) {\n        return options.abort.call(_this, value, valueProgress, timeProgress);\n      },\n      onChange: function (value, valueProgress, timeProgress) {\n        if (propPair) {\n          _this[propPair[0]][propPair[1]] = value;\n        }\n        else {\n          _this.set(property, value);\n        }\n        if (skipCallbacks) {\n          return;\n        }\n        options.onChange && options.onChange(value, valueProgress, timeProgress);\n      },\n      onComplete: function (value, valueProgress, timeProgress) {\n        if (skipCallbacks) {\n          return;\n        }\n\n        _this.setCoords();\n        options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n      }\n    };\n\n    if (propIsColor) {\n      return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options);\n    }\n    else {\n      return fabric.util.animate(_options);\n    }\n  }\n});\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 };\n\n  if (fabric.Line) {\n    fabric.warn('fabric.Line is already defined');\n    return;\n  }\n\n  /**\n   * Line class\n   * @class fabric.Line\n   * @extends fabric.Object\n   * @see {@link fabric.Line#initialize} for constructor definition\n   */\n  fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'line',\n\n    /**\n     * x value or first line edge\n     * @type Number\n     * @default\n     */\n    x1: 0,\n\n    /**\n     * y value or first line edge\n     * @type Number\n     * @default\n     */\n    y1: 0,\n\n    /**\n     * x value or second line edge\n     * @type Number\n     * @default\n     */\n    x2: 0,\n\n    /**\n     * y value or second line edge\n     * @type Number\n     * @default\n     */\n    y2: 0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n    /**\n     * Constructor\n     * @param {Array} [points] Array of points\n     * @param {Object} [options] Options object\n     * @return {fabric.Line} thisArg\n     */\n    initialize: function(points, options) {\n      if (!points) {\n        points = [0, 0, 0, 0];\n      }\n\n      this.callSuper('initialize', options);\n\n      this.set('x1', points[0]);\n      this.set('y1', points[1]);\n      this.set('x2', points[2]);\n      this.set('y2', points[3]);\n\n      this._setWidthHeight(options);\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options\n     */\n    _setWidthHeight: function(options) {\n      options || (options = { });\n\n      this.width = Math.abs(this.x2 - this.x1);\n      this.height = Math.abs(this.y2 - this.y1);\n\n      this.left = 'left' in options\n        ? options.left\n        : this._getLeftToOriginX();\n\n      this.top = 'top' in options\n        ? options.top\n        : this._getTopToOriginY();\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n      if (typeof coordProps[key] !== 'undefined') {\n        this._setWidthHeight();\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n     */\n    _getLeftToOriginX: makeEdgeToOriginGetter(\n      { // property names\n        origin: 'originX',\n        axis1: 'x1',\n        axis2: 'x2',\n        dimension: 'width'\n      },\n      { // possible values of origin\n        nearest: 'left',\n        center: 'center',\n        farthest: 'right'\n      }\n    ),\n\n    /**\n     * @private\n     * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n     */\n    _getTopToOriginY: makeEdgeToOriginGetter(\n      { // property names\n        origin: 'originY',\n        axis1: 'y1',\n        axis2: 'y2',\n        dimension: 'height'\n      },\n      { // possible values of origin\n        nearest: 'top',\n        center: 'center',\n        farthest: 'bottom'\n      }\n    ),\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n\n\n      var p = this.calcLinePoints();\n      ctx.moveTo(p.x1, p.y1);\n      ctx.lineTo(p.x2, p.y2);\n\n      ctx.lineWidth = this.strokeWidth;\n\n      // TODO: test this\n      // make sure setting \"fill\" changes color of a line\n      // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n      var origStrokeStyle = ctx.strokeStyle;\n      ctx.strokeStyle = this.stroke || ctx.fillStyle;\n      this.stroke && this._renderStroke(ctx);\n      ctx.strokeStyle = origStrokeStyle;\n    },\n\n    /**\n     * This function is an helper for svg import. it returns the center of the object in the svg\n     * untransformed coordinates\n     * @private\n     * @return {Object} center point from element coordinates\n     */\n    _findCenterFromElement: function() {\n      return {\n        x: (this.x1 + this.x2) / 2,\n        y: (this.y1 + this.y2) / 2,\n      };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @method toObject\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n    },\n\n    /*\n     * Calculate object dimensions from its properties\n     * @private\n     */\n    _getNonTransformedDimensions: function() {\n      var dim = this.callSuper('_getNonTransformedDimensions');\n      if (this.strokeLineCap === 'butt') {\n        if (this.width === 0) {\n          dim.y -= this.strokeWidth;\n        }\n        if (this.height === 0) {\n          dim.x -= this.strokeWidth;\n        }\n      }\n      return dim;\n    },\n\n    /**\n     * Recalculates line points given width and height\n     * @private\n     */\n    calcLinePoints: function() {\n      var xMult = this.x1 <= this.x2 ? -1 : 1,\n          yMult = this.y1 <= this.y2 ? -1 : 1,\n          x1 = (xMult * this.width * 0.5),\n          y1 = (yMult * this.height * 0.5),\n          x2 = (xMult * this.width * -0.5),\n          y2 = (yMult * this.height * -0.5);\n\n      return {\n        x1: x1,\n        x2: x2,\n        y1: y1,\n        y2: y2\n      };\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var p = this.calcLinePoints();\n      return [\n        '<line ', 'COMMON_PARTS',\n        'x1=\"', p.x1,\n        '\" y1=\"', p.y1,\n        '\" x2=\"', p.x2,\n        '\" y2=\"', p.y2,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n   * @static\n   * @memberOf fabric.Line\n   * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n   */\n  fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n  /**\n   * Returns fabric.Line instance from an SVG element\n   * @static\n   * @memberOf fabric.Line\n   * @param {SVGElement} element Element to parse\n   * @param {Object} [options] Options object\n   * @param {Function} [callback] callback function invoked after parsing\n   */\n  fabric.Line.fromElement = function(element, callback, options) {\n    options = options || { };\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n        points = [\n          parsedAttributes.x1 || 0,\n          parsedAttributes.y1 || 0,\n          parsedAttributes.x2 || 0,\n          parsedAttributes.y2 || 0\n        ];\n    callback(new fabric.Line(points, extend(parsedAttributes, options)));\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Line instance from an object representation\n   * @static\n   * @memberOf fabric.Line\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   */\n  fabric.Line.fromObject = function(object, callback) {\n    function _callback(instance) {\n      delete instance.points;\n      callback && callback(instance);\n    };\n    var options = clone(object, true);\n    options.points = [object.x1, object.y1, object.x2, object.y2];\n    fabric.Object._fromObject('Line', options, _callback, 'points');\n  };\n\n  /**\n   * Produces a function that calculates distance from canvas edge to Line origin.\n   */\n  function makeEdgeToOriginGetter(propertyNames, originValues) {\n    var origin = propertyNames.origin,\n        axis1 = propertyNames.axis1,\n        axis2 = propertyNames.axis2,\n        dimension = propertyNames.dimension,\n        nearest = originValues.nearest,\n        center = originValues.center,\n        farthest = originValues.farthest;\n\n    return function() {\n      switch (this.get(origin)) {\n        case nearest:\n          return Math.min(this.get(axis1), this.get(axis2));\n        case center:\n          return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n        case farthest:\n          return Math.max(this.get(axis1), this.get(axis2));\n      }\n    };\n\n  }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      degreesToRadians = fabric.util.degreesToRadians;\n\n  if (fabric.Circle) {\n    fabric.warn('fabric.Circle is already defined.');\n    return;\n  }\n\n  /**\n   * Circle class\n   * @class fabric.Circle\n   * @extends fabric.Object\n   * @see {@link fabric.Circle#initialize} for constructor definition\n   */\n  fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'circle',\n\n    /**\n     * Radius of this circle\n     * @type Number\n     * @default\n     */\n    radius: 0,\n\n    /**\n     * degrees of start of the circle.\n     * probably will change to degrees in next major version\n     * @type Number 0 - 359\n     * @default 0\n     */\n    startAngle: 0,\n\n    /**\n     * End angle of the circle\n     * probably will change to degrees in next major version\n     * @type Number 1 - 360\n     * @default 360\n     */\n    endAngle: 360,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Circle} thisArg\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n\n      if (key === 'radius') {\n        this.setRadius(value);\n      }\n\n      return this;\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var svgString, x = 0, y = 0,\n          angle = (this.endAngle - this.startAngle) % 360;\n\n      if (angle === 0) {\n        svgString = [\n          '<circle ', 'COMMON_PARTS',\n          'cx=\"' + x + '\" cy=\"' + y + '\" ',\n          'r=\"', this.radius,\n          '\" />\\n'\n        ];\n      }\n      else {\n        var start = degreesToRadians(this.startAngle),\n            end = degreesToRadians(this.endAngle),\n            radius = this.radius,\n            startX = fabric.util.cos(start) * radius,\n            startY = fabric.util.sin(start) * radius,\n            endX = fabric.util.cos(end) * radius,\n            endY = fabric.util.sin(end) * radius,\n            largeFlag = angle > 180 ? '1' : '0';\n        svgString = [\n          '<path d=\"M ' + startX + ' ' + startY,\n          ' A ' + radius + ' ' + radius,\n          ' 0 ', +largeFlag + ' 1', ' ' + endX + ' ' + endY,\n          '\" ', 'COMMON_PARTS', ' />\\n'\n        ];\n      }\n      return svgString;\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n      ctx.arc(\n        0,\n        0,\n        this.radius,\n        degreesToRadians(this.startAngle),\n        degreesToRadians(this.endAngle),\n        false\n      );\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns horizontal radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRadiusX: function() {\n      return this.get('radius') * this.get('scaleX');\n    },\n\n    /**\n     * Returns vertical radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRadiusY: function() {\n      return this.get('radius') * this.get('scaleY');\n    },\n\n    /**\n     * Sets radius of an object (and updates width accordingly)\n     * @return {fabric.Circle} thisArg\n     */\n    setRadius: function(value) {\n      this.radius = value;\n      return this.set('width', value * 2).set('height', value * 2);\n    },\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n   * @static\n   * @memberOf fabric.Circle\n   * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n   */\n  fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n  /**\n   * Returns {@link fabric.Circle} instance from an SVG element\n   * @static\n   * @memberOf fabric.Circle\n   * @param {SVGElement} element Element to parse\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   * @param {Object} [options] Options object\n   * @throws {Error} If value of `r` attribute is missing or invalid\n   */\n  fabric.Circle.fromElement = function(element, callback) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n    if (!isValidRadius(parsedAttributes)) {\n      throw new Error('value of `r` attribute is required and can not be negative');\n    }\n\n    parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n    parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n    callback(new fabric.Circle(parsedAttributes));\n  };\n\n  /**\n   * @private\n   */\n  function isValidRadius(attributes) {\n    return (('radius' in attributes) && (attributes.radius >= 0));\n  }\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Circle} instance from an object representation\n   * @static\n   * @memberOf fabric.Circle\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   * @return {void}\n   */\n  fabric.Circle.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Circle', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.Triangle) {\n    fabric.warn('fabric.Triangle is already defined');\n    return;\n  }\n\n  /**\n   * Triangle class\n   * @class fabric.Triangle\n   * @extends fabric.Object\n   * @return {fabric.Triangle} thisArg\n   * @see {@link fabric.Triangle#initialize} for constructor definition\n   */\n  fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'triangle',\n\n    /**\n     * Width is set to 100 to compensate the old initialize code that was setting it to 100\n     * @type Number\n     * @default\n     */\n    width: 100,\n\n    /**\n     * Height is set to 100 to compensate the old initialize code that was setting it to 100\n     * @type Number\n     * @default\n     */\n    height: 100,\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      var widthBy2 = this.width / 2,\n          heightBy2 = this.height / 2;\n\n      ctx.beginPath();\n      ctx.moveTo(-widthBy2, heightBy2);\n      ctx.lineTo(0, -heightBy2);\n      ctx.lineTo(widthBy2, heightBy2);\n      ctx.closePath();\n\n      this._renderPaintInOrder(ctx);\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var widthBy2 = this.width / 2,\n          heightBy2 = this.height / 2,\n          points = [\n            -widthBy2 + ' ' + heightBy2,\n            '0 ' + -heightBy2,\n            widthBy2 + ' ' + heightBy2\n          ].join(',');\n      return [\n        '<polygon ', 'COMMON_PARTS',\n        'points=\"', points,\n        '\" />'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /**\n   * Returns {@link fabric.Triangle} instance from an object representation\n   * @static\n   * @memberOf fabric.Triangle\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   */\n  fabric.Triangle.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Triangle', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      piBy2   = Math.PI * 2;\n\n  if (fabric.Ellipse) {\n    fabric.warn('fabric.Ellipse is already defined.');\n    return;\n  }\n\n  /**\n   * Ellipse class\n   * @class fabric.Ellipse\n   * @extends fabric.Object\n   * @return {fabric.Ellipse} thisArg\n   * @see {@link fabric.Ellipse#initialize} for constructor definition\n   */\n  fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'ellipse',\n\n    /**\n     * Horizontal radius\n     * @type Number\n     * @default\n     */\n    rx:   0,\n\n    /**\n     * Vertical radius\n     * @type Number\n     * @default\n     */\n    ry:   0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @return {fabric.Ellipse} thisArg\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      this.set('rx', options && options.rx || 0);\n      this.set('ry', options && options.ry || 0);\n    },\n\n    /**\n     * @private\n     * @param {String} key\n     * @param {*} value\n     * @return {fabric.Ellipse} thisArg\n     */\n    _set: function(key, value) {\n      this.callSuper('_set', key, value);\n      switch (key) {\n\n        case 'rx':\n          this.rx = value;\n          this.set('width', value * 2);\n          break;\n\n        case 'ry':\n          this.ry = value;\n          this.set('height', value * 2);\n          break;\n\n      }\n      return this;\n    },\n\n    /**\n     * Returns horizontal radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRx: function() {\n      return this.get('rx') * this.get('scaleX');\n    },\n\n    /**\n     * Returns Vertical radius of an object (according to how an object is scaled)\n     * @return {Number}\n     */\n    getRy: function() {\n      return this.get('ry') * this.get('scaleY');\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      return [\n        '<ellipse ', 'COMMON_PARTS',\n        'cx=\"0\" cy=\"0\" ',\n        'rx=\"', this.rx,\n        '\" ry=\"', this.ry,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render on\n     */\n    _render: function(ctx) {\n      ctx.beginPath();\n      ctx.save();\n      ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n      ctx.arc(\n        0,\n        0,\n        this.rx,\n        0,\n        piBy2,\n        false);\n      ctx.restore();\n      this._renderPaintInOrder(ctx);\n    },\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n   * @static\n   * @memberOf fabric.Ellipse\n   * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n   */\n  fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n  /**\n   * Returns {@link fabric.Ellipse} instance from an SVG element\n   * @static\n   * @memberOf fabric.Ellipse\n   * @param {SVGElement} element Element to parse\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   * @return {fabric.Ellipse}\n   */\n  fabric.Ellipse.fromElement = function(element, callback) {\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n    parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n    parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n    callback(new fabric.Ellipse(parsedAttributes));\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Ellipse} instance from an object representation\n   * @static\n   * @memberOf fabric.Ellipse\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as first argument\n   * @return {void}\n   */\n  fabric.Ellipse.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Ellipse', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend;\n\n  if (fabric.Rect) {\n    fabric.warn('fabric.Rect is already defined');\n    return;\n  }\n\n  /**\n   * Rectangle class\n   * @class fabric.Rect\n   * @extends fabric.Object\n   * @return {fabric.Rect} thisArg\n   * @see {@link fabric.Rect#initialize} for constructor definition\n   */\n  fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n    /**\n     * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'rect',\n\n    /**\n     * Horizontal border radius\n     * @type Number\n     * @default\n     */\n    rx:   0,\n\n    /**\n     * Vertical border radius\n     * @type Number\n     * @default\n     */\n    ry:   0,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      this._initRxRy();\n    },\n\n    /**\n     * Initializes rx/ry attributes\n     * @private\n     */\n    _initRxRy: function() {\n      if (this.rx && !this.ry) {\n        this.ry = this.rx;\n      }\n      else if (this.ry && !this.rx) {\n        this.rx = this.ry;\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n\n      // 1x1 case (used in spray brush) optimization was removed because\n      // with caching and higher zoom level this makes more damage than help\n\n      var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n          ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n          w = this.width,\n          h = this.height,\n          x = -this.width / 2,\n          y = -this.height / 2,\n          isRounded = rx !== 0 || ry !== 0,\n          /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n          k = 1 - 0.5522847498;\n      ctx.beginPath();\n\n      ctx.moveTo(x + rx, y);\n\n      ctx.lineTo(x + w - rx, y);\n      isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n      ctx.lineTo(x + w, y + h - ry);\n      isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n      ctx.lineTo(x + rx, y + h);\n      isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n      ctx.lineTo(x, y + ry);\n      isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n      ctx.closePath();\n\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var x = -this.width / 2, y = -this.height / 2;\n      return [\n        '<rect ', 'COMMON_PARTS',\n        'x=\"', x, '\" y=\"', y,\n        '\" rx=\"', this.rx, '\" ry=\"', this.ry,\n        '\" width=\"', this.width, '\" height=\"', this.height,\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n   * @static\n   * @memberOf fabric.Rect\n   * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n   */\n  fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n  /**\n   * Returns {@link fabric.Rect} instance from an SVG element\n   * @static\n   * @memberOf fabric.Rect\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Rect.fromElement = function(element, callback, options) {\n    if (!element) {\n      return callback(null);\n    }\n    options = options || { };\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n    parsedAttributes.left = parsedAttributes.left || 0;\n    parsedAttributes.top  = parsedAttributes.top  || 0;\n    parsedAttributes.height  = parsedAttributes.height || 0;\n    parsedAttributes.width  = parsedAttributes.width || 0;\n    var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n    rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n    callback(rect);\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns {@link fabric.Rect} instance from an object representation\n   * @static\n   * @memberOf fabric.Rect\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n   */\n  fabric.Rect.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Rect', object, callback);\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      min = fabric.util.array.min,\n      max = fabric.util.array.max,\n      toFixed = fabric.util.toFixed,\n      projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n  if (fabric.Polyline) {\n    fabric.warn('fabric.Polyline is already defined');\n    return;\n  }\n\n  /**\n   * Polyline class\n   * @class fabric.Polyline\n   * @extends fabric.Object\n   * @see {@link fabric.Polyline#initialize} for constructor definition\n   */\n  fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'polyline',\n\n    /**\n     * Points array\n     * @type Array\n     * @default\n     */\n    points: null,\n\n    /**\n     * WARNING: Feature in progress\n     * Calculate the exact bounding box taking in account strokeWidth on acute angles\n     * this will be turned to true by default on fabric 6.0\n     * maybe will be left in as an optimization since calculations may be slow\n     * @deprecated\n     * @type Boolean\n     * @default false\n     */\n    exactBoundingBox: false,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n    /**\n     * Constructor\n     * @param {Array} points Array of points (where each point is an object with x and y)\n     * @param {Object} [options] Options object\n     * @return {fabric.Polyline} thisArg\n     * @example\n     * var poly = new fabric.Polyline([\n     *     { x: 10, y: 10 },\n     *     { x: 50, y: 30 },\n     *     { x: 40, y: 70 },\n     *     { x: 60, y: 50 },\n     *     { x: 100, y: 150 },\n     *     { x: 40, y: 100 }\n     *   ], {\n     *   stroke: 'red',\n     *   left: 100,\n     *   top: 100\n     * });\n     */\n    initialize: function(points, options) {\n      options = options || {};\n      this.points = points || [];\n      this.callSuper('initialize', options);\n      this._setPositionDimensions(options);\n    },\n\n    /**\n     * @private\n     */\n    _projectStrokeOnPoints: function () {\n      return projectStrokeOnPoints(this.points, this, true);\n    },\n\n    _setPositionDimensions: function(options) {\n      var calcDim = this._calcDimensions(options), correctLeftTop,\n          correctSize = this.exactBoundingBox ? this.strokeWidth : 0;\n      this.width = calcDim.width - correctSize;\n      this.height = calcDim.height - correctSize;\n      if (!options.fromSVG) {\n        correctLeftTop = this.translateToGivenOrigin(\n          {\n            // this looks bad, but is one way to keep it optional for now.\n            x: calcDim.left - this.strokeWidth / 2 + correctSize / 2,\n            y: calcDim.top - this.strokeWidth / 2 + correctSize / 2\n          },\n          'left',\n          'top',\n          this.originX,\n          this.originY\n        );\n      }\n      if (typeof options.left === 'undefined') {\n        this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n      }\n      if (typeof options.top === 'undefined') {\n        this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n      }\n      this.pathOffset = {\n        x: calcDim.left + this.width / 2 + correctSize / 2,\n        y: calcDim.top + this.height / 2 + correctSize / 2\n      };\n    },\n\n    /**\n     * Calculate the polygon min and max point from points array,\n     * returning an object with left, top, width, height to measure the\n     * polygon size\n     * @return {Object} object.left X coordinate of the polygon leftmost point\n     * @return {Object} object.top Y coordinate of the polygon topmost point\n     * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n     * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n     * @private\n     */\n    _calcDimensions: function() {\n\n      var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points,\n          minX = min(points, 'x') || 0,\n          minY = min(points, 'y') || 0,\n          maxX = max(points, 'x') || 0,\n          maxY = max(points, 'y') || 0,\n          width = (maxX - minX),\n          height = (maxY - minY);\n\n      return {\n        left: minX,\n        top: minY,\n        width: width,\n        height: height,\n      };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), {\n        points: this.points.concat()\n      });\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n      for (var i = 0, len = this.points.length; i < len; i++) {\n        points.push(\n          toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n          toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n        );\n      }\n      return [\n        '<' + this.type + ' ', 'COMMON_PARTS',\n        'points=\"', points.join(''),\n        '\" />\\n'\n      ];\n    },\n    /* _TO_SVG_END_ */\n\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    commonRender: function(ctx) {\n      var point, len = this.points.length,\n          x = this.pathOffset.x,\n          y = this.pathOffset.y;\n\n      if (!len || isNaN(this.points[len - 1].y)) {\n        // do not draw if no points or odd points\n        // NaN comes from parseFloat of a empty string in parser\n        return false;\n      }\n      ctx.beginPath();\n      ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n      for (var i = 0; i < len; i++) {\n        point = this.points[i];\n        ctx.lineTo(point.x - x, point.y - y);\n      }\n      return true;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      if (!this.commonRender(ctx)) {\n        return;\n      }\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity of this instance\n     */\n    complexity: function() {\n      return this.get('points').length;\n    }\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n   * @static\n   * @memberOf fabric.Polyline\n   * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n   */\n  fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n  /**\n   * Returns fabric.Polyline instance from an SVG element\n   * @static\n   * @memberOf fabric.Polyline\n   * @param {SVGElement} element Element to parser\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Polyline.fromElementGenerator = function(_class) {\n    return function(element, callback, options) {\n      if (!element) {\n        return callback(null);\n      }\n      options || (options = { });\n\n      var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n          parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n      parsedAttributes.fromSVG = true;\n      callback(new fabric[_class](points, extend(parsedAttributes, options)));\n    };\n  };\n\n  fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Polyline instance from an object representation\n   * @static\n   * @memberOf fabric.Polyline\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   */\n  fabric.Polyline.fromObject = function(object, callback) {\n    return fabric.Object._fromObject('Polyline', object, callback, 'points');\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = {}),\n      projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n  if (fabric.Polygon) {\n    fabric.warn('fabric.Polygon is already defined');\n    return;\n  }\n\n  /**\n   * Polygon class\n   * @class fabric.Polygon\n   * @extends fabric.Polyline\n   * @see {@link fabric.Polygon#initialize} for constructor definition\n   */\n  fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'polygon',\n\n    /**\n     * @private\n     */\n    _projectStrokeOnPoints: function () {\n      return projectStrokeOnPoints(this.points, this);\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      if (!this.commonRender(ctx)) {\n        return;\n      }\n      ctx.closePath();\n      this._renderPaintInOrder(ctx);\n    },\n\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n   * @static\n   * @memberOf fabric.Polygon\n   * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n   */\n  fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n  /**\n   * Returns {@link fabric.Polygon} instance from an SVG element\n   * @static\n   * @memberOf fabric.Polygon\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Polygon instance from an object representation\n   * @static\n   * @memberOf fabric.Polygon\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   * @return {void}\n   */\n  fabric.Polygon.fromObject = function(object, callback) {\n    fabric.Object._fromObject('Polygon', object, callback, 'points');\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      min = fabric.util.array.min,\n      max = fabric.util.array.max,\n      extend = fabric.util.object.extend,\n      clone = fabric.util.object.clone,\n      toFixed = fabric.util.toFixed;\n\n  if (fabric.Path) {\n    fabric.warn('fabric.Path is already defined');\n    return;\n  }\n\n  /**\n   * Path class\n   * @class fabric.Path\n   * @extends fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n   * @see {@link fabric.Path#initialize} for constructor definition\n   */\n  fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'path',\n\n    /**\n     * Array of path points\n     * @type Array\n     * @default\n     */\n    path: null,\n\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n    stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n    /**\n     * Constructor\n     * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n     * @param {Object} [options] Options object\n     * @return {fabric.Path} thisArg\n     */\n    initialize: function (path, options) {\n      options = clone(options || {});\n      delete options.path;\n      this.callSuper('initialize', options);\n      this._setPath(path || [], options);\n    },\n\n    /**\n    * @private\n    * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n    * @param {Object} [options] Options object\n    */\n    _setPath: function (path, options) {\n      this.path = fabric.util.makePathSimpler(\n        Array.isArray(path) ? path : fabric.util.parsePath(path)\n      );\n\n      fabric.Polyline.prototype._setPositionDimensions.call(this, options || {});\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render path on\n     */\n    _renderPathCommands: function(ctx) {\n      var current, // current instruction\n          subpathStartX = 0,\n          subpathStartY = 0,\n          x = 0, // current x\n          y = 0, // current y\n          controlX = 0, // current control point x\n          controlY = 0, // current control point y\n          l = -this.pathOffset.x,\n          t = -this.pathOffset.y;\n\n      ctx.beginPath();\n\n      for (var i = 0, len = this.path.length; i < len; ++i) {\n\n        current = this.path[i];\n\n        switch (current[0]) { // first letter\n\n          case 'L': // lineto, absolute\n            x = current[1];\n            y = current[2];\n            ctx.lineTo(x + l, y + t);\n            break;\n\n          case 'M': // moveTo, absolute\n            x = current[1];\n            y = current[2];\n            subpathStartX = x;\n            subpathStartY = y;\n            ctx.moveTo(x + l, y + t);\n            break;\n\n          case 'C': // bezierCurveTo, absolute\n            x = current[5];\n            y = current[6];\n            controlX = current[3];\n            controlY = current[4];\n            ctx.bezierCurveTo(\n              current[1] + l,\n              current[2] + t,\n              controlX + l,\n              controlY + t,\n              x + l,\n              y + t\n            );\n            break;\n\n          case 'Q': // quadraticCurveTo, absolute\n            ctx.quadraticCurveTo(\n              current[1] + l,\n              current[2] + t,\n              current[3] + l,\n              current[4] + t\n            );\n            x = current[3];\n            y = current[4];\n            controlX = current[1];\n            controlY = current[2];\n            break;\n\n          case 'z':\n          case 'Z':\n            x = subpathStartX;\n            y = subpathStartY;\n            ctx.closePath();\n            break;\n        }\n      }\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx context to render path on\n     */\n    _render: function(ctx) {\n      this._renderPathCommands(ctx);\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} string representation of an instance\n     */\n    toString: function() {\n      return '#<fabric.Path (' + this.complexity() +\n        '): { \"top\": ' + this.top + ', \"left\": ' + this.left + ' }>';\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return extend(this.callSuper('toObject', propertiesToInclude), {\n        path: this.path.map(function(item) { return item.slice(); }),\n      });\n    },\n\n    /**\n     * Returns dataless object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n      if (o.sourcePath) {\n        delete o.path;\n      }\n      return o;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var path = fabric.util.joinPath(this.path);\n      return [\n        '<path ', 'COMMON_PARTS',\n        'd=\"', path,\n        '\" stroke-linecap=\"round\" ',\n        '/>\\n'\n      ];\n    },\n\n    _getOffsetTransform: function() {\n      var digits = fabric.Object.NUM_FRACTION_DIGITS;\n      return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n          toFixed(-this.pathOffset.y, digits) + ')';\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      var additionalTransform = this._getOffsetTransform();\n      return '\\t' + this._createBaseClipPathSVGMarkup(\n        this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n      );\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      var additionalTransform = this._getOffsetTransform();\n      return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform  });\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns number representation of an instance complexity\n     * @return {Number} complexity of this instance\n     */\n    complexity: function() {\n      return this.path.length;\n    },\n\n    /**\n     * @private\n     */\n    _calcDimensions: function() {\n\n      var aX = [],\n          aY = [],\n          current, // current instruction\n          subpathStartX = 0,\n          subpathStartY = 0,\n          x = 0, // current x\n          y = 0, // current y\n          bounds;\n\n      for (var i = 0, len = this.path.length; i < len; ++i) {\n\n        current = this.path[i];\n\n        switch (current[0]) { // first letter\n\n          case 'L': // lineto, absolute\n            x = current[1];\n            y = current[2];\n            bounds = [];\n            break;\n\n          case 'M': // moveTo, absolute\n            x = current[1];\n            y = current[2];\n            subpathStartX = x;\n            subpathStartY = y;\n            bounds = [];\n            break;\n\n          case 'C': // bezierCurveTo, absolute\n            bounds = fabric.util.getBoundsOfCurve(x, y,\n              current[1],\n              current[2],\n              current[3],\n              current[4],\n              current[5],\n              current[6]\n            );\n            x = current[5];\n            y = current[6];\n            break;\n\n          case 'Q': // quadraticCurveTo, absolute\n            bounds = fabric.util.getBoundsOfCurve(x, y,\n              current[1],\n              current[2],\n              current[1],\n              current[2],\n              current[3],\n              current[4]\n            );\n            x = current[3];\n            y = current[4];\n            break;\n\n          case 'z':\n          case 'Z':\n            x = subpathStartX;\n            y = subpathStartY;\n            break;\n        }\n        bounds.forEach(function (point) {\n          aX.push(point.x);\n          aY.push(point.y);\n        });\n        aX.push(x);\n        aY.push(y);\n      }\n\n      var minX = min(aX) || 0,\n          minY = min(aY) || 0,\n          maxX = max(aX) || 0,\n          maxY = max(aY) || 0,\n          deltaX = maxX - minX,\n          deltaY = maxY - minY;\n\n      return {\n        left: minX,\n        top: minY,\n        width: deltaX,\n        height: deltaY\n      };\n    }\n  });\n\n  /**\n   * Creates an instance of fabric.Path from an object\n   * @static\n   * @memberOf fabric.Path\n   * @param {Object} object\n   * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n   */\n  fabric.Path.fromObject = function(object, callback) {\n    if (typeof object.sourcePath === 'string') {\n      var pathUrl = object.sourcePath;\n      fabric.loadSVGFromURL(pathUrl, function (elements) {\n        var path = elements[0];\n        path.setOptions(object);\n        if (object.clipPath) {\n          fabric.util.enlivenObjects([object.clipPath], function(elivenedObjects) {\n            path.clipPath = elivenedObjects[0];\n            callback && callback(path);\n          });\n        }\n        else {\n          callback && callback(path);\n        }\n      });\n    }\n    else {\n      fabric.Object._fromObject('Path', object, callback, 'path');\n    }\n  };\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n   * @static\n   * @memberOf fabric.Path\n   * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n   */\n  fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n  /**\n   * Creates an instance of fabric.Path from an SVG <path> element\n   * @static\n   * @memberOf fabric.Path\n   * @param {SVGElement} element to parse\n   * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n   * @param {Object} [options] Options object\n   * @param {Function} [callback] Options callback invoked after parsing is finished\n   */\n  fabric.Path.fromElement = function(element, callback, options) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n    parsedAttributes.fromSVG = true;\n    callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n  };\n  /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      min = fabric.util.array.min,\n      max = fabric.util.array.max;\n\n  if (fabric.Group) {\n    return;\n  }\n\n  /**\n   * Group class\n   * @class fabric.Group\n   * @extends fabric.Object\n   * @mixes fabric.Collection\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n   * @see {@link fabric.Group#initialize} for constructor definition\n   */\n  fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'group',\n\n    /**\n     * Width of stroke\n     * @type Number\n     * @default\n     */\n    strokeWidth: 0,\n\n    /**\n     * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n     * @type Boolean\n     * @default\n     */\n    subTargetCheck: false,\n\n    /**\n     * Groups are container, do not render anything on theyr own, ence no cache properties\n     * @type Array\n     * @default\n     */\n    cacheProperties: [],\n\n    /**\n     * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n     * available setting this boolean to true.\n     * @type Boolean\n     * @since 2.0.0\n     * @default\n     */\n    useSetOnGroup: false,\n\n    /**\n     * Constructor\n     * @param {Object} objects Group objects\n     * @param {Object} [options] Options object\n     * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n     * @return {Object} thisArg\n     */\n    initialize: function(objects, options, isAlreadyGrouped) {\n      options = options || {};\n      this._objects = [];\n      // if objects enclosed in a group have been grouped already,\n      // we cannot change properties of objects.\n      // Thus we need to set options to group without objects,\n      isAlreadyGrouped && this.callSuper('initialize', options);\n      this._objects = objects || [];\n      for (var i = this._objects.length; i--; ) {\n        this._objects[i].group = this;\n      }\n\n      if (!isAlreadyGrouped) {\n        var center = options && options.centerPoint;\n        // we want to set origins before calculating the bounding box.\n        // so that the topleft can be set with that in mind.\n        // if specific top and left are passed, are overwritten later\n        // with the callSuper('initialize', options)\n        if (options.originX !== undefined) {\n          this.originX = options.originX;\n        }\n        if (options.originY !== undefined) {\n          this.originY = options.originY;\n        }\n        // if coming from svg i do not want to calc bounds.\n        // i assume width and height are passed along options\n        center || this._calcBounds();\n        this._updateObjectsCoords(center);\n        delete options.centerPoint;\n        this.callSuper('initialize', options);\n      }\n      else {\n        this._updateObjectsACoords();\n      }\n\n      this.setCoords();\n    },\n\n    /**\n     * @private\n     */\n    _updateObjectsACoords: function() {\n      var skipControls = true;\n      for (var i = this._objects.length; i--; ){\n        this._objects[i].setCoords(skipControls);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n     */\n    _updateObjectsCoords: function(center) {\n      var center = center || this.getCenterPoint();\n      for (var i = this._objects.length; i--; ){\n        this._updateObjectCoords(this._objects[i], center);\n      }\n    },\n\n    /**\n     * @private\n     * @param {Object} object\n     * @param {fabric.Point} center, current center of group.\n     */\n    _updateObjectCoords: function(object, center) {\n      var objectLeft = object.left,\n          objectTop = object.top,\n          skipControls = true;\n\n      object.set({\n        left: objectLeft - center.x,\n        top: objectTop - center.y\n      });\n      object.group = this;\n      object.setCoords(skipControls);\n    },\n\n    /**\n     * Returns string represenation of a group\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.Group: (' + this.complexity() + ')>';\n    },\n\n    /**\n     * Adds an object to a group; Then recalculates group's dimension, position.\n     * @param {Object} object\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    addWithUpdate: function(object) {\n      var nested = !!this.group;\n      this._restoreObjectsState();\n      fabric.util.resetObjectTransform(this);\n      if (object) {\n        if (nested) {\n          // if this group is inside another group, we need to pre transform the object\n          fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix());\n        }\n        this._objects.push(object);\n        object.group = this;\n        object._set('canvas', this.canvas);\n      }\n      this._calcBounds();\n      this._updateObjectsCoords();\n      this.dirty = true;\n      if (nested) {\n        this.group.addWithUpdate();\n      }\n      else {\n        this.setCoords();\n      }\n      return this;\n    },\n\n    /**\n     * Removes an object from a group; Then recalculates group's dimension, position.\n     * @param {Object} object\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    removeWithUpdate: function(object) {\n      this._restoreObjectsState();\n      fabric.util.resetObjectTransform(this);\n\n      this.remove(object);\n      this._calcBounds();\n      this._updateObjectsCoords();\n      this.setCoords();\n      this.dirty = true;\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _onObjectAdded: function(object) {\n      this.dirty = true;\n      object.group = this;\n      object._set('canvas', this.canvas);\n    },\n\n    /**\n     * @private\n     */\n    _onObjectRemoved: function(object) {\n      this.dirty = true;\n      delete object.group;\n    },\n\n    /**\n     * @private\n     */\n    _set: function(key, value) {\n      var i = this._objects.length;\n      if (this.useSetOnGroup) {\n        while (i--) {\n          this._objects[i].setOnGroup(key, value);\n        }\n      }\n      if (key === 'canvas') {\n        while (i--) {\n          this._objects[i]._set(key, value);\n        }\n      }\n      fabric.Object.prototype._set.call(this, key, value);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var _includeDefaultValues = this.includeDefaultValues;\n      var objsToObject = this._objects\n        .filter(function (obj) {\n          return !obj.excludeFromExport;\n        })\n        .map(function (obj) {\n          var originalDefaults = obj.includeDefaultValues;\n          obj.includeDefaultValues = _includeDefaultValues;\n          var _obj = obj.toObject(propertiesToInclude);\n          obj.includeDefaultValues = originalDefaults;\n          return _obj;\n        });\n      var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n      obj.objects = objsToObject;\n      return obj;\n    },\n\n    /**\n     * Returns object representation of an instance, in dataless mode.\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toDatalessObject: function(propertiesToInclude) {\n      var objsToObject, sourcePath = this.sourcePath;\n      if (sourcePath) {\n        objsToObject = sourcePath;\n      }\n      else {\n        var _includeDefaultValues = this.includeDefaultValues;\n        objsToObject = this._objects.map(function(obj) {\n          var originalDefaults = obj.includeDefaultValues;\n          obj.includeDefaultValues = _includeDefaultValues;\n          var _obj = obj.toDatalessObject(propertiesToInclude);\n          obj.includeDefaultValues = originalDefaults;\n          return _obj;\n        });\n      }\n      var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n      obj.objects = objsToObject;\n      return obj;\n    },\n\n    /**\n     * Renders instance on a given context\n     * @param {CanvasRenderingContext2D} ctx context to render instance on\n     */\n    render: function(ctx) {\n      this._transformDone = true;\n      this.callSuper('render', ctx);\n      this._transformDone = false;\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group is already cached.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      var ownCache = fabric.Object.prototype.shouldCache.call(this);\n      if (ownCache) {\n        for (var i = 0, len = this._objects.length; i < len; i++) {\n          if (this._objects[i].willDrawShadow()) {\n            this.ownCaching = false;\n            return false;\n          }\n        }\n      }\n      return ownCache;\n    },\n\n    /**\n     * Check if this object or a child object will cast a shadow\n     * @return {Boolean}\n     */\n    willDrawShadow: function() {\n      if (fabric.Object.prototype.willDrawShadow.call(this)) {\n        return true;\n      }\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        if (this._objects[i].willDrawShadow()) {\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Check if this group or its parent group are caching, recursively up\n     * @return {Boolean}\n     */\n    isOnACache: function() {\n      return this.ownCaching || (this.group && this.group.isOnACache());\n    },\n\n    /**\n     * Execute the drawing operation for an object on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawObject: function(ctx) {\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        this._objects[i].render(ctx);\n      }\n      this._drawClipPath(ctx, this.clipPath);\n    },\n\n    /**\n     * Check if cache is dirty\n     */\n    isCacheDirty: function(skipCanvas) {\n      if (this.callSuper('isCacheDirty', skipCanvas)) {\n        return true;\n      }\n      if (!this.statefullCache) {\n        return false;\n      }\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        if (this._objects[i].isCacheDirty(true)) {\n          if (this._cacheCanvas) {\n            // if this group has not a cache canvas there is nothing to clean\n            var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n            this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n          }\n          return true;\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Restores original state of each of group objects (original state is that which was before group was created).\n     * if the nested boolean is true, the original state will be restored just for the\n     * first group and not for all the group chain\n     * @private\n     * @param {Boolean} nested tell the function to restore object state up to the parent group and not more\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    _restoreObjectsState: function() {\n      var groupMatrix = this.calcOwnMatrix();\n      this._objects.forEach(function(object) {\n        // instead of using _this = this;\n        fabric.util.addTransformToObject(object, groupMatrix);\n        delete object.group;\n        object.setCoords();\n      });\n      return this;\n    },\n\n    /**\n     * Destroys a group (restoring state of its objects)\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    destroy: function() {\n      // when group is destroyed objects needs to get a repaint to be eventually\n      // displayed on canvas.\n      this._objects.forEach(function(object) {\n        object.set('dirty', true);\n      });\n      return this._restoreObjectsState();\n    },\n\n    dispose: function () {\n      this.callSuper('dispose');\n      this.forEachObject(function (object) {\n        object.dispose && object.dispose();\n      });\n      this._objects = [];\n    },\n\n    /**\n     * make a group an active selection, remove the group from canvas\n     * the group has to be on canvas for this to work.\n     * @return {fabric.ActiveSelection} thisArg\n     * @chainable\n     */\n    toActiveSelection: function() {\n      if (!this.canvas) {\n        return;\n      }\n      var objects = this._objects, canvas = this.canvas;\n      this._objects = [];\n      var options = this.toObject();\n      delete options.objects;\n      var activeSelection = new fabric.ActiveSelection([]);\n      activeSelection.set(options);\n      activeSelection.type = 'activeSelection';\n      canvas.remove(this);\n      objects.forEach(function(object) {\n        object.group = activeSelection;\n        object.dirty = true;\n        canvas.add(object);\n      });\n      activeSelection.canvas = canvas;\n      activeSelection._objects = objects;\n      canvas._activeObject = activeSelection;\n      activeSelection.setCoords();\n      return activeSelection;\n    },\n\n    /**\n     * Destroys a group (restoring state of its objects)\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    ungroupOnCanvas: function() {\n      return this._restoreObjectsState();\n    },\n\n    /**\n     * Sets coordinates of all objects inside group\n     * @return {fabric.Group} thisArg\n     * @chainable\n     */\n    setObjectsCoords: function() {\n      var skipControls = true;\n      this.forEachObject(function(object) {\n        object.setCoords(skipControls);\n      });\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _calcBounds: function(onlyWidthHeight) {\n      var aX = [],\n          aY = [],\n          o, prop, coords,\n          props = ['tr', 'br', 'bl', 'tl'],\n          i = 0, iLen = this._objects.length,\n          j, jLen = props.length;\n\n      for ( ; i < iLen; ++i) {\n        o = this._objects[i];\n        coords = o.calcACoords();\n        for (j = 0; j < jLen; j++) {\n          prop = props[j];\n          aX.push(coords[prop].x);\n          aY.push(coords[prop].y);\n        }\n        o.aCoords = coords;\n      }\n\n      this._getBounds(aX, aY, onlyWidthHeight);\n    },\n\n    /**\n     * @private\n     */\n    _getBounds: function(aX, aY, onlyWidthHeight) {\n      var minXY = new fabric.Point(min(aX), min(aY)),\n          maxXY = new fabric.Point(max(aX), max(aY)),\n          top = minXY.y || 0, left = minXY.x || 0,\n          width = (maxXY.x - minXY.x) || 0,\n          height = (maxXY.y - minXY.y) || 0;\n      this.width = width;\n      this.height = height;\n      if (!onlyWidthHeight) {\n        // the bounding box always finds the topleft most corner.\n        // whatever is the group origin, we set up here the left/top position.\n        this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n      }\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    _toSVG: function(reviver) {\n      var svgString = ['<g ', 'COMMON_PARTS', ' >\\n'];\n\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n      }\n      svgString.push('</g>\\n');\n      return svgString;\n    },\n\n    /**\n     * Returns styles-string for svg-export, specific version for group\n     * @return {String}\n     */\n    getSvgStyles: function() {\n      var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n            'opacity: ' + this.opacity + ';' : '',\n          visibility = this.visible ? '' : ' visibility: hidden;';\n      return [\n        opacity,\n        this.getSvgFilter(),\n        visibility\n      ].join('');\n    },\n\n    /**\n     * Returns svg clipPath representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toClipPathSVG: function(reviver) {\n      var svgString = [];\n\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n      }\n\n      return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n    },\n    /* _TO_SVG_END_ */\n  });\n\n  /**\n   * Returns {@link fabric.Group} instance from an object representation\n   * @static\n   * @memberOf fabric.Group\n   * @param {Object} object Object to create a group from\n   * @param {Function} [callback] Callback to invoke when an group instance is created\n   */\n  fabric.Group.fromObject = function(object, callback) {\n    var objects = object.objects,\n        options = fabric.util.object.clone(object, true);\n    delete options.objects;\n    if (typeof objects === 'string') {\n      // it has to be an url or something went wrong.\n      fabric.loadSVGFromURL(objects, function (elements) {\n        var group = fabric.util.groupSVGElements(elements, object, objects);\n        var clipPath = options.clipPath;\n        delete options.clipPath;\n        group.set(options);\n        if (clipPath) {\n          fabric.util.enlivenObjects([clipPath], function(elivenedObjects) {\n            group.clipPath = elivenedObjects[0];\n            callback && callback(group);\n          });\n        }\n        else {\n          callback && callback(group);\n        }\n      });\n      return;\n    }\n    fabric.util.enlivenObjects(objects, function (enlivenedObjects) {\n      fabric.util.enlivenObjectEnlivables(object, options, function () {\n        callback && callback(new fabric.Group(enlivenedObjects, options, true));\n      });\n    });\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { });\n\n  if (fabric.ActiveSelection) {\n    return;\n  }\n\n  /**\n   * Group class\n   * @class fabric.ActiveSelection\n   * @extends fabric.Group\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n   * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n   */\n  fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'activeSelection',\n\n    /**\n     * Constructor\n     * @param {Object} objects ActiveSelection objects\n     * @param {Object} [options] Options object\n     * @return {Object} thisArg\n     */\n    initialize: function(objects, options) {\n      options = options || {};\n      this._objects = objects || [];\n      for (var i = this._objects.length; i--; ) {\n        this._objects[i].group = this;\n      }\n\n      if (options.originX) {\n        this.originX = options.originX;\n      }\n      if (options.originY) {\n        this.originY = options.originY;\n      }\n      this._calcBounds();\n      this._updateObjectsCoords();\n      fabric.Object.prototype.initialize.call(this, options);\n      this.setCoords();\n    },\n\n    /**\n     * Change te activeSelection to a normal group,\n     * High level function that automatically adds it to canvas as\n     * active object. no events fired.\n     * @since 2.0.0\n     * @return {fabric.Group}\n     */\n    toGroup: function() {\n      var objects = this._objects.concat();\n      this._objects = [];\n      var options = fabric.Object.prototype.toObject.call(this);\n      var newGroup = new fabric.Group([]);\n      delete options.type;\n      newGroup.set(options);\n      objects.forEach(function(object) {\n        object.canvas.remove(object);\n        object.group = newGroup;\n      });\n      newGroup._objects = objects;\n      if (!this.canvas) {\n        return newGroup;\n      }\n      var canvas = this.canvas;\n      canvas.add(newGroup);\n      canvas._activeObject = newGroup;\n      newGroup.setCoords();\n      return newGroup;\n    },\n\n    /**\n     * If returns true, deselection is cancelled.\n     * @since 2.0.0\n     * @return {Boolean} [cancel]\n     */\n    onDeselect: function() {\n      this.destroy();\n      return false;\n    },\n\n    /**\n     * Returns string representation of a group\n     * @return {String}\n     */\n    toString: function() {\n      return '#<fabric.ActiveSelection: (' + this.complexity() + ')>';\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * objectCaching is a global flag, wins over everything\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      return false;\n    },\n\n    /**\n     * Check if this group or its parent group are caching, recursively up\n     * @return {Boolean}\n     */\n    isOnACache: function() {\n      return false;\n    },\n\n    /**\n     * Renders controls and borders for the object\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [styleOverride] properties to override the object style\n     * @param {Object} [childrenOverride] properties to override the children overrides\n     */\n    _renderControls: function(ctx, styleOverride, childrenOverride) {\n      ctx.save();\n      ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n      this.callSuper('_renderControls', ctx, styleOverride);\n      childrenOverride = childrenOverride || { };\n      if (typeof childrenOverride.hasControls === 'undefined') {\n        childrenOverride.hasControls = false;\n      }\n      childrenOverride.forActiveSelection = true;\n      for (var i = 0, len = this._objects.length; i < len; i++) {\n        this._objects[i]._renderControls(ctx, childrenOverride);\n      }\n      ctx.restore();\n    },\n  });\n\n  /**\n   * Returns {@link fabric.ActiveSelection} instance from an object representation\n   * @static\n   * @memberOf fabric.ActiveSelection\n   * @param {Object} object Object to create a group from\n   * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n   */\n  fabric.ActiveSelection.fromObject = function(object, callback) {\n    fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n      delete object.objects;\n      callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n    });\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var extend = fabric.util.object.extend;\n\n  if (!global.fabric) {\n    global.fabric = { };\n  }\n\n  if (global.fabric.Image) {\n    fabric.warn('fabric.Image is already defined.');\n    return;\n  }\n\n  /**\n   * Image class\n   * @class fabric.Image\n   * @extends fabric.Object\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n   * @see {@link fabric.Image#initialize} for constructor definition\n   */\n  fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'image',\n\n    /**\n     * Width of a stroke.\n     * For image quality a stroke multiple of 2 gives better results.\n     * @type Number\n     * @default\n     */\n    strokeWidth: 0,\n\n    /**\n     * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n     * This allows for relative urls as image src.\n     * @since 2.7.0\n     * @type Boolean\n     * @default\n     */\n    srcFromAttribute: false,\n\n    /**\n     * private\n     * contains last value of scaleX to detect\n     * if the Image got resized after the last Render\n     * @type Number\n     */\n    _lastScaleX: 1,\n\n    /**\n     * private\n     * contains last value of scaleY to detect\n     * if the Image got resized after the last Render\n     * @type Number\n     */\n    _lastScaleY: 1,\n\n    /**\n     * private\n     * contains last value of scaling applied by the apply filter chain\n     * @type Number\n     */\n    _filterScalingX: 1,\n\n    /**\n     * private\n     * contains last value of scaling applied by the apply filter chain\n     * @type Number\n     */\n    _filterScalingY: 1,\n\n    /**\n     * minimum scale factor under which any resizeFilter is triggered to resize the image\n     * 0 will disable the automatic resize. 1 will trigger automatically always.\n     * number bigger than 1 are not implemented yet.\n     * @type Number\n     */\n    minimumScaleTrigger: 0.5,\n\n    /**\n     * List of properties to consider when checking if\n     * state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n     * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n     * and refreshed at the next render\n     * @type Array\n     */\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'),\n\n    /**\n     * key used to retrieve the texture representing this image\n     * @since 2.0.0\n     * @type String\n     * @default\n     */\n    cacheKey: '',\n\n    /**\n     * Image crop in pixels from original image size.\n     * @since 2.0.0\n     * @type Number\n     * @default\n     */\n    cropX: 0,\n\n    /**\n     * Image crop in pixels from original image size.\n     * @since 2.0.0\n     * @type Number\n     * @default\n     */\n    cropY: 0,\n\n    /**\n     * Indicates whether this canvas will use image smoothing when painting this image.\n     * Also influence if the cacheCanvas for this image uses imageSmoothing\n     * @since 4.0.0-beta.11\n     * @type Boolean\n     * @default\n     */\n    imageSmoothing: true,\n\n    /**\n     * Constructor\n     * Image can be initialized with any canvas drawable or a string.\n     * The string should be a url and will be loaded as an image.\n     * Canvas and Image element work out of the box, while videos require extra code to work.\n     * Please check video element events for seeking.\n     * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element\n     * @param {Object} [options] Options object\n     * @param {function} [callback] callback function to call after eventual filters applied.\n     * @return {fabric.Image} thisArg\n     */\n    initialize: function(element, options) {\n      options || (options = { });\n      this.filters = [];\n      this.cacheKey = 'texture' + fabric.Object.__uid++;\n      this.callSuper('initialize', options);\n      this._initElement(element, options);\n    },\n\n    /**\n     * Returns image element which this instance if based on\n     * @return {HTMLImageElement} Image element\n     */\n    getElement: function() {\n      return this._element || {};\n    },\n\n    /**\n     * Sets image element for this instance to a specified one.\n     * If filters defined they are applied to new image.\n     * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n     * @param {HTMLImageElement} element\n     * @param {Object} [options] Options object\n     * @return {fabric.Image} thisArg\n     * @chainable\n     */\n    setElement: function(element, options) {\n      this.removeTexture(this.cacheKey);\n      this.removeTexture(this.cacheKey + '_filtered');\n      this._element = element;\n      this._originalElement = element;\n      this._initConfig(options);\n      if (this.filters.length !== 0) {\n        this.applyFilters();\n      }\n      // resizeFilters work on the already filtered copy.\n      // we need to apply resizeFilters AFTER normal filters.\n      // applyResizeFilters is run more often than normal filters\n      // and is triggered by user interactions rather than dev code\n      if (this.resizeFilter) {\n        this.applyResizeFilters();\n      }\n      return this;\n    },\n\n    /**\n     * Delete a single texture if in webgl mode\n     */\n    removeTexture: function(key) {\n      var backend = fabric.filterBackend;\n      if (backend && backend.evictCachesForKey) {\n        backend.evictCachesForKey(key);\n      }\n    },\n\n    /**\n     * Delete textures, reference to elements and eventually JSDOM cleanup\n     */\n    dispose: function () {\n      this.callSuper('dispose');\n      this.removeTexture(this.cacheKey);\n      this.removeTexture(this.cacheKey + '_filtered');\n      this._cacheContext = undefined;\n      ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n        fabric.util.cleanUpJsdomNode(this[element]);\n        this[element] = undefined;\n      }).bind(this));\n    },\n\n    /**\n     * Get the crossOrigin value (of the corresponding image element)\n     */\n    getCrossOrigin: function() {\n      return this._originalElement && (this._originalElement.crossOrigin || null);\n    },\n\n    /**\n     * Returns original size of an image\n     * @return {Object} Object with \"width\" and \"height\" properties\n     */\n    getOriginalSize: function() {\n      var element = this.getElement();\n      return {\n        width: element.naturalWidth || element.width,\n        height: element.naturalHeight || element.height\n      };\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _stroke: function(ctx) {\n      if (!this.stroke || this.strokeWidth === 0) {\n        return;\n      }\n      var w = this.width / 2, h = this.height / 2;\n      ctx.beginPath();\n      ctx.moveTo(-w, -h);\n      ctx.lineTo(w, -h);\n      ctx.lineTo(w, h);\n      ctx.lineTo(-w, h);\n      ctx.lineTo(-w, -h);\n      ctx.closePath();\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var filters = [];\n\n      this.filters.forEach(function(filterObj) {\n        if (filterObj) {\n          filters.push(filterObj.toObject());\n        }\n      });\n      var object = extend(\n        this.callSuper(\n          'toObject',\n          ['cropX', 'cropY'].concat(propertiesToInclude)\n        ), {\n          src: this.getSrc(),\n          crossOrigin: this.getCrossOrigin(),\n          filters: filters,\n        });\n      if (this.resizeFilter) {\n        object.resizeFilter = this.resizeFilter.toObject();\n      }\n      return object;\n    },\n\n    /**\n     * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n     * @return {Boolean}\n     */\n    hasCrop: function() {\n      return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n    },\n\n    /* _TO_SVG_START_ */\n    /**\n     * Returns svg representation of an instance\n     * @return {Array} an array of strings with the specific svg representation\n     * of the instance\n     */\n    _toSVG: function() {\n      var svgString = [], imageMarkup = [], strokeSvg, element = this._element,\n          x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = '';\n      if (!element) {\n        return [];\n      }\n      if (this.hasCrop()) {\n        var clipPathId = fabric.Object.__uid++;\n        svgString.push(\n          '<clipPath id=\"imageCrop_' + clipPathId + '\">\\n',\n          '\\t<rect x=\"' + x + '\" y=\"' + y + '\" width=\"' + this.width + '\" height=\"' + this.height + '\" />\\n',\n          '</clipPath>\\n'\n        );\n        clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n      }\n      if (!this.imageSmoothing) {\n        imageRendering = '\" image-rendering=\"optimizeSpeed';\n      }\n      imageMarkup.push('\\t<image ', 'COMMON_PARTS', 'xlink:href=\"', this.getSvgSrc(true),\n        '\" x=\"', x - this.cropX, '\" y=\"', y - this.cropY,\n        // we're essentially moving origin of transformation from top/left corner to the center of the shape\n        // by wrapping it in container <g> element with actual transformation, then offsetting object to the top/left\n        // so that object's center aligns with container's left/top\n        '\" width=\"', element.width || element.naturalWidth,\n        '\" height=\"', element.height || element.height,\n        imageRendering,\n        '\"', clipPath,\n        '></image>\\n');\n\n      if (this.stroke || this.strokeDashArray) {\n        var origFill = this.fill;\n        this.fill = null;\n        strokeSvg = [\n          '\\t<rect ',\n          'x=\"', x, '\" y=\"', y,\n          '\" width=\"', this.width, '\" height=\"', this.height,\n          '\" style=\"', this.getSvgStyles(),\n          '\"/>\\n'\n        ];\n        this.fill = origFill;\n      }\n      if (this.paintFirst !== 'fill') {\n        svgString = svgString.concat(strokeSvg, imageMarkup);\n      }\n      else {\n        svgString = svgString.concat(imageMarkup, strokeSvg);\n      }\n      return svgString;\n    },\n    /* _TO_SVG_END_ */\n\n    /**\n     * Returns source of an image\n     * @param {Boolean} filtered indicates if the src is needed for svg\n     * @return {String} Source of an image\n     */\n    getSrc: function(filtered) {\n      var element = filtered ? this._element : this._originalElement;\n      if (element) {\n        if (element.toDataURL) {\n          return element.toDataURL();\n        }\n\n        if (this.srcFromAttribute) {\n          return element.getAttribute('src');\n        }\n        else {\n          return element.src;\n        }\n      }\n      else {\n        return this.src || '';\n      }\n    },\n\n    /**\n     * Sets source of an image\n     * @param {String} src Source string (URL)\n     * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n     * @param {Object} [options] Options object\n     * @param {String} [options.crossOrigin] crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n     * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n     * @return {fabric.Image} thisArg\n     * @chainable\n     */\n    setSrc: function(src, callback, options) {\n      fabric.util.loadImage(src, function(img, isError) {\n        this.setElement(img, options);\n        this._setWidthHeight();\n        callback && callback(this, isError);\n      }, this, options && options.crossOrigin);\n      return this;\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} String representation of an instance\n     */\n    toString: function() {\n      return '#<fabric.Image: { src: \"' + this.getSrc() + '\" }>';\n    },\n\n    applyResizeFilters: function() {\n      var filter = this.resizeFilter,\n          minimumScale = this.minimumScaleTrigger,\n          objectScale = this.getTotalObjectScaling(),\n          scaleX = objectScale.scaleX,\n          scaleY = objectScale.scaleY,\n          elementToFilter = this._filteredEl || this._originalElement;\n      if (this.group) {\n        this.set('dirty', true);\n      }\n      if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n        this._element = elementToFilter;\n        this._filterScalingX = 1;\n        this._filterScalingY = 1;\n        this._lastScaleX = scaleX;\n        this._lastScaleY = scaleY;\n        return;\n      }\n      if (!fabric.filterBackend) {\n        fabric.filterBackend = fabric.initFilterBackend();\n      }\n      var canvasEl = fabric.util.createCanvasElement(),\n          cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n          sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n      canvasEl.width = sourceWidth;\n      canvasEl.height = sourceHeight;\n      this._element = canvasEl;\n      this._lastScaleX = filter.scaleX = scaleX;\n      this._lastScaleY = filter.scaleY = scaleY;\n      fabric.filterBackend.applyFilters(\n        [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n      this._filterScalingX = canvasEl.width / this._originalElement.width;\n      this._filterScalingY = canvasEl.height / this._originalElement.height;\n    },\n\n    /**\n     * Applies filters assigned to this image (from \"filters\" array) or from filter param\n     * @method applyFilters\n     * @param {Array} filters to be applied\n     * @param {Boolean} forResizing specify if the filter operation is a resize operation\n     * @return {thisArg} return the fabric.Image object\n     * @chainable\n     */\n    applyFilters: function(filters) {\n\n      filters = filters || this.filters || [];\n      filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n      this.set('dirty', true);\n\n      // needs to clear out or WEBGL will not resize correctly\n      this.removeTexture(this.cacheKey + '_filtered');\n\n      if (filters.length === 0) {\n        this._element = this._originalElement;\n        this._filteredEl = null;\n        this._filterScalingX = 1;\n        this._filterScalingY = 1;\n        return this;\n      }\n\n      var imgElement = this._originalElement,\n          sourceWidth = imgElement.naturalWidth || imgElement.width,\n          sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n      if (this._element === this._originalElement) {\n        // if the element is the same we need to create a new element\n        var canvasEl = fabric.util.createCanvasElement();\n        canvasEl.width = sourceWidth;\n        canvasEl.height = sourceHeight;\n        this._element = canvasEl;\n        this._filteredEl = canvasEl;\n      }\n      else {\n        // clear the existing element to get new filter data\n        // also dereference the eventual resized _element\n        this._element = this._filteredEl;\n        this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n        // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n        this._lastScaleX = 1;\n        this._lastScaleY = 1;\n      }\n      if (!fabric.filterBackend) {\n        fabric.filterBackend = fabric.initFilterBackend();\n      }\n      fabric.filterBackend.applyFilters(\n        filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n      if (this._originalElement.width !== this._element.width ||\n        this._originalElement.height !== this._element.height) {\n        this._filterScalingX = this._element.width / this._originalElement.width;\n        this._filterScalingY = this._element.height / this._originalElement.height;\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n      if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n        this.applyResizeFilters();\n      }\n      this._stroke(ctx);\n      this._renderPaintInOrder(ctx);\n    },\n\n    /**\n     * Paint the cached copy of the object on the target context.\n     * it will set the imageSmoothing for the draw operation\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    drawCacheOnCanvas: function(ctx) {\n      fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n      fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx);\n    },\n\n    /**\n     * Decide if the object should cache or not. Create its own cache level\n     * needsItsOwnCache should be used when the object drawing method requires\n     * a cache step. None of the fabric classes requires it.\n     * Generally you do not cache objects in groups because the group outside is cached.\n     * This is the special image version where we would like to avoid caching where possible.\n     * Essentially images do not benefit from caching. They may require caching, and in that\n     * case we do it. Also caching an image usually ends in a loss of details.\n     * A full performance audit should be done.\n     * @return {Boolean}\n     */\n    shouldCache: function() {\n      return this.needsItsOwnCache();\n    },\n\n    _renderFill: function(ctx) {\n      var elementToDraw = this._element;\n      if (!elementToDraw) {\n        return;\n      }\n      var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n          w = this.width, h = this.height, min = Math.min, max = Math.max,\n          // crop values cannot be lesser than 0.\n          cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n          elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n          elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n          sX = cropX * scaleX,\n          sY = cropY * scaleY,\n          // the width height cannot exceed element width/height, starting from the crop offset.\n          sW = min(w * scaleX, elWidth - sX),\n          sH = min(h * scaleY, elHeight - sY),\n          x = -w / 2, y = -h / 2,\n          maxDestW = min(w, elWidth / scaleX - cropX),\n          maxDestH = min(h, elHeight / scaleY - cropY);\n\n      elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n    },\n\n    /**\n     * needed to check if image needs resize\n     * @private\n     */\n    _needsResize: function() {\n      var scale = this.getTotalObjectScaling();\n      return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n    },\n\n    /**\n     * @private\n     */\n    _resetWidthHeight: function() {\n      this.set(this.getOriginalSize());\n    },\n\n    /**\n     * The Image class's initialization method. This method is automatically\n     * called by the constructor.\n     * @private\n     * @param {HTMLImageElement|String} element The element representing the image\n     * @param {Object} [options] Options object\n     */\n    _initElement: function(element, options) {\n      this.setElement(fabric.util.getById(element), options);\n      fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n    },\n\n    /**\n     * @private\n     * @param {Object} [options] Options object\n     */\n    _initConfig: function(options) {\n      options || (options = { });\n      this.setOptions(options);\n      this._setWidthHeight(options);\n    },\n\n    /**\n     * @private\n     * @param {Array} filters to be initialized\n     * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n     */\n    _initFilters: function(filters, callback) {\n      if (filters && filters.length) {\n        fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n          callback && callback(enlivenedObjects);\n        }, 'fabric.Image.filters');\n      }\n      else {\n        callback && callback();\n      }\n    },\n\n    /**\n     * @private\n     * Set the width and the height of the image object, using the element or the\n     * options.\n     * @param {Object} [options] Object with width/height properties\n     */\n    _setWidthHeight: function(options) {\n      options || (options = { });\n      var el = this.getElement();\n      this.width = options.width || el.naturalWidth || el.width || 0;\n      this.height = options.height || el.naturalHeight || el.height || 0;\n    },\n\n    /**\n     * Calculate offset for center and scale factor for the image in order to respect\n     * the preserveAspectRatio attribute\n     * @private\n     * @return {Object}\n     */\n    parsePreserveAspectRatioAttribute: function() {\n      var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n          rWidth = this._element.width, rHeight = this._element.height,\n          scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n          offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n      if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n        if (pAR.meetOrSlice === 'meet') {\n          scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n          offset = (pWidth - rWidth * scaleX) / 2;\n          if (pAR.alignX === 'Min') {\n            offsetLeft = -offset;\n          }\n          if (pAR.alignX === 'Max') {\n            offsetLeft = offset;\n          }\n          offset = (pHeight - rHeight * scaleY) / 2;\n          if (pAR.alignY === 'Min') {\n            offsetTop = -offset;\n          }\n          if (pAR.alignY === 'Max') {\n            offsetTop = offset;\n          }\n        }\n        if (pAR.meetOrSlice === 'slice') {\n          scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n          offset = rWidth - pWidth / scaleX;\n          if (pAR.alignX === 'Mid') {\n            cropX = offset / 2;\n          }\n          if (pAR.alignX === 'Max') {\n            cropX = offset;\n          }\n          offset = rHeight - pHeight / scaleY;\n          if (pAR.alignY === 'Mid') {\n            cropY = offset / 2;\n          }\n          if (pAR.alignY === 'Max') {\n            cropY = offset;\n          }\n          rWidth = pWidth / scaleX;\n          rHeight = pHeight / scaleY;\n        }\n      }\n      else {\n        scaleX = pWidth / rWidth;\n        scaleY = pHeight / rHeight;\n      }\n      return {\n        width: rWidth,\n        height: rHeight,\n        scaleX: scaleX,\n        scaleY: scaleY,\n        offsetLeft: offsetLeft,\n        offsetTop: offsetTop,\n        cropX: cropX,\n        cropY: cropY\n      };\n    }\n  });\n\n  /**\n   * Default CSS class name for canvas\n   * @static\n   * @type String\n   * @default\n   */\n  fabric.Image.CSS_CANVAS = 'canvas-img';\n\n  /**\n   * Alias for getSrc\n   * @static\n   */\n  fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n  /**\n   * Creates an instance of fabric.Image from its object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} callback Callback to invoke when an image instance is created\n   */\n  fabric.Image.fromObject = function(_object, callback) {\n    var object = fabric.util.object.clone(_object);\n    fabric.util.loadImage(object.src, function(img, isError) {\n      if (isError) {\n        callback && callback(null, true);\n        return;\n      }\n      fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n        object.filters = filters || [];\n        fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n          object.resizeFilter = resizeFilters[0];\n          fabric.util.enlivenObjectEnlivables(object, object, function () {\n            var image = new fabric.Image(img, object);\n            callback(image, false);\n          });\n        });\n      });\n    }, null, object.crossOrigin);\n  };\n\n  /**\n   * Creates an instance of fabric.Image from an URL string\n   * @static\n   * @param {String} url URL to create an image from\n   * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not.\n   * @param {Object} [imgOptions] Options object\n   */\n  fabric.Image.fromURL = function(url, callback, imgOptions) {\n    fabric.util.loadImage(url, function(img, isError) {\n      callback && callback(new fabric.Image(img, imgOptions), isError);\n    }, null, imgOptions && imgOptions.crossOrigin);\n  };\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n   * @static\n   * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n   */\n  fabric.Image.ATTRIBUTE_NAMES =\n    fabric.SHARED_ATTRIBUTES.concat(\n      'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ')\n    );\n\n  /**\n   * Returns {@link fabric.Image} instance from an SVG element\n   * @static\n   * @param {SVGElement} element Element to parse\n   * @param {Object} [options] Options object\n   * @param {Function} callback Callback to execute when fabric.Image object is created\n   * @return {fabric.Image} Instance of fabric.Image\n   */\n  fabric.Image.fromElement = function(element, callback, options) {\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n    fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n      extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n  };\n  /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n  /**\n   * @private\n   * @return {Number} angle value\n   */\n  _getAngleValueForStraighten: function() {\n    var angle = this.angle % 360;\n    if (angle > 0) {\n      return Math.round((angle - 1) / 90) * 90;\n    }\n    return Math.round(angle / 90) * 90;\n  },\n\n  /**\n   * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n   * @return {fabric.Object} thisArg\n   * @chainable\n   */\n  straighten: function() {\n    return this.rotate(this._getAngleValueForStraighten());\n  },\n\n  /**\n   * Same as {@link fabric.Object.prototype.straighten} but with animation\n   * @param {Object} callbacks Object with callback functions\n   * @param {Function} [callbacks.onComplete] Invoked on completion\n   * @param {Function} [callbacks.onChange] Invoked on every step of animation\n   * @return {fabric.Object} thisArg\n   */\n  fxStraighten: function(callbacks) {\n    callbacks = callbacks || { };\n\n    var empty = function() { },\n        onComplete = callbacks.onComplete || empty,\n        onChange = callbacks.onChange || empty,\n        _this = this;\n\n    return fabric.util.animate({\n      target: this,\n      startValue: this.get('angle'),\n      endValue: this._getAngleValueForStraighten(),\n      duration: this.FX_DURATION,\n      onChange: function(value) {\n        _this.rotate(value);\n        onChange();\n      },\n      onComplete: function() {\n        _this.setCoords();\n        onComplete();\n      },\n    });\n  }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n  /**\n   * Straightens object, then rerenders canvas\n   * @param {fabric.Object} object Object to straighten\n   * @return {fabric.Canvas} thisArg\n   * @chainable\n   */\n  straightenObject: function (object) {\n    object.straighten();\n    this.requestRenderAll();\n    return this;\n  },\n\n  /**\n   * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n   * @param {fabric.Object} object Object to straighten\n   * @return {fabric.Canvas} thisArg\n   */\n  fxStraightenObject: function (object) {\n    return object.fxStraighten({\n      onChange: this.requestRenderAllBound\n    });\n  }\n});\n\n\n(function() {\n\n  'use strict';\n\n  /**\n   * Tests if webgl supports certain precision\n   * @param {WebGL} Canvas WebGL context to test on\n   * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n   * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n   */\n  function testPrecision(gl, precision){\n    var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * Indicate whether this filtering backend is supported by the user's browser.\n   * @param {Number} tileSize check if the tileSize is supported\n   * @returns {Boolean} Whether the user's browser supports WebGL.\n   */\n  fabric.isWebglSupported = function(tileSize) {\n    if (fabric.isLikelyNode) {\n      return false;\n    }\n    tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n    var canvas = document.createElement('canvas');\n    var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n    var isSupported = false;\n    // eslint-disable-next-line\n    if (gl) {\n      fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n      isSupported = fabric.maxTextureSize >= tileSize;\n      var precisions = ['highp', 'mediump', 'lowp'];\n      for (var i = 0; i < 3; i++){\n        if (testPrecision(gl, precisions[i])){\n          fabric.webGlPrecision = precisions[i];\n          break;\n        };\n      }\n    }\n    this.isSupported = isSupported;\n    return isSupported;\n  };\n\n  fabric.WebglFilterBackend = WebglFilterBackend;\n\n  /**\n   * WebGL filter backend.\n   */\n  function WebglFilterBackend(options) {\n    if (options && options.tileSize) {\n      this.tileSize = options.tileSize;\n    }\n    this.setupGLContext(this.tileSize, this.tileSize);\n    this.captureGPUInfo();\n  };\n\n  WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n    tileSize: 2048,\n\n    /**\n     * Experimental. This object is a sort of repository of help layers used to avoid\n     * of recreating them during frequent filtering. If you are previewing a filter with\n     * a slider you probably do not want to create help layers every filter step.\n     * in this object there will be appended some canvases, created once, resized sometimes\n     * cleared never. Clearing is left to the developer.\n     **/\n    resources: {\n\n    },\n\n    /**\n     * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n     */\n    setupGLContext: function(width, height) {\n      this.dispose();\n      this.createWebGLCanvas(width, height);\n      // eslint-disable-next-line\n      this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n      this.chooseFastestCopyGLTo2DMethod(width, height);\n    },\n\n    /**\n     * Pick a method to copy data from GL context to 2d canvas.  In some browsers using\n     * putImageData is faster than drawImage for that specific operation.\n     */\n    chooseFastestCopyGLTo2DMethod: function(width, height) {\n      var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n      try {\n        new ImageData(1, 1);\n        canUseImageData = true;\n      }\n      catch (e) {\n        canUseImageData = false;\n      }\n      // eslint-disable-next-line no-undef\n      var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n      // eslint-disable-next-line no-undef\n      var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n      if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n        return;\n      }\n\n      var targetCanvas = fabric.util.createCanvasElement();\n      // eslint-disable-next-line no-undef\n      var imageBuffer = new ArrayBuffer(width * height * 4);\n      if (fabric.forceGLPutImageData) {\n        this.imageBuffer = imageBuffer;\n        this.copyGLTo2D = copyGLTo2DPutImageData;\n        return;\n      }\n      var testContext = {\n        imageBuffer: imageBuffer,\n        destinationWidth: width,\n        destinationHeight: height,\n        targetCanvas: targetCanvas\n      };\n      var startTime, drawImageTime, putImageDataTime;\n      targetCanvas.width = width;\n      targetCanvas.height = height;\n\n      startTime = window.performance.now();\n      copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n      drawImageTime = window.performance.now() - startTime;\n\n      startTime = window.performance.now();\n      copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n      putImageDataTime = window.performance.now() - startTime;\n\n      if (drawImageTime > putImageDataTime) {\n        this.imageBuffer = imageBuffer;\n        this.copyGLTo2D = copyGLTo2DPutImageData;\n      }\n      else {\n        this.copyGLTo2D = copyGLTo2DDrawImage;\n      }\n    },\n\n    /**\n     * Create a canvas element and associated WebGL context and attaches them as\n     * class properties to the GLFilterBackend class.\n     */\n    createWebGLCanvas: function(width, height) {\n      var canvas = fabric.util.createCanvasElement();\n      canvas.width = width;\n      canvas.height = height;\n      var glOptions = {\n            alpha: true,\n            premultipliedAlpha: false,\n            depth: false,\n            stencil: false,\n            antialias: false\n          },\n          gl = canvas.getContext('webgl', glOptions);\n      if (!gl) {\n        gl = canvas.getContext('experimental-webgl', glOptions);\n      }\n      if (!gl) {\n        return;\n      }\n      gl.clearColor(0, 0, 0, 0);\n      // this canvas can fire webglcontextlost and webglcontextrestored\n      this.canvas = canvas;\n      this.gl = gl;\n    },\n\n    /**\n     * Attempts to apply the requested filters to the source provided, drawing the filtered output\n     * to the provided target canvas.\n     *\n     * @param {Array} filters The filters to apply.\n     * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n     * @param {Number} width The width of the source input.\n     * @param {Number} height The height of the source input.\n     * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n     * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n     * omitted, caching will be skipped.\n     */\n    applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n      var gl = this.gl;\n      var cachedTexture;\n      if (cacheKey) {\n        cachedTexture = this.getCachedTexture(cacheKey, source);\n      }\n      var pipelineState = {\n        originalWidth: source.width || source.originalWidth,\n        originalHeight: source.height || source.originalHeight,\n        sourceWidth: width,\n        sourceHeight: height,\n        destinationWidth: width,\n        destinationHeight: height,\n        context: gl,\n        sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n        targetTexture: this.createTexture(gl, width, height),\n        originalTexture: cachedTexture ||\n          this.createTexture(gl, width, height, !cachedTexture && source),\n        passes: filters.length,\n        webgl: true,\n        aPosition: this.aPosition,\n        programCache: this.programCache,\n        pass: 0,\n        filterBackend: this,\n        targetCanvas: targetCanvas\n      };\n      var tempFbo = gl.createFramebuffer();\n      gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n      filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n      resizeCanvasIfNeeded(pipelineState);\n      this.copyGLTo2D(gl, pipelineState);\n      gl.bindTexture(gl.TEXTURE_2D, null);\n      gl.deleteTexture(pipelineState.sourceTexture);\n      gl.deleteTexture(pipelineState.targetTexture);\n      gl.deleteFramebuffer(tempFbo);\n      targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n      return pipelineState;\n    },\n\n    /**\n     * Detach event listeners, remove references, and clean up caches.\n     */\n    dispose: function() {\n      if (this.canvas) {\n        this.canvas = null;\n        this.gl = null;\n      }\n      this.clearWebGLCaches();\n    },\n\n    /**\n     * Wipe out WebGL-related caches.\n     */\n    clearWebGLCaches: function() {\n      this.programCache = {};\n      this.textureCache = {};\n    },\n\n    /**\n     * Create a WebGL texture object.\n     *\n     * Accepts specific dimensions to initialize the texture to or a source image.\n     *\n     * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n     * @param {Number} width The width to initialize the texture at.\n     * @param {Number} height The height to initialize the texture.\n     * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n     * @returns {WebGLTexture}\n     */\n    createTexture: function(gl, width, height, textureImageSource) {\n      var texture = gl.createTexture();\n      gl.bindTexture(gl.TEXTURE_2D, texture);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n      gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n      if (textureImageSource) {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n      }\n      else {\n        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n      }\n      return texture;\n    },\n\n    /**\n     * Can be optionally used to get a texture from the cache array\n     *\n     * If an existing texture is not found, a new texture is created and cached.\n     *\n     * @param {String} uniqueId A cache key to use to find an existing texture.\n     * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n     * texture cache entry if one does not already exist.\n     */\n    getCachedTexture: function(uniqueId, textureImageSource) {\n      if (this.textureCache[uniqueId]) {\n        return this.textureCache[uniqueId];\n      }\n      else {\n        var texture = this.createTexture(\n          this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n        this.textureCache[uniqueId] = texture;\n        return texture;\n      }\n    },\n\n    /**\n     * Clear out cached resources related to a source image that has been\n     * filtered previously.\n     *\n     * @param {String} cacheKey The cache key provided when the source image was filtered.\n     */\n    evictCachesForKey: function(cacheKey) {\n      if (this.textureCache[cacheKey]) {\n        this.gl.deleteTexture(this.textureCache[cacheKey]);\n        delete this.textureCache[cacheKey];\n      }\n    },\n\n    copyGLTo2D: copyGLTo2DDrawImage,\n\n    /**\n     * Attempt to extract GPU information strings from a WebGL context.\n     *\n     * Useful information when debugging or blacklisting specific GPUs.\n     *\n     * @returns {Object} A GPU info object with renderer and vendor strings.\n     */\n    captureGPUInfo: function() {\n      if (this.gpuInfo) {\n        return this.gpuInfo;\n      }\n      var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n      if (!gl) {\n        return gpuInfo;\n      }\n      var ext = gl.getExtension('WEBGL_debug_renderer_info');\n      if (ext) {\n        var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n        var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n        if (renderer) {\n          gpuInfo.renderer = renderer.toLowerCase();\n        }\n        if (vendor) {\n          gpuInfo.vendor = vendor.toLowerCase();\n        }\n      }\n      this.gpuInfo = gpuInfo;\n      return gpuInfo;\n    },\n  };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n  var targetCanvas = pipelineState.targetCanvas,\n      width = targetCanvas.width, height = targetCanvas.height,\n      dWidth = pipelineState.destinationWidth,\n      dHeight = pipelineState.destinationHeight;\n\n  if (width !== dWidth || height !== dHeight) {\n    targetCanvas.width = dWidth;\n    targetCanvas.height = dHeight;\n  }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n  var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n      ctx = targetCanvas.getContext('2d');\n  ctx.translate(0, targetCanvas.height); // move it down again\n  ctx.scale(1, -1); // vertical flip\n  // where is my image on the big glcanvas?\n  var sourceY = glCanvas.height - targetCanvas.height;\n  ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n    targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n  var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n      dWidth = pipelineState.destinationWidth,\n      dHeight = pipelineState.destinationHeight,\n      numBytes = dWidth * dHeight * 4;\n\n  // eslint-disable-next-line no-undef\n  var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n  // eslint-disable-next-line no-undef\n  var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n  gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n  var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n  ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n  'use strict';\n\n  var noop = function() {};\n\n  fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n  /**\n   * Canvas 2D filter backend.\n   */\n  function Canvas2dFilterBackend() {};\n\n  Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n    evictCachesForKey: noop,\n    dispose: noop,\n    clearWebGLCaches: noop,\n\n    /**\n     * Experimental. This object is a sort of repository of help layers used to avoid\n     * of recreating them during frequent filtering. If you are previewing a filter with\n     * a slider you probably do not want to create help layers every filter step.\n     * in this object there will be appended some canvases, created once, resized sometimes\n     * cleared never. Clearing is left to the developer.\n     **/\n    resources: {\n\n    },\n\n    /**\n     * Apply a set of filters against a source image and draw the filtered output\n     * to the provided destination canvas.\n     *\n     * @param {EnhancedFilter} filters The filter to apply.\n     * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n     * @param {Number} sourceWidth The width of the source input.\n     * @param {Number} sourceHeight The height of the source input.\n     * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n     */\n    applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n      var ctx = targetCanvas.getContext('2d');\n      ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n      var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n      var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n      var pipelineState = {\n        sourceWidth: sourceWidth,\n        sourceHeight: sourceHeight,\n        imageData: imageData,\n        originalEl: sourceElement,\n        originalImageData: originalImageData,\n        canvasEl: targetCanvas,\n        ctx: ctx,\n        filterBackend: this,\n      };\n      filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n      if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n        targetCanvas.width = pipelineState.imageData.width;\n        targetCanvas.height = pipelineState.imageData.height;\n      }\n      ctx.putImageData(pipelineState.imageData, 0, 0);\n      return pipelineState;\n    },\n\n  };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n  /**\n   * Filter type\n   * @param {String} type\n   * @default\n   */\n  type: 'BaseFilter',\n\n  /**\n   * Array of attributes to send with buffers. do not modify\n   * @private\n   */\n\n  vertexSource: 'attribute vec2 aPosition;\\n' +\n    'varying vec2 vTexCoord;\\n' +\n    'void main() {\\n' +\n      'vTexCoord = aPosition;\\n' +\n      'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n    '}',\n\n  fragmentSource: 'precision highp float;\\n' +\n    'varying vec2 vTexCoord;\\n' +\n    'uniform sampler2D uTexture;\\n' +\n    'void main() {\\n' +\n      'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n    '}',\n\n  /**\n   * Constructor\n   * @param {Object} [options] Options object\n   */\n  initialize: function(options) {\n    if (options) {\n      this.setOptions(options);\n    }\n  },\n\n  /**\n   * Sets filter's properties from options\n   * @param {Object} [options] Options object\n   */\n  setOptions: function(options) {\n    for (var prop in options) {\n      this[prop] = options[prop];\n    }\n  },\n\n  /**\n   * Compile this filter's shader program.\n   *\n   * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n   * @param {String} fragmentSource fragmentShader source for compilation\n   * @param {String} vertexSource vertexShader source for compilation\n   */\n  createProgram: function(gl, fragmentSource, vertexSource) {\n    fragmentSource = fragmentSource || this.fragmentSource;\n    vertexSource = vertexSource || this.vertexSource;\n    if (fabric.webGlPrecision !== 'highp'){\n      fragmentSource = fragmentSource.replace(\n        /precision highp float/g,\n        'precision ' + fabric.webGlPrecision + ' float'\n      );\n    }\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, vertexSource);\n    gl.compileShader(vertexShader);\n    if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Vertex shader compile error for ' + this.type + ': ' +\n        gl.getShaderInfoLog(vertexShader)\n      );\n    }\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n    if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Fragment shader compile error for ' + this.type + ': ' +\n        gl.getShaderInfoLog(fragmentShader)\n      );\n    }\n\n    var program = gl.createProgram();\n    gl.attachShader(program, vertexShader);\n    gl.attachShader(program, fragmentShader);\n    gl.linkProgram(program);\n    if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n      throw new Error(\n        // eslint-disable-next-line prefer-template\n        'Shader link error for \"${this.type}\" ' +\n        gl.getProgramInfoLog(program)\n      );\n    }\n\n    var attributeLocations = this.getAttributeLocations(gl, program);\n    var uniformLocations = this.getUniformLocations(gl, program) || { };\n    uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n    uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n    return {\n      program: program,\n      attributeLocations: attributeLocations,\n      uniformLocations: uniformLocations\n    };\n  },\n\n  /**\n   * Return a map of attribute names to WebGLAttributeLocation objects.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n   * @returns {Object} A map of attribute names to attribute locations.\n   */\n  getAttributeLocations: function(gl, program) {\n    return {\n      aPosition: gl.getAttribLocation(program, 'aPosition'),\n    };\n  },\n\n  /**\n   * Return a map of uniform names to WebGLUniformLocation objects.\n   *\n   * Intended to be overridden by subclasses.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n   * @returns {Object} A map of uniform names to uniform locations.\n   */\n  getUniformLocations: function (/* gl, program */) {\n    // in case i do not need any special uniform i need to return an empty object\n    return { };\n  },\n\n  /**\n   * Send attribute data from this filter to its shader program on the GPU.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} attributeLocations A map of shader attribute names to their locations.\n   */\n  sendAttributeData: function(gl, attributeLocations, aPositionData) {\n    var attributeLocation = attributeLocations.aPosition;\n    var buffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n    gl.enableVertexAttribArray(attributeLocation);\n    gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n    gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n  },\n\n  _setupFrameBuffer: function(options) {\n    var gl = options.context, width, height;\n    if (options.passes > 1) {\n      width = options.destinationWidth;\n      height = options.destinationHeight;\n      if (options.sourceWidth !== width || options.sourceHeight !== height) {\n        gl.deleteTexture(options.targetTexture);\n        options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n      }\n      gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n        options.targetTexture, 0);\n    }\n    else {\n      // draw last filter on canvas and not to framebuffer.\n      gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n      gl.finish();\n    }\n  },\n\n  _swapTextures: function(options) {\n    options.passes--;\n    options.pass++;\n    var temp = options.targetTexture;\n    options.targetTexture = options.sourceTexture;\n    options.sourceTexture = temp;\n  },\n\n  /**\n   * Generic isNeutral implementation for one parameter based filters.\n   * Used only in image applyFilters to discard filters that will not have an effect\n   * on the image\n   * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n   * @param {Object} options\n   **/\n  isNeutralState: function(/* options */) {\n    var main = this.mainParameter,\n        _class = fabric.Image.filters[this.type].prototype;\n    if (main) {\n      if (Array.isArray(_class[main])) {\n        for (var i = _class[main].length; i--;) {\n          if (this[main][i] !== _class[main][i]) {\n            return false;\n          }\n        }\n        return true;\n      }\n      else {\n        return _class[main] === this[main];\n      }\n    }\n    else {\n      return false;\n    }\n  },\n\n  /**\n   * Apply this filter to the input image data provided.\n   *\n   * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyTo: function(options) {\n    if (options.webgl) {\n      this._setupFrameBuffer(options);\n      this.applyToWebGL(options);\n      this._swapTextures(options);\n    }\n    else {\n      this.applyTo2d(options);\n    }\n  },\n\n  /**\n   * Retrieves the cached shader.\n   * @param {Object} options\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  retrieveShader: function(options) {\n    if (!options.programCache.hasOwnProperty(this.type)) {\n      options.programCache[this.type] = this.createProgram(options.context);\n    }\n    return options.programCache[this.type];\n  },\n\n  /**\n   * Apply this filter using webgl.\n   *\n   * @param {Object} options\n   * @param {Number} options.passes The number of filters remaining to be executed\n   * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n   * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n   * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n   * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n   * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n   * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n   */\n  applyToWebGL: function(options) {\n    var gl = options.context;\n    var shader = this.retrieveShader(options);\n    if (options.pass === 0 && options.originalTexture) {\n      gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n    }\n    else {\n      gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n    }\n    gl.useProgram(shader.program);\n    this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n    gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n    gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n    this.sendUniformData(gl, shader.uniformLocations);\n    gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n  },\n\n  bindAdditionalTexture: function(gl, texture, textureUnit) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    // reset active texture to 0 as usual\n    gl.activeTexture(gl.TEXTURE0);\n  },\n\n  unbindAdditionalTexture: function(gl, textureUnit) {\n    gl.activeTexture(textureUnit);\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.activeTexture(gl.TEXTURE0);\n  },\n\n  getMainParameter: function() {\n    return this[this.mainParameter];\n  },\n\n  setMainParameter: function(value) {\n    this[this.mainParameter] = value;\n  },\n\n  /**\n   * Send uniform data from this filter to its shader program on the GPU.\n   *\n   * Intended to be overridden by subclasses.\n   *\n   * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n   * @param {Object} uniformLocations A map of shader uniform names to their locations.\n   */\n  sendUniformData: function(/* gl, uniformLocations */) {\n    // Intentionally left blank.  Override me in subclasses.\n  },\n\n  /**\n   * If needed by a 2d filter, this functions can create an helper canvas to be used\n   * remember that options.targetCanvas is available for use till end of chain.\n   */\n  createHelpLayer: function(options) {\n    if (!options.helpLayer) {\n      var helpLayer = document.createElement('canvas');\n      helpLayer.width = options.sourceWidth;\n      helpLayer.height = options.sourceHeight;\n      options.helpLayer = helpLayer;\n    }\n  },\n\n  /**\n   * Returns object representation of an instance\n   * @return {Object} Object representation of an instance\n   */\n  toObject: function() {\n    var object = { type: this.type }, mainP = this.mainParameter;\n    if (mainP) {\n      object[mainP] = this[mainP];\n    }\n    return object;\n  },\n\n  /**\n   * Returns a JSON representation of an instance\n   * @return {Object} JSON\n   */\n  toJSON: function() {\n    // delegate, not alias\n    return this.toObject();\n  }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n  var filter = new fabric.Image.filters[object.type](object);\n  callback && callback(filter);\n  return filter;\n};\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Color Matrix filter class\n   * @class fabric.Image.filters.ColorMatrix\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n   * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n   * @example <caption>Kodachrome filter</caption>\n   * var filter = new fabric.Image.filters.ColorMatrix({\n   *  matrix: [\n       1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n       -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n       -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n       0, 0, 0, 1, 0\n      ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'ColorMatrix',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'uniform mat4 uColorMatrix;\\n' +\n      'uniform vec4 uConstants;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color *= uColorMatrix;\\n' +\n        'color += uConstants;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Colormatrix for pixels.\n     * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n     * outside the -1, 1 range.\n     * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n     * @param {Array} matrix array of 20 numbers.\n     * @default\n     */\n    matrix: [\n      1, 0, 0, 0, 0,\n      0, 1, 0, 0, 0,\n      0, 0, 1, 0, 0,\n      0, 0, 0, 1, 0\n    ],\n\n    mainParameter: 'matrix',\n\n    /**\n     * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n     * to save some calculation\n     * @type Boolean\n     * @default true\n     */\n    colorsOnly: true,\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      // create a new array instead mutating the prototype with push\n      this.matrix = this.matrix.slice(0);\n    },\n\n    /**\n     * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          iLen = data.length,\n          m = this.matrix,\n          r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n      for (i = 0; i < iLen; i += 4) {\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n        if (colorsOnly) {\n          data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n          data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n          data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n        }\n        else {\n          a = data[i + 3];\n          data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n          data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n          data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n          data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n        uConstants: gl.getUniformLocation(program, 'uConstants'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var m = this.matrix,\n          matrix = [\n            m[0], m[1], m[2], m[3],\n            m[5], m[6], m[7], m[8],\n            m[10], m[11], m[12], m[13],\n            m[15], m[16], m[17], m[18]\n          ],\n          constants = [m[4], m[9], m[14], m[19]];\n      gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n      gl.uniform4fv(uniformLocations.uConstants, constants);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] function to invoke after filter creation\n   * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n   */\n  fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Brightness filter class\n   * @class fabric.Image.filters.Brightness\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Brightness({\n   *   brightness: 0.05\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Brightness',\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uBrightness;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color.rgb += uBrightness;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Brightness value, from -1 to 1.\n     * translated to -255 to 255 for 2d\n     * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n     * @param {Number} brightness\n     * @default\n     */\n    brightness: 0,\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'brightness',\n\n    /**\n    * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n    *\n    * @param {Object} options\n    * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n    */\n    applyTo2d: function(options) {\n      if (this.brightness === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, i, len = data.length,\n          brightness = Math.round(this.brightness * 255);\n      for (i = 0; i < len; i += 4) {\n        data[i] = data[i] + brightness;\n        data[i + 1] = data[i + 1] + brightness;\n        data[i + 2] = data[i + 2] + brightness;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n   */\n  fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Adapted from <a href=\"http://www.html5rocks.com/en/tutorials/canvas/imagefilters/\">html5rocks article</a>\n   * @class fabric.Image.filters.Convolute\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example <caption>Sharpen filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 0, -1,  0,\n   *            -1,  5, -1,\n   *             0, -1,  0 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Blur filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 1/9, 1/9, 1/9,\n   *             1/9, 1/9, 1/9,\n   *             1/9, 1/9, 1/9 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Emboss filter</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   matrix: [ 1,   1,  1,\n   *             1, 0.7, -1,\n   *            -1,  -1, -1 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   * @example <caption>Emboss filter with opaqueness</caption>\n   * var filter = new fabric.Image.filters.Convolute({\n   *   opaque: true,\n   *   matrix: [ 1,   1,  1,\n   *             1, 0.7, -1,\n   *            -1,  -1, -1 ]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Convolute',\n\n    /*\n     * Opaque value (true/false)\n     */\n    opaque: false,\n\n    /*\n     * matrix for the filter, max 9x9\n     */\n    matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: {\n      Convolute_3_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[9];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_3_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[9];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_5_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[25];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_5_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[25];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_7_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[49];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_7_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[49];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n      Convolute_9_1: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[81];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 0);\\n' +\n          'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n              'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      Convolute_9_0: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform float uMatrix[81];\\n' +\n        'uniform float uStepW;\\n' +\n        'uniform float uStepH;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = vec4(0, 0, 0, 1);\\n' +\n          'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n            'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n              'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n              'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n            '}\\n' +\n          '}\\n' +\n          'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n          'gl_FragColor = color;\\n' +\n          'gl_FragColor.a = alpha;\\n' +\n        '}',\n    },\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Convolute.prototype\n     * @param {Object} [options] Options object\n     * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n     * @param {Array} [options.matrix] Filter matrix\n     */\n\n\n    /**\n    * Retrieves the cached shader.\n    * @param {Object} options\n    * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n    * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n    */\n    retrieveShader: function(options) {\n      var size = Math.sqrt(this.matrix.length);\n      var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n      var shaderSource = this.fragmentSource[cacheKey];\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          weights = this.matrix,\n          side = Math.round(Math.sqrt(weights.length)),\n          halfSide = Math.floor(side / 2),\n          sw = imageData.width,\n          sh = imageData.height,\n          output = options.ctx.createImageData(sw, sh),\n          dst = output.data,\n          // go through the destination image pixels\n          alphaFac = this.opaque ? 1 : 0,\n          r, g, b, a, dstOff,\n          scx, scy, srcOff, wt,\n          x, y, cx, cy;\n\n      for (y = 0; y < sh; y++) {\n        for (x = 0; x < sw; x++) {\n          dstOff = (y * sw + x) * 4;\n          // calculate the weighed sum of the source image pixels that\n          // fall under the convolution matrix\n          r = 0; g = 0; b = 0; a = 0;\n\n          for (cy = 0; cy < side; cy++) {\n            for (cx = 0; cx < side; cx++) {\n              scy = y + cy - halfSide;\n              scx = x + cx - halfSide;\n\n              // eslint-disable-next-line max-depth\n              if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n                continue;\n              }\n\n              srcOff = (scy * sw + scx) * 4;\n              wt = weights[cy * side + cx];\n\n              r += data[srcOff] * wt;\n              g += data[srcOff + 1] * wt;\n              b += data[srcOff + 2] * wt;\n              // eslint-disable-next-line max-depth\n              if (!alphaFac) {\n                a += data[srcOff + 3] * wt;\n              }\n            }\n          }\n          dst[dstOff] = r;\n          dst[dstOff + 1] = g;\n          dst[dstOff + 2] = b;\n          if (!alphaFac) {\n            dst[dstOff + 3] = a;\n          }\n          else {\n            dst[dstOff + 3] = data[dstOff + 3];\n          }\n        }\n      }\n      options.imageData = output;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n        uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n        uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n        uSize: gl.getUniformLocation(program, 'uSize'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        opaque: this.opaque,\n        matrix: this.matrix\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n   */\n  fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Grayscale image filter class\n   * @class fabric.Image.filters.Grayscale\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Grayscale();\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Grayscale',\n\n    fragmentSource: {\n      average: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n          'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n        '}',\n      lightness: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform int uMode;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n          'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n        '}',\n      luminosity: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform int uMode;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n          'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n          'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n        '}',\n    },\n\n\n    /**\n     * Grayscale mode, between 'average', 'lightness', 'luminosity'\n     * @param {String} type\n     * @default\n     */\n    mode: 'average',\n\n    mainParameter: 'mode',\n\n    /**\n     * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          len = data.length, value,\n          mode = this.mode;\n      for (i = 0; i < len; i += 4) {\n        if (mode === 'average') {\n          value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n        }\n        else if (mode === 'lightness') {\n          value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n            Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n        }\n        else if (mode === 'luminosity') {\n          value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n        }\n        data[i] = value;\n        data[i + 1] = value;\n        data[i + 2] = value;\n      }\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        var shaderSource = this.fragmentSource[this.mode];\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uMode: gl.getUniformLocation(program, 'uMode'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      // default average mode.\n      var mode = 1;\n      gl.uniform1i(uniformLocations.uMode, mode);\n    },\n\n    /**\n     * Grayscale filter isNeutralState implementation\n     * The filter is never neutral\n     * on the image\n     **/\n    isNeutralState: function() {\n      return false;\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n   */\n  fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Invert filter class\n   * @class fabric.Image.filters.Invert\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Invert();\n   * object.filters.push(filter);\n   * object.applyFilters(canvas.renderAll.bind(canvas));\n   */\n  filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Invert',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform int uInvert;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'if (uInvert == 1) {\\n' +\n          'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n        '} else {\\n' +\n          'gl_FragColor = color;\\n' +\n        '}\\n' +\n      '}',\n\n    /**\n     * Filter invert. if false, does nothing\n     * @param {Boolean} invert\n     * @default\n     */\n    invert: true,\n\n    mainParameter: 'invert',\n\n    /**\n     * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          len = data.length;\n      for (i = 0; i < len; i += 4) {\n        data[i] = 255 - data[i];\n        data[i + 1] = 255 - data[i + 1];\n        data[i + 2] = 255 - data[i + 2];\n      }\n    },\n\n    /**\n     * Invert filter isNeutralState implementation\n     * Used only in image applyFilters to discard filters that will not have an effect\n     * on the image\n     * @param {Object} options\n     **/\n    isNeutralState: function() {\n      return !this.invert;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uInvert: gl.getUniformLocation(program, 'uInvert'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1i(uniformLocations.uInvert, this.invert);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n   */\n  fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Noise filter class\n   * @class fabric.Image.filters.Noise\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Noise({\n   *   noise: 700\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Noise',\n\n    /**\n     * Fragment source for the noise program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uStepH;\\n' +\n      'uniform float uNoise;\\n' +\n      'uniform float uSeed;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'float rand(vec2 co, float seed, float vScale) {\\n' +\n        'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n      '}\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'noise',\n\n    /**\n     * Noise value, from\n     * @param {Number} noise\n     * @default\n     */\n    noise: 0,\n\n    /**\n     * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.noise === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, i, len = data.length,\n          noise = this.noise, rand;\n\n      for (i = 0, len = data.length; i < len; i += 4) {\n\n        rand = (0.5 - Math.random()) * noise;\n\n        data[i] += rand;\n        data[i + 1] += rand;\n        data[i + 2] += rand;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uNoise: gl.getUniformLocation(program, 'uNoise'),\n        uSeed: gl.getUniformLocation(program, 'uSeed'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n      gl.uniform1f(uniformLocations.uSeed, Math.random());\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        noise: this.noise\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n   */\n  fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Pixelate filter class\n   * @class fabric.Image.filters.Pixelate\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Pixelate({\n   *   blocksize: 8\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Pixelate',\n\n    blocksize: 4,\n\n    mainParameter: 'blocksize',\n\n    /**\n     * Fragment source for the Pixelate program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uBlocksize;\\n' +\n      'uniform float uStepW;\\n' +\n      'uniform float uStepH;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'float blockW = uBlocksize * uStepW;\\n' +\n        'float blockH = uBlocksize * uStepW;\\n' +\n        'int posX = int(vTexCoord.x / blockW);\\n' +\n        'int posY = int(vTexCoord.y / blockH);\\n' +\n        'float fposX = float(posX);\\n' +\n        'float fposY = float(posY);\\n' +\n        'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n        'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data,\n          iLen = imageData.height,\n          jLen = imageData.width,\n          index, i, j, r, g, b, a,\n          _i, _j, _iLen, _jLen;\n\n      for (i = 0; i < iLen; i += this.blocksize) {\n        for (j = 0; j < jLen; j += this.blocksize) {\n\n          index = (i * 4) * jLen + (j * 4);\n\n          r = data[index];\n          g = data[index + 1];\n          b = data[index + 2];\n          a = data[index + 3];\n\n          _iLen = Math.min(i + this.blocksize, iLen);\n          _jLen = Math.min(j + this.blocksize, jLen);\n          for (_i = i; _i < _iLen; _i++) {\n            for (_j = j; _j < _jLen; _j++) {\n              index = (_i * 4) * jLen + (_j * 4);\n              data[index] = r;\n              data[index + 1] = g;\n              data[index + 2] = b;\n              data[index + 3] = a;\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Indicate when the filter is not gonna apply changes to the image\n     **/\n    isNeutralState: function() {\n      return this.blocksize === 1;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n        uStepW: gl.getUniformLocation(program, 'uStepW'),\n        uStepH: gl.getUniformLocation(program, 'uStepH'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n   */\n  fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      extend = fabric.util.object.extend,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Remove white filter class\n   * @class fabric.Image.filters.RemoveColor\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.RemoveColor({\n   *   threshold: 0.2,\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'RemoveColor',\n\n    /**\n     * Color to remove, in any format understood by fabric.Color.\n     * @param {String} type\n     * @default\n     */\n    color: '#FFFFFF',\n\n    /**\n     * Fragment source for the brightness program\n     */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec4 uLow;\\n' +\n      'uniform vec4 uHigh;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n        'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n          'gl_FragColor.a = 0.0;\\n' +\n        '}\\n' +\n      '}',\n\n    /**\n     * distance to actual color, as value up or down from each r,g,b\n     * between 0 and 1\n     **/\n    distance: 0.02,\n\n    /**\n     * For color to remove inside distance, use alpha channel for a smoother deletion\n     * NOT IMPLEMENTED YET\n     **/\n    useAlpha: false,\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.RemoveWhite.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.color=#RRGGBB] Threshold value\n     * @param {Number} [options.distance=10] Distance value\n     */\n\n    /**\n     * Applies filter to canvas element\n     * @param {Object} canvasEl Canvas element to apply filter to\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, i,\n          distance = this.distance * 255,\n          r, g, b,\n          source = new fabric.Color(this.color).getSource(),\n          lowC = [\n            source[0] - distance,\n            source[1] - distance,\n            source[2] - distance,\n          ],\n          highC = [\n            source[0] + distance,\n            source[1] + distance,\n            source[2] + distance,\n          ];\n\n\n      for (i = 0; i < data.length; i += 4) {\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n\n        if (r > lowC[0] &&\n            g > lowC[1] &&\n            b > lowC[2] &&\n            r < highC[0] &&\n            g < highC[1] &&\n            b < highC[2]) {\n          data[i + 3] = 0;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uLow: gl.getUniformLocation(program, 'uLow'),\n        uHigh: gl.getUniformLocation(program, 'uHigh'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var source = new fabric.Color(this.color).getSource(),\n          distance = parseFloat(this.distance),\n          lowC = [\n            0 + source[0] / 255 - distance,\n            0 + source[1] / 255 - distance,\n            0 + source[2] / 255 - distance,\n            1\n          ],\n          highC = [\n            source[0] / 255 + distance,\n            source[1] / 255 + distance,\n            source[2] / 255 + distance,\n            1\n          ];\n      gl.uniform4fv(uniformLocations.uLow, lowC);\n      gl.uniform4fv(uniformLocations.uHigh, highC);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return extend(this.callSuper('toObject'), {\n        color: this.color,\n        distance: this.distance\n      });\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n   */\n  fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  var matrices = {\n    Brownie: [\n      0.59970,0.34553,-0.27082,0,0.186,\n      -0.03770,0.86095,0.15059,0,-0.1449,\n      0.24113,-0.07441,0.44972,0,-0.02965,\n      0,0,0,1,0\n    ],\n    Vintage: [\n      0.62793,0.32021,-0.03965,0,0.03784,\n      0.02578,0.64411,0.03259,0,0.02926,\n      0.04660,-0.08512,0.52416,0,0.02023,\n      0,0,0,1,0\n    ],\n    Kodachrome: [\n      1.12855,-0.39673,-0.03992,0,0.24991,\n      -0.16404,1.08352,-0.05498,0,0.09698,\n      -0.16786,-0.56034,1.60148,0,0.13972,\n      0,0,0,1,0\n    ],\n    Technicolor: [\n      1.91252,-0.85453,-0.09155,0,0.04624,\n      -0.30878,1.76589,-0.10601,0,-0.27589,\n      -0.23110,-0.75018,1.84759,0,0.12137,\n      0,0,0,1,0\n    ],\n    Polaroid: [\n      1.438,-0.062,-0.062,0,0,\n      -0.122,1.378,-0.122,0,0,\n      -0.016,-0.016,1.483,0,0,\n      0,0,0,1,0\n    ],\n    Sepia: [\n      0.393, 0.769, 0.189, 0, 0,\n      0.349, 0.686, 0.168, 0, 0,\n      0.272, 0.534, 0.131, 0, 0,\n      0, 0, 0, 1, 0\n    ],\n    BlackWhite: [\n      1.5, 1.5, 1.5, 0, -1,\n      1.5, 1.5, 1.5, 0, -1,\n      1.5, 1.5, 1.5, 0, -1,\n      0, 0, 0, 1, 0,\n    ]\n  };\n\n  for (var key in matrices) {\n    filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n      /**\n       * Filter type\n       * @param {String} type\n       * @default\n       */\n      type: key,\n\n      /**\n       * Colormatrix for the effect\n       * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n       * outside the -1, 1 range.\n       * @param {Array} matrix array of 20 numbers.\n       * @default\n       */\n      matrix: matrices[key],\n\n      /**\n       * Lock the matrix export for this kind of static, parameter less filters.\n       */\n      mainParameter: false,\n      /**\n       * Lock the colormatrix on the color part, skipping alpha\n       */\n      colorsOnly: true,\n\n    });\n    fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n  }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n  'use strict';\n\n  var fabric = global.fabric,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Color Blend filter class\n   * @class fabric.Image.filter.BlendColor\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @example\n   * var filter = new fabric.Image.filters.BlendColor({\n   *  color: '#000',\n   *  mode: 'multiply'\n   * });\n   *\n   * var filter = new fabric.Image.filters.BlendImage({\n   *  image: fabricImageObject,\n   *  mode: 'multiply',\n   *  alpha: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n\n  filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n    type: 'BlendColor',\n\n    /**\n     * Color to make the blend operation with. default to a reddish color since black or white\n     * gives always strong result.\n     * @type String\n     * @default\n     **/\n    color: '#F95C63',\n\n    /**\n     * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n     * darken, lighten, overlay, exclusion, tint.\n     * @type String\n     * @default\n     **/\n    mode: 'multiply',\n\n    /**\n     * alpha value. represent the strength of the blend color operation.\n     * @type Number\n     * @default\n     **/\n    alpha: 1,\n\n    /**\n     * Fragment source for the Multiply program\n     */\n    fragmentSource: {\n      multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n      screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n      add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n      diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n      subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n      lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n      darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n      exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n      overlay: 'if (uColor.r < 0.5) {\\n' +\n          'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n        '}\\n' +\n        'if (uColor.g < 0.5) {\\n' +\n          'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n        '}\\n' +\n        'if (uColor.b < 0.5) {\\n' +\n          'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n        '} else {\\n' +\n          'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n        '}\\n',\n      tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n        'gl_FragColor.rgb += uColor.rgb;\\n',\n    },\n\n    /**\n     * build the fragment source for the filters, joining the common part with\n     * the specific one.\n     * @param {String} mode the mode of the filter, a key of this.fragmentSource\n     * @return {String} the source to be compiled\n     * @private\n     */\n    buildSource: function(mode) {\n      return 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'gl_FragColor = color;\\n' +\n          'if (color.a > 0.0) {\\n' +\n            this.fragmentSource[mode] +\n          '}\\n' +\n        '}';\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode, shaderSource;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        shaderSource = this.buildSource(this.mode);\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    /**\n     * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          data = imageData.data, iLen = data.length,\n          tr, tg, tb,\n          r, g, b,\n          source, alpha1 = 1 - this.alpha;\n\n      source = new fabric.Color(this.color).getSource();\n      tr = source[0] * this.alpha;\n      tg = source[1] * this.alpha;\n      tb = source[2] * this.alpha;\n\n      for (var i = 0; i < iLen; i += 4) {\n\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n\n        switch (this.mode) {\n          case 'multiply':\n            data[i] = r * tr / 255;\n            data[i + 1] = g * tg / 255;\n            data[i + 2] = b * tb / 255;\n            break;\n          case 'screen':\n            data[i] = 255 - (255 - r) * (255 - tr) / 255;\n            data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n            data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n            break;\n          case 'add':\n            data[i] = r + tr;\n            data[i + 1] = g + tg;\n            data[i + 2] = b + tb;\n            break;\n          case 'diff':\n          case 'difference':\n            data[i] = Math.abs(r - tr);\n            data[i + 1] = Math.abs(g - tg);\n            data[i + 2] = Math.abs(b - tb);\n            break;\n          case 'subtract':\n            data[i] = r - tr;\n            data[i + 1] = g - tg;\n            data[i + 2] = b - tb;\n            break;\n          case 'darken':\n            data[i] = Math.min(r, tr);\n            data[i + 1] = Math.min(g, tg);\n            data[i + 2] = Math.min(b, tb);\n            break;\n          case 'lighten':\n            data[i] = Math.max(r, tr);\n            data[i + 1] = Math.max(g, tg);\n            data[i + 2] = Math.max(b, tb);\n            break;\n          case 'overlay':\n            data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n            data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n            data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n            break;\n          case 'exclusion':\n            data[i] = tr + r - ((2 * tr * r) / 255);\n            data[i + 1] = tg + g - ((2 * tg * g) / 255);\n            data[i + 2] = tb + b - ((2 * tb * b) / 255);\n            break;\n          case 'tint':\n            data[i] = tr + r * alpha1;\n            data[i + 1] = tg + g * alpha1;\n            data[i + 2] = tb + b * alpha1;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uColor: gl.getUniformLocation(program, 'uColor'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var source = new fabric.Color(this.color).getSource();\n      source[0] = this.alpha * source[0] / 255;\n      source[1] = this.alpha * source[1] / 255;\n      source[2] = this.alpha * source[2] / 255;\n      source[3] = this.alpha;\n      gl.uniform4fv(uniformLocations.uColor, source);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        color: this.color,\n        mode: this.mode,\n        alpha: this.alpha\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n   */\n  fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n  'use strict';\n\n  var fabric = global.fabric,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Image Blend filter class\n   * @class fabric.Image.filter.BlendImage\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @example\n   * var filter = new fabric.Image.filters.BlendColor({\n   *  color: '#000',\n   *  mode: 'multiply'\n   * });\n   *\n   * var filter = new fabric.Image.filters.BlendImage({\n   *  image: fabricImageObject,\n   *  mode: 'multiply',\n   *  alpha: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n\n  filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n    type: 'BlendImage',\n\n    /**\n     * Color to make the blend operation with. default to a reddish color since black or white\n     * gives always strong result.\n     **/\n    image: null,\n\n    /**\n     * Blend mode for the filter (one of \"multiply\", \"mask\")\n     * @type String\n     * @default\n     **/\n    mode: 'multiply',\n\n    /**\n     * alpha value. represent the strength of the blend image operation.\n     * not implemented.\n     **/\n    alpha: 1,\n\n    vertexSource: 'attribute vec2 aPosition;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'varying vec2 vTexCoord2;\\n' +\n      'uniform mat3 uTransformMatrix;\\n' +\n      'void main() {\\n' +\n        'vTexCoord = aPosition;\\n' +\n        'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n        'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n      '}',\n\n    /**\n     * Fragment source for the Multiply program\n     */\n    fragmentSource: {\n      multiply: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform sampler2D uImage;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'varying vec2 vTexCoord2;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n          'color.rgba *= color2.rgba;\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n      mask: 'precision highp float;\\n' +\n        'uniform sampler2D uTexture;\\n' +\n        'uniform sampler2D uImage;\\n' +\n        'uniform vec4 uColor;\\n' +\n        'varying vec2 vTexCoord;\\n' +\n        'varying vec2 vTexCoord2;\\n' +\n        'void main() {\\n' +\n          'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n          'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n          'color.a = color2.a;\\n' +\n          'gl_FragColor = color;\\n' +\n        '}',\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var cacheKey = this.type + '_' + this.mode;\n      var shaderSource = this.fragmentSource[this.mode];\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    applyToWebGL: function(options) {\n      // load texture to blend.\n      var gl = options.context,\n          texture = this.createTexture(options.filterBackend, this.image);\n      this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n      this.callSuper('applyToWebGL', options);\n      this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n    },\n\n    createTexture: function(backend, image) {\n      return backend.getCachedTexture(image.cacheKey, image._element);\n    },\n\n    /**\n     * Calculate a transformMatrix to adapt the image to blend over\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    calculateMatrix: function() {\n      var image = this.image,\n          width = image._element.width,\n          height = image._element.height;\n      return [\n        1 / image.scaleX, 0, 0,\n        0, 1 / image.scaleY, 0,\n        -image.left / width, -image.top / height, 1\n      ];\n    },\n\n    /**\n     * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          resources = options.filterBackend.resources,\n          data = imageData.data, iLen = data.length,\n          width = imageData.width,\n          height = imageData.height,\n          tr, tg, tb, ta,\n          r, g, b, a,\n          canvas1, context, image = this.image, blendData;\n\n      if (!resources.blendImage) {\n        resources.blendImage = fabric.util.createCanvasElement();\n      }\n      canvas1 = resources.blendImage;\n      context = canvas1.getContext('2d');\n      if (canvas1.width !== width || canvas1.height !== height) {\n        canvas1.width = width;\n        canvas1.height = height;\n      }\n      else {\n        context.clearRect(0, 0, width, height);\n      }\n      context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n      context.drawImage(image._element, 0, 0, width, height);\n      blendData = context.getImageData(0, 0, width, height).data;\n      for (var i = 0; i < iLen; i += 4) {\n\n        r = data[i];\n        g = data[i + 1];\n        b = data[i + 2];\n        a = data[i + 3];\n\n        tr = blendData[i];\n        tg = blendData[i + 1];\n        tb = blendData[i + 2];\n        ta = blendData[i + 3];\n\n        switch (this.mode) {\n          case 'multiply':\n            data[i] = r * tr / 255;\n            data[i + 1] = g * tg / 255;\n            data[i + 2] = b * tb / 255;\n            data[i + 3] = a * ta / 255;\n            break;\n          case 'mask':\n            data[i + 3] = ta;\n            break;\n        }\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n        uImage: gl.getUniformLocation(program, 'uImage'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var matrix = this.calculateMatrix();\n      gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n      gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        image: this.image && this.image.toObject(),\n        mode: this.mode,\n        alpha: this.alpha\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} callback to be invoked after filter creation\n   * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n   */\n  fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n    fabric.Image.fromObject(object.image, function(image) {\n      var options = fabric.util.object.clone(object);\n      options.image = image;\n      callback(new fabric.Image.filters.BlendImage(options));\n    });\n  };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n      sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n      ceil = Math.ceil,\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Resize image filter class\n   * @class fabric.Image.filters.Resize\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Resize();\n   * object.filters.push(filter);\n   * object.applyFilters(canvas.renderAll.bind(canvas));\n   */\n  filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Resize',\n\n    /**\n     * Resize type\n     * for webgl resizeType is just lanczos, for canvas2d can be:\n     * bilinear, hermite, sliceHack, lanczos.\n     * @param {String} resizeType\n     * @default\n     */\n    resizeType: 'hermite',\n\n    /**\n     * Scale factor for resizing, x axis\n     * @param {Number} scaleX\n     * @default\n     */\n    scaleX: 1,\n\n    /**\n     * Scale factor for resizing, y axis\n     * @param {Number} scaleY\n     * @default\n     */\n    scaleY: 1,\n\n    /**\n     * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n     * @param {Number} lanczosLobes\n     * @default\n     */\n    lanczosLobes: 3,\n\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uDelta: gl.getUniformLocation(program, 'uDelta'),\n        uTaps: gl.getUniformLocation(program, 'uTaps'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n      gl.uniform1fv(uniformLocations.uTaps, this.taps);\n    },\n\n    /**\n     * Retrieves the cached shader.\n     * @param {Object} options\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    retrieveShader: function(options) {\n      var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n      if (!options.programCache.hasOwnProperty(cacheKey)) {\n        var fragmentShader = this.generateShader(filterWindow);\n        options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n      }\n      return options.programCache[cacheKey];\n    },\n\n    getFilterWindow: function() {\n      var scale = this.tempScale;\n      return Math.ceil(this.lanczosLobes / scale);\n    },\n\n    getTaps: function() {\n      var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n          filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n      for (var i = 1; i <= filterWindow; i++) {\n        taps[i - 1] = lobeFunction(i * scale);\n      }\n      return taps;\n    },\n\n    /**\n     * Generate vertex and shader sources from the necessary steps numbers\n     * @param {Number} filterWindow\n     */\n    generateShader: function(filterWindow) {\n      var offsets = new Array(filterWindow),\n          fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n      for (var i = 1; i <= filterWindow; i++) {\n        offsets[i - 1] = i + '.0 * uDelta';\n      }\n\n      fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n      fragmentShader += 'void main() {\\n';\n      fragmentShader += '  vec4 color = texture2D(uTexture, vTexCoord);\\n';\n      fragmentShader += '  float sum = 1.0;\\n';\n\n      offsets.forEach(function(offset, i) {\n        fragmentShader += '  color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n        fragmentShader += '  color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n        fragmentShader += '  sum += 2.0 * uTaps[' + i + '];\\n';\n      });\n      fragmentShader += '  gl_FragColor = color / sum;\\n';\n      fragmentShader += '}';\n      return fragmentShader;\n    },\n\n    fragmentSourceTOP: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec2 uDelta;\\n' +\n      'varying vec2 vTexCoord;\\n',\n\n    /**\n     * Apply the resize filter to the image\n     * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be executed\n     * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n     * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n     * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    applyTo: function(options) {\n      if (options.webgl) {\n        options.passes++;\n        this.width = options.sourceWidth;\n        this.horizontal = true;\n        this.dW = Math.round(this.width * this.scaleX);\n        this.dH = options.sourceHeight;\n        this.tempScale = this.dW / this.width;\n        this.taps = this.getTaps();\n        options.destinationWidth = this.dW;\n        this._setupFrameBuffer(options);\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        options.sourceWidth = options.destinationWidth;\n\n        this.height = options.sourceHeight;\n        this.horizontal = false;\n        this.dH = Math.round(this.height * this.scaleY);\n        this.tempScale = this.dH / this.height;\n        this.taps = this.getTaps();\n        options.destinationHeight = this.dH;\n        this._setupFrameBuffer(options);\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        options.sourceHeight = options.destinationHeight;\n      }\n      else {\n        this.applyTo2d(options);\n      }\n    },\n\n    isNeutralState: function() {\n      return this.scaleX === 1 && this.scaleY === 1;\n    },\n\n    lanczosCreate: function(lobes) {\n      return function(x) {\n        if (x >= lobes || x <= -lobes) {\n          return 0.0;\n        }\n        if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n          return 1.0;\n        }\n        x *= Math.PI;\n        var xx = x / lobes;\n        return (sin(x) / x) * sin(xx) / xx;\n      };\n    },\n\n    /**\n     * Applies filter to canvas element\n     * @memberOf fabric.Image.filters.Resize.prototype\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} scaleX\n     * @param {Number} scaleY\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData,\n          scaleX = this.scaleX,\n          scaleY = this.scaleY;\n\n      this.rcpScaleX = 1 / scaleX;\n      this.rcpScaleY = 1 / scaleY;\n\n      var oW = imageData.width, oH = imageData.height,\n          dW = round(oW * scaleX), dH = round(oH * scaleY),\n          newData;\n\n      if (this.resizeType === 'sliceHack') {\n        newData = this.sliceByTwo(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'hermite') {\n        newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'bilinear') {\n        newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n      }\n      else if (this.resizeType === 'lanczos') {\n        newData = this.lanczosResize(options, oW, oH, dW, dH);\n      }\n      options.imageData = newData;\n    },\n\n    /**\n     * Filter sliceByTwo\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    sliceByTwo: function(options, oW, oH, dW, dH) {\n      var imageData = options.imageData,\n          mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n          stepH = oH * mult, resources = fabric.filterBackend.resources,\n          tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n      if (!resources.sliceByTwo) {\n        resources.sliceByTwo = document.createElement('canvas');\n      }\n      tmpCanvas = resources.sliceByTwo;\n      if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n        tmpCanvas.width = oW * 1.5;\n        tmpCanvas.height = oH;\n      }\n      ctx = tmpCanvas.getContext('2d');\n      ctx.clearRect(0, 0, oW * 1.5, oH);\n      ctx.putImageData(imageData, 0, 0);\n\n      dW = floor(dW);\n      dH = floor(dH);\n\n      while (!doneW || !doneH) {\n        oW = stepW;\n        oH = stepH;\n        if (dW < floor(stepW * mult)) {\n          stepW = floor(stepW * mult);\n        }\n        else {\n          stepW = dW;\n          doneW = true;\n        }\n        if (dH < floor(stepH * mult)) {\n          stepH = floor(stepH * mult);\n        }\n        else {\n          stepH = dH;\n          doneH = true;\n        }\n        ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n        sX = dX;\n        sY = dY;\n        dY += stepH;\n      }\n      return ctx.getImageData(sX, sY, dW, dH);\n    },\n\n    /**\n     * Filter lanczosResize\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    lanczosResize: function(options, oW, oH, dW, dH) {\n\n      function process(u) {\n        var v, i, weight, idx, a, red, green,\n            blue, alpha, fX, fY;\n        center.x = (u + 0.5) * ratioX;\n        icenter.x = floor(center.x);\n        for (v = 0; v < dH; v++) {\n          center.y = (v + 0.5) * ratioY;\n          icenter.y = floor(center.y);\n          a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n          for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n            if (i < 0 || i >= oW) {\n              continue;\n            }\n            fX = floor(1000 * abs(i - center.x));\n            if (!cacheLanc[fX]) {\n              cacheLanc[fX] = { };\n            }\n            for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n              if (j < 0 || j >= oH) {\n                continue;\n              }\n              fY = floor(1000 * abs(j - center.y));\n              if (!cacheLanc[fX][fY]) {\n                cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n              }\n              weight = cacheLanc[fX][fY];\n              if (weight > 0) {\n                idx = (j * oW + i) * 4;\n                a += weight;\n                red += weight * srcData[idx];\n                green += weight * srcData[idx + 1];\n                blue += weight * srcData[idx + 2];\n                alpha += weight * srcData[idx + 3];\n              }\n            }\n          }\n          idx = (v * dW + u) * 4;\n          destData[idx] = red / a;\n          destData[idx + 1] = green / a;\n          destData[idx + 2] = blue / a;\n          destData[idx + 3] = alpha / a;\n        }\n\n        if (++u < dW) {\n          return process(u);\n        }\n        else {\n          return destImg;\n        }\n      }\n\n      var srcData = options.imageData.data,\n          destImg = options.ctx.createImageData(dW, dH),\n          destData = destImg.data,\n          lanczos = this.lanczosCreate(this.lanczosLobes),\n          ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n          rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n          range2X = ceil(ratioX * this.lanczosLobes / 2),\n          range2Y = ceil(ratioY * this.lanczosLobes / 2),\n          cacheLanc = { }, center = { }, icenter = { };\n\n      return process(0);\n    },\n\n    /**\n     * bilinearFiltering\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    bilinearFiltering: function(options, oW, oH, dW, dH) {\n      var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n          color, offset = 0, origPix, ratioX = this.rcpScaleX,\n          ratioY = this.rcpScaleY,\n          w4 = 4 * (oW - 1), img = options.imageData,\n          pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n          destPixels = destImage.data;\n      for (i = 0; i < dH; i++) {\n        for (j = 0; j < dW; j++) {\n          x = floor(ratioX * j);\n          y = floor(ratioY * i);\n          xDiff = ratioX * j - x;\n          yDiff = ratioY * i - y;\n          origPix = 4 * (y * oW + x);\n\n          for (chnl = 0; chnl < 4; chnl++) {\n            a = pixels[origPix + chnl];\n            b = pixels[origPix + 4 + chnl];\n            c = pixels[origPix + w4 + chnl];\n            d = pixels[origPix + w4 + 4 + chnl];\n            color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n                    c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n            destPixels[offset++] = color;\n          }\n        }\n      }\n      return destImage;\n    },\n\n    /**\n     * hermiteFastResize\n     * @param {Object} canvasEl Canvas element to apply filter to\n     * @param {Number} oW Original Width\n     * @param {Number} oH Original Height\n     * @param {Number} dW Destination Width\n     * @param {Number} dH Destination Height\n     * @returns {ImageData}\n     */\n    hermiteFastResize: function(options, oW, oH, dW, dH) {\n      var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n          ratioWHalf = ceil(ratioW / 2),\n          ratioHHalf = ceil(ratioH / 2),\n          img = options.imageData, data = img.data,\n          img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n      for (var j = 0; j < dH; j++) {\n        for (var i = 0; i < dW; i++) {\n          var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n              gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n          for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n            var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n                centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n            for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n              var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n                  w = sqrt(w0 + dx * dx);\n              /* eslint-disable max-depth */\n              if (w > 1 && w < -1) {\n                continue;\n              }\n              //hermite filter\n              weight = 2 * w * w * w - 3 * w * w + 1;\n              if (weight > 0) {\n                dx = 4 * (xx + yy * oW);\n                //alpha\n                gxA += weight * data[dx + 3];\n                weightsAlpha += weight;\n                //colors\n                if (data[dx + 3] < 255) {\n                  weight = weight * data[dx + 3] / 250;\n                }\n                gxR += weight * data[dx];\n                gxG += weight * data[dx + 1];\n                gxB += weight * data[dx + 2];\n                weights += weight;\n              }\n              /* eslint-enable max-depth */\n            }\n          }\n          data2[x2] = gxR / weights;\n          data2[x2 + 1] = gxG / weights;\n          data2[x2 + 2] = gxB / weights;\n          data2[x2 + 3] = gxA / weightsAlpha;\n        }\n      }\n      return img2;\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function() {\n      return {\n        type: this.type,\n        scaleX: this.scaleX,\n        scaleY: this.scaleY,\n        resizeType: this.resizeType,\n        lanczosLobes: this.lanczosLobes\n      };\n    }\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n   */\n  fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Contrast filter class\n   * @class fabric.Image.filters.Contrast\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Contrast({\n   *   contrast: 0.25\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Contrast',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uContrast;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n        'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * contrast value, range from -1 to 1.\n     * @param {Number} contrast\n     * @default 0\n     */\n    contrast: 0,\n\n    mainParameter: 'contrast',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Contrast.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n     */\n\n    /**\n      * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n      *\n      * @param {Object} options\n      * @param {ImageData} options.imageData The Uint8Array to be filtered.\n      */\n    applyTo2d: function(options) {\n      if (this.contrast === 0) {\n        return;\n      }\n      var imageData = options.imageData, i, len,\n          data = imageData.data, len = data.length,\n          contrast = Math.floor(this.contrast * 255),\n          contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n      for (i = 0; i < len; i += 4) {\n        data[i] = contrastF * (data[i] - 128) + 128;\n        data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n        data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uContrast: gl.getUniformLocation(program, 'uContrast'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uContrast, this.contrast);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n   */\n  fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Saturate filter class\n   * @class fabric.Image.filters.Saturation\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Saturation({\n   *   saturation: 1\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Saturation',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uSaturation;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float rgMax = max(color.r, color.g);\\n' +\n        'float rgbMax = max(rgMax, color.b);\\n' +\n        'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n        'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n        'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Saturation value, from -1 to 1.\n     * Increases/decreases the color saturation.\n     * A value of 0 has no effect.\n     * \n     * @param {Number} saturation\n     * @default\n     */\n    saturation: 0,\n\n    mainParameter: 'saturation',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Saturate.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n     */\n\n    /**\n     * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.saturation === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, len = data.length,\n          adjust = -this.saturation, i, max;\n\n      for (i = 0; i < len; i += 4) {\n        max = Math.max(data[i], data[i + 1], data[i + 2]);\n        data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n        data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n        data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n   */\n  fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Vibrance filter class\n   * @class fabric.Image.filters.Vibrance\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Vibrance({\n   *   vibrance: 1\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Vibrance',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform float uVibrance;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'float max = max(color.r, max(color.g, color.b));\\n' +\n        'float avg = (color.r + color.g + color.b) / 3.0;\\n' +\n        'float amt = (abs(max - avg) * 2.0) * uVibrance;\\n' +\n        'color.r += max != color.r ? (max - color.r) * amt : 0.00;\\n' +\n        'color.g += max != color.g ? (max - color.g) * amt : 0.00;\\n' +\n        'color.b += max != color.b ? (max - color.b) * amt : 0.00;\\n' +\n        'gl_FragColor = color;\\n' +\n      '}',\n\n    /**\n     * Vibrance value, from -1 to 1.\n     * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n     * A value of 0 has no effect.\n     * \n     * @param {Number} vibrance\n     * @default\n     */\n    vibrance: 0,\n\n    mainParameter: 'vibrance',\n\n    /**\n     * Constructor\n     * @memberOf fabric.Image.filters.Vibrance.prototype\n     * @param {Object} [options] Options object\n     * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1)\n     */\n\n    /**\n     * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n     */\n    applyTo2d: function(options) {\n      if (this.vibrance === 0) {\n        return;\n      }\n      var imageData = options.imageData,\n          data = imageData.data, len = data.length,\n          adjust = -this.vibrance, i, max, avg, amt;\n\n      for (i = 0; i < len; i += 4) {\n        max = Math.max(data[i], data[i + 1], data[i + 2]);\n        avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n        amt = ((Math.abs(max - avg) * 2 / 255) * adjust);\n        data[i] += max !== data[i] ? (max - data[i]) * amt : 0;\n        data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;\n        data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uVibrance: gl.getUniformLocation(program, 'uVibrance'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance\n   */\n  fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Blur filter class\n   * @class fabric.Image.filters.Blur\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Blur({\n   *   blur: 0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   * canvas.renderAll();\n   */\n  filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n    type: 'Blur',\n\n    /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord              )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n    /* eslint-disable max-len */\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec2 uDelta;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'const float nSamples = 15.0;\\n' +\n      'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n      'float random(vec3 scale) {\\n' +\n        /* use the fragment position for a different seed per-pixel */\n        'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n      '}\\n' +\n      'void main() {\\n' +\n        'vec4 color = vec4(0.0);\\n' +\n        'float total = 0.0;\\n' +\n        'float offset = random(v3offset);\\n' +\n        'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n          'float percent = (t + offset - 0.5) / nSamples;\\n' +\n          'float weight = 1.0 - abs(percent);\\n' +\n          'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n          'total += weight;\\n' +\n        '}\\n' +\n        'gl_FragColor = color / total;\\n' +\n      '}',\n    /* eslint-enable max-len */\n\n    /**\n     * blur value, in percentage of image dimensions.\n     * specific to keep the image blur constant at different resolutions\n     * range between 0 and 1.\n     * @type Number\n     * @default\n     */\n    blur: 0,\n\n    mainParameter: 'blur',\n\n    applyTo: function(options) {\n      if (options.webgl) {\n        // this aspectRatio is used to give the same blur to vertical and horizontal\n        this.aspectRatio = options.sourceWidth / options.sourceHeight;\n        options.passes++;\n        this._setupFrameBuffer(options);\n        this.horizontal = true;\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n        this._setupFrameBuffer(options);\n        this.horizontal = false;\n        this.applyToWebGL(options);\n        this._swapTextures(options);\n      }\n      else {\n        this.applyTo2d(options);\n      }\n    },\n\n    applyTo2d: function(options) {\n      // paint canvasEl with current image data.\n      //options.ctx.putImageData(options.imageData, 0, 0);\n      options.imageData = this.simpleBlur(options);\n    },\n\n    simpleBlur: function(options) {\n      var resources = options.filterBackend.resources, canvas1, canvas2,\n          width = options.imageData.width,\n          height = options.imageData.height;\n\n      if (!resources.blurLayer1) {\n        resources.blurLayer1 = fabric.util.createCanvasElement();\n        resources.blurLayer2 = fabric.util.createCanvasElement();\n      }\n      canvas1 = resources.blurLayer1;\n      canvas2 = resources.blurLayer2;\n      if (canvas1.width !== width || canvas1.height !== height) {\n        canvas2.width = canvas1.width = width;\n        canvas2.height = canvas1.height = height;\n      }\n      var ctx1 = canvas1.getContext('2d'),\n          ctx2 = canvas2.getContext('2d'),\n          nSamples = 15,\n          random, percent, j, i,\n          blur = this.blur * 0.06 * 0.5;\n\n      // load first canvas\n      ctx1.putImageData(options.imageData, 0, 0);\n      ctx2.clearRect(0, 0, width, height);\n\n      for (i = -nSamples; i <= nSamples; i++) {\n        random = (Math.random() - 0.5) / 4;\n        percent = i / nSamples;\n        j = blur * percent * width + random;\n        ctx2.globalAlpha = 1 - Math.abs(percent);\n        ctx2.drawImage(canvas1, j, random);\n        ctx1.drawImage(canvas2, 0, 0);\n        ctx2.globalAlpha = 1;\n        ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n      }\n      for (i = -nSamples; i <= nSamples; i++) {\n        random = (Math.random() - 0.5) / 4;\n        percent = i / nSamples;\n        j = blur * percent * height + random;\n        ctx2.globalAlpha = 1 - Math.abs(percent);\n        ctx2.drawImage(canvas1, random, j);\n        ctx1.drawImage(canvas2, 0, 0);\n        ctx2.globalAlpha = 1;\n        ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n      }\n      options.ctx.drawImage(canvas1, 0, 0);\n      var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n      ctx1.globalAlpha = 1;\n      ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n      return newImageData;\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        delta: gl.getUniformLocation(program, 'uDelta'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      var delta = this.chooseRightDelta();\n      gl.uniform2fv(uniformLocations.delta, delta);\n    },\n\n    /**\n     * choose right value of image percentage to blur with\n     * @returns {Array} a numeric array with delta values\n     */\n    chooseRightDelta: function() {\n      var blurScale = 1, delta = [0, 0], blur;\n      if (this.horizontal) {\n        if (this.aspectRatio > 1) {\n          // image is wide, i want to shrink radius horizontal\n          blurScale = 1 / this.aspectRatio;\n        }\n      }\n      else {\n        if (this.aspectRatio < 1) {\n          // image is tall, i want to shrink radius vertical\n          blurScale = this.aspectRatio;\n        }\n      }\n      blur = blurScale * this.blur * 0.12;\n      if (this.horizontal) {\n        delta[0] = blur;\n      }\n      else {\n        delta[1] = blur;\n      }\n      return delta;\n    },\n  });\n\n  /**\n   * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n   */\n  filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * Gamma filter class\n   * @class fabric.Image.filters.Gamma\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.Gamma({\n   *   gamma: [1, 0.5, 2.1]\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'Gamma',\n\n    fragmentSource: 'precision highp float;\\n' +\n      'uniform sampler2D uTexture;\\n' +\n      'uniform vec3 uGamma;\\n' +\n      'varying vec2 vTexCoord;\\n' +\n      'void main() {\\n' +\n        'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n        'vec3 correction = (1.0 / uGamma);\\n' +\n        'color.r = pow(color.r, correction.r);\\n' +\n        'color.g = pow(color.g, correction.g);\\n' +\n        'color.b = pow(color.b, correction.b);\\n' +\n        'gl_FragColor = color;\\n' +\n        'gl_FragColor.rgb *= color.a;\\n' +\n      '}',\n\n    /**\n     * Gamma array value, from 0.01 to 2.2.\n     * @param {Array} gamma\n     * @default\n     */\n    gamma: [1, 1, 1],\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'gamma',\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.gamma = [1, 1, 1];\n      filters.BaseFilter.prototype.initialize.call(this, options);\n    },\n\n    /**\n     * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n     *\n     * @param {Object} options\n     * @param {ImageData} options.imageData The Uint8Array to be filtered.\n     */\n    applyTo2d: function(options) {\n      var imageData = options.imageData, data = imageData.data,\n          gamma = this.gamma, len = data.length,\n          rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n          bInv = 1 / gamma[2], i;\n\n      if (!this.rVals) {\n        // eslint-disable-next-line\n        this.rVals = new Uint8Array(256);\n        // eslint-disable-next-line\n        this.gVals = new Uint8Array(256);\n        // eslint-disable-next-line\n        this.bVals = new Uint8Array(256);\n      }\n\n      // This is an optimization - pre-compute a look-up table for each color channel\n      // instead of performing these pow calls for each pixel in the image.\n      for (i = 0, len = 256; i < len; i++) {\n        this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n        this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n        this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n      }\n      for (i = 0, len = data.length; i < len; i += 4) {\n        data[i] = this.rVals[data[i]];\n        data[i + 1] = this.gVals[data[i + 1]];\n        data[i + 2] = this.bVals[data[i + 2]];\n      }\n    },\n\n    /**\n     * Return WebGL uniform locations for this filter's shader.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {WebGLShaderProgram} program This filter's compiled shader program.\n     */\n    getUniformLocations: function(gl, program) {\n      return {\n        uGamma: gl.getUniformLocation(program, 'uGamma'),\n      };\n    },\n\n    /**\n     * Send data from this filter to its shader program's uniforms.\n     *\n     * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n     * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n     */\n    sendUniformData: function(gl, uniformLocations) {\n      gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n    },\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n   */\n  fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * A container class that knows how to apply a sequence of filters to an input image.\n   */\n  filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n    type: 'Composed',\n\n    /**\n     * A non sparse array of filters to apply\n     */\n    subFilters: [],\n\n    /**\n     * Constructor\n     * @param {Object} [options] Options object\n     */\n    initialize: function(options) {\n      this.callSuper('initialize', options);\n      // create a new array instead mutating the prototype with push\n      this.subFilters = this.subFilters.slice(0);\n    },\n\n    /**\n     * Apply this container's filters to the input image provided.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be applied.\n     */\n    applyTo: function(options) {\n      options.passes += this.subFilters.length - 1;\n      this.subFilters.forEach(function(filter) {\n        filter.applyTo(options);\n      });\n    },\n\n    /**\n     * Serialize this filter into JSON.\n     *\n     * @returns {Object} A JSON representation of this filter.\n     */\n    toObject: function() {\n      return fabric.util.object.extend(this.callSuper('toObject'), {\n        subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n      });\n    },\n\n    isNeutralState: function() {\n      return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n    }\n  });\n\n  /**\n   * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n   */\n  fabric.Image.filters.Composed.fromObject = function(object, callback) {\n    var filters = object.subFilters || [],\n        subFilters = filters.map(function(filter) {\n          return new fabric.Image.filters[filter.type](filter);\n        }),\n        instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n    callback && callback(instance);\n    return instance;\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric  = global.fabric || (global.fabric = { }),\n      filters = fabric.Image.filters,\n      createClass = fabric.util.createClass;\n\n  /**\n   * HueRotation filter class\n   * @class fabric.Image.filters.HueRotation\n   * @memberOf fabric.Image.filters\n   * @extends fabric.Image.filters.BaseFilter\n   * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n   * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n   * @example\n   * var filter = new fabric.Image.filters.HueRotation({\n   *   rotation: -0.5\n   * });\n   * object.filters.push(filter);\n   * object.applyFilters();\n   */\n  filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n    /**\n     * Filter type\n     * @param {String} type\n     * @default\n     */\n    type: 'HueRotation',\n\n    /**\n     * HueRotation value, from -1 to 1.\n     * the unit is radians\n     * @param {Number} myParameter\n     * @default\n     */\n    rotation: 0,\n\n    /**\n     * Describe the property that is the filter parameter\n     * @param {String} m\n     * @default\n     */\n    mainParameter: 'rotation',\n\n    calculateMatrix: function() {\n      var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n          aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n      this.matrix = [\n        1, 0, 0, 0, 0,\n        0, 1, 0, 0, 0,\n        0, 0, 1, 0, 0,\n        0, 0, 0, 1, 0\n      ];\n      this.matrix[0] = cos + OneMinusCos / 3;\n      this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[6] = cos + aThird * OneMinusCos;\n      this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n      this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n      this.matrix[12] = cos + aThird * OneMinusCos;\n    },\n\n    /**\n     * HueRotation isNeutralState implementation\n     * Used only in image applyFilters to discard filters that will not have an effect\n     * on the image\n     * @param {Object} options\n     **/\n    isNeutralState: function(options) {\n      this.calculateMatrix();\n      return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n    },\n\n    /**\n     * Apply this filter to the input image data provided.\n     *\n     * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n     *\n     * @param {Object} options\n     * @param {Number} options.passes The number of filters remaining to be executed\n     * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n     * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n     * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n     * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n     * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n     */\n    applyTo: function(options) {\n      this.calculateMatrix();\n      filters.BaseFilter.prototype.applyTo.call(this, options);\n    },\n\n  });\n\n  /**\n   * Returns filter instance from an object representation\n   * @static\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] to be invoked after filter creation\n   * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n   */\n  fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = { }),\n      clone = fabric.util.object.clone;\n\n  if (fabric.Text) {\n    fabric.warn('fabric.Text is already defined');\n    return;\n  }\n\n  var additionalProps =\n    ('fontFamily fontWeight fontSize text underline overline linethrough' +\n    ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' +\n    ' direction path pathStartOffset pathSide pathAlign').split(' ');\n\n  /**\n   * Text class\n   * @class fabric.Text\n   * @extends fabric.Object\n   * @return {fabric.Text} thisArg\n   * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n   * @see {@link fabric.Text#initialize} for constructor definition\n   */\n  fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n    /**\n     * Properties which when set cause object to change dimensions\n     * @type Array\n     * @private\n     */\n    _dimensionAffectingProps: [\n      'fontSize',\n      'fontWeight',\n      'fontFamily',\n      'fontStyle',\n      'lineHeight',\n      'text',\n      'charSpacing',\n      'textAlign',\n      'styles',\n      'path',\n      'pathStartOffset',\n      'pathSide',\n      'pathAlign'\n    ],\n\n    /**\n     * @private\n     */\n    _reNewline: /\\r?\\n/,\n\n    /**\n     * Use this regular expression to filter for whitespaces that is not a new line.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reSpacesAndTabs: /[ \\t\\r]/g,\n\n    /**\n     * Use this regular expression to filter for whitespace that is not a new line.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reSpaceAndTab: /[ \\t\\r]/,\n\n    /**\n     * Use this regular expression to filter consecutive groups of non spaces.\n     * Mostly used when text is 'justify' aligned.\n     * @private\n     */\n    _reWords: /\\S+/g,\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type:                 'text',\n\n    /**\n     * Font size (in pixels)\n     * @type Number\n     * @default\n     */\n    fontSize:             40,\n\n    /**\n     * Font weight (e.g. bold, normal, 400, 600, 800)\n     * @type {(Number|String)}\n     * @default\n     */\n    fontWeight:           'normal',\n\n    /**\n     * Font family\n     * @type String\n     * @default\n     */\n    fontFamily:           'Times New Roman',\n\n    /**\n     * Text decoration underline.\n     * @type Boolean\n     * @default\n     */\n    underline:       false,\n\n    /**\n     * Text decoration overline.\n     * @type Boolean\n     * @default\n     */\n    overline:       false,\n\n    /**\n     * Text decoration linethrough.\n     * @type Boolean\n     * @default\n     */\n    linethrough:       false,\n\n    /**\n     * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n     * \"justify-left\", \"justify-center\" or \"justify-right\".\n     * @type String\n     * @default\n     */\n    textAlign:            'left',\n\n    /**\n     * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n     * @type String\n     * @default\n     */\n    fontStyle:            'normal',\n\n    /**\n     * Line height\n     * @type Number\n     * @default\n     */\n    lineHeight:           1.16,\n\n    /**\n     * Superscript schema object (minimum overlap)\n     * @type {Object}\n     * @default\n     */\n    superscript: {\n      size:      0.60, // fontSize factor\n      baseline: -0.35  // baseline-shift factor (upwards)\n    },\n\n    /**\n     * Subscript schema object (minimum overlap)\n     * @type {Object}\n     * @default\n     */\n    subscript: {\n      size:      0.60, // fontSize factor\n      baseline:  0.11  // baseline-shift factor (downwards)\n    },\n\n    /**\n     * Background color of text lines\n     * @type String\n     * @default\n     */\n    textBackgroundColor:  '',\n\n    /**\n     * List of properties to consider when checking if\n     * state of an object is changed ({@link fabric.Object#hasStateChanged})\n     * as well as for history (undo/redo) purposes\n     * @type Array\n     */\n    stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps),\n\n    /**\n     * List of properties to consider when checking if cache needs refresh\n     * @type Array\n     */\n    cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps),\n\n    /**\n     * When defined, an object is rendered via stroke and this property specifies its color.\n     * <b>Backwards incompatibility note:</b> This property was named \"strokeStyle\" until v1.1.6\n     * @type String\n     * @default\n     */\n    stroke:               null,\n\n    /**\n     * Shadow object representing shadow of this shape.\n     * <b>Backwards incompatibility note:</b> This property was named \"textShadow\" (String) until v1.2.11\n     * @type fabric.Shadow\n     * @default\n     */\n    shadow:               null,\n\n    /**\n     * fabric.Path that the text should follow.\n     * since 4.6.0 the path will be drawn automatically.\n     * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n     * if you want it to be hidden, assign visible = false to the path.\n     * This feature is in BETA, and SVG import/export is not yet supported.\n     * @type fabric.Path\n     * @example\n     * var textPath = new fabric.Text('Text on a path', {\n     *     top: 150,\n     *     left: 150,\n     *     textAlign: 'center',\n     *     charSpacing: -50,\n     *     path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', {\n     *         strokeWidth: 1,\n     *         visible: false\n     *     }),\n     *     pathSide: 'left',\n     *     pathStartOffset: 0\n     * });\n     * @default\n     */\n    path:               null,\n\n    /**\n     * Offset amount for text path starting position\n     * Only used when text has a path\n     * @type Number\n     * @default\n     */\n    pathStartOffset:               0,\n\n    /**\n     * Which side of the path the text should be drawn on.\n     * Only used when text has a path\n     * @type {String} 'left|right'\n     * @default\n     */\n    pathSide:               'left',\n\n    /**\n     * How text is aligned to the path. This property determines\n     * the perpendicular position of each character relative to the path.\n     * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n     * This feature is in BETA, and its behavior may change\n     * @type String\n     * @default\n     */\n    pathAlign:               'baseline',\n\n    /**\n     * @private\n     */\n    _fontSizeFraction: 0.222,\n\n    /**\n     * @private\n     */\n    offsets: {\n      underline: 0.10,\n      linethrough: -0.315,\n      overline: -0.88\n    },\n\n    /**\n     * Text Line proportion to font Size (in pixels)\n     * @type Number\n     * @default\n     */\n    _fontSizeMult:             1.13,\n\n    /**\n     * additional space between characters\n     * expressed in thousands of em unit\n     * @type Number\n     * @default\n     */\n    charSpacing:             0,\n\n    /**\n     * Object containing character styles - top-level properties -> line numbers,\n     * 2nd-level properties - character numbers\n     * @type Object\n     * @default\n     */\n    styles: null,\n\n    /**\n     * Reference to a context to measure text char or couple of chars\n     * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n     * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every\n     * text object created.\n     * @type {CanvasRenderingContext2D}\n     * @default\n     */\n    _measuringContext: null,\n\n    /**\n     * Baseline shift, styles only, keep at 0 for the main text object\n     * @type {Number}\n     * @default\n     */\n    deltaY: 0,\n\n    /**\n     * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n     * determine the direction of the text.\n     * This has to be set manually together with textAlign and originX for proper\n     * experience.\n     * some interesting link for the future\n     * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n     * @since 4.5.0\n     * @type {String} 'ltr|rtl'\n     * @default\n     */\n    direction: 'ltr',\n\n    /**\n     * Array of properties that define a style unit (of 'styles').\n     * @type {Array}\n     * @default\n     */\n    _styleProperties: [\n      'stroke',\n      'strokeWidth',\n      'fill',\n      'fontFamily',\n      'fontSize',\n      'fontWeight',\n      'fontStyle',\n      'underline',\n      'overline',\n      'linethrough',\n      'deltaY',\n      'textBackgroundColor',\n    ],\n\n    /**\n     * contains characters bounding boxes\n     */\n    __charBounds: [],\n\n    /**\n     * use this size when measuring text. To avoid IE11 rounding errors\n     * @type {Number}\n     * @default\n     * @readonly\n     * @private\n     */\n    CACHE_FONT_SIZE: 400,\n\n    /**\n     * contains the min text width to avoid getting 0\n     * @type {Number}\n     * @default\n     */\n    MIN_TEXT_WIDTH: 2,\n\n    /**\n     * Constructor\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.Text} thisArg\n     */\n    initialize: function(text, options) {\n      this.styles = options ? (options.styles || { }) : { };\n      this.text = text;\n      this.__skipDimension = true;\n      this.callSuper('initialize', options);\n      if (this.path) {\n        this.setPathInfo();\n      }\n      this.__skipDimension = false;\n      this.initDimensions();\n      this.setCoords();\n      this.setupState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * If text has a path, it will add the extra information needed\n     * for path and text calculations\n     * @return {fabric.Text} thisArg\n     */\n    setPathInfo: function() {\n      var path = this.path;\n      if (path) {\n        path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path);\n      }\n    },\n\n    /**\n     * Return a context for measurement of text string.\n     * if created it gets stored for reuse\n     * this is for internal use, please do not use it\n     * @private\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.Text} thisArg\n     */\n    getMeasuringContext: function() {\n      // if we did not return we have to measure something.\n      if (!fabric._measuringContext) {\n        fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n          fabric.util.createCanvasElement().getContext('2d');\n      }\n      return fabric._measuringContext;\n    },\n\n    /**\n     * @private\n     * Divides text into lines of text and lines of graphemes.\n     */\n    _splitText: function() {\n      var newLines = this._splitTextIntoLines(this.text);\n      this.textLines = newLines.lines;\n      this._textLines = newLines.graphemeLines;\n      this._unwrappedTextLines = newLines._unwrappedLines;\n      this._text = newLines.graphemeText;\n      return newLines;\n    },\n\n    /**\n     * Initialize or update text dimensions.\n     * Updates this.width and this.height with the proper values.\n     * Does not return dimensions.\n     */\n    initDimensions: function() {\n      if (this.__skipDimension) {\n        return;\n      }\n      this._splitText();\n      this._clearCache();\n      if (this.path) {\n        this.width = this.path.width;\n        this.height = this.path.height;\n      }\n      else {\n        this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n        this.height = this.calcTextHeight();\n      }\n      if (this.textAlign.indexOf('justify') !== -1) {\n        // once text is measured we need to make space fatter to make justified text.\n        this.enlargeSpaces();\n      }\n      this.saveState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * Enlarge space boxes and shift the others\n     */\n    enlargeSpaces: function() {\n      var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n          continue;\n        }\n        accumulatedSpace = 0;\n        line = this._textLines[i];\n        currentLineWidth = this.getLineWidth(i);\n        if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n          numberOfSpaces = spaces.length;\n          diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n          for (var j = 0, jlen = line.length; j <= jlen; j++) {\n            charBound = this.__charBounds[i][j];\n            if (this._reSpaceAndTab.test(line[j])) {\n              charBound.width += diffSpace;\n              charBound.kernedWidth += diffSpace;\n              charBound.left += accumulatedSpace;\n              accumulatedSpace += diffSpace;\n            }\n            else {\n              charBound.left += accumulatedSpace;\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Detect if the text line is ended with an hard break\n     * text and itext do not have wrapping, return false\n     * @return {Boolean}\n     */\n    isEndOfWrapping: function(lineIndex) {\n      return lineIndex === this._textLines.length - 1;\n    },\n\n    /**\n     * Detect if a line has a linebreak and so we need to account for it when moving\n     * and counting style.\n     * It return always for text and Itext.\n     * @return Number\n     */\n    missingNewlineOffset: function() {\n      return 1;\n    },\n\n    /**\n     * Returns string representation of an instance\n     * @return {String} String representation of text object\n     */\n    toString: function() {\n      return '#<fabric.Text (' + this.complexity() +\n        '): { \"text\": \"' + this.text + '\", \"fontFamily\": \"' + this.fontFamily + '\" }>';\n    },\n\n    /**\n     * Return the dimension and the zoom level needed to create a cache canvas\n     * big enough to host the object to be cached.\n     * @private\n     * @param {Object} dim.x width of object to be cached\n     * @param {Object} dim.y height of object to be cached\n     * @return {Object}.width width of canvas\n     * @return {Object}.height height of canvas\n     * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n     * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n     */\n    _getCacheCanvasDimensions: function() {\n      var dims = this.callSuper('_getCacheCanvasDimensions');\n      var fontSize = this.fontSize;\n      dims.width += fontSize * dims.zoomX;\n      dims.height += fontSize * dims.zoomY;\n      return dims;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      var path = this.path;\n      path && !path.isNotVisible() && path._render(ctx);\n      this._setTextStyles(ctx);\n      this._renderTextLinesBackground(ctx);\n      this._renderTextDecoration(ctx, 'underline');\n      this._renderText(ctx);\n      this._renderTextDecoration(ctx, 'overline');\n      this._renderTextDecoration(ctx, 'linethrough');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderText: function(ctx) {\n      if (this.paintFirst === 'stroke') {\n        this._renderTextStroke(ctx);\n        this._renderTextFill(ctx);\n      }\n      else {\n        this._renderTextFill(ctx);\n        this._renderTextStroke(ctx);\n      }\n    },\n\n    /**\n     * Set the font parameter of the context with the object properties or with charStyle\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Object} [charStyle] object with font style properties\n     * @param {String} [charStyle.fontFamily] Font Family\n     * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n     * @param {String} [charStyle.fontWeight] Font weight\n     * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n     */\n    _setTextStyles: function(ctx, charStyle, forMeasuring) {\n      ctx.textBaseline = 'alphabetical';\n      if (this.path) {\n        switch (this.pathAlign) {\n          case 'center':\n            ctx.textBaseline = 'middle';\n            break;\n          case 'ascender':\n            ctx.textBaseline = 'top';\n            break;\n          case 'descender':\n            ctx.textBaseline = 'bottom';\n            break;\n        }\n      }\n      ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n    },\n\n    /**\n     * calculate and return the text Width measuring each line.\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @return {Number} Maximum width of fabric.Text object\n     */\n    calcTextWidth: function() {\n      var maxWidth = this.getLineWidth(0);\n\n      for (var i = 1, len = this._textLines.length; i < len; i++) {\n        var currentLineWidth = this.getLineWidth(i);\n        if (currentLineWidth > maxWidth) {\n          maxWidth = currentLineWidth;\n        }\n      }\n      return maxWidth;\n    },\n\n    /**\n     * @private\n     * @param {String} method Method name (\"fillText\" or \"strokeText\")\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {String} line Text to render\n     * @param {Number} left Left position of text\n     * @param {Number} top Top position of text\n     * @param {Number} lineIndex Index of a line in a text\n     */\n    _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n      this._renderChars(method, ctx, line, left, top, lineIndex);\n    },\n\n    /**\n     * Renders the text background for lines, taking care of style\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextLinesBackground: function(ctx) {\n      if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n        return;\n      }\n      var heightOfLine,\n          lineLeftOffset, originalFill = ctx.fillStyle,\n          line, lastColor,\n          leftOffset = this._getLeftOffset(),\n          lineTopOffset = this._getTopOffset(),\n          boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path,\n          drawStart;\n\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        heightOfLine = this.getHeightOfLine(i);\n        if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n          lineTopOffset += heightOfLine;\n          continue;\n        }\n        line = this._textLines[i];\n        lineLeftOffset = this._getLineLeftOffset(i);\n        boxWidth = 0;\n        boxStart = 0;\n        lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n        for (var j = 0, jlen = line.length; j < jlen; j++) {\n          charBox = this.__charBounds[i][j];\n          currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n          if (path) {\n            ctx.save();\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            ctx.fillStyle = currentColor;\n            currentColor && ctx.fillRect(\n              -charBox.width / 2,\n              -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction),\n              charBox.width,\n              heightOfLine / this.lineHeight\n            );\n            ctx.restore();\n          }\n          else if (currentColor !== lastColor) {\n            drawStart = leftOffset + lineLeftOffset + boxStart;\n            if (this.direction === 'rtl') {\n              drawStart = this.width - drawStart - boxWidth;\n            }\n            ctx.fillStyle = lastColor;\n            lastColor && ctx.fillRect(\n              drawStart,\n              lineTopOffset,\n              boxWidth,\n              heightOfLine / this.lineHeight\n            );\n            boxStart = charBox.left;\n            boxWidth = charBox.width;\n            lastColor = currentColor;\n          }\n          else {\n            boxWidth += charBox.kernedWidth;\n          }\n        }\n        if (currentColor && !path) {\n          drawStart = leftOffset + lineLeftOffset + boxStart;\n          if (this.direction === 'rtl') {\n            drawStart = this.width - drawStart - boxWidth;\n          }\n          ctx.fillStyle = currentColor;\n          ctx.fillRect(\n            drawStart,\n            lineTopOffset,\n            boxWidth,\n            heightOfLine / this.lineHeight\n          );\n        }\n        lineTopOffset += heightOfLine;\n      }\n      ctx.fillStyle = originalFill;\n      // if there is text background color no\n      // other shadows should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * @private\n     * @param {Object} decl style declaration for cache\n     * @param {String} decl.fontFamily fontFamily\n     * @param {String} decl.fontStyle fontStyle\n     * @param {String} decl.fontWeight fontWeight\n     * @return {Object} reference to cache\n     */\n    getFontCache: function(decl) {\n      var fontFamily = decl.fontFamily.toLowerCase();\n      if (!fabric.charWidthsCache[fontFamily]) {\n        fabric.charWidthsCache[fontFamily] = { };\n      }\n      var cache = fabric.charWidthsCache[fontFamily],\n          cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n      if (!cache[cacheProp]) {\n        cache[cacheProp] = { };\n      }\n      return cache[cacheProp];\n    },\n\n    /**\n     * measure and return the width of a single character.\n     * possibly overridden to accommodate different measure logic or\n     * to hook some external lib for character measurement\n     * @private\n     * @param {String} _char, char to be measured\n     * @param {Object} charStyle style of char to be measured\n     * @param {String} [previousChar] previous char\n     * @param {Object} [prevCharStyle] style of previous char\n     */\n    _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n      // first i try to return from cache\n      var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n          previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n          stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n          fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n      if (previousChar && fontCache[previousChar] !== undefined) {\n        previousWidth = fontCache[previousChar];\n      }\n      if (fontCache[_char] !== undefined) {\n        kernedWidth = width = fontCache[_char];\n      }\n      if (stylesAreEqual && fontCache[couple] !== undefined) {\n        coupleWidth = fontCache[couple];\n        kernedWidth = coupleWidth - previousWidth;\n      }\n      if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n        var ctx = this.getMeasuringContext();\n        // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n        this._setTextStyles(ctx, charStyle, true);\n      }\n      if (width === undefined) {\n        kernedWidth = width = ctx.measureText(_char).width;\n        fontCache[_char] = width;\n      }\n      if (previousWidth === undefined && stylesAreEqual && previousChar) {\n        previousWidth = ctx.measureText(previousChar).width;\n        fontCache[previousChar] = previousWidth;\n      }\n      if (stylesAreEqual && coupleWidth === undefined) {\n        // we can measure the kerning couple and subtract the width of the previous character\n        coupleWidth = ctx.measureText(couple).width;\n        fontCache[couple] = coupleWidth;\n        kernedWidth = coupleWidth - previousWidth;\n      }\n      return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n    },\n\n    /**\n     * Computes height of character at given position\n     * @param {Number} line the line index number\n     * @param {Number} _char the character index number\n     * @return {Number} fontSize of the character\n     */\n    getHeightOfChar: function(line, _char) {\n      return this.getValueOfPropertyAt(line, _char, 'fontSize');\n    },\n\n    /**\n     * measure a text line measuring all characters.\n     * @param {Number} lineIndex line number\n     * @return {Number} Line width\n     */\n    measureLine: function(lineIndex) {\n      var lineInfo = this._measureLine(lineIndex);\n      if (this.charSpacing !== 0) {\n        lineInfo.width -= this._getWidthOfCharSpacing();\n      }\n      if (lineInfo.width < 0) {\n        lineInfo.width = 0;\n      }\n      return lineInfo;\n    },\n\n    /**\n     * measure every grapheme of a line, populating __charBounds\n     * @param {Number} lineIndex\n     * @return {Object} object.width total width of characters\n     * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n     */\n    _measureLine: function(lineIndex) {\n      var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n          graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length),\n          positionInPath = 0, startingPoint, totalPathLength, path = this.path,\n          reverse = this.pathSide === 'right';\n\n      this.__charBounds[lineIndex] = lineBounds;\n      for (i = 0; i < line.length; i++) {\n        grapheme = line[i];\n        graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n        lineBounds[i] = graphemeInfo;\n        width += graphemeInfo.kernedWidth;\n        prevGrapheme = grapheme;\n      }\n      // this latest bound box represent the last character of the line\n      // to simplify cursor handling in interactive mode.\n      lineBounds[i] = {\n        left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n        width: 0,\n        kernedWidth: 0,\n        height: this.fontSize\n      };\n      if (path) {\n        totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length;\n        startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo);\n        startingPoint.x += path.pathOffset.x;\n        startingPoint.y += path.pathOffset.y;\n        switch (this.textAlign) {\n          case 'left':\n            positionInPath = reverse ? (totalPathLength - width) : 0;\n            break;\n          case 'center':\n            positionInPath = (totalPathLength - width) / 2;\n            break;\n          case 'right':\n            positionInPath = reverse ? 0 : (totalPathLength - width);\n            break;\n          //todo - add support for justify\n        }\n        positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n        for (i = reverse ? line.length - 1 : 0;\n          reverse ? i >= 0 : i < line.length;\n          reverse ? i-- : i++) {\n          graphemeInfo = lineBounds[i];\n          if (positionInPath > totalPathLength) {\n            positionInPath %= totalPathLength;\n          }\n          else if (positionInPath < 0) {\n            positionInPath += totalPathLength;\n          }\n          // it would probably much faster to send all the grapheme position for a line\n          // and calculate path position/angle at once.\n          this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint);\n          positionInPath += graphemeInfo.kernedWidth;\n        }\n      }\n      return { width: width, numOfSpaces: numOfSpaces };\n    },\n\n    /**\n     * Calculate the angle  and the left,top position of the char that follow a path.\n     * It appends it to graphemeInfo to be reused later at rendering\n     * @private\n     * @param {Number} positionInPath to be measured\n     * @param {Object} graphemeInfo current grapheme box information\n     * @param {Object} startingPoint position of the point\n     */\n    _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) {\n      var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n          path = this.path;\n\n      // we are at currentPositionOnPath. we want to know what point on the path is.\n      var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo);\n      graphemeInfo.renderLeft = info.x - startingPoint.x;\n      graphemeInfo.renderTop = info.y - startingPoint.y;\n      graphemeInfo.angle = info.angle + (this.pathSide ===  'right' ? Math.PI : 0);\n    },\n\n    /**\n     * Measure and return the info of a single grapheme.\n     * needs the the info of previous graphemes already filled\n     * @private\n     * @param {String} grapheme to be measured\n     * @param {Number} lineIndex index of the line where the char is\n     * @param {Number} charIndex position in the line\n     * @param {String} [prevGrapheme] character preceding the one to be measured\n     */\n    _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n      var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n          prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n          info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n          kernedWidth = info.kernedWidth,\n          width = info.width, charSpacing;\n\n      if (this.charSpacing !== 0) {\n        charSpacing = this._getWidthOfCharSpacing();\n        width += charSpacing;\n        kernedWidth += charSpacing;\n      }\n\n      var box = {\n        width: width,\n        left: 0,\n        height: style.fontSize,\n        kernedWidth: kernedWidth,\n        deltaY: style.deltaY,\n      };\n      if (charIndex > 0 && !skipLeft) {\n        var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n        box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n      }\n      return box;\n    },\n\n    /**\n     * Calculate height of line at 'lineIndex'\n     * @param {Number} lineIndex index of line to calculate\n     * @return {Number}\n     */\n    getHeightOfLine: function(lineIndex) {\n      if (this.__lineHeights[lineIndex]) {\n        return this.__lineHeights[lineIndex];\n      }\n\n      var line = this._textLines[lineIndex],\n          // char 0 is measured before the line cycle because it nneds to char\n          // emptylines\n          maxHeight = this.getHeightOfChar(lineIndex, 0);\n      for (var i = 1, len = line.length; i < len; i++) {\n        maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n      }\n\n      return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n    },\n\n    /**\n     * Calculate text box height\n     */\n    calcTextHeight: function() {\n      var lineHeight, height = 0;\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        lineHeight = this.getHeightOfLine(i);\n        height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n      }\n      return height;\n    },\n\n    /**\n     * @private\n     * @return {Number} Left offset\n     */\n    _getLeftOffset: function() {\n      return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n    },\n\n    /**\n     * @private\n     * @return {Number} Top offset\n     */\n    _getTopOffset: function() {\n      return -this.height / 2;\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {String} method Method name (\"fillText\" or \"strokeText\")\n     */\n    _renderTextCommon: function(ctx, method) {\n      ctx.save();\n      var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset();\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        var heightOfLine = this.getHeightOfLine(i),\n            maxHeight = heightOfLine / this.lineHeight,\n            leftOffset = this._getLineLeftOffset(i);\n        this._renderTextLine(\n          method,\n          ctx,\n          this._textLines[i],\n          left + leftOffset,\n          top + lineHeights + maxHeight,\n          i\n        );\n        lineHeights += heightOfLine;\n      }\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextFill: function(ctx) {\n      if (!this.fill && !this.styleHas('fill')) {\n        return;\n      }\n\n      this._renderTextCommon(ctx, 'fillText');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextStroke: function(ctx) {\n      if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n        return;\n      }\n\n      if (this.shadow && !this.shadow.affectStroke) {\n        this._removeShadow(ctx);\n      }\n\n      ctx.save();\n      this._setLineDash(ctx, this.strokeDashArray);\n      ctx.beginPath();\n      this._renderTextCommon(ctx, 'strokeText');\n      ctx.closePath();\n      ctx.restore();\n    },\n\n    /**\n     * @private\n     * @param {String} method fillText or strokeText.\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Array} line Content of the line, splitted in an array by grapheme\n     * @param {Number} left\n     * @param {Number} top\n     * @param {Number} lineIndex\n     */\n    _renderChars: function(method, ctx, line, left, top, lineIndex) {\n      // set proper line offset\n      var lineHeight = this.getHeightOfLine(lineIndex),\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          actualStyle,\n          nextStyle,\n          charsToRender = '',\n          charBox,\n          boxWidth = 0,\n          timeToRender,\n          path = this.path,\n          shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path,\n          isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1,\n          drawingLeft, currentDirection = ctx.canvas.getAttribute('dir');\n      ctx.save();\n      if (currentDirection !== this.direction) {\n        ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n        ctx.direction = isLtr ? 'ltr' : 'rtl';\n        ctx.textAlign = isLtr ? 'left' : 'right';\n      }\n      top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n      if (shortCut) {\n        // render all the line in one pass without checking\n        // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n        this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight);\n        ctx.restore();\n        return;\n      }\n      for (var i = 0, len = line.length - 1; i <= len; i++) {\n        timeToRender = i === len || this.charSpacing || path;\n        charsToRender += line[i];\n        charBox = this.__charBounds[lineIndex][i];\n        if (boxWidth === 0) {\n          left += sign * (charBox.kernedWidth - charBox.width);\n          boxWidth += charBox.width;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n        if (isJustify && !timeToRender) {\n          if (this._reSpaceAndTab.test(line[i])) {\n            timeToRender = true;\n          }\n        }\n        if (!timeToRender) {\n          // if we have charSpacing, we render char by char\n          actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n          nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n          timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, false);\n        }\n        if (timeToRender) {\n          if (path) {\n            ctx.save();\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight);\n            ctx.restore();\n          }\n          else {\n            drawingLeft = left;\n            this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight);\n          }\n          charsToRender = '';\n          actualStyle = nextStyle;\n          left += sign * boxWidth;\n          boxWidth = 0;\n        }\n      }\n      ctx.restore();\n    },\n\n    /**\n     * This function try to patch the missing gradientTransform on canvas gradients.\n     * transforming a context to transform the gradient, is going to transform the stroke too.\n     * we want to transform the gradient but not the stroke operation, so we create\n     * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n     * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n     * is limited.\n     * @private\n     * @param {fabric.Gradient} filler a fabric gradient instance\n     * @return {CanvasPattern} a pattern to use as fill/stroke style\n     */\n    _applyPatternGradientTransformText: function(filler) {\n      var pCanvas = fabric.util.createCanvasElement(), pCtx,\n          // TODO: verify compatibility with strokeUniform\n          width = this.width + this.strokeWidth, height = this.height + this.strokeWidth;\n      pCanvas.width = width;\n      pCanvas.height = height;\n      pCtx = pCanvas.getContext('2d');\n      pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n      pCtx.lineTo(0, height); pCtx.closePath();\n      pCtx.translate(width / 2, height / 2);\n      pCtx.fillStyle = filler.toLive(pCtx);\n      this._applyPatternGradientTransform(pCtx, filler);\n      pCtx.fill();\n      return pCtx.createPattern(pCanvas, 'no-repeat');\n    },\n\n    handleFiller: function(ctx, property, filler) {\n      var offsetX, offsetY;\n      if (filler.toLive) {\n        if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) {\n          // need to transform gradient in a pattern.\n          // this is a slow process. If you are hitting this codepath, and the object\n          // is not using caching, you should consider switching it on.\n          // we need a canvas as big as the current object caching canvas.\n          offsetX = -this.width / 2;\n          offsetY = -this.height / 2;\n          ctx.translate(offsetX, offsetY);\n          ctx[property] = this._applyPatternGradientTransformText(filler);\n          return { offsetX: offsetX, offsetY: offsetY };\n        }\n        else {\n          // is a simple gradient or pattern\n          ctx[property] = filler.toLive(ctx, this);\n          return this._applyPatternGradientTransform(ctx, filler);\n        }\n      }\n      else {\n        // is a color\n        ctx[property] = filler;\n      }\n      return { offsetX: 0, offsetY: 0 };\n    },\n\n    _setStrokeStyles: function(ctx, decl) {\n      ctx.lineWidth = decl.strokeWidth;\n      ctx.lineCap = this.strokeLineCap;\n      ctx.lineDashOffset = this.strokeDashOffset;\n      ctx.lineJoin = this.strokeLineJoin;\n      ctx.miterLimit = this.strokeMiterLimit;\n      return this.handleFiller(ctx, 'strokeStyle', decl.stroke);\n    },\n\n    _setFillStyles: function(ctx, decl) {\n      return this.handleFiller(ctx, 'fillStyle', decl.fill);\n    },\n\n    /**\n     * @private\n     * @param {String} method\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {String} _char\n     * @param {Number} left Left coordinate\n     * @param {Number} top Top coordinate\n     * @param {Number} lineHeight Height of the line\n     */\n    _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n      var decl = this._getStyleDeclaration(lineIndex, charIndex),\n          fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n          shouldFill = method === 'fillText' && fullDecl.fill,\n          shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth,\n          fillOffsets, strokeOffsets;\n\n      if (!shouldStroke && !shouldFill) {\n        return;\n      }\n      ctx.save();\n\n      shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl));\n      shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl));\n\n      ctx.font = this._getFontDeclaration(fullDecl);\n\n\n      if (decl && decl.textBackgroundColor) {\n        this._removeShadow(ctx);\n      }\n      if (decl && decl.deltaY) {\n        top += decl.deltaY;\n      }\n      shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY);\n      shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY);\n      ctx.restore();\n    },\n\n    /**\n     * Turns the character into a 'superior figure' (i.e. 'superscript')\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    setSuperscript: function(start, end) {\n      return this._setScript(start, end, this.superscript);\n    },\n\n    /**\n     * Turns the character into an 'inferior figure' (i.e. 'subscript')\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    setSubscript: function(start, end) {\n      return this._setScript(start, end, this.subscript);\n    },\n\n    /**\n     * Applies 'schema' at given position\n     * @private\n     * @param {Number} start selection start\n     * @param {Number} end selection end\n     * @param {Number} schema\n     * @returns {fabric.Text} thisArg\n     * @chainable\n     */\n    _setScript: function(start, end, schema) {\n      var loc = this.get2DCursorLocation(start, true),\n          fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n          dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n          style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n      this.setSelectionStyles(style, start, end);\n      return this;\n    },\n\n    /**\n     * @private\n     * @param {Number} lineIndex index text line\n     * @return {Number} Line left offset\n     */\n    _getLineLeftOffset: function(lineIndex) {\n      var lineWidth = this.getLineWidth(lineIndex),\n          lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction,\n          isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n      if (textAlign === 'justify'\n        || (textAlign === 'justify-center' && !isEndOfWrapping)\n        || (textAlign === 'justify-right' && !isEndOfWrapping)\n        || (textAlign === 'justify-left' && !isEndOfWrapping)\n      ) {\n        return 0;\n      }\n      if (textAlign === 'center') {\n        leftOffset = lineDiff / 2;\n      }\n      if (textAlign === 'right') {\n        leftOffset = lineDiff;\n      }\n      if (textAlign === 'justify-center') {\n        leftOffset = lineDiff / 2;\n      }\n      if (textAlign === 'justify-right') {\n        leftOffset = lineDiff;\n      }\n      if (direction === 'rtl') {\n        leftOffset -= lineDiff;\n      }\n      return leftOffset;\n    },\n\n    /**\n     * @private\n     */\n    _clearCache: function() {\n      this.__lineWidths = [];\n      this.__lineHeights = [];\n      this.__charBounds = [];\n    },\n\n    /**\n     * @private\n     */\n    _shouldClearDimensionCache: function() {\n      var shouldClear = this._forceClearCache;\n      shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n      if (shouldClear) {\n        this.dirty = true;\n        this._forceClearCache = false;\n      }\n      return shouldClear;\n    },\n\n    /**\n     * Measure a single line given its index. Used to calculate the initial\n     * text bounding box. The values are calculated and stored in __lineWidths cache.\n     * @private\n     * @param {Number} lineIndex line number\n     * @return {Number} Line width\n     */\n    getLineWidth: function(lineIndex) {\n      if (this.__lineWidths[lineIndex] !== undefined) {\n        return this.__lineWidths[lineIndex];\n      }\n\n      var lineInfo = this.measureLine(lineIndex);\n      var width = lineInfo.width;\n      this.__lineWidths[lineIndex] = width;\n      return width;\n    },\n\n    _getWidthOfCharSpacing: function() {\n      if (this.charSpacing !== 0) {\n        return this.fontSize * this.charSpacing / 1000;\n      }\n      return 0;\n    },\n\n    /**\n     * Retrieves the value of property at given character position\n     * @param {Number} lineIndex the line number\n     * @param {Number} charIndex the character number\n     * @param {String} property the property name\n     * @returns the value of 'property'\n     */\n    getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n      var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n      if (charStyle && typeof charStyle[property] !== 'undefined') {\n        return charStyle[property];\n      }\n      return this[property];\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _renderTextDecoration: function(ctx, type) {\n      if (!this[type] && !this.styleHas(type)) {\n        return;\n      }\n      var heightOfLine, size, _size,\n          lineLeftOffset, dy, _dy,\n          line, lastDecoration,\n          leftOffset = this._getLeftOffset(),\n          topOffset = this._getTopOffset(), top,\n          boxStart, boxWidth, charBox, currentDecoration,\n          maxHeight, currentFill, lastFill, path = this.path,\n          charSpacing = this._getWidthOfCharSpacing(),\n          offsetY = this.offsets[type];\n\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        heightOfLine = this.getHeightOfLine(i);\n        if (!this[type] && !this.styleHas(type, i)) {\n          topOffset += heightOfLine;\n          continue;\n        }\n        line = this._textLines[i];\n        maxHeight = heightOfLine / this.lineHeight;\n        lineLeftOffset = this._getLineLeftOffset(i);\n        boxStart = 0;\n        boxWidth = 0;\n        lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n        lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n        top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n        size = this.getHeightOfChar(i, 0);\n        dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n        for (var j = 0, jlen = line.length; j < jlen; j++) {\n          charBox = this.__charBounds[i][j];\n          currentDecoration = this.getValueOfPropertyAt(i, j, type);\n          currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n          _size = this.getHeightOfChar(i, j);\n          _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n          if (path && currentDecoration && currentFill) {\n            ctx.save();\n            ctx.fillStyle = lastFill;\n            ctx.translate(charBox.renderLeft, charBox.renderTop);\n            ctx.rotate(charBox.angle);\n            ctx.fillRect(\n              -charBox.kernedWidth / 2,\n              offsetY * _size + _dy,\n              charBox.kernedWidth,\n              this.fontSize / 15\n            );\n            ctx.restore();\n          }\n          else if (\n            (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy)\n            && boxWidth > 0\n          ) {\n            var drawStart = leftOffset + lineLeftOffset + boxStart;\n            if (this.direction === 'rtl') {\n              drawStart = this.width - drawStart - boxWidth;\n            }\n            if (lastDecoration && lastFill) {\n              ctx.fillStyle = lastFill;\n              ctx.fillRect(\n                drawStart,\n                top + offsetY * size + dy,\n                boxWidth,\n                this.fontSize / 15\n              );\n            }\n            boxStart = charBox.left;\n            boxWidth = charBox.width;\n            lastDecoration = currentDecoration;\n            lastFill = currentFill;\n            size = _size;\n            dy = _dy;\n          }\n          else {\n            boxWidth += charBox.kernedWidth;\n          }\n        }\n        var drawStart = leftOffset + lineLeftOffset + boxStart;\n        if (this.direction === 'rtl') {\n          drawStart = this.width - drawStart - boxWidth;\n        }\n        ctx.fillStyle = currentFill;\n        currentDecoration && currentFill && ctx.fillRect(\n          drawStart,\n          top + offsetY * size + dy,\n          boxWidth - charSpacing,\n          this.fontSize / 15\n        );\n        topOffset += heightOfLine;\n      }\n      // if there is text background color no\n      // other shadows should be casted\n      this._removeShadow(ctx);\n    },\n\n    /**\n     * return font declaration string for canvas context\n     * @param {Object} [styleObject] object\n     * @returns {String} font declaration formatted for canvas context.\n     */\n    _getFontDeclaration: function(styleObject, forMeasuring) {\n      var style = styleObject || this, family = this.fontFamily,\n          fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n      var fontFamily = family === undefined ||\n      family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n      family.indexOf('\"') > -1 || fontIsGeneric\n        ? style.fontFamily : '\"' + style.fontFamily + '\"';\n      return [\n        // node-canvas needs \"weight style\", while browsers need \"style weight\"\n        // verify if this can be fixed in JSDOM\n        (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n        (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n        forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n        fontFamily\n      ].join(' ');\n    },\n\n    /**\n     * Renders text instance on a specified context\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      // do not render if object is not visible\n      if (!this.visible) {\n        return;\n      }\n      if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n        return;\n      }\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n      }\n      this.callSuper('render', ctx);\n    },\n\n    /**\n     * Returns the text as an array of lines.\n     * @param {String} text text to split\n     * @returns {Array} Lines in the text\n     */\n    _splitTextIntoLines: function(text) {\n      var lines = text.split(this._reNewline),\n          newLines = new Array(lines.length),\n          newLine = ['\\n'],\n          newText = [];\n      for (var i = 0; i < lines.length; i++) {\n        newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n        newText = newText.concat(newLines[i], newLine);\n      }\n      newText.pop();\n      return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} Object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      var allProperties = additionalProps.concat(propertiesToInclude);\n      var obj = this.callSuper('toObject', allProperties);\n      obj.styles = fabric.util.stylesToArray(this.styles, this.text);\n      if (obj.path) {\n        obj.path = this.path.toObject();\n      }\n      return obj;\n    },\n\n    /**\n     * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n     * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n     * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n     * @return {fabric.Object} thisArg\n     * @chainable\n     */\n    set: function(key, value) {\n      this.callSuper('set', key, value);\n      var needsDims = false;\n      var isAddingPath = false;\n      if (typeof key === 'object') {\n        for (var _key in key) {\n          if (_key === 'path') {\n            this.setPathInfo();\n          }\n          needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n          isAddingPath = isAddingPath || _key === 'path';\n        }\n      }\n      else {\n        needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n        isAddingPath = key === 'path';\n      }\n      if (isAddingPath) {\n        this.setPathInfo();\n      }\n      if (needsDims) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      return this;\n    },\n\n    /**\n     * Returns complexity of an instance\n     * @return {Number} complexity\n     */\n    complexity: function() {\n      return 1;\n    }\n  });\n\n  /* _FROM_SVG_START_ */\n  /**\n   * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n   * @static\n   * @memberOf fabric.Text\n   * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n   */\n  fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n    'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n  /**\n   * Default SVG font size\n   * @static\n   * @memberOf fabric.Text\n   */\n  fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n  /**\n   * Returns fabric.Text instance from an SVG element (<b>not yet implemented</b>)\n   * @static\n   * @memberOf fabric.Text\n   * @param {SVGElement} element Element to parse\n   * @param {Function} callback callback function invoked after parsing\n   * @param {Object} [options] Options object\n   */\n  fabric.Text.fromElement = function(element, callback, options) {\n    if (!element) {\n      return callback(null);\n    }\n\n    var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n        parsedAnchor = parsedAttributes.textAnchor || 'left';\n    options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n    options.top = options.top || 0;\n    options.left = options.left || 0;\n    if (parsedAttributes.textDecoration) {\n      var textDecoration = parsedAttributes.textDecoration;\n      if (textDecoration.indexOf('underline') !== -1) {\n        options.underline = true;\n      }\n      if (textDecoration.indexOf('overline') !== -1) {\n        options.overline = true;\n      }\n      if (textDecoration.indexOf('line-through') !== -1) {\n        options.linethrough = true;\n      }\n      delete options.textDecoration;\n    }\n    if ('dx' in parsedAttributes) {\n      options.left += parsedAttributes.dx;\n    }\n    if ('dy' in parsedAttributes) {\n      options.top += parsedAttributes.dy;\n    }\n    if (!('fontSize' in options)) {\n      options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n    }\n\n    var textContent = '';\n\n    // The XML is not properly parsed in IE9 so a workaround to get\n    // textContent is through firstChild.data. Another workaround would be\n    // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n    if (!('textContent' in element)) {\n      if ('firstChild' in element && element.firstChild !== null) {\n        if ('data' in element.firstChild && element.firstChild.data !== null) {\n          textContent = element.firstChild.data;\n        }\n      }\n    }\n    else {\n      textContent = element.textContent;\n    }\n\n    textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n    var originalStrokeWidth = options.strokeWidth;\n    options.strokeWidth = 0;\n\n    var text = new fabric.Text(textContent, options),\n        textHeightScaleFactor = text.getScaledHeight() / text.height,\n        lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n        scaledDiff = lineHeightDiff * textHeightScaleFactor,\n        textHeight = text.getScaledHeight() + scaledDiff,\n        offX = 0;\n    /*\n      Adjust positioning:\n        x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n        fabric output by default at top, left.\n    */\n    if (parsedAnchor === 'center') {\n      offX = text.getScaledWidth() / 2;\n    }\n    if (parsedAnchor === 'right') {\n      offX = text.getScaledWidth();\n    }\n    text.set({\n      left: text.left - offX,\n      top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n      strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n    });\n    callback(text);\n  };\n  /* _FROM_SVG_END_ */\n\n  /**\n   * Returns fabric.Text instance from an object representation\n   * @static\n   * @memberOf fabric.Text\n   * @param {Object} object plain js Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n   */\n  fabric.Text.fromObject = function(object, callback) {\n    var objectCopy = clone(object), path = object.path;\n    delete objectCopy.path;\n    return fabric.Object._fromObject('Text', objectCopy, function(textInstance) {\n      textInstance.styles = fabric.util.stylesFromArray(object.styles, object.text);\n      if (path) {\n        fabric.Object._fromObject('Path', path, function(pathInstance) {\n          textInstance.set('path', pathInstance);\n          callback(textInstance);\n        }, 'path');\n      }\n      else {\n        callback(textInstance);\n      }\n    }, 'text');\n  };\n\n  fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n  fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n  fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n    /**\n     * Returns true if object has no styling or no styling in a line\n     * @param {Number} lineIndex , lineIndex is on wrapped lines.\n     * @return {Boolean}\n     */\n    isEmptyStyles: function(lineIndex) {\n      if (!this.styles) {\n        return true;\n      }\n      if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n        return true;\n      }\n      var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n      for (var p1 in obj) {\n        for (var p2 in obj[p1]) {\n          // eslint-disable-next-line no-unused-vars\n          for (var p3 in obj[p1][p2]) {\n            return false;\n          }\n        }\n      }\n      return true;\n    },\n\n    /**\n     * Returns true if object has a style property or has it ina specified line\n     * This function is used to detect if a text will use a particular property or not.\n     * @param {String} property to check for\n     * @param {Number} lineIndex to check the style on\n     * @return {Boolean}\n     */\n    styleHas: function(property, lineIndex) {\n      if (!this.styles || !property || property === '') {\n        return false;\n      }\n      if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n        return false;\n      }\n      var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n      // eslint-disable-next-line\n      for (var p1 in obj) {\n        // eslint-disable-next-line\n        for (var p2 in obj[p1]) {\n          if (typeof obj[p1][p2][property] !== 'undefined') {\n            return true;\n          }\n        }\n      }\n      return false;\n    },\n\n    /**\n     * Check if characters in a text have a value for a property\n     * whose value matches the textbox's value for that property.  If so,\n     * the character-level property is deleted.  If the character\n     * has no other properties, then it is also deleted.  Finally,\n     * if the line containing that character has no other characters\n     * then it also is deleted.\n     *\n     * @param {string} property The property to compare between characters and text.\n     */\n    cleanStyle: function(property) {\n      if (!this.styles || !property || property === '') {\n        return false;\n      }\n      var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n          allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n      // eslint-disable-next-line\n      for (var p1 in obj) {\n        letterCount = 0;\n        // eslint-disable-next-line\n        for (var p2 in obj[p1]) {\n          var styleObject = obj[p1][p2],\n              stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n          stylesCount++;\n\n          if (stylePropertyHasBeenSet) {\n            if (!stylePropertyValue) {\n              stylePropertyValue = styleObject[property];\n            }\n            else if (styleObject[property] !== stylePropertyValue) {\n              allStyleObjectPropertiesMatch = false;\n            }\n\n            if (styleObject[property] === this[property]) {\n              delete styleObject[property];\n            }\n          }\n          else {\n            allStyleObjectPropertiesMatch = false;\n          }\n\n          if (Object.keys(styleObject).length !== 0) {\n            letterCount++;\n          }\n          else {\n            delete obj[p1][p2];\n          }\n        }\n\n        if (letterCount === 0) {\n          delete obj[p1];\n        }\n      }\n      // if every grapheme has the same style set then\n      // delete those styles and set it on the parent\n      for (var i = 0; i < this._textLines.length; i++) {\n        graphemeCount += this._textLines[i].length;\n      }\n      if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n        this[property] = stylePropertyValue;\n        this.removeStyle(property);\n      }\n    },\n\n    /**\n     * Remove a style property or properties from all individual character styles\n     * in a text object.  Deletes the character style object if it contains no other style\n     * props.  Deletes a line style object if it contains no other character styles.\n     *\n     * @param {String} props The property to remove from character styles.\n     */\n    removeStyle: function(property) {\n      if (!this.styles || !property || property === '') {\n        return;\n      }\n      var obj = this.styles, line, lineNum, charNum;\n      for (lineNum in obj) {\n        line = obj[lineNum];\n        for (charNum in line) {\n          delete line[charNum][property];\n          if (Object.keys(line[charNum]).length === 0) {\n            delete line[charNum];\n          }\n        }\n        if (Object.keys(line).length === 0) {\n          delete obj[lineNum];\n        }\n      }\n    },\n\n    /**\n     * @private\n     */\n    _extendStyles: function(index, styles) {\n      var loc = this.get2DCursorLocation(index);\n\n      if (!this._getLineStyle(loc.lineIndex)) {\n        this._setLineStyle(loc.lineIndex);\n      }\n\n      if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n        this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n      }\n\n      fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n    },\n\n    /**\n     * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n     * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n     * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n     */\n    get2DCursorLocation: function(selectionStart, skipWrapping) {\n      if (typeof selectionStart === 'undefined') {\n        selectionStart = this.selectionStart;\n      }\n      var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n          len = lines.length;\n      for (var i = 0; i < len; i++) {\n        if (selectionStart <= lines[i].length) {\n          return {\n            lineIndex: i,\n            charIndex: selectionStart\n          };\n        }\n        selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n      }\n      return {\n        lineIndex: i - 1,\n        charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n      };\n    },\n\n    /**\n     * Gets style of a current selection/cursor (at the start position)\n     * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n     * @param {Number} [startIndex] Start index to get styles at\n     * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n     * @param {Boolean} [complete] get full style or not\n     * @return {Array} styles an array with one, zero or more Style objects\n     */\n    getSelectionStyles: function(startIndex, endIndex, complete) {\n      if (typeof startIndex === 'undefined') {\n        startIndex = this.selectionStart || 0;\n      }\n      if (typeof endIndex === 'undefined') {\n        endIndex = this.selectionEnd || startIndex;\n      }\n      var styles = [];\n      for (var i = startIndex; i < endIndex; i++) {\n        styles.push(this.getStyleAtPosition(i, complete));\n      }\n      return styles;\n    },\n\n    /**\n     * Gets style of a current selection/cursor position\n     * @param {Number} position  to get styles at\n     * @param {Boolean} [complete] full style if true\n     * @return {Object} style Style object at a specified index\n     * @private\n     */\n    getStyleAtPosition: function(position, complete) {\n      var loc = this.get2DCursorLocation(position),\n          style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n            this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n      return style || {};\n    },\n\n    /**\n     * Sets style of a current selection, if no selection exist, do not set anything.\n     * @param {Object} [styles] Styles object\n     * @param {Number} [startIndex] Start index to get styles at\n     * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    setSelectionStyles: function(styles, startIndex, endIndex) {\n      if (typeof startIndex === 'undefined') {\n        startIndex = this.selectionStart || 0;\n      }\n      if (typeof endIndex === 'undefined') {\n        endIndex = this.selectionEnd || startIndex;\n      }\n      for (var i = startIndex; i < endIndex; i++) {\n        this._extendStyles(i, styles);\n      }\n      /* not included in _extendStyles to avoid clearing cache more than once */\n      this._forceClearCache = true;\n      return this;\n    },\n\n    /**\n     * get the reference, not a clone, of the style object for a given character\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @return {Object} style object\n     */\n    _getStyleDeclaration: function(lineIndex, charIndex) {\n      var lineStyle = this.styles && this.styles[lineIndex];\n      if (!lineStyle) {\n        return null;\n      }\n      return lineStyle[charIndex];\n    },\n\n    /**\n     * return a new object that contains all the style property for a character\n     * the object returned is newly created\n     * @param {Number} lineIndex of the line where the character is\n     * @param {Number} charIndex position of the character on the line\n     * @return {Object} style object\n     */\n    getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n      var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n          styleObject = { }, prop;\n      for (var i = 0; i < this._styleProperties.length; i++) {\n        prop = this._styleProperties[i];\n        styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n      }\n      return styleObject;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {Object} style\n     * @private\n     */\n    _setStyleDeclaration: function(lineIndex, charIndex, style) {\n      this.styles[lineIndex][charIndex] = style;\n    },\n\n    /**\n     *\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _deleteStyleDeclaration: function(lineIndex, charIndex) {\n      delete this.styles[lineIndex][charIndex];\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @return {Boolean} if the line exists or not\n     * @private\n     */\n    _getLineStyle: function(lineIndex) {\n      return !!this.styles[lineIndex];\n    },\n\n    /**\n     * Set the line style to an empty object so that is initialized\n     * @param {Number} lineIndex\n     * @private\n     */\n    _setLineStyle: function(lineIndex) {\n      this.styles[lineIndex] = {};\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @private\n     */\n    _deleteLineStyle: function(lineIndex) {\n      delete this.styles[lineIndex];\n    }\n  });\n})();\n\n\n(function() {\n\n  function parseDecoration(object) {\n    if (object.textDecoration) {\n      object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n      object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n      object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n      delete object.textDecoration;\n    }\n  }\n\n  /**\n   * IText class (introduced in <b>v1.4</b>) Events are also fired with \"text:\"\n   * prefix when observing canvas.\n   * @class fabric.IText\n   * @extends fabric.Text\n   * @mixes fabric.Observable\n   *\n   * @fires changed\n   * @fires selection:changed\n   * @fires editing:entered\n   * @fires editing:exited\n   *\n   * @return {fabric.IText} thisArg\n   * @see {@link fabric.IText#initialize} for constructor definition\n   *\n   * <p>Supported key combinations:</p>\n   * <pre>\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * </pre>\n   *\n   * <p>Supported mouse/touch combination</p>\n   * <pre>\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * </pre>\n   */\n  fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'i-text',\n\n    /**\n     * Index where text selection starts (or where cursor is when there is no selection)\n     * @type Number\n     * @default\n     */\n    selectionStart: 0,\n\n    /**\n     * Index where text selection ends\n     * @type Number\n     * @default\n     */\n    selectionEnd: 0,\n\n    /**\n     * Color of text selection\n     * @type String\n     * @default\n     */\n    selectionColor: 'rgba(17,119,255,0.3)',\n\n    /**\n     * Indicates whether text is in editing mode\n     * @type Boolean\n     * @default\n     */\n    isEditing: false,\n\n    /**\n     * Indicates whether a text can be edited\n     * @type Boolean\n     * @default\n     */\n    editable: true,\n\n    /**\n     * Border color of text object while it's in editing mode\n     * @type String\n     * @default\n     */\n    editingBorderColor: 'rgba(102,153,255,0.25)',\n\n    /**\n     * Width of cursor (in px)\n     * @type Number\n     * @default\n     */\n    cursorWidth: 2,\n\n    /**\n     * Color of text cursor color in editing mode.\n     * if not set (default) will take color from the text.\n     * if set to a color value that fabric can understand, it will\n     * be used instead of the color of the text at the current position.\n     * @type String\n     * @default\n     */\n    cursorColor: '',\n\n    /**\n     * Delay between cursor blink (in ms)\n     * @type Number\n     * @default\n     */\n    cursorDelay: 1000,\n\n    /**\n     * Duration of cursor fadein (in ms)\n     * @type Number\n     * @default\n     */\n    cursorDuration: 600,\n\n    /**\n     * Indicates whether internal text char widths can be cached\n     * @type Boolean\n     * @default\n     */\n    caching: true,\n\n    /**\n     * DOM container to append the hiddenTextarea.\n     * An alternative to attaching to the document.body.\n     * Useful to reduce laggish redraw of the full document.body tree and\n     * also with modals event capturing that won't let the textarea take focus.\n     * @type HTMLElement\n     * @default\n     */\n    hiddenTextareaContainer: null,\n\n    /**\n     * @private\n     */\n    _reSpace: /\\s|\\n/,\n\n    /**\n     * @private\n     */\n    _currentCursorOpacity: 0,\n\n    /**\n     * @private\n     */\n    _selectionDirection: null,\n\n    /**\n     * @private\n     */\n    _abortCursorAnimation: false,\n\n    /**\n     * @private\n     */\n    __widthOfSpace: [],\n\n    /**\n     * Helps determining when the text is in composition, so that the cursor\n     * rendering is altered.\n     */\n    inCompositionMode: false,\n\n    /**\n     * Constructor\n     * @param {String} text Text string\n     * @param {Object} [options] Options object\n     * @return {fabric.IText} thisArg\n     */\n    initialize: function(text, options) {\n      this.callSuper('initialize', text, options);\n      this.initBehavior();\n    },\n\n    /**\n     * Sets selection start (left boundary of a selection)\n     * @param {Number} index Index to set selection start to\n     */\n    setSelectionStart: function(index) {\n      index = Math.max(index, 0);\n      this._updateAndFire('selectionStart', index);\n    },\n\n    /**\n     * Sets selection end (right boundary of a selection)\n     * @param {Number} index Index to set selection end to\n     */\n    setSelectionEnd: function(index) {\n      index = Math.min(index, this.text.length);\n      this._updateAndFire('selectionEnd', index);\n    },\n\n    /**\n     * @private\n     * @param {String} property 'selectionStart' or 'selectionEnd'\n     * @param {Number} index new position of property\n     */\n    _updateAndFire: function(property, index) {\n      if (this[property] !== index) {\n        this._fireSelectionChanged();\n        this[property] = index;\n      }\n      this._updateTextarea();\n    },\n\n    /**\n     * Fires the even of selection changed\n     * @private\n     */\n    _fireSelectionChanged: function() {\n      this.fire('selection:changed');\n      this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n    },\n\n    /**\n     * Initialize text dimensions. Render all text on given context\n     * or on a offscreen canvas to get the text width with measureText.\n     * Updates this.width and this.height with the proper values.\n     * Does not return dimensions.\n     * @private\n     */\n    initDimensions: function() {\n      this.isEditing && this.initDelayedCursor();\n      this.clearContextTop();\n      this.callSuper('initDimensions');\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    render: function(ctx) {\n      this.clearContextTop();\n      this.callSuper('render', ctx);\n      // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n      // the correct position but not at every cursor animation.\n      this.cursorOffsetCache = { };\n      this.renderCursorOrSelection();\n    },\n\n    /**\n     * @private\n     * @param {CanvasRenderingContext2D} ctx Context to render on\n     */\n    _render: function(ctx) {\n      this.callSuper('_render', ctx);\n    },\n\n    /**\n     * Prepare and clean the contextTop\n     */\n    clearContextTop: function(skipRestore) {\n      if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n        return;\n      }\n      var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n      ctx.save();\n      ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n      this.transform(ctx);\n      this._clearTextArea(ctx);\n      skipRestore || ctx.restore();\n    },\n    /**\n     * Renders cursor or selection (depending on what exists)\n     * it does on the contextTop. If contextTop is not available, do nothing.\n     */\n    renderCursorOrSelection: function() {\n      if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n        return;\n      }\n      var boundaries = this._getCursorBoundaries(),\n          ctx = this.canvas.contextTop;\n      this.clearContextTop(true);\n      if (this.selectionStart === this.selectionEnd) {\n        this.renderCursor(boundaries, ctx);\n      }\n      else {\n        this.renderSelection(boundaries, ctx);\n      }\n      ctx.restore();\n    },\n\n    _clearTextArea: function(ctx) {\n      // we add 4 pixel, to be sure to do not leave any pixel out\n      var width = this.width + 4, height = this.height + 4;\n      ctx.clearRect(-width / 2, -height / 2, width, height);\n    },\n\n    /**\n     * Returns cursor boundaries (left, top, leftOffset, topOffset)\n     * @private\n     * @param {Array} chars Array of characters\n     * @param {String} typeOfBoundaries\n     */\n    _getCursorBoundaries: function(position) {\n\n      // left/top are left/top of entire text box\n      // leftOffset/topOffset are offset from that left/top point of a text box\n\n      if (typeof position === 'undefined') {\n        position = this.selectionStart;\n      }\n\n      var left = this._getLeftOffset(),\n          top = this._getTopOffset(),\n          offsets = this._getCursorBoundariesOffsets(position);\n      return {\n        left: left,\n        top: top,\n        leftOffset: offsets.left,\n        topOffset: offsets.top\n      };\n    },\n\n    /**\n     * @private\n     */\n    _getCursorBoundariesOffsets: function(position) {\n      if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n        return this.cursorOffsetCache;\n      }\n      var lineLeftOffset,\n          lineIndex,\n          charIndex,\n          topOffset = 0,\n          leftOffset = 0,\n          boundaries,\n          cursorPosition = this.get2DCursorLocation(position);\n      charIndex = cursorPosition.charIndex;\n      lineIndex = cursorPosition.lineIndex;\n      for (var i = 0; i < lineIndex; i++) {\n        topOffset += this.getHeightOfLine(i);\n      }\n      lineLeftOffset = this._getLineLeftOffset(lineIndex);\n      var bound = this.__charBounds[lineIndex][charIndex];\n      bound && (leftOffset = bound.left);\n      if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n        leftOffset -= this._getWidthOfCharSpacing();\n      }\n      boundaries = {\n        top: topOffset,\n        left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n      };\n      if (this.direction === 'rtl') {\n        boundaries.left *= -1;\n      }\n      this.cursorOffsetCache = boundaries;\n      return this.cursorOffsetCache;\n    },\n\n    /**\n     * Renders cursor\n     * @param {Object} boundaries\n     * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n     */\n    renderCursor: function(boundaries, ctx) {\n      var cursorLocation = this.get2DCursorLocation(),\n          lineIndex = cursorLocation.lineIndex,\n          charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n          charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n          multiplier = this.scaleX * this.canvas.getZoom(),\n          cursorWidth = this.cursorWidth / multiplier,\n          topOffset = boundaries.topOffset,\n          dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n      topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n        - charHeight * (1 - this._fontSizeFraction);\n\n      if (this.inCompositionMode) {\n        this.renderSelection(boundaries, ctx);\n      }\n      ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n      ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n      ctx.fillRect(\n        boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n        topOffset + boundaries.top + dy,\n        cursorWidth,\n        charHeight);\n    },\n\n    /**\n     * Renders text selection\n     * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n     * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n     */\n    renderSelection: function(boundaries, ctx) {\n\n      var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n          selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          start = this.get2DCursorLocation(selectionStart),\n          end = this.get2DCursorLocation(selectionEnd),\n          startLine = start.lineIndex,\n          endLine = end.lineIndex,\n          startChar = start.charIndex < 0 ? 0 : start.charIndex,\n          endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n      for (var i = startLine; i <= endLine; i++) {\n        var lineOffset = this._getLineLeftOffset(i) || 0,\n            lineHeight = this.getHeightOfLine(i),\n            realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n        if (i === startLine) {\n          boxStart = this.__charBounds[startLine][startChar].left;\n        }\n        if (i >= startLine && i < endLine) {\n          boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n        }\n        else if (i === endLine) {\n          if (endChar === 0) {\n            boxEnd = this.__charBounds[endLine][endChar].left;\n          }\n          else {\n            var charSpacing = this._getWidthOfCharSpacing();\n            boxEnd = this.__charBounds[endLine][endChar - 1].left\n              + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n          }\n        }\n        realLineHeight = lineHeight;\n        if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n          lineHeight /= this.lineHeight;\n        }\n        var drawStart = boundaries.left + lineOffset + boxStart,\n            drawWidth = boxEnd - boxStart,\n            drawHeight = lineHeight, extraTop = 0;\n        if (this.inCompositionMode) {\n          ctx.fillStyle = this.compositionColor || 'black';\n          drawHeight = 1;\n          extraTop = lineHeight;\n        }\n        else {\n          ctx.fillStyle = this.selectionColor;\n        }\n        if (this.direction === 'rtl') {\n          drawStart = this.width - drawStart - drawWidth;\n        }\n        ctx.fillRect(\n          drawStart,\n          boundaries.top + boundaries.topOffset + extraTop,\n          drawWidth,\n          drawHeight);\n        boundaries.topOffset += realLineHeight;\n      }\n    },\n\n    /**\n     * High level function to know the height of the cursor.\n     * the currentChar is the one that precedes the cursor\n     * Returns fontSize of char at the current cursor\n     * Unused from the library, is for the end user\n     * @return {Number} Character font size\n     */\n    getCurrentCharFontSize: function() {\n      var cp = this._getCurrentCharIndex();\n      return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n    },\n\n    /**\n     * High level function to know the color of the cursor.\n     * the currentChar is the one that precedes the cursor\n     * Returns color (fill) of char at the current cursor\n     * if the text object has a pattern or gradient for filler, it will return that.\n     * Unused by the library, is for the end user\n     * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill)\n     */\n    getCurrentCharColor: function() {\n      var cp = this._getCurrentCharIndex();\n      return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n    },\n\n    /**\n     * Returns the cursor position for the getCurrent.. functions\n     * @private\n     */\n    _getCurrentCharIndex: function() {\n      var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n          charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n      return { l: cursorPosition.lineIndex, c: charIndex };\n    }\n  });\n\n  /**\n   * Returns fabric.IText instance from an object representation\n   * @static\n   * @memberOf fabric.IText\n   * @param {Object} object Object to create an instance from\n   * @param {function} [callback] invoked with new instance as argument\n   */\n  fabric.IText.fromObject = function(object, callback) {\n    var styles = fabric.util.stylesFromArray(object.styles, object.text);\n    //copy object to prevent mutation\n    var objCopy = Object.assign({}, object, { styles: styles });\n    parseDecoration(objCopy);\n    if (objCopy.styles) {\n      for (var i in objCopy.styles) {\n        for (var j in objCopy.styles[i]) {\n          parseDecoration(objCopy.styles[i][j]);\n        }\n      }\n    }\n    fabric.Object._fromObject('IText', objCopy, callback, 'text');\n  };\n})();\n\n\n(function() {\n\n  var clone = fabric.util.object.clone;\n\n  fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n    /**\n     * Initializes all the interactive behavior of IText\n     */\n    initBehavior: function() {\n      this.initAddedHandler();\n      this.initRemovedHandler();\n      this.initCursorSelectionHandlers();\n      this.initDoubleClickSimulation();\n      this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n    },\n\n    onDeselect: function() {\n      this.isEditing && this.exitEditing();\n      this.selected = false;\n    },\n\n    /**\n     * Initializes \"added\" event handler\n     */\n    initAddedHandler: function() {\n      var _this = this;\n      this.on('added', function() {\n        var canvas = _this.canvas;\n        if (canvas) {\n          if (!canvas._hasITextHandlers) {\n            canvas._hasITextHandlers = true;\n            _this._initCanvasHandlers(canvas);\n          }\n          canvas._iTextInstances = canvas._iTextInstances || [];\n          canvas._iTextInstances.push(_this);\n        }\n      });\n    },\n\n    initRemovedHandler: function() {\n      var _this = this;\n      this.on('removed', function() {\n        var canvas = _this.canvas;\n        if (canvas) {\n          canvas._iTextInstances = canvas._iTextInstances || [];\n          fabric.util.removeFromArray(canvas._iTextInstances, _this);\n          if (canvas._iTextInstances.length === 0) {\n            canvas._hasITextHandlers = false;\n            _this._removeCanvasHandlers(canvas);\n          }\n        }\n      });\n    },\n\n    /**\n     * register canvas event to manage exiting on other instances\n     * @private\n     */\n    _initCanvasHandlers: function(canvas) {\n      canvas._mouseUpITextHandler = function() {\n        if (canvas._iTextInstances) {\n          canvas._iTextInstances.forEach(function(obj) {\n            obj.__isMousedown = false;\n          });\n        }\n      };\n      canvas.on('mouse:up', canvas._mouseUpITextHandler);\n    },\n\n    /**\n     * remove canvas event to manage exiting on other instances\n     * @private\n     */\n    _removeCanvasHandlers: function(canvas) {\n      canvas.off('mouse:up', canvas._mouseUpITextHandler);\n    },\n\n    /**\n     * @private\n     */\n    _tick: function() {\n      this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n    },\n\n    /**\n     * @private\n     */\n    _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n      var tickState;\n\n      tickState = {\n        isAborted: false,\n        abort: function() {\n          this.isAborted = true;\n        },\n      };\n\n      obj.animate('_currentCursorOpacity', targetOpacity, {\n        duration: duration,\n        onComplete: function() {\n          if (!tickState.isAborted) {\n            obj[completeMethod]();\n          }\n        },\n        onChange: function() {\n          // we do not want to animate a selection, only cursor\n          if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n            obj.renderCursorOrSelection();\n          }\n        },\n        abort: function() {\n          return tickState.isAborted;\n        }\n      });\n      return tickState;\n    },\n\n    /**\n     * @private\n     */\n    _onTickComplete: function() {\n\n      var _this = this;\n\n      if (this._cursorTimeout1) {\n        clearTimeout(this._cursorTimeout1);\n      }\n      this._cursorTimeout1 = setTimeout(function() {\n        _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n      }, 100);\n    },\n\n    /**\n     * Initializes delayed cursor\n     */\n    initDelayedCursor: function(restart) {\n      var _this = this,\n          delay = restart ? 0 : this.cursorDelay;\n\n      this.abortCursorAnimation();\n      this._currentCursorOpacity = 1;\n      this._cursorTimeout2 = setTimeout(function() {\n        _this._tick();\n      }, delay);\n    },\n\n    /**\n     * Aborts cursor animation and clears all timeouts\n     */\n    abortCursorAnimation: function() {\n      var shouldClear = this._currentTickState || this._currentTickCompleteState,\n          canvas = this.canvas;\n      this._currentTickState && this._currentTickState.abort();\n      this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n      clearTimeout(this._cursorTimeout1);\n      clearTimeout(this._cursorTimeout2);\n\n      this._currentCursorOpacity = 0;\n      // to clear just itext area we need to transform the context\n      // it may not be worth it\n      if (shouldClear && canvas) {\n        canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n      }\n\n    },\n\n    /**\n     * Selects entire text\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    selectAll: function() {\n      this.selectionStart = 0;\n      this.selectionEnd = this._text.length;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      return this;\n    },\n\n    /**\n     * Returns selected text\n     * @return {String}\n     */\n    getSelectedText: function() {\n      return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n    },\n\n    /**\n     * Find new selection index representing start of current word according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findWordBoundaryLeft: function(startFrom) {\n      var offset = 0, index = startFrom - 1;\n\n      // remove space before cursor first\n      if (this._reSpace.test(this._text[index])) {\n        while (this._reSpace.test(this._text[index])) {\n          offset++;\n          index--;\n        }\n      }\n      while (/\\S/.test(this._text[index]) && index > -1) {\n        offset++;\n        index--;\n      }\n\n      return startFrom - offset;\n    },\n\n    /**\n     * Find new selection index representing end of current word according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findWordBoundaryRight: function(startFrom) {\n      var offset = 0, index = startFrom;\n\n      // remove space after cursor first\n      if (this._reSpace.test(this._text[index])) {\n        while (this._reSpace.test(this._text[index])) {\n          offset++;\n          index++;\n        }\n      }\n      while (/\\S/.test(this._text[index]) && index < this._text.length) {\n        offset++;\n        index++;\n      }\n\n      return startFrom + offset;\n    },\n\n    /**\n     * Find new selection index representing start of current line according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findLineBoundaryLeft: function(startFrom) {\n      var offset = 0, index = startFrom - 1;\n\n      while (!/\\n/.test(this._text[index]) && index > -1) {\n        offset++;\n        index--;\n      }\n\n      return startFrom - offset;\n    },\n\n    /**\n     * Find new selection index representing end of current line according to current selection index\n     * @param {Number} startFrom Current selection index\n     * @return {Number} New selection index\n     */\n    findLineBoundaryRight: function(startFrom) {\n      var offset = 0, index = startFrom;\n\n      while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n        offset++;\n        index++;\n      }\n\n      return startFrom + offset;\n    },\n\n    /**\n     * Finds index corresponding to beginning or end of a word\n     * @param {Number} selectionStart Index of a character\n     * @param {Number} direction 1 or -1\n     * @return {Number} Index of the beginning or end of a word\n     */\n    searchWordBoundary: function(selectionStart, direction) {\n      var text = this._text,\n          index     = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n          _char     = text[index],\n          // wrong\n          reNonWord = fabric.reNonWord;\n\n      while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n        index += direction;\n        _char = text[index];\n      }\n      if (reNonWord.test(_char)) {\n        index += direction === 1 ? 0 : 1;\n      }\n      return index;\n    },\n\n    /**\n     * Selects a word based on the index\n     * @param {Number} selectionStart Index of a character\n     */\n    selectWord: function(selectionStart) {\n      selectionStart = selectionStart || this.selectionStart;\n      var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n          newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n      this.selectionStart = newSelectionStart;\n      this.selectionEnd = newSelectionEnd;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      this.renderCursorOrSelection();\n    },\n\n    /**\n     * Selects a line based on the index\n     * @param {Number} selectionStart Index of a character\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    selectLine: function(selectionStart) {\n      selectionStart = selectionStart || this.selectionStart;\n      var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n          newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n      this.selectionStart = newSelectionStart;\n      this.selectionEnd = newSelectionEnd;\n      this._fireSelectionChanged();\n      this._updateTextarea();\n      return this;\n    },\n\n    /**\n     * Enters editing state\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    enterEditing: function(e) {\n      if (this.isEditing || !this.editable) {\n        return;\n      }\n\n      if (this.canvas) {\n        this.canvas.calcOffset();\n        this.exitEditingOnOthers(this.canvas);\n      }\n\n      this.isEditing = true;\n\n      this.initHiddenTextarea(e);\n      this.hiddenTextarea.focus();\n      this.hiddenTextarea.value = this.text;\n      this._updateTextarea();\n      this._saveEditingProps();\n      this._setEditingProps();\n      this._textBeforeEdit = this.text;\n\n      this._tick();\n      this.fire('editing:entered');\n      this._fireSelectionChanged();\n      if (!this.canvas) {\n        return this;\n      }\n      this.canvas.fire('text:editing:entered', { target: this });\n      this.initMouseMoveHandler();\n      this.canvas.requestRenderAll();\n      return this;\n    },\n\n    exitEditingOnOthers: function(canvas) {\n      if (canvas._iTextInstances) {\n        canvas._iTextInstances.forEach(function(obj) {\n          obj.selected = false;\n          if (obj.isEditing) {\n            obj.exitEditing();\n          }\n        });\n      }\n    },\n\n    /**\n     * Initializes \"mousemove\" event handler\n     */\n    initMouseMoveHandler: function() {\n      this.canvas.on('mouse:move', this.mouseMoveHandler);\n    },\n\n    /**\n     * @private\n     */\n    mouseMoveHandler: function(options) {\n      if (!this.__isMousedown || !this.isEditing) {\n        return;\n      }\n\n      // regain focus\n      document.activeElement !== this.hiddenTextarea && this.hiddenTextarea.focus();\n\n      var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n          currentStart = this.selectionStart,\n          currentEnd = this.selectionEnd;\n      if (\n        (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n        &&\n        (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n      ) {\n        return;\n      }\n      if (newSelectionStart > this.__selectionStartOnMouseDown) {\n        this.selectionStart = this.__selectionStartOnMouseDown;\n        this.selectionEnd = newSelectionStart;\n      }\n      else {\n        this.selectionStart = newSelectionStart;\n        this.selectionEnd = this.__selectionStartOnMouseDown;\n      }\n      if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n        this.restartCursorIfNeeded();\n        this._fireSelectionChanged();\n        this._updateTextarea();\n        this.renderCursorOrSelection();\n      }\n    },\n\n    /**\n     * @private\n     */\n    _setEditingProps: function() {\n      this.hoverCursor = 'text';\n\n      if (this.canvas) {\n        this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n      }\n\n      this.borderColor = this.editingBorderColor;\n      this.hasControls = this.selectable = false;\n      this.lockMovementX = this.lockMovementY = true;\n    },\n\n    /**\n     * convert from textarea to grapheme indexes\n     */\n    fromStringToGraphemeSelection: function(start, end, text) {\n      var smallerTextStart = text.slice(0, start),\n          graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n      if (start === end) {\n        return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n      }\n      var smallerTextEnd = text.slice(start, end),\n          graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n    },\n\n    /**\n     * convert from fabric to textarea values\n     */\n    fromGraphemeToStringSelection: function(start, end, _text) {\n      var smallerTextStart = _text.slice(0, start),\n          graphemeStart = smallerTextStart.join('').length;\n      if (start === end) {\n        return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n      }\n      var smallerTextEnd = _text.slice(start, end),\n          graphemeEnd = smallerTextEnd.join('').length;\n      return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n    },\n\n    /**\n     * @private\n     */\n    _updateTextarea: function() {\n      this.cursorOffsetCache = { };\n      if (!this.hiddenTextarea) {\n        return;\n      }\n      if (!this.inCompositionMode) {\n        var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n        this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n        this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n      }\n      this.updateTextareaPosition();\n    },\n\n    /**\n     * @private\n     */\n    updateFromTextArea: function() {\n      if (!this.hiddenTextarea) {\n        return;\n      }\n      this.cursorOffsetCache = { };\n      this.text = this.hiddenTextarea.value;\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      var newSelection = this.fromStringToGraphemeSelection(\n        this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n      this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n      if (!this.inCompositionMode) {\n        this.selectionStart = newSelection.selectionStart;\n      }\n      this.updateTextareaPosition();\n    },\n\n    /**\n     * @private\n     */\n    updateTextareaPosition: function() {\n      if (this.selectionStart === this.selectionEnd) {\n        var style = this._calcTextareaPosition();\n        this.hiddenTextarea.style.left = style.left;\n        this.hiddenTextarea.style.top = style.top;\n      }\n    },\n\n    /**\n     * @private\n     * @return {Object} style contains style for hiddenTextarea\n     */\n    _calcTextareaPosition: function() {\n      if (!this.canvas) {\n        return { x: 1, y: 1 };\n      }\n      var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n          boundaries = this._getCursorBoundaries(desiredPosition),\n          cursorLocation = this.get2DCursorLocation(desiredPosition),\n          lineIndex = cursorLocation.lineIndex,\n          charIndex = cursorLocation.charIndex,\n          charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n          leftOffset = boundaries.leftOffset,\n          m = this.calcTransformMatrix(),\n          p = {\n            x: boundaries.left + leftOffset,\n            y: boundaries.top + boundaries.topOffset + charHeight\n          },\n          retinaScaling = this.canvas.getRetinaScaling(),\n          upperCanvas = this.canvas.upperCanvasEl,\n          upperCanvasWidth = upperCanvas.width / retinaScaling,\n          upperCanvasHeight = upperCanvas.height / retinaScaling,\n          maxWidth = upperCanvasWidth - charHeight,\n          maxHeight = upperCanvasHeight - charHeight,\n          scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n          scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n      p = fabric.util.transformPoint(p, m);\n      p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n      p.x *= scaleX;\n      p.y *= scaleY;\n      if (p.x < 0) {\n        p.x = 0;\n      }\n      if (p.x > maxWidth) {\n        p.x = maxWidth;\n      }\n      if (p.y < 0) {\n        p.y = 0;\n      }\n      if (p.y > maxHeight) {\n        p.y = maxHeight;\n      }\n\n      // add canvas offset on document\n      p.x += this.canvas._offset.left;\n      p.y += this.canvas._offset.top;\n\n      return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n    },\n\n    /**\n     * @private\n     */\n    _saveEditingProps: function() {\n      this._savedProps = {\n        hasControls: this.hasControls,\n        borderColor: this.borderColor,\n        lockMovementX: this.lockMovementX,\n        lockMovementY: this.lockMovementY,\n        hoverCursor: this.hoverCursor,\n        selectable: this.selectable,\n        defaultCursor: this.canvas && this.canvas.defaultCursor,\n        moveCursor: this.canvas && this.canvas.moveCursor\n      };\n    },\n\n    /**\n     * @private\n     */\n    _restoreEditingProps: function() {\n      if (!this._savedProps) {\n        return;\n      }\n\n      this.hoverCursor = this._savedProps.hoverCursor;\n      this.hasControls = this._savedProps.hasControls;\n      this.borderColor = this._savedProps.borderColor;\n      this.selectable = this._savedProps.selectable;\n      this.lockMovementX = this._savedProps.lockMovementX;\n      this.lockMovementY = this._savedProps.lockMovementY;\n\n      if (this.canvas) {\n        this.canvas.defaultCursor = this._savedProps.defaultCursor;\n        this.canvas.moveCursor = this._savedProps.moveCursor;\n      }\n    },\n\n    /**\n     * Exits from editing state\n     * @return {fabric.IText} thisArg\n     * @chainable\n     */\n    exitEditing: function() {\n      var isTextChanged = (this._textBeforeEdit !== this.text);\n      var hiddenTextarea = this.hiddenTextarea;\n      this.selected = false;\n      this.isEditing = false;\n\n      this.selectionEnd = this.selectionStart;\n\n      if (hiddenTextarea) {\n        hiddenTextarea.blur && hiddenTextarea.blur();\n        hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n      }\n      this.hiddenTextarea = null;\n      this.abortCursorAnimation();\n      this._restoreEditingProps();\n      this._currentCursorOpacity = 0;\n      if (this._shouldClearDimensionCache()) {\n        this.initDimensions();\n        this.setCoords();\n      }\n      this.fire('editing:exited');\n      isTextChanged && this.fire('modified');\n      if (this.canvas) {\n        this.canvas.off('mouse:move', this.mouseMoveHandler);\n        this.canvas.fire('text:editing:exited', { target: this });\n        isTextChanged && this.canvas.fire('object:modified', { target: this });\n      }\n      return this;\n    },\n\n    /**\n     * @private\n     */\n    _removeExtraneousStyles: function() {\n      for (var prop in this.styles) {\n        if (!this._textLines[prop]) {\n          delete this.styles[prop];\n        }\n      }\n    },\n\n    /**\n     * remove and reflow a style block from start to end.\n     * @param {Number} start linear start position for removal (included in removal)\n     * @param {Number} end linear end position for removal ( excluded from removal )\n     */\n    removeStyleFromTo: function(start, end) {\n      var cursorStart = this.get2DCursorLocation(start, true),\n          cursorEnd = this.get2DCursorLocation(end, true),\n          lineStart = cursorStart.lineIndex,\n          charStart = cursorStart.charIndex,\n          lineEnd = cursorEnd.lineIndex,\n          charEnd = cursorEnd.charIndex,\n          i, styleObj;\n      if (lineStart !== lineEnd) {\n        // step1 remove the trailing of lineStart\n        if (this.styles[lineStart]) {\n          for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n            delete this.styles[lineStart][i];\n          }\n        }\n        // step2 move the trailing of lineEnd to lineStart if needed\n        if (this.styles[lineEnd]) {\n          for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n            styleObj = this.styles[lineEnd][i];\n            if (styleObj) {\n              this.styles[lineStart] || (this.styles[lineStart] = { });\n              this.styles[lineStart][charStart + i - charEnd] = styleObj;\n            }\n          }\n        }\n        // step3 detects lines will be completely removed.\n        for (i = lineStart + 1; i <= lineEnd; i++) {\n          delete this.styles[i];\n        }\n        // step4 shift remaining lines.\n        this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n      }\n      else {\n        // remove and shift left on the same line\n        if (this.styles[lineStart]) {\n          styleObj = this.styles[lineStart];\n          var diff = charEnd - charStart, numericChar, _char;\n          for (i = charStart; i < charEnd; i++) {\n            delete styleObj[i];\n          }\n          for (_char in this.styles[lineStart]) {\n            numericChar = parseInt(_char, 10);\n            if (numericChar >= charEnd) {\n              styleObj[numericChar - diff] = styleObj[_char];\n              delete styleObj[_char];\n            }\n          }\n        }\n      }\n    },\n\n    /**\n     * Shifts line styles up or down\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} offset Can any number?\n     */\n    shiftLineStyles: function(lineIndex, offset) {\n      // shift all line styles by offset upward or downward\n      // do not clone deep. we need new array, not new style objects\n      var clonedStyles = clone(this.styles);\n      for (var line in this.styles) {\n        var numericLine = parseInt(line, 10);\n        if (numericLine > lineIndex) {\n          this.styles[numericLine + offset] = clonedStyles[numericLine];\n          if (!clonedStyles[numericLine - offset]) {\n            delete this.styles[numericLine];\n          }\n        }\n      }\n    },\n\n    restartCursorIfNeeded: function() {\n      if (!this._currentTickState || this._currentTickState.isAborted\n        || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n      ) {\n        this.initDelayedCursor();\n      }\n    },\n\n    /**\n     * Handle insertion of more consecutive style lines for when one or more\n     * newlines gets added to the text. Since current style needs to be shifted\n     * first we shift the current style of the number lines needed, then we add\n     * new lines from the last to the first.\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} charIndex Index of a char\n     * @param {Number} qty number of lines to add\n     * @param {Array} copiedStyle Array of objects styles\n     */\n    insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n      var currentCharStyle,\n          newLineStyles = {},\n          somethingAdded = false,\n          isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n      qty || (qty = 1);\n      this.shiftLineStyles(lineIndex, qty);\n      if (this.styles[lineIndex]) {\n        currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n      }\n      // we clone styles of all chars\n      // after cursor onto the current line\n      for (var index in this.styles[lineIndex]) {\n        var numIndex = parseInt(index, 10);\n        if (numIndex >= charIndex) {\n          somethingAdded = true;\n          newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n          // remove lines from the previous line since they're on a new line now\n          if (!(isEndOfLine && charIndex === 0)) {\n            delete this.styles[lineIndex][index];\n          }\n        }\n      }\n      var styleCarriedOver = false;\n      if (somethingAdded && !isEndOfLine) {\n        // if is end of line, the extra style we copied\n        // is probably not something we want\n        this.styles[lineIndex + qty] = newLineStyles;\n        styleCarriedOver = true;\n      }\n      if (styleCarriedOver) {\n        // skip the last line of since we already prepared it.\n        qty--;\n      }\n      // for the all the lines or all the other lines\n      // we clone current char style onto the next (otherwise empty) line\n      while (qty > 0) {\n        if (copiedStyle && copiedStyle[qty - 1]) {\n          this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n        }\n        else if (currentCharStyle) {\n          this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n        }\n        else {\n          delete this.styles[lineIndex + qty];\n        }\n        qty--;\n      }\n      this._forceClearCache = true;\n    },\n\n    /**\n     * Inserts style object for a given line/char index\n     * @param {Number} lineIndex Index of a line\n     * @param {Number} charIndex Index of a char\n     * @param {Number} quantity number Style object to insert, if given\n     * @param {Array} copiedStyle array of style objects\n     */\n    insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n      if (!this.styles) {\n        this.styles = {};\n      }\n      var currentLineStyles       = this.styles[lineIndex],\n          currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n      quantity || (quantity = 1);\n      // shift all char styles by quantity forward\n      // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n      for (var index in currentLineStylesCloned) {\n        var numericIndex = parseInt(index, 10);\n        if (numericIndex >= charIndex) {\n          currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n          // only delete the style if there was nothing moved there\n          if (!currentLineStylesCloned[numericIndex - quantity]) {\n            delete currentLineStyles[numericIndex];\n          }\n        }\n      }\n      this._forceClearCache = true;\n      if (copiedStyle) {\n        while (quantity--) {\n          if (!Object.keys(copiedStyle[quantity]).length) {\n            continue;\n          }\n          if (!this.styles[lineIndex]) {\n            this.styles[lineIndex] = {};\n          }\n          this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n        }\n        return;\n      }\n      if (!currentLineStyles) {\n        return;\n      }\n      var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n      while (newStyle && quantity--) {\n        this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n      }\n    },\n\n    /**\n     * Inserts style object(s)\n     * @param {Array} insertedText Characters at the location where style is inserted\n     * @param {Number} start cursor index for inserting style\n     * @param {Array} [copiedStyle] array of style objects to insert.\n     */\n    insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n      var cursorLoc = this.get2DCursorLocation(start, true),\n          addedLines = [0], linesLength = 0;\n      // get an array of how many char per lines are being added.\n      for (var i = 0; i < insertedText.length; i++) {\n        if (insertedText[i] === '\\n') {\n          linesLength++;\n          addedLines[linesLength] = 0;\n        }\n        else {\n          addedLines[linesLength]++;\n        }\n      }\n      // for the first line copy the style from the current char position.\n      if (addedLines[0] > 0) {\n        this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n        copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n      }\n      linesLength && this.insertNewlineStyleObject(\n        cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n      for (var i = 1; i < linesLength; i++) {\n        if (addedLines[i] > 0) {\n          this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n        }\n        else if (copiedStyle) {\n          // this test is required in order to close #6841\n          // when a pasted buffer begins with a newline then\n          // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n          // may be undefined for some reason\n          if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n            this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n          }\n        }\n        copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n      }\n      // we use i outside the loop to get it like linesLength\n      if (addedLines[i] > 0) {\n        this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n      }\n    },\n\n    /**\n     * Set the selectionStart and selectionEnd according to the new position of cursor\n     * mimic the key - mouse navigation when shift is pressed.\n     */\n    setSelectionStartEndWithShift: function(start, end, newSelection) {\n      if (newSelection <= start) {\n        if (end === start) {\n          this._selectionDirection = 'left';\n        }\n        else if (this._selectionDirection === 'right') {\n          this._selectionDirection = 'left';\n          this.selectionEnd = start;\n        }\n        this.selectionStart = newSelection;\n      }\n      else if (newSelection > start && newSelection < end) {\n        if (this._selectionDirection === 'right') {\n          this.selectionEnd = newSelection;\n        }\n        else {\n          this.selectionStart = newSelection;\n        }\n      }\n      else {\n        // newSelection is > selection start and end\n        if (end === start) {\n          this._selectionDirection = 'right';\n        }\n        else if (this._selectionDirection === 'left') {\n          this._selectionDirection = 'right';\n          this.selectionStart = end;\n        }\n        this.selectionEnd = newSelection;\n      }\n    },\n\n    setSelectionInBoundaries: function() {\n      var length = this.text.length;\n      if (this.selectionStart > length) {\n        this.selectionStart = length;\n      }\n      else if (this.selectionStart < 0) {\n        this.selectionStart = 0;\n      }\n      if (this.selectionEnd > length) {\n        this.selectionEnd = length;\n      }\n      else if (this.selectionEnd < 0) {\n        this.selectionEnd = 0;\n      }\n    }\n  });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n  /**\n   * Initializes \"dbclick\" event handler\n   */\n  initDoubleClickSimulation: function() {\n\n    // for double click\n    this.__lastClickTime = +new Date();\n\n    // for triple click\n    this.__lastLastClickTime = +new Date();\n\n    this.__lastPointer = { };\n\n    this.on('mousedown', this.onMouseDown);\n  },\n\n  /**\n   * Default event handler to simulate triple click\n   * @private\n   */\n  onMouseDown: function(options) {\n    if (!this.canvas) {\n      return;\n    }\n    this.__newClickTime = +new Date();\n    var newPointer = options.pointer;\n    if (this.isTripleClick(newPointer)) {\n      this.fire('tripleclick', options);\n      this._stopEvent(options.e);\n    }\n    this.__lastLastClickTime = this.__lastClickTime;\n    this.__lastClickTime = this.__newClickTime;\n    this.__lastPointer = newPointer;\n    this.__lastIsEditing = this.isEditing;\n    this.__lastSelected = this.selected;\n  },\n\n  isTripleClick: function(newPointer) {\n    return this.__newClickTime - this.__lastClickTime < 500 &&\n        this.__lastClickTime - this.__lastLastClickTime < 500 &&\n        this.__lastPointer.x === newPointer.x &&\n        this.__lastPointer.y === newPointer.y;\n  },\n\n  /**\n   * @private\n   */\n  _stopEvent: function(e) {\n    e.preventDefault && e.preventDefault();\n    e.stopPropagation && e.stopPropagation();\n  },\n\n  /**\n   * Initializes event handlers related to cursor or selection\n   */\n  initCursorSelectionHandlers: function() {\n    this.initMousedownHandler();\n    this.initMouseupHandler();\n    this.initClicks();\n  },\n\n  /**\n   * Default handler for double click, select a word\n   */\n  doubleClickHandler: function(options) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectWord(this.getSelectionStartFromPointer(options.e));\n  },\n\n  /**\n   * Default handler for triple click, select a line\n   */\n  tripleClickHandler: function(options) {\n    if (!this.isEditing) {\n      return;\n    }\n    this.selectLine(this.getSelectionStartFromPointer(options.e));\n  },\n\n  /**\n   * Initializes double and triple click event handlers\n   */\n  initClicks: function() {\n    this.on('mousedblclick', this.doubleClickHandler);\n    this.on('tripleclick', this.tripleClickHandler);\n  },\n\n  /**\n   * Default event handler for the basic functionalities needed on _mouseDown\n   * can be overridden to do something different.\n   * Scope of this implementation is: find the click position, set selectionStart\n   * find selectionEnd, initialize the drawing of either cursor or selection area\n   * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n   * current compositionMode. It will be set to false.\n   */\n  _mouseDownHandler: function(options) {\n    if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n\n    this.__isMousedown = true;\n\n    if (this.selected) {\n      this.inCompositionMode = false;\n      this.setCursorByClick(options.e);\n    }\n\n    if (this.isEditing) {\n      this.__selectionStartOnMouseDown = this.selectionStart;\n      if (this.selectionStart === this.selectionEnd) {\n        this.abortCursorAnimation();\n      }\n      this.renderCursorOrSelection();\n    }\n  },\n\n  /**\n   * Default event handler for the basic functionalities needed on mousedown:before\n   * can be overridden to do something different.\n   * Scope of this implementation is: verify the object is already selected when mousing down\n   */\n  _mouseDownHandlerBefore: function(options) {\n    if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n    // we want to avoid that an object that was selected and then becomes unselectable,\n    // may trigger editing mode in some way.\n    this.selected = this === this.canvas._activeObject;\n  },\n\n  /**\n   * Initializes \"mousedown\" event handler\n   */\n  initMousedownHandler: function() {\n    this.on('mousedown', this._mouseDownHandler);\n    this.on('mousedown:before', this._mouseDownHandlerBefore);\n  },\n\n  /**\n   * Initializes \"mouseup\" event handler\n   */\n  initMouseupHandler: function() {\n    this.on('mouseup', this.mouseUpHandler);\n  },\n\n  /**\n   * standard handler for mouse up, overridable\n   * @private\n   */\n  mouseUpHandler: function(options) {\n    this.__isMousedown = false;\n    if (!this.editable || this.group ||\n      (options.transform && options.transform.actionPerformed) ||\n      (options.e.button && options.e.button !== 1)) {\n      return;\n    }\n\n    if (this.canvas) {\n      var currentActive = this.canvas._activeObject;\n      if (currentActive && currentActive !== this) {\n        // avoid running this logic when there is an active object\n        // this because is possible with shift click and fast clicks,\n        // to rapidly deselect and reselect this object and trigger an enterEdit\n        return;\n      }\n    }\n\n    if (this.__lastSelected && !this.__corner) {\n      this.selected = false;\n      this.__lastSelected = false;\n      this.enterEditing(options.e);\n      if (this.selectionStart === this.selectionEnd) {\n        this.initDelayedCursor(true);\n      }\n      else {\n        this.renderCursorOrSelection();\n      }\n    }\n    else {\n      this.selected = true;\n    }\n  },\n\n  /**\n   * Changes cursor location in a text depending on passed pointer (x/y) object\n   * @param {Event} e Event object\n   */\n  setCursorByClick: function(e) {\n    var newSelection = this.getSelectionStartFromPointer(e),\n        start = this.selectionStart, end = this.selectionEnd;\n    if (e.shiftKey) {\n      this.setSelectionStartEndWithShift(start, end, newSelection);\n    }\n    else {\n      this.selectionStart = newSelection;\n      this.selectionEnd = newSelection;\n    }\n    if (this.isEditing) {\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Returns index of a character corresponding to where an object was clicked\n   * @param {Event} e Event object\n   * @return {Number} Index of a character\n   */\n  getSelectionStartFromPointer: function(e) {\n    var mouseOffset = this.getLocalPointer(e),\n        prevWidth = 0,\n        width = 0,\n        height = 0,\n        charIndex = 0,\n        lineIndex = 0,\n        lineLeftOffset,\n        line;\n    for (var i = 0, len = this._textLines.length; i < len; i++) {\n      if (height <= mouseOffset.y) {\n        height += this.getHeightOfLine(i) * this.scaleY;\n        lineIndex = i;\n        if (i > 0) {\n          charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n        }\n      }\n      else {\n        break;\n      }\n    }\n    lineLeftOffset = this._getLineLeftOffset(lineIndex);\n    width = lineLeftOffset * this.scaleX;\n    line = this._textLines[lineIndex];\n    // handling of RTL: in order to get things work correctly,\n    // we assume RTL writing is mirrored compared to LTR writing.\n    // so in position detection we mirror the X offset, and when is time\n    // of rendering it, we mirror it again.\n    if (this.direction === 'rtl') {\n      mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width;\n    }\n    for (var j = 0, jlen = line.length; j < jlen; j++) {\n      prevWidth = width;\n      // i removed something about flipX here, check.\n      width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n      if (width <= mouseOffset.x) {\n        charIndex++;\n      }\n      else {\n        break;\n      }\n    }\n    return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n  },\n\n  /**\n   * @private\n   */\n  _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n    // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n    var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n        distanceBtwNextCharAndCursor = width - mouseOffset.x,\n        offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n          distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n        newSelectionStart = index + offset;\n    // if object is horizontally flipped, mirror cursor location from the end\n    if (this.flipX) {\n      newSelectionStart = jlen - newSelectionStart;\n    }\n\n    if (newSelectionStart > this._text.length) {\n      newSelectionStart = this._text.length;\n    }\n\n    return newSelectionStart;\n  }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n  /**\n   * Initializes hidden textarea (needed to bring up keyboard in iOS)\n   */\n  initHiddenTextarea: function() {\n    this.hiddenTextarea = fabric.document.createElement('textarea');\n    this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n    this.hiddenTextarea.setAttribute('autocorrect', 'off');\n    this.hiddenTextarea.setAttribute('autocomplete', 'off');\n    this.hiddenTextarea.setAttribute('spellcheck', 'false');\n    this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n    this.hiddenTextarea.setAttribute('wrap', 'off');\n    var style = this._calcTextareaPosition();\n    // line-height: 1px; was removed from the style to fix this:\n    // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n    this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n    '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n    ' paddingｰtop: ' + style.fontSize + ';';\n\n    if (this.hiddenTextareaContainer) {\n      this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);\n    }\n    else {\n      fabric.document.body.appendChild(this.hiddenTextarea);\n    }\n\n    fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n    fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n    if (!this._clickHandlerInitialized && this.canvas) {\n      fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n      this._clickHandlerInitialized = true;\n    }\n  },\n\n  /**\n   * For functionalities on keyDown\n   * Map a special key to a function of the instance/prototype\n   * If you need different behaviour for ESC or TAB or arrows, you have to change\n   * this map setting the name of a function that you build on the fabric.Itext or\n   * your prototype.\n   * the map change will affect all Instances unless you need for only some text Instances\n   * in that case you have to clone this object and assign your Instance.\n   * this.keysMap = fabric.util.object.clone(this.keysMap);\n   * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n   */\n  keysMap: {\n    9:  'exitEditing',\n    27: 'exitEditing',\n    33: 'moveCursorUp',\n    34: 'moveCursorDown',\n    35: 'moveCursorRight',\n    36: 'moveCursorLeft',\n    37: 'moveCursorLeft',\n    38: 'moveCursorUp',\n    39: 'moveCursorRight',\n    40: 'moveCursorDown',\n  },\n\n  keysMapRtl: {\n    9:  'exitEditing',\n    27: 'exitEditing',\n    33: 'moveCursorUp',\n    34: 'moveCursorDown',\n    35: 'moveCursorLeft',\n    36: 'moveCursorRight',\n    37: 'moveCursorRight',\n    38: 'moveCursorUp',\n    39: 'moveCursorLeft',\n    40: 'moveCursorDown',\n  },\n\n  /**\n   * For functionalities on keyUp + ctrl || cmd\n   */\n  ctrlKeysMapUp: {\n    67: 'copy',\n    88: 'cut'\n  },\n\n  /**\n   * For functionalities on keyDown + ctrl || cmd\n   */\n  ctrlKeysMapDown: {\n    65: 'selectAll'\n  },\n\n  onClick: function() {\n    // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n    this.hiddenTextarea && this.hiddenTextarea.focus();\n  },\n\n  /**\n   * Handles keydown event\n   * only used for arrows and combination of modifier keys.\n   * @param {Event} e Event object\n   */\n  onKeyDown: function(e) {\n    if (!this.isEditing) {\n      return;\n    }\n    var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n    if (e.keyCode in keyMap) {\n      this[keyMap[e.keyCode]](e);\n    }\n    else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n      this[this.ctrlKeysMapDown[e.keyCode]](e);\n    }\n    else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    if (e.keyCode >= 33 && e.keyCode <= 40) {\n      // if i press an arrow key just update selection\n      this.inCompositionMode = false;\n      this.clearContextTop();\n      this.renderCursorOrSelection();\n    }\n    else {\n      this.canvas && this.canvas.requestRenderAll();\n    }\n  },\n\n  /**\n   * Handles keyup event\n   * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n   * if a copy/cut event fired, keyup is dismissed\n   * @param {Event} e Event object\n   */\n  onKeyUp: function(e) {\n    if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n      this._copyDone = false;\n      return;\n    }\n    if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n      this[this.ctrlKeysMapUp[e.keyCode]](e);\n    }\n    else {\n      return;\n    }\n    e.stopImmediatePropagation();\n    e.preventDefault();\n    this.canvas && this.canvas.requestRenderAll();\n  },\n\n  /**\n   * Handles onInput event\n   * @param {Event} e Event object\n   */\n  onInput: function(e) {\n    var fromPaste = this.fromPaste;\n    this.fromPaste = false;\n    e && e.stopPropagation();\n    if (!this.isEditing) {\n      return;\n    }\n    // decisions about style changes.\n    var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n        charCount = this._text.length,\n        nextCharCount = nextText.length,\n        removedText, insertedText,\n        charDiff = nextCharCount - charCount,\n        selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n        selection = selectionStart !== selectionEnd,\n        copiedStyle, removeFrom, removeTo;\n    if (this.hiddenTextarea.value === '') {\n      this.styles = { };\n      this.updateFromTextArea();\n      this.fire('changed');\n      if (this.canvas) {\n        this.canvas.fire('text:changed', { target: this });\n        this.canvas.requestRenderAll();\n      }\n      return;\n    }\n\n    var textareaSelection = this.fromStringToGraphemeSelection(\n      this.hiddenTextarea.selectionStart,\n      this.hiddenTextarea.selectionEnd,\n      this.hiddenTextarea.value\n    );\n    var backDelete = selectionStart > textareaSelection.selectionStart;\n\n    if (selection) {\n      removedText = this._text.slice(selectionStart, selectionEnd);\n      charDiff += selectionEnd - selectionStart;\n    }\n    else if (nextCharCount < charCount) {\n      if (backDelete) {\n        removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n      }\n      else {\n        removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n      }\n    }\n    insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n    if (removedText && removedText.length) {\n      if (insertedText.length) {\n        // let's copy some style before deleting.\n        // we want to copy the style before the cursor OR the style at the cursor if selection\n        // is bigger than 0.\n        copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false);\n        // now duplicate the style one for each inserted text.\n        copiedStyle = insertedText.map(function() {\n          // this return an array of references, but that is fine since we are\n          // copying the style later.\n          return copiedStyle[0];\n        });\n      }\n      if (selection) {\n        removeFrom = selectionStart;\n        removeTo = selectionEnd;\n      }\n      else if (backDelete) {\n        // detect differences between forwardDelete and backDelete\n        removeFrom = selectionEnd - removedText.length;\n        removeTo = selectionEnd;\n      }\n      else {\n        removeFrom = selectionEnd;\n        removeTo = selectionEnd + removedText.length;\n      }\n      this.removeStyleFromTo(removeFrom, removeTo);\n    }\n    if (insertedText.length) {\n      if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n        copiedStyle = fabric.copiedTextStyle;\n      }\n      this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n    }\n    this.updateFromTextArea();\n    this.fire('changed');\n    if (this.canvas) {\n      this.canvas.fire('text:changed', { target: this });\n      this.canvas.requestRenderAll();\n    }\n  },\n  /**\n   * Composition start\n   */\n  onCompositionStart: function() {\n    this.inCompositionMode = true;\n  },\n\n  /**\n   * Composition end\n   */\n  onCompositionEnd: function() {\n    this.inCompositionMode = false;\n  },\n\n  // /**\n  //  * Composition update\n  //  */\n  onCompositionUpdate: function(e) {\n    this.compositionStart = e.target.selectionStart;\n    this.compositionEnd = e.target.selectionEnd;\n    this.updateTextareaPosition();\n  },\n\n  /**\n   * Copies selected text\n   * @param {Event} e Event object\n   */\n  copy: function() {\n    if (this.selectionStart === this.selectionEnd) {\n      //do not cut-copy if no selection\n      return;\n    }\n\n    fabric.copiedText = this.getSelectedText();\n    if (!fabric.disableStyleCopyPaste) {\n      fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n    }\n    else {\n      fabric.copiedTextStyle = null;\n    }\n    this._copyDone = true;\n  },\n\n  /**\n   * Pastes text\n   * @param {Event} e Event object\n   */\n  paste: function() {\n    this.fromPaste = true;\n  },\n\n  /**\n   * @private\n   * @param {Event} e Event object\n   * @return {Object} Clipboard data object\n   */\n  _getClipboardData: function(e) {\n    return (e && e.clipboardData) || fabric.window.clipboardData;\n  },\n\n  /**\n   * Finds the width in pixels before the cursor on the same line\n   * @private\n   * @param {Number} lineIndex\n   * @param {Number} charIndex\n   * @return {Number} widthBeforeCursor width before cursor\n   */\n  _getWidthBeforeCursor: function(lineIndex, charIndex) {\n    var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n    if (charIndex > 0) {\n      bound = this.__charBounds[lineIndex][charIndex - 1];\n      widthBeforeCursor += bound.left + bound.width;\n    }\n    return widthBeforeCursor;\n  },\n\n  /**\n   * Gets start offset of a selection\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getDownCursorOffset: function(e, isRight) {\n    var selectionProp = this._getSelectionForOffset(e, isRight),\n        cursorLocation = this.get2DCursorLocation(selectionProp),\n        lineIndex = cursorLocation.lineIndex;\n    // if on last line, down cursor goes to end of line\n    if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n      // move to the end of a text\n      return this._text.length - selectionProp;\n    }\n    var charIndex = cursorLocation.charIndex,\n        widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n        indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n        textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n    return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n  },\n\n  /**\n   * private\n   * Helps finding if the offset should be counted from Start or End\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  _getSelectionForOffset: function(e, isRight) {\n    if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n      return this.selectionEnd;\n    }\n    else {\n      return this.selectionStart;\n    }\n  },\n\n  /**\n   * @param {Event} e Event object\n   * @param {Boolean} isRight\n   * @return {Number}\n   */\n  getUpCursorOffset: function(e, isRight) {\n    var selectionProp = this._getSelectionForOffset(e, isRight),\n        cursorLocation = this.get2DCursorLocation(selectionProp),\n        lineIndex = cursorLocation.lineIndex;\n    if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n      // if on first line, up cursor goes to start of line\n      return -selectionProp;\n    }\n    var charIndex = cursorLocation.charIndex,\n        widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n        indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n        textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n        missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n    // return a negative offset\n    return -this._textLines[lineIndex - 1].length\n     + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n  },\n\n  /**\n   * for a given width it founds the matching character.\n   * @private\n   */\n  _getIndexOnLine: function(lineIndex, width) {\n\n    var line = this._textLines[lineIndex],\n        lineLeftOffset = this._getLineLeftOffset(lineIndex),\n        widthOfCharsOnLine = lineLeftOffset,\n        indexOnLine = 0, charWidth, foundMatch;\n\n    for (var j = 0, jlen = line.length; j < jlen; j++) {\n      charWidth = this.__charBounds[lineIndex][j].width;\n      widthOfCharsOnLine += charWidth;\n      if (widthOfCharsOnLine > width) {\n        foundMatch = true;\n        var leftEdge = widthOfCharsOnLine - charWidth,\n            rightEdge = widthOfCharsOnLine,\n            offsetFromLeftEdge = Math.abs(leftEdge - width),\n            offsetFromRightEdge = Math.abs(rightEdge - width);\n\n        indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n        break;\n      }\n    }\n\n    // reached end\n    if (!foundMatch) {\n      indexOnLine = line.length - 1;\n    }\n\n    return indexOnLine;\n  },\n\n\n  /**\n   * Moves cursor down\n   * @param {Event} e Event object\n   */\n  moveCursorDown: function(e) {\n    if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n      return;\n    }\n    this._moveCursorUpOrDown('Down', e);\n  },\n\n  /**\n   * Moves cursor up\n   * @param {Event} e Event object\n   */\n  moveCursorUp: function(e) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorUpOrDown('Up', e);\n  },\n\n  /**\n   * Moves cursor up or down, fires the events\n   * @param {String} direction 'Up' or 'Down'\n   * @param {Event} e Event object\n   */\n  _moveCursorUpOrDown: function(direction, e) {\n    // getUpCursorOffset\n    // getDownCursorOffset\n    var action = 'get' + direction + 'CursorOffset',\n        offset = this[action](e, this._selectionDirection === 'right');\n    if (e.shiftKey) {\n      this.moveCursorWithShift(offset);\n    }\n    else {\n      this.moveCursorWithoutShift(offset);\n    }\n    if (offset !== 0) {\n      this.setSelectionInBoundaries();\n      this.abortCursorAnimation();\n      this._currentCursorOpacity = 1;\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Moves cursor with shift\n   * @param {Number} offset\n   */\n  moveCursorWithShift: function(offset) {\n    var newSelection = this._selectionDirection === 'left'\n      ? this.selectionStart + offset\n      : this.selectionEnd + offset;\n    this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n    return offset !== 0;\n  },\n\n  /**\n   * Moves cursor up without shift\n   * @param {Number} offset\n   */\n  moveCursorWithoutShift: function(offset) {\n    if (offset < 0) {\n      this.selectionStart += offset;\n      this.selectionEnd = this.selectionStart;\n    }\n    else {\n      this.selectionEnd += offset;\n      this.selectionStart = this.selectionEnd;\n    }\n    return offset !== 0;\n  },\n\n  /**\n   * Moves cursor left\n   * @param {Event} e Event object\n   */\n  moveCursorLeft: function(e) {\n    if (this.selectionStart === 0 && this.selectionEnd === 0) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Left', e);\n  },\n\n  /**\n   * @private\n   * @return {Boolean} true if a change happened\n   */\n  _move: function(e, prop, direction) {\n    var newValue;\n    if (e.altKey) {\n      newValue = this['findWordBoundary' + direction](this[prop]);\n    }\n    else if (e.metaKey || e.keyCode === 35 ||  e.keyCode === 36 ) {\n      newValue = this['findLineBoundary' + direction](this[prop]);\n    }\n    else {\n      this[prop] += direction === 'Left' ? -1 : 1;\n      return true;\n    }\n    if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n      this[prop] = newValue;\n      return true;\n    }\n  },\n\n  /**\n   * @private\n   */\n  _moveLeft: function(e, prop) {\n    return this._move(e, prop, 'Left');\n  },\n\n  /**\n   * @private\n   */\n  _moveRight: function(e, prop) {\n    return this._move(e, prop, 'Right');\n  },\n\n  /**\n   * Moves cursor left without keeping selection\n   * @param {Event} e\n   */\n  moveCursorLeftWithoutShift: function(e) {\n    var change = true;\n    this._selectionDirection = 'left';\n\n    // only move cursor when there is no selection,\n    // otherwise we discard it, and leave cursor on same place\n    if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n      change = this._moveLeft(e, 'selectionStart');\n\n    }\n    this.selectionEnd = this.selectionStart;\n    return change;\n  },\n\n  /**\n   * Moves cursor left while keeping selection\n   * @param {Event} e\n   */\n  moveCursorLeftWithShift: function(e) {\n    if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n      return this._moveLeft(e, 'selectionEnd');\n    }\n    else if (this.selectionStart !== 0){\n      this._selectionDirection = 'left';\n      return this._moveLeft(e, 'selectionStart');\n    }\n  },\n\n  /**\n   * Moves cursor right\n   * @param {Event} e Event object\n   */\n  moveCursorRight: function(e) {\n    if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n      return;\n    }\n    this._moveCursorLeftOrRight('Right', e);\n  },\n\n  /**\n   * Moves cursor right or Left, fires event\n   * @param {String} direction 'Left', 'Right'\n   * @param {Event} e Event object\n   */\n  _moveCursorLeftOrRight: function(direction, e) {\n    var actionName = 'moveCursor' + direction + 'With';\n    this._currentCursorOpacity = 1;\n\n    if (e.shiftKey) {\n      actionName += 'Shift';\n    }\n    else {\n      actionName += 'outShift';\n    }\n    if (this[actionName](e)) {\n      this.abortCursorAnimation();\n      this.initDelayedCursor();\n      this._fireSelectionChanged();\n      this._updateTextarea();\n    }\n  },\n\n  /**\n   * Moves cursor right while keeping selection\n   * @param {Event} e\n   */\n  moveCursorRightWithShift: function(e) {\n    if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n      return this._moveRight(e, 'selectionStart');\n    }\n    else if (this.selectionEnd !== this._text.length) {\n      this._selectionDirection = 'right';\n      return this._moveRight(e, 'selectionEnd');\n    }\n  },\n\n  /**\n   * Moves cursor right without keeping selection\n   * @param {Event} e Event object\n   */\n  moveCursorRightWithoutShift: function(e) {\n    var changed = true;\n    this._selectionDirection = 'right';\n\n    if (this.selectionStart === this.selectionEnd) {\n      changed = this._moveRight(e, 'selectionStart');\n      this.selectionEnd = this.selectionStart;\n    }\n    else {\n      this.selectionStart = this.selectionEnd;\n    }\n    return changed;\n  },\n\n  /**\n   * Removes characters from start/end\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  removeChars: function(start, end) {\n    if (typeof end === 'undefined') {\n      end = start + 1;\n    }\n    this.removeStyleFromTo(start, end);\n    this._text.splice(start, end - start);\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    if (this._shouldClearDimensionCache()) {\n      this.initDimensions();\n      this.setCoords();\n    }\n    this._removeExtraneousStyles();\n  },\n\n  /**\n   * insert characters at start position, before start position.\n   * start  equal 1 it means the text get inserted between actual grapheme 0 and 1\n   * if style array is provided, it must be as the same length of text in graphemes\n   * if end is provided and is bigger than start, old text is replaced.\n   * start/end ar per grapheme position in _text array.\n   *\n   * @param {String} text text to insert\n   * @param {Array} style array of style objects\n   * @param {Number} start\n   * @param {Number} end default to start + 1\n   */\n  insertChars: function(text, style, start, end) {\n    if (typeof end === 'undefined') {\n      end = start;\n    }\n    if (end > start) {\n      this.removeStyleFromTo(start, end);\n    }\n    var graphemes = fabric.util.string.graphemeSplit(text);\n    this.insertNewStyleBlock(graphemes, start, style);\n    this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n    this.text = this._text.join('');\n    this.set('dirty', true);\n    if (this._shouldClearDimensionCache()) {\n      this.initDimensions();\n      this.setCoords();\n    }\n    this._removeExtraneousStyles();\n  },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n  var toFixed = fabric.util.toFixed,\n      multipleSpacesRegex = /  +/g;\n\n  fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n    /**\n     * Returns SVG representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    _toSVG: function() {\n      var offsets = this._getSVGLeftTopOffsets(),\n          textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n      return this._wrapSVGTextAndBg(textAndBg);\n    },\n\n    /**\n     * Returns svg representation of an instance\n     * @param {Function} [reviver] Method for further parsing of svg representation.\n     * @return {String} svg representation of an instance\n     */\n    toSVG: function(reviver) {\n      return this._createBaseSVGMarkup(\n        this._toSVG(),\n        { reviver: reviver, noStyle: true, withShadow: true }\n      );\n    },\n\n    /**\n     * @private\n     */\n    _getSVGLeftTopOffsets: function() {\n      return {\n        textLeft: -this.width / 2,\n        textTop: -this.height / 2,\n        lineTop: this.getHeightOfLine(0)\n      };\n    },\n\n    /**\n     * @private\n     */\n    _wrapSVGTextAndBg: function(textAndBg) {\n      var noShadow = true,\n          textDecoration = this.getSvgTextDecoration(this);\n      return [\n        textAndBg.textBgRects.join(''),\n        '\\t\\t<text xml:space=\"preserve\" ',\n        (this.fontFamily ? 'font-family=\"' + this.fontFamily.replace(/\"/g, '\\'') + '\" ' : ''),\n        (this.fontSize ? 'font-size=\"' + this.fontSize + '\" ' : ''),\n        (this.fontStyle ? 'font-style=\"' + this.fontStyle + '\" ' : ''),\n        (this.fontWeight ? 'font-weight=\"' + this.fontWeight + '\" ' : ''),\n        (textDecoration ? 'text-decoration=\"' + textDecoration + '\" ' : ''),\n        'style=\"', this.getSvgStyles(noShadow), '\"', this.addPaintOrder(), ' >',\n        textAndBg.textSpans.join(''),\n        '</text>\\n'\n      ];\n    },\n\n    /**\n     * @private\n     * @param {Number} textTopOffset Text top offset\n     * @param {Number} textLeftOffset Text left offset\n     * @return {Object}\n     */\n    _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n      var textSpans = [],\n          textBgRects = [],\n          height = textTopOffset, lineOffset;\n      // bounding-box background\n      this._setSVGBg(textBgRects);\n\n      // text and text-background\n      for (var i = 0, len = this._textLines.length; i < len; i++) {\n        lineOffset = this._getLineLeftOffset(i);\n        if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n          this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n        }\n        this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n        height += this.getHeightOfLine(i);\n      }\n\n      return {\n        textSpans: textSpans,\n        textBgRects: textBgRects\n      };\n    },\n\n    /**\n     * @private\n     */\n    _createTextCharSpan: function(_char, styleDecl, left, top) {\n      var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n          styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n          fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n          dy = styleDecl.deltaY, dySpan = '',\n          NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n      if (dy) {\n        dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n      }\n      return [\n        '<tspan x=\"', toFixed(left, NUM_FRACTION_DIGITS), '\" y=\"',\n        toFixed(top, NUM_FRACTION_DIGITS), '\" ', dySpan,\n        fillStyles, '>',\n        fabric.util.string.escapeXml(_char),\n        '</tspan>'\n      ].join('');\n    },\n\n    _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n      // set proper line offset\n      var lineHeight = this.getHeightOfLine(lineIndex),\n          isJustify = this.textAlign.indexOf('justify') !== -1,\n          actualStyle,\n          nextStyle,\n          charsToRender = '',\n          charBox, style,\n          boxWidth = 0,\n          line = this._textLines[lineIndex],\n          timeToRender;\n\n      textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n      for (var i = 0, len = line.length - 1; i <= len; i++) {\n        timeToRender = i === len || this.charSpacing;\n        charsToRender += line[i];\n        charBox = this.__charBounds[lineIndex][i];\n        if (boxWidth === 0) {\n          textLeftOffset += charBox.kernedWidth - charBox.width;\n          boxWidth += charBox.width;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n        if (isJustify && !timeToRender) {\n          if (this._reSpaceAndTab.test(line[i])) {\n            timeToRender = true;\n          }\n        }\n        if (!timeToRender) {\n          // if we have charSpacing, we render char by char\n          actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n          nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n          timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, true);\n        }\n        if (timeToRender) {\n          style = this._getStyleDeclaration(lineIndex, i) || { };\n          textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n          charsToRender = '';\n          actualStyle = nextStyle;\n          textLeftOffset += boxWidth;\n          boxWidth = 0;\n        }\n      }\n    },\n\n    _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n      var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n      textBgRects.push(\n        '\\t\\t<rect ',\n        this._getFillAttributes(color),\n        ' x=\"',\n        toFixed(left, NUM_FRACTION_DIGITS),\n        '\" y=\"',\n        toFixed(top, NUM_FRACTION_DIGITS),\n        '\" width=\"',\n        toFixed(width, NUM_FRACTION_DIGITS),\n        '\" height=\"',\n        toFixed(height, NUM_FRACTION_DIGITS),\n        '\"></rect>\\n');\n    },\n\n    _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n      var line = this._textLines[i],\n          heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n          boxWidth = 0,\n          boxStart = 0,\n          charBox, currentColor,\n          lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n      for (var j = 0, jlen = line.length; j < jlen; j++) {\n        charBox = this.__charBounds[i][j];\n        currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n        if (currentColor !== lastColor) {\n          lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n            textTopOffset, boxWidth, heightOfLine);\n          boxStart = charBox.left;\n          boxWidth = charBox.width;\n          lastColor = currentColor;\n        }\n        else {\n          boxWidth += charBox.kernedWidth;\n        }\n      }\n      currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n        textTopOffset, boxWidth, heightOfLine);\n    },\n\n    /**\n     * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n     * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n     *\n     * @private\n     * @param {*} value\n     * @return {String}\n     */\n    _getFillAttributes: function(value) {\n      var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n      if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n        return 'fill=\"' + value + '\"';\n      }\n      return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n    },\n\n    /**\n     * @private\n     */\n    _getSVGLineTopOffset: function(lineIndex) {\n      var lineTopOffset = 0, lastHeight = 0;\n      for (var j = 0; j < lineIndex; j++) {\n        lineTopOffset += this.getHeightOfLine(j);\n      }\n      lastHeight = this.getHeightOfLine(j);\n      return {\n        lineTop: lineTopOffset,\n        offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n      };\n    },\n\n    /**\n     * Returns styles-string for svg-export\n     * @param {Boolean} skipShadow a boolean to skip shadow filter output\n     * @return {String}\n     */\n    getSvgStyles: function(skipShadow) {\n      var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n      return svgStyle + ' white-space: pre;';\n    },\n  });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n  'use strict';\n\n  var fabric = global.fabric || (global.fabric = {});\n\n  /**\n   * Textbox class, based on IText, allows the user to resize the text rectangle\n   * and wraps lines automatically. Textboxes have their Y scaling locked, the\n   * user can only change width. Height is adjusted automatically based on the\n   * wrapping of lines.\n   * @class fabric.Textbox\n   * @extends fabric.IText\n   * @mixes fabric.Observable\n   * @return {fabric.Textbox} thisArg\n   * @see {@link fabric.Textbox#initialize} for constructor definition\n   */\n  fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n    /**\n     * Type of an object\n     * @type String\n     * @default\n     */\n    type: 'textbox',\n\n    /**\n     * Minimum width of textbox, in pixels.\n     * @type Number\n     * @default\n     */\n    minWidth: 20,\n\n    /**\n     * Minimum calculated width of a textbox, in pixels.\n     * fixed to 2 so that an empty textbox cannot go to 0\n     * and is still selectable without text.\n     * @type Number\n     * @default\n     */\n    dynamicMinWidth: 2,\n\n    /**\n     * Cached array of text wrapping.\n     * @type Array\n     */\n    __cachedLines: null,\n\n    /**\n     * Override standard Object class values\n     */\n    lockScalingFlip: true,\n\n    /**\n     * Override standard Object class values\n     * Textbox needs this on false\n     */\n    noScaleCache: false,\n\n    /**\n     * Properties which when set cause object to change dimensions\n     * @type Object\n     * @private\n     */\n    _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n    /**\n     * Use this regular expression to split strings in breakable lines\n     * @private\n     */\n    _wordJoiners: /[ \\t\\r]/,\n\n    /**\n     * Use this boolean property in order to split strings that have no white space concept.\n     * this is a cheap way to help with chinese/japanese\n     * @type Boolean\n     * @since 2.6.0\n     */\n    splitByGrapheme: false,\n\n    /**\n     * Unlike superclass's version of this function, Textbox does not update\n     * its width.\n     * @private\n     * @override\n     */\n    initDimensions: function() {\n      if (this.__skipDimension) {\n        return;\n      }\n      this.isEditing && this.initDelayedCursor();\n      this.clearContextTop();\n      this._clearCache();\n      // clear dynamicMinWidth as it will be different after we re-wrap line\n      this.dynamicMinWidth = 0;\n      // wrap lines\n      this._styleMap = this._generateStyleMap(this._splitText());\n      // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n      if (this.dynamicMinWidth > this.width) {\n        this._set('width', this.dynamicMinWidth);\n      }\n      if (this.textAlign.indexOf('justify') !== -1) {\n        // once text is measured we need to make space fatter to make justified text.\n        this.enlargeSpaces();\n      }\n      // clear cache and re-calculate height\n      this.height = this.calcTextHeight();\n      this.saveState({ propertySet: '_dimensionAffectingProps' });\n    },\n\n    /**\n     * Generate an object that translates the style object so that it is\n     * broken up by visual lines (new lines and automatic wrapping).\n     * The original text styles object is broken up by actual lines (new lines only),\n     * which is only sufficient for Text / IText\n     * @private\n     */\n    _generateStyleMap: function(textInfo) {\n      var realLineCount     = 0,\n          realLineCharCount = 0,\n          charCount         = 0,\n          map               = {};\n\n      for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n        if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n          realLineCharCount = 0;\n          charCount++;\n          realLineCount++;\n        }\n        else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n          // this case deals with space's that are removed from end of lines when wrapping\n          realLineCharCount++;\n          charCount++;\n        }\n\n        map[i] = { line: realLineCount, offset: realLineCharCount };\n\n        charCount += textInfo.graphemeLines[i].length;\n        realLineCharCount += textInfo.graphemeLines[i].length;\n      }\n\n      return map;\n    },\n\n    /**\n     * Returns true if object has a style property or has it on a specified line\n     * @param {Number} lineIndex\n     * @return {Boolean}\n     */\n    styleHas: function(property, lineIndex) {\n      if (this._styleMap && !this.isWrapping) {\n        var map = this._styleMap[lineIndex];\n        if (map) {\n          lineIndex = map.line;\n        }\n      }\n      return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n    },\n\n    /**\n     * Returns true if object has no styling or no styling in a line\n     * @param {Number} lineIndex , lineIndex is on wrapped lines.\n     * @return {Boolean}\n     */\n    isEmptyStyles: function(lineIndex) {\n      if (!this.styles) {\n        return true;\n      }\n      var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n          map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n      if (map) {\n        lineIndex = map.line;\n        offset = map.offset;\n      }\n      if (mapNextLine) {\n        nextLineIndex = mapNextLine.line;\n        shouldLimit = nextLineIndex === lineIndex;\n        nextOffset = mapNextLine.offset;\n      }\n      obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n      for (var p1 in obj) {\n        for (var p2 in obj[p1]) {\n          if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n            // eslint-disable-next-line no-unused-vars\n            for (var p3 in obj[p1][p2]) {\n              return false;\n            }\n          }\n        }\n      }\n      return true;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _getStyleDeclaration: function(lineIndex, charIndex) {\n      if (this._styleMap && !this.isWrapping) {\n        var map = this._styleMap[lineIndex];\n        if (!map) {\n          return null;\n        }\n        lineIndex = map.line;\n        charIndex = map.offset + charIndex;\n      }\n      return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @param {Object} style\n     * @private\n     */\n    _setStyleDeclaration: function(lineIndex, charIndex, style) {\n      var map = this._styleMap[lineIndex];\n      lineIndex = map.line;\n      charIndex = map.offset + charIndex;\n\n      this.styles[lineIndex][charIndex] = style;\n    },\n\n    /**\n     * @param {Number} lineIndex\n     * @param {Number} charIndex\n     * @private\n     */\n    _deleteStyleDeclaration: function(lineIndex, charIndex) {\n      var map = this._styleMap[lineIndex];\n      lineIndex = map.line;\n      charIndex = map.offset + charIndex;\n      delete this.styles[lineIndex][charIndex];\n    },\n\n    /**\n     * probably broken need a fix\n     * Returns the real style line that correspond to the wrapped lineIndex line\n     * Used just to verify if the line does exist or not.\n     * @param {Number} lineIndex\n     * @returns {Boolean} if the line exists or not\n     * @private\n     */\n    _getLineStyle: function(lineIndex) {\n      var map = this._styleMap[lineIndex];\n      return !!this.styles[map.line];\n    },\n\n    /**\n     * Set the line style to an empty object so that is initialized\n     * @param {Number} lineIndex\n     * @param {Object} style\n     * @private\n     */\n    _setLineStyle: function(lineIndex) {\n      var map = this._styleMap[lineIndex];\n      this.styles[map.line] = {};\n    },\n\n    /**\n     * Wraps text using the 'width' property of Textbox. First this function\n     * splits text on newlines, so we preserve newlines entered by the user.\n     * Then it wraps each line using the width of the Textbox by calling\n     * _wrapLine().\n     * @param {Array} lines The string array of text that is split into lines\n     * @param {Number} desiredWidth width you want to wrap to\n     * @returns {Array} Array of lines\n     */\n    _wrapText: function(lines, desiredWidth) {\n      var wrapped = [], i;\n      this.isWrapping = true;\n      for (i = 0; i < lines.length; i++) {\n        wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n      }\n      this.isWrapping = false;\n      return wrapped;\n    },\n\n    /**\n     * Helper function to measure a string of text, given its lineIndex and charIndex offset\n     * it gets called when charBounds are not available yet.\n     * @param {CanvasRenderingContext2D} ctx\n     * @param {String} text\n     * @param {number} lineIndex\n     * @param {number} charOffset\n     * @returns {number}\n     * @private\n     */\n    _measureWord: function(word, lineIndex, charOffset) {\n      var width = 0, prevGrapheme, skipLeft = true;\n      charOffset = charOffset || 0;\n      for (var i = 0, len = word.length; i < len; i++) {\n        var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n        width += box.kernedWidth;\n        prevGrapheme = word[i];\n      }\n      return width;\n    },\n\n    /**\n     * Wraps a line of text using the width of the Textbox and a context.\n     * @param {Array} line The grapheme array that represent the line\n     * @param {Number} lineIndex\n     * @param {Number} desiredWidth width you want to wrap the line to\n     * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n     * @returns {Array} Array of line(s) into which the given text is wrapped\n     * to.\n     */\n    _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n      var lineWidth = 0,\n          splitByGrapheme = this.splitByGrapheme,\n          graphemeLines = [],\n          line = [],\n          // spaces in different languages?\n          words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n          word = '',\n          offset = 0,\n          infix = splitByGrapheme ? '' : ' ',\n          wordWidth = 0,\n          infixWidth = 0,\n          largestWordWidth = 0,\n          lineJustStarted = true,\n          additionalSpace = this._getWidthOfCharSpacing(),\n          reservedSpace = reservedSpace || 0;\n      // fix a difference between split and graphemeSplit\n      if (words.length === 0) {\n        words.push([]);\n      }\n      desiredWidth -= reservedSpace;\n      for (var i = 0; i < words.length; i++) {\n        // if using splitByGrapheme words are already in graphemes.\n        word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n        wordWidth = this._measureWord(word, lineIndex, offset);\n        offset += word.length;\n\n        lineWidth += infixWidth + wordWidth - additionalSpace;\n        if (lineWidth > desiredWidth && !lineJustStarted) {\n          graphemeLines.push(line);\n          line = [];\n          lineWidth = wordWidth;\n          lineJustStarted = true;\n        }\n        else {\n          lineWidth += additionalSpace;\n        }\n\n        if (!lineJustStarted && !splitByGrapheme) {\n          line.push(infix);\n        }\n        line = line.concat(word);\n\n        infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset);\n        offset++;\n        lineJustStarted = false;\n        // keep track of largest word\n        if (wordWidth > largestWordWidth) {\n          largestWordWidth = wordWidth;\n        }\n      }\n\n      i && graphemeLines.push(line);\n\n      if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n        this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n      }\n      return graphemeLines;\n    },\n\n    /**\n     * Detect if the text line is ended with an hard break\n     * text and itext do not have wrapping, return false\n     * @param {Number} lineIndex text to split\n     * @return {Boolean}\n     */\n    isEndOfWrapping: function(lineIndex) {\n      if (!this._styleMap[lineIndex + 1]) {\n        // is last line, return true;\n        return true;\n      }\n      if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n        // this is last line before a line break, return true;\n        return true;\n      }\n      return false;\n    },\n\n    /**\n     * Detect if a line has a linebreak and so we need to account for it when moving\n     * and counting style.\n     * @return Number\n     */\n    missingNewlineOffset: function(lineIndex) {\n      if (this.splitByGrapheme) {\n        return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n      }\n      return 1;\n    },\n\n    /**\n    * Gets lines of text to render in the Textbox. This function calculates\n    * text wrapping on the fly every time it is called.\n    * @param {String} text text to split\n    * @returns {Array} Array of lines in the Textbox.\n    * @override\n    */\n    _splitTextIntoLines: function(text) {\n      var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n          graphemeLines = this._wrapText(newText.lines, this.width),\n          lines = new Array(graphemeLines.length);\n      for (var i = 0; i < graphemeLines.length; i++) {\n        lines[i] = graphemeLines[i].join('');\n      }\n      newText.lines = lines;\n      newText.graphemeLines = graphemeLines;\n      return newText;\n    },\n\n    getMinWidth: function() {\n      return Math.max(this.minWidth, this.dynamicMinWidth);\n    },\n\n    _removeExtraneousStyles: function() {\n      var linesToKeep = {};\n      for (var prop in this._styleMap) {\n        if (this._textLines[prop]) {\n          linesToKeep[this._styleMap[prop].line] = 1;\n        }\n      }\n      for (var prop in this.styles) {\n        if (!linesToKeep[prop]) {\n          delete this.styles[prop];\n        }\n      }\n    },\n\n    /**\n     * Returns object representation of an instance\n     * @method toObject\n     * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n     * @return {Object} object representation of an instance\n     */\n    toObject: function(propertiesToInclude) {\n      return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n    }\n  });\n\n  /**\n   * Returns fabric.Textbox instance from an object representation\n   * @static\n   * @memberOf fabric.Textbox\n   * @param {Object} object Object to create an instance from\n   * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n   */\n  fabric.Textbox.fromObject = function(object, callback) {\n    var styles = fabric.util.stylesFromArray(object.styles, object.text);\n    //copy object to prevent mutation\n    var objCopy = Object.assign({}, object, { styles: styles });\n    return fabric.Object._fromObject('Textbox', objCopy, callback, 'text');\n  };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n  var controlsUtils = fabric.controlsUtils,\n      scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler,\n      scaleStyleHandler = controlsUtils.scaleCursorStyleHandler,\n      scalingEqually = controlsUtils.scalingEqually,\n      scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX,\n      scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY,\n      scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName,\n      objectControls = fabric.Object.prototype.controls;\n\n  objectControls.ml = new fabric.Control({\n    x: -0.5,\n    y: 0,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingXOrSkewingY,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mr = new fabric.Control({\n    x: 0.5,\n    y: 0,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingXOrSkewingY,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mb = new fabric.Control({\n    x: 0,\n    y: 0.5,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingYOrSkewingX,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.mt = new fabric.Control({\n    x: 0,\n    y: -0.5,\n    cursorStyleHandler: scaleSkewStyleHandler,\n    actionHandler: scalingYOrSkewingX,\n    getActionName: scaleOrSkewActionName,\n  });\n\n  objectControls.tl = new fabric.Control({\n    x: -0.5,\n    y: -0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.tr = new fabric.Control({\n    x: 0.5,\n    y: -0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.bl = new fabric.Control({\n    x: -0.5,\n    y: 0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.br = new fabric.Control({\n    x: 0.5,\n    y: 0.5,\n    cursorStyleHandler: scaleStyleHandler,\n    actionHandler: scalingEqually\n  });\n\n  objectControls.mtr = new fabric.Control({\n    x: 0,\n    y: -0.5,\n    actionHandler: controlsUtils.rotationWithSnapping,\n    cursorStyleHandler: controlsUtils.rotationStyleHandler,\n    offsetY: -40,\n    withConnection: true,\n    actionName: 'rotate',\n  });\n\n  if (fabric.Textbox) {\n    // this is breaking the prototype inheritance, no time / ideas to fix it.\n    // is important to document that if you want to have all objects to have a\n    // specific custom control, you have to add it to Object prototype and to Textbox\n    // prototype. The controls are shared as references. So changes to control `tr`\n    // can still apply to all objects if needed.\n    var textBoxControls = fabric.Textbox.prototype.controls = { };\n\n    textBoxControls.mtr = objectControls.mtr;\n    textBoxControls.tr = objectControls.tr;\n    textBoxControls.br = objectControls.br;\n    textBoxControls.tl = objectControls.tl;\n    textBoxControls.bl = objectControls.bl;\n    textBoxControls.mt = objectControls.mt;\n    textBoxControls.mb = objectControls.mb;\n\n    textBoxControls.mr = new fabric.Control({\n      x: 0.5,\n      y: 0,\n      actionHandler: controlsUtils.changeWidth,\n      cursorStyleHandler: scaleSkewStyleHandler,\n      actionName: 'resizing',\n    });\n\n    textBoxControls.ml = new fabric.Control({\n      x: -0.5,\n      y: 0,\n      actionHandler: controlsUtils.changeWidth,\n      cursorStyleHandler: scaleSkewStyleHandler,\n      actionName: 'resizing',\n    });\n  }\n})();\n\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.deinterlace = void 0;\n\n/**\r\n * Deinterlace function from https://github.com/shachaf/jsgif\r\n */\nvar deinterlace = function deinterlace(pixels, width) {\n  var newPixels = new Array(pixels.length);\n  var rows = pixels.length / width;\n\n  var cpRow = function cpRow(toRow, fromRow) {\n    var fromPixels = pixels.slice(fromRow * width, (fromRow + 1) * width);\n    newPixels.splice.apply(newPixels, [toRow * width, width].concat(fromPixels));\n  }; // See appendix E.\n\n\n  var offsets = [0, 4, 2, 1];\n  var steps = [8, 8, 4, 2];\n  var fromRow = 0;\n\n  for (var pass = 0; pass < 4; pass++) {\n    for (var toRow = offsets[pass]; toRow < rows; toRow += steps[pass]) {\n      cpRow(toRow, fromRow);\n      fromRow++;\n    }\n  }\n\n  return newPixels;\n};\n\nexports.deinterlace = deinterlace;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.decompressFrames = exports.decompressFrame = exports.parseGIF = void 0;\n\nvar _gif = _interopRequireDefault(require(\"js-binary-schema-parser/lib/schemas/gif\"));\n\nvar _jsBinarySchemaParser = require(\"js-binary-schema-parser\");\n\nvar _uint = require(\"js-binary-schema-parser/lib/parsers/uint8\");\n\nvar _deinterlace = require(\"./deinterlace\");\n\nvar _lzw = require(\"./lzw\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar parseGIF = function parseGIF(arrayBuffer) {\n  var byteData = new Uint8Array(arrayBuffer);\n  return (0, _jsBinarySchemaParser.parse)((0, _uint.buildStream)(byteData), _gif[\"default\"]);\n};\n\nexports.parseGIF = parseGIF;\n\nvar generatePatch = function generatePatch(image) {\n  var totalPixels = image.pixels.length;\n  var patchData = new Uint8ClampedArray(totalPixels * 4);\n\n  for (var i = 0; i < totalPixels; i++) {\n    var pos = i * 4;\n    var colorIndex = image.pixels[i];\n    var color = image.colorTable[colorIndex] || [0, 0, 0];\n    patchData[pos] = color[0];\n    patchData[pos + 1] = color[1];\n    patchData[pos + 2] = color[2];\n    patchData[pos + 3] = colorIndex !== image.transparentIndex ? 255 : 0;\n  }\n\n  return patchData;\n};\n\nvar decompressFrame = function decompressFrame(frame, gct, buildImagePatch) {\n  if (!frame.image) {\n    console.warn('gif frame does not have associated image.');\n    return;\n  }\n\n  var image = frame.image; // get the number of pixels\n\n  var totalPixels = image.descriptor.width * image.descriptor.height; // do lzw decompression\n\n  var pixels = (0, _lzw.lzw)(image.data.minCodeSize, image.data.blocks, totalPixels); // deal with interlacing if necessary\n\n  if (image.descriptor.lct.interlaced) {\n    pixels = (0, _deinterlace.deinterlace)(pixels, image.descriptor.width);\n  }\n\n  var resultImage = {\n    pixels: pixels,\n    dims: {\n      top: frame.image.descriptor.top,\n      left: frame.image.descriptor.left,\n      width: frame.image.descriptor.width,\n      height: frame.image.descriptor.height\n    }\n  }; // color table\n\n  if (image.descriptor.lct && image.descriptor.lct.exists) {\n    resultImage.colorTable = image.lct;\n  } else {\n    resultImage.colorTable = gct;\n  } // add per frame relevant gce information\n\n\n  if (frame.gce) {\n    resultImage.delay = (frame.gce.delay || 10) * 10; // convert to ms\n\n    resultImage.disposalType = frame.gce.extras.disposal; // transparency\n\n    if (frame.gce.extras.transparentColorGiven) {\n      resultImage.transparentIndex = frame.gce.transparentColorIndex;\n    }\n  } // create canvas usable imagedata if desired\n\n\n  if (buildImagePatch) {\n    resultImage.patch = generatePatch(resultImage);\n  }\n\n  return resultImage;\n};\n\nexports.decompressFrame = decompressFrame;\n\nvar decompressFrames = function decompressFrames(parsedGif, buildImagePatches) {\n  return parsedGif.frames.filter(function (f) {\n    return f.image;\n  }).map(function (f) {\n    return decompressFrame(f, parsedGif.gct, buildImagePatches);\n  });\n};\n\nexports.decompressFrames = decompressFrames;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.lzw = void 0;\n\n/**\r\n * javascript port of java LZW decompression\r\n * Original java author url: https://gist.github.com/devunwired/4479231\r\n */\nvar lzw = function lzw(minCodeSize, data, pixelCount) {\n  var MAX_STACK_SIZE = 4096;\n  var nullCode = -1;\n  var npix = pixelCount;\n  var available, clear, code_mask, code_size, end_of_information, in_code, old_code, bits, code, i, datum, data_size, first, top, bi, pi;\n  var dstPixels = new Array(pixelCount);\n  var prefix = new Array(MAX_STACK_SIZE);\n  var suffix = new Array(MAX_STACK_SIZE);\n  var pixelStack = new Array(MAX_STACK_SIZE + 1); // Initialize GIF data stream decoder.\n\n  data_size = minCodeSize;\n  clear = 1 << data_size;\n  end_of_information = clear + 1;\n  available = clear + 2;\n  old_code = nullCode;\n  code_size = data_size + 1;\n  code_mask = (1 << code_size) - 1;\n\n  for (code = 0; code < clear; code++) {\n    prefix[code] = 0;\n    suffix[code] = code;\n  } // Decode GIF pixel stream.\n\n\n  var datum, bits, count, first, top, pi, bi;\n  datum = bits = count = first = top = pi = bi = 0;\n\n  for (i = 0; i < npix;) {\n    if (top === 0) {\n      if (bits < code_size) {\n        // get the next byte\n        datum += data[bi] << bits;\n        bits += 8;\n        bi++;\n        continue;\n      } // Get the next code.\n\n\n      code = datum & code_mask;\n      datum >>= code_size;\n      bits -= code_size; // Interpret the code\n\n      if (code > available || code == end_of_information) {\n        break;\n      }\n\n      if (code == clear) {\n        // Reset decoder.\n        code_size = data_size + 1;\n        code_mask = (1 << code_size) - 1;\n        available = clear + 2;\n        old_code = nullCode;\n        continue;\n      }\n\n      if (old_code == nullCode) {\n        pixelStack[top++] = suffix[code];\n        old_code = code;\n        first = code;\n        continue;\n      }\n\n      in_code = code;\n\n      if (code == available) {\n        pixelStack[top++] = first;\n        code = old_code;\n      }\n\n      while (code > clear) {\n        pixelStack[top++] = suffix[code];\n        code = prefix[code];\n      }\n\n      first = suffix[code] & 0xff;\n      pixelStack[top++] = first; // add a new string to the table, but only if space is available\n      // if not, just continue with current table until a clear code is found\n      // (deferred clear code implementation as per GIF spec)\n\n      if (available < MAX_STACK_SIZE) {\n        prefix[available] = old_code;\n        suffix[available] = first;\n        available++;\n\n        if ((available & code_mask) === 0 && available < MAX_STACK_SIZE) {\n          code_size++;\n          code_mask += available;\n        }\n      }\n\n      old_code = in_code;\n    } // Pop a pixel off the pixel stack.\n\n\n    top--;\n    dstPixels[pi++] = pixelStack[top];\n    i++;\n  }\n\n  for (i = pi; i < npix; i++) {\n    dstPixels[i] = 0; // clear missing pixels\n  }\n\n  return dstPixels;\n};\n\nexports.lzw = lzw;","import _extends from '@babel/runtime/helpers/esm/extends';\nimport resolvePathname from 'resolve-pathname';\nimport valueEqual from 'value-equal';\nimport warning from 'tiny-warning';\nimport invariant from 'tiny-invariant';\n\nfunction addLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path : '/' + path;\n}\nfunction stripLeadingSlash(path) {\n  return path.charAt(0) === '/' ? path.substr(1) : path;\n}\nfunction hasBasename(path, prefix) {\n  return path.toLowerCase().indexOf(prefix.toLowerCase()) === 0 && '/?#'.indexOf(path.charAt(prefix.length)) !== -1;\n}\nfunction stripBasename(path, prefix) {\n  return hasBasename(path, prefix) ? path.substr(prefix.length) : path;\n}\nfunction stripTrailingSlash(path) {\n  return path.charAt(path.length - 1) === '/' ? path.slice(0, -1) : path;\n}\nfunction parsePath(path) {\n  var pathname = path || '/';\n  var search = '';\n  var hash = '';\n  var hashIndex = pathname.indexOf('#');\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf('?');\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === '?' ? '' : search,\n    hash: hash === '#' ? '' : hash\n  };\n}\nfunction createPath(location) {\n  var pathname = location.pathname,\n      search = location.search,\n      hash = location.hash;\n  var path = pathname || '/';\n  if (search && search !== '?') path += search.charAt(0) === '?' ? search : \"?\" + search;\n  if (hash && hash !== '#') path += hash.charAt(0) === '#' ? hash : \"#\" + hash;\n  return path;\n}\n\nfunction createLocation(path, state, key, currentLocation) {\n  var location;\n\n  if (typeof path === 'string') {\n    // Two-arg form: push(path, state)\n    location = parsePath(path);\n    location.state = state;\n  } else {\n    // One-arg form: push(location)\n    location = _extends({}, path);\n    if (location.pathname === undefined) location.pathname = '';\n\n    if (location.search) {\n      if (location.search.charAt(0) !== '?') location.search = '?' + location.search;\n    } else {\n      location.search = '';\n    }\n\n    if (location.hash) {\n      if (location.hash.charAt(0) !== '#') location.hash = '#' + location.hash;\n    } else {\n      location.hash = '';\n    }\n\n    if (state !== undefined && location.state === undefined) location.state = state;\n  }\n\n  try {\n    location.pathname = decodeURI(location.pathname);\n  } catch (e) {\n    if (e instanceof URIError) {\n      throw new URIError('Pathname \"' + location.pathname + '\" could not be decoded. ' + 'This is likely caused by an invalid percent-encoding.');\n    } else {\n      throw e;\n    }\n  }\n\n  if (key) location.key = key;\n\n  if (currentLocation) {\n    // Resolve incomplete/relative pathname relative to current location.\n    if (!location.pathname) {\n      location.pathname = currentLocation.pathname;\n    } else if (location.pathname.charAt(0) !== '/') {\n      location.pathname = resolvePathname(location.pathname, currentLocation.pathname);\n    }\n  } else {\n    // When there is no prior location and pathname is empty, set it to /\n    if (!location.pathname) {\n      location.pathname = '/';\n    }\n  }\n\n  return location;\n}\nfunction locationsAreEqual(a, b) {\n  return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash && a.key === b.key && valueEqual(a.state, b.state);\n}\n\nfunction createTransitionManager() {\n  var prompt = null;\n\n  function setPrompt(nextPrompt) {\n    process.env.NODE_ENV !== \"production\" ? warning(prompt == null, 'A history supports only one prompt at a time') : void 0;\n    prompt = nextPrompt;\n    return function () {\n      if (prompt === nextPrompt) prompt = null;\n    };\n  }\n\n  function confirmTransitionTo(location, action, getUserConfirmation, callback) {\n    // TODO: If another transition starts while we're still confirming\n    // the previous one, we may end up in a weird state. Figure out the\n    // best way to handle this.\n    if (prompt != null) {\n      var result = typeof prompt === 'function' ? prompt(location, action) : prompt;\n\n      if (typeof result === 'string') {\n        if (typeof getUserConfirmation === 'function') {\n          getUserConfirmation(result, callback);\n        } else {\n          process.env.NODE_ENV !== \"production\" ? warning(false, 'A history needs a getUserConfirmation function in order to use a prompt message') : void 0;\n          callback(true);\n        }\n      } else {\n        // Return false from a transition hook to cancel the transition.\n        callback(result !== false);\n      }\n    } else {\n      callback(true);\n    }\n  }\n\n  var listeners = [];\n\n  function appendListener(fn) {\n    var isActive = true;\n\n    function listener() {\n      if (isActive) fn.apply(void 0, arguments);\n    }\n\n    listeners.push(listener);\n    return function () {\n      isActive = false;\n      listeners = listeners.filter(function (item) {\n        return item !== listener;\n      });\n    };\n  }\n\n  function notifyListeners() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    listeners.forEach(function (listener) {\n      return listener.apply(void 0, args);\n    });\n  }\n\n  return {\n    setPrompt: setPrompt,\n    confirmTransitionTo: confirmTransitionTo,\n    appendListener: appendListener,\n    notifyListeners: notifyListeners\n  };\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction getConfirmation(message, callback) {\n  callback(window.confirm(message)); // eslint-disable-line no-alert\n}\n/**\n * Returns true if the HTML5 history API is supported. Taken from Modernizr.\n *\n * https://github.com/Modernizr/Modernizr/blob/master/LICENSE\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n * changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586\n */\n\nfunction supportsHistory() {\n  var ua = window.navigator.userAgent;\n  if ((ua.indexOf('Android 2.') !== -1 || ua.indexOf('Android 4.0') !== -1) && ua.indexOf('Mobile Safari') !== -1 && ua.indexOf('Chrome') === -1 && ua.indexOf('Windows Phone') === -1) return false;\n  return window.history && 'pushState' in window.history;\n}\n/**\n * Returns true if browser fires popstate on hash change.\n * IE10 and IE11 do not.\n */\n\nfunction supportsPopStateOnHashChange() {\n  return window.navigator.userAgent.indexOf('Trident') === -1;\n}\n/**\n * Returns false if using go(n) with hash history causes a full page reload.\n */\n\nfunction supportsGoWithoutReloadUsingHash() {\n  return window.navigator.userAgent.indexOf('Firefox') === -1;\n}\n/**\n * Returns true if a given popstate event is an extraneous WebKit event.\n * Accounts for the fact that Chrome on iOS fires real popstate events\n * containing undefined state when pressing the back button.\n */\n\nfunction isExtraneousPopstateEvent(event) {\n  return event.state === undefined && navigator.userAgent.indexOf('CriOS') === -1;\n}\n\nvar PopStateEvent = 'popstate';\nvar HashChangeEvent = 'hashchange';\n\nfunction getHistoryState() {\n  try {\n    return window.history.state || {};\n  } catch (e) {\n    // IE 11 sometimes throws when accessing window.history.state\n    // See https://github.com/ReactTraining/history/pull/289\n    return {};\n  }\n}\n/**\n * Creates a history object that uses the HTML5 history API including\n * pushState, replaceState, and the popstate event.\n */\n\n\nfunction createBrowserHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Browser history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canUseHistory = supportsHistory();\n  var needsHashChangeListener = !supportsPopStateOnHashChange();\n  var _props = props,\n      _props$forceRefresh = _props.forceRefresh,\n      forceRefresh = _props$forceRefresh === void 0 ? false : _props$forceRefresh,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n\n  function getDOMLocation(historyState) {\n    var _ref = historyState || {},\n        key = _ref.key,\n        state = _ref.state;\n\n    var _window$location = window.location,\n        pathname = _window$location.pathname,\n        search = _window$location.search,\n        hash = _window$location.hash;\n    var path = pathname + search + hash;\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path, state, key);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function handlePopState(event) {\n    // Ignore extraneous popstate events in WebKit.\n    if (isExtraneousPopstateEvent(event)) return;\n    handlePop(getDOMLocation(event.state));\n  }\n\n  function handleHashChange() {\n    handlePop(getDOMLocation(getHistoryState()));\n  }\n\n  var forceNextPop = false;\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of keys we've seen in sessionStorage.\n    // Instead, we just default to 0 for keys we don't know.\n\n    var toIndex = allKeys.indexOf(toLocation.key);\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allKeys.indexOf(fromLocation.key);\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  }\n\n  var initialLocation = getDOMLocation(getHistoryState());\n  var allKeys = [initialLocation.key]; // Public interface\n\n  function createHref(location) {\n    return basename + createPath(location);\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.pushState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.href = href;\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          var nextKeys = allKeys.slice(0, prevIndex + 1);\n          nextKeys.push(location.key);\n          allKeys = nextKeys;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot push state in browsers that do not support HTML5 history') : void 0;\n        window.location.href = href;\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var href = createHref(location);\n      var key = location.key,\n          state = location.state;\n\n      if (canUseHistory) {\n        globalHistory.replaceState({\n          key: key,\n          state: state\n        }, null, href);\n\n        if (forceRefresh) {\n          window.location.replace(href);\n        } else {\n          var prevIndex = allKeys.indexOf(history.location.key);\n          if (prevIndex !== -1) allKeys[prevIndex] = location.key;\n          setState({\n            action: action,\n            location: location\n          });\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Browser history cannot replace state in browsers that do not support HTML5 history') : void 0;\n        window.location.replace(href);\n      }\n    });\n  }\n\n  function go(n) {\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.addEventListener(HashChangeEvent, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(PopStateEvent, handlePopState);\n      if (needsHashChangeListener) window.removeEventListener(HashChangeEvent, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nvar HashChangeEvent$1 = 'hashchange';\nvar HashPathCoders = {\n  hashbang: {\n    encodePath: function encodePath(path) {\n      return path.charAt(0) === '!' ? path : '!/' + stripLeadingSlash(path);\n    },\n    decodePath: function decodePath(path) {\n      return path.charAt(0) === '!' ? path.substr(1) : path;\n    }\n  },\n  noslash: {\n    encodePath: stripLeadingSlash,\n    decodePath: addLeadingSlash\n  },\n  slash: {\n    encodePath: addLeadingSlash,\n    decodePath: addLeadingSlash\n  }\n};\n\nfunction stripHash(url) {\n  var hashIndex = url.indexOf('#');\n  return hashIndex === -1 ? url : url.slice(0, hashIndex);\n}\n\nfunction getHashPath() {\n  // We can't use window.location.hash here because it's not\n  // consistent across browsers - Firefox will pre-decode it!\n  var href = window.location.href;\n  var hashIndex = href.indexOf('#');\n  return hashIndex === -1 ? '' : href.substring(hashIndex + 1);\n}\n\nfunction pushHashPath(path) {\n  window.location.hash = path;\n}\n\nfunction replaceHashPath(path) {\n  window.location.replace(stripHash(window.location.href) + '#' + path);\n}\n\nfunction createHashHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  !canUseDOM ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Hash history needs a DOM') : invariant(false) : void 0;\n  var globalHistory = window.history;\n  var canGoWithoutReload = supportsGoWithoutReloadUsingHash();\n  var _props = props,\n      _props$getUserConfirm = _props.getUserConfirmation,\n      getUserConfirmation = _props$getUserConfirm === void 0 ? getConfirmation : _props$getUserConfirm,\n      _props$hashType = _props.hashType,\n      hashType = _props$hashType === void 0 ? 'slash' : _props$hashType;\n  var basename = props.basename ? stripTrailingSlash(addLeadingSlash(props.basename)) : '';\n  var _HashPathCoders$hashT = HashPathCoders[hashType],\n      encodePath = _HashPathCoders$hashT.encodePath,\n      decodePath = _HashPathCoders$hashT.decodePath;\n\n  function getDOMLocation() {\n    var path = decodePath(getHashPath());\n    process.env.NODE_ENV !== \"production\" ? warning(!basename || hasBasename(path, basename), 'You are attempting to use a basename on a page whose URL path does not begin ' + 'with the basename. Expected path \"' + path + '\" to begin with \"' + basename + '\".') : void 0;\n    if (basename) path = stripBasename(path, basename);\n    return createLocation(path);\n  }\n\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = globalHistory.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  var forceNextPop = false;\n  var ignorePath = null;\n\n  function locationsAreEqual$$1(a, b) {\n    return a.pathname === b.pathname && a.search === b.search && a.hash === b.hash;\n  }\n\n  function handleHashChange() {\n    var path = getHashPath();\n    var encodedPath = encodePath(path);\n\n    if (path !== encodedPath) {\n      // Ensure we always have a properly-encoded hash.\n      replaceHashPath(encodedPath);\n    } else {\n      var location = getDOMLocation();\n      var prevLocation = history.location;\n      if (!forceNextPop && locationsAreEqual$$1(prevLocation, location)) return; // A hashchange doesn't always == location change.\n\n      if (ignorePath === createPath(location)) return; // Ignore this change; we already setState in push/replace.\n\n      ignorePath = null;\n      handlePop(location);\n    }\n  }\n\n  function handlePop(location) {\n    if (forceNextPop) {\n      forceNextPop = false;\n      setState();\n    } else {\n      var action = 'POP';\n      transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n        if (ok) {\n          setState({\n            action: action,\n            location: location\n          });\n        } else {\n          revertPop(location);\n        }\n      });\n    }\n  }\n\n  function revertPop(fromLocation) {\n    var toLocation = history.location; // TODO: We could probably make this more reliable by\n    // keeping a list of paths we've seen in sessionStorage.\n    // Instead, we just default to 0 for paths we don't know.\n\n    var toIndex = allPaths.lastIndexOf(createPath(toLocation));\n    if (toIndex === -1) toIndex = 0;\n    var fromIndex = allPaths.lastIndexOf(createPath(fromLocation));\n    if (fromIndex === -1) fromIndex = 0;\n    var delta = toIndex - fromIndex;\n\n    if (delta) {\n      forceNextPop = true;\n      go(delta);\n    }\n  } // Ensure the hash is encoded properly before doing anything else.\n\n\n  var path = getHashPath();\n  var encodedPath = encodePath(path);\n  if (path !== encodedPath) replaceHashPath(encodedPath);\n  var initialLocation = getDOMLocation();\n  var allPaths = [createPath(initialLocation)]; // Public interface\n\n  function createHref(location) {\n    var baseTag = document.querySelector('base');\n    var href = '';\n\n    if (baseTag && baseTag.getAttribute('href')) {\n      href = stripHash(window.location.href);\n    }\n\n    return href + '#' + encodePath(basename + createPath(location));\n  }\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot push state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a PUSH, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        pushHashPath(encodedPath);\n        var prevIndex = allPaths.lastIndexOf(createPath(history.location));\n        var nextPaths = allPaths.slice(0, prevIndex + 1);\n        nextPaths.push(path);\n        allPaths = nextPaths;\n        setState({\n          action: action,\n          location: location\n        });\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(false, 'Hash history cannot PUSH the same path; a new entry will not be added to the history stack') : void 0;\n        setState();\n      }\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(state === undefined, 'Hash history cannot replace state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, undefined, undefined, history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var path = createPath(location);\n      var encodedPath = encodePath(basename + path);\n      var hashChanged = getHashPath() !== encodedPath;\n\n      if (hashChanged) {\n        // We cannot tell if a hashchange was caused by a REPLACE, so we'd\n        // rather setState here and ignore the hashchange. The caveat here\n        // is that other hash histories in the page will consider it a POP.\n        ignorePath = path;\n        replaceHashPath(encodedPath);\n      }\n\n      var prevIndex = allPaths.indexOf(createPath(history.location));\n      if (prevIndex !== -1) allPaths[prevIndex] = path;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    process.env.NODE_ENV !== \"production\" ? warning(canGoWithoutReload, 'Hash history go(n) causes a full page reload in this browser') : void 0;\n    globalHistory.go(n);\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  var listenerCount = 0;\n\n  function checkDOMListeners(delta) {\n    listenerCount += delta;\n\n    if (listenerCount === 1 && delta === 1) {\n      window.addEventListener(HashChangeEvent$1, handleHashChange);\n    } else if (listenerCount === 0) {\n      window.removeEventListener(HashChangeEvent$1, handleHashChange);\n    }\n  }\n\n  var isBlocked = false;\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    var unblock = transitionManager.setPrompt(prompt);\n\n    if (!isBlocked) {\n      checkDOMListeners(1);\n      isBlocked = true;\n    }\n\n    return function () {\n      if (isBlocked) {\n        isBlocked = false;\n        checkDOMListeners(-1);\n      }\n\n      return unblock();\n    };\n  }\n\n  function listen(listener) {\n    var unlisten = transitionManager.appendListener(listener);\n    checkDOMListeners(1);\n    return function () {\n      checkDOMListeners(-1);\n      unlisten();\n    };\n  }\n\n  var history = {\n    length: globalHistory.length,\n    action: 'POP',\n    location: initialLocation,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nfunction clamp(n, lowerBound, upperBound) {\n  return Math.min(Math.max(n, lowerBound), upperBound);\n}\n/**\n * Creates a history object that stores locations in memory.\n */\n\n\nfunction createMemoryHistory(props) {\n  if (props === void 0) {\n    props = {};\n  }\n\n  var _props = props,\n      getUserConfirmation = _props.getUserConfirmation,\n      _props$initialEntries = _props.initialEntries,\n      initialEntries = _props$initialEntries === void 0 ? ['/'] : _props$initialEntries,\n      _props$initialIndex = _props.initialIndex,\n      initialIndex = _props$initialIndex === void 0 ? 0 : _props$initialIndex,\n      _props$keyLength = _props.keyLength,\n      keyLength = _props$keyLength === void 0 ? 6 : _props$keyLength;\n  var transitionManager = createTransitionManager();\n\n  function setState(nextState) {\n    _extends(history, nextState);\n\n    history.length = history.entries.length;\n    transitionManager.notifyListeners(history.location, history.action);\n  }\n\n  function createKey() {\n    return Math.random().toString(36).substr(2, keyLength);\n  }\n\n  var index = clamp(initialIndex, 0, initialEntries.length - 1);\n  var entries = initialEntries.map(function (entry) {\n    return typeof entry === 'string' ? createLocation(entry, undefined, createKey()) : createLocation(entry, undefined, entry.key || createKey());\n  }); // Public interface\n\n  var createHref = createPath;\n\n  function push(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to push when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'PUSH';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      var prevIndex = history.index;\n      var nextIndex = prevIndex + 1;\n      var nextEntries = history.entries.slice(0);\n\n      if (nextEntries.length > nextIndex) {\n        nextEntries.splice(nextIndex, nextEntries.length - nextIndex, location);\n      } else {\n        nextEntries.push(location);\n      }\n\n      setState({\n        action: action,\n        location: location,\n        index: nextIndex,\n        entries: nextEntries\n      });\n    });\n  }\n\n  function replace(path, state) {\n    process.env.NODE_ENV !== \"production\" ? warning(!(typeof path === 'object' && path.state !== undefined && state !== undefined), 'You should avoid providing a 2nd state argument to replace when the 1st ' + 'argument is a location-like object that already has state; it is ignored') : void 0;\n    var action = 'REPLACE';\n    var location = createLocation(path, state, createKey(), history.location);\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (!ok) return;\n      history.entries[history.index] = location;\n      setState({\n        action: action,\n        location: location\n      });\n    });\n  }\n\n  function go(n) {\n    var nextIndex = clamp(history.index + n, 0, history.entries.length - 1);\n    var action = 'POP';\n    var location = history.entries[nextIndex];\n    transitionManager.confirmTransitionTo(location, action, getUserConfirmation, function (ok) {\n      if (ok) {\n        setState({\n          action: action,\n          location: location,\n          index: nextIndex\n        });\n      } else {\n        // Mimic the behavior of DOM histories by\n        // causing a render after a cancelled POP.\n        setState();\n      }\n    });\n  }\n\n  function goBack() {\n    go(-1);\n  }\n\n  function goForward() {\n    go(1);\n  }\n\n  function canGo(n) {\n    var nextIndex = history.index + n;\n    return nextIndex >= 0 && nextIndex < history.entries.length;\n  }\n\n  function block(prompt) {\n    if (prompt === void 0) {\n      prompt = false;\n    }\n\n    return transitionManager.setPrompt(prompt);\n  }\n\n  function listen(listener) {\n    return transitionManager.appendListener(listener);\n  }\n\n  var history = {\n    length: entries.length,\n    action: 'POP',\n    location: entries[index],\n    index: index,\n    entries: entries,\n    createHref: createHref,\n    push: push,\n    replace: replace,\n    go: go,\n    goBack: goBack,\n    goForward: goForward,\n    canGo: canGo,\n    block: block,\n    listen: listen\n  };\n  return history;\n}\n\nexport { createBrowserHistory, createHashHistory, createMemoryHistory, createLocation, locationsAreEqual, parsePath, createPath };\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextType: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDefaultProps: true,\n  getDerivedStateFromError: true,\n  getDerivedStateFromProps: true,\n  mixins: true,\n  propTypes: true,\n  type: true\n};\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\nvar FORWARD_REF_STATICS = {\n  '$$typeof': true,\n  render: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true\n};\nvar MEMO_STATICS = {\n  '$$typeof': true,\n  compare: true,\n  defaultProps: true,\n  displayName: true,\n  propTypes: true,\n  type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n  // React v16.11 and below\n  if (reactIs.isMemo(component)) {\n    return MEMO_STATICS;\n  } // React v16.12 and above\n\n\n  return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n    if (objectPrototype) {\n      var inheritedComponent = getPrototypeOf(sourceComponent);\n\n      if (inheritedComponent && inheritedComponent !== objectPrototype) {\n        hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n      }\n    }\n\n    var keys = getOwnPropertyNames(sourceComponent);\n\n    if (getOwnPropertySymbols) {\n      keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n    }\n\n    var targetStatics = getStatics(targetComponent);\n    var sourceStatics = getStatics(sourceComponent);\n\n    for (var i = 0; i < keys.length; ++i) {\n      var key = keys[i];\n\n      if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n        var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        try {\n          // Avoid failures from read-only properties\n          defineProperty(targetComponent, key, descriptor);\n        } catch (e) {}\n      }\n    }\n  }\n\n  return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n","/**\r\n * Returns the object type of the given payload\r\n *\r\n * @param {*} payload\r\n * @returns {string}\r\n */\r\nfunction getType(payload) {\r\n    return Object.prototype.toString.call(payload).slice(8, -1);\r\n}\r\n/**\r\n * Returns whether the payload is undefined\r\n *\r\n * @param {*} payload\r\n * @returns {payload is undefined}\r\n */\r\nfunction isUndefined(payload) {\r\n    return getType(payload) === 'Undefined';\r\n}\r\n/**\r\n * Returns whether the payload is null\r\n *\r\n * @param {*} payload\r\n * @returns {payload is null}\r\n */\r\nfunction isNull(payload) {\r\n    return getType(payload) === 'Null';\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record<string, any>}\r\n */\r\nfunction isPlainObject(payload) {\r\n    if (getType(payload) !== 'Object')\r\n        return false;\r\n    return payload.constructor === Object && Object.getPrototypeOf(payload) === Object.prototype;\r\n}\r\n/**\r\n * Returns whether the payload is a plain JavaScript object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record<string, any>}\r\n */\r\nfunction isObject(payload) {\r\n    return isPlainObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a an empty object (excluding special classes or objects with other prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is { [K in any]: never }}\r\n */\r\nfunction isEmptyObject(payload) {\r\n    return isPlainObject(payload) && Object.keys(payload).length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is an any kind of object (including special classes or objects with different prototypes)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Record<string, any>}\r\n */\r\nfunction isAnyObject(payload) {\r\n    return getType(payload) === 'Object';\r\n}\r\n/**\r\n * Returns whether the payload is an object like a type passed in < >\r\n *\r\n * Usage: isObjectLike<{id: any}>(payload) // will make sure it's an object and has an `id` prop.\r\n *\r\n * @template T this must be passed in < >\r\n * @param {*} payload\r\n * @returns {payload is T}\r\n */\r\nfunction isObjectLike(payload) {\r\n    return isAnyObject(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a function\r\n *\r\n * @param {*} payload\r\n * @returns {payload is AnyFunction}\r\n */\r\nfunction isFunction(payload) {\r\n    return getType(payload) === 'Function';\r\n}\r\n/**\r\n * Returns whether the payload is an array\r\n *\r\n * @param {any} payload\r\n * @returns {payload is any[]}\r\n */\r\nfunction isArray(payload) {\r\n    return getType(payload) === 'Array';\r\n}\r\n/**\r\n * Returns whether the payload is a an empty array\r\n *\r\n * @param {*} payload\r\n * @returns {payload is []}\r\n */\r\nfunction isEmptyArray(payload) {\r\n    return isArray(payload) && payload.length === 0;\r\n}\r\n/**\r\n * Returns whether the payload is a string\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isString(payload) {\r\n    return getType(payload) === 'String';\r\n}\r\n/**\r\n * Returns whether the payload is a string, BUT returns false for ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isFullString(payload) {\r\n    return isString(payload) && payload !== '';\r\n}\r\n/**\r\n * Returns whether the payload is ''\r\n *\r\n * @param {*} payload\r\n * @returns {payload is string}\r\n */\r\nfunction isEmptyString(payload) {\r\n    return payload === '';\r\n}\r\n/**\r\n * Returns whether the payload is a number (but not NaN)\r\n *\r\n * This will return `false` for `NaN`!!\r\n *\r\n * @param {*} payload\r\n * @returns {payload is number}\r\n */\r\nfunction isNumber(payload) {\r\n    return getType(payload) === 'Number' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a boolean\r\n *\r\n * @param {*} payload\r\n * @returns {payload is boolean}\r\n */\r\nfunction isBoolean(payload) {\r\n    return getType(payload) === 'Boolean';\r\n}\r\n/**\r\n * Returns whether the payload is a regular expression (RegExp)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is RegExp}\r\n */\r\nfunction isRegExp(payload) {\r\n    return getType(payload) === 'RegExp';\r\n}\r\n/**\r\n * Returns whether the payload is a Map\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Map<any, any>}\r\n */\r\nfunction isMap(payload) {\r\n    return getType(payload) === 'Map';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakMap\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakMap<any, any>}\r\n */\r\nfunction isWeakMap(payload) {\r\n    return getType(payload) === 'WeakMap';\r\n}\r\n/**\r\n * Returns whether the payload is a Set\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Set<any>}\r\n */\r\nfunction isSet(payload) {\r\n    return getType(payload) === 'Set';\r\n}\r\n/**\r\n * Returns whether the payload is a WeakSet\r\n *\r\n * @param {*} payload\r\n * @returns {payload is WeakSet<any>}\r\n */\r\nfunction isWeakSet(payload) {\r\n    return getType(payload) === 'WeakSet';\r\n}\r\n/**\r\n * Returns whether the payload is a Symbol\r\n *\r\n * @param {*} payload\r\n * @returns {payload is symbol}\r\n */\r\nfunction isSymbol(payload) {\r\n    return getType(payload) === 'Symbol';\r\n}\r\n/**\r\n * Returns whether the payload is a Date, and that the date is valid\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Date}\r\n */\r\nfunction isDate(payload) {\r\n    return getType(payload) === 'Date' && !isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a Blob\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Blob}\r\n */\r\nfunction isBlob(payload) {\r\n    return getType(payload) === 'Blob';\r\n}\r\n/**\r\n * Returns whether the payload is a File\r\n *\r\n * @param {*} payload\r\n * @returns {payload is File}\r\n */\r\nfunction isFile(payload) {\r\n    return getType(payload) === 'File';\r\n}\r\n/**\r\n * Returns whether the payload is a Promise\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Promise<any>}\r\n */\r\nfunction isPromise(payload) {\r\n    return getType(payload) === 'Promise';\r\n}\r\n/**\r\n * Returns whether the payload is an Error\r\n *\r\n * @param {*} payload\r\n * @returns {payload is Error}\r\n */\r\nfunction isError(payload) {\r\n    return getType(payload) === 'Error';\r\n}\r\n/**\r\n * Returns whether the payload is literally the value `NaN` (it's `NaN` and also a `number`)\r\n *\r\n * @param {*} payload\r\n * @returns {payload is typeof NaN}\r\n */\r\nfunction isNaNValue(payload) {\r\n    return getType(payload) === 'Number' && isNaN(payload);\r\n}\r\n/**\r\n * Returns whether the payload is a primitive type (eg. Boolean | Null | Undefined | Number | String | Symbol)\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is boolean | null | undefined | number | string | symbol)}\r\n */\r\nfunction isPrimitive(payload) {\r\n    return (isBoolean(payload) ||\r\n        isNull(payload) ||\r\n        isUndefined(payload) ||\r\n        isNumber(payload) ||\r\n        isString(payload) ||\r\n        isSymbol(payload));\r\n}\r\n/**\r\n * Returns true whether the payload is null or undefined\r\n *\r\n * @param {*} payload\r\n * @returns {(payload is null | undefined)}\r\n */\r\nfunction isNullOrUndefined(payload) {\r\n    return isNull(payload) || isUndefined(payload);\r\n}\r\n/**\r\n * Does a generic check to check that the given payload is of a given type.\r\n * In cases like Number, it will return true for NaN as NaN is a Number (thanks javascript!);\r\n * It will, however, differentiate between object and null\r\n *\r\n * @template T\r\n * @param {*} payload\r\n * @param {T} type\r\n * @throws {TypeError} Will throw type error if type is an invalid type\r\n * @returns {payload is T}\r\n */\r\nfunction isType(payload, type) {\r\n    if (!(type instanceof Function)) {\r\n        throw new TypeError('Type must be a function');\r\n    }\r\n    if (!Object.prototype.hasOwnProperty.call(type, 'prototype')) {\r\n        throw new TypeError('Type is not a class');\r\n    }\r\n    // Classes usually have names (as functions usually have names)\r\n    var name = type.name;\r\n    return getType(payload) === name || Boolean(payload && payload.constructor === type);\r\n}\n\nexport { getType, isAnyObject, isArray, isBlob, isBoolean, isDate, isEmptyArray, isEmptyObject, isEmptyString, isError, isFile, isFullString, isFunction, isMap, isNaNValue, isNull, isNullOrUndefined, isNumber, isObject, isObjectLike, isPlainObject, isPrimitive, isPromise, isRegExp, isSet, isString, isSymbol, isType, isUndefined, isWeakMap, isWeakSet };\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.loop = exports.conditional = exports.parse = void 0;\n\nvar parse = function parse(stream, schema) {\n  var result = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var parent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : result;\n\n  if (Array.isArray(schema)) {\n    schema.forEach(function (partSchema) {\n      return parse(stream, partSchema, result, parent);\n    });\n  } else if (typeof schema === 'function') {\n    schema(stream, result, parent, parse);\n  } else {\n    var key = Object.keys(schema)[0];\n\n    if (Array.isArray(schema[key])) {\n      parent[key] = {};\n      parse(stream, schema[key], result, parent[key]);\n    } else {\n      parent[key] = schema[key](stream, result, parent, parse);\n    }\n  }\n\n  return result;\n};\n\nexports.parse = parse;\n\nvar conditional = function conditional(schema, conditionFunc) {\n  return function (stream, result, parent, parse) {\n    if (conditionFunc(stream, result, parent)) {\n      parse(stream, schema, result, parent);\n    }\n  };\n};\n\nexports.conditional = conditional;\n\nvar loop = function loop(schema, continueFunc) {\n  return function (stream, result, parent, parse) {\n    var arr = [];\n    var lastStreamPos = stream.pos;\n\n    while (continueFunc(stream, result, parent)) {\n      var newParent = {};\n      parse(stream, schema, result, newParent); // cases when whole file is parsed but no termination is there and stream position is not getting updated as well\n      // it falls into infinite recursion, null check to avoid the same\n\n      if (stream.pos === lastStreamPos) {\n        break;\n      }\n\n      lastStreamPos = stream.pos;\n      arr.push(newParent);\n    }\n\n    return arr;\n  };\n};\n\nexports.loop = loop;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.readBits = exports.readArray = exports.readUnsigned = exports.readString = exports.peekBytes = exports.readBytes = exports.peekByte = exports.readByte = exports.buildStream = void 0;\n\n// Default stream and parsers for Uint8TypedArray data type\nvar buildStream = function buildStream(uint8Data) {\n  return {\n    data: uint8Data,\n    pos: 0\n  };\n};\n\nexports.buildStream = buildStream;\n\nvar readByte = function readByte() {\n  return function (stream) {\n    return stream.data[stream.pos++];\n  };\n};\n\nexports.readByte = readByte;\n\nvar peekByte = function peekByte() {\n  var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n  return function (stream) {\n    return stream.data[stream.pos + offset];\n  };\n};\n\nexports.peekByte = peekByte;\n\nvar readBytes = function readBytes(length) {\n  return function (stream) {\n    return stream.data.subarray(stream.pos, stream.pos += length);\n  };\n};\n\nexports.readBytes = readBytes;\n\nvar peekBytes = function peekBytes(length) {\n  return function (stream) {\n    return stream.data.subarray(stream.pos, stream.pos + length);\n  };\n};\n\nexports.peekBytes = peekBytes;\n\nvar readString = function readString(length) {\n  return function (stream) {\n    return Array.from(readBytes(length)(stream)).map(function (value) {\n      return String.fromCharCode(value);\n    }).join('');\n  };\n};\n\nexports.readString = readString;\n\nvar readUnsigned = function readUnsigned(littleEndian) {\n  return function (stream) {\n    var bytes = readBytes(2)(stream);\n    return littleEndian ? (bytes[1] << 8) + bytes[0] : (bytes[0] << 8) + bytes[1];\n  };\n};\n\nexports.readUnsigned = readUnsigned;\n\nvar readArray = function readArray(byteSize, totalOrFunc) {\n  return function (stream, result, parent) {\n    var total = typeof totalOrFunc === 'function' ? totalOrFunc(stream, result, parent) : totalOrFunc;\n    var parser = readBytes(byteSize);\n    var arr = new Array(total);\n\n    for (var i = 0; i < total; i++) {\n      arr[i] = parser(stream);\n    }\n\n    return arr;\n  };\n};\n\nexports.readArray = readArray;\n\nvar subBitsTotal = function subBitsTotal(bits, startIndex, length) {\n  var result = 0;\n\n  for (var i = 0; i < length; i++) {\n    result += bits[startIndex + i] && Math.pow(2, length - i - 1);\n  }\n\n  return result;\n};\n\nvar readBits = function readBits(schema) {\n  return function (stream) {\n    var _byte = readByte()(stream); // convert the byte to bit array\n\n\n    var bits = new Array(8);\n\n    for (var i = 0; i < 8; i++) {\n      bits[7 - i] = !!(_byte & 1 << i);\n    } // convert the bit array to values based on the schema\n\n\n    return Object.keys(schema).reduce(function (res, key) {\n      var def = schema[key];\n\n      if (def.length) {\n        res[key] = subBitsTotal(bits, def.index, def.length);\n      } else {\n        res[key] = bits[def.index];\n      }\n\n      return res;\n    }, {});\n  };\n};\n\nexports.readBits = readBits;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports[\"default\"] = void 0;\n\nvar _ = require(\"../\");\n\nvar _uint = require(\"../parsers/uint8\");\n\n// a set of 0x00 terminated subblocks\nvar subBlocksSchema = {\n  blocks: function blocks(stream) {\n    var terminator = 0x00;\n    var chunks = [];\n    var streamSize = stream.data.length;\n    var total = 0;\n\n    for (var size = (0, _uint.readByte)()(stream); size !== terminator; size = (0, _uint.readByte)()(stream)) {\n      // size becomes undefined for some case when file is corrupted and  terminator is not proper \n      // null check to avoid recursion\n      if (!size) break; // catch corrupted files with no terminator\n\n      if (stream.pos + size >= streamSize) {\n        var availableSize = streamSize - stream.pos;\n        chunks.push((0, _uint.readBytes)(availableSize)(stream));\n        total += availableSize;\n        break;\n      }\n\n      chunks.push((0, _uint.readBytes)(size)(stream));\n      total += size;\n    }\n\n    var result = new Uint8Array(total);\n    var offset = 0;\n\n    for (var i = 0; i < chunks.length; i++) {\n      result.set(chunks[i], offset);\n      offset += chunks[i].length;\n    }\n\n    return result;\n  }\n}; // global control extension\n\nvar gceSchema = (0, _.conditional)({\n  gce: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    byteSize: (0, _uint.readByte)()\n  }, {\n    extras: (0, _uint.readBits)({\n      future: {\n        index: 0,\n        length: 3\n      },\n      disposal: {\n        index: 3,\n        length: 3\n      },\n      userInput: {\n        index: 6\n      },\n      transparentColorGiven: {\n        index: 7\n      }\n    })\n  }, {\n    delay: (0, _uint.readUnsigned)(true)\n  }, {\n    transparentColorIndex: (0, _uint.readByte)()\n  }, {\n    terminator: (0, _uint.readByte)()\n  }]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xf9;\n}); // image pipeline block\n\nvar imageSchema = (0, _.conditional)({\n  image: [{\n    code: (0, _uint.readByte)()\n  }, {\n    descriptor: [{\n      left: (0, _uint.readUnsigned)(true)\n    }, {\n      top: (0, _uint.readUnsigned)(true)\n    }, {\n      width: (0, _uint.readUnsigned)(true)\n    }, {\n      height: (0, _uint.readUnsigned)(true)\n    }, {\n      lct: (0, _uint.readBits)({\n        exists: {\n          index: 0\n        },\n        interlaced: {\n          index: 1\n        },\n        sort: {\n          index: 2\n        },\n        future: {\n          index: 3,\n          length: 2\n        },\n        size: {\n          index: 5,\n          length: 3\n        }\n      })\n    }]\n  }, (0, _.conditional)({\n    lct: (0, _uint.readArray)(3, function (stream, result, parent) {\n      return Math.pow(2, parent.descriptor.lct.size + 1);\n    })\n  }, function (stream, result, parent) {\n    return parent.descriptor.lct.exists;\n  }), {\n    data: [{\n      minCodeSize: (0, _uint.readByte)()\n    }, subBlocksSchema]\n  }]\n}, function (stream) {\n  return (0, _uint.peekByte)()(stream) === 0x2c;\n}); // plain text block\n\nvar textSchema = (0, _.conditional)({\n  text: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    blockSize: (0, _uint.readByte)()\n  }, {\n    preData: function preData(stream, result, parent) {\n      return (0, _uint.readBytes)(parent.text.blockSize)(stream);\n    }\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0x01;\n}); // application block\n\nvar applicationSchema = (0, _.conditional)({\n  application: [{\n    codes: (0, _uint.readBytes)(2)\n  }, {\n    blockSize: (0, _uint.readByte)()\n  }, {\n    id: function id(stream, result, parent) {\n      return (0, _uint.readString)(parent.blockSize)(stream);\n    }\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xff;\n}); // comment block\n\nvar commentSchema = (0, _.conditional)({\n  comment: [{\n    codes: (0, _uint.readBytes)(2)\n  }, subBlocksSchema]\n}, function (stream) {\n  var codes = (0, _uint.peekBytes)(2)(stream);\n  return codes[0] === 0x21 && codes[1] === 0xfe;\n});\nvar schema = [{\n  header: [{\n    signature: (0, _uint.readString)(3)\n  }, {\n    version: (0, _uint.readString)(3)\n  }]\n}, {\n  lsd: [{\n    width: (0, _uint.readUnsigned)(true)\n  }, {\n    height: (0, _uint.readUnsigned)(true)\n  }, {\n    gct: (0, _uint.readBits)({\n      exists: {\n        index: 0\n      },\n      resolution: {\n        index: 1,\n        length: 3\n      },\n      sort: {\n        index: 4\n      },\n      size: {\n        index: 5,\n        length: 3\n      }\n    })\n  }, {\n    backgroundColorIndex: (0, _uint.readByte)()\n  }, {\n    pixelAspectRatio: (0, _uint.readByte)()\n  }]\n}, (0, _.conditional)({\n  gct: (0, _uint.readArray)(3, function (stream, result) {\n    return Math.pow(2, result.lsd.gct.size + 1);\n  })\n}, function (stream, result) {\n  return result.lsd.gct.exists;\n}), // content frames\n{\n  frames: (0, _.loop)([gceSchema, applicationSchema, commentSchema, imageSchema, textSchema], function (stream) {\n    var nextCode = (0, _uint.peekByte)()(stream); // rather than check for a terminator, we should check for the existence\n    // of an ext or image block to avoid infinite loops\n    //var terminator = 0x3B;\n    //return nextCode !== terminator;\n\n    return nextCode === 0x21 || nextCode === 0x2c;\n  })\n}];\nvar _default = schema;\nexports[\"default\"] = _default;","/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n","function areInputsEqual(newInputs, lastInputs) {\n    if (newInputs.length !== lastInputs.length) {\n        return false;\n    }\n    for (var i = 0; i < newInputs.length; i++) {\n        if (newInputs[i] !== lastInputs[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n    if (isEqual === void 0) { isEqual = areInputsEqual; }\n    var lastThis;\n    var lastArgs = [];\n    var lastResult;\n    var calledOnce = false;\n    function memoized() {\n        var newArgs = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            newArgs[_i] = arguments[_i];\n        }\n        if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) {\n            return lastResult;\n        }\n        lastResult = resultFn.apply(this, newArgs);\n        calledOnce = true;\n        lastThis = this;\n        lastArgs = newArgs;\n        return lastResult;\n    }\n    return memoized;\n}\n\nexport default memoizeOne;\n","import { isPlainObject, isArray, isSymbol } from 'is-what';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\n\nfunction assignProp(carry, key, newVal, originalObject) {\r\n    var propType = originalObject.propertyIsEnumerable(key)\r\n        ? 'enumerable'\r\n        : 'nonenumerable';\r\n    if (propType === 'enumerable')\r\n        carry[key] = newVal;\r\n    if (propType === 'nonenumerable') {\r\n        Object.defineProperty(carry, key, {\r\n            value: newVal,\r\n            enumerable: false,\r\n            writable: true,\r\n            configurable: true\r\n        });\r\n    }\r\n}\r\nfunction mergeRecursively(origin, newComer, extensions) {\r\n    // work directly on newComer if its not an object\r\n    if (!isPlainObject(newComer)) {\r\n        // extend merge rules\r\n        if (extensions && isArray(extensions)) {\r\n            extensions.forEach(function (extend) {\r\n                newComer = extend(origin, newComer);\r\n            });\r\n        }\r\n        return newComer;\r\n    }\r\n    // define newObject to merge all values upon\r\n    var newObject = {};\r\n    if (isPlainObject(origin)) {\r\n        var props_1 = Object.getOwnPropertyNames(origin);\r\n        var symbols_1 = Object.getOwnPropertySymbols(origin);\r\n        newObject = __spreadArrays(props_1, symbols_1).reduce(function (carry, key) {\r\n            // @ts-ignore\r\n            var targetVal = origin[key];\r\n            if ((!isSymbol(key) && !Object.getOwnPropertyNames(newComer).includes(key)) ||\r\n                (isSymbol(key) && !Object.getOwnPropertySymbols(newComer).includes(key))) {\r\n                assignProp(carry, key, targetVal, origin);\r\n            }\r\n            return carry;\r\n        }, {});\r\n    }\r\n    var props = Object.getOwnPropertyNames(newComer);\r\n    var symbols = Object.getOwnPropertySymbols(newComer);\r\n    var result = __spreadArrays(props, symbols).reduce(function (carry, key) {\r\n        // re-define the origin and newComer as targetVal and newVal\r\n        var newVal = newComer[key];\r\n        var targetVal = (isPlainObject(origin))\r\n            // @ts-ignore\r\n            ? origin[key]\r\n            : undefined;\r\n        // extend merge rules\r\n        if (extensions && isArray(extensions)) {\r\n            extensions.forEach(function (extend) {\r\n                newVal = extend(targetVal, newVal);\r\n            });\r\n        }\r\n        // When newVal is an object do the merge recursively\r\n        if (targetVal !== undefined && isPlainObject(newVal)) {\r\n            newVal = mergeRecursively(targetVal, newVal, extensions);\r\n        }\r\n        assignProp(carry, key, newVal, newComer);\r\n        return carry;\r\n    }, newObject);\r\n    return result;\r\n}\r\n/**\r\n * Merge anything recursively.\r\n * Objects get merged, special objects (classes etc.) are re-assigned \"as is\".\r\n * Basic types overwrite objects or other basic types.\r\n *\r\n * @param {(IConfig | any)} origin\r\n * @param {...any[]} newComers\r\n * @returns the result\r\n */\r\nfunction merge(origin) {\r\n    var newComers = [];\r\n    for (var _i = 1; _i < arguments.length; _i++) {\r\n        newComers[_i - 1] = arguments[_i];\r\n    }\r\n    var extensions = null;\r\n    var base = origin;\r\n    if (isPlainObject(origin) && origin.extensions && Object.keys(origin).length === 1) {\r\n        base = {};\r\n        extensions = origin.extensions;\r\n    }\r\n    return newComers.reduce(function (result, newComer) {\r\n        return mergeRecursively(result, newComer, extensions);\r\n    }, base);\r\n}\n\nfunction concatArrays(originVal, newVal) {\r\n    if (isArray(originVal) && isArray(newVal)) {\r\n        // concat logic\r\n        return originVal.concat(newVal);\r\n    }\r\n    return newVal; // always return newVal as fallback!!\r\n}\n\nexport default merge;\nexport { concatArrays, merge };\n","// extracted by mini-css-extract-plugin\nexport var aquamarine = \"#709FFF\";\nexport var bubbleGum = \"#FFECE9\";\nexport var charcoal = \"#101B21\";\nexport var citrine = \"#FF9548\";\nexport var citrineWebText = \"#C75300\";\nexport var cloud = \"#B9BCBF\";\nexport var coin = \"#92959B\";\nexport var cottonCandy = \"#E2ECFF\";\nexport var emerald = \"#66DB86\";\nexport var emeraldWebText = \"#20883C\";\nexport var eviteGreen = \"#28A842\";\nexport var feedbackError = \"#FF6348\";\nexport var feedbackErrorBg = \"#FFECE9\";\nexport var feedbackErrorSubtle = \"#FFECE9\";\nexport var feedbackInformation = \"#709FFF\";\nexport var feedbackInformationBg = \"#E2ECFF\";\nexport var feedbackInformationSuble = \"#E2ECFF\";\nexport var feedbackMaybe = \"#FF9548\";\nexport var feedbackNo = \"#E092FF\";\nexport var feedbackNoReply = \"#B9BCBF\";\nexport var feedbackSuccess = \"#66DB86\";\nexport var feedbackSuccessBg = \"#E3FBE4\";\nexport var feedbackSuccessSubtle = \"#E3FBE4\";\nexport var feedbackWarning = \"#FF9548\";\nexport var feedbackWarningBg = \"#FFF5ED\";\nexport var feedbackWarningSubtle = \"#FFF5ED\";\nexport var feedbackYes = \"#66DB86\";\nexport var fog = \"#F5F5F7\";\nexport var formBorderDisabled = \"#92959B\";\nexport var ghost = \"#FFFFFF\";\nexport var largeAndUp = \"calc(80rem - 0.1rem)\";\nexport var largishAndUp = \"calc(61.876rem - 0.1rem)\";\nexport var lavender = \"#EBEAFD\";\nexport var linen = \"#F5F3F2\";\nexport var link = \"#5352EB\";\nexport var linkColor = \"#5352EB\";\nexport var linkHoverColor = \"#5352EB\";\nexport var mediumAndUp = \"calc(48rem - 0.1rem)\";\nexport var menuHover = \"rgba(106, 110, 113, 0.2)\";\nexport var mexicanOpal = \"#FF6348\";\nexport var mexicanOpalWebText = \"#D62000\";\nexport var mintChip = \"#E3FBE4\";\nexport var pebble = \"#6A6E71\";\nexport var popoverColor = \"#6A6E71\";\nexport var popoverTextColor = \"#FFFFFF\";\nexport var rose = \"#E092FF\";\nexport var roseWebText = \"#C10097\";\nexport var rsvpMaybe = \"#FF9548\";\nexport var rsvpNo = \"#E092FF\";\nexport var rsvpYes = \"#66DB86\";\nexport var shadow = \"#2E3136\";\nexport var silver = \"#E1E3E6\";\nexport var smallAndUp = \"calc(31.25rem - 0.1rem)\";\nexport var spacingLg = \"clamp(2.5rem, 11vw, 5rem)\";\nexport var spacingMd = \"clamp(1.5rem, 5vw, 3rem)\";\nexport var spacingSm = \"clamp(1rem, 3vw, 1.5rem)\";\nexport var tanzanite = \"#5352EB\";\nexport var tanzaniteWebText = \"#2424E5\";\nexport var tigersEye = \"#CA6E2E\";\nexport var tooltipColor = \"#E2ECFF\";\nexport var tooltipTextColor = \"#101B21\";\nexport var vanilla = \"#FFF5ED\";\nexport var waffle = \"#F4E2D5\";\nexport var white = \"#FFFFFF\";","// extracted by mini-css-extract-plugin\nexport var appleColor = \"#2E3136\";\nexport var darkBlue = \"#0093BF\";\nexport var darkMagenta = \"#E8407B\";\nexport var darkOrange = \"#ED702D\";\nexport var darkPurple = \"#9D52B0\";\nexport var darkTeal = \"#00A6A0\";\nexport var eviteBlue = \"#00A0D1\";\nexport var eviteGold = \"#FCB03E\";\nexport var eviteGreen = \"#28A842\";\nexport var eviteGreenDark = \"#248538\";\nexport var eviteMagenta = \"#FF6998\";\nexport var eviteOrange = \"#FF7C36\";\nexport var evitePurple = \"#B86BC9\";\nexport var eviteTeal = \"#18CCC6\";\nexport var facebookColor = \"#3B5998\";\nexport var googleColor = \"#b31412\";\nexport var gray2 = \"#E1E3E6\";\nexport var gray3 = \"#B9BCBF\";\nexport var gray4 = \"#92959B\";\nexport var gray5 = \"#6A6E71\";\nexport var gray6 = \"#2E3136\";\nexport var linkColor = \"#00A0D1\";\nexport var linkHoverColor = \"#0093BF\";\nexport var maybeGold = \"#FAAF4A\";\nexport var paleBlue = \"#57BBE3\";\nexport var paleBlueLight = \"#A7E7FE\";\nexport var rsvpMaybe = \"#FAAF4A\";\nexport var rsvpNo = \"#E8407B\";\nexport var rsvpYes = \"#28A842\";\nexport var twitterColor = \"#1DA1F2\";\nexport var white = \"#FFFFFF\";","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bigint: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n  var ReactIs = require('react-is');\n\n  // By explicitly using `prop-types` you are opting into new development behavior.\n  // http://fb.me/prop-types-in-prod\n  var throwOnDirectAccess = true;\n  module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","var autoAdjustOverflow = {\n  adjustX: 1,\n  adjustY: 1\n};\nvar targetOffset = [0, 0];\nexport var placements = {\n  left: {\n    points: ['cr', 'cl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  },\n  right: {\n    points: ['cl', 'cr'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  top: {\n    points: ['bc', 'tc'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  bottom: {\n    points: ['tc', 'bc'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  topLeft: {\n    points: ['bl', 'tl'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  leftTop: {\n    points: ['tr', 'tl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  },\n  topRight: {\n    points: ['br', 'tr'],\n    overflow: autoAdjustOverflow,\n    offset: [0, -4],\n    targetOffset: targetOffset\n  },\n  rightTop: {\n    points: ['tl', 'tr'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  bottomRight: {\n    points: ['tr', 'br'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  rightBottom: {\n    points: ['bl', 'br'],\n    overflow: autoAdjustOverflow,\n    offset: [4, 0],\n    targetOffset: targetOffset\n  },\n  bottomLeft: {\n    points: ['tl', 'bl'],\n    overflow: autoAdjustOverflow,\n    offset: [0, 4],\n    targetOffset: targetOffset\n  },\n  leftBottom: {\n    points: ['br', 'bl'],\n    overflow: autoAdjustOverflow,\n    offset: [-4, 0],\n    targetOffset: targetOffset\n  }\n};\nexport default placements;","import * as React from 'react';\nimport classNames from 'classnames';\nexport default function Popup(props) {\n  var showArrow = props.showArrow,\n      arrowContent = props.arrowContent,\n      children = props.children,\n      prefixCls = props.prefixCls,\n      id = props.id,\n      overlayInnerStyle = props.overlayInnerStyle,\n      className = props.className,\n      style = props.style;\n  return /*#__PURE__*/React.createElement(\"div\", {\n    className: classNames(\"\".concat(prefixCls, \"-content\"), className),\n    style: style\n  }, showArrow !== false && /*#__PURE__*/React.createElement(\"div\", {\n    className: \"\".concat(prefixCls, \"-arrow\"),\n    key: \"arrow\"\n  }, arrowContent), /*#__PURE__*/React.createElement(\"div\", {\n    className: \"\".concat(prefixCls, \"-inner\"),\n    id: id,\n    role: \"tooltip\",\n    style: overlayInnerStyle\n  }, typeof children === 'function' ? children() : children));\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport * as React from 'react';\nimport { useRef, useImperativeHandle, forwardRef } from 'react';\nimport Trigger from 'rc-trigger';\nimport { placements } from './placements';\nimport Popup from './Popup';\n\nvar Tooltip = function Tooltip(props, ref) {\n  var overlayClassName = props.overlayClassName,\n      _props$trigger = props.trigger,\n      trigger = _props$trigger === void 0 ? ['hover'] : _props$trigger,\n      _props$mouseEnterDela = props.mouseEnterDelay,\n      mouseEnterDelay = _props$mouseEnterDela === void 0 ? 0 : _props$mouseEnterDela,\n      _props$mouseLeaveDela = props.mouseLeaveDelay,\n      mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela,\n      overlayStyle = props.overlayStyle,\n      _props$prefixCls = props.prefixCls,\n      prefixCls = _props$prefixCls === void 0 ? 'rc-tooltip' : _props$prefixCls,\n      children = props.children,\n      onVisibleChange = props.onVisibleChange,\n      afterVisibleChange = props.afterVisibleChange,\n      transitionName = props.transitionName,\n      animation = props.animation,\n      motion = props.motion,\n      _props$placement = props.placement,\n      placement = _props$placement === void 0 ? 'right' : _props$placement,\n      _props$align = props.align,\n      align = _props$align === void 0 ? {} : _props$align,\n      _props$destroyTooltip = props.destroyTooltipOnHide,\n      destroyTooltipOnHide = _props$destroyTooltip === void 0 ? false : _props$destroyTooltip,\n      defaultVisible = props.defaultVisible,\n      getTooltipContainer = props.getTooltipContainer,\n      overlayInnerStyle = props.overlayInnerStyle,\n      arrowContent = props.arrowContent,\n      overlay = props.overlay,\n      id = props.id,\n      showArrow = props.showArrow,\n      restProps = _objectWithoutProperties(props, [\"overlayClassName\", \"trigger\", \"mouseEnterDelay\", \"mouseLeaveDelay\", \"overlayStyle\", \"prefixCls\", \"children\", \"onVisibleChange\", \"afterVisibleChange\", \"transitionName\", \"animation\", \"motion\", \"placement\", \"align\", \"destroyTooltipOnHide\", \"defaultVisible\", \"getTooltipContainer\", \"overlayInnerStyle\", \"arrowContent\", \"overlay\", \"id\", \"showArrow\"]);\n\n  var domRef = useRef(null);\n  useImperativeHandle(ref, function () {\n    return domRef.current;\n  });\n\n  var extraProps = _objectSpread({}, restProps);\n\n  if ('visible' in props) {\n    extraProps.popupVisible = props.visible;\n  }\n\n  var getPopupElement = function getPopupElement() {\n    return /*#__PURE__*/React.createElement(Popup, {\n      showArrow: showArrow,\n      arrowContent: arrowContent,\n      key: \"content\",\n      prefixCls: prefixCls,\n      id: id,\n      overlayInnerStyle: overlayInnerStyle\n    }, overlay);\n  };\n\n  var destroyTooltip = false;\n  var autoDestroy = false;\n\n  if (typeof destroyTooltipOnHide === 'boolean') {\n    destroyTooltip = destroyTooltipOnHide;\n  } else if (destroyTooltipOnHide && _typeof(destroyTooltipOnHide) === 'object') {\n    var keepParent = destroyTooltipOnHide.keepParent;\n    destroyTooltip = keepParent === true;\n    autoDestroy = keepParent === false;\n  }\n\n  return /*#__PURE__*/React.createElement(Trigger, _extends({\n    popupClassName: overlayClassName,\n    prefixCls: prefixCls,\n    popup: getPopupElement,\n    action: trigger,\n    builtinPlacements: placements,\n    popupPlacement: placement,\n    ref: domRef,\n    popupAlign: align,\n    getPopupContainer: getTooltipContainer,\n    onPopupVisibleChange: onVisibleChange,\n    afterPopupVisibleChange: afterVisibleChange,\n    popupTransitionName: transitionName,\n    popupAnimation: animation,\n    popupMotion: motion,\n    defaultPopupVisible: defaultVisible,\n    destroyPopupOnHide: destroyTooltip,\n    autoDestroy: autoDestroy,\n    mouseLeaveDelay: mouseLeaveDelay,\n    popupStyle: overlayStyle,\n    mouseEnterDelay: mouseEnterDelay\n  }, extraProps), children);\n};\n\nexport default /*#__PURE__*/forwardRef(Tooltip);","import Tooltip from './Tooltip';\nimport Popup from './Popup';\nexport { Popup };\nexport default Tooltip;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport canUseDOM from \"rc-util/es/Dom/canUseDom\"; // ================= Transition =================\n// Event wrapper. Copy from react source code\n\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes[\"Webkit\".concat(styleProp)] = \"webkit\".concat(eventName);\n  prefixes[\"Moz\".concat(styleProp)] = \"moz\".concat(eventName);\n  prefixes[\"ms\".concat(styleProp)] = \"MS\".concat(eventName);\n  prefixes[\"O\".concat(styleProp)] = \"o\".concat(eventName.toLowerCase());\n  return prefixes;\n}\n\nexport function getVendorPrefixes(domSupport, win) {\n  var prefixes = {\n    animationend: makePrefixMap('Animation', 'AnimationEnd'),\n    transitionend: makePrefixMap('Transition', 'TransitionEnd')\n  };\n\n  if (domSupport) {\n    if (!('AnimationEvent' in win)) {\n      delete prefixes.animationend.animation;\n    }\n\n    if (!('TransitionEvent' in win)) {\n      delete prefixes.transitionend.transition;\n    }\n  }\n\n  return prefixes;\n}\nvar vendorPrefixes = getVendorPrefixes(canUseDOM(), typeof window !== 'undefined' ? window : {});\nvar style = {};\n\nif (canUseDOM()) {\n  var _document$createEleme = document.createElement('div');\n\n  style = _document$createEleme.style;\n}\n\nvar prefixedEventNames = {};\nexport function getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  }\n\n  var prefixMap = vendorPrefixes[eventName];\n\n  if (prefixMap) {\n    var stylePropList = Object.keys(prefixMap);\n    var len = stylePropList.length;\n\n    for (var i = 0; i < len; i += 1) {\n      var styleProp = stylePropList[i];\n\n      if (Object.prototype.hasOwnProperty.call(prefixMap, styleProp) && styleProp in style) {\n        prefixedEventNames[eventName] = prefixMap[styleProp];\n        return prefixedEventNames[eventName];\n      }\n    }\n  }\n\n  return '';\n}\nvar internalAnimationEndName = getVendorPrefixedEventName('animationend');\nvar internalTransitionEndName = getVendorPrefixedEventName('transitionend');\nexport var supportTransition = !!(internalAnimationEndName && internalTransitionEndName);\nexport var animationEndName = internalAnimationEndName || 'animationend';\nexport var transitionEndName = internalTransitionEndName || 'transitionend';\nexport function getTransitionName(transitionName, transitionType) {\n  if (!transitionName) return null;\n\n  if (_typeof(transitionName) === 'object') {\n    var type = transitionType.replace(/-\\w/g, function (match) {\n      return match[1].toUpperCase();\n    });\n    return transitionName[type];\n  }\n\n  return \"\".concat(transitionName, \"-\").concat(transitionType);\n}","export var STATUS_NONE = 'none';\nexport var STATUS_APPEAR = 'appear';\nexport var STATUS_ENTER = 'enter';\nexport var STATUS_LEAVE = 'leave';\nexport var STEP_NONE = 'none';\nexport var STEP_PREPARE = 'prepare';\nexport var STEP_START = 'start';\nexport var STEP_ACTIVE = 'active';\nexport var STEP_ACTIVATED = 'end';","import { useEffect, useLayoutEffect } from 'react';\nimport canUseDom from \"rc-util/es/Dom/canUseDom\"; // It's safe to use `useLayoutEffect` but the warning is annoying\n\nvar useIsomorphicLayoutEffect = canUseDom() ? useLayoutEffect : useEffect;\nexport default useIsomorphicLayoutEffect;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nimport useState from \"rc-util/es/hooks/useState\";\nimport { STEP_PREPARE, STEP_ACTIVE, STEP_START, STEP_ACTIVATED, STEP_NONE } from '../interface';\nimport useNextFrame from './useNextFrame';\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\nvar STEP_QUEUE = [STEP_PREPARE, STEP_START, STEP_ACTIVE, STEP_ACTIVATED];\n/** Skip current step */\n\nexport var SkipStep = false;\n/** Current step should be update in */\n\nexport var DoStep = true;\nexport function isActive(step) {\n  return step === STEP_ACTIVE || step === STEP_ACTIVATED;\n}\nexport default (function (status, callback) {\n  var _useState = useState(STEP_NONE),\n      _useState2 = _slicedToArray(_useState, 2),\n      step = _useState2[0],\n      setStep = _useState2[1];\n\n  var _useNextFrame = useNextFrame(),\n      _useNextFrame2 = _slicedToArray(_useNextFrame, 2),\n      nextFrame = _useNextFrame2[0],\n      cancelNextFrame = _useNextFrame2[1];\n\n  function startQueue() {\n    setStep(STEP_PREPARE, true);\n  }\n\n  useIsomorphicLayoutEffect(function () {\n    if (step !== STEP_NONE && step !== STEP_ACTIVATED) {\n      var index = STEP_QUEUE.indexOf(step);\n      var nextStep = STEP_QUEUE[index + 1];\n      var result = callback(step);\n\n      if (result === SkipStep) {\n        // Skip when no needed\n        setStep(nextStep, true);\n      } else {\n        // Do as frame for step update\n        nextFrame(function (info) {\n          function doNext() {\n            // Skip since current queue is ood\n            if (info.isCanceled()) return;\n            setStep(nextStep, true);\n          }\n\n          if (result === true) {\n            doNext();\n          } else {\n            // Only promise should be async\n            Promise.resolve(result).then(doNext);\n          }\n        });\n      }\n    }\n  }, [status, step]);\n  React.useEffect(function () {\n    return function () {\n      cancelNextFrame();\n    };\n  }, []);\n  return [startQueue, step];\n});","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport * as React from 'react';\n\nvar DomWrapper = /*#__PURE__*/function (_React$Component) {\n  _inherits(DomWrapper, _React$Component);\n\n  var _super = _createSuper(DomWrapper);\n\n  function DomWrapper() {\n    _classCallCheck(this, DomWrapper);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(DomWrapper, [{\n    key: \"render\",\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n\n  return DomWrapper;\n}(React.Component);\n\nexport default DomWrapper;","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\n\n/* eslint-disable react/default-props-match-prop-types, react/no-multi-comp, react/prop-types */\nimport * as React from 'react';\nimport { useRef } from 'react';\nimport findDOMNode from \"rc-util/es/Dom/findDOMNode\";\nimport { fillRef, supportRef } from \"rc-util/es/ref\";\nimport classNames from 'classnames';\nimport { getTransitionName, supportTransition } from './util/motion';\nimport { STATUS_NONE, STEP_PREPARE, STEP_START } from './interface';\nimport useStatus from './hooks/useStatus';\nimport DomWrapper from './DomWrapper';\nimport { isActive } from './hooks/useStepQueue';\n/**\n * `transitionSupport` is used for none transition test case.\n * Default we use browser transition event support check.\n */\n\nexport function genCSSMotion(config) {\n  var transitionSupport = config;\n\n  if (_typeof(config) === 'object') {\n    transitionSupport = config.transitionSupport;\n  }\n\n  function isSupportTransition(props) {\n    return !!(props.motionName && transitionSupport);\n  }\n\n  var CSSMotion = /*#__PURE__*/React.forwardRef(function (props, ref) {\n    var _props$visible = props.visible,\n        visible = _props$visible === void 0 ? true : _props$visible,\n        _props$removeOnLeave = props.removeOnLeave,\n        removeOnLeave = _props$removeOnLeave === void 0 ? true : _props$removeOnLeave,\n        forceRender = props.forceRender,\n        children = props.children,\n        motionName = props.motionName,\n        leavedClassName = props.leavedClassName,\n        eventProps = props.eventProps;\n    var supportMotion = isSupportTransition(props); // Ref to the react node, it may be a HTMLElement\n\n    var nodeRef = useRef(); // Ref to the dom wrapper in case ref can not pass to HTMLElement\n\n    var wrapperNodeRef = useRef();\n\n    function getDomElement() {\n      try {\n        // Here we're avoiding call for findDOMNode since it's deprecated\n        // in strict mode. We're calling it only when node ref is not\n        // an instance of DOM HTMLElement. Otherwise use\n        // findDOMNode as a final resort\n        return nodeRef.current instanceof HTMLElement ? nodeRef.current : findDOMNode(wrapperNodeRef.current);\n      } catch (e) {\n        // Only happen when `motionDeadline` trigger but element removed.\n        return null;\n      }\n    }\n\n    var _useStatus = useStatus(supportMotion, visible, getDomElement, props),\n        _useStatus2 = _slicedToArray(_useStatus, 4),\n        status = _useStatus2[0],\n        statusStep = _useStatus2[1],\n        statusStyle = _useStatus2[2],\n        mergedVisible = _useStatus2[3]; // Record whether content has rendered\n    // Will return null for un-rendered even when `removeOnLeave={false}`\n\n\n    var renderedRef = React.useRef(mergedVisible);\n\n    if (mergedVisible) {\n      renderedRef.current = true;\n    } // ====================== Refs ======================\n\n\n    var setNodeRef = React.useCallback(function (node) {\n      nodeRef.current = node;\n      fillRef(ref, node);\n    }, [ref]); // ===================== Render =====================\n\n    var motionChildren;\n\n    var mergedProps = _objectSpread(_objectSpread({}, eventProps), {}, {\n      visible: visible\n    });\n\n    if (!children) {\n      // No children\n      motionChildren = null;\n    } else if (status === STATUS_NONE || !isSupportTransition(props)) {\n      // Stable children\n      if (mergedVisible) {\n        motionChildren = children(_objectSpread({}, mergedProps), setNodeRef);\n      } else if (!removeOnLeave && renderedRef.current) {\n        motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n          className: leavedClassName\n        }), setNodeRef);\n      } else if (forceRender) {\n        motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n          style: {\n            display: 'none'\n          }\n        }), setNodeRef);\n      } else {\n        motionChildren = null;\n      }\n    } else {\n      var _classNames;\n\n      // In motion\n      var statusSuffix;\n\n      if (statusStep === STEP_PREPARE) {\n        statusSuffix = 'prepare';\n      } else if (isActive(statusStep)) {\n        statusSuffix = 'active';\n      } else if (statusStep === STEP_START) {\n        statusSuffix = 'start';\n      }\n\n      motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n        className: classNames(getTransitionName(motionName, status), (_classNames = {}, _defineProperty(_classNames, getTransitionName(motionName, \"\".concat(status, \"-\").concat(statusSuffix)), statusSuffix), _defineProperty(_classNames, motionName, typeof motionName === 'string'), _classNames)),\n        style: statusStyle\n      }), setNodeRef);\n    } // Auto inject ref if child node not have `ref` props\n\n\n    if ( /*#__PURE__*/React.isValidElement(motionChildren) && supportRef(motionChildren)) {\n      var _motionChildren = motionChildren,\n          originNodeRef = _motionChildren.ref;\n\n      if (!originNodeRef) {\n        motionChildren = /*#__PURE__*/React.cloneElement(motionChildren, {\n          ref: setNodeRef\n        });\n      }\n    }\n\n    return /*#__PURE__*/React.createElement(DomWrapper, {\n      ref: wrapperNodeRef\n    }, motionChildren);\n  });\n  CSSMotion.displayName = 'CSSMotion';\n  return CSSMotion;\n}\nexport default genCSSMotion(supportTransition);","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nimport { useRef, useEffect } from 'react';\nimport useState from \"rc-util/es/hooks/useState\";\nimport { STATUS_APPEAR, STATUS_NONE, STATUS_LEAVE, STATUS_ENTER, STEP_PREPARE, STEP_START, STEP_ACTIVE } from '../interface';\nimport useStepQueue, { DoStep, SkipStep, isActive } from './useStepQueue';\nimport useDomMotionEvents from './useDomMotionEvents';\nimport useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect';\nexport default function useStatus(supportMotion, visible, getElement, _ref) {\n  var _ref$motionEnter = _ref.motionEnter,\n      motionEnter = _ref$motionEnter === void 0 ? true : _ref$motionEnter,\n      _ref$motionAppear = _ref.motionAppear,\n      motionAppear = _ref$motionAppear === void 0 ? true : _ref$motionAppear,\n      _ref$motionLeave = _ref.motionLeave,\n      motionLeave = _ref$motionLeave === void 0 ? true : _ref$motionLeave,\n      motionDeadline = _ref.motionDeadline,\n      motionLeaveImmediately = _ref.motionLeaveImmediately,\n      onAppearPrepare = _ref.onAppearPrepare,\n      onEnterPrepare = _ref.onEnterPrepare,\n      onLeavePrepare = _ref.onLeavePrepare,\n      onAppearStart = _ref.onAppearStart,\n      onEnterStart = _ref.onEnterStart,\n      onLeaveStart = _ref.onLeaveStart,\n      onAppearActive = _ref.onAppearActive,\n      onEnterActive = _ref.onEnterActive,\n      onLeaveActive = _ref.onLeaveActive,\n      onAppearEnd = _ref.onAppearEnd,\n      onEnterEnd = _ref.onEnterEnd,\n      onLeaveEnd = _ref.onLeaveEnd,\n      onVisibleChanged = _ref.onVisibleChanged;\n\n  // Used for outer render usage to avoid `visible: false & status: none` to render nothing\n  var _useState = useState(),\n      _useState2 = _slicedToArray(_useState, 2),\n      asyncVisible = _useState2[0],\n      setAsyncVisible = _useState2[1];\n\n  var _useState3 = useState(STATUS_NONE),\n      _useState4 = _slicedToArray(_useState3, 2),\n      status = _useState4[0],\n      setStatus = _useState4[1];\n\n  var _useState5 = useState(null),\n      _useState6 = _slicedToArray(_useState5, 2),\n      style = _useState6[0],\n      setStyle = _useState6[1];\n\n  var mountedRef = useRef(false);\n  var deadlineRef = useRef(null); // =========================== Dom Node ===========================\n\n  function getDomElement() {\n    return getElement();\n  } // ========================== Motion End ==========================\n\n\n  var activeRef = useRef(false);\n\n  function onInternalMotionEnd(event) {\n    var element = getDomElement();\n\n    if (event && !event.deadline && event.target !== element) {\n      // event exists\n      // not initiated by deadline\n      // transitionEnd not fired by inner elements\n      return;\n    }\n\n    var currentActive = activeRef.current;\n    var canEnd;\n\n    if (status === STATUS_APPEAR && currentActive) {\n      canEnd = onAppearEnd === null || onAppearEnd === void 0 ? void 0 : onAppearEnd(element, event);\n    } else if (status === STATUS_ENTER && currentActive) {\n      canEnd = onEnterEnd === null || onEnterEnd === void 0 ? void 0 : onEnterEnd(element, event);\n    } else if (status === STATUS_LEAVE && currentActive) {\n      canEnd = onLeaveEnd === null || onLeaveEnd === void 0 ? void 0 : onLeaveEnd(element, event);\n    } // Only update status when `canEnd` and not destroyed\n\n\n    if (status !== STATUS_NONE && currentActive && canEnd !== false) {\n      setStatus(STATUS_NONE, true);\n      setStyle(null, true);\n    }\n  }\n\n  var _useDomMotionEvents = useDomMotionEvents(onInternalMotionEnd),\n      _useDomMotionEvents2 = _slicedToArray(_useDomMotionEvents, 1),\n      patchMotionEvents = _useDomMotionEvents2[0]; // ============================= Step =============================\n\n\n  var eventHandlers = React.useMemo(function () {\n    var _ref2, _ref3, _ref4;\n\n    switch (status) {\n      case STATUS_APPEAR:\n        return _ref2 = {}, _defineProperty(_ref2, STEP_PREPARE, onAppearPrepare), _defineProperty(_ref2, STEP_START, onAppearStart), _defineProperty(_ref2, STEP_ACTIVE, onAppearActive), _ref2;\n\n      case STATUS_ENTER:\n        return _ref3 = {}, _defineProperty(_ref3, STEP_PREPARE, onEnterPrepare), _defineProperty(_ref3, STEP_START, onEnterStart), _defineProperty(_ref3, STEP_ACTIVE, onEnterActive), _ref3;\n\n      case STATUS_LEAVE:\n        return _ref4 = {}, _defineProperty(_ref4, STEP_PREPARE, onLeavePrepare), _defineProperty(_ref4, STEP_START, onLeaveStart), _defineProperty(_ref4, STEP_ACTIVE, onLeaveActive), _ref4;\n\n      default:\n        return {};\n    }\n  }, [status]);\n\n  var _useStepQueue = useStepQueue(status, function (newStep) {\n    // Only prepare step can be skip\n    if (newStep === STEP_PREPARE) {\n      var onPrepare = eventHandlers[STEP_PREPARE];\n\n      if (!onPrepare) {\n        return SkipStep;\n      }\n\n      return onPrepare(getDomElement());\n    } // Rest step is sync update\n\n\n    // Rest step is sync update\n    if (step in eventHandlers) {\n      var _eventHandlers$step;\n\n      setStyle(((_eventHandlers$step = eventHandlers[step]) === null || _eventHandlers$step === void 0 ? void 0 : _eventHandlers$step.call(eventHandlers, getDomElement(), null)) || null);\n    }\n\n    if (step === STEP_ACTIVE) {\n      // Patch events when motion needed\n      patchMotionEvents(getDomElement());\n\n      if (motionDeadline > 0) {\n        clearTimeout(deadlineRef.current);\n        deadlineRef.current = setTimeout(function () {\n          onInternalMotionEnd({\n            deadline: true\n          });\n        }, motionDeadline);\n      }\n    }\n\n    return DoStep;\n  }),\n      _useStepQueue2 = _slicedToArray(_useStepQueue, 2),\n      startStep = _useStepQueue2[0],\n      step = _useStepQueue2[1];\n\n  var active = isActive(step);\n  activeRef.current = active; // ============================ Status ============================\n  // Update with new status\n\n  useIsomorphicLayoutEffect(function () {\n    setAsyncVisible(visible);\n    var isMounted = mountedRef.current;\n    mountedRef.current = true;\n\n    if (!supportMotion) {\n      return;\n    }\n\n    var nextStatus; // Appear\n\n    if (!isMounted && visible && motionAppear) {\n      nextStatus = STATUS_APPEAR;\n    } // Enter\n\n\n    if (isMounted && visible && motionEnter) {\n      nextStatus = STATUS_ENTER;\n    } // Leave\n\n\n    if (isMounted && !visible && motionLeave || !isMounted && motionLeaveImmediately && !visible && motionLeave) {\n      nextStatus = STATUS_LEAVE;\n    } // Update to next status\n\n\n    if (nextStatus) {\n      setStatus(nextStatus);\n      startStep();\n    }\n  }, [visible]); // ============================ Effect ============================\n  // Reset when motion changed\n\n  useEffect(function () {\n    if ( // Cancel appear\n    status === STATUS_APPEAR && !motionAppear || // Cancel enter\n    status === STATUS_ENTER && !motionEnter || // Cancel leave\n    status === STATUS_LEAVE && !motionLeave) {\n      setStatus(STATUS_NONE);\n    }\n  }, [motionAppear, motionEnter, motionLeave]);\n  useEffect(function () {\n    return function () {\n      mountedRef.current = false;\n      clearTimeout(deadlineRef.current);\n    };\n  }, []); // Trigger `onVisibleChanged`\n\n  var firstMountChangeRef = React.useRef(false);\n  useEffect(function () {\n    // [visible & motion not end] => [!visible & motion end] still need trigger onVisibleChanged\n    if (asyncVisible) {\n      firstMountChangeRef.current = true;\n    }\n\n    if (asyncVisible !== undefined && status === STATUS_NONE) {\n      // Skip first render is invisible since it's nothing changed\n      if (firstMountChangeRef.current || asyncVisible) {\n        onVisibleChanged === null || onVisibleChanged === void 0 ? void 0 : onVisibleChanged(asyncVisible);\n      }\n\n      firstMountChangeRef.current = true;\n    }\n  }, [asyncVisible, status]); // ============================ Styles ============================\n\n  var mergedStyle = style;\n\n  if (eventHandlers[STEP_PREPARE] && step === STEP_START) {\n    mergedStyle = _objectSpread({\n      transition: 'none'\n    }, mergedStyle);\n  }\n\n  return [status, step, mergedStyle, asyncVisible !== null && asyncVisible !== void 0 ? asyncVisible : visible];\n}","import * as React from 'react';\nimport { useRef } from 'react';\nimport { animationEndName, transitionEndName } from '../util/motion';\nexport default (function (callback) {\n  var cacheElementRef = useRef(); // Cache callback\n\n  var callbackRef = useRef(callback);\n  callbackRef.current = callback; // Internal motion event handler\n\n  var onInternalMotionEnd = React.useCallback(function (event) {\n    callbackRef.current(event);\n  }, []); // Remove events\n\n  function removeMotionEvents(element) {\n    if (element) {\n      element.removeEventListener(transitionEndName, onInternalMotionEnd);\n      element.removeEventListener(animationEndName, onInternalMotionEnd);\n    }\n  } // Patch events\n\n\n  function patchMotionEvents(element) {\n    if (cacheElementRef.current && cacheElementRef.current !== element) {\n      removeMotionEvents(cacheElementRef.current);\n    }\n\n    if (element && element !== cacheElementRef.current) {\n      element.addEventListener(transitionEndName, onInternalMotionEnd);\n      element.addEventListener(animationEndName, onInternalMotionEnd); // Save as cache in case dom removed trigger by `motionDeadline`\n\n      cacheElementRef.current = element;\n    }\n  } // Clean up when removed\n\n\n  React.useEffect(function () {\n    return function () {\n      removeMotionEvents(cacheElementRef.current);\n    };\n  }, []);\n  return [patchMotionEvents, removeMotionEvents];\n});","import * as React from 'react';\nimport raf from \"rc-util/es/raf\";\nexport default (function () {\n  var nextFrameRef = React.useRef(null);\n\n  function cancelNextFrame() {\n    raf.cancel(nextFrameRef.current);\n  }\n\n  function nextFrame(callback) {\n    var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n    cancelNextFrame();\n    var nextFrameId = raf(function () {\n      if (delay <= 1) {\n        callback({\n          isCanceled: function isCanceled() {\n            return nextFrameId !== nextFrameRef.current;\n          }\n        });\n      } else {\n        nextFrame(callback, delay - 1);\n      }\n    });\n    nextFrameRef.current = nextFrameId;\n  }\n\n  React.useEffect(function () {\n    return function () {\n      cancelNextFrame();\n    };\n  }, []);\n  return [nextFrame, cancelNextFrame];\n});","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nexport var STATUS_ADD = 'add';\nexport var STATUS_KEEP = 'keep';\nexport var STATUS_REMOVE = 'remove';\nexport var STATUS_REMOVED = 'removed';\nexport function wrapKeyToObject(key) {\n  var keyObj;\n\n  if (key && _typeof(key) === 'object' && 'key' in key) {\n    keyObj = key;\n  } else {\n    keyObj = {\n      key: key\n    };\n  }\n\n  return _objectSpread(_objectSpread({}, keyObj), {}, {\n    key: String(keyObj.key)\n  });\n}\nexport function parseKeys() {\n  var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  return keys.map(wrapKeyToObject);\n}\nexport function diffKeys() {\n  var prevKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var currentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var list = [];\n  var currentIndex = 0;\n  var currentLen = currentKeys.length;\n  var prevKeyObjects = parseKeys(prevKeys);\n  var currentKeyObjects = parseKeys(currentKeys); // Check prev keys to insert or keep\n\n  prevKeyObjects.forEach(function (keyObj) {\n    var hit = false;\n\n    for (var i = currentIndex; i < currentLen; i += 1) {\n      var currentKeyObj = currentKeyObjects[i];\n\n      if (currentKeyObj.key === keyObj.key) {\n        // New added keys should add before current key\n        if (currentIndex < i) {\n          list = list.concat(currentKeyObjects.slice(currentIndex, i).map(function (obj) {\n            return _objectSpread(_objectSpread({}, obj), {}, {\n              status: STATUS_ADD\n            });\n          }));\n          currentIndex = i;\n        }\n\n        list.push(_objectSpread(_objectSpread({}, currentKeyObj), {}, {\n          status: STATUS_KEEP\n        }));\n        currentIndex += 1;\n        hit = true;\n        break;\n      }\n    } // If not hit, it means key is removed\n\n\n    if (!hit) {\n      list.push(_objectSpread(_objectSpread({}, keyObj), {}, {\n        status: STATUS_REMOVE\n      }));\n    }\n  }); // Add rest to the list\n\n  if (currentIndex < currentLen) {\n    list = list.concat(currentKeyObjects.slice(currentIndex).map(function (obj) {\n      return _objectSpread(_objectSpread({}, obj), {}, {\n        status: STATUS_ADD\n      });\n    }));\n  }\n  /**\n   * Merge same key when it remove and add again:\n   *    [1 - add, 2 - keep, 1 - remove] -> [1 - keep, 2 - keep]\n   */\n\n\n  var keys = {};\n  list.forEach(function (_ref) {\n    var key = _ref.key;\n    keys[key] = (keys[key] || 0) + 1;\n  });\n  var duplicatedKeys = Object.keys(keys).filter(function (key) {\n    return keys[key] > 1;\n  });\n  duplicatedKeys.forEach(function (matchKey) {\n    // Remove `STATUS_REMOVE` node.\n    list = list.filter(function (_ref2) {\n      var key = _ref2.key,\n          status = _ref2.status;\n      return key !== matchKey || status !== STATUS_REMOVE;\n    }); // Update `STATUS_ADD` to `STATUS_KEEP`\n\n    list.forEach(function (node) {\n      if (node.key === matchKey) {\n        // eslint-disable-next-line no-param-reassign\n        node.status = STATUS_KEEP;\n      }\n    });\n  });\n  return list;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nvar _excluded = [\"component\", \"children\", \"onVisibleChanged\", \"onAllRemoved\"],\n    _excluded2 = [\"status\"];\n\n/* eslint react/prop-types: 0 */\nimport * as React from 'react';\nimport OriginCSSMotion from './CSSMotion';\nimport { supportTransition } from './util/motion';\nimport { STATUS_ADD, STATUS_KEEP, STATUS_REMOVE, STATUS_REMOVED, diffKeys, parseKeys } from './util/diff';\nvar MOTION_PROP_NAMES = ['eventProps', 'visible', 'children', 'motionName', 'motionAppear', 'motionEnter', 'motionLeave', 'motionLeaveImmediately', 'motionDeadline', 'removeOnLeave', 'leavedClassName', 'onAppearStart', 'onAppearActive', 'onAppearEnd', 'onEnterStart', 'onEnterActive', 'onEnterEnd', 'onLeaveStart', 'onLeaveActive', 'onLeaveEnd'];\n/**\n * Generate a CSSMotionList component with config\n * @param transitionSupport No need since CSSMotionList no longer depends on transition support\n * @param CSSMotion CSSMotion component\n */\n\nexport function genCSSMotionList(transitionSupport) {\n  var CSSMotion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : OriginCSSMotion;\n\n  var CSSMotionList = /*#__PURE__*/function (_React$Component) {\n    _inherits(CSSMotionList, _React$Component);\n\n    var _super = _createSuper(CSSMotionList);\n\n    function CSSMotionList() {\n      var _this;\n\n      _classCallCheck(this, CSSMotionList);\n\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      _this = _super.call.apply(_super, [this].concat(args));\n      _this.state = {\n        keyEntities: []\n      };\n\n      _this.removeKey = function (removeKey) {\n        var keyEntities = _this.state.keyEntities;\n        var nextKeyEntities = keyEntities.map(function (entity) {\n          if (entity.key !== removeKey) return entity;\n          return _objectSpread(_objectSpread({}, entity), {}, {\n            status: STATUS_REMOVED\n          });\n        });\n\n        _this.setState({\n          keyEntities: nextKeyEntities\n        });\n\n        return nextKeyEntities.filter(function (_ref) {\n          var status = _ref.status;\n          return status !== STATUS_REMOVED;\n        }).length;\n      };\n\n      return _this;\n    }\n\n    _createClass(CSSMotionList, [{\n      key: \"render\",\n      value: function render() {\n        var _this2 = this;\n\n        var keyEntities = this.state.keyEntities;\n\n        var _this$props = this.props,\n            component = _this$props.component,\n            children = _this$props.children,\n            _onVisibleChanged = _this$props.onVisibleChanged,\n            onAllRemoved = _this$props.onAllRemoved,\n            restProps = _objectWithoutProperties(_this$props, _excluded);\n\n        var Component = component || React.Fragment;\n        var motionProps = {};\n        MOTION_PROP_NAMES.forEach(function (prop) {\n          motionProps[prop] = restProps[prop];\n          delete restProps[prop];\n        });\n        delete restProps.keys;\n        return /*#__PURE__*/React.createElement(Component, restProps, keyEntities.map(function (_ref2) {\n          var status = _ref2.status,\n              eventProps = _objectWithoutProperties(_ref2, _excluded2);\n\n          var visible = status === STATUS_ADD || status === STATUS_KEEP;\n          return /*#__PURE__*/React.createElement(CSSMotion, _extends({}, motionProps, {\n            key: eventProps.key,\n            visible: visible,\n            eventProps: eventProps,\n            onVisibleChanged: function onVisibleChanged(changedVisible) {\n              _onVisibleChanged === null || _onVisibleChanged === void 0 ? void 0 : _onVisibleChanged(changedVisible, {\n                key: eventProps.key\n              });\n\n              if (!changedVisible) {\n                var restKeysCount = _this2.removeKey(eventProps.key);\n\n                if (restKeysCount === 0 && onAllRemoved) {\n                  onAllRemoved();\n                }\n              }\n            }\n          }), children);\n        }));\n      }\n    }], [{\n      key: \"getDerivedStateFromProps\",\n      value: function getDerivedStateFromProps(_ref3, _ref4) {\n        var keys = _ref3.keys;\n        var keyEntities = _ref4.keyEntities;\n        var parsedKeyObjects = parseKeys(keys);\n        var mixedKeyEntities = diffKeys(keyEntities, parsedKeyObjects);\n        return {\n          keyEntities: mixedKeyEntities.filter(function (entity) {\n            var prevEntity = keyEntities.find(function (_ref5) {\n              var key = _ref5.key;\n              return entity.key === key;\n            }); // Remove if already mark as removed\n\n            if (prevEntity && prevEntity.status === STATUS_REMOVED && entity.status === STATUS_REMOVE) {\n              return false;\n            }\n\n            return true;\n          })\n        };\n      } // ZombieJ: Return the count of rest keys. It's safe to refactor if need more info.\n\n    }]);\n\n    return CSSMotionList;\n  }(React.Component);\n\n  CSSMotionList.defaultProps = {\n    component: 'div'\n  };\n  return CSSMotionList;\n}\nexport default genCSSMotionList(supportTransition);","import CSSMotion from './CSSMotion';\nimport CSSMotionList from './CSSMotionList';\nexport { CSSMotionList };\nexport default CSSMotion;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport CSSMotion from 'rc-motion';\nimport { getMotion } from \"../utils/legacyUtil\";\nexport default function Mask(props) {\n  var prefixCls = props.prefixCls,\n      visible = props.visible,\n      zIndex = props.zIndex,\n      mask = props.mask,\n      maskMotion = props.maskMotion,\n      maskAnimation = props.maskAnimation,\n      maskTransitionName = props.maskTransitionName;\n\n  if (!mask) {\n    return null;\n  }\n\n  var motion = {};\n\n  if (maskMotion || maskTransitionName || maskAnimation) {\n    motion = _objectSpread({\n      motionAppear: true\n    }, getMotion({\n      motion: maskMotion,\n      prefixCls: prefixCls,\n      transitionName: maskTransitionName,\n      animation: maskAnimation\n    }));\n  }\n\n  return /*#__PURE__*/React.createElement(CSSMotion, _extends({}, motion, {\n    visible: visible,\n    removeOnLeave: true\n  }), function (_ref) {\n    var className = _ref.className;\n    return /*#__PURE__*/React.createElement(\"div\", {\n      style: {\n        zIndex: zIndex\n      },\n      className: classNames(\"\".concat(prefixCls, \"-mask\"), className)\n    });\n  });\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport ResizeObserver from 'resize-observer-polyfill';\nimport contains from \"rc-util/es/Dom/contains\";\nexport function isSamePoint(prev, next) {\n  if (prev === next) return true;\n  if (!prev || !next) return false;\n\n  if ('pageX' in next && 'pageY' in next) {\n    return prev.pageX === next.pageX && prev.pageY === next.pageY;\n  }\n\n  if ('clientX' in next && 'clientY' in next) {\n    return prev.clientX === next.clientX && prev.clientY === next.clientY;\n  }\n\n  return false;\n}\nexport function restoreFocus(activeElement, container) {\n  // Focus back if is in the container\n  if (activeElement !== document.activeElement && contains(container, activeElement) && typeof activeElement.focus === 'function') {\n    activeElement.focus();\n  }\n}\nexport function monitorResize(element, callback) {\n  var prevWidth = null;\n  var prevHeight = null;\n\n  function onResize(_ref) {\n    var _ref2 = _slicedToArray(_ref, 1),\n        target = _ref2[0].target;\n\n    if (!document.documentElement.contains(target)) return;\n\n    var _target$getBoundingCl = target.getBoundingClientRect(),\n        width = _target$getBoundingCl.width,\n        height = _target$getBoundingCl.height;\n\n    var fixedWidth = Math.floor(width);\n    var fixedHeight = Math.floor(height);\n\n    if (prevWidth !== fixedWidth || prevHeight !== fixedHeight) {\n      // https://webkit.org/blog/9997/resizeobserver-in-webkit/\n      Promise.resolve().then(function () {\n        callback({\n          width: fixedWidth,\n          height: fixedHeight\n        });\n      });\n    }\n\n    prevWidth = fixedWidth;\n    prevHeight = fixedHeight;\n  }\n\n  var resizeObserver = new ResizeObserver(onResize);\n\n  if (element) {\n    resizeObserver.observe(element);\n  }\n\n  return function () {\n    resizeObserver.disconnect();\n  };\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\n\n/**\n * Removed props:\n *  - childrenProps\n */\nimport { alignElement, alignPoint } from 'dom-align';\nimport isEqual from \"rc-util/es/isEqual\";\nimport addEventListener from \"rc-util/es/Dom/addEventListener\";\nimport isVisible from \"rc-util/es/Dom/isVisible\";\nimport useLayoutEffect from \"rc-util/es/hooks/useLayoutEffect\";\nimport { composeRef } from \"rc-util/es/ref\";\nimport React from 'react';\nimport useBuffer from \"./hooks/useBuffer\";\nimport { isSamePoint, monitorResize, restoreFocus } from \"./util\";\n\nfunction getElement(func) {\n  if (typeof func !== 'function') return null;\n  return func();\n}\n\nfunction getPoint(point) {\n  if (_typeof(point) !== 'object' || !point) return null;\n  return point;\n}\n\nvar Align = function Align(_ref, ref) {\n  var children = _ref.children,\n      disabled = _ref.disabled,\n      target = _ref.target,\n      align = _ref.align,\n      onAlign = _ref.onAlign,\n      monitorWindowResize = _ref.monitorWindowResize,\n      _ref$monitorBufferTim = _ref.monitorBufferTime,\n      monitorBufferTime = _ref$monitorBufferTim === void 0 ? 0 : _ref$monitorBufferTim;\n  var cacheRef = React.useRef({});\n  /** Popup node ref */\n\n  var nodeRef = React.useRef();\n  var childNode = React.Children.only(children); // ===================== Align ======================\n  // We save the props here to avoid closure makes props ood\n\n  var forceAlignPropsRef = React.useRef({});\n  forceAlignPropsRef.current.disabled = disabled;\n  forceAlignPropsRef.current.target = target;\n  forceAlignPropsRef.current.align = align;\n  forceAlignPropsRef.current.onAlign = onAlign;\n\n  var _useBuffer = useBuffer(function () {\n    var _forceAlignPropsRef$c = forceAlignPropsRef.current,\n        latestDisabled = _forceAlignPropsRef$c.disabled,\n        latestTarget = _forceAlignPropsRef$c.target,\n        latestAlign = _forceAlignPropsRef$c.align,\n        latestOnAlign = _forceAlignPropsRef$c.onAlign;\n    var source = nodeRef.current;\n\n    if (!latestDisabled && latestTarget && source) {\n      var _result;\n\n      var _element = getElement(latestTarget);\n\n      var _point = getPoint(latestTarget);\n\n      cacheRef.current.element = _element;\n      cacheRef.current.point = _point;\n      cacheRef.current.align = latestAlign; // IE lose focus after element realign\n      // We should record activeElement and restore later\n\n      var _document = document,\n          activeElement = _document.activeElement; // We only align when element is visible\n\n      if (_element && isVisible(_element)) {\n        _result = alignElement(source, _element, latestAlign);\n      } else if (_point) {\n        _result = alignPoint(source, _point, latestAlign);\n      }\n\n      restoreFocus(activeElement, source);\n\n      if (latestOnAlign && _result) {\n        latestOnAlign(source, _result);\n      }\n\n      return true;\n    }\n\n    return false;\n  }, monitorBufferTime),\n      _useBuffer2 = _slicedToArray(_useBuffer, 2),\n      _forceAlign = _useBuffer2[0],\n      cancelForceAlign = _useBuffer2[1]; // ===================== Effect =====================\n  // Handle props change\n\n\n  var _React$useState = React.useState(),\n      _React$useState2 = _slicedToArray(_React$useState, 2),\n      element = _React$useState2[0],\n      setElement = _React$useState2[1];\n\n  var _React$useState3 = React.useState(),\n      _React$useState4 = _slicedToArray(_React$useState3, 2),\n      point = _React$useState4[0],\n      setPoint = _React$useState4[1];\n\n  useLayoutEffect(function () {\n    setElement(getElement(target));\n    setPoint(getPoint(target));\n  });\n  React.useEffect(function () {\n    if (cacheRef.current.element !== element || !isSamePoint(cacheRef.current.point, point) || !isEqual(cacheRef.current.align, align)) {\n      _forceAlign();\n    }\n  }); // Watch popup element resize\n\n  React.useEffect(function () {\n    var cancelFn = monitorResize(nodeRef.current, _forceAlign);\n    return cancelFn;\n  }, [nodeRef.current]); // Watch target element resize\n\n  React.useEffect(function () {\n    var cancelFn = monitorResize(element, _forceAlign);\n    return cancelFn;\n  }, [element]); // Listen for disabled change\n\n  React.useEffect(function () {\n    if (!disabled) {\n      _forceAlign();\n    } else {\n      cancelForceAlign();\n    }\n  }, [disabled]); // Listen for window resize\n\n  React.useEffect(function () {\n    if (monitorWindowResize) {\n      var cancelFn = addEventListener(window, 'resize', _forceAlign);\n      return cancelFn.remove;\n    }\n  }, [monitorWindowResize]); // Clear all if unmount\n\n  React.useEffect(function () {\n    return function () {\n      cancelForceAlign();\n    };\n  }, []); // ====================== Ref =======================\n\n  React.useImperativeHandle(ref, function () {\n    return {\n      forceAlign: function forceAlign() {\n        return _forceAlign(true);\n      }\n    };\n  }); // ===================== Render =====================\n\n  if ( /*#__PURE__*/React.isValidElement(childNode)) {\n    childNode = /*#__PURE__*/React.cloneElement(childNode, {\n      ref: composeRef(childNode.ref, nodeRef)\n    });\n  }\n\n  return childNode;\n};\n\nvar RcAlign = /*#__PURE__*/React.forwardRef(Align);\nRcAlign.displayName = 'Align';\nexport default RcAlign;","import React from 'react';\nexport default (function (callback, buffer) {\n  var calledRef = React.useRef(false);\n  var timeoutRef = React.useRef(null);\n\n  function cancelTrigger() {\n    window.clearTimeout(timeoutRef.current);\n  }\n\n  function trigger(force) {\n    cancelTrigger();\n\n    if (!calledRef.current || force === true) {\n      if (callback(force) === false) {\n        // Not delay since callback cancelled self\n        return;\n      }\n\n      calledRef.current = true;\n      timeoutRef.current = window.setTimeout(function () {\n        calledRef.current = false;\n      }, buffer);\n    } else {\n      timeoutRef.current = window.setTimeout(function () {\n        calledRef.current = false;\n        trigger();\n      }, buffer);\n    }\n  }\n\n  return [trigger, function () {\n    calledRef.current = false;\n    cancelTrigger();\n  }];\n});","// export this package's api\nimport Align from \"./Align\";\nexport default Align;","import _regeneratorRuntime from \"@babel/runtime/helpers/esm/regeneratorRuntime\";\nimport _asyncToGenerator from \"@babel/runtime/helpers/esm/asyncToGenerator\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { useEffect, useRef } from 'react';\nimport raf from \"rc-util/es/raf\";\nimport useState from \"rc-util/es/hooks/useState\";\n/**\n * Popup should follow the steps for each component work correctly:\n * measure - check for the current stretch size\n * align - let component align the position\n * aligned - re-align again in case additional className changed the size\n * afterAlign - choice next step is trigger motion or finished\n * beforeMotion - should reset motion to invisible so that CSSMotion can do normal motion\n * motion - play the motion\n * stable - everything is done\n */\n\nvar StatusQueue = ['measure', 'alignPre', 'align', null, 'motion'];\nexport default (function (visible, doMeasure) {\n  var _useState = useState(null),\n      _useState2 = _slicedToArray(_useState, 2),\n      status = _useState2[0],\n      setInternalStatus = _useState2[1];\n\n  var rafRef = useRef();\n\n  function setStatus(nextStatus) {\n    setInternalStatus(nextStatus, true);\n  }\n\n  function cancelRaf() {\n    raf.cancel(rafRef.current);\n  }\n\n  function goNextStatus(callback) {\n    cancelRaf();\n    rafRef.current = raf(function () {\n      // Only align should be manually trigger\n      setStatus(function (prev) {\n        switch (status) {\n          case 'align':\n            return 'motion';\n\n          case 'motion':\n            return 'stable';\n\n          default:\n        }\n\n        return prev;\n      });\n      callback === null || callback === void 0 ? void 0 : callback();\n    });\n  } // Init status\n\n\n  useEffect(function () {\n    setStatus('measure');\n  }, [visible]); // Go next status\n\n  useEffect(function () {\n    switch (status) {\n      case 'measure':\n        doMeasure();\n        break;\n\n      default:\n    }\n\n    if (status) {\n      rafRef.current = raf( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n        var index, nextStatus;\n        return _regeneratorRuntime().wrap(function _callee$(_context) {\n          while (1) {\n            switch (_context.prev = _context.next) {\n              case 0:\n                index = StatusQueue.indexOf(status);\n                nextStatus = StatusQueue[index + 1];\n\n                if (nextStatus && index !== -1) {\n                  setStatus(nextStatus);\n                }\n\n              case 3:\n              case \"end\":\n                return _context.stop();\n            }\n          }\n        }, _callee);\n      })));\n    }\n  }, [status]);\n  useEffect(function () {\n    return function () {\n      cancelRaf();\n    };\n  }, []);\n  return [status, goNextStatus];\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nimport { useRef, useState } from 'react';\nimport Align from 'rc-align';\nimport useLayoutEffect from \"rc-util/es/hooks/useLayoutEffect\";\nimport CSSMotion from 'rc-motion';\nimport classNames from 'classnames';\nimport useVisibleStatus from \"./useVisibleStatus\";\nimport { getMotion } from \"../utils/legacyUtil\";\nimport useStretchStyle from \"./useStretchStyle\";\nvar PopupInner = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var visible = props.visible,\n      prefixCls = props.prefixCls,\n      className = props.className,\n      style = props.style,\n      children = props.children,\n      zIndex = props.zIndex,\n      stretch = props.stretch,\n      destroyPopupOnHide = props.destroyPopupOnHide,\n      forceRender = props.forceRender,\n      align = props.align,\n      point = props.point,\n      getRootDomNode = props.getRootDomNode,\n      getClassNameFromAlign = props.getClassNameFromAlign,\n      onAlign = props.onAlign,\n      onMouseEnter = props.onMouseEnter,\n      onMouseLeave = props.onMouseLeave,\n      onMouseDown = props.onMouseDown,\n      onTouchStart = props.onTouchStart,\n      onClick = props.onClick;\n  var alignRef = useRef();\n  var elementRef = useRef();\n\n  var _useState = useState(),\n      _useState2 = _slicedToArray(_useState, 2),\n      alignedClassName = _useState2[0],\n      setAlignedClassName = _useState2[1]; // ======================= Measure ========================\n\n\n  var _useStretchStyle = useStretchStyle(stretch),\n      _useStretchStyle2 = _slicedToArray(_useStretchStyle, 2),\n      stretchStyle = _useStretchStyle2[0],\n      measureStretchStyle = _useStretchStyle2[1];\n\n  function doMeasure() {\n    if (stretch) {\n      measureStretchStyle(getRootDomNode());\n    }\n  } // ======================== Status ========================\n\n\n  var _useVisibleStatus = useVisibleStatus(visible, doMeasure),\n      _useVisibleStatus2 = _slicedToArray(_useVisibleStatus, 2),\n      status = _useVisibleStatus2[0],\n      goNextStatus = _useVisibleStatus2[1]; // ======================== Aligns ========================\n\n  /**\n   * `alignedClassName` may modify `source` size,\n   * which means one time align may not move to the correct position at once.\n   *\n   * We will reset `alignTimes` for each status switch to `alignPre`\n   * and let `rc-align` to align for multiple times to ensure get final stable place.\n   * Currently we mark `alignTimes < 2` repeat align, it will increase if user report for align issue.\n   * \n   * Update:\n   * In React 18. `rc-align` effect of align may faster than ref called trigger `forceAlign`.\n   * We adjust this to `alignTimes < 2`.\n   * We need refactor `rc-align` to support mark of `forceAlign` call if this still happen.\n   */\n\n\n  var _useState3 = useState(0),\n      _useState4 = _slicedToArray(_useState3, 2),\n      alignTimes = _useState4[0],\n      setAlignTimes = _useState4[1];\n\n  var prepareResolveRef = useRef();\n  useLayoutEffect(function () {\n    if (status === 'alignPre') {\n      setAlignTimes(0);\n    }\n  }, [status]); // `target` on `rc-align` can accept as a function to get the bind element or a point.\n  // ref: https://www.npmjs.com/package/rc-align\n\n  function getAlignTarget() {\n    if (point) {\n      return point;\n    }\n\n    return getRootDomNode;\n  }\n\n  function forceAlign() {\n    var _alignRef$current;\n\n    (_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 ? void 0 : _alignRef$current.forceAlign();\n  }\n\n  function onInternalAlign(popupDomNode, matchAlign) {\n    var nextAlignedClassName = getClassNameFromAlign(matchAlign);\n\n    if (alignedClassName !== nextAlignedClassName) {\n      setAlignedClassName(nextAlignedClassName);\n    } // We will retry multi times to make sure that the element has been align in the right position.\n\n\n    setAlignTimes(function (val) {\n      return val + 1;\n    });\n\n    if (status === 'align') {\n      onAlign === null || onAlign === void 0 ? void 0 : onAlign(popupDomNode, matchAlign);\n    }\n  } // Delay to go to next status\n\n\n  useLayoutEffect(function () {\n    if (status === 'align') {\n      // Repeat until not more align needed\n      if (alignTimes < 3) {\n        forceAlign();\n      } else {\n        goNextStatus(function () {\n          var _prepareResolveRef$cu;\n\n          (_prepareResolveRef$cu = prepareResolveRef.current) === null || _prepareResolveRef$cu === void 0 ? void 0 : _prepareResolveRef$cu.call(prepareResolveRef);\n        });\n      }\n    }\n  }, [alignTimes]); // ======================== Motion ========================\n\n  var motion = _objectSpread({}, getMotion(props));\n\n  ['onAppearEnd', 'onEnterEnd', 'onLeaveEnd'].forEach(function (eventName) {\n    var originHandler = motion[eventName];\n\n    motion[eventName] = function (element, event) {\n      goNextStatus();\n      return originHandler === null || originHandler === void 0 ? void 0 : originHandler(element, event);\n    };\n  });\n\n  function onShowPrepare() {\n    return new Promise(function (resolve) {\n      prepareResolveRef.current = resolve;\n    });\n  } // Go to stable directly when motion not provided\n\n\n  React.useEffect(function () {\n    if (!motion.motionName && status === 'motion') {\n      goNextStatus();\n    }\n  }, [motion.motionName, status]); // ========================= Refs =========================\n\n  React.useImperativeHandle(ref, function () {\n    return {\n      forceAlign: forceAlign,\n      getElement: function getElement() {\n        return elementRef.current;\n      }\n    };\n  }); // ======================== Render ========================\n\n  var mergedStyle = _objectSpread(_objectSpread({}, stretchStyle), {}, {\n    zIndex: zIndex,\n    opacity: status === 'motion' || status === 'stable' || !visible ? undefined : 0,\n    // Cannot interact with disappearing elements\n    // https://github.com/ant-design/ant-design/issues/35051#issuecomment-1101340714\n    pointerEvents: !visible && status !== 'stable' ? 'none' : undefined\n  }, style); // Align status\n\n\n  var alignDisabled = true;\n\n  if (align !== null && align !== void 0 && align.points && (status === 'align' || status === 'stable')) {\n    alignDisabled = false;\n  }\n\n  var childNode = children; // Wrapper when multiple children\n\n  if (React.Children.count(children) > 1) {\n    childNode = /*#__PURE__*/React.createElement(\"div\", {\n      className: \"\".concat(prefixCls, \"-content\")\n    }, children);\n  }\n\n  return /*#__PURE__*/React.createElement(CSSMotion, _extends({\n    visible: visible,\n    ref: elementRef,\n    leavedClassName: \"\".concat(prefixCls, \"-hidden\")\n  }, motion, {\n    onAppearPrepare: onShowPrepare,\n    onEnterPrepare: onShowPrepare,\n    removeOnLeave: destroyPopupOnHide,\n    forceRender: forceRender\n  }), function (_ref, motionRef) {\n    var motionClassName = _ref.className,\n        motionStyle = _ref.style;\n    var mergedClassName = classNames(prefixCls, className, alignedClassName, motionClassName);\n    return /*#__PURE__*/React.createElement(Align, {\n      target: getAlignTarget(),\n      key: \"popup\",\n      ref: alignRef,\n      monitorWindowResize: true,\n      disabled: alignDisabled,\n      align: align,\n      onAlign: onInternalAlign\n    }, /*#__PURE__*/React.createElement(\"div\", {\n      ref: motionRef,\n      className: mergedClassName,\n      onMouseEnter: onMouseEnter,\n      onMouseLeave: onMouseLeave,\n      onMouseDownCapture: onMouseDown,\n      onTouchStartCapture: onTouchStart,\n      onClick: onClick,\n      style: _objectSpread(_objectSpread({}, motionStyle), mergedStyle)\n    }, childNode));\n  });\n});\nPopupInner.displayName = 'PopupInner';\nexport default PopupInner;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nexport default (function (stretch) {\n  var _React$useState = React.useState({\n    width: 0,\n    height: 0\n  }),\n      _React$useState2 = _slicedToArray(_React$useState, 2),\n      targetSize = _React$useState2[0],\n      setTargetSize = _React$useState2[1];\n\n  function measureStretch(element) {\n    var tgtWidth = element.offsetWidth,\n        tgtHeight = element.offsetHeight;\n\n    var _element$getBoundingC = element.getBoundingClientRect(),\n        width = _element$getBoundingC.width,\n        height = _element$getBoundingC.height; // Rect is more accurate than offset, use if near\n\n\n    if (Math.abs(tgtWidth - width) < 1 && Math.abs(tgtHeight - height) < 1) {\n      tgtWidth = width;\n      tgtHeight = height;\n    }\n\n    setTargetSize({\n      width: tgtWidth,\n      height: tgtHeight\n    });\n  } // Merge stretch style\n\n\n  var style = React.useMemo(function () {\n    var sizeStyle = {};\n\n    if (stretch) {\n      var width = targetSize.width,\n          height = targetSize.height; // Stretch with target\n\n      if (stretch.indexOf('height') !== -1 && height) {\n        sizeStyle.height = height;\n      } else if (stretch.indexOf('minHeight') !== -1 && height) {\n        sizeStyle.minHeight = height;\n      }\n\n      if (stretch.indexOf('width') !== -1 && width) {\n        sizeStyle.width = width;\n      } else if (stretch.indexOf('minWidth') !== -1 && width) {\n        sizeStyle.minWidth = width;\n      }\n    }\n\n    return sizeStyle;\n  }, [stretch, targetSize]);\n  return [style, measureStretch];\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport * as React from 'react';\nimport CSSMotion from 'rc-motion';\nimport classNames from 'classnames';\nvar MobilePopupInner = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var prefixCls = props.prefixCls,\n      visible = props.visible,\n      zIndex = props.zIndex,\n      children = props.children,\n      _props$mobile = props.mobile;\n  _props$mobile = _props$mobile === void 0 ? {} : _props$mobile;\n  var popupClassName = _props$mobile.popupClassName,\n      popupStyle = _props$mobile.popupStyle,\n      _props$mobile$popupMo = _props$mobile.popupMotion,\n      popupMotion = _props$mobile$popupMo === void 0 ? {} : _props$mobile$popupMo,\n      popupRender = _props$mobile.popupRender,\n      onClick = props.onClick;\n  var elementRef = React.useRef(); // ========================= Refs =========================\n\n  React.useImperativeHandle(ref, function () {\n    return {\n      forceAlign: function forceAlign() {},\n      getElement: function getElement() {\n        return elementRef.current;\n      }\n    };\n  }); // ======================== Render ========================\n\n  var mergedStyle = _objectSpread({\n    zIndex: zIndex\n  }, popupStyle);\n\n  var childNode = children; // Wrapper when multiple children\n\n  if (React.Children.count(children) > 1) {\n    childNode = /*#__PURE__*/React.createElement(\"div\", {\n      className: \"\".concat(prefixCls, \"-content\")\n    }, children);\n  } // Mobile support additional render\n\n\n  if (popupRender) {\n    childNode = popupRender(childNode);\n  }\n\n  return /*#__PURE__*/React.createElement(CSSMotion, _extends({\n    visible: visible,\n    ref: elementRef,\n    removeOnLeave: true\n  }, popupMotion), function (_ref, motionRef) {\n    var motionClassName = _ref.className,\n        motionStyle = _ref.style;\n    var mergedClassName = classNames(prefixCls, popupClassName, motionClassName);\n    return /*#__PURE__*/React.createElement(\"div\", {\n      ref: motionRef,\n      className: mergedClassName,\n      onClick: onClick,\n      style: _objectSpread(_objectSpread({}, motionStyle), mergedStyle)\n    }, childNode);\n  });\n});\nMobilePopupInner.displayName = 'MobilePopupInner';\nexport default MobilePopupInner;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"visible\", \"mobile\"];\nimport * as React from 'react';\nimport { useState, useEffect } from 'react';\nimport isMobile from \"rc-util/es/isMobile\";\nimport Mask from \"./Mask\";\nimport PopupInner from \"./PopupInner\";\nimport MobilePopupInner from \"./MobilePopupInner\";\nvar Popup = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n  var visible = _ref.visible,\n      mobile = _ref.mobile,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  var _useState = useState(visible),\n      _useState2 = _slicedToArray(_useState, 2),\n      innerVisible = _useState2[0],\n      serInnerVisible = _useState2[1];\n\n  var _useState3 = useState(false),\n      _useState4 = _slicedToArray(_useState3, 2),\n      inMobile = _useState4[0],\n      setInMobile = _useState4[1];\n\n  var cloneProps = _objectSpread(_objectSpread({}, props), {}, {\n    visible: innerVisible\n  }); // We check mobile in visible changed here.\n  // And this also delay set `innerVisible` to avoid popup component render flash\n\n\n  useEffect(function () {\n    serInnerVisible(visible);\n\n    if (visible && mobile) {\n      setInMobile(isMobile());\n    }\n  }, [visible, mobile]);\n  var popupNode = inMobile ? /*#__PURE__*/React.createElement(MobilePopupInner, _extends({}, cloneProps, {\n    mobile: mobile,\n    ref: ref\n  })) : /*#__PURE__*/React.createElement(PopupInner, _extends({}, cloneProps, {\n    ref: ref\n  })); // We can use fragment directly but this may failed some selector usage. Keep as origin logic\n\n  return /*#__PURE__*/React.createElement(\"div\", null, /*#__PURE__*/React.createElement(Mask, cloneProps), popupNode);\n});\nPopup.displayName = 'Popup';\nexport default Popup;","import * as React from 'react';\nvar TriggerContext = /*#__PURE__*/React.createContext(null);\nexport default TriggerContext;","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, toPropertyKey(descriptor.key), descriptor);\n  }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}","export default function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n  return self;\n}","export default function _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n  return _setPrototypeOf(o, p);\n}","export default function _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}","import { useRef, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport ReactDOM from 'react-dom';\nimport canUseDom from './Dom/canUseDom';\nvar Portal = /*#__PURE__*/forwardRef(function (props, ref) {\n  var didUpdate = props.didUpdate,\n    getContainer = props.getContainer,\n    children = props.children;\n  var parentRef = useRef();\n  var containerRef = useRef();\n  // Ref return nothing, only for wrapper check exist\n  useImperativeHandle(ref, function () {\n    return {};\n  });\n  // Create container in client side with sync to avoid useEffect not get ref\n  var initRef = useRef(false);\n  if (!initRef.current && canUseDom()) {\n    containerRef.current = getContainer();\n    parentRef.current = containerRef.current.parentNode;\n    initRef.current = true;\n  }\n  // [Legacy] Used by `rc-trigger`\n  useEffect(function () {\n    didUpdate === null || didUpdate === void 0 ? void 0 : didUpdate(props);\n  });\n  useEffect(function () {\n    // Restore container to original place\n    // React 18 StrictMode will unmount first and mount back for effect test:\n    // https://reactjs.org/blog/2022/03/29/react-v18.html#new-strict-mode-behaviors\n    if (containerRef.current.parentNode === null && parentRef.current !== null) {\n      parentRef.current.appendChild(containerRef.current);\n    }\n    return function () {\n      var _containerRef$current, _containerRef$current2;\n      // [Legacy] This should not be handle by Portal but parent PortalWrapper instead.\n      // Since some component use `Portal` directly, we have to keep the logic here.\n      (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : (_containerRef$current2 = _containerRef$current.parentNode) === null || _containerRef$current2 === void 0 ? void 0 : _containerRef$current2.removeChild(containerRef.current);\n    };\n  }, []);\n  return containerRef.current ? /*#__PURE__*/ReactDOM.createPortal(children, containerRef.current) : null;\n});\nexport default Portal;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\n\nfunction isPointsEq(a1, a2, isAlignPoint) {\n  if (isAlignPoint) {\n    return a1[0] === a2[0];\n  }\n\n  return a1[0] === a2[0] && a1[1] === a2[1];\n}\n\nexport function getAlignFromPlacement(builtinPlacements, placementStr, align) {\n  var baseAlign = builtinPlacements[placementStr] || {};\n  return _objectSpread(_objectSpread({}, baseAlign), align);\n}\nexport function getAlignPopupClassName(builtinPlacements, prefixCls, align, isAlignPoint) {\n  var points = align.points;\n  var placements = Object.keys(builtinPlacements);\n\n  for (var i = 0; i < placements.length; i += 1) {\n    var placement = placements[i];\n\n    if (isPointsEq(builtinPlacements[placement].points, points, isAlignPoint)) {\n      return \"\".concat(prefixCls, \"-placement-\").concat(placement);\n    }\n  }\n\n  return '';\n}","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport * as React from 'react';\nimport ReactDOM from 'react-dom';\nimport raf from \"rc-util/es/raf\";\nimport contains from \"rc-util/es/Dom/contains\";\nimport findDOMNode from \"rc-util/es/Dom/findDOMNode\";\nimport { composeRef, supportRef } from \"rc-util/es/ref\";\nimport addEventListener from \"rc-util/es/Dom/addEventListener\";\nimport Portal from \"rc-util/es/Portal\";\nimport classNames from 'classnames';\nimport { getAlignFromPlacement, getAlignPopupClassName } from \"./utils/alignUtil\";\nimport Popup from \"./Popup\";\nimport TriggerContext from \"./context\";\n\nfunction noop() {}\n\nfunction returnEmptyString() {\n  return '';\n}\n\nfunction returnDocument(element) {\n  if (element) {\n    return element.ownerDocument;\n  }\n\n  return window.document;\n}\n\nvar ALL_HANDLERS = ['onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur', 'onContextMenu'];\n\n/**\n * Internal usage. Do not use in your code since this will be removed.\n */\nexport function generateTrigger(PortalComponent) {\n  var Trigger = /*#__PURE__*/function (_React$Component) {\n    _inherits(Trigger, _React$Component);\n\n    var _super = _createSuper(Trigger);\n\n    // ensure `getContainer` will be called only once\n    function Trigger(props) {\n      var _this;\n\n      _classCallCheck(this, Trigger);\n\n      _this = _super.call(this, props);\n\n      _defineProperty(_assertThisInitialized(_this), \"popupRef\", /*#__PURE__*/React.createRef());\n\n      _defineProperty(_assertThisInitialized(_this), \"triggerRef\", /*#__PURE__*/React.createRef());\n\n      _defineProperty(_assertThisInitialized(_this), \"portalContainer\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"attachId\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"clickOutsideHandler\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"touchOutsideHandler\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"contextMenuOutsideHandler1\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"contextMenuOutsideHandler2\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"mouseDownTimeout\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"focusTime\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"preClickTime\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"preTouchTime\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"delayTimer\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"hasPopupMouseDown\", void 0);\n\n      _defineProperty(_assertThisInitialized(_this), \"onMouseEnter\", function (e) {\n        var mouseEnterDelay = _this.props.mouseEnterDelay;\n\n        _this.fireEvents('onMouseEnter', e);\n\n        _this.delaySetPopupVisible(true, mouseEnterDelay, mouseEnterDelay ? null : e);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onMouseMove\", function (e) {\n        _this.fireEvents('onMouseMove', e);\n\n        _this.setPoint(e);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onMouseLeave\", function (e) {\n        _this.fireEvents('onMouseLeave', e);\n\n        _this.delaySetPopupVisible(false, _this.props.mouseLeaveDelay);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onPopupMouseEnter\", function () {\n        _this.clearDelayTimer();\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onPopupMouseLeave\", function (e) {\n        var _this$popupRef$curren;\n\n        // https://github.com/react-component/trigger/pull/13\n        // react bug?\n        if (e.relatedTarget && !e.relatedTarget.setTimeout && contains((_this$popupRef$curren = _this.popupRef.current) === null || _this$popupRef$curren === void 0 ? void 0 : _this$popupRef$curren.getElement(), e.relatedTarget)) {\n          return;\n        }\n\n        _this.delaySetPopupVisible(false, _this.props.mouseLeaveDelay);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onFocus\", function (e) {\n        _this.fireEvents('onFocus', e); // incase focusin and focusout\n\n\n        _this.clearDelayTimer();\n\n        if (_this.isFocusToShow()) {\n          _this.focusTime = Date.now();\n\n          _this.delaySetPopupVisible(true, _this.props.focusDelay);\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onMouseDown\", function (e) {\n        _this.fireEvents('onMouseDown', e);\n\n        _this.preClickTime = Date.now();\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onTouchStart\", function (e) {\n        _this.fireEvents('onTouchStart', e);\n\n        _this.preTouchTime = Date.now();\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onBlur\", function (e) {\n        _this.fireEvents('onBlur', e);\n\n        _this.clearDelayTimer();\n\n        if (_this.isBlurToHide()) {\n          _this.delaySetPopupVisible(false, _this.props.blurDelay);\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onContextMenu\", function (e) {\n        e.preventDefault();\n\n        _this.fireEvents('onContextMenu', e);\n\n        _this.setPopupVisible(true, e);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onContextMenuClose\", function () {\n        if (_this.isContextMenuToShow()) {\n          _this.close();\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onClick\", function (event) {\n        _this.fireEvents('onClick', event); // focus will trigger click\n\n\n        if (_this.focusTime) {\n          var preTime;\n\n          if (_this.preClickTime && _this.preTouchTime) {\n            preTime = Math.min(_this.preClickTime, _this.preTouchTime);\n          } else if (_this.preClickTime) {\n            preTime = _this.preClickTime;\n          } else if (_this.preTouchTime) {\n            preTime = _this.preTouchTime;\n          }\n\n          if (Math.abs(preTime - _this.focusTime) < 20) {\n            return;\n          }\n\n          _this.focusTime = 0;\n        }\n\n        _this.preClickTime = 0;\n        _this.preTouchTime = 0; // Only prevent default when all the action is click.\n        // https://github.com/ant-design/ant-design/issues/17043\n        // https://github.com/ant-design/ant-design/issues/17291\n\n        if (_this.isClickToShow() && (_this.isClickToHide() || _this.isBlurToHide()) && event && event.preventDefault) {\n          event.preventDefault();\n        }\n\n        var nextVisible = !_this.state.popupVisible;\n\n        if (_this.isClickToHide() && !nextVisible || nextVisible && _this.isClickToShow()) {\n          _this.setPopupVisible(!_this.state.popupVisible, event);\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onPopupMouseDown\", function () {\n        _this.hasPopupMouseDown = true;\n        clearTimeout(_this.mouseDownTimeout);\n        _this.mouseDownTimeout = window.setTimeout(function () {\n          _this.hasPopupMouseDown = false;\n        }, 0);\n\n        if (_this.context) {\n          var _this$context;\n\n          (_this$context = _this.context).onPopupMouseDown.apply(_this$context, arguments);\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"onDocumentClick\", function (event) {\n        if (_this.props.mask && !_this.props.maskClosable) {\n          return;\n        }\n\n        var target = event.target;\n\n        var root = _this.getRootDomNode();\n\n        var popupNode = _this.getPopupDomNode();\n\n        if ( // mousedown on the target should also close popup when action is contextMenu.\n        // https://github.com/ant-design/ant-design/issues/29853\n        (!contains(root, target) || _this.isContextMenuOnly()) && !contains(popupNode, target) && !_this.hasPopupMouseDown) {\n          _this.close();\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"getRootDomNode\", function () {\n        var getTriggerDOMNode = _this.props.getTriggerDOMNode;\n\n        if (getTriggerDOMNode) {\n          return getTriggerDOMNode(_this.triggerRef.current);\n        }\n\n        try {\n          var domNode = findDOMNode(_this.triggerRef.current);\n\n          if (domNode) {\n            return domNode;\n          }\n        } catch (err) {// Do nothing\n        }\n\n        return ReactDOM.findDOMNode(_assertThisInitialized(_this));\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"getPopupClassNameFromAlign\", function (align) {\n        var className = [];\n        var _this$props = _this.props,\n            popupPlacement = _this$props.popupPlacement,\n            builtinPlacements = _this$props.builtinPlacements,\n            prefixCls = _this$props.prefixCls,\n            alignPoint = _this$props.alignPoint,\n            getPopupClassNameFromAlign = _this$props.getPopupClassNameFromAlign;\n\n        if (popupPlacement && builtinPlacements) {\n          className.push(getAlignPopupClassName(builtinPlacements, prefixCls, align, alignPoint));\n        }\n\n        if (getPopupClassNameFromAlign) {\n          className.push(getPopupClassNameFromAlign(align));\n        }\n\n        return className.join(' ');\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"getComponent\", function () {\n        var _this$props2 = _this.props,\n            prefixCls = _this$props2.prefixCls,\n            destroyPopupOnHide = _this$props2.destroyPopupOnHide,\n            popupClassName = _this$props2.popupClassName,\n            onPopupAlign = _this$props2.onPopupAlign,\n            popupMotion = _this$props2.popupMotion,\n            popupAnimation = _this$props2.popupAnimation,\n            popupTransitionName = _this$props2.popupTransitionName,\n            popupStyle = _this$props2.popupStyle,\n            mask = _this$props2.mask,\n            maskAnimation = _this$props2.maskAnimation,\n            maskTransitionName = _this$props2.maskTransitionName,\n            maskMotion = _this$props2.maskMotion,\n            zIndex = _this$props2.zIndex,\n            popup = _this$props2.popup,\n            stretch = _this$props2.stretch,\n            alignPoint = _this$props2.alignPoint,\n            mobile = _this$props2.mobile,\n            forceRender = _this$props2.forceRender,\n            onPopupClick = _this$props2.onPopupClick;\n        var _this$state = _this.state,\n            popupVisible = _this$state.popupVisible,\n            point = _this$state.point;\n\n        var align = _this.getPopupAlign();\n\n        var mouseProps = {};\n\n        if (_this.isMouseEnterToShow()) {\n          mouseProps.onMouseEnter = _this.onPopupMouseEnter;\n        }\n\n        if (_this.isMouseLeaveToHide()) {\n          mouseProps.onMouseLeave = _this.onPopupMouseLeave;\n        }\n\n        mouseProps.onMouseDown = _this.onPopupMouseDown;\n        mouseProps.onTouchStart = _this.onPopupMouseDown;\n        return /*#__PURE__*/React.createElement(Popup, _extends({\n          prefixCls: prefixCls,\n          destroyPopupOnHide: destroyPopupOnHide,\n          visible: popupVisible,\n          point: alignPoint && point,\n          className: popupClassName,\n          align: align,\n          onAlign: onPopupAlign,\n          animation: popupAnimation,\n          getClassNameFromAlign: _this.getPopupClassNameFromAlign\n        }, mouseProps, {\n          stretch: stretch,\n          getRootDomNode: _this.getRootDomNode,\n          style: popupStyle,\n          mask: mask,\n          zIndex: zIndex,\n          transitionName: popupTransitionName,\n          maskAnimation: maskAnimation,\n          maskTransitionName: maskTransitionName,\n          maskMotion: maskMotion,\n          ref: _this.popupRef,\n          motion: popupMotion,\n          mobile: mobile,\n          forceRender: forceRender,\n          onClick: onPopupClick\n        }), typeof popup === 'function' ? popup() : popup);\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"attachParent\", function (popupContainer) {\n        raf.cancel(_this.attachId);\n        var _this$props3 = _this.props,\n            getPopupContainer = _this$props3.getPopupContainer,\n            getDocument = _this$props3.getDocument;\n\n        var domNode = _this.getRootDomNode();\n\n        var mountNode;\n\n        if (!getPopupContainer) {\n          mountNode = getDocument(_this.getRootDomNode()).body;\n        } else if (domNode || getPopupContainer.length === 0) {\n          // Compatible for legacy getPopupContainer with domNode argument.\n          // If no need `domNode` argument, will call directly.\n          // https://codesandbox.io/s/eloquent-mclean-ss93m?file=/src/App.js\n          mountNode = getPopupContainer(domNode);\n        }\n\n        if (mountNode) {\n          mountNode.appendChild(popupContainer);\n        } else {\n          // Retry after frame render in case parent not ready\n          _this.attachId = raf(function () {\n            _this.attachParent(popupContainer);\n          });\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"getContainer\", function () {\n        if (!_this.portalContainer) {\n          // In React.StrictMode component will call render multiple time in first mount.\n          // When you want to refactor with FC, useRef will also init multiple time and\n          // point to different useRef instance which will create multiple element\n          // (This multiple render will not trigger effect so you can not clean up this\n          // in effect). But this is safe with class component since it always point to same class instance.\n          var getDocument = _this.props.getDocument;\n          var popupContainer = getDocument(_this.getRootDomNode()).createElement('div'); // Make sure default popup container will never cause scrollbar appearing\n          // https://github.com/react-component/trigger/issues/41\n\n          popupContainer.style.position = 'absolute';\n          popupContainer.style.top = '0';\n          popupContainer.style.left = '0';\n          popupContainer.style.width = '100%';\n          _this.portalContainer = popupContainer;\n        }\n\n        _this.attachParent(_this.portalContainer);\n\n        return _this.portalContainer;\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"setPoint\", function (point) {\n        var alignPoint = _this.props.alignPoint;\n        if (!alignPoint || !point) return;\n\n        _this.setState({\n          point: {\n            pageX: point.pageX,\n            pageY: point.pageY\n          }\n        });\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"handlePortalUpdate\", function () {\n        if (_this.state.prevPopupVisible !== _this.state.popupVisible) {\n          _this.props.afterPopupVisibleChange(_this.state.popupVisible);\n        }\n      });\n\n      _defineProperty(_assertThisInitialized(_this), \"triggerContextValue\", {\n        onPopupMouseDown: _this.onPopupMouseDown\n      });\n\n      var _popupVisible;\n\n      if ('popupVisible' in props) {\n        _popupVisible = !!props.popupVisible;\n      } else {\n        _popupVisible = !!props.defaultPopupVisible;\n      }\n\n      _this.state = {\n        prevPopupVisible: _popupVisible,\n        popupVisible: _popupVisible\n      };\n      ALL_HANDLERS.forEach(function (h) {\n        _this[\"fire\".concat(h)] = function (e) {\n          _this.fireEvents(h, e);\n        };\n      });\n      return _this;\n    }\n\n    _createClass(Trigger, [{\n      key: \"componentDidMount\",\n      value: function componentDidMount() {\n        this.componentDidUpdate();\n      }\n    }, {\n      key: \"componentDidUpdate\",\n      value: function componentDidUpdate() {\n        var props = this.props;\n        var state = this.state; // We must listen to `mousedown` or `touchstart`, edge case:\n        // https://github.com/ant-design/ant-design/issues/5804\n        // https://github.com/react-component/calendar/issues/250\n        // https://github.com/react-component/trigger/issues/50\n\n        if (state.popupVisible) {\n          var currentDocument;\n\n          if (!this.clickOutsideHandler && (this.isClickToHide() || this.isContextMenuToShow())) {\n            currentDocument = props.getDocument(this.getRootDomNode());\n            this.clickOutsideHandler = addEventListener(currentDocument, 'mousedown', this.onDocumentClick);\n          } // always hide on mobile\n\n\n          if (!this.touchOutsideHandler) {\n            currentDocument = currentDocument || props.getDocument(this.getRootDomNode());\n            this.touchOutsideHandler = addEventListener(currentDocument, 'touchstart', this.onDocumentClick);\n          } // close popup when trigger type contains 'onContextMenu' and document is scrolling.\n\n\n          if (!this.contextMenuOutsideHandler1 && this.isContextMenuToShow()) {\n            currentDocument = currentDocument || props.getDocument(this.getRootDomNode());\n            this.contextMenuOutsideHandler1 = addEventListener(currentDocument, 'scroll', this.onContextMenuClose);\n          } // close popup when trigger type contains 'onContextMenu' and window is blur.\n\n\n          if (!this.contextMenuOutsideHandler2 && this.isContextMenuToShow()) {\n            this.contextMenuOutsideHandler2 = addEventListener(window, 'blur', this.onContextMenuClose);\n          }\n\n          return;\n        }\n\n        this.clearOutsideHandler();\n      }\n    }, {\n      key: \"componentWillUnmount\",\n      value: function componentWillUnmount() {\n        this.clearDelayTimer();\n        this.clearOutsideHandler();\n        clearTimeout(this.mouseDownTimeout);\n        raf.cancel(this.attachId);\n      }\n    }, {\n      key: \"getPopupDomNode\",\n      value: function getPopupDomNode() {\n        var _this$popupRef$curren2;\n\n        // for test\n        return ((_this$popupRef$curren2 = this.popupRef.current) === null || _this$popupRef$curren2 === void 0 ? void 0 : _this$popupRef$curren2.getElement()) || null;\n      }\n    }, {\n      key: \"getPopupAlign\",\n      value: function getPopupAlign() {\n        var props = this.props;\n        var popupPlacement = props.popupPlacement,\n            popupAlign = props.popupAlign,\n            builtinPlacements = props.builtinPlacements;\n\n        if (popupPlacement && builtinPlacements) {\n          return getAlignFromPlacement(builtinPlacements, popupPlacement, popupAlign);\n        }\n\n        return popupAlign;\n      }\n    }, {\n      key: \"setPopupVisible\",\n      value:\n      /**\n       * @param popupVisible    Show or not the popup element\n       * @param event           SyntheticEvent, used for `pointAlign`\n       */\n      function setPopupVisible(popupVisible, event) {\n        var alignPoint = this.props.alignPoint;\n        var prevPopupVisible = this.state.popupVisible;\n        this.clearDelayTimer();\n\n        if (prevPopupVisible !== popupVisible) {\n          if (!('popupVisible' in this.props)) {\n            this.setState({\n              popupVisible: popupVisible,\n              prevPopupVisible: prevPopupVisible\n            });\n          }\n\n          this.props.onPopupVisibleChange(popupVisible);\n        } // Always record the point position since mouseEnterDelay will delay the show\n\n\n        if (alignPoint && event && popupVisible) {\n          this.setPoint(event);\n        }\n      }\n    }, {\n      key: \"delaySetPopupVisible\",\n      value: function delaySetPopupVisible(visible, delayS, event) {\n        var _this2 = this;\n\n        var delay = delayS * 1000;\n        this.clearDelayTimer();\n\n        if (delay) {\n          var point = event ? {\n            pageX: event.pageX,\n            pageY: event.pageY\n          } : null;\n          this.delayTimer = window.setTimeout(function () {\n            _this2.setPopupVisible(visible, point);\n\n            _this2.clearDelayTimer();\n          }, delay);\n        } else {\n          this.setPopupVisible(visible, event);\n        }\n      }\n    }, {\n      key: \"clearDelayTimer\",\n      value: function clearDelayTimer() {\n        if (this.delayTimer) {\n          clearTimeout(this.delayTimer);\n          this.delayTimer = null;\n        }\n      }\n    }, {\n      key: \"clearOutsideHandler\",\n      value: function clearOutsideHandler() {\n        if (this.clickOutsideHandler) {\n          this.clickOutsideHandler.remove();\n          this.clickOutsideHandler = null;\n        }\n\n        if (this.contextMenuOutsideHandler1) {\n          this.contextMenuOutsideHandler1.remove();\n          this.contextMenuOutsideHandler1 = null;\n        }\n\n        if (this.contextMenuOutsideHandler2) {\n          this.contextMenuOutsideHandler2.remove();\n          this.contextMenuOutsideHandler2 = null;\n        }\n\n        if (this.touchOutsideHandler) {\n          this.touchOutsideHandler.remove();\n          this.touchOutsideHandler = null;\n        }\n      }\n    }, {\n      key: \"createTwoChains\",\n      value: function createTwoChains(event) {\n        var childPros = this.props.children.props;\n        var props = this.props;\n\n        if (childPros[event] && props[event]) {\n          return this[\"fire\".concat(event)];\n        }\n\n        return childPros[event] || props[event];\n      }\n    }, {\n      key: \"isClickToShow\",\n      value: function isClickToShow() {\n        var _this$props4 = this.props,\n            action = _this$props4.action,\n            showAction = _this$props4.showAction;\n        return action.indexOf('click') !== -1 || showAction.indexOf('click') !== -1;\n      }\n    }, {\n      key: \"isContextMenuOnly\",\n      value: function isContextMenuOnly() {\n        var action = this.props.action;\n        return action === 'contextMenu' || action.length === 1 && action[0] === 'contextMenu';\n      }\n    }, {\n      key: \"isContextMenuToShow\",\n      value: function isContextMenuToShow() {\n        var _this$props5 = this.props,\n            action = _this$props5.action,\n            showAction = _this$props5.showAction;\n        return action.indexOf('contextMenu') !== -1 || showAction.indexOf('contextMenu') !== -1;\n      }\n    }, {\n      key: \"isClickToHide\",\n      value: function isClickToHide() {\n        var _this$props6 = this.props,\n            action = _this$props6.action,\n            hideAction = _this$props6.hideAction;\n        return action.indexOf('click') !== -1 || hideAction.indexOf('click') !== -1;\n      }\n    }, {\n      key: \"isMouseEnterToShow\",\n      value: function isMouseEnterToShow() {\n        var _this$props7 = this.props,\n            action = _this$props7.action,\n            showAction = _this$props7.showAction;\n        return action.indexOf('hover') !== -1 || showAction.indexOf('mouseEnter') !== -1;\n      }\n    }, {\n      key: \"isMouseLeaveToHide\",\n      value: function isMouseLeaveToHide() {\n        var _this$props8 = this.props,\n            action = _this$props8.action,\n            hideAction = _this$props8.hideAction;\n        return action.indexOf('hover') !== -1 || hideAction.indexOf('mouseLeave') !== -1;\n      }\n    }, {\n      key: \"isFocusToShow\",\n      value: function isFocusToShow() {\n        var _this$props9 = this.props,\n            action = _this$props9.action,\n            showAction = _this$props9.showAction;\n        return action.indexOf('focus') !== -1 || showAction.indexOf('focus') !== -1;\n      }\n    }, {\n      key: \"isBlurToHide\",\n      value: function isBlurToHide() {\n        var _this$props10 = this.props,\n            action = _this$props10.action,\n            hideAction = _this$props10.hideAction;\n        return action.indexOf('focus') !== -1 || hideAction.indexOf('blur') !== -1;\n      }\n    }, {\n      key: \"forcePopupAlign\",\n      value: function forcePopupAlign() {\n        if (this.state.popupVisible) {\n          var _this$popupRef$curren3;\n\n          (_this$popupRef$curren3 = this.popupRef.current) === null || _this$popupRef$curren3 === void 0 ? void 0 : _this$popupRef$curren3.forceAlign();\n        }\n      }\n    }, {\n      key: \"fireEvents\",\n      value: function fireEvents(type, e) {\n        var childCallback = this.props.children.props[type];\n\n        if (childCallback) {\n          childCallback(e);\n        }\n\n        var callback = this.props[type];\n\n        if (callback) {\n          callback(e);\n        }\n      }\n    }, {\n      key: \"close\",\n      value: function close() {\n        this.setPopupVisible(false);\n      }\n    }, {\n      key: \"render\",\n      value: function render() {\n        var popupVisible = this.state.popupVisible;\n        var _this$props11 = this.props,\n            children = _this$props11.children,\n            forceRender = _this$props11.forceRender,\n            alignPoint = _this$props11.alignPoint,\n            className = _this$props11.className,\n            autoDestroy = _this$props11.autoDestroy;\n        var child = React.Children.only(children);\n        var newChildProps = {\n          key: 'trigger'\n        }; // ============================== Visible Handlers ==============================\n        // >>> ContextMenu\n\n        if (this.isContextMenuToShow()) {\n          newChildProps.onContextMenu = this.onContextMenu;\n        } else {\n          newChildProps.onContextMenu = this.createTwoChains('onContextMenu');\n        } // >>> Click\n\n\n        if (this.isClickToHide() || this.isClickToShow()) {\n          newChildProps.onClick = this.onClick;\n          newChildProps.onMouseDown = this.onMouseDown;\n          newChildProps.onTouchStart = this.onTouchStart;\n        } else {\n          newChildProps.onClick = this.createTwoChains('onClick');\n          newChildProps.onMouseDown = this.createTwoChains('onMouseDown');\n          newChildProps.onTouchStart = this.createTwoChains('onTouchStart');\n        } // >>> Hover(enter)\n\n\n        if (this.isMouseEnterToShow()) {\n          newChildProps.onMouseEnter = this.onMouseEnter; // Point align\n\n          if (alignPoint) {\n            newChildProps.onMouseMove = this.onMouseMove;\n          }\n        } else {\n          newChildProps.onMouseEnter = this.createTwoChains('onMouseEnter');\n        } // >>> Hover(leave)\n\n\n        if (this.isMouseLeaveToHide()) {\n          newChildProps.onMouseLeave = this.onMouseLeave;\n        } else {\n          newChildProps.onMouseLeave = this.createTwoChains('onMouseLeave');\n        } // >>> Focus\n\n\n        if (this.isFocusToShow() || this.isBlurToHide()) {\n          newChildProps.onFocus = this.onFocus;\n          newChildProps.onBlur = this.onBlur;\n        } else {\n          newChildProps.onFocus = this.createTwoChains('onFocus');\n          newChildProps.onBlur = this.createTwoChains('onBlur');\n        } // =================================== Render ===================================\n\n\n        var childrenClassName = classNames(child && child.props && child.props.className, className);\n\n        if (childrenClassName) {\n          newChildProps.className = childrenClassName;\n        }\n\n        var cloneProps = _objectSpread({}, newChildProps);\n\n        if (supportRef(child)) {\n          cloneProps.ref = composeRef(this.triggerRef, child.ref);\n        }\n\n        var trigger = /*#__PURE__*/React.cloneElement(child, cloneProps);\n        var portal; // prevent unmounting after it's rendered\n\n        if (popupVisible || this.popupRef.current || forceRender) {\n          portal = /*#__PURE__*/React.createElement(PortalComponent, {\n            key: \"portal\",\n            getContainer: this.getContainer,\n            didUpdate: this.handlePortalUpdate\n          }, this.getComponent());\n        }\n\n        if (!popupVisible && autoDestroy) {\n          portal = null;\n        }\n\n        return /*#__PURE__*/React.createElement(TriggerContext.Provider, {\n          value: this.triggerContextValue\n        }, trigger, portal);\n      }\n    }], [{\n      key: \"getDerivedStateFromProps\",\n      value: function getDerivedStateFromProps(_ref, prevState) {\n        var popupVisible = _ref.popupVisible;\n        var newState = {};\n\n        if (popupVisible !== undefined && prevState.popupVisible !== popupVisible) {\n          newState.popupVisible = popupVisible;\n          newState.prevPopupVisible = prevState.popupVisible;\n        }\n\n        return newState;\n      }\n    }]);\n\n    return Trigger;\n  }(React.Component);\n\n  _defineProperty(Trigger, \"contextType\", TriggerContext);\n\n  _defineProperty(Trigger, \"defaultProps\", {\n    prefixCls: 'rc-trigger-popup',\n    getPopupClassNameFromAlign: returnEmptyString,\n    getDocument: returnDocument,\n    onPopupVisibleChange: noop,\n    afterPopupVisibleChange: noop,\n    onPopupAlign: noop,\n    popupClassName: '',\n    mouseEnterDelay: 0,\n    mouseLeaveDelay: 0.1,\n    focusDelay: 0,\n    blurDelay: 0.15,\n    popupStyle: {},\n    destroyPopupOnHide: false,\n    popupAlign: {},\n    defaultPopupVisible: false,\n    mask: false,\n    maskClosable: true,\n    action: [],\n    showAction: [],\n    hideAction: [],\n    autoDestroy: false\n  });\n\n  return Trigger;\n}\nexport default generateTrigger(Portal);","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  Object.defineProperty(subClass, \"prototype\", {\n    writable: false\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nimport possibleConstructorReturn from \"./possibleConstructorReturn.js\";\nexport default function _createSuper(Derived) {\n  var hasNativeReflectConstruct = isNativeReflectConstruct();\n  return function _createSuperInternal() {\n    var Super = getPrototypeOf(Derived),\n      result;\n    if (hasNativeReflectConstruct) {\n      var NewTarget = getPrototypeOf(this).constructor;\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n    return possibleConstructorReturn(this, result);\n  };\n}","export default function _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  } else if (call !== void 0) {\n    throw new TypeError(\"Derived constructors may only return object or undefined\");\n  }\n  return assertThisInitialized(self);\n}","export default function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}","export function getMotion(_ref) {\n  var prefixCls = _ref.prefixCls,\n      motion = _ref.motion,\n      animation = _ref.animation,\n      transitionName = _ref.transitionName;\n\n  if (motion) {\n    return motion;\n  }\n\n  if (animation) {\n    return {\n      motionName: \"\".concat(prefixCls, \"-\").concat(animation)\n    };\n  }\n\n  if (transitionName) {\n    return {\n      motionName: transitionName\n    };\n  }\n\n  return null;\n}","import ReactDOM from 'react-dom';\nexport default function addEventListenerWrap(target, eventType, cb, option) {\n  /* eslint camelcase: 2 */\n  var callback = ReactDOM.unstable_batchedUpdates ? function run(e) {\n    ReactDOM.unstable_batchedUpdates(cb, e);\n  } : cb;\n  if (target.addEventListener) {\n    target.addEventListener(eventType, callback, option);\n  }\n  return {\n    remove: function remove() {\n      if (target.removeEventListener) {\n        target.removeEventListener(eventType, callback, option);\n      }\n    }\n  };\n}","export default function canUseDom() {\n  return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}","export default function contains(root, n) {\n  if (!root) {\n    return false;\n  }\n  // Use native if support\n  if (root.contains) {\n    return root.contains(n);\n  }\n  // `document.contains` not support with IE11\n  var node = n;\n  while (node) {\n    if (node === root) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n  return false;\n}","import ReactDOM from 'react-dom';\n/**\n * Return if a node is a DOM node. Else will return by `findDOMNode`\n */\nexport default function findDOMNode(node) {\n  if (node instanceof HTMLElement) {\n    return node;\n  }\n  return ReactDOM.findDOMNode(node);\n}","export default (function (element) {\n  if (!element) {\n    return false;\n  }\n  if (element instanceof HTMLElement && element.offsetParent) {\n    return true;\n  }\n  if (element instanceof SVGGraphicsElement && element.getBBox) {\n    var _element$getBBox = element.getBBox(),\n      width = _element$getBBox.width,\n      height = _element$getBBox.height;\n    if (width || height) {\n      return true;\n    }\n  }\n  if (element instanceof HTMLElement && element.getBoundingClientRect) {\n    var _element$getBoundingC = element.getBoundingClientRect(),\n      _width = _element$getBoundingC.width,\n      _height = _element$getBoundingC.height;\n    if (_width || _height) {\n      return true;\n    }\n  }\n  return false;\n});","import * as React from 'react';\nimport canUseDom from '../Dom/canUseDom';\n/**\n * Wrap `React.useLayoutEffect` which will not throw warning message in test env\n */\nvar useLayoutEffect = process.env.NODE_ENV !== 'test' && canUseDom() ? React.useLayoutEffect : React.useEffect;\nexport default useLayoutEffect;\nexport var useLayoutUpdateEffect = function useLayoutUpdateEffect(callback, deps) {\n  var firstMountRef = React.useRef(true);\n  useLayoutEffect(function () {\n    if (!firstMountRef.current) {\n      return callback();\n    }\n  }, deps);\n  // We tell react that first mount has passed\n  useLayoutEffect(function () {\n    firstMountRef.current = false;\n    return function () {\n      firstMountRef.current = true;\n    };\n  }, []);\n};","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\n/**\n * Same as React.useState but `setState` accept `ignoreDestroy` param to not to setState after destroyed.\n * We do not make this auto is to avoid real memory leak.\n * Developer should confirm it's safe to ignore themselves.\n */\nexport default function useSafeState(defaultValue) {\n  var destroyRef = React.useRef(false);\n  var _React$useState = React.useState(defaultValue),\n    _React$useState2 = _slicedToArray(_React$useState, 2),\n    value = _React$useState2[0],\n    setValue = _React$useState2[1];\n  React.useEffect(function () {\n    destroyRef.current = false;\n    return function () {\n      destroyRef.current = true;\n    };\n  }, []);\n  function safeSetState(updater, ignoreDestroy) {\n    if (ignoreDestroy && destroyRef.current) {\n      return;\n    }\n    setValue(updater);\n  }\n  return [value, safeSetState];\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n  if (null != _i) {\n    var _s,\n      _e,\n      _x,\n      _r,\n      _arr = [],\n      _n = !0,\n      _d = !1;\n    try {\n      if (_x = (_i = _i.call(arr)).next, 0 === i) {\n        if (Object(_i) !== _i) return;\n        _n = !1;\n      } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n    } catch (err) {\n      _d = !0, _e = err;\n    } finally {\n      try {\n        if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n    return _arr;\n  }\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/* eslint-disable no-console */\nvar warned = {};\nexport function warning(valid, message) {\n  // Support uglify\n  if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n    console.error(\"Warning: \".concat(message));\n  }\n}\nexport function note(valid, message) {\n  // Support uglify\n  if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n    console.warn(\"Note: \".concat(message));\n  }\n}\nexport function resetWarned() {\n  warned = {};\n}\nexport function call(method, valid, message) {\n  if (!valid && !warned[message]) {\n    method(false, message);\n    warned[message] = true;\n  }\n}\nexport function warningOnce(valid, message) {\n  call(warning, valid, message);\n}\nexport function noteOnce(valid, message) {\n  call(note, valid, message);\n}\nexport default warningOnce;\n/* eslint-enable */","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport warning from './warning';\n/**\n * Deeply compares two object literals.\n * @param obj1 object 1\n * @param obj2 object 2\n * @param shallow shallow compare\n * @returns\n */\nfunction isEqual(obj1, obj2) {\n  var shallow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  // https://github.com/mapbox/mapbox-gl-js/pull/5979/files#diff-fde7145050c47cc3a306856efd5f9c3016e86e859de9afbd02c879be5067e58f\n  var refSet = new Set();\n  function deepEqual(a, b) {\n    var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n    var circular = refSet.has(a);\n    warning(!circular, 'Warning: There may be circular references');\n    if (circular) {\n      return false;\n    }\n    if (a === b) {\n      return true;\n    }\n    if (shallow && level > 1) {\n      return false;\n    }\n    refSet.add(a);\n    var newLevel = level + 1;\n    if (Array.isArray(a)) {\n      if (!Array.isArray(b) || a.length !== b.length) {\n        return false;\n      }\n      for (var i = 0; i < a.length; i++) {\n        if (!deepEqual(a[i], b[i], newLevel)) {\n          return false;\n        }\n      }\n      return true;\n    }\n    if (a && b && _typeof(a) === 'object' && _typeof(b) === 'object') {\n      var keys = Object.keys(a);\n      if (keys.length !== Object.keys(b).length) {\n        return false;\n      }\n      return keys.every(function (key) {\n        return deepEqual(a[key], b[key], newLevel);\n      });\n    }\n    // other\n    return false;\n  }\n  return deepEqual(obj1, obj2);\n}\nexport default isEqual;","export default (function () {\n  if (typeof navigator === 'undefined' || typeof window === 'undefined') {\n    return false;\n  }\n  var agent = navigator.userAgent || navigator.vendor || window.opera;\n  return /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(agent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(agent === null || agent === void 0 ? void 0 : agent.substr(0, 4));\n});","var raf = function raf(callback) {\n  return +setTimeout(callback, 16);\n};\nvar caf = function caf(num) {\n  return clearTimeout(num);\n};\nif (typeof window !== 'undefined' && 'requestAnimationFrame' in window) {\n  raf = function raf(callback) {\n    return window.requestAnimationFrame(callback);\n  };\n  caf = function caf(handle) {\n    return window.cancelAnimationFrame(handle);\n  };\n}\nvar rafUUID = 0;\nvar rafIds = new Map();\nfunction cleanup(id) {\n  rafIds.delete(id);\n}\nvar wrapperRaf = function wrapperRaf(callback) {\n  var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  rafUUID += 1;\n  var id = rafUUID;\n  function callRef(leftTimes) {\n    if (leftTimes === 0) {\n      // Clean up\n      cleanup(id);\n      // Trigger\n      callback();\n    } else {\n      // Next raf\n      var realId = raf(function () {\n        callRef(leftTimes - 1);\n      });\n      // Bind real raf id\n      rafIds.set(id, realId);\n    }\n  }\n  callRef(times);\n  return id;\n};\nwrapperRaf.cancel = function (id) {\n  var realId = rafIds.get(id);\n  cleanup(realId);\n  return caf(realId);\n};\nexport default wrapperRaf;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport { isMemo } from 'react-is';\nimport useMemo from './hooks/useMemo';\nexport function fillRef(ref, node) {\n  if (typeof ref === 'function') {\n    ref(node);\n  } else if (_typeof(ref) === 'object' && ref && 'current' in ref) {\n    ref.current = node;\n  }\n}\n/**\n * Merge refs into one ref function to support ref passing.\n */\nexport function composeRef() {\n  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n    refs[_key] = arguments[_key];\n  }\n  var refList = refs.filter(function (ref) {\n    return ref;\n  });\n  if (refList.length <= 1) {\n    return refList[0];\n  }\n  return function (node) {\n    refs.forEach(function (ref) {\n      fillRef(ref, node);\n    });\n  };\n}\nexport function useComposeRef() {\n  for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    refs[_key2] = arguments[_key2];\n  }\n  return useMemo(function () {\n    return composeRef.apply(void 0, refs);\n  }, refs, function (prev, next) {\n    return prev.length === next.length && prev.every(function (ref, i) {\n      return ref === next[i];\n    });\n  });\n}\nexport function supportRef(nodeOrComponent) {\n  var _type$prototype, _nodeOrComponent$prot;\n  var type = isMemo(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type;\n  // Function component node\n  if (typeof type === 'function' && !((_type$prototype = type.prototype) === null || _type$prototype === void 0 ? void 0 : _type$prototype.render)) {\n    return false;\n  }\n  // Class component\n  if (typeof nodeOrComponent === 'function' && !((_nodeOrComponent$prot = nodeOrComponent.prototype) === null || _nodeOrComponent$prot === void 0 ? void 0 : _nodeOrComponent$prot.render)) {\n    return false;\n  }\n  return true;\n}\n/* eslint-enable */","var e=require(\"react\");function r(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var t=r(e);function o(){return(o=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e}).apply(this,arguments)}function n(e,r){if(null==e)return{};var t,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r.indexOf(t=a[o])>=0||(n[t]=e[t]);return n}function a(r){var t=e.useRef(r),o=e.useRef(function(e){t.current&&t.current(e)});return t.current=r,o.current}var l=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=1),e>t?t:e<r?r:e},u=function(e){return\"touches\"in e},c=function(e){return e&&e.ownerDocument.defaultView||self},s=function(e,r,t){var o=e.getBoundingClientRect(),n=u(r)?function(e,r){for(var t=0;t<e.length;t++)if(e[t].identifier===r)return e[t];return e[0]}(r.touches,t):r;return{left:l((n.pageX-(o.left+c(e).pageXOffset))/o.width),top:l((n.pageY-(o.top+c(e).pageYOffset))/o.height)}},f=function(e){!u(e)&&e.preventDefault()},i=t.default.memo(function(r){var l=r.onMove,i=r.onKey,d=n(r,[\"onMove\",\"onKey\"]),v=e.useRef(null),h=a(l),g=a(i),m=e.useRef(null),p=e.useRef(!1),b=e.useMemo(function(){var e=function(e){f(e),(u(e)?e.touches.length>0:e.buttons>0)&&v.current?h(s(v.current,e,m.current)):t(!1)},r=function(){return t(!1)};function t(t){var o=p.current,n=c(v.current),a=t?n.addEventListener:n.removeEventListener;a(o?\"touchmove\":\"mousemove\",e),a(o?\"touchend\":\"mouseup\",r)}return[function(e){var r=e.nativeEvent,o=v.current;if(o&&(f(r),!function(e,r){return r&&!u(e)}(r,p.current)&&o)){if(u(r)){p.current=!0;var n=r.changedTouches||[];n.length&&(m.current=n[0].identifier)}o.focus(),h(s(o,r,m.current)),t(!0)}},function(e){var r=e.which||e.keyCode;r<37||r>40||(e.preventDefault(),g({left:39===r?.05:37===r?-.05:0,top:40===r?.05:38===r?-.05:0}))},t]},[g,h]),_=b[0],C=b[1],x=b[2];return e.useEffect(function(){return x},[x]),t.default.createElement(\"div\",o({},d,{onTouchStart:_,onMouseDown:_,className:\"react-colorful__interactive\",ref:v,onKeyDown:C,tabIndex:0,role:\"slider\"}))}),d=function(e){return e.filter(Boolean).join(\" \")},v=function(e){var r=e.color,o=e.left,n=e.top,a=void 0===n?.5:n,l=d([\"react-colorful__pointer\",e.className]);return t.default.createElement(\"div\",{className:l,style:{top:100*a+\"%\",left:100*o+\"%\"}},t.default.createElement(\"div\",{className:\"react-colorful__pointer-fill\",style:{backgroundColor:r}}))},h=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=Math.pow(10,r)),Math.round(t*e)/t},g={grad:.9,turn:360,rad:360/(2*Math.PI)},m=function(e){return S(p(e))},p=function(e){return\"#\"===e[0]&&(e=e.substring(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:4===e.length?h(parseInt(e[3]+e[3],16)/255,2):1}:{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16),a:8===e.length?h(parseInt(e.substring(6,8),16)/255,2):1}},b=function(e,r){return void 0===r&&(r=\"deg\"),Number(e)*(g[r]||1)},_=function(e){var r=/hsla?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?x({h:b(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},C=_,x=function(e){var r=e.s,t=e.l;return{h:e.h,s:(r*=(t<50?t:100-t)/100)>0?2*r/(t+r)*100:0,v:t+r,a:e.a}},E=function(e){return I(N(e))},H=function(e){var r=e.s,t=e.v,o=e.a,n=(200-r)*t/100;return{h:h(e.h),s:h(n>0&&n<200?r*t/100/(n<=100?n:200-n)*100:0),l:h(n/2),a:h(o,2)}},M=function(e){var r=H(e);return\"hsl(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%)\"},k=function(e){var r=H(e);return\"hsla(\"+r.h+\", \"+r.s+\"%, \"+r.l+\"%, \"+r.a+\")\"},N=function(e){var r=e.h,t=e.s,o=e.v,n=e.a;r=r/360*6,t/=100,o/=100;var a=Math.floor(r),l=o*(1-t),u=o*(1-(r-a)*t),c=o*(1-(1-r+a)*t),s=a%6;return{r:h(255*[o,u,l,l,c,o][s]),g:h(255*[c,o,o,u,l,l][s]),b:h(255*[l,l,c,o,o,u][s]),a:h(n,2)}},w=function(e){var r=/hsva?\\(?\\s*(-?\\d*\\.?\\d+)(deg|rad|grad|turn)?[,\\s]+(-?\\d*\\.?\\d+)%?[,\\s]+(-?\\d*\\.?\\d+)%?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?O({h:b(r[1],r[2]),s:Number(r[3]),v:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},y=w,q=function(e){var r=/rgba?\\(?\\s*(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?[,\\s]+(-?\\d*\\.?\\d+)(%)?,?\\s*[/\\s]*(-?\\d*\\.?\\d+)?(%)?\\s*\\)?/i.exec(e);return r?S({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:void 0===r[7]?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},P=q,R=function(e){var r=e.toString(16);return r.length<2?\"0\"+r:r},I=function(e){var r=e.r,t=e.g,o=e.b,n=e.a,a=n<1?R(h(255*n)):\"\";return\"#\"+R(r)+R(t)+R(o)+a},S=function(e){var r=e.r,t=e.g,o=e.b,n=e.a,a=Math.max(r,t,o),l=a-Math.min(r,t,o),u=l?a===r?(t-o)/l:a===t?2+(o-r)/l:4+(r-t)/l:0;return{h:h(60*(u<0?u+6:u)),s:h(a?l/a*100:0),v:h(a/255*100),a:n}},O=function(e){return{h:h(e.h),s:h(e.s),v:h(e.v),a:h(e.a,2)}},j=t.default.memo(function(e){var r=e.hue,o=e.onChange,n=d([\"react-colorful__hue\",e.className]);return t.default.createElement(\"div\",{className:n},t.default.createElement(i,{onMove:function(e){o({h:360*e.left})},onKey:function(e){o({h:l(r+360*e.left,0,360)})},\"aria-label\":\"Hue\",\"aria-valuenow\":h(r),\"aria-valuemax\":\"360\",\"aria-valuemin\":\"0\"},t.default.createElement(v,{className:\"react-colorful__hue-pointer\",left:r/360,color:M({h:r,s:100,v:100,a:1})})))}),z=t.default.memo(function(e){var r=e.hsva,o=e.onChange,n={backgroundColor:M({h:r.h,s:100,v:100,a:1})};return t.default.createElement(\"div\",{className:\"react-colorful__saturation\",style:n},t.default.createElement(i,{onMove:function(e){o({s:100*e.left,v:100-100*e.top})},onKey:function(e){o({s:l(r.s+100*e.left,0,100),v:l(r.v-100*e.top,0,100)})},\"aria-label\":\"Color\",\"aria-valuetext\":\"Saturation \"+h(r.s)+\"%, Brightness \"+h(r.v)+\"%\"},t.default.createElement(v,{className:\"react-colorful__saturation-pointer\",top:1-r.v/100,left:r.s/100,color:M(r)})))}),B=function(e,r){if(e===r)return!0;for(var t in e)if(e[t]!==r[t])return!1;return!0},D=function(e,r){return e.replace(/\\s/g,\"\")===r.replace(/\\s/g,\"\")},K=function(e,r){return e.toLowerCase()===r.toLowerCase()||B(p(e),p(r))};function L(r,t,o){var n=a(o),l=e.useState(function(){return r.toHsva(t)}),u=l[0],c=l[1],s=e.useRef({color:t,hsva:u});e.useEffect(function(){if(!r.equal(t,s.current.color)){var e=r.toHsva(t);s.current={hsva:e,color:t},c(e)}},[t,r]),e.useEffect(function(){var e;B(u,s.current.hsva)||r.equal(e=r.fromHsva(u),s.current.color)||(s.current={hsva:u,color:e},n(e))},[u,r,n]);var f=e.useCallback(function(e){c(function(r){return Object.assign({},r,e)})},[]);return[u,f]}var A,T=\"undefined\"!=typeof window?e.useLayoutEffect:e.useEffect,F=function(){return A||(\"undefined\"!=typeof __webpack_nonce__?__webpack_nonce__:void 0)},X=new Map,Y=function(e){T(function(){var r=e.current?e.current.ownerDocument:document;if(void 0!==r&&!X.has(r)){var t=r.createElement(\"style\");t.innerHTML='.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:\"\";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url(\\'data:image/svg+xml;charset=utf-8,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill-opacity=\".05\"><path d=\"M8 0h8v8H8zM0 8h8v8H0z\"/></svg>\\')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}',X.set(r,t);var o=F();o&&t.setAttribute(\"nonce\",o),r.head.appendChild(t)}},[])},V=function(r){var a=r.className,l=r.colorModel,u=r.color,c=void 0===u?l.defaultColor:u,s=r.onChange,f=n(r,[\"className\",\"colorModel\",\"color\",\"onChange\"]),i=e.useRef(null);Y(i);var v=L(l,c,s),h=v[0],g=v[1],m=d([\"react-colorful\",a]);return t.default.createElement(\"div\",o({},f,{ref:i,className:m}),t.default.createElement(z,{hsva:h,onChange:g}),t.default.createElement(j,{hue:h.h,onChange:g,className:\"react-colorful__last-control\"}))},$={defaultColor:\"000\",toHsva:m,fromHsva:function(e){return E({h:e.h,s:e.s,v:e.v,a:1})},equal:K},G=function(e){var r=e.className,o=e.hsva,n=e.onChange,a={backgroundImage:\"linear-gradient(90deg, \"+k(Object.assign({},o,{a:0}))+\", \"+k(Object.assign({},o,{a:1}))+\")\"},u=d([\"react-colorful__alpha\",r]),c=h(100*o.a);return t.default.createElement(\"div\",{className:u},t.default.createElement(\"div\",{className:\"react-colorful__alpha-gradient\",style:a}),t.default.createElement(i,{onMove:function(e){n({a:e.left})},onKey:function(e){n({a:l(o.a+e.left)})},\"aria-label\":\"Alpha\",\"aria-valuetext\":c+\"%\",\"aria-valuenow\":c,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"},t.default.createElement(v,{className:\"react-colorful__alpha-pointer\",left:o.a,color:k(o)})))},J=function(r){var a=r.className,l=r.colorModel,u=r.color,c=void 0===u?l.defaultColor:u,s=r.onChange,f=n(r,[\"className\",\"colorModel\",\"color\",\"onChange\"]),i=e.useRef(null);Y(i);var v=L(l,c,s),h=v[0],g=v[1],m=d([\"react-colorful\",a]);return t.default.createElement(\"div\",o({},f,{ref:i,className:m}),t.default.createElement(z,{hsva:h,onChange:g}),t.default.createElement(j,{hue:h.h,onChange:g}),t.default.createElement(G,{hsva:h,onChange:g,className:\"react-colorful__last-control\"}))},Q={defaultColor:\"0001\",toHsva:m,fromHsva:E,equal:K},U={defaultColor:{h:0,s:0,l:0,a:1},toHsva:x,fromHsva:H,equal:B},W={defaultColor:\"hsla(0, 0%, 0%, 1)\",toHsva:_,fromHsva:k,equal:D},Z={defaultColor:{h:0,s:0,l:0},toHsva:function(e){return x({h:e.h,s:e.s,l:e.l,a:1})},fromHsva:function(e){return{h:(r=H(e)).h,s:r.s,l:r.l};var r},equal:B},ee={defaultColor:\"hsl(0, 0%, 0%)\",toHsva:C,fromHsva:M,equal:D},re={defaultColor:{h:0,s:0,v:0,a:1},toHsva:function(e){return e},fromHsva:O,equal:B},te={defaultColor:\"hsva(0, 0%, 0%, 1)\",toHsva:w,fromHsva:function(e){var r=O(e);return\"hsva(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%, \"+r.a+\")\"},equal:D},oe={defaultColor:{h:0,s:0,v:0},toHsva:function(e){return{h:e.h,s:e.s,v:e.v,a:1}},fromHsva:function(e){var r=O(e);return{h:r.h,s:r.s,v:r.v}},equal:B},ne={defaultColor:\"hsv(0, 0%, 0%)\",toHsva:y,fromHsva:function(e){var r=O(e);return\"hsv(\"+r.h+\", \"+r.s+\"%, \"+r.v+\"%)\"},equal:D},ae={defaultColor:{r:0,g:0,b:0,a:1},toHsva:S,fromHsva:N,equal:B},le={defaultColor:\"rgba(0, 0, 0, 1)\",toHsva:q,fromHsva:function(e){var r=N(e);return\"rgba(\"+r.r+\", \"+r.g+\", \"+r.b+\", \"+r.a+\")\"},equal:D},ue={defaultColor:{r:0,g:0,b:0},toHsva:function(e){return S({r:e.r,g:e.g,b:e.b,a:1})},fromHsva:function(e){return{r:(r=N(e)).r,g:r.g,b:r.b};var r},equal:B},ce={defaultColor:\"rgb(0, 0, 0)\",toHsva:P,fromHsva:function(e){var r=N(e);return\"rgb(\"+r.r+\", \"+r.g+\", \"+r.b+\")\"},equal:D},se=/^#?([0-9A-F]{3,8})$/i,fe=function(r){var l=r.color,u=void 0===l?\"\":l,c=r.onChange,s=r.onBlur,f=r.escape,i=r.validate,d=r.format,v=r.process,h=n(r,[\"color\",\"onChange\",\"onBlur\",\"escape\",\"validate\",\"format\",\"process\"]),g=e.useState(function(){return f(u)}),m=g[0],p=g[1],b=a(c),_=a(s),C=e.useCallback(function(e){var r=f(e.target.value);p(r),i(r)&&b(v?v(r):r)},[f,v,i,b]),x=e.useCallback(function(e){i(e.target.value)||p(f(u)),_(e)},[u,f,i,_]);return e.useEffect(function(){p(f(u))},[u,f]),t.default.createElement(\"input\",o({},h,{value:d?d(m):m,spellCheck:\"false\",onChange:C,onBlur:x}))},ie=function(e){return\"#\"+e};exports.HexAlphaColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:Q}))},exports.HexColorInput=function(r){var a=r.prefixed,l=r.alpha,u=n(r,[\"prefixed\",\"alpha\"]),c=e.useCallback(function(e){return e.replace(/([^0-9A-F]+)/gi,\"\").substring(0,l?8:6)},[l]),s=e.useCallback(function(e){return function(e,r){var t=se.exec(e),o=t?t[1].length:0;return 3===o||6===o||!!r&&4===o||!!r&&8===o}(e,l)},[l]);return t.default.createElement(fe,o({},u,{escape:c,format:a?ie:void 0,process:ie,validate:s}))},exports.HexColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:$}))},exports.HslColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:Z}))},exports.HslStringColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:ee}))},exports.HslaColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:U}))},exports.HslaStringColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:W}))},exports.HsvColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:oe}))},exports.HsvStringColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:ne}))},exports.HsvaColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:re}))},exports.HsvaStringColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:te}))},exports.RgbColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:ue}))},exports.RgbStringColorPicker=function(e){return t.default.createElement(V,o({},e,{colorModel:ce}))},exports.RgbaColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:ae}))},exports.RgbaStringColorPicker=function(e){return t.default.createElement(J,o({},e,{colorModel:le}))},exports.setNonce=function(e){A=e};\n//# sourceMappingURL=index.js.map\n","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-is.production.min.js');\n} else {\n  module.exports = require('./cjs/react-is.development.js');\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n  // Call this.constructor.gDSFP to support sub-classes.\n  var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n  if (state !== null && state !== undefined) {\n    this.setState(state);\n  }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n  // Call this.constructor.gDSFP to support sub-classes.\n  // Use the setState() updater to ensure state isn't stale in certain edge cases.\n  function updater(prevState) {\n    var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n    return state !== null && state !== undefined ? state : null;\n  }\n  // Binding \"this\" is important for shallow renderer support.\n  this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n  try {\n    var prevProps = this.props;\n    var prevState = this.state;\n    this.props = nextProps;\n    this.state = nextState;\n    this.__reactInternalSnapshotFlag = true;\n    this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n      prevProps,\n      prevState\n    );\n  } finally {\n    this.props = prevProps;\n    this.state = prevState;\n  }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n  var prototype = Component.prototype;\n\n  if (!prototype || !prototype.isReactComponent) {\n    throw new Error('Can only polyfill class components');\n  }\n\n  if (\n    typeof Component.getDerivedStateFromProps !== 'function' &&\n    typeof prototype.getSnapshotBeforeUpdate !== 'function'\n  ) {\n    return Component;\n  }\n\n  // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n  // Error if any of these lifecycles are present,\n  // Because they would work differently between older and newer (16.3+) versions of React.\n  var foundWillMountName = null;\n  var foundWillReceivePropsName = null;\n  var foundWillUpdateName = null;\n  if (typeof prototype.componentWillMount === 'function') {\n    foundWillMountName = 'componentWillMount';\n  } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n    foundWillMountName = 'UNSAFE_componentWillMount';\n  }\n  if (typeof prototype.componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'componentWillReceiveProps';\n  } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n  }\n  if (typeof prototype.componentWillUpdate === 'function') {\n    foundWillUpdateName = 'componentWillUpdate';\n  } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n    foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n  }\n  if (\n    foundWillMountName !== null ||\n    foundWillReceivePropsName !== null ||\n    foundWillUpdateName !== null\n  ) {\n    var componentName = Component.displayName || Component.name;\n    var newApiName =\n      typeof Component.getDerivedStateFromProps === 'function'\n        ? 'getDerivedStateFromProps()'\n        : 'getSnapshotBeforeUpdate()';\n\n    throw Error(\n      'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n        componentName +\n        ' uses ' +\n        newApiName +\n        ' but also contains the following legacy lifecycles:' +\n        (foundWillMountName !== null ? '\\n  ' + foundWillMountName : '') +\n        (foundWillReceivePropsName !== null\n          ? '\\n  ' + foundWillReceivePropsName\n          : '') +\n        (foundWillUpdateName !== null ? '\\n  ' + foundWillUpdateName : '') +\n        '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n        'https://fb.me/react-async-component-lifecycle-hooks'\n    );\n  }\n\n  // React <= 16.2 does not support static getDerivedStateFromProps.\n  // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n  // Newer versions of React will ignore these lifecycles if gDSFP exists.\n  if (typeof Component.getDerivedStateFromProps === 'function') {\n    prototype.componentWillMount = componentWillMount;\n    prototype.componentWillReceiveProps = componentWillReceiveProps;\n  }\n\n  // React <= 16.2 does not support getSnapshotBeforeUpdate.\n  // As a workaround, use cWU to invoke the new lifecycle.\n  // Newer versions of React will ignore that lifecycle if gSBU exists.\n  if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n    if (typeof prototype.componentDidUpdate !== 'function') {\n      throw new Error(\n        'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n      );\n    }\n\n    prototype.componentWillUpdate = componentWillUpdate;\n\n    var componentDidUpdate = prototype.componentDidUpdate;\n\n    prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n      prevProps,\n      prevState,\n      maybeSnapshot\n    ) {\n      // 16.3+ will not execute our will-update method;\n      // It will pass a snapshot value to did-update though.\n      // Older versions will require our polyfilled will-update value.\n      // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n      // Because for <= 15.x versions this might be a \"prevContext\" object.\n      // We also can't just check \"__reactInternalSnapshot\",\n      // Because get-snapshot might return a falsy value.\n      // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n      var snapshot = this.__reactInternalSnapshotFlag\n        ? this.__reactInternalSnapshot\n        : maybeSnapshot;\n\n      componentDidUpdate.call(this, prevProps, prevState, snapshot);\n    };\n  }\n\n  return Component;\n}\n\nexport { polyfill };\n","import React, { memo, useState, useEffect, useCallback, useMemo, useContext } from 'react';\nimport ReactDOM from 'react-dom';\n\n/**\r\n * Throw error when ModalContext is used outside of context provider\r\n */\r\nvar invariantViolation = function () {\r\n    throw new Error(\"Attempted to call useModal outside of modal context. Make sure your app is rendered inside ModalProvider.\");\r\n};\r\n/**\r\n * Modal Context Object\r\n */\r\nvar ModalContext = React.createContext({\r\n    showModal: invariantViolation,\r\n    hideModal: invariantViolation\r\n});\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    };\r\n    return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n            t[p[i]] = s[p[i]];\r\n    return t;\r\n}\n\n/**\r\n * Component responsible for rendering the modal.\r\n *\r\n * The identity of `Component` may change dependeing on the inputs passed to\r\n * `useModal`. If we simply rendered `<Component />` then the modal would be\r\n * susceptible to rerenders whenever one of the inputs change.\r\n */\r\nvar ModalRenderer = memo(function (_a) {\r\n    var component = _a.component, rest = __rest(_a, [\"component\"]);\r\n    return component(rest);\r\n});\r\n/**\r\n * Modal Root\r\n *\r\n * Renders modals using react portal.\r\n */\r\nvar ModalRoot = memo(function (_a) {\r\n    var modals = _a.modals, container = _a.container, _b = _a.component, RootComponent = _b === void 0 ? React.Fragment : _b;\r\n    var _c = useState(undefined), mountNode = _c[0], setMountNode = _c[1];\r\n    // This effect will not be ran in the server environment\r\n    useEffect(function () { return setMountNode(container || document.body); });\r\n    return mountNode\r\n        ? ReactDOM.createPortal(React.createElement(RootComponent, null, Object.keys(modals).map(function (key) { return (React.createElement(ModalRenderer, { key: key, component: modals[key] })); })), mountNode)\r\n        : null;\r\n});\n\n/**\r\n * Modal Provider\r\n *\r\n * Provides modal context and renders ModalRoot.\r\n */\r\nvar ModalProvider = function (_a) {\r\n    var container = _a.container, rootComponent = _a.rootComponent, children = _a.children;\r\n    if (container && !(container instanceof HTMLElement)) {\r\n        throw new Error(\"Container must specify DOM element to mount modal root into.\\n    \\n    This behavior has changed in 3.0.0. Please use `rootComponent` prop instead.\\n    See: https://github.com/mpontus/react-modal-hook/issues/18\");\r\n    }\r\n    var _b = useState({}), modals = _b[0], setModals = _b[1];\r\n    var showModal = useCallback(function (key, modal) {\r\n        return setModals(function (modals) {\r\n            var _a;\r\n            return (__assign({}, modals, (_a = {}, _a[key] = modal, _a)));\r\n        });\r\n    }, []);\r\n    var hideModal = useCallback(function (key) {\r\n        return setModals(function (modals) {\r\n            var newModals = __assign({}, modals);\r\n            delete newModals[key];\r\n            return newModals;\r\n        });\r\n    }, []);\r\n    var contextValue = useMemo(function () { return ({ showModal: showModal, hideModal: hideModal }); }, []);\r\n    return (React.createElement(ModalContext.Provider, { value: contextValue },\r\n        React.createElement(React.Fragment, null,\r\n            children,\r\n            React.createElement(ModalRoot, { modals: modals, component: rootComponent, container: container }))));\r\n};\n\n/**\r\n * Utility function to generate unique number per component instance\r\n */\r\nvar generateModalKey = (function () {\r\n    var count = 0;\r\n    return function () { return \"\" + ++count; };\r\n})();\r\n/**\r\n * Check whether the argument is a stateless component.\r\n *\r\n * We take advantage of the stateless nature of functional components to be\r\n * inline the rendering of the modal component as part of another immutable\r\n * component.\r\n *\r\n * This is necessary for allowing the modal to update based on the inputs passed\r\n * as the second argument to useModal without unmounting the previous version of\r\n * the modal component.\r\n */\r\nvar isFunctionalComponent = function (Component) {\r\n    var prototype = Component.prototype;\r\n    return !prototype || !prototype.isReactComponent;\r\n};\r\n/**\r\n * React hook for showing modal windows\r\n */\r\nvar useModal = function (component, inputs) {\r\n    if (inputs === void 0) { inputs = []; }\r\n    if (!isFunctionalComponent(component)) {\r\n        throw new Error(\"Only stateless components can be used as an argument to useModal. You have probably passed a class component where a function was expected.\");\r\n    }\r\n    var key = useMemo(generateModalKey, []);\r\n    var modal = useMemo(function () { return component; }, inputs);\r\n    var context = useContext(ModalContext);\r\n    var _a = useState(false), isShown = _a[0], setShown = _a[1];\r\n    var showModal = useCallback(function () { return setShown(true); }, []);\r\n    var hideModal = useCallback(function () { return setShown(false); }, []);\r\n    useEffect(function () {\r\n        if (isShown) {\r\n            context.showModal(key, modal);\r\n        }\r\n        else {\r\n            context.hideModal(key);\r\n        }\r\n        // Hide modal when parent component unmounts\r\n        return function () { return context.hideModal(key); };\r\n    }, [modal, isShown]);\r\n    return [showModal, hideModal];\r\n};\n\nexport { ModalContext, ModalProvider, useModal };\n//# sourceMappingURL=index.es.js.map\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.bodyOpenClassName = exports.portalClassName = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require(\"react-dom\");\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _ModalPortal = require(\"./ModalPortal\");\n\nvar _ModalPortal2 = _interopRequireDefault(_ModalPortal);\n\nvar _ariaAppHider = require(\"../helpers/ariaAppHider\");\n\nvar ariaAppHider = _interopRequireWildcard(_ariaAppHider);\n\nvar _safeHTMLElement = require(\"../helpers/safeHTMLElement\");\n\nvar _safeHTMLElement2 = _interopRequireDefault(_safeHTMLElement);\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar portalClassName = exports.portalClassName = \"ReactModalPortal\";\nvar bodyOpenClassName = exports.bodyOpenClassName = \"ReactModal__Body--open\";\n\nvar isReact16 = _safeHTMLElement.canUseDOM && _reactDom2.default.createPortal !== undefined;\n\nvar createHTMLElement = function createHTMLElement(name) {\n  return document.createElement(name);\n};\n\nvar getCreatePortal = function getCreatePortal() {\n  return isReact16 ? _reactDom2.default.createPortal : _reactDom2.default.unstable_renderSubtreeIntoContainer;\n};\n\nfunction getParentElement(parentSelector) {\n  return parentSelector();\n}\n\nvar Modal = function (_Component) {\n  _inherits(Modal, _Component);\n\n  function Modal() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Modal);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Modal.__proto__ || Object.getPrototypeOf(Modal)).call.apply(_ref, [this].concat(args))), _this), _this.removePortal = function () {\n      !isReact16 && _reactDom2.default.unmountComponentAtNode(_this.node);\n      var parent = getParentElement(_this.props.parentSelector);\n      if (parent && parent.contains(_this.node)) {\n        parent.removeChild(_this.node);\n      } else {\n        // eslint-disable-next-line no-console\n        console.warn('React-Modal: \"parentSelector\" prop did not returned any DOM ' + \"element. Make sure that the parent element is unmounted to \" + \"avoid any memory leaks.\");\n      }\n    }, _this.portalRef = function (ref) {\n      _this.portal = ref;\n    }, _this.renderPortal = function (props) {\n      var createPortal = getCreatePortal();\n      var portal = createPortal(_this, _react2.default.createElement(_ModalPortal2.default, _extends({ defaultStyles: Modal.defaultStyles }, props)), _this.node);\n      _this.portalRef(portal);\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Modal, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      if (!_safeHTMLElement.canUseDOM) return;\n\n      if (!isReact16) {\n        this.node = createHTMLElement(\"div\");\n      }\n      this.node.className = this.props.portalClassName;\n\n      var parent = getParentElement(this.props.parentSelector);\n      parent.appendChild(this.node);\n\n      !isReact16 && this.renderPortal(this.props);\n    }\n  }, {\n    key: \"getSnapshotBeforeUpdate\",\n    value: function getSnapshotBeforeUpdate(prevProps) {\n      var prevParent = getParentElement(prevProps.parentSelector);\n      var nextParent = getParentElement(this.props.parentSelector);\n      return { prevParent: prevParent, nextParent: nextParent };\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps, _, snapshot) {\n      if (!_safeHTMLElement.canUseDOM) return;\n      var _props = this.props,\n          isOpen = _props.isOpen,\n          portalClassName = _props.portalClassName;\n\n\n      if (prevProps.portalClassName !== portalClassName) {\n        this.node.className = portalClassName;\n      }\n\n      var prevParent = snapshot.prevParent,\n          nextParent = snapshot.nextParent;\n\n      if (nextParent !== prevParent) {\n        prevParent.removeChild(this.node);\n        nextParent.appendChild(this.node);\n      }\n\n      // Stop unnecessary renders if modal is remaining closed\n      if (!prevProps.isOpen && !isOpen) return;\n\n      !isReact16 && this.renderPortal(this.props);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      if (!_safeHTMLElement.canUseDOM || !this.node || !this.portal) return;\n\n      var state = this.portal.state;\n      var now = Date.now();\n      var closesAt = state.isOpen && this.props.closeTimeoutMS && (state.closesAt || now + this.props.closeTimeoutMS);\n\n      if (closesAt) {\n        if (!state.beforeClose) {\n          this.portal.closeWithTimeout();\n        }\n\n        setTimeout(this.removePortal, closesAt - now);\n      } else {\n        this.removePortal();\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      if (!_safeHTMLElement.canUseDOM || !isReact16) {\n        return null;\n      }\n\n      if (!this.node && isReact16) {\n        this.node = createHTMLElement(\"div\");\n      }\n\n      var createPortal = getCreatePortal();\n      return createPortal(_react2.default.createElement(_ModalPortal2.default, _extends({\n        ref: this.portalRef,\n        defaultStyles: Modal.defaultStyles\n      }, this.props)), this.node);\n    }\n  }], [{\n    key: \"setAppElement\",\n    value: function setAppElement(element) {\n      ariaAppHider.setElement(element);\n    }\n\n    /* eslint-disable react/no-unused-prop-types */\n\n    /* eslint-enable react/no-unused-prop-types */\n\n  }]);\n\n  return Modal;\n}(_react.Component);\n\nModal.propTypes = {\n  isOpen: _propTypes2.default.bool.isRequired,\n  style: _propTypes2.default.shape({\n    content: _propTypes2.default.object,\n    overlay: _propTypes2.default.object\n  }),\n  portalClassName: _propTypes2.default.string,\n  bodyOpenClassName: _propTypes2.default.string,\n  htmlOpenClassName: _propTypes2.default.string,\n  className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({\n    base: _propTypes2.default.string.isRequired,\n    afterOpen: _propTypes2.default.string.isRequired,\n    beforeClose: _propTypes2.default.string.isRequired\n  })]),\n  overlayClassName: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({\n    base: _propTypes2.default.string.isRequired,\n    afterOpen: _propTypes2.default.string.isRequired,\n    beforeClose: _propTypes2.default.string.isRequired\n  })]),\n  appElement: _propTypes2.default.oneOfType([_propTypes2.default.instanceOf(_safeHTMLElement2.default), _propTypes2.default.instanceOf(_safeHTMLElement.SafeHTMLCollection), _propTypes2.default.instanceOf(_safeHTMLElement.SafeNodeList), _propTypes2.default.arrayOf(_propTypes2.default.instanceOf(_safeHTMLElement2.default))]),\n  onAfterOpen: _propTypes2.default.func,\n  onRequestClose: _propTypes2.default.func,\n  closeTimeoutMS: _propTypes2.default.number,\n  ariaHideApp: _propTypes2.default.bool,\n  shouldFocusAfterRender: _propTypes2.default.bool,\n  shouldCloseOnOverlayClick: _propTypes2.default.bool,\n  shouldReturnFocusAfterClose: _propTypes2.default.bool,\n  preventScroll: _propTypes2.default.bool,\n  parentSelector: _propTypes2.default.func,\n  aria: _propTypes2.default.object,\n  data: _propTypes2.default.object,\n  role: _propTypes2.default.string,\n  contentLabel: _propTypes2.default.string,\n  shouldCloseOnEsc: _propTypes2.default.bool,\n  overlayRef: _propTypes2.default.func,\n  contentRef: _propTypes2.default.func,\n  id: _propTypes2.default.string,\n  overlayElement: _propTypes2.default.func,\n  contentElement: _propTypes2.default.func\n};\nModal.defaultProps = {\n  isOpen: false,\n  portalClassName: portalClassName,\n  bodyOpenClassName: bodyOpenClassName,\n  role: \"dialog\",\n  ariaHideApp: true,\n  closeTimeoutMS: 0,\n  shouldFocusAfterRender: true,\n  shouldCloseOnEsc: true,\n  shouldCloseOnOverlayClick: true,\n  shouldReturnFocusAfterClose: true,\n  preventScroll: false,\n  parentSelector: function parentSelector() {\n    return document.body;\n  },\n  overlayElement: function overlayElement(props, contentEl) {\n    return _react2.default.createElement(\n      \"div\",\n      props,\n      contentEl\n    );\n  },\n  contentElement: function contentElement(props, children) {\n    return _react2.default.createElement(\n      \"div\",\n      props,\n      children\n    );\n  }\n};\nModal.defaultStyles = {\n  overlay: {\n    position: \"fixed\",\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n    backgroundColor: \"rgba(255, 255, 255, 0.75)\"\n  },\n  content: {\n    position: \"absolute\",\n    top: \"40px\",\n    left: \"40px\",\n    right: \"40px\",\n    bottom: \"40px\",\n    border: \"1px solid #ccc\",\n    background: \"#fff\",\n    overflow: \"auto\",\n    WebkitOverflowScrolling: \"touch\",\n    borderRadius: \"4px\",\n    outline: \"none\",\n    padding: \"20px\"\n  }\n};\n\n\n(0, _reactLifecyclesCompat.polyfill)(Modal);\n\nif (process.env.NODE_ENV !== \"production\") {\n  Modal.setCreateHTMLElement = function (fn) {\n    return createHTMLElement = fn;\n  };\n}\n\nexports.default = Modal;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = require(\"react\");\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _focusManager = require(\"../helpers/focusManager\");\n\nvar focusManager = _interopRequireWildcard(_focusManager);\n\nvar _scopeTab = require(\"../helpers/scopeTab\");\n\nvar _scopeTab2 = _interopRequireDefault(_scopeTab);\n\nvar _ariaAppHider = require(\"../helpers/ariaAppHider\");\n\nvar ariaAppHider = _interopRequireWildcard(_ariaAppHider);\n\nvar _classList = require(\"../helpers/classList\");\n\nvar classList = _interopRequireWildcard(_classList);\n\nvar _safeHTMLElement = require(\"../helpers/safeHTMLElement\");\n\nvar _safeHTMLElement2 = _interopRequireDefault(_safeHTMLElement);\n\nvar _portalOpenInstances = require(\"../helpers/portalOpenInstances\");\n\nvar _portalOpenInstances2 = _interopRequireDefault(_portalOpenInstances);\n\nrequire(\"../helpers/bodyTrap\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n// so that our CSS is statically analyzable\nvar CLASS_NAMES = {\n  overlay: \"ReactModal__Overlay\",\n  content: \"ReactModal__Content\"\n};\n\nvar TAB_KEY = 9;\nvar ESC_KEY = 27;\n\nvar ariaHiddenInstances = 0;\n\nvar ModalPortal = function (_Component) {\n  _inherits(ModalPortal, _Component);\n\n  function ModalPortal(props) {\n    _classCallCheck(this, ModalPortal);\n\n    var _this = _possibleConstructorReturn(this, (ModalPortal.__proto__ || Object.getPrototypeOf(ModalPortal)).call(this, props));\n\n    _this.setOverlayRef = function (overlay) {\n      _this.overlay = overlay;\n      _this.props.overlayRef && _this.props.overlayRef(overlay);\n    };\n\n    _this.setContentRef = function (content) {\n      _this.content = content;\n      _this.props.contentRef && _this.props.contentRef(content);\n    };\n\n    _this.afterClose = function () {\n      var _this$props = _this.props,\n          appElement = _this$props.appElement,\n          ariaHideApp = _this$props.ariaHideApp,\n          htmlOpenClassName = _this$props.htmlOpenClassName,\n          bodyOpenClassName = _this$props.bodyOpenClassName;\n\n      // Remove classes.\n\n      bodyOpenClassName && classList.remove(document.body, bodyOpenClassName);\n\n      htmlOpenClassName && classList.remove(document.getElementsByTagName(\"html\")[0], htmlOpenClassName);\n\n      // Reset aria-hidden attribute if all modals have been removed\n      if (ariaHideApp && ariaHiddenInstances > 0) {\n        ariaHiddenInstances -= 1;\n\n        if (ariaHiddenInstances === 0) {\n          ariaAppHider.show(appElement);\n        }\n      }\n\n      if (_this.props.shouldFocusAfterRender) {\n        if (_this.props.shouldReturnFocusAfterClose) {\n          focusManager.returnFocus(_this.props.preventScroll);\n          focusManager.teardownScopedFocus();\n        } else {\n          focusManager.popWithoutFocus();\n        }\n      }\n\n      if (_this.props.onAfterClose) {\n        _this.props.onAfterClose();\n      }\n\n      _portalOpenInstances2.default.deregister(_this);\n    };\n\n    _this.open = function () {\n      _this.beforeOpen();\n      if (_this.state.afterOpen && _this.state.beforeClose) {\n        clearTimeout(_this.closeTimer);\n        _this.setState({ beforeClose: false });\n      } else {\n        if (_this.props.shouldFocusAfterRender) {\n          focusManager.setupScopedFocus(_this.node);\n          focusManager.markForFocusLater();\n        }\n\n        _this.setState({ isOpen: true }, function () {\n          _this.openAnimationFrame = requestAnimationFrame(function () {\n            _this.setState({ afterOpen: true });\n\n            if (_this.props.isOpen && _this.props.onAfterOpen) {\n              _this.props.onAfterOpen({\n                overlayEl: _this.overlay,\n                contentEl: _this.content\n              });\n            }\n          });\n        });\n      }\n    };\n\n    _this.close = function () {\n      if (_this.props.closeTimeoutMS > 0) {\n        _this.closeWithTimeout();\n      } else {\n        _this.closeWithoutTimeout();\n      }\n    };\n\n    _this.focusContent = function () {\n      return _this.content && !_this.contentHasFocus() && _this.content.focus({ preventScroll: true });\n    };\n\n    _this.closeWithTimeout = function () {\n      var closesAt = Date.now() + _this.props.closeTimeoutMS;\n      _this.setState({ beforeClose: true, closesAt: closesAt }, function () {\n        _this.closeTimer = setTimeout(_this.closeWithoutTimeout, _this.state.closesAt - Date.now());\n      });\n    };\n\n    _this.closeWithoutTimeout = function () {\n      _this.setState({\n        beforeClose: false,\n        isOpen: false,\n        afterOpen: false,\n        closesAt: null\n      }, _this.afterClose);\n    };\n\n    _this.handleKeyDown = function (event) {\n      if (event.keyCode === TAB_KEY) {\n        (0, _scopeTab2.default)(_this.content, event);\n      }\n\n      if (_this.props.shouldCloseOnEsc && event.keyCode === ESC_KEY) {\n        event.stopPropagation();\n        _this.requestClose(event);\n      }\n    };\n\n    _this.handleOverlayOnClick = function (event) {\n      if (_this.shouldClose === null) {\n        _this.shouldClose = true;\n      }\n\n      if (_this.shouldClose && _this.props.shouldCloseOnOverlayClick) {\n        if (_this.ownerHandlesClose()) {\n          _this.requestClose(event);\n        } else {\n          _this.focusContent();\n        }\n      }\n      _this.shouldClose = null;\n    };\n\n    _this.handleContentOnMouseUp = function () {\n      _this.shouldClose = false;\n    };\n\n    _this.handleOverlayOnMouseDown = function (event) {\n      if (!_this.props.shouldCloseOnOverlayClick && event.target == _this.overlay) {\n        event.preventDefault();\n      }\n    };\n\n    _this.handleContentOnClick = function () {\n      _this.shouldClose = false;\n    };\n\n    _this.handleContentOnMouseDown = function () {\n      _this.shouldClose = false;\n    };\n\n    _this.requestClose = function (event) {\n      return _this.ownerHandlesClose() && _this.props.onRequestClose(event);\n    };\n\n    _this.ownerHandlesClose = function () {\n      return _this.props.onRequestClose;\n    };\n\n    _this.shouldBeClosed = function () {\n      return !_this.state.isOpen && !_this.state.beforeClose;\n    };\n\n    _this.contentHasFocus = function () {\n      return document.activeElement === _this.content || _this.content.contains(document.activeElement);\n    };\n\n    _this.buildClassName = function (which, additional) {\n      var classNames = (typeof additional === \"undefined\" ? \"undefined\" : _typeof(additional)) === \"object\" ? additional : {\n        base: CLASS_NAMES[which],\n        afterOpen: CLASS_NAMES[which] + \"--after-open\",\n        beforeClose: CLASS_NAMES[which] + \"--before-close\"\n      };\n      var className = classNames.base;\n      if (_this.state.afterOpen) {\n        className = className + \" \" + classNames.afterOpen;\n      }\n      if (_this.state.beforeClose) {\n        className = className + \" \" + classNames.beforeClose;\n      }\n      return typeof additional === \"string\" && additional ? className + \" \" + additional : className;\n    };\n\n    _this.attributesFromObject = function (prefix, items) {\n      return Object.keys(items).reduce(function (acc, name) {\n        acc[prefix + \"-\" + name] = items[name];\n        return acc;\n      }, {});\n    };\n\n    _this.state = {\n      afterOpen: false,\n      beforeClose: false\n    };\n\n    _this.shouldClose = null;\n    _this.moveFromContentToOverlay = null;\n    return _this;\n  }\n\n  _createClass(ModalPortal, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      if (this.props.isOpen) {\n        this.open();\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps, prevState) {\n      if (process.env.NODE_ENV !== \"production\") {\n        if (prevProps.bodyOpenClassName !== this.props.bodyOpenClassName) {\n          // eslint-disable-next-line no-console\n          console.warn('React-Modal: \"bodyOpenClassName\" prop has been modified. ' + \"This may cause unexpected behavior when multiple modals are open.\");\n        }\n        if (prevProps.htmlOpenClassName !== this.props.htmlOpenClassName) {\n          // eslint-disable-next-line no-console\n          console.warn('React-Modal: \"htmlOpenClassName\" prop has been modified. ' + \"This may cause unexpected behavior when multiple modals are open.\");\n        }\n      }\n\n      if (this.props.isOpen && !prevProps.isOpen) {\n        this.open();\n      } else if (!this.props.isOpen && prevProps.isOpen) {\n        this.close();\n      }\n\n      // Focus only needs to be set once when the modal is being opened\n      if (this.props.shouldFocusAfterRender && this.state.isOpen && !prevState.isOpen) {\n        this.focusContent();\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      if (this.state.isOpen) {\n        this.afterClose();\n      }\n      clearTimeout(this.closeTimer);\n      cancelAnimationFrame(this.openAnimationFrame);\n    }\n  }, {\n    key: \"beforeOpen\",\n    value: function beforeOpen() {\n      var _props = this.props,\n          appElement = _props.appElement,\n          ariaHideApp = _props.ariaHideApp,\n          htmlOpenClassName = _props.htmlOpenClassName,\n          bodyOpenClassName = _props.bodyOpenClassName;\n\n      // Add classes.\n\n      bodyOpenClassName && classList.add(document.body, bodyOpenClassName);\n\n      htmlOpenClassName && classList.add(document.getElementsByTagName(\"html\")[0], htmlOpenClassName);\n\n      if (ariaHideApp) {\n        ariaHiddenInstances += 1;\n        ariaAppHider.hide(appElement);\n      }\n\n      _portalOpenInstances2.default.register(this);\n    }\n\n    // Don't steal focus from inner elements\n\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _props2 = this.props,\n          id = _props2.id,\n          className = _props2.className,\n          overlayClassName = _props2.overlayClassName,\n          defaultStyles = _props2.defaultStyles,\n          children = _props2.children;\n\n      var contentStyles = className ? {} : defaultStyles.content;\n      var overlayStyles = overlayClassName ? {} : defaultStyles.overlay;\n\n      if (this.shouldBeClosed()) {\n        return null;\n      }\n\n      var overlayProps = {\n        ref: this.setOverlayRef,\n        className: this.buildClassName(\"overlay\", overlayClassName),\n        style: _extends({}, overlayStyles, this.props.style.overlay),\n        onClick: this.handleOverlayOnClick,\n        onMouseDown: this.handleOverlayOnMouseDown\n      };\n\n      var contentProps = _extends({\n        id: id,\n        ref: this.setContentRef,\n        style: _extends({}, contentStyles, this.props.style.content),\n        className: this.buildClassName(\"content\", className),\n        tabIndex: \"-1\",\n        onKeyDown: this.handleKeyDown,\n        onMouseDown: this.handleContentOnMouseDown,\n        onMouseUp: this.handleContentOnMouseUp,\n        onClick: this.handleContentOnClick,\n        role: this.props.role,\n        \"aria-label\": this.props.contentLabel\n      }, this.attributesFromObject(\"aria\", _extends({ modal: true }, this.props.aria)), this.attributesFromObject(\"data\", this.props.data || {}), {\n        \"data-testid\": this.props.testId\n      });\n\n      var contentElement = this.props.contentElement(contentProps, children);\n      return this.props.overlayElement(overlayProps, contentElement);\n    }\n  }]);\n\n  return ModalPortal;\n}(_react.Component);\n\nModalPortal.defaultProps = {\n  style: {\n    overlay: {},\n    content: {}\n  },\n  defaultStyles: {}\n};\nModalPortal.propTypes = {\n  isOpen: _propTypes2.default.bool.isRequired,\n  defaultStyles: _propTypes2.default.shape({\n    content: _propTypes2.default.object,\n    overlay: _propTypes2.default.object\n  }),\n  style: _propTypes2.default.shape({\n    content: _propTypes2.default.object,\n    overlay: _propTypes2.default.object\n  }),\n  className: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),\n  overlayClassName: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),\n  bodyOpenClassName: _propTypes2.default.string,\n  htmlOpenClassName: _propTypes2.default.string,\n  ariaHideApp: _propTypes2.default.bool,\n  appElement: _propTypes2.default.oneOfType([_propTypes2.default.instanceOf(_safeHTMLElement2.default), _propTypes2.default.instanceOf(_safeHTMLElement.SafeHTMLCollection), _propTypes2.default.instanceOf(_safeHTMLElement.SafeNodeList), _propTypes2.default.arrayOf(_propTypes2.default.instanceOf(_safeHTMLElement2.default))]),\n  onAfterOpen: _propTypes2.default.func,\n  onAfterClose: _propTypes2.default.func,\n  onRequestClose: _propTypes2.default.func,\n  closeTimeoutMS: _propTypes2.default.number,\n  shouldFocusAfterRender: _propTypes2.default.bool,\n  shouldCloseOnOverlayClick: _propTypes2.default.bool,\n  shouldReturnFocusAfterClose: _propTypes2.default.bool,\n  preventScroll: _propTypes2.default.bool,\n  role: _propTypes2.default.string,\n  contentLabel: _propTypes2.default.string,\n  aria: _propTypes2.default.object,\n  data: _propTypes2.default.object,\n  children: _propTypes2.default.node,\n  shouldCloseOnEsc: _propTypes2.default.bool,\n  overlayRef: _propTypes2.default.func,\n  contentRef: _propTypes2.default.func,\n  id: _propTypes2.default.string,\n  overlayElement: _propTypes2.default.func,\n  contentElement: _propTypes2.default.func,\n  testId: _propTypes2.default.string\n};\nexports.default = ModalPortal;\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resetState = resetState;\nexports.log = log;\nexports.assertNodeList = assertNodeList;\nexports.setElement = setElement;\nexports.validateElement = validateElement;\nexports.hide = hide;\nexports.show = show;\nexports.documentNotReadyOrSSRTesting = documentNotReadyOrSSRTesting;\n\nvar _warning = require(\"warning\");\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nvar _safeHTMLElement = require(\"./safeHTMLElement\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar globalElement = null;\n\n/* eslint-disable no-console */\n/* istanbul ignore next */\nfunction resetState() {\n  if (globalElement) {\n    if (globalElement.removeAttribute) {\n      globalElement.removeAttribute(\"aria-hidden\");\n    } else if (globalElement.length != null) {\n      globalElement.forEach(function (element) {\n        return element.removeAttribute(\"aria-hidden\");\n      });\n    } else {\n      document.querySelectorAll(globalElement).forEach(function (element) {\n        return element.removeAttribute(\"aria-hidden\");\n      });\n    }\n  }\n  globalElement = null;\n}\n\n/* istanbul ignore next */\nfunction log() {\n  if (process.env.NODE_ENV !== \"production\") {\n    var check = globalElement || {};\n    console.log(\"ariaAppHider ----------\");\n    console.log(check.nodeName, check.className, check.id);\n    console.log(\"end ariaAppHider ----------\");\n  }\n}\n/* eslint-enable no-console */\n\nfunction assertNodeList(nodeList, selector) {\n  if (!nodeList || !nodeList.length) {\n    throw new Error(\"react-modal: No elements were found for selector \" + selector + \".\");\n  }\n}\n\nfunction setElement(element) {\n  var useElement = element;\n  if (typeof useElement === \"string\" && _safeHTMLElement.canUseDOM) {\n    var el = document.querySelectorAll(useElement);\n    assertNodeList(el, useElement);\n    useElement = el;\n  }\n  globalElement = useElement || globalElement;\n  return globalElement;\n}\n\nfunction validateElement(appElement) {\n  var el = appElement || globalElement;\n  if (el) {\n    return Array.isArray(el) || el instanceof HTMLCollection || el instanceof NodeList ? el : [el];\n  } else {\n    (0, _warning2.default)(false, [\"react-modal: App element is not defined.\", \"Please use `Modal.setAppElement(el)` or set `appElement={el}`.\", \"This is needed so screen readers don't see main content\", \"when modal is opened. It is not recommended, but you can opt-out\", \"by setting `ariaHideApp={false}`.\"].join(\" \"));\n\n    return [];\n  }\n}\n\nfunction hide(appElement) {\n  var _iteratorNormalCompletion = true;\n  var _didIteratorError = false;\n  var _iteratorError = undefined;\n\n  try {\n    for (var _iterator = validateElement(appElement)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n      var el = _step.value;\n\n      el.setAttribute(\"aria-hidden\", \"true\");\n    }\n  } catch (err) {\n    _didIteratorError = true;\n    _iteratorError = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion && _iterator.return) {\n        _iterator.return();\n      }\n    } finally {\n      if (_didIteratorError) {\n        throw _iteratorError;\n      }\n    }\n  }\n}\n\nfunction show(appElement) {\n  var _iteratorNormalCompletion2 = true;\n  var _didIteratorError2 = false;\n  var _iteratorError2 = undefined;\n\n  try {\n    for (var _iterator2 = validateElement(appElement)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n      var el = _step2.value;\n\n      el.removeAttribute(\"aria-hidden\");\n    }\n  } catch (err) {\n    _didIteratorError2 = true;\n    _iteratorError2 = err;\n  } finally {\n    try {\n      if (!_iteratorNormalCompletion2 && _iterator2.return) {\n        _iterator2.return();\n      }\n    } finally {\n      if (_didIteratorError2) {\n        throw _iteratorError2;\n      }\n    }\n  }\n}\n\nfunction documentNotReadyOrSSRTesting() {\n  globalElement = null;\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resetState = resetState;\nexports.log = log;\n\nvar _portalOpenInstances = require(\"./portalOpenInstances\");\n\nvar _portalOpenInstances2 = _interopRequireDefault(_portalOpenInstances);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Body focus trap see Issue #742\n\nvar before = void 0,\n    after = void 0,\n    instances = [];\n\n/* eslint-disable no-console */\n/* istanbul ignore next */\nfunction resetState() {\n  var _arr = [before, after];\n\n  for (var _i = 0; _i < _arr.length; _i++) {\n    var item = _arr[_i];\n    if (!item) continue;\n    item.parentNode && item.parentNode.removeChild(item);\n  }\n  before = after = null;\n  instances = [];\n}\n\n/* istanbul ignore next */\nfunction log() {\n  console.log(\"bodyTrap ----------\");\n  console.log(instances.length);\n  var _arr2 = [before, after];\n  for (var _i2 = 0; _i2 < _arr2.length; _i2++) {\n    var item = _arr2[_i2];\n    var check = item || {};\n    console.log(check.nodeName, check.className, check.id);\n  }\n  console.log(\"edn bodyTrap ----------\");\n}\n/* eslint-enable no-console */\n\nfunction focusContent() {\n  if (instances.length === 0) {\n    if (process.env.NODE_ENV !== \"production\") {\n      // eslint-disable-next-line no-console\n      console.warn(\"React-Modal: Open instances > 0 expected\");\n    }\n    return;\n  }\n  instances[instances.length - 1].focusContent();\n}\n\nfunction bodyTrap(eventType, openInstances) {\n  if (!before && !after) {\n    before = document.createElement(\"div\");\n    before.setAttribute(\"data-react-modal-body-trap\", \"\");\n    before.style.position = \"absolute\";\n    before.style.opacity = \"0\";\n    before.setAttribute(\"tabindex\", \"0\");\n    before.addEventListener(\"focus\", focusContent);\n    after = before.cloneNode();\n    after.addEventListener(\"focus\", focusContent);\n  }\n\n  instances = openInstances;\n\n  if (instances.length > 0) {\n    // Add focus trap\n    if (document.body.firstChild !== before) {\n      document.body.insertBefore(before, document.body.firstChild);\n    }\n    if (document.body.lastChild !== after) {\n      document.body.appendChild(after);\n    }\n  } else {\n    // Remove focus trap\n    if (before.parentElement) {\n      before.parentElement.removeChild(before);\n    }\n    if (after.parentElement) {\n      after.parentElement.removeChild(after);\n    }\n  }\n}\n\n_portalOpenInstances2.default.subscribe(bodyTrap);","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resetState = resetState;\nexports.log = log;\nvar htmlClassList = {};\nvar docBodyClassList = {};\n\n/* eslint-disable no-console */\n/* istanbul ignore next */\nfunction removeClass(at, cls) {\n  at.classList.remove(cls);\n}\n\n/* istanbul ignore next */\nfunction resetState() {\n  var htmlElement = document.getElementsByTagName(\"html\")[0];\n  for (var cls in htmlClassList) {\n    removeClass(htmlElement, htmlClassList[cls]);\n  }\n\n  var body = document.body;\n  for (var _cls in docBodyClassList) {\n    removeClass(body, docBodyClassList[_cls]);\n  }\n\n  htmlClassList = {};\n  docBodyClassList = {};\n}\n\n/* istanbul ignore next */\nfunction log() {\n  if (process.env.NODE_ENV !== \"production\") {\n    var classes = document.getElementsByTagName(\"html\")[0].className;\n    var buffer = \"Show tracked classes:\\n\\n\";\n\n    buffer += \"<html /> (\" + classes + \"):\\n  \";\n    for (var x in htmlClassList) {\n      buffer += \"  \" + x + \" \" + htmlClassList[x] + \"\\n  \";\n    }\n\n    classes = document.body.className;\n\n    buffer += \"\\n\\ndoc.body (\" + classes + \"):\\n  \";\n    for (var _x in docBodyClassList) {\n      buffer += \"  \" + _x + \" \" + docBodyClassList[_x] + \"\\n  \";\n    }\n\n    buffer += \"\\n\";\n\n    console.log(buffer);\n  }\n}\n/* eslint-enable no-console */\n\n/**\n * Track the number of reference of a class.\n * @param {object} poll The poll to receive the reference.\n * @param {string} className The class name.\n * @return {string}\n */\nvar incrementReference = function incrementReference(poll, className) {\n  if (!poll[className]) {\n    poll[className] = 0;\n  }\n  poll[className] += 1;\n  return className;\n};\n\n/**\n * Drop the reference of a class.\n * @param {object} poll The poll to receive the reference.\n * @param {string} className The class name.\n * @return {string}\n */\nvar decrementReference = function decrementReference(poll, className) {\n  if (poll[className]) {\n    poll[className] -= 1;\n  }\n  return className;\n};\n\n/**\n * Track a class and add to the given class list.\n * @param {Object} classListRef A class list of an element.\n * @param {Object} poll         The poll to be used.\n * @param {Array}  classes      The list of classes to be tracked.\n */\nvar trackClass = function trackClass(classListRef, poll, classes) {\n  classes.forEach(function (className) {\n    incrementReference(poll, className);\n    classListRef.add(className);\n  });\n};\n\n/**\n * Untrack a class and remove from the given class list if the reference\n * reaches 0.\n * @param {Object} classListRef A class list of an element.\n * @param {Object} poll         The poll to be used.\n * @param {Array}  classes      The list of classes to be untracked.\n */\nvar untrackClass = function untrackClass(classListRef, poll, classes) {\n  classes.forEach(function (className) {\n    decrementReference(poll, className);\n    poll[className] === 0 && classListRef.remove(className);\n  });\n};\n\n/**\n * Public inferface to add classes to the document.body.\n * @param {string} bodyClass The class string to be added.\n *                           It may contain more then one class\n *                           with ' ' as separator.\n */\nvar add = exports.add = function add(element, classString) {\n  return trackClass(element.classList, element.nodeName.toLowerCase() == \"html\" ? htmlClassList : docBodyClassList, classString.split(\" \"));\n};\n\n/**\n * Public inferface to remove classes from the document.body.\n * @param {string} bodyClass The class string to be added.\n *                           It may contain more then one class\n *                           with ' ' as separator.\n */\nvar remove = exports.remove = function remove(element, classString) {\n  return untrackClass(element.classList, element.nodeName.toLowerCase() == \"html\" ? htmlClassList : docBodyClassList, classString.split(\" \"));\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resetState = resetState;\nexports.log = log;\nexports.handleBlur = handleBlur;\nexports.handleFocus = handleFocus;\nexports.markForFocusLater = markForFocusLater;\nexports.returnFocus = returnFocus;\nexports.popWithoutFocus = popWithoutFocus;\nexports.setupScopedFocus = setupScopedFocus;\nexports.teardownScopedFocus = teardownScopedFocus;\n\nvar _tabbable = require(\"../helpers/tabbable\");\n\nvar _tabbable2 = _interopRequireDefault(_tabbable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar focusLaterElements = [];\nvar modalElement = null;\nvar needToFocus = false;\n\n/* eslint-disable no-console */\n/* istanbul ignore next */\nfunction resetState() {\n  focusLaterElements = [];\n}\n\n/* istanbul ignore next */\nfunction log() {\n  if (process.env.NODE_ENV !== \"production\") {\n    console.log(\"focusManager ----------\");\n    focusLaterElements.forEach(function (f) {\n      var check = f || {};\n      console.log(check.nodeName, check.className, check.id);\n    });\n    console.log(\"end focusManager ----------\");\n  }\n}\n/* eslint-enable no-console */\n\nfunction handleBlur() {\n  needToFocus = true;\n}\n\nfunction handleFocus() {\n  if (needToFocus) {\n    needToFocus = false;\n    if (!modalElement) {\n      return;\n    }\n    // need to see how jQuery shims document.on('focusin') so we don't need the\n    // setTimeout, firefox doesn't support focusin, if it did, we could focus\n    // the element outside of a setTimeout. Side-effect of this implementation\n    // is that the document.body gets focus, and then we focus our element right\n    // after, seems fine.\n    setTimeout(function () {\n      if (modalElement.contains(document.activeElement)) {\n        return;\n      }\n      var el = (0, _tabbable2.default)(modalElement)[0] || modalElement;\n      el.focus();\n    }, 0);\n  }\n}\n\nfunction markForFocusLater() {\n  focusLaterElements.push(document.activeElement);\n}\n\n/* eslint-disable no-console */\nfunction returnFocus() {\n  var preventScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n  var toFocus = null;\n  try {\n    if (focusLaterElements.length !== 0) {\n      toFocus = focusLaterElements.pop();\n      toFocus.focus({ preventScroll: preventScroll });\n    }\n    return;\n  } catch (e) {\n    console.warn([\"You tried to return focus to\", toFocus, \"but it is not in the DOM anymore\"].join(\" \"));\n  }\n}\n/* eslint-enable no-console */\n\nfunction popWithoutFocus() {\n  focusLaterElements.length > 0 && focusLaterElements.pop();\n}\n\nfunction setupScopedFocus(element) {\n  modalElement = element;\n\n  if (window.addEventListener) {\n    window.addEventListener(\"blur\", handleBlur, false);\n    document.addEventListener(\"focus\", handleFocus, true);\n  } else {\n    window.attachEvent(\"onBlur\", handleBlur);\n    document.attachEvent(\"onFocus\", handleFocus);\n  }\n}\n\nfunction teardownScopedFocus() {\n  modalElement = null;\n\n  if (window.addEventListener) {\n    window.removeEventListener(\"blur\", handleBlur);\n    document.removeEventListener(\"focus\", handleFocus);\n  } else {\n    window.detachEvent(\"onBlur\", handleBlur);\n    document.detachEvent(\"onFocus\", handleFocus);\n  }\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.log = log;\nexports.resetState = resetState;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Tracks portals that are open and emits events to subscribers\n\nvar PortalOpenInstances = function PortalOpenInstances() {\n  var _this = this;\n\n  _classCallCheck(this, PortalOpenInstances);\n\n  this.register = function (openInstance) {\n    if (_this.openInstances.indexOf(openInstance) !== -1) {\n      if (process.env.NODE_ENV !== \"production\") {\n        // eslint-disable-next-line no-console\n        console.warn(\"React-Modal: Cannot register modal instance that's already open\");\n      }\n      return;\n    }\n    _this.openInstances.push(openInstance);\n    _this.emit(\"register\");\n  };\n\n  this.deregister = function (openInstance) {\n    var index = _this.openInstances.indexOf(openInstance);\n    if (index === -1) {\n      if (process.env.NODE_ENV !== \"production\") {\n        // eslint-disable-next-line no-console\n        console.warn(\"React-Modal: Unable to deregister \" + openInstance + \" as \" + \"it was never registered\");\n      }\n      return;\n    }\n    _this.openInstances.splice(index, 1);\n    _this.emit(\"deregister\");\n  };\n\n  this.subscribe = function (callback) {\n    _this.subscribers.push(callback);\n  };\n\n  this.emit = function (eventType) {\n    _this.subscribers.forEach(function (subscriber) {\n      return subscriber(eventType,\n      // shallow copy to avoid accidental mutation\n      _this.openInstances.slice());\n    });\n  };\n\n  this.openInstances = [];\n  this.subscribers = [];\n};\n\nvar portalOpenInstances = new PortalOpenInstances();\n\n/* eslint-disable no-console */\n/* istanbul ignore next */\nfunction log() {\n  console.log(\"portalOpenInstances ----------\");\n  console.log(portalOpenInstances.openInstances.length);\n  portalOpenInstances.openInstances.forEach(function (p) {\n    return console.log(p);\n  });\n  console.log(\"end portalOpenInstances ----------\");\n}\n\n/* istanbul ignore next */\nfunction resetState() {\n  portalOpenInstances = new PortalOpenInstances();\n}\n/* eslint-enable no-console */\n\nexports.default = portalOpenInstances;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.canUseDOM = exports.SafeNodeList = exports.SafeHTMLCollection = undefined;\n\nvar _exenv = require(\"exenv\");\n\nvar _exenv2 = _interopRequireDefault(_exenv);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar EE = _exenv2.default;\n\nvar SafeHTMLElement = EE.canUseDOM ? window.HTMLElement : {};\n\nvar SafeHTMLCollection = exports.SafeHTMLCollection = EE.canUseDOM ? window.HTMLCollection : {};\n\nvar SafeNodeList = exports.SafeNodeList = EE.canUseDOM ? window.NodeList : {};\n\nvar canUseDOM = exports.canUseDOM = EE.canUseDOM;\n\nexports.default = SafeHTMLElement;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = scopeTab;\n\nvar _tabbable = require(\"./tabbable\");\n\nvar _tabbable2 = _interopRequireDefault(_tabbable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getActiveElement() {\n  var el = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;\n\n  return el.activeElement.shadowRoot ? getActiveElement(el.activeElement.shadowRoot) : el.activeElement;\n}\n\nfunction scopeTab(node, event) {\n  var tabbable = (0, _tabbable2.default)(node);\n\n  if (!tabbable.length) {\n    // Do nothing, since there are no elements that can receive focus.\n    event.preventDefault();\n    return;\n  }\n\n  var target = void 0;\n\n  var shiftKey = event.shiftKey;\n  var head = tabbable[0];\n  var tail = tabbable[tabbable.length - 1];\n  var activeElement = getActiveElement();\n\n  // proceed with default browser behavior on tab.\n  // Focus on last element on shift + tab.\n  if (node === activeElement) {\n    if (!shiftKey) return;\n    target = tail;\n  }\n\n  if (tail === activeElement && !shiftKey) {\n    target = head;\n  }\n\n  if (head === activeElement && shiftKey) {\n    target = tail;\n  }\n\n  if (target) {\n    event.preventDefault();\n    target.focus();\n    return;\n  }\n\n  // Safari radio issue.\n  //\n  // Safari does not move the focus to the radio button,\n  // so we need to force it to really walk through all elements.\n  //\n  // This is very error prone, since we are trying to guess\n  // if it is a safari browser from the first occurence between\n  // chrome or safari.\n  //\n  // The chrome user agent contains the first ocurrence\n  // as the 'chrome/version' and later the 'safari/version'.\n  var checkSafari = /(\\bChrome\\b|\\bSafari\\b)\\//.exec(navigator.userAgent);\n  var isSafariDesktop = checkSafari != null && checkSafari[1] != \"Chrome\" && /\\biPod\\b|\\biPad\\b/g.exec(navigator.userAgent) == null;\n\n  // If we are not in safari desktop, let the browser control\n  // the focus\n  if (!isSafariDesktop) return;\n\n  var x = tabbable.indexOf(activeElement);\n\n  if (x > -1) {\n    x += shiftKey ? -1 : 1;\n  }\n\n  target = tabbable[x];\n\n  // If the tabbable element does not exist,\n  // focus head/tail based on shiftKey\n  if (typeof target === \"undefined\") {\n    event.preventDefault();\n    target = shiftKey ? tail : head;\n    target.focus();\n    return;\n  }\n\n  event.preventDefault();\n\n  target.focus();\n}\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = findTabbableDescendants;\n/*!\n * Adapted from jQuery UI core\n *\n * http://jqueryui.com\n *\n * Copyright 2014 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n *\n * http://api.jqueryui.com/category/ui-core/\n */\n\nvar tabbableNode = /input|select|textarea|button|object|iframe/;\n\nfunction hidesContents(element) {\n  var zeroSize = element.offsetWidth <= 0 && element.offsetHeight <= 0;\n\n  // If the node is empty, this is good enough\n  if (zeroSize && !element.innerHTML) return true;\n\n  try {\n    // Otherwise we need to check some styles\n    var style = window.getComputedStyle(element);\n    return zeroSize ? style.getPropertyValue(\"overflow\") !== \"visible\" ||\n    // if 'overflow: visible' set, check if there is actually any overflow\n    element.scrollWidth <= 0 && element.scrollHeight <= 0 : style.getPropertyValue(\"display\") == \"none\";\n  } catch (exception) {\n    // eslint-disable-next-line no-console\n    console.warn(\"Failed to inspect element style\");\n    return false;\n  }\n}\n\nfunction visible(element) {\n  var parentElement = element;\n  var rootNode = element.getRootNode && element.getRootNode();\n  while (parentElement) {\n    if (parentElement === document.body) break;\n\n    // if we are not hidden yet, skip to checking outside the Web Component\n    if (rootNode && parentElement === rootNode) parentElement = rootNode.host.parentNode;\n\n    if (hidesContents(parentElement)) return false;\n    parentElement = parentElement.parentNode;\n  }\n  return true;\n}\n\nfunction focusable(element, isTabIndexNotNaN) {\n  var nodeName = element.nodeName.toLowerCase();\n  var res = tabbableNode.test(nodeName) && !element.disabled || (nodeName === \"a\" ? element.href || isTabIndexNotNaN : isTabIndexNotNaN);\n  return res && visible(element);\n}\n\nfunction tabbable(element) {\n  var tabIndex = element.getAttribute(\"tabindex\");\n  if (tabIndex === null) tabIndex = undefined;\n  var isTabIndexNaN = isNaN(tabIndex);\n  return (isTabIndexNaN || tabIndex >= 0) && focusable(element, !isTabIndexNaN);\n}\n\nfunction findTabbableDescendants(element) {\n  var descendants = [].slice.call(element.querySelectorAll(\"*\"), 0).reduce(function (finished, el) {\n    return finished.concat(!el.shadowRoot ? [el] : findTabbableDescendants(el.shadowRoot));\n  }, []);\n  return descendants.filter(tabbable);\n}\nmodule.exports = exports[\"default\"];","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _Modal = require(\"./components/Modal\");\n\nvar _Modal2 = _interopRequireDefault(_Modal);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _Modal2.default;\nmodule.exports = exports[\"default\"];","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n  var printWarning = function printWarning(format, args) {\n    var len = arguments.length;\n    args = new Array(len > 1 ? len - 1 : 0);\n    for (var key = 1; key < len; key++) {\n      args[key - 1] = arguments[key];\n    }\n    var argIndex = 0;\n    var message = 'Warning: ' +\n      format.replace(/%s/g, function() {\n        return args[argIndex++];\n      });\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  }\n\n  warning = function(condition, format, args) {\n    var len = arguments.length;\n    args = new Array(len > 2 ? len - 2 : 0);\n    for (var key = 2; key < len; key++) {\n      args[key - 2] = arguments[key];\n    }\n    if (format === undefined) {\n      throw new Error(\n          '`warning(condition, format, ...args)` requires a warning ' +\n          'message argument'\n      );\n    }\n    if (!condition) {\n      printWarning.apply(null, [format].concat(args));\n    }\n  };\n}\n\nmodule.exports = warning;\n","import React from 'react';\nexport var ReactReduxContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== 'production') {\n  ReactReduxContext.displayName = 'ReactRedux';\n}\n\nexport default ReactReduxContext;","// Default to a dummy \"batch\" implementation that just runs the callback\nfunction defaultNoopBatch(callback) {\n  callback();\n}\n\nvar batch = defaultNoopBatch; // Allow injecting another batching function later\n\nexport var setBatch = function setBatch(newBatch) {\n  return batch = newBatch;\n}; // Supply a getter just to skip dealing with ESM bindings\n\nexport var getBatch = function getBatch() {\n  return batch;\n};","import { getBatch } from './batch'; // encapsulates the subscription logic for connecting a component to the redux store, as\n// well as nesting subscriptions of descendant components, so that we can ensure the\n// ancestor components re-render before descendants\n\nfunction createListenerCollection() {\n  var batch = getBatch();\n  var first = null;\n  var last = null;\n  return {\n    clear: function clear() {\n      first = null;\n      last = null;\n    },\n    notify: function notify() {\n      batch(function () {\n        var listener = first;\n\n        while (listener) {\n          listener.callback();\n          listener = listener.next;\n        }\n      });\n    },\n    get: function get() {\n      var listeners = [];\n      var listener = first;\n\n      while (listener) {\n        listeners.push(listener);\n        listener = listener.next;\n      }\n\n      return listeners;\n    },\n    subscribe: function subscribe(callback) {\n      var isSubscribed = true;\n      var listener = last = {\n        callback: callback,\n        next: null,\n        prev: last\n      };\n\n      if (listener.prev) {\n        listener.prev.next = listener;\n      } else {\n        first = listener;\n      }\n\n      return function unsubscribe() {\n        if (!isSubscribed || first === null) return;\n        isSubscribed = false;\n\n        if (listener.next) {\n          listener.next.prev = listener.prev;\n        } else {\n          last = listener.prev;\n        }\n\n        if (listener.prev) {\n          listener.prev.next = listener.next;\n        } else {\n          first = listener.next;\n        }\n      };\n    }\n  };\n}\n\nvar nullListeners = {\n  notify: function notify() {},\n  get: function get() {\n    return [];\n  }\n};\nexport function createSubscription(store, parentSub) {\n  var unsubscribe;\n  var listeners = nullListeners;\n\n  function addNestedSub(listener) {\n    trySubscribe();\n    return listeners.subscribe(listener);\n  }\n\n  function notifyNestedSubs() {\n    listeners.notify();\n  }\n\n  function handleChangeWrapper() {\n    if (subscription.onStateChange) {\n      subscription.onStateChange();\n    }\n  }\n\n  function isSubscribed() {\n    return Boolean(unsubscribe);\n  }\n\n  function trySubscribe() {\n    if (!unsubscribe) {\n      unsubscribe = parentSub ? parentSub.addNestedSub(handleChangeWrapper) : store.subscribe(handleChangeWrapper);\n      listeners = createListenerCollection();\n    }\n  }\n\n  function tryUnsubscribe() {\n    if (unsubscribe) {\n      unsubscribe();\n      unsubscribe = undefined;\n      listeners.clear();\n      listeners = nullListeners;\n    }\n  }\n\n  var subscription = {\n    addNestedSub: addNestedSub,\n    notifyNestedSubs: notifyNestedSubs,\n    handleChangeWrapper: handleChangeWrapper,\n    isSubscribed: isSubscribed,\n    trySubscribe: trySubscribe,\n    tryUnsubscribe: tryUnsubscribe,\n    getListeners: function getListeners() {\n      return listeners;\n    }\n  };\n  return subscription;\n}","import { useEffect, useLayoutEffect } from 'react'; // React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\n// subscription callback always has the selector from the latest render commit\n// available, otherwise a store update may happen between render and the effect,\n// which may cause missed updates; we also must ensure the store subscription\n// is created synchronously, otherwise a store update may occur before the\n// subscription is created and an inconsistent state may be observed\n\nexport var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { ReactReduxContext } from './Context';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\n\nfunction Provider(_ref) {\n  var store = _ref.store,\n      context = _ref.context,\n      children = _ref.children;\n  var contextValue = useMemo(function () {\n    var subscription = createSubscription(store);\n    return {\n      store: store,\n      subscription: subscription\n    };\n  }, [store]);\n  var previousState = useMemo(function () {\n    return store.getState();\n  }, [store]);\n  useIsomorphicLayoutEffect(function () {\n    var subscription = contextValue.subscription;\n    subscription.onStateChange = subscription.notifyNestedSubs;\n    subscription.trySubscribe();\n\n    if (previousState !== store.getState()) {\n      subscription.notifyNestedSubs();\n    }\n\n    return function () {\n      subscription.tryUnsubscribe();\n      subscription.onStateChange = null;\n    };\n  }, [contextValue, previousState]);\n  var Context = context || ReactReduxContext;\n  return /*#__PURE__*/React.createElement(Context.Provider, {\n    value: contextValue\n  }, children);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n  Provider.propTypes = {\n    store: PropTypes.shape({\n      subscribe: PropTypes.func.isRequired,\n      dispatch: PropTypes.func.isRequired,\n      getState: PropTypes.func.isRequired\n    }),\n    context: PropTypes.object,\n    children: PropTypes.any\n  };\n}\n\nexport default Provider;","export default function _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"getDisplayName\", \"methodName\", \"renderCountProp\", \"shouldHandleStateChanges\", \"storeKey\", \"withRef\", \"forwardRef\", \"context\"],\n    _excluded2 = [\"reactReduxForwardedRef\"];\nimport hoistStatics from 'hoist-non-react-statics';\nimport React, { useContext, useMemo, useRef, useReducer } from 'react';\nimport { isValidElementType, isContextConsumer } from 'react-is';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\nimport { ReactReduxContext } from './Context'; // Define some constant arrays just to avoid re-creating these\n\nvar EMPTY_ARRAY = [];\nvar NO_SUBSCRIPTION_ARRAY = [null, null];\n\nvar stringifyComponent = function stringifyComponent(Comp) {\n  try {\n    return JSON.stringify(Comp);\n  } catch (err) {\n    return String(Comp);\n  }\n};\n\nfunction storeStateUpdatesReducer(state, action) {\n  var updateCount = state[1];\n  return [action.payload, updateCount + 1];\n}\n\nfunction useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {\n  useIsomorphicLayoutEffect(function () {\n    return effectFunc.apply(void 0, effectArgs);\n  }, dependencies);\n}\n\nfunction captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {\n  // We want to capture the wrapper props and child props we used for later comparisons\n  lastWrapperProps.current = wrapperProps;\n  lastChildProps.current = actualChildProps;\n  renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update\n\n  if (childPropsFromStoreUpdate.current) {\n    childPropsFromStoreUpdate.current = null;\n    notifyNestedSubs();\n  }\n}\n\nfunction subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {\n  // If we're not subscribed to the store, nothing to do here\n  if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts\n\n  var didUnsubscribe = false;\n  var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component\n\n  var checkForUpdates = function checkForUpdates() {\n    if (didUnsubscribe) {\n      // Don't run stale listeners.\n      // Redux doesn't guarantee unsubscriptions happen until next dispatch.\n      return;\n    }\n\n    var latestStoreState = store.getState();\n    var newChildProps, error;\n\n    try {\n      // Actually run the selector with the most recent store state and wrapper props\n      // to determine what the child props should be\n      newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);\n    } catch (e) {\n      error = e;\n      lastThrownError = e;\n    }\n\n    if (!error) {\n      lastThrownError = null;\n    } // If the child props haven't changed, nothing to do here - cascade the subscription update\n\n\n    if (newChildProps === lastChildProps.current) {\n      if (!renderIsScheduled.current) {\n        notifyNestedSubs();\n      }\n    } else {\n      // Save references to the new child props.  Note that we track the \"child props from store update\"\n      // as a ref instead of a useState/useReducer because we need a way to determine if that value has\n      // been processed.  If this went into useState/useReducer, we couldn't clear out the value without\n      // forcing another re-render, which we don't want.\n      lastChildProps.current = newChildProps;\n      childPropsFromStoreUpdate.current = newChildProps;\n      renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render\n\n      forceComponentUpdateDispatch({\n        type: 'STORE_UPDATED',\n        payload: {\n          error: error\n        }\n      });\n    }\n  }; // Actually subscribe to the nearest connected ancestor (or store)\n\n\n  subscription.onStateChange = checkForUpdates;\n  subscription.trySubscribe(); // Pull data from the store after first render in case the store has\n  // changed since we began.\n\n  checkForUpdates();\n\n  var unsubscribeWrapper = function unsubscribeWrapper() {\n    didUnsubscribe = true;\n    subscription.tryUnsubscribe();\n    subscription.onStateChange = null;\n\n    if (lastThrownError) {\n      // It's possible that we caught an error due to a bad mapState function, but the\n      // parent re-rendered without this component and we're about to unmount.\n      // This shouldn't happen as long as we do top-down subscriptions correctly, but\n      // if we ever do those wrong, this throw will surface the error in our tests.\n      // In that case, throw the error from here so it doesn't get lost.\n      throw lastThrownError;\n    }\n  };\n\n  return unsubscribeWrapper;\n}\n\nvar initStateUpdates = function initStateUpdates() {\n  return [null, 0];\n};\n\nexport default function connectAdvanced(\n/*\r\n  selectorFactory is a func that is responsible for returning the selector function used to\r\n  compute new props from state, props, and dispatch. For example:\r\n      export default connectAdvanced((dispatch, options) => (state, props) => ({\r\n      thing: state.things[props.thingId],\r\n      saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),\r\n    }))(YourComponent)\r\n    Access to dispatch is provided to the factory so selectorFactories can bind actionCreators\r\n  outside of their selector as an optimization. Options passed to connectAdvanced are passed to\r\n  the selectorFactory, along with displayName and WrappedComponent, as the second argument.\r\n    Note that selectorFactory is responsible for all caching/memoization of inbound and outbound\r\n  props. Do not use connectAdvanced directly without memoizing results between calls to your\r\n  selector, otherwise the Connect component will re-render on every state or props change.\r\n*/\nselectorFactory, // options object:\n_ref) {\n  if (_ref === void 0) {\n    _ref = {};\n  }\n\n  var _ref2 = _ref,\n      _ref2$getDisplayName = _ref2.getDisplayName,\n      getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {\n    return \"ConnectAdvanced(\" + name + \")\";\n  } : _ref2$getDisplayName,\n      _ref2$methodName = _ref2.methodName,\n      methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,\n      _ref2$renderCountProp = _ref2.renderCountProp,\n      renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,\n      _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,\n      shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,\n      _ref2$storeKey = _ref2.storeKey,\n      storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,\n      _ref2$withRef = _ref2.withRef,\n      withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,\n      _ref2$forwardRef = _ref2.forwardRef,\n      forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,\n      _ref2$context = _ref2.context,\n      context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,\n      connectOptions = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n  if (process.env.NODE_ENV !== 'production') {\n    if (renderCountProp !== undefined) {\n      throw new Error(\"renderCountProp is removed. render counting is built into the latest React Dev Tools profiling extension\");\n    }\n\n    if (withRef) {\n      throw new Error('withRef is removed. To access the wrapped instance, use a ref on the connected component');\n    }\n\n    var customStoreWarningMessage = 'To use a custom Redux store for specific components, create a custom React context with ' + \"React.createContext(), and pass the context object to React Redux's Provider and specific components\" + ' like: <Provider context={MyContext}><ConnectedComponent context={MyContext} /></Provider>. ' + 'You may also pass a {context : MyContext} option to connect';\n\n    if (storeKey !== 'store') {\n      throw new Error('storeKey has been removed and does not do anything. ' + customStoreWarningMessage);\n    }\n  }\n\n  var Context = context;\n  return function wrapWithConnect(WrappedComponent) {\n    if (process.env.NODE_ENV !== 'production' && !isValidElementType(WrappedComponent)) {\n      throw new Error(\"You must pass a component to the function returned by \" + (methodName + \". Instead received \" + stringifyComponent(WrappedComponent)));\n    }\n\n    var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';\n    var displayName = getDisplayName(wrappedComponentName);\n\n    var selectorFactoryOptions = _extends({}, connectOptions, {\n      getDisplayName: getDisplayName,\n      methodName: methodName,\n      renderCountProp: renderCountProp,\n      shouldHandleStateChanges: shouldHandleStateChanges,\n      storeKey: storeKey,\n      displayName: displayName,\n      wrappedComponentName: wrappedComponentName,\n      WrappedComponent: WrappedComponent\n    });\n\n    var pure = connectOptions.pure;\n\n    function createChildSelector(store) {\n      return selectorFactory(store.dispatch, selectorFactoryOptions);\n    } // If we aren't running in \"pure\" mode, we don't want to memoize values.\n    // To avoid conditionally calling hooks, we fall back to a tiny wrapper\n    // that just executes the given callback immediately.\n\n\n    var usePureOnlyMemo = pure ? useMemo : function (callback) {\n      return callback();\n    };\n\n    function ConnectFunction(props) {\n      var _useMemo = useMemo(function () {\n        // Distinguish between actual \"data\" props that were passed to the wrapper component,\n        // and values needed to control behavior (forwarded refs, alternate context instances).\n        // To maintain the wrapperProps object reference, memoize this destructuring.\n        var reactReduxForwardedRef = props.reactReduxForwardedRef,\n            wrapperProps = _objectWithoutPropertiesLoose(props, _excluded2);\n\n        return [props.context, reactReduxForwardedRef, wrapperProps];\n      }, [props]),\n          propsContext = _useMemo[0],\n          reactReduxForwardedRef = _useMemo[1],\n          wrapperProps = _useMemo[2];\n\n      var ContextToUse = useMemo(function () {\n        // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\n        // Memoize the check that determines which context instance we should use.\n        return propsContext && propsContext.Consumer && isContextConsumer( /*#__PURE__*/React.createElement(propsContext.Consumer, null)) ? propsContext : Context;\n      }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available\n\n      var contextValue = useContext(ContextToUse); // The store _must_ exist as either a prop or in context.\n      // We'll check to see if it _looks_ like a Redux store first.\n      // This allows us to pass through a `store` prop that is just a plain value.\n\n      var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);\n      var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);\n\n      if (process.env.NODE_ENV !== 'production' && !didStoreComeFromProps && !didStoreComeFromContext) {\n        throw new Error(\"Could not find \\\"store\\\" in the context of \" + (\"\\\"\" + displayName + \"\\\". Either wrap the root component in a <Provider>, \") + \"or pass a custom React context provider to <Provider> and the corresponding \" + (\"React context consumer to \" + displayName + \" in connect options.\"));\n      } // Based on the previous check, one of these must be true\n\n\n      var store = didStoreComeFromProps ? props.store : contextValue.store;\n      var childPropsSelector = useMemo(function () {\n        // The child props selector needs the store reference as an input.\n        // Re-create this selector whenever the store changes.\n        return createChildSelector(store);\n      }, [store]);\n\n      var _useMemo2 = useMemo(function () {\n        if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component\n        // connected to the store via props shouldn't use subscription from context, or vice versa.\n\n        // This Subscription's source should match where store came from: props vs. context. A component\n        // connected to the store via props shouldn't use subscription from context, or vice versa.\n        var subscription = createSubscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n        // the middle of the notification loop, where `subscription` will then be null. This can\n        // probably be avoided if Subscription's listeners logic is changed to not call listeners\n        // that have been unsubscribed in the  middle of the notification loop.\n\n        // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n        // the middle of the notification loop, where `subscription` will then be null. This can\n        // probably be avoided if Subscription's listeners logic is changed to not call listeners\n        // that have been unsubscribed in the  middle of the notification loop.\n        var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);\n        return [subscription, notifyNestedSubs];\n      }, [store, didStoreComeFromProps, contextValue]),\n          subscription = _useMemo2[0],\n          notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,\n      // and memoize that value to avoid unnecessary context updates.\n\n\n      var overriddenContextValue = useMemo(function () {\n        if (didStoreComeFromProps) {\n          // This component is directly subscribed to a store from props.\n          // We don't want descendants reading from this store - pass down whatever\n          // the existing context value is from the nearest connected ancestor.\n          return contextValue;\n        } // Otherwise, put this component's subscription instance into context, so that\n        // connected descendants won't update until after this component is done\n\n\n        return _extends({}, contextValue, {\n          subscription: subscription\n        });\n      }, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update\n      // causes a change to the calculated child component props (or we caught an error in mapState)\n\n      var _useReducer = useReducer(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),\n          _useReducer$ = _useReducer[0],\n          previousStateUpdateResult = _useReducer$[0],\n          forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards\n\n\n      if (previousStateUpdateResult && previousStateUpdateResult.error) {\n        throw previousStateUpdateResult.error;\n      } // Set up refs to coordinate values between the subscription effect and the render logic\n\n\n      var lastChildProps = useRef();\n      var lastWrapperProps = useRef(wrapperProps);\n      var childPropsFromStoreUpdate = useRef();\n      var renderIsScheduled = useRef(false);\n      var actualChildProps = usePureOnlyMemo(function () {\n        // Tricky logic here:\n        // - This render may have been triggered by a Redux store update that produced new child props\n        // - However, we may have gotten new wrapper props after that\n        // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\n        // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\n        // So, we'll use the child props from store update only if the wrapper props are the same as last time.\n        if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {\n          return childPropsFromStoreUpdate.current;\n        } // TODO We're reading the store directly in render() here. Bad idea?\n        // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\n        // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\n        // to determine what the child props should be.\n\n\n        return childPropsSelector(store.getState(), wrapperProps);\n      }, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns\n      // about useLayoutEffect in SSR, so we try to detect environment and fall back to\n      // just useEffect instead to avoid the warning, since neither will run anyway.\n\n      useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes\n\n      useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that's done, we can finally try to actually render the child component.\n      // We memoize the elements for the rendered child component as an optimization.\n\n      var renderedWrappedComponent = useMemo(function () {\n        return /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, actualChildProps, {\n          ref: reactReduxForwardedRef\n        }));\n      }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering\n      // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\n\n      var renderedChild = useMemo(function () {\n        if (shouldHandleStateChanges) {\n          // If this component is subscribed to store updates, we need to pass its own\n          // subscription instance down to our descendants. That means rendering the same\n          // Context instance, and putting a different value into the context.\n          return /*#__PURE__*/React.createElement(ContextToUse.Provider, {\n            value: overriddenContextValue\n          }, renderedWrappedComponent);\n        }\n\n        return renderedWrappedComponent;\n      }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);\n      return renderedChild;\n    } // If we're in \"pure\" mode, ensure our wrapper component only re-renders when incoming props have changed.\n\n\n    var Connect = pure ? React.memo(ConnectFunction) : ConnectFunction;\n    Connect.WrappedComponent = WrappedComponent;\n    Connect.displayName = ConnectFunction.displayName = displayName;\n\n    if (forwardRef) {\n      var forwarded = React.forwardRef(function forwardConnectRef(props, ref) {\n        return /*#__PURE__*/React.createElement(Connect, _extends({}, props, {\n          reactReduxForwardedRef: ref\n        }));\n      });\n      forwarded.displayName = displayName;\n      forwarded.WrappedComponent = WrappedComponent;\n      return hoistStatics(forwarded, WrappedComponent);\n    }\n\n    return hoistStatics(Connect, WrappedComponent);\n  };\n}","function is(x, y) {\n  if (x === y) {\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nexport default function shallowEqual(objA, objB) {\n  if (is(objA, objB)) return true;\n\n  if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n  if (keysA.length !== keysB.length) return false;\n\n  for (var i = 0; i < keysA.length; i++) {\n    if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n      return false;\n    }\n  }\n\n  return true;\n}","import verifyPlainObject from '../utils/verifyPlainObject';\nexport function wrapMapToPropsConstant(getConstant) {\n  return function initConstantSelector(dispatch, options) {\n    var constant = getConstant(dispatch, options);\n\n    function constantSelector() {\n      return constant;\n    }\n\n    constantSelector.dependsOnOwnProps = false;\n    return constantSelector;\n  };\n} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\n// whether mapToProps needs to be invoked when props have changed.\n//\n// A length of one signals that mapToProps does not depend on props from the parent component.\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\n// therefore not reporting its length accurately..\n\nexport function getDependsOnOwnProps(mapToProps) {\n  return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;\n} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\n// this function wraps mapToProps in a proxy function which does several things:\n//\n//  * Detects whether the mapToProps function being called depends on props, which\n//    is used by selectorFactory to decide if it should reinvoke on props changes.\n//\n//  * On first call, handles mapToProps if returns another function, and treats that\n//    new function as the true mapToProps for subsequent calls.\n//\n//  * On first call, verifies the first result is a plain object, in order to warn\n//    the developer that their mapToProps function is not returning a valid result.\n//\n\nexport function wrapMapToPropsFunc(mapToProps, methodName) {\n  return function initProxySelector(dispatch, _ref) {\n    var displayName = _ref.displayName;\n\n    var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {\n      return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);\n    }; // allow detectFactoryAndVerify to get ownProps\n\n\n    proxy.dependsOnOwnProps = true;\n\n    proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {\n      proxy.mapToProps = mapToProps;\n      proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);\n      var props = proxy(stateOrDispatch, ownProps);\n\n      if (typeof props === 'function') {\n        proxy.mapToProps = props;\n        proxy.dependsOnOwnProps = getDependsOnOwnProps(props);\n        props = proxy(stateOrDispatch, ownProps);\n      }\n\n      if (process.env.NODE_ENV !== 'production') verifyPlainObject(props, displayName, methodName);\n      return props;\n    };\n\n    return proxy;\n  };\n}","import bindActionCreators from '../utils/bindActionCreators';\nimport { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {\n  return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;\n}\nexport function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {\n  return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {\n    return {\n      dispatch: dispatch\n    };\n  }) : undefined;\n}\nexport function whenMapDispatchToPropsIsObject(mapDispatchToProps) {\n  return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {\n    return bindActionCreators(mapDispatchToProps, dispatch);\n  }) : undefined;\n}\nexport default [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject];","export default function bindActionCreators(actionCreators, dispatch) {\n  var boundActionCreators = {};\n\n  var _loop = function _loop(key) {\n    var actionCreator = actionCreators[key];\n\n    if (typeof actionCreator === 'function') {\n      boundActionCreators[key] = function () {\n        return dispatch(actionCreator.apply(void 0, arguments));\n      };\n    }\n  };\n\n  for (var key in actionCreators) {\n    _loop(key);\n  }\n\n  return boundActionCreators;\n}","import { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapStateToPropsIsFunction(mapStateToProps) {\n  return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;\n}\nexport function whenMapStateToPropsIsMissing(mapStateToProps) {\n  return !mapStateToProps ? wrapMapToPropsConstant(function () {\n    return {};\n  }) : undefined;\n}\nexport default [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing];","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport verifyPlainObject from '../utils/verifyPlainObject';\nexport function defaultMergeProps(stateProps, dispatchProps, ownProps) {\n  return _extends({}, ownProps, stateProps, dispatchProps);\n}\nexport function wrapMergePropsFunc(mergeProps) {\n  return function initMergePropsProxy(dispatch, _ref) {\n    var displayName = _ref.displayName,\n        pure = _ref.pure,\n        areMergedPropsEqual = _ref.areMergedPropsEqual;\n    var hasRunOnce = false;\n    var mergedProps;\n    return function mergePropsProxy(stateProps, dispatchProps, ownProps) {\n      var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n\n      if (hasRunOnce) {\n        if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;\n      } else {\n        hasRunOnce = true;\n        mergedProps = nextMergedProps;\n        if (process.env.NODE_ENV !== 'production') verifyPlainObject(mergedProps, displayName, 'mergeProps');\n      }\n\n      return mergedProps;\n    };\n  };\n}\nexport function whenMergePropsIsFunction(mergeProps) {\n  return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;\n}\nexport function whenMergePropsIsOmitted(mergeProps) {\n  return !mergeProps ? function () {\n    return defaultMergeProps;\n  } : undefined;\n}\nexport default [whenMergePropsIsFunction, whenMergePropsIsOmitted];","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"initMapStateToProps\", \"initMapDispatchToProps\", \"initMergeProps\"];\nimport verifySubselectors from './verifySubselectors';\nexport function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {\n  return function impureFinalPropsSelector(state, ownProps) {\n    return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);\n  };\n}\nexport function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {\n  var areStatesEqual = _ref.areStatesEqual,\n      areOwnPropsEqual = _ref.areOwnPropsEqual,\n      areStatePropsEqual = _ref.areStatePropsEqual;\n  var hasRunAtLeastOnce = false;\n  var state;\n  var ownProps;\n  var stateProps;\n  var dispatchProps;\n  var mergedProps;\n\n  function handleFirstCall(firstState, firstOwnProps) {\n    state = firstState;\n    ownProps = firstOwnProps;\n    stateProps = mapStateToProps(state, ownProps);\n    dispatchProps = mapDispatchToProps(dispatch, ownProps);\n    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n    hasRunAtLeastOnce = true;\n    return mergedProps;\n  }\n\n  function handleNewPropsAndNewState() {\n    stateProps = mapStateToProps(state, ownProps);\n    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n    return mergedProps;\n  }\n\n  function handleNewProps() {\n    if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);\n    if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n    mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n    return mergedProps;\n  }\n\n  function handleNewState() {\n    var nextStateProps = mapStateToProps(state, ownProps);\n    var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);\n    stateProps = nextStateProps;\n    if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n    return mergedProps;\n  }\n\n  function handleSubsequentCalls(nextState, nextOwnProps) {\n    var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);\n    var stateChanged = !areStatesEqual(nextState, state);\n    state = nextState;\n    ownProps = nextOwnProps;\n    if (propsChanged && stateChanged) return handleNewPropsAndNewState();\n    if (propsChanged) return handleNewProps();\n    if (stateChanged) return handleNewState();\n    return mergedProps;\n  }\n\n  return function pureFinalPropsSelector(nextState, nextOwnProps) {\n    return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);\n  };\n} // TODO: Add more comments\n// If pure is true, the selector returned by selectorFactory will memoize its results,\n// allowing connectAdvanced's shouldComponentUpdate to return false if final\n// props have not changed. If false, the selector will always return a new\n// object and shouldComponentUpdate will always return true.\n\nexport default function finalPropsSelectorFactory(dispatch, _ref2) {\n  var initMapStateToProps = _ref2.initMapStateToProps,\n      initMapDispatchToProps = _ref2.initMapDispatchToProps,\n      initMergeProps = _ref2.initMergeProps,\n      options = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n  var mapStateToProps = initMapStateToProps(dispatch, options);\n  var mapDispatchToProps = initMapDispatchToProps(dispatch, options);\n  var mergeProps = initMergeProps(dispatch, options);\n\n  if (process.env.NODE_ENV !== 'production') {\n    verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);\n  }\n\n  var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;\n  return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"pure\", \"areStatesEqual\", \"areOwnPropsEqual\", \"areStatePropsEqual\", \"areMergedPropsEqual\"];\nimport connectAdvanced from '../components/connectAdvanced';\nimport shallowEqual from '../utils/shallowEqual';\nimport defaultMapDispatchToPropsFactories from './mapDispatchToProps';\nimport defaultMapStateToPropsFactories from './mapStateToProps';\nimport defaultMergePropsFactories from './mergeProps';\nimport defaultSelectorFactory from './selectorFactory';\n/*\r\n  connect is a facade over connectAdvanced. It turns its args into a compatible\r\n  selectorFactory, which has the signature:\r\n\r\n    (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps\r\n  \r\n  connect passes its args to connectAdvanced as options, which will in turn pass them to\r\n  selectorFactory each time a Connect component instance is instantiated or hot reloaded.\r\n\r\n  selectorFactory returns a final props selector from its mapStateToProps,\r\n  mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,\r\n  mergePropsFactories, and pure args.\r\n\r\n  The resulting final props selector is called by the Connect component instance whenever\r\n  it receives new props or store state.\r\n */\n\nfunction match(arg, factories, name) {\n  for (var i = factories.length - 1; i >= 0; i--) {\n    var result = factories[i](arg);\n    if (result) return result;\n  }\n\n  return function (dispatch, options) {\n    throw new Error(\"Invalid value of type \" + typeof arg + \" for \" + name + \" argument when connecting component \" + options.wrappedComponentName + \".\");\n  };\n}\n\nfunction strictEqual(a, b) {\n  return a === b;\n} // createConnect with default args builds the 'official' connect behavior. Calling it with\n// different options opens up some testing and extensibility scenarios\n\n\nexport function createConnect(_temp) {\n  var _ref = _temp === void 0 ? {} : _temp,\n      _ref$connectHOC = _ref.connectHOC,\n      connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,\n      _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,\n      mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? defaultMapStateToPropsFactories : _ref$mapStateToPropsF,\n      _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,\n      mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? defaultMapDispatchToPropsFactories : _ref$mapDispatchToPro,\n      _ref$mergePropsFactor = _ref.mergePropsFactories,\n      mergePropsFactories = _ref$mergePropsFactor === void 0 ? defaultMergePropsFactories : _ref$mergePropsFactor,\n      _ref$selectorFactory = _ref.selectorFactory,\n      selectorFactory = _ref$selectorFactory === void 0 ? defaultSelectorFactory : _ref$selectorFactory;\n\n  return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {\n    if (_ref2 === void 0) {\n      _ref2 = {};\n    }\n\n    var _ref3 = _ref2,\n        _ref3$pure = _ref3.pure,\n        pure = _ref3$pure === void 0 ? true : _ref3$pure,\n        _ref3$areStatesEqual = _ref3.areStatesEqual,\n        areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,\n        _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,\n        areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,\n        _ref3$areStatePropsEq = _ref3.areStatePropsEqual,\n        areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,\n        _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,\n        areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,\n        extraOptions = _objectWithoutPropertiesLoose(_ref3, _excluded);\n\n    var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');\n    var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');\n    var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');\n    return connectHOC(selectorFactory, _extends({\n      // used in error messages\n      methodName: 'connect',\n      // used to compute Connect's displayName from the wrapped component's displayName.\n      getDisplayName: function getDisplayName(name) {\n        return \"Connect(\" + name + \")\";\n      },\n      // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes\n      shouldHandleStateChanges: Boolean(mapStateToProps),\n      // passed through to selectorFactory\n      initMapStateToProps: initMapStateToProps,\n      initMapDispatchToProps: initMapDispatchToProps,\n      initMergeProps: initMergeProps,\n      pure: pure,\n      areStatesEqual: areStatesEqual,\n      areOwnPropsEqual: areOwnPropsEqual,\n      areStatePropsEqual: areStatePropsEqual,\n      areMergedPropsEqual: areMergedPropsEqual\n    }, extraOptions));\n  };\n}\nexport default /*#__PURE__*/createConnect();","import { useContext } from 'react';\nimport { ReactReduxContext } from '../components/Context';\n/**\r\n * A hook to access the value of the `ReactReduxContext`. This is a low-level\r\n * hook that you should usually not need to call directly.\r\n *\r\n * @returns {any} the value of the `ReactReduxContext`\r\n *\r\n * @example\r\n *\r\n * import React from 'react'\r\n * import { useReduxContext } from 'react-redux'\r\n *\r\n * export const CounterComponent = ({ value }) => {\r\n *   const { store } = useReduxContext()\r\n *   return <div>{store.getState()}</div>\r\n * }\r\n */\n\nexport function useReduxContext() {\n  var contextValue = useContext(ReactReduxContext);\n\n  if (process.env.NODE_ENV !== 'production' && !contextValue) {\n    throw new Error('could not find react-redux context value; please ensure the component is wrapped in a <Provider>');\n  }\n\n  return contextValue;\n}","import { useContext } from 'react';\nimport { ReactReduxContext } from '../components/Context';\nimport { useReduxContext as useDefaultReduxContext } from './useReduxContext';\n/**\r\n * Hook factory, which creates a `useStore` hook bound to a given context.\r\n *\r\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\r\n * @returns {Function} A `useStore` hook bound to the specified context.\r\n */\n\nexport function createStoreHook(context) {\n  if (context === void 0) {\n    context = ReactReduxContext;\n  }\n\n  var useReduxContext = context === ReactReduxContext ? useDefaultReduxContext : function () {\n    return useContext(context);\n  };\n  return function useStore() {\n    var _useReduxContext = useReduxContext(),\n        store = _useReduxContext.store;\n\n    return store;\n  };\n}\n/**\r\n * A hook to access the redux store.\r\n *\r\n * @returns {any} the redux store\r\n *\r\n * @example\r\n *\r\n * import React from 'react'\r\n * import { useStore } from 'react-redux'\r\n *\r\n * export const ExampleComponent = () => {\r\n *   const store = useStore()\r\n *   return <div>{store.getState()}</div>\r\n * }\r\n */\n\nexport var useStore = /*#__PURE__*/createStoreHook();","import { ReactReduxContext } from '../components/Context';\nimport { useStore as useDefaultStore, createStoreHook } from './useStore';\n/**\r\n * Hook factory, which creates a `useDispatch` hook bound to a given context.\r\n *\r\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\r\n * @returns {Function} A `useDispatch` hook bound to the specified context.\r\n */\n\nexport function createDispatchHook(context) {\n  if (context === void 0) {\n    context = ReactReduxContext;\n  }\n\n  var useStore = context === ReactReduxContext ? useDefaultStore : createStoreHook(context);\n  return function useDispatch() {\n    var store = useStore();\n    return store.dispatch;\n  };\n}\n/**\r\n * A hook to access the redux `dispatch` function.\r\n *\r\n * @returns {any|function} redux store's `dispatch` function\r\n *\r\n * @example\r\n *\r\n * import React, { useCallback } from 'react'\r\n * import { useDispatch } from 'react-redux'\r\n *\r\n * export const CounterComponent = ({ value }) => {\r\n *   const dispatch = useDispatch()\r\n *   const increaseCounter = useCallback(() => dispatch({ type: 'increase-counter' }), [])\r\n *   return (\r\n *     <div>\r\n *       <span>{value}</span>\r\n *       <button onClick={increaseCounter}>Increase counter</button>\r\n *     </div>\r\n *   )\r\n * }\r\n */\n\nexport var useDispatch = /*#__PURE__*/createDispatchHook();","import { useReducer, useRef, useMemo, useContext, useDebugValue } from 'react';\nimport { useReduxContext as useDefaultReduxContext } from './useReduxContext';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\nimport { ReactReduxContext } from '../components/Context';\n\nvar refEquality = function refEquality(a, b) {\n  return a === b;\n};\n\nfunction useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub) {\n  var _useReducer = useReducer(function (s) {\n    return s + 1;\n  }, 0),\n      forceRender = _useReducer[1];\n\n  var subscription = useMemo(function () {\n    return createSubscription(store, contextSub);\n  }, [store, contextSub]);\n  var latestSubscriptionCallbackError = useRef();\n  var latestSelector = useRef();\n  var latestStoreState = useRef();\n  var latestSelectedState = useRef();\n  var storeState = store.getState();\n  var selectedState;\n\n  try {\n    if (selector !== latestSelector.current || storeState !== latestStoreState.current || latestSubscriptionCallbackError.current) {\n      var newSelectedState = selector(storeState); // ensure latest selected state is reused so that a custom equality function can result in identical references\n\n      if (latestSelectedState.current === undefined || !equalityFn(newSelectedState, latestSelectedState.current)) {\n        selectedState = newSelectedState;\n      } else {\n        selectedState = latestSelectedState.current;\n      }\n    } else {\n      selectedState = latestSelectedState.current;\n    }\n  } catch (err) {\n    if (latestSubscriptionCallbackError.current) {\n      err.message += \"\\nThe error may be correlated with this previous error:\\n\" + latestSubscriptionCallbackError.current.stack + \"\\n\\n\";\n    }\n\n    throw err;\n  }\n\n  useIsomorphicLayoutEffect(function () {\n    latestSelector.current = selector;\n    latestStoreState.current = storeState;\n    latestSelectedState.current = selectedState;\n    latestSubscriptionCallbackError.current = undefined;\n  });\n  useIsomorphicLayoutEffect(function () {\n    function checkForUpdates() {\n      try {\n        var newStoreState = store.getState(); // Avoid calling selector multiple times if the store's state has not changed\n\n        if (newStoreState === latestStoreState.current) {\n          return;\n        }\n\n        var _newSelectedState = latestSelector.current(newStoreState);\n\n        if (equalityFn(_newSelectedState, latestSelectedState.current)) {\n          return;\n        }\n\n        latestSelectedState.current = _newSelectedState;\n        latestStoreState.current = newStoreState;\n      } catch (err) {\n        // we ignore all errors here, since when the component\n        // is re-rendered, the selectors are called again, and\n        // will throw again, if neither props nor store state\n        // changed\n        latestSubscriptionCallbackError.current = err;\n      }\n\n      forceRender();\n    }\n\n    subscription.onStateChange = checkForUpdates;\n    subscription.trySubscribe();\n    checkForUpdates();\n    return function () {\n      return subscription.tryUnsubscribe();\n    };\n  }, [store, subscription]);\n  return selectedState;\n}\n/**\r\n * Hook factory, which creates a `useSelector` hook bound to a given context.\r\n *\r\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\r\n * @returns {Function} A `useSelector` hook bound to the specified context.\r\n */\n\n\nexport function createSelectorHook(context) {\n  if (context === void 0) {\n    context = ReactReduxContext;\n  }\n\n  var useReduxContext = context === ReactReduxContext ? useDefaultReduxContext : function () {\n    return useContext(context);\n  };\n  return function useSelector(selector, equalityFn) {\n    if (equalityFn === void 0) {\n      equalityFn = refEquality;\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (!selector) {\n        throw new Error(\"You must pass a selector to useSelector\");\n      }\n\n      if (typeof selector !== 'function') {\n        throw new Error(\"You must pass a function as a selector to useSelector\");\n      }\n\n      if (typeof equalityFn !== 'function') {\n        throw new Error(\"You must pass a function as an equality function to useSelector\");\n      }\n    }\n\n    var _useReduxContext = useReduxContext(),\n        store = _useReduxContext.store,\n        contextSub = _useReduxContext.subscription;\n\n    var selectedState = useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub);\n    useDebugValue(selectedState);\n    return selectedState;\n  };\n}\n/**\r\n * A hook to access the redux store's state. This hook takes a selector function\r\n * as an argument. The selector is called with the store state.\r\n *\r\n * This hook takes an optional equality comparison function as the second parameter\r\n * that allows you to customize the way the selected state is compared to determine\r\n * whether the component needs to be re-rendered.\r\n *\r\n * @param {Function} selector the selector function\r\n * @param {Function=} equalityFn the function that will be used to determine equality\r\n *\r\n * @returns {any} the selected state\r\n *\r\n * @example\r\n *\r\n * import React from 'react'\r\n * import { useSelector } from 'react-redux'\r\n *\r\n * export const CounterComponent = () => {\r\n *   const counter = useSelector(state => state.counter)\r\n *   return <div>{counter}</div>\r\n * }\r\n */\n\nexport var useSelector = /*#__PURE__*/createSelectorHook();","export * from './exports';\nimport { unstable_batchedUpdates as batch } from './utils/reactBatchedUpdates';\nimport { setBatch } from './utils/batch'; // Enable batched updates in our subscriptions for use\n// with standard React renderers (ReactDOM, React Native)\n\nsetBatch(batch);\nexport { batch };","/** @license React v17.0.2\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x(\"react.element\");c=x(\"react.portal\");d=x(\"react.fragment\");e=x(\"react.strict_mode\");f=x(\"react.profiler\");g=x(\"react.provider\");h=x(\"react.context\");k=x(\"react.forward_ref\");l=x(\"react.suspense\");m=x(\"react.suspense_list\");n=x(\"react.memo\");p=x(\"react.lazy\");q=x(\"react.block\");r=x(\"react.server.block\");u=x(\"react.fundamental\");v=x(\"react.debug_trace_mode\");w=x(\"react.legacy_hidden\")}\nfunction y(a){if(\"object\"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;exports.ContextConsumer=h;exports.ContextProvider=z;exports.Element=A;exports.ForwardRef=B;exports.Fragment=C;exports.Lazy=D;exports.Memo=E;exports.Portal=F;exports.Profiler=G;exports.StrictMode=H;\nexports.Suspense=I;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return y(a)===h};exports.isContextProvider=function(a){return y(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return y(a)===k};exports.isFragment=function(a){return y(a)===d};exports.isLazy=function(a){return y(a)===p};exports.isMemo=function(a){return y(a)===n};\nexports.isPortal=function(a){return y(a)===c};exports.isProfiler=function(a){return y(a)===f};exports.isStrictMode=function(a){return y(a)===e};exports.isSuspense=function(a){return y(a)===l};exports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||\"object\"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};\nexports.typeOf=y;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-is.production.min.js');\n} else {\n  module.exports = require('./cjs/react-is.development.js');\n}\n","export default function _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n  return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  setPrototypeOf(subClass, superClass);\n}","export default function _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}","import { Router, __RouterContext, matchPath } from 'react-router';\nexport { MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter } from 'react-router';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport React from 'react';\nimport { createBrowserHistory, createHashHistory, createLocation, createPath } from 'history';\nimport PropTypes from 'prop-types';\nimport warning from 'tiny-warning';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport _objectWithoutPropertiesLoose from '@babel/runtime/helpers/esm/objectWithoutPropertiesLoose';\nimport invariant from 'tiny-invariant';\n\n/**\n * The public API for a <Router> that uses HTML5 history.\n */\n\nvar BrowserRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(BrowserRouter, _React$Component);\n\n  function BrowserRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = createBrowserHistory(_this.props);\n    return _this;\n  }\n\n  var _proto = BrowserRouter.prototype;\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return BrowserRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  BrowserRouter.propTypes = {\n    basename: PropTypes.string,\n    children: PropTypes.node,\n    forceRefresh: PropTypes.bool,\n    getUserConfirmation: PropTypes.func,\n    keyLength: PropTypes.number\n  };\n\n  BrowserRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<BrowserRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { BrowserRouter as Router }`.\") : void 0;\n  };\n}\n\n/**\n * The public API for a <Router> that uses window.location.hash.\n */\n\nvar HashRouter = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(HashRouter, _React$Component);\n\n  function HashRouter() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.history = createHashHistory(_this.props);\n    return _this;\n  }\n\n  var _proto = HashRouter.prototype;\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(Router, {\n      history: this.history,\n      children: this.props.children\n    });\n  };\n\n  return HashRouter;\n}(React.Component);\n\nif (process.env.NODE_ENV !== \"production\") {\n  HashRouter.propTypes = {\n    basename: PropTypes.string,\n    children: PropTypes.node,\n    getUserConfirmation: PropTypes.func,\n    hashType: PropTypes.oneOf([\"hashbang\", \"noslash\", \"slash\"])\n  };\n\n  HashRouter.prototype.componentDidMount = function () {\n    process.env.NODE_ENV !== \"production\" ? warning(!this.props.history, \"<HashRouter> ignores the history prop. To use a custom history, \" + \"use `import { Router }` instead of `import { HashRouter as Router }`.\") : void 0;\n  };\n}\n\nvar resolveToLocation = function resolveToLocation(to, currentLocation) {\n  return typeof to === \"function\" ? to(currentLocation) : to;\n};\nvar normalizeToLocation = function normalizeToLocation(to, currentLocation) {\n  return typeof to === \"string\" ? createLocation(to, null, null, currentLocation) : to;\n};\n\nvar forwardRefShim = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = forwardRefShim;\n}\n\nfunction isModifiedEvent(event) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nvar LinkAnchor = forwardRef(function (_ref, forwardedRef) {\n  var innerRef = _ref.innerRef,\n      navigate = _ref.navigate,\n      _onClick = _ref.onClick,\n      rest = _objectWithoutPropertiesLoose(_ref, [\"innerRef\", \"navigate\", \"onClick\"]);\n\n  var target = rest.target;\n\n  var props = _extends({}, rest, {\n    onClick: function onClick(event) {\n      try {\n        if (_onClick) _onClick(event);\n      } catch (ex) {\n        event.preventDefault();\n        throw ex;\n      }\n\n      if (!event.defaultPrevented && // onClick prevented default\n      event.button === 0 && ( // ignore everything but left clicks\n      !target || target === \"_self\") && // let browser handle \"target=_blank\" etc.\n      !isModifiedEvent(event) // ignore clicks with modifier keys\n      ) {\n          event.preventDefault();\n          navigate();\n        }\n    }\n  }); // React 15 compat\n\n\n  if (forwardRefShim !== forwardRef) {\n    props.ref = forwardedRef || innerRef;\n  } else {\n    props.ref = innerRef;\n  }\n  /* eslint-disable-next-line jsx-a11y/anchor-has-content */\n\n\n  return /*#__PURE__*/React.createElement(\"a\", props);\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  LinkAnchor.displayName = \"LinkAnchor\";\n}\n/**\n * The public API for rendering a history-aware <a>.\n */\n\n\nvar Link = forwardRef(function (_ref2, forwardedRef) {\n  var _ref2$component = _ref2.component,\n      component = _ref2$component === void 0 ? LinkAnchor : _ref2$component,\n      replace = _ref2.replace,\n      to = _ref2.to,\n      innerRef = _ref2.innerRef,\n      rest = _objectWithoutPropertiesLoose(_ref2, [\"component\", \"replace\", \"to\", \"innerRef\"]);\n\n  return /*#__PURE__*/React.createElement(__RouterContext.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <Link> outside a <Router>\") : invariant(false) : void 0;\n    var history = context.history;\n    var location = normalizeToLocation(resolveToLocation(to, context.location), context.location);\n    var href = location ? history.createHref(location) : \"\";\n\n    var props = _extends({}, rest, {\n      href: href,\n      navigate: function navigate() {\n        var location = resolveToLocation(to, context.location);\n        var isDuplicateNavigation = createPath(context.location) === createPath(normalizeToLocation(location));\n        var method = replace || isDuplicateNavigation ? history.replace : history.push;\n        method(location);\n      }\n    }); // React 15 compat\n\n\n    if (forwardRefShim !== forwardRef) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return /*#__PURE__*/React.createElement(component, props);\n  });\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  var toType = PropTypes.oneOfType([PropTypes.string, PropTypes.object, PropTypes.func]);\n  var refType = PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.shape({\n    current: PropTypes.any\n  })]);\n  Link.displayName = \"Link\";\n  Link.propTypes = {\n    innerRef: refType,\n    onClick: PropTypes.func,\n    replace: PropTypes.bool,\n    target: PropTypes.string,\n    to: toType.isRequired\n  };\n}\n\nvar forwardRefShim$1 = function forwardRefShim(C) {\n  return C;\n};\n\nvar forwardRef$1 = React.forwardRef;\n\nif (typeof forwardRef$1 === \"undefined\") {\n  forwardRef$1 = forwardRefShim$1;\n}\n\nfunction joinClassnames() {\n  for (var _len = arguments.length, classnames = new Array(_len), _key = 0; _key < _len; _key++) {\n    classnames[_key] = arguments[_key];\n  }\n\n  return classnames.filter(function (i) {\n    return i;\n  }).join(\" \");\n}\n/**\n * A <Link> wrapper that knows if it's \"active\" or not.\n */\n\n\nvar NavLink = forwardRef$1(function (_ref, forwardedRef) {\n  var _ref$ariaCurrent = _ref[\"aria-current\"],\n      ariaCurrent = _ref$ariaCurrent === void 0 ? \"page\" : _ref$ariaCurrent,\n      _ref$activeClassName = _ref.activeClassName,\n      activeClassName = _ref$activeClassName === void 0 ? \"active\" : _ref$activeClassName,\n      activeStyle = _ref.activeStyle,\n      classNameProp = _ref.className,\n      exact = _ref.exact,\n      isActiveProp = _ref.isActive,\n      locationProp = _ref.location,\n      sensitive = _ref.sensitive,\n      strict = _ref.strict,\n      styleProp = _ref.style,\n      to = _ref.to,\n      innerRef = _ref.innerRef,\n      rest = _objectWithoutPropertiesLoose(_ref, [\"aria-current\", \"activeClassName\", \"activeStyle\", \"className\", \"exact\", \"isActive\", \"location\", \"sensitive\", \"strict\", \"style\", \"to\", \"innerRef\"]);\n\n  return /*#__PURE__*/React.createElement(__RouterContext.Consumer, null, function (context) {\n    !context ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"You should not use <NavLink> outside a <Router>\") : invariant(false) : void 0;\n    var currentLocation = locationProp || context.location;\n    var toLocation = normalizeToLocation(resolveToLocation(to, currentLocation), currentLocation);\n    var path = toLocation.pathname; // Regex taken from: https://github.com/pillarjs/path-to-regexp/blob/master/index.js#L202\n\n    var escapedPath = path && path.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n    var match = escapedPath ? matchPath(currentLocation.pathname, {\n      path: escapedPath,\n      exact: exact,\n      sensitive: sensitive,\n      strict: strict\n    }) : null;\n    var isActive = !!(isActiveProp ? isActiveProp(match, currentLocation) : match);\n    var className = typeof classNameProp === \"function\" ? classNameProp(isActive) : classNameProp;\n    var style = typeof styleProp === \"function\" ? styleProp(isActive) : styleProp;\n\n    if (isActive) {\n      className = joinClassnames(className, activeClassName);\n      style = _extends({}, style, activeStyle);\n    }\n\n    var props = _extends({\n      \"aria-current\": isActive && ariaCurrent || null,\n      className: className,\n      style: style,\n      to: toLocation\n    }, rest); // React 15 compat\n\n\n    if (forwardRefShim$1 !== forwardRef$1) {\n      props.ref = forwardedRef || innerRef;\n    } else {\n      props.innerRef = innerRef;\n    }\n\n    return /*#__PURE__*/React.createElement(Link, props);\n  });\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n  NavLink.displayName = \"NavLink\";\n  var ariaCurrentType = PropTypes.oneOf([\"page\", \"step\", \"location\", \"date\", \"time\", \"true\", \"false\"]);\n  NavLink.propTypes = _extends({}, Link.propTypes, {\n    \"aria-current\": ariaCurrentType,\n    activeClassName: PropTypes.string,\n    activeStyle: PropTypes.object,\n    className: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n    exact: PropTypes.bool,\n    isActive: PropTypes.func,\n    location: PropTypes.object,\n    sensitive: PropTypes.bool,\n    strict: PropTypes.bool,\n    style: PropTypes.oneOfType([PropTypes.object, PropTypes.func])\n  });\n}\n\nexport { BrowserRouter, HashRouter, Link, NavLink };\n//# sourceMappingURL=react-router-dom.js.map\n","import { J as cleanValue, E as valueTernary, a as _objectSpread2 } from './index-a7690a33.esm.js';\nimport _toConsumableArray from '@babel/runtime/helpers/esm/toConsumableArray';\nimport _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';\nimport { useMemo, useCallback } from 'react';\nimport { g as getOptionValue, a as getOptionLabel } from './Select-54ac8379.esm.js';\n\nvar _excluded = [\"allowCreateWhileLoading\", \"createOptionPosition\", \"formatCreateLabel\", \"isValidNewOption\", \"getNewOptionData\", \"onCreateOption\", \"options\", \"onChange\"];\n\nvar compareOption = function compareOption() {\n  var inputValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n  var option = arguments.length > 1 ? arguments[1] : undefined;\n  var accessors = arguments.length > 2 ? arguments[2] : undefined;\n  var candidate = String(inputValue).toLowerCase();\n  var optionValue = String(accessors.getOptionValue(option)).toLowerCase();\n  var optionLabel = String(accessors.getOptionLabel(option)).toLowerCase();\n  return optionValue === candidate || optionLabel === candidate;\n};\n\nvar builtins = {\n  formatCreateLabel: function formatCreateLabel(inputValue) {\n    return \"Create \\\"\".concat(inputValue, \"\\\"\");\n  },\n  isValidNewOption: function isValidNewOption(inputValue, selectValue, selectOptions, accessors) {\n    return !(!inputValue || selectValue.some(function (option) {\n      return compareOption(inputValue, option, accessors);\n    }) || selectOptions.some(function (option) {\n      return compareOption(inputValue, option, accessors);\n    }));\n  },\n  getNewOptionData: function getNewOptionData(inputValue, optionLabel) {\n    return {\n      label: optionLabel,\n      value: inputValue,\n      __isNew__: true\n    };\n  }\n};\nfunction useCreatable(_ref) {\n  var _ref$allowCreateWhile = _ref.allowCreateWhileLoading,\n      allowCreateWhileLoading = _ref$allowCreateWhile === void 0 ? false : _ref$allowCreateWhile,\n      _ref$createOptionPosi = _ref.createOptionPosition,\n      createOptionPosition = _ref$createOptionPosi === void 0 ? 'last' : _ref$createOptionPosi,\n      _ref$formatCreateLabe = _ref.formatCreateLabel,\n      formatCreateLabel = _ref$formatCreateLabe === void 0 ? builtins.formatCreateLabel : _ref$formatCreateLabe,\n      _ref$isValidNewOption = _ref.isValidNewOption,\n      isValidNewOption = _ref$isValidNewOption === void 0 ? builtins.isValidNewOption : _ref$isValidNewOption,\n      _ref$getNewOptionData = _ref.getNewOptionData,\n      getNewOptionData = _ref$getNewOptionData === void 0 ? builtins.getNewOptionData : _ref$getNewOptionData,\n      onCreateOption = _ref.onCreateOption,\n      _ref$options = _ref.options,\n      propsOptions = _ref$options === void 0 ? [] : _ref$options,\n      propsOnChange = _ref.onChange,\n      restSelectProps = _objectWithoutProperties(_ref, _excluded);\n\n  var _restSelectProps$getO = restSelectProps.getOptionValue,\n      getOptionValue$1 = _restSelectProps$getO === void 0 ? getOptionValue : _restSelectProps$getO,\n      _restSelectProps$getO2 = restSelectProps.getOptionLabel,\n      getOptionLabel$1 = _restSelectProps$getO2 === void 0 ? getOptionLabel : _restSelectProps$getO2,\n      inputValue = restSelectProps.inputValue,\n      isLoading = restSelectProps.isLoading,\n      isMulti = restSelectProps.isMulti,\n      value = restSelectProps.value,\n      name = restSelectProps.name;\n  var newOption = useMemo(function () {\n    return isValidNewOption(inputValue, cleanValue(value), propsOptions, {\n      getOptionValue: getOptionValue$1,\n      getOptionLabel: getOptionLabel$1\n    }) ? getNewOptionData(inputValue, formatCreateLabel(inputValue)) : undefined;\n  }, [formatCreateLabel, getNewOptionData, getOptionLabel$1, getOptionValue$1, inputValue, isValidNewOption, propsOptions, value]);\n  var options = useMemo(function () {\n    return (allowCreateWhileLoading || !isLoading) && newOption ? createOptionPosition === 'first' ? [newOption].concat(_toConsumableArray(propsOptions)) : [].concat(_toConsumableArray(propsOptions), [newOption]) : propsOptions;\n  }, [allowCreateWhileLoading, createOptionPosition, isLoading, newOption, propsOptions]);\n  var onChange = useCallback(function (newValue, actionMeta) {\n    if (actionMeta.action !== 'select-option') {\n      return propsOnChange(newValue, actionMeta);\n    }\n\n    var valueArray = Array.isArray(newValue) ? newValue : [newValue];\n\n    if (valueArray[valueArray.length - 1] === newOption) {\n      if (onCreateOption) onCreateOption(inputValue);else {\n        var newOptionData = getNewOptionData(inputValue, inputValue);\n        var newActionMeta = {\n          action: 'create-option',\n          name: name,\n          option: newOptionData\n        };\n        propsOnChange(valueTernary(isMulti, [].concat(_toConsumableArray(cleanValue(value)), [newOptionData]), newOptionData), newActionMeta);\n      }\n      return;\n    }\n\n    propsOnChange(newValue, actionMeta);\n  }, [getNewOptionData, inputValue, isMulti, name, newOption, onCreateOption, propsOnChange, value]);\n  return _objectSpread2(_objectSpread2({}, restSelectProps), {}, {\n    options: options,\n    onChange: onChange\n  });\n}\n\nexport { useCreatable as u };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport * as React from 'react';\nimport { forwardRef } from 'react';\nimport { S as Select } from '../../dist/Select-54ac8379.esm.js';\nimport { u as useStateManager } from '../../dist/useStateManager-68425271.esm.js';\nimport { u as useCreatable } from '../../dist/useCreatable-8a6670a3.esm.js';\nexport { u as useCreatable } from '../../dist/useCreatable-8a6670a3.esm.js';\nimport '../../dist/index-a7690a33.esm.js';\nimport '@emotion/react';\nimport '@babel/runtime/helpers/taggedTemplateLiteral';\nimport '@babel/runtime/helpers/objectWithoutProperties';\nimport '@babel/runtime/helpers/slicedToArray';\nimport '@babel/runtime/helpers/typeof';\nimport '@babel/runtime/helpers/classCallCheck';\nimport '@babel/runtime/helpers/createClass';\nimport '@babel/runtime/helpers/inherits';\nimport '@babel/runtime/helpers/defineProperty';\nimport 'react-dom';\nimport '@babel/runtime/helpers/toConsumableArray';\nimport 'memoize-one';\n\nvar CreatableSelect = /*#__PURE__*/forwardRef(function (props, ref) {\n  var creatableProps = useStateManager(props);\n  var selectProps = useCreatable(creatableProps);\n  return /*#__PURE__*/React.createElement(Select, _extends({\n    ref: ref\n  }, selectProps));\n});\n\nexport default CreatableSelect;\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport { a as _objectSpread2, r as removeProps, s as supportsPassiveEvents, b as clearIndicatorCSS, d as containerCSS, e as css$1, f as dropdownIndicatorCSS, g as groupCSS, h as groupHeadingCSS, i as indicatorsContainerCSS, j as indicatorSeparatorCSS, k as inputCSS, l as loadingIndicatorCSS, m as loadingMessageCSS, n as menuCSS, o as menuListCSS, p as menuPortalCSS, q as multiValueCSS, t as multiValueLabelCSS, u as multiValueRemoveCSS, v as noOptionsMessageCSS, w as optionCSS, x as placeholderCSS, y as css$2, z as valueContainerCSS, A as isTouchCapable, B as isMobileDevice, _ as _createSuper, C as multiValueAsValue, D as singleValueAsValue, E as valueTernary, F as classNames, G as defaultComponents, H as notNullish, I as isDocumentElement, J as cleanValue, K as scrollIntoView, L as noop, M as MenuPlacer } from './index-a7690a33.esm.js';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport _toConsumableArray from '@babel/runtime/helpers/esm/toConsumableArray';\nimport * as React from 'react';\nimport { useMemo, Fragment, useRef, useCallback, useEffect, Component } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport memoizeOne from 'memoize-one';\nimport _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';\n\nfunction _EMOTION_STRINGIFIED_CSS_ERROR__$1() { return \"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop).\"; }\n\nvar _ref = process.env.NODE_ENV === \"production\" ? {\n  name: \"7pg0cj-a11yText\",\n  styles: \"label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap\"\n} : {\n  name: \"1f43avz-a11yText-A11yText\",\n  styles: \"label:a11yText;z-index:9999;border:0;clip:rect(1px, 1px, 1px, 1px);height:1px;width:1px;position:absolute;overflow:hidden;padding:0;white-space:nowrap;label:A11yText;\",\n  map: \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkExMXlUZXh0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNSSIsImZpbGUiOiJBMTF5VGV4dC50c3giLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGpzeCBqc3ggKi9cbmltcG9ydCB7IGpzeCB9IGZyb20gJ0BlbW90aW9uL3JlYWN0JztcblxuLy8gQXNzaXN0aXZlIHRleHQgdG8gZGVzY3JpYmUgdmlzdWFsIGVsZW1lbnRzLiBIaWRkZW4gZm9yIHNpZ2h0ZWQgdXNlcnMuXG5jb25zdCBBMTF5VGV4dCA9IChwcm9wczogSlNYLkludHJpbnNpY0VsZW1lbnRzWydzcGFuJ10pID0+IChcbiAgPHNwYW5cbiAgICBjc3M9e3tcbiAgICAgIGxhYmVsOiAnYTExeVRleHQnLFxuICAgICAgekluZGV4OiA5OTk5LFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgY2xpcDogJ3JlY3QoMXB4LCAxcHgsIDFweCwgMXB4KScsXG4gICAgICBoZWlnaHQ6IDEsXG4gICAgICB3aWR0aDogMSxcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgIH19XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcblxuZXhwb3J0IGRlZmF1bHQgQTExeVRleHQ7XG4iXX0= */\",\n  toString: _EMOTION_STRINGIFIED_CSS_ERROR__$1\n};\n\nvar A11yText = function A11yText(props) {\n  return jsx(\"span\", _extends({\n    css: _ref\n  }, props));\n};\n\nvar defaultAriaLiveMessages = {\n  guidance: function guidance(props) {\n    var isSearchable = props.isSearchable,\n        isMulti = props.isMulti,\n        isDisabled = props.isDisabled,\n        tabSelectsValue = props.tabSelectsValue,\n        context = props.context;\n\n    switch (context) {\n      case 'menu':\n        return \"Use Up and Down to choose options\".concat(isDisabled ? '' : ', press Enter to select the currently focused option', \", press Escape to exit the menu\").concat(tabSelectsValue ? ', press Tab to select the option and exit the menu' : '', \".\");\n\n      case 'input':\n        return \"\".concat(props['aria-label'] || 'Select', \" is focused \").concat(isSearchable ? ',type to refine list' : '', \", press Down to open the menu, \").concat(isMulti ? ' press left to focus selected values' : '');\n\n      case 'value':\n        return 'Use left and right to toggle between focused values, press Backspace to remove the currently focused value';\n\n      default:\n        return '';\n    }\n  },\n  onChange: function onChange(props) {\n    var action = props.action,\n        _props$label = props.label,\n        label = _props$label === void 0 ? '' : _props$label,\n        labels = props.labels,\n        isDisabled = props.isDisabled;\n\n    switch (action) {\n      case 'deselect-option':\n      case 'pop-value':\n      case 'remove-value':\n        return \"option \".concat(label, \", deselected.\");\n\n      case 'clear':\n        return 'All selected options have been cleared.';\n\n      case 'initial-input-focus':\n        return \"option\".concat(labels.length > 1 ? 's' : '', \" \").concat(labels.join(','), \", selected.\");\n\n      case 'select-option':\n        return isDisabled ? \"option \".concat(label, \" is disabled. Select another option.\") : \"option \".concat(label, \", selected.\");\n\n      default:\n        return '';\n    }\n  },\n  onFocus: function onFocus(props) {\n    var context = props.context,\n        focused = props.focused,\n        options = props.options,\n        _props$label2 = props.label,\n        label = _props$label2 === void 0 ? '' : _props$label2,\n        selectValue = props.selectValue,\n        isDisabled = props.isDisabled,\n        isSelected = props.isSelected;\n\n    var getArrayIndex = function getArrayIndex(arr, item) {\n      return arr && arr.length ? \"\".concat(arr.indexOf(item) + 1, \" of \").concat(arr.length) : '';\n    };\n\n    if (context === 'value' && selectValue) {\n      return \"value \".concat(label, \" focused, \").concat(getArrayIndex(selectValue, focused), \".\");\n    }\n\n    if (context === 'menu') {\n      var disabled = isDisabled ? ' disabled' : '';\n      var status = \"\".concat(isSelected ? 'selected' : 'focused').concat(disabled);\n      return \"option \".concat(label, \" \").concat(status, \", \").concat(getArrayIndex(options, focused), \".\");\n    }\n\n    return '';\n  },\n  onFilter: function onFilter(props) {\n    var inputValue = props.inputValue,\n        resultsMessage = props.resultsMessage;\n    return \"\".concat(resultsMessage).concat(inputValue ? ' for search term ' + inputValue : '', \".\");\n  }\n};\n\nvar LiveRegion = function LiveRegion(props) {\n  var ariaSelection = props.ariaSelection,\n      focusedOption = props.focusedOption,\n      focusedValue = props.focusedValue,\n      focusableOptions = props.focusableOptions,\n      isFocused = props.isFocused,\n      selectValue = props.selectValue,\n      selectProps = props.selectProps,\n      id = props.id;\n  var ariaLiveMessages = selectProps.ariaLiveMessages,\n      getOptionLabel = selectProps.getOptionLabel,\n      inputValue = selectProps.inputValue,\n      isMulti = selectProps.isMulti,\n      isOptionDisabled = selectProps.isOptionDisabled,\n      isSearchable = selectProps.isSearchable,\n      menuIsOpen = selectProps.menuIsOpen,\n      options = selectProps.options,\n      screenReaderStatus = selectProps.screenReaderStatus,\n      tabSelectsValue = selectProps.tabSelectsValue;\n  var ariaLabel = selectProps['aria-label'];\n  var ariaLive = selectProps['aria-live']; // Update aria live message configuration when prop changes\n\n  var messages = useMemo(function () {\n    return _objectSpread2(_objectSpread2({}, defaultAriaLiveMessages), ariaLiveMessages || {});\n  }, [ariaLiveMessages]); // Update aria live selected option when prop changes\n\n  var ariaSelected = useMemo(function () {\n    var message = '';\n\n    if (ariaSelection && messages.onChange) {\n      var option = ariaSelection.option,\n          selectedOptions = ariaSelection.options,\n          removedValue = ariaSelection.removedValue,\n          removedValues = ariaSelection.removedValues,\n          value = ariaSelection.value; // select-option when !isMulti does not return option so we assume selected option is value\n\n      var asOption = function asOption(val) {\n        return !Array.isArray(val) ? val : null;\n      }; // If there is just one item from the action then get its label\n\n\n      var selected = removedValue || option || asOption(value);\n      var label = selected ? getOptionLabel(selected) : ''; // If there are multiple items from the action then return an array of labels\n\n      var multiSelected = selectedOptions || removedValues || undefined;\n      var labels = multiSelected ? multiSelected.map(getOptionLabel) : [];\n\n      var onChangeProps = _objectSpread2({\n        // multiSelected items are usually items that have already been selected\n        // or set by the user as a default value so we assume they are not disabled\n        isDisabled: selected && isOptionDisabled(selected, selectValue),\n        label: label,\n        labels: labels\n      }, ariaSelection);\n\n      message = messages.onChange(onChangeProps);\n    }\n\n    return message;\n  }, [ariaSelection, messages, isOptionDisabled, selectValue, getOptionLabel]);\n  var ariaFocused = useMemo(function () {\n    var focusMsg = '';\n    var focused = focusedOption || focusedValue;\n    var isSelected = !!(focusedOption && selectValue && selectValue.includes(focusedOption));\n\n    if (focused && messages.onFocus) {\n      var onFocusProps = {\n        focused: focused,\n        label: getOptionLabel(focused),\n        isDisabled: isOptionDisabled(focused, selectValue),\n        isSelected: isSelected,\n        options: options,\n        context: focused === focusedOption ? 'menu' : 'value',\n        selectValue: selectValue\n      };\n      focusMsg = messages.onFocus(onFocusProps);\n    }\n\n    return focusMsg;\n  }, [focusedOption, focusedValue, getOptionLabel, isOptionDisabled, messages, options, selectValue]);\n  var ariaResults = useMemo(function () {\n    var resultsMsg = '';\n\n    if (menuIsOpen && options.length && messages.onFilter) {\n      var resultsMessage = screenReaderStatus({\n        count: focusableOptions.length\n      });\n      resultsMsg = messages.onFilter({\n        inputValue: inputValue,\n        resultsMessage: resultsMessage\n      });\n    }\n\n    return resultsMsg;\n  }, [focusableOptions, inputValue, menuIsOpen, messages, options, screenReaderStatus]);\n  var ariaGuidance = useMemo(function () {\n    var guidanceMsg = '';\n\n    if (messages.guidance) {\n      var context = focusedValue ? 'value' : menuIsOpen ? 'menu' : 'input';\n      guidanceMsg = messages.guidance({\n        'aria-label': ariaLabel,\n        context: context,\n        isDisabled: focusedOption && isOptionDisabled(focusedOption, selectValue),\n        isMulti: isMulti,\n        isSearchable: isSearchable,\n        tabSelectsValue: tabSelectsValue\n      });\n    }\n\n    return guidanceMsg;\n  }, [ariaLabel, focusedOption, focusedValue, isMulti, isOptionDisabled, isSearchable, menuIsOpen, messages, selectValue, tabSelectsValue]);\n  var ariaContext = \"\".concat(ariaFocused, \" \").concat(ariaResults, \" \").concat(ariaGuidance);\n  var ScreenReaderText = jsx(Fragment, null, jsx(\"span\", {\n    id: \"aria-selection\"\n  }, ariaSelected), jsx(\"span\", {\n    id: \"aria-context\"\n  }, ariaContext));\n  var isInitialFocus = (ariaSelection === null || ariaSelection === void 0 ? void 0 : ariaSelection.action) === 'initial-input-focus';\n  return jsx(Fragment, null, jsx(A11yText, {\n    id: id\n  }, isInitialFocus && ScreenReaderText), jsx(A11yText, {\n    \"aria-live\": ariaLive,\n    \"aria-atomic\": \"false\",\n    \"aria-relevant\": \"additions text\"\n  }, isFocused && !isInitialFocus && ScreenReaderText));\n};\n\nvar diacritics = [{\n  base: 'A',\n  letters: \"A\\u24B6\\uFF21\\xC0\\xC1\\xC2\\u1EA6\\u1EA4\\u1EAA\\u1EA8\\xC3\\u0100\\u0102\\u1EB0\\u1EAE\\u1EB4\\u1EB2\\u0226\\u01E0\\xC4\\u01DE\\u1EA2\\xC5\\u01FA\\u01CD\\u0200\\u0202\\u1EA0\\u1EAC\\u1EB6\\u1E00\\u0104\\u023A\\u2C6F\"\n}, {\n  base: 'AA',\n  letters: \"\\uA732\"\n}, {\n  base: 'AE',\n  letters: \"\\xC6\\u01FC\\u01E2\"\n}, {\n  base: 'AO',\n  letters: \"\\uA734\"\n}, {\n  base: 'AU',\n  letters: \"\\uA736\"\n}, {\n  base: 'AV',\n  letters: \"\\uA738\\uA73A\"\n}, {\n  base: 'AY',\n  letters: \"\\uA73C\"\n}, {\n  base: 'B',\n  letters: \"B\\u24B7\\uFF22\\u1E02\\u1E04\\u1E06\\u0243\\u0182\\u0181\"\n}, {\n  base: 'C',\n  letters: \"C\\u24B8\\uFF23\\u0106\\u0108\\u010A\\u010C\\xC7\\u1E08\\u0187\\u023B\\uA73E\"\n}, {\n  base: 'D',\n  letters: \"D\\u24B9\\uFF24\\u1E0A\\u010E\\u1E0C\\u1E10\\u1E12\\u1E0E\\u0110\\u018B\\u018A\\u0189\\uA779\"\n}, {\n  base: 'DZ',\n  letters: \"\\u01F1\\u01C4\"\n}, {\n  base: 'Dz',\n  letters: \"\\u01F2\\u01C5\"\n}, {\n  base: 'E',\n  letters: \"E\\u24BA\\uFF25\\xC8\\xC9\\xCA\\u1EC0\\u1EBE\\u1EC4\\u1EC2\\u1EBC\\u0112\\u1E14\\u1E16\\u0114\\u0116\\xCB\\u1EBA\\u011A\\u0204\\u0206\\u1EB8\\u1EC6\\u0228\\u1E1C\\u0118\\u1E18\\u1E1A\\u0190\\u018E\"\n}, {\n  base: 'F',\n  letters: \"F\\u24BB\\uFF26\\u1E1E\\u0191\\uA77B\"\n}, {\n  base: 'G',\n  letters: \"G\\u24BC\\uFF27\\u01F4\\u011C\\u1E20\\u011E\\u0120\\u01E6\\u0122\\u01E4\\u0193\\uA7A0\\uA77D\\uA77E\"\n}, {\n  base: 'H',\n  letters: \"H\\u24BD\\uFF28\\u0124\\u1E22\\u1E26\\u021E\\u1E24\\u1E28\\u1E2A\\u0126\\u2C67\\u2C75\\uA78D\"\n}, {\n  base: 'I',\n  letters: \"I\\u24BE\\uFF29\\xCC\\xCD\\xCE\\u0128\\u012A\\u012C\\u0130\\xCF\\u1E2E\\u1EC8\\u01CF\\u0208\\u020A\\u1ECA\\u012E\\u1E2C\\u0197\"\n}, {\n  base: 'J',\n  letters: \"J\\u24BF\\uFF2A\\u0134\\u0248\"\n}, {\n  base: 'K',\n  letters: \"K\\u24C0\\uFF2B\\u1E30\\u01E8\\u1E32\\u0136\\u1E34\\u0198\\u2C69\\uA740\\uA742\\uA744\\uA7A2\"\n}, {\n  base: 'L',\n  letters: \"L\\u24C1\\uFF2C\\u013F\\u0139\\u013D\\u1E36\\u1E38\\u013B\\u1E3C\\u1E3A\\u0141\\u023D\\u2C62\\u2C60\\uA748\\uA746\\uA780\"\n}, {\n  base: 'LJ',\n  letters: \"\\u01C7\"\n}, {\n  base: 'Lj',\n  letters: \"\\u01C8\"\n}, {\n  base: 'M',\n  letters: \"M\\u24C2\\uFF2D\\u1E3E\\u1E40\\u1E42\\u2C6E\\u019C\"\n}, {\n  base: 'N',\n  letters: \"N\\u24C3\\uFF2E\\u01F8\\u0143\\xD1\\u1E44\\u0147\\u1E46\\u0145\\u1E4A\\u1E48\\u0220\\u019D\\uA790\\uA7A4\"\n}, {\n  base: 'NJ',\n  letters: \"\\u01CA\"\n}, {\n  base: 'Nj',\n  letters: \"\\u01CB\"\n}, {\n  base: 'O',\n  letters: \"O\\u24C4\\uFF2F\\xD2\\xD3\\xD4\\u1ED2\\u1ED0\\u1ED6\\u1ED4\\xD5\\u1E4C\\u022C\\u1E4E\\u014C\\u1E50\\u1E52\\u014E\\u022E\\u0230\\xD6\\u022A\\u1ECE\\u0150\\u01D1\\u020C\\u020E\\u01A0\\u1EDC\\u1EDA\\u1EE0\\u1EDE\\u1EE2\\u1ECC\\u1ED8\\u01EA\\u01EC\\xD8\\u01FE\\u0186\\u019F\\uA74A\\uA74C\"\n}, {\n  base: 'OI',\n  letters: \"\\u01A2\"\n}, {\n  base: 'OO',\n  letters: \"\\uA74E\"\n}, {\n  base: 'OU',\n  letters: \"\\u0222\"\n}, {\n  base: 'P',\n  letters: \"P\\u24C5\\uFF30\\u1E54\\u1E56\\u01A4\\u2C63\\uA750\\uA752\\uA754\"\n}, {\n  base: 'Q',\n  letters: \"Q\\u24C6\\uFF31\\uA756\\uA758\\u024A\"\n}, {\n  base: 'R',\n  letters: \"R\\u24C7\\uFF32\\u0154\\u1E58\\u0158\\u0210\\u0212\\u1E5A\\u1E5C\\u0156\\u1E5E\\u024C\\u2C64\\uA75A\\uA7A6\\uA782\"\n}, {\n  base: 'S',\n  letters: \"S\\u24C8\\uFF33\\u1E9E\\u015A\\u1E64\\u015C\\u1E60\\u0160\\u1E66\\u1E62\\u1E68\\u0218\\u015E\\u2C7E\\uA7A8\\uA784\"\n}, {\n  base: 'T',\n  letters: \"T\\u24C9\\uFF34\\u1E6A\\u0164\\u1E6C\\u021A\\u0162\\u1E70\\u1E6E\\u0166\\u01AC\\u01AE\\u023E\\uA786\"\n}, {\n  base: 'TZ',\n  letters: \"\\uA728\"\n}, {\n  base: 'U',\n  letters: \"U\\u24CA\\uFF35\\xD9\\xDA\\xDB\\u0168\\u1E78\\u016A\\u1E7A\\u016C\\xDC\\u01DB\\u01D7\\u01D5\\u01D9\\u1EE6\\u016E\\u0170\\u01D3\\u0214\\u0216\\u01AF\\u1EEA\\u1EE8\\u1EEE\\u1EEC\\u1EF0\\u1EE4\\u1E72\\u0172\\u1E76\\u1E74\\u0244\"\n}, {\n  base: 'V',\n  letters: \"V\\u24CB\\uFF36\\u1E7C\\u1E7E\\u01B2\\uA75E\\u0245\"\n}, {\n  base: 'VY',\n  letters: \"\\uA760\"\n}, {\n  base: 'W',\n  letters: \"W\\u24CC\\uFF37\\u1E80\\u1E82\\u0174\\u1E86\\u1E84\\u1E88\\u2C72\"\n}, {\n  base: 'X',\n  letters: \"X\\u24CD\\uFF38\\u1E8A\\u1E8C\"\n}, {\n  base: 'Y',\n  letters: \"Y\\u24CE\\uFF39\\u1EF2\\xDD\\u0176\\u1EF8\\u0232\\u1E8E\\u0178\\u1EF6\\u1EF4\\u01B3\\u024E\\u1EFE\"\n}, {\n  base: 'Z',\n  letters: \"Z\\u24CF\\uFF3A\\u0179\\u1E90\\u017B\\u017D\\u1E92\\u1E94\\u01B5\\u0224\\u2C7F\\u2C6B\\uA762\"\n}, {\n  base: 'a',\n  letters: \"a\\u24D0\\uFF41\\u1E9A\\xE0\\xE1\\xE2\\u1EA7\\u1EA5\\u1EAB\\u1EA9\\xE3\\u0101\\u0103\\u1EB1\\u1EAF\\u1EB5\\u1EB3\\u0227\\u01E1\\xE4\\u01DF\\u1EA3\\xE5\\u01FB\\u01CE\\u0201\\u0203\\u1EA1\\u1EAD\\u1EB7\\u1E01\\u0105\\u2C65\\u0250\"\n}, {\n  base: 'aa',\n  letters: \"\\uA733\"\n}, {\n  base: 'ae',\n  letters: \"\\xE6\\u01FD\\u01E3\"\n}, {\n  base: 'ao',\n  letters: \"\\uA735\"\n}, {\n  base: 'au',\n  letters: \"\\uA737\"\n}, {\n  base: 'av',\n  letters: \"\\uA739\\uA73B\"\n}, {\n  base: 'ay',\n  letters: \"\\uA73D\"\n}, {\n  base: 'b',\n  letters: \"b\\u24D1\\uFF42\\u1E03\\u1E05\\u1E07\\u0180\\u0183\\u0253\"\n}, {\n  base: 'c',\n  letters: \"c\\u24D2\\uFF43\\u0107\\u0109\\u010B\\u010D\\xE7\\u1E09\\u0188\\u023C\\uA73F\\u2184\"\n}, {\n  base: 'd',\n  letters: \"d\\u24D3\\uFF44\\u1E0B\\u010F\\u1E0D\\u1E11\\u1E13\\u1E0F\\u0111\\u018C\\u0256\\u0257\\uA77A\"\n}, {\n  base: 'dz',\n  letters: \"\\u01F3\\u01C6\"\n}, {\n  base: 'e',\n  letters: \"e\\u24D4\\uFF45\\xE8\\xE9\\xEA\\u1EC1\\u1EBF\\u1EC5\\u1EC3\\u1EBD\\u0113\\u1E15\\u1E17\\u0115\\u0117\\xEB\\u1EBB\\u011B\\u0205\\u0207\\u1EB9\\u1EC7\\u0229\\u1E1D\\u0119\\u1E19\\u1E1B\\u0247\\u025B\\u01DD\"\n}, {\n  base: 'f',\n  letters: \"f\\u24D5\\uFF46\\u1E1F\\u0192\\uA77C\"\n}, {\n  base: 'g',\n  letters: \"g\\u24D6\\uFF47\\u01F5\\u011D\\u1E21\\u011F\\u0121\\u01E7\\u0123\\u01E5\\u0260\\uA7A1\\u1D79\\uA77F\"\n}, {\n  base: 'h',\n  letters: \"h\\u24D7\\uFF48\\u0125\\u1E23\\u1E27\\u021F\\u1E25\\u1E29\\u1E2B\\u1E96\\u0127\\u2C68\\u2C76\\u0265\"\n}, {\n  base: 'hv',\n  letters: \"\\u0195\"\n}, {\n  base: 'i',\n  letters: \"i\\u24D8\\uFF49\\xEC\\xED\\xEE\\u0129\\u012B\\u012D\\xEF\\u1E2F\\u1EC9\\u01D0\\u0209\\u020B\\u1ECB\\u012F\\u1E2D\\u0268\\u0131\"\n}, {\n  base: 'j',\n  letters: \"j\\u24D9\\uFF4A\\u0135\\u01F0\\u0249\"\n}, {\n  base: 'k',\n  letters: \"k\\u24DA\\uFF4B\\u1E31\\u01E9\\u1E33\\u0137\\u1E35\\u0199\\u2C6A\\uA741\\uA743\\uA745\\uA7A3\"\n}, {\n  base: 'l',\n  letters: \"l\\u24DB\\uFF4C\\u0140\\u013A\\u013E\\u1E37\\u1E39\\u013C\\u1E3D\\u1E3B\\u017F\\u0142\\u019A\\u026B\\u2C61\\uA749\\uA781\\uA747\"\n}, {\n  base: 'lj',\n  letters: \"\\u01C9\"\n}, {\n  base: 'm',\n  letters: \"m\\u24DC\\uFF4D\\u1E3F\\u1E41\\u1E43\\u0271\\u026F\"\n}, {\n  base: 'n',\n  letters: \"n\\u24DD\\uFF4E\\u01F9\\u0144\\xF1\\u1E45\\u0148\\u1E47\\u0146\\u1E4B\\u1E49\\u019E\\u0272\\u0149\\uA791\\uA7A5\"\n}, {\n  base: 'nj',\n  letters: \"\\u01CC\"\n}, {\n  base: 'o',\n  letters: \"o\\u24DE\\uFF4F\\xF2\\xF3\\xF4\\u1ED3\\u1ED1\\u1ED7\\u1ED5\\xF5\\u1E4D\\u022D\\u1E4F\\u014D\\u1E51\\u1E53\\u014F\\u022F\\u0231\\xF6\\u022B\\u1ECF\\u0151\\u01D2\\u020D\\u020F\\u01A1\\u1EDD\\u1EDB\\u1EE1\\u1EDF\\u1EE3\\u1ECD\\u1ED9\\u01EB\\u01ED\\xF8\\u01FF\\u0254\\uA74B\\uA74D\\u0275\"\n}, {\n  base: 'oi',\n  letters: \"\\u01A3\"\n}, {\n  base: 'ou',\n  letters: \"\\u0223\"\n}, {\n  base: 'oo',\n  letters: \"\\uA74F\"\n}, {\n  base: 'p',\n  letters: \"p\\u24DF\\uFF50\\u1E55\\u1E57\\u01A5\\u1D7D\\uA751\\uA753\\uA755\"\n}, {\n  base: 'q',\n  letters: \"q\\u24E0\\uFF51\\u024B\\uA757\\uA759\"\n}, {\n  base: 'r',\n  letters: \"r\\u24E1\\uFF52\\u0155\\u1E59\\u0159\\u0211\\u0213\\u1E5B\\u1E5D\\u0157\\u1E5F\\u024D\\u027D\\uA75B\\uA7A7\\uA783\"\n}, {\n  base: 's',\n  letters: \"s\\u24E2\\uFF53\\xDF\\u015B\\u1E65\\u015D\\u1E61\\u0161\\u1E67\\u1E63\\u1E69\\u0219\\u015F\\u023F\\uA7A9\\uA785\\u1E9B\"\n}, {\n  base: 't',\n  letters: \"t\\u24E3\\uFF54\\u1E6B\\u1E97\\u0165\\u1E6D\\u021B\\u0163\\u1E71\\u1E6F\\u0167\\u01AD\\u0288\\u2C66\\uA787\"\n}, {\n  base: 'tz',\n  letters: \"\\uA729\"\n}, {\n  base: 'u',\n  letters: \"u\\u24E4\\uFF55\\xF9\\xFA\\xFB\\u0169\\u1E79\\u016B\\u1E7B\\u016D\\xFC\\u01DC\\u01D8\\u01D6\\u01DA\\u1EE7\\u016F\\u0171\\u01D4\\u0215\\u0217\\u01B0\\u1EEB\\u1EE9\\u1EEF\\u1EED\\u1EF1\\u1EE5\\u1E73\\u0173\\u1E77\\u1E75\\u0289\"\n}, {\n  base: 'v',\n  letters: \"v\\u24E5\\uFF56\\u1E7D\\u1E7F\\u028B\\uA75F\\u028C\"\n}, {\n  base: 'vy',\n  letters: \"\\uA761\"\n}, {\n  base: 'w',\n  letters: \"w\\u24E6\\uFF57\\u1E81\\u1E83\\u0175\\u1E87\\u1E85\\u1E98\\u1E89\\u2C73\"\n}, {\n  base: 'x',\n  letters: \"x\\u24E7\\uFF58\\u1E8B\\u1E8D\"\n}, {\n  base: 'y',\n  letters: \"y\\u24E8\\uFF59\\u1EF3\\xFD\\u0177\\u1EF9\\u0233\\u1E8F\\xFF\\u1EF7\\u1E99\\u1EF5\\u01B4\\u024F\\u1EFF\"\n}, {\n  base: 'z',\n  letters: \"z\\u24E9\\uFF5A\\u017A\\u1E91\\u017C\\u017E\\u1E93\\u1E95\\u01B6\\u0225\\u0240\\u2C6C\\uA763\"\n}];\nvar anyDiacritic = new RegExp('[' + diacritics.map(function (d) {\n  return d.letters;\n}).join('') + ']', 'g');\nvar diacriticToBase = {};\n\nfor (var i = 0; i < diacritics.length; i++) {\n  var diacritic = diacritics[i];\n\n  for (var j = 0; j < diacritic.letters.length; j++) {\n    diacriticToBase[diacritic.letters[j]] = diacritic.base;\n  }\n}\n\nvar stripDiacritics = function stripDiacritics(str) {\n  return str.replace(anyDiacritic, function (match) {\n    return diacriticToBase[match];\n  });\n};\n\nvar memoizedStripDiacriticsForInput = memoizeOne(stripDiacritics);\n\nvar trimString = function trimString(str) {\n  return str.replace(/^\\s+|\\s+$/g, '');\n};\n\nvar defaultStringify = function defaultStringify(option) {\n  return \"\".concat(option.label, \" \").concat(option.value);\n};\n\nvar createFilter = function createFilter(config) {\n  return function (option, rawInput) {\n    // eslint-disable-next-line no-underscore-dangle\n    if (option.data.__isNew__) return true;\n\n    var _ignoreCase$ignoreAcc = _objectSpread2({\n      ignoreCase: true,\n      ignoreAccents: true,\n      stringify: defaultStringify,\n      trim: true,\n      matchFrom: 'any'\n    }, config),\n        ignoreCase = _ignoreCase$ignoreAcc.ignoreCase,\n        ignoreAccents = _ignoreCase$ignoreAcc.ignoreAccents,\n        stringify = _ignoreCase$ignoreAcc.stringify,\n        trim = _ignoreCase$ignoreAcc.trim,\n        matchFrom = _ignoreCase$ignoreAcc.matchFrom;\n\n    var input = trim ? trimString(rawInput) : rawInput;\n    var candidate = trim ? trimString(stringify(option)) : stringify(option);\n\n    if (ignoreCase) {\n      input = input.toLowerCase();\n      candidate = candidate.toLowerCase();\n    }\n\n    if (ignoreAccents) {\n      input = memoizedStripDiacriticsForInput(input);\n      candidate = stripDiacritics(candidate);\n    }\n\n    return matchFrom === 'start' ? candidate.substr(0, input.length) === input : candidate.indexOf(input) > -1;\n  };\n};\n\nvar _excluded = [\"innerRef\"];\nfunction DummyInput(_ref) {\n  var innerRef = _ref.innerRef,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  // Remove animation props not meant for HTML elements\n  var filteredProps = removeProps(props, 'onExited', 'in', 'enter', 'exit', 'appear');\n  return jsx(\"input\", _extends({\n    ref: innerRef\n  }, filteredProps, {\n    css: /*#__PURE__*/css({\n      label: 'dummyInput',\n      // get rid of any default styles\n      background: 0,\n      border: 0,\n      // important! this hides the flashing cursor\n      caretColor: 'transparent',\n      fontSize: 'inherit',\n      gridArea: '1 / 1 / 2 / 3',\n      outline: 0,\n      padding: 0,\n      // important! without `width` browsers won't allow focus\n      width: 1,\n      // remove cursor on desktop\n      color: 'transparent',\n      // remove cursor on mobile whilst maintaining \"scroll into view\" behaviour\n      left: -100,\n      opacity: 0,\n      position: 'relative',\n      transform: 'scale(.01)'\n    }, process.env.NODE_ENV === \"production\" ? \"\" : \";label:DummyInput;\", process.env.NODE_ENV === \"production\" ? \"\" : \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkR1bW15SW5wdXQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXlCTSIsImZpbGUiOiJEdW1teUlucHV0LnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4IGpzeCAqL1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsganN4IH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuaW1wb3J0IHsgcmVtb3ZlUHJvcHMgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIER1bW15SW5wdXQoe1xuICBpbm5lclJlZixcbiAgLi4ucHJvcHNcbn06IEpTWC5JbnRyaW5zaWNFbGVtZW50c1snaW5wdXQnXSAmIHtcbiAgcmVhZG9ubHkgaW5uZXJSZWY6IFJlZjxIVE1MSW5wdXRFbGVtZW50Pjtcbn0pIHtcbiAgLy8gUmVtb3ZlIGFuaW1hdGlvbiBwcm9wcyBub3QgbWVhbnQgZm9yIEhUTUwgZWxlbWVudHNcbiAgY29uc3QgZmlsdGVyZWRQcm9wcyA9IHJlbW92ZVByb3BzKFxuICAgIHByb3BzLFxuICAgICdvbkV4aXRlZCcsXG4gICAgJ2luJyxcbiAgICAnZW50ZXInLFxuICAgICdleGl0JyxcbiAgICAnYXBwZWFyJ1xuICApO1xuXG4gIHJldHVybiAoXG4gICAgPGlucHV0XG4gICAgICByZWY9e2lubmVyUmVmfVxuICAgICAgey4uLmZpbHRlcmVkUHJvcHN9XG4gICAgICBjc3M9e3tcbiAgICAgICAgbGFiZWw6ICdkdW1teUlucHV0JyxcbiAgICAgICAgLy8gZ2V0IHJpZCBvZiBhbnkgZGVmYXVsdCBzdHlsZXNcbiAgICAgICAgYmFja2dyb3VuZDogMCxcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAvLyBpbXBvcnRhbnQhIHRoaXMgaGlkZXMgdGhlIGZsYXNoaW5nIGN1cnNvclxuICAgICAgICBjYXJldENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICBmb250U2l6ZTogJ2luaGVyaXQnLFxuICAgICAgICBncmlkQXJlYTogJzEgLyAxIC8gMiAvIDMnLFxuICAgICAgICBvdXRsaW5lOiAwLFxuICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAvLyBpbXBvcnRhbnQhIHdpdGhvdXQgYHdpZHRoYCBicm93c2VycyB3b24ndCBhbGxvdyBmb2N1c1xuICAgICAgICB3aWR0aDogMSxcblxuICAgICAgICAvLyByZW1vdmUgY3Vyc29yIG9uIGRlc2t0b3BcbiAgICAgICAgY29sb3I6ICd0cmFuc3BhcmVudCcsXG5cbiAgICAgICAgLy8gcmVtb3ZlIGN1cnNvciBvbiBtb2JpbGUgd2hpbHN0IG1haW50YWluaW5nIFwic2Nyb2xsIGludG8gdmlld1wiIGJlaGF2aW91clxuICAgICAgICBsZWZ0OiAtMTAwLFxuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoLjAxKScsXG4gICAgICB9fVxuICAgIC8+XG4gICk7XG59XG4iXX0= */\")\n  }));\n}\n\nvar cancelScroll = function cancelScroll(event) {\n  event.preventDefault();\n  event.stopPropagation();\n};\n\nfunction useScrollCapture(_ref) {\n  var isEnabled = _ref.isEnabled,\n      onBottomArrive = _ref.onBottomArrive,\n      onBottomLeave = _ref.onBottomLeave,\n      onTopArrive = _ref.onTopArrive,\n      onTopLeave = _ref.onTopLeave;\n  var isBottom = useRef(false);\n  var isTop = useRef(false);\n  var touchStart = useRef(0);\n  var scrollTarget = useRef(null);\n  var handleEventDelta = useCallback(function (event, delta) {\n    if (scrollTarget.current === null) return;\n    var _scrollTarget$current = scrollTarget.current,\n        scrollTop = _scrollTarget$current.scrollTop,\n        scrollHeight = _scrollTarget$current.scrollHeight,\n        clientHeight = _scrollTarget$current.clientHeight;\n    var target = scrollTarget.current;\n    var isDeltaPositive = delta > 0;\n    var availableScroll = scrollHeight - clientHeight - scrollTop;\n    var shouldCancelScroll = false; // reset bottom/top flags\n\n    if (availableScroll > delta && isBottom.current) {\n      if (onBottomLeave) onBottomLeave(event);\n      isBottom.current = false;\n    }\n\n    if (isDeltaPositive && isTop.current) {\n      if (onTopLeave) onTopLeave(event);\n      isTop.current = false;\n    } // bottom limit\n\n\n    if (isDeltaPositive && delta > availableScroll) {\n      if (onBottomArrive && !isBottom.current) {\n        onBottomArrive(event);\n      }\n\n      target.scrollTop = scrollHeight;\n      shouldCancelScroll = true;\n      isBottom.current = true; // top limit\n    } else if (!isDeltaPositive && -delta > scrollTop) {\n      if (onTopArrive && !isTop.current) {\n        onTopArrive(event);\n      }\n\n      target.scrollTop = 0;\n      shouldCancelScroll = true;\n      isTop.current = true;\n    } // cancel scroll\n\n\n    if (shouldCancelScroll) {\n      cancelScroll(event);\n    }\n  }, [onBottomArrive, onBottomLeave, onTopArrive, onTopLeave]);\n  var onWheel = useCallback(function (event) {\n    handleEventDelta(event, event.deltaY);\n  }, [handleEventDelta]);\n  var onTouchStart = useCallback(function (event) {\n    // set touch start so we can calculate touchmove delta\n    touchStart.current = event.changedTouches[0].clientY;\n  }, []);\n  var onTouchMove = useCallback(function (event) {\n    var deltaY = touchStart.current - event.changedTouches[0].clientY;\n    handleEventDelta(event, deltaY);\n  }, [handleEventDelta]);\n  var startListening = useCallback(function (el) {\n    // bail early if no element is available to attach to\n    if (!el) return;\n    var notPassive = supportsPassiveEvents ? {\n      passive: false\n    } : false;\n    el.addEventListener('wheel', onWheel, notPassive);\n    el.addEventListener('touchstart', onTouchStart, notPassive);\n    el.addEventListener('touchmove', onTouchMove, notPassive);\n  }, [onTouchMove, onTouchStart, onWheel]);\n  var stopListening = useCallback(function (el) {\n    // bail early if no element is available to detach from\n    if (!el) return;\n    el.removeEventListener('wheel', onWheel, false);\n    el.removeEventListener('touchstart', onTouchStart, false);\n    el.removeEventListener('touchmove', onTouchMove, false);\n  }, [onTouchMove, onTouchStart, onWheel]);\n  useEffect(function () {\n    if (!isEnabled) return;\n    var element = scrollTarget.current;\n    startListening(element);\n    return function () {\n      stopListening(element);\n    };\n  }, [isEnabled, startListening, stopListening]);\n  return function (element) {\n    scrollTarget.current = element;\n  };\n}\n\nvar STYLE_KEYS = ['boxSizing', 'height', 'overflow', 'paddingRight', 'position'];\nvar LOCK_STYLES = {\n  boxSizing: 'border-box',\n  // account for possible declaration `width: 100%;` on body\n  overflow: 'hidden',\n  position: 'relative',\n  height: '100%'\n};\n\nfunction preventTouchMove(e) {\n  e.preventDefault();\n}\n\nfunction allowTouchMove(e) {\n  e.stopPropagation();\n}\n\nfunction preventInertiaScroll() {\n  var top = this.scrollTop;\n  var totalScroll = this.scrollHeight;\n  var currentScroll = top + this.offsetHeight;\n\n  if (top === 0) {\n    this.scrollTop = 1;\n  } else if (currentScroll === totalScroll) {\n    this.scrollTop = top - 1;\n  }\n} // `ontouchstart` check works on most browsers\n// `maxTouchPoints` works on IE10/11 and Surface\n\n\nfunction isTouchDevice() {\n  return 'ontouchstart' in window || navigator.maxTouchPoints;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nvar activeScrollLocks = 0;\nvar listenerOptions = {\n  capture: false,\n  passive: false\n};\nfunction useScrollLock(_ref) {\n  var isEnabled = _ref.isEnabled,\n      _ref$accountForScroll = _ref.accountForScrollbars,\n      accountForScrollbars = _ref$accountForScroll === void 0 ? true : _ref$accountForScroll;\n  var originalStyles = useRef({});\n  var scrollTarget = useRef(null);\n  var addScrollLock = useCallback(function (touchScrollTarget) {\n    if (!canUseDOM) return;\n    var target = document.body;\n    var targetStyle = target && target.style;\n\n    if (accountForScrollbars) {\n      // store any styles already applied to the body\n      STYLE_KEYS.forEach(function (key) {\n        var val = targetStyle && targetStyle[key];\n        originalStyles.current[key] = val;\n      });\n    } // apply the lock styles and padding if this is the first scroll lock\n\n\n    if (accountForScrollbars && activeScrollLocks < 1) {\n      var currentPadding = parseInt(originalStyles.current.paddingRight, 10) || 0;\n      var clientWidth = document.body ? document.body.clientWidth : 0;\n      var adjustedPadding = window.innerWidth - clientWidth + currentPadding || 0;\n      Object.keys(LOCK_STYLES).forEach(function (key) {\n        var val = LOCK_STYLES[key];\n\n        if (targetStyle) {\n          targetStyle[key] = val;\n        }\n      });\n\n      if (targetStyle) {\n        targetStyle.paddingRight = \"\".concat(adjustedPadding, \"px\");\n      }\n    } // account for touch devices\n\n\n    if (target && isTouchDevice()) {\n      // Mobile Safari ignores { overflow: hidden } declaration on the body.\n      target.addEventListener('touchmove', preventTouchMove, listenerOptions); // Allow scroll on provided target\n\n      if (touchScrollTarget) {\n        touchScrollTarget.addEventListener('touchstart', preventInertiaScroll, listenerOptions);\n        touchScrollTarget.addEventListener('touchmove', allowTouchMove, listenerOptions);\n      }\n    } // increment active scroll locks\n\n\n    activeScrollLocks += 1;\n  }, [accountForScrollbars]);\n  var removeScrollLock = useCallback(function (touchScrollTarget) {\n    if (!canUseDOM) return;\n    var target = document.body;\n    var targetStyle = target && target.style; // safely decrement active scroll locks\n\n    activeScrollLocks = Math.max(activeScrollLocks - 1, 0); // reapply original body styles, if any\n\n    if (accountForScrollbars && activeScrollLocks < 1) {\n      STYLE_KEYS.forEach(function (key) {\n        var val = originalStyles.current[key];\n\n        if (targetStyle) {\n          targetStyle[key] = val;\n        }\n      });\n    } // remove touch listeners\n\n\n    if (target && isTouchDevice()) {\n      target.removeEventListener('touchmove', preventTouchMove, listenerOptions);\n\n      if (touchScrollTarget) {\n        touchScrollTarget.removeEventListener('touchstart', preventInertiaScroll, listenerOptions);\n        touchScrollTarget.removeEventListener('touchmove', allowTouchMove, listenerOptions);\n      }\n    }\n  }, [accountForScrollbars]);\n  useEffect(function () {\n    if (!isEnabled) return;\n    var element = scrollTarget.current;\n    addScrollLock(element);\n    return function () {\n      removeScrollLock(element);\n    };\n  }, [isEnabled, addScrollLock, removeScrollLock]);\n  return function (element) {\n    scrollTarget.current = element;\n  };\n}\n\nfunction _EMOTION_STRINGIFIED_CSS_ERROR__() { return \"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop).\"; }\n\nvar blurSelectInput = function blurSelectInput() {\n  return document.activeElement && document.activeElement.blur();\n};\n\nvar _ref2 = process.env.NODE_ENV === \"production\" ? {\n  name: \"1kfdb0e\",\n  styles: \"position:fixed;left:0;bottom:0;right:0;top:0\"\n} : {\n  name: \"bp8cua-ScrollManager\",\n  styles: \"position:fixed;left:0;bottom:0;right:0;top:0;label:ScrollManager;\",\n  map: \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlNjcm9sbE1hbmFnZXIudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStDVSIsImZpbGUiOiJTY3JvbGxNYW5hZ2VyLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4IGpzeCAqL1xuaW1wb3J0IHsganN4IH0gZnJvbSAnQGVtb3Rpb24vcmVhY3QnO1xuaW1wb3J0IHsgRnJhZ21lbnQsIFJlYWN0RWxlbWVudCwgUmVmQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdXNlU2Nyb2xsQ2FwdHVyZSBmcm9tICcuL3VzZVNjcm9sbENhcHR1cmUnO1xuaW1wb3J0IHVzZVNjcm9sbExvY2sgZnJvbSAnLi91c2VTY3JvbGxMb2NrJztcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgcmVhZG9ubHkgY2hpbGRyZW46IChyZWY6IFJlZkNhbGxiYWNrPEhUTUxFbGVtZW50PikgPT4gUmVhY3RFbGVtZW50O1xuICByZWFkb25seSBsb2NrRW5hYmxlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2FwdHVyZUVuYWJsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9uQm90dG9tQXJyaXZlPzogKGV2ZW50OiBXaGVlbEV2ZW50IHwgVG91Y2hFdmVudCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25Cb3R0b21MZWF2ZT86IChldmVudDogV2hlZWxFdmVudCB8IFRvdWNoRXZlbnQpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IG9uVG9wQXJyaXZlPzogKGV2ZW50OiBXaGVlbEV2ZW50IHwgVG91Y2hFdmVudCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgb25Ub3BMZWF2ZT86IChldmVudDogV2hlZWxFdmVudCB8IFRvdWNoRXZlbnQpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGJsdXJTZWxlY3RJbnB1dCA9ICgpID0+XG4gIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU2Nyb2xsTWFuYWdlcih7XG4gIGNoaWxkcmVuLFxuICBsb2NrRW5hYmxlZCxcbiAgY2FwdHVyZUVuYWJsZWQgPSB0cnVlLFxuICBvbkJvdHRvbUFycml2ZSxcbiAgb25Cb3R0b21MZWF2ZSxcbiAgb25Ub3BBcnJpdmUsXG4gIG9uVG9wTGVhdmUsXG59OiBQcm9wcykge1xuICBjb25zdCBzZXRTY3JvbGxDYXB0dXJlVGFyZ2V0ID0gdXNlU2Nyb2xsQ2FwdHVyZSh7XG4gICAgaXNFbmFibGVkOiBjYXB0dXJlRW5hYmxlZCxcbiAgICBvbkJvdHRvbUFycml2ZSxcbiAgICBvbkJvdHRvbUxlYXZlLFxuICAgIG9uVG9wQXJyaXZlLFxuICAgIG9uVG9wTGVhdmUsXG4gIH0pO1xuICBjb25zdCBzZXRTY3JvbGxMb2NrVGFyZ2V0ID0gdXNlU2Nyb2xsTG9jayh7IGlzRW5hYmxlZDogbG9ja0VuYWJsZWQgfSk7XG5cbiAgY29uc3QgdGFyZ2V0UmVmOiBSZWZDYWxsYmFjazxIVE1MRWxlbWVudD4gPSAoZWxlbWVudCkgPT4ge1xuICAgIHNldFNjcm9sbENhcHR1cmVUYXJnZXQoZWxlbWVudCk7XG4gICAgc2V0U2Nyb2xsTG9ja1RhcmdldChlbGVtZW50KTtcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxGcmFnbWVudD5cbiAgICAgIHtsb2NrRW5hYmxlZCAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBvbkNsaWNrPXtibHVyU2VsZWN0SW5wdXR9XG4gICAgICAgICAgY3NzPXt7IHBvc2l0aW9uOiAnZml4ZWQnLCBsZWZ0OiAwLCBib3R0b206IDAsIHJpZ2h0OiAwLCB0b3A6IDAgfX1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7Y2hpbGRyZW4odGFyZ2V0UmVmKX1cbiAgICA8L0ZyYWdtZW50PlxuICApO1xufVxuIl19 */\",\n  toString: _EMOTION_STRINGIFIED_CSS_ERROR__\n};\n\nfunction ScrollManager(_ref) {\n  var children = _ref.children,\n      lockEnabled = _ref.lockEnabled,\n      _ref$captureEnabled = _ref.captureEnabled,\n      captureEnabled = _ref$captureEnabled === void 0 ? true : _ref$captureEnabled,\n      onBottomArrive = _ref.onBottomArrive,\n      onBottomLeave = _ref.onBottomLeave,\n      onTopArrive = _ref.onTopArrive,\n      onTopLeave = _ref.onTopLeave;\n  var setScrollCaptureTarget = useScrollCapture({\n    isEnabled: captureEnabled,\n    onBottomArrive: onBottomArrive,\n    onBottomLeave: onBottomLeave,\n    onTopArrive: onTopArrive,\n    onTopLeave: onTopLeave\n  });\n  var setScrollLockTarget = useScrollLock({\n    isEnabled: lockEnabled\n  });\n\n  var targetRef = function targetRef(element) {\n    setScrollCaptureTarget(element);\n    setScrollLockTarget(element);\n  };\n\n  return jsx(Fragment, null, lockEnabled && jsx(\"div\", {\n    onClick: blurSelectInput,\n    css: _ref2\n  }), children(targetRef));\n}\n\nvar formatGroupLabel = function formatGroupLabel(group) {\n  return group.label;\n};\nvar getOptionLabel$1 = function getOptionLabel(option) {\n  return option.label;\n};\nvar getOptionValue$1 = function getOptionValue(option) {\n  return option.value;\n};\nvar isOptionDisabled = function isOptionDisabled(option) {\n  return !!option.isDisabled;\n};\n\nvar defaultStyles = {\n  clearIndicator: clearIndicatorCSS,\n  container: containerCSS,\n  control: css$1,\n  dropdownIndicator: dropdownIndicatorCSS,\n  group: groupCSS,\n  groupHeading: groupHeadingCSS,\n  indicatorsContainer: indicatorsContainerCSS,\n  indicatorSeparator: indicatorSeparatorCSS,\n  input: inputCSS,\n  loadingIndicator: loadingIndicatorCSS,\n  loadingMessage: loadingMessageCSS,\n  menu: menuCSS,\n  menuList: menuListCSS,\n  menuPortal: menuPortalCSS,\n  multiValue: multiValueCSS,\n  multiValueLabel: multiValueLabelCSS,\n  multiValueRemove: multiValueRemoveCSS,\n  noOptionsMessage: noOptionsMessageCSS,\n  option: optionCSS,\n  placeholder: placeholderCSS,\n  singleValue: css$2,\n  valueContainer: valueContainerCSS\n}; // Merge Utility\n// Allows consumers to extend a base Select with additional styles\n\nfunction mergeStyles(source) {\n  var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  // initialize with source styles\n  var styles = _objectSpread2({}, source); // massage in target styles\n\n\n  Object.keys(target).forEach(function (keyAsString) {\n    var key = keyAsString;\n\n    if (source[key]) {\n      styles[key] = function (rsCss, props) {\n        return target[key](source[key](rsCss, props), props);\n      };\n    } else {\n      styles[key] = target[key];\n    }\n  });\n  return styles;\n}\n\nvar colors = {\n  primary: '#2684FF',\n  primary75: '#4C9AFF',\n  primary50: '#B2D4FF',\n  primary25: '#DEEBFF',\n  danger: '#DE350B',\n  dangerLight: '#FFBDAD',\n  neutral0: 'hsl(0, 0%, 100%)',\n  neutral5: 'hsl(0, 0%, 95%)',\n  neutral10: 'hsl(0, 0%, 90%)',\n  neutral20: 'hsl(0, 0%, 80%)',\n  neutral30: 'hsl(0, 0%, 70%)',\n  neutral40: 'hsl(0, 0%, 60%)',\n  neutral50: 'hsl(0, 0%, 50%)',\n  neutral60: 'hsl(0, 0%, 40%)',\n  neutral70: 'hsl(0, 0%, 30%)',\n  neutral80: 'hsl(0, 0%, 20%)',\n  neutral90: 'hsl(0, 0%, 10%)'\n};\nvar borderRadius = 4; // Used to calculate consistent margin/padding on elements\n\nvar baseUnit = 4; // The minimum height of the control\n\nvar controlHeight = 38; // The amount of space between the control and menu */\n\nvar menuGutter = baseUnit * 2;\nvar spacing = {\n  baseUnit: baseUnit,\n  controlHeight: controlHeight,\n  menuGutter: menuGutter\n};\nvar defaultTheme = {\n  borderRadius: borderRadius,\n  colors: colors,\n  spacing: spacing\n};\n\nvar defaultProps = {\n  'aria-live': 'polite',\n  backspaceRemovesValue: true,\n  blurInputOnSelect: isTouchCapable(),\n  captureMenuScroll: !isTouchCapable(),\n  closeMenuOnSelect: true,\n  closeMenuOnScroll: false,\n  components: {},\n  controlShouldRenderValue: true,\n  escapeClearsValue: false,\n  filterOption: createFilter(),\n  formatGroupLabel: formatGroupLabel,\n  getOptionLabel: getOptionLabel$1,\n  getOptionValue: getOptionValue$1,\n  isDisabled: false,\n  isLoading: false,\n  isMulti: false,\n  isRtl: false,\n  isSearchable: true,\n  isOptionDisabled: isOptionDisabled,\n  loadingMessage: function loadingMessage() {\n    return 'Loading...';\n  },\n  maxMenuHeight: 300,\n  minMenuHeight: 140,\n  menuIsOpen: false,\n  menuPlacement: 'bottom',\n  menuPosition: 'absolute',\n  menuShouldBlockScroll: false,\n  menuShouldScrollIntoView: !isMobileDevice(),\n  noOptionsMessage: function noOptionsMessage() {\n    return 'No options';\n  },\n  openMenuOnFocus: false,\n  openMenuOnClick: true,\n  options: [],\n  pageSize: 5,\n  placeholder: 'Select...',\n  screenReaderStatus: function screenReaderStatus(_ref) {\n    var count = _ref.count;\n    return \"\".concat(count, \" result\").concat(count !== 1 ? 's' : '', \" available\");\n  },\n  styles: {},\n  tabIndex: 0,\n  tabSelectsValue: true\n};\n\nfunction toCategorizedOption(props, option, selectValue, index) {\n  var isDisabled = _isOptionDisabled(props, option, selectValue);\n\n  var isSelected = _isOptionSelected(props, option, selectValue);\n\n  var label = getOptionLabel(props, option);\n  var value = getOptionValue(props, option);\n  return {\n    type: 'option',\n    data: option,\n    isDisabled: isDisabled,\n    isSelected: isSelected,\n    label: label,\n    value: value,\n    index: index\n  };\n}\n\nfunction buildCategorizedOptions(props, selectValue) {\n  return props.options.map(function (groupOrOption, groupOrOptionIndex) {\n    if ('options' in groupOrOption) {\n      var categorizedOptions = groupOrOption.options.map(function (option, optionIndex) {\n        return toCategorizedOption(props, option, selectValue, optionIndex);\n      }).filter(function (categorizedOption) {\n        return isFocusable(props, categorizedOption);\n      });\n      return categorizedOptions.length > 0 ? {\n        type: 'group',\n        data: groupOrOption,\n        options: categorizedOptions,\n        index: groupOrOptionIndex\n      } : undefined;\n    }\n\n    var categorizedOption = toCategorizedOption(props, groupOrOption, selectValue, groupOrOptionIndex);\n    return isFocusable(props, categorizedOption) ? categorizedOption : undefined;\n  }).filter(notNullish);\n}\n\nfunction buildFocusableOptionsFromCategorizedOptions(categorizedOptions) {\n  return categorizedOptions.reduce(function (optionsAccumulator, categorizedOption) {\n    if (categorizedOption.type === 'group') {\n      optionsAccumulator.push.apply(optionsAccumulator, _toConsumableArray(categorizedOption.options.map(function (option) {\n        return option.data;\n      })));\n    } else {\n      optionsAccumulator.push(categorizedOption.data);\n    }\n\n    return optionsAccumulator;\n  }, []);\n}\n\nfunction buildFocusableOptions(props, selectValue) {\n  return buildFocusableOptionsFromCategorizedOptions(buildCategorizedOptions(props, selectValue));\n}\n\nfunction isFocusable(props, categorizedOption) {\n  var _props$inputValue = props.inputValue,\n      inputValue = _props$inputValue === void 0 ? '' : _props$inputValue;\n  var data = categorizedOption.data,\n      isSelected = categorizedOption.isSelected,\n      label = categorizedOption.label,\n      value = categorizedOption.value;\n  return (!shouldHideSelectedOptions(props) || !isSelected) && _filterOption(props, {\n    label: label,\n    value: value,\n    data: data\n  }, inputValue);\n}\n\nfunction getNextFocusedValue(state, nextSelectValue) {\n  var focusedValue = state.focusedValue,\n      lastSelectValue = state.selectValue;\n  var lastFocusedIndex = lastSelectValue.indexOf(focusedValue);\n\n  if (lastFocusedIndex > -1) {\n    var nextFocusedIndex = nextSelectValue.indexOf(focusedValue);\n\n    if (nextFocusedIndex > -1) {\n      // the focused value is still in the selectValue, return it\n      return focusedValue;\n    } else if (lastFocusedIndex < nextSelectValue.length) {\n      // the focusedValue is not present in the next selectValue array by\n      // reference, so return the new value at the same index\n      return nextSelectValue[lastFocusedIndex];\n    }\n  }\n\n  return null;\n}\n\nfunction getNextFocusedOption(state, options) {\n  var lastFocusedOption = state.focusedOption;\n  return lastFocusedOption && options.indexOf(lastFocusedOption) > -1 ? lastFocusedOption : options[0];\n}\n\nvar getOptionLabel = function getOptionLabel(props, data) {\n  return props.getOptionLabel(data);\n};\n\nvar getOptionValue = function getOptionValue(props, data) {\n  return props.getOptionValue(data);\n};\n\nfunction _isOptionDisabled(props, option, selectValue) {\n  return typeof props.isOptionDisabled === 'function' ? props.isOptionDisabled(option, selectValue) : false;\n}\n\nfunction _isOptionSelected(props, option, selectValue) {\n  if (selectValue.indexOf(option) > -1) return true;\n\n  if (typeof props.isOptionSelected === 'function') {\n    return props.isOptionSelected(option, selectValue);\n  }\n\n  var candidate = getOptionValue(props, option);\n  return selectValue.some(function (i) {\n    return getOptionValue(props, i) === candidate;\n  });\n}\n\nfunction _filterOption(props, option, inputValue) {\n  return props.filterOption ? props.filterOption(option, inputValue) : true;\n}\n\nvar shouldHideSelectedOptions = function shouldHideSelectedOptions(props) {\n  var hideSelectedOptions = props.hideSelectedOptions,\n      isMulti = props.isMulti;\n  if (hideSelectedOptions === undefined) return isMulti;\n  return hideSelectedOptions;\n};\n\nvar instanceId = 1;\n\nvar Select = /*#__PURE__*/function (_Component) {\n  _inherits(Select, _Component);\n\n  var _super = _createSuper(Select);\n\n  // Misc. Instance Properties\n  // ------------------------------\n  // TODO\n  // Refs\n  // ------------------------------\n  // Lifecycle\n  // ------------------------------\n  function Select(_props) {\n    var _this;\n\n    _classCallCheck(this, Select);\n\n    _this = _super.call(this, _props);\n    _this.state = {\n      ariaSelection: null,\n      focusedOption: null,\n      focusedValue: null,\n      inputIsHidden: false,\n      isFocused: false,\n      selectValue: [],\n      clearFocusValueOnUpdate: false,\n      prevWasFocused: false,\n      inputIsHiddenAfterUpdate: undefined,\n      prevProps: undefined\n    };\n    _this.blockOptionHover = false;\n    _this.isComposing = false;\n    _this.commonProps = void 0;\n    _this.initialTouchX = 0;\n    _this.initialTouchY = 0;\n    _this.instancePrefix = '';\n    _this.openAfterFocus = false;\n    _this.scrollToFocusedOptionOnUpdate = false;\n    _this.userIsDragging = void 0;\n    _this.controlRef = null;\n\n    _this.getControlRef = function (ref) {\n      _this.controlRef = ref;\n    };\n\n    _this.focusedOptionRef = null;\n\n    _this.getFocusedOptionRef = function (ref) {\n      _this.focusedOptionRef = ref;\n    };\n\n    _this.menuListRef = null;\n\n    _this.getMenuListRef = function (ref) {\n      _this.menuListRef = ref;\n    };\n\n    _this.inputRef = null;\n\n    _this.getInputRef = function (ref) {\n      _this.inputRef = ref;\n    };\n\n    _this.focus = _this.focusInput;\n    _this.blur = _this.blurInput;\n\n    _this.onChange = function (newValue, actionMeta) {\n      var _this$props = _this.props,\n          onChange = _this$props.onChange,\n          name = _this$props.name;\n      actionMeta.name = name;\n\n      _this.ariaOnChange(newValue, actionMeta);\n\n      onChange(newValue, actionMeta);\n    };\n\n    _this.setValue = function (newValue, action, option) {\n      var _this$props2 = _this.props,\n          closeMenuOnSelect = _this$props2.closeMenuOnSelect,\n          isMulti = _this$props2.isMulti,\n          inputValue = _this$props2.inputValue;\n\n      _this.onInputChange('', {\n        action: 'set-value',\n        prevInputValue: inputValue\n      });\n\n      if (closeMenuOnSelect) {\n        _this.setState({\n          inputIsHiddenAfterUpdate: !isMulti\n        });\n\n        _this.onMenuClose();\n      } // when the select value should change, we should reset focusedValue\n\n\n      _this.setState({\n        clearFocusValueOnUpdate: true\n      });\n\n      _this.onChange(newValue, {\n        action: action,\n        option: option\n      });\n    };\n\n    _this.selectOption = function (newValue) {\n      var _this$props3 = _this.props,\n          blurInputOnSelect = _this$props3.blurInputOnSelect,\n          isMulti = _this$props3.isMulti,\n          name = _this$props3.name;\n      var selectValue = _this.state.selectValue;\n\n      var deselected = isMulti && _this.isOptionSelected(newValue, selectValue);\n\n      var isDisabled = _this.isOptionDisabled(newValue, selectValue);\n\n      if (deselected) {\n        var candidate = _this.getOptionValue(newValue);\n\n        _this.setValue(multiValueAsValue(selectValue.filter(function (i) {\n          return _this.getOptionValue(i) !== candidate;\n        })), 'deselect-option', newValue);\n      } else if (!isDisabled) {\n        // Select option if option is not disabled\n        if (isMulti) {\n          _this.setValue(multiValueAsValue([].concat(_toConsumableArray(selectValue), [newValue])), 'select-option', newValue);\n        } else {\n          _this.setValue(singleValueAsValue(newValue), 'select-option');\n        }\n      } else {\n        _this.ariaOnChange(singleValueAsValue(newValue), {\n          action: 'select-option',\n          option: newValue,\n          name: name\n        });\n\n        return;\n      }\n\n      if (blurInputOnSelect) {\n        _this.blurInput();\n      }\n    };\n\n    _this.removeValue = function (removedValue) {\n      var isMulti = _this.props.isMulti;\n      var selectValue = _this.state.selectValue;\n\n      var candidate = _this.getOptionValue(removedValue);\n\n      var newValueArray = selectValue.filter(function (i) {\n        return _this.getOptionValue(i) !== candidate;\n      });\n      var newValue = valueTernary(isMulti, newValueArray, newValueArray[0] || null);\n\n      _this.onChange(newValue, {\n        action: 'remove-value',\n        removedValue: removedValue\n      });\n\n      _this.focusInput();\n    };\n\n    _this.clearValue = function () {\n      var selectValue = _this.state.selectValue;\n\n      _this.onChange(valueTernary(_this.props.isMulti, [], null), {\n        action: 'clear',\n        removedValues: selectValue\n      });\n    };\n\n    _this.popValue = function () {\n      var isMulti = _this.props.isMulti;\n      var selectValue = _this.state.selectValue;\n      var lastSelectedValue = selectValue[selectValue.length - 1];\n      var newValueArray = selectValue.slice(0, selectValue.length - 1);\n      var newValue = valueTernary(isMulti, newValueArray, newValueArray[0] || null);\n\n      _this.onChange(newValue, {\n        action: 'pop-value',\n        removedValue: lastSelectedValue\n      });\n    };\n\n    _this.getValue = function () {\n      return _this.state.selectValue;\n    };\n\n    _this.cx = function () {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return classNames.apply(void 0, [_this.props.classNamePrefix].concat(args));\n    };\n\n    _this.getOptionLabel = function (data) {\n      return getOptionLabel(_this.props, data);\n    };\n\n    _this.getOptionValue = function (data) {\n      return getOptionValue(_this.props, data);\n    };\n\n    _this.getStyles = function (key, props) {\n      var base = defaultStyles[key](props);\n      base.boxSizing = 'border-box';\n      var custom = _this.props.styles[key];\n      return custom ? custom(base, props) : base;\n    };\n\n    _this.getElementId = function (element) {\n      return \"\".concat(_this.instancePrefix, \"-\").concat(element);\n    };\n\n    _this.getComponents = function () {\n      return defaultComponents(_this.props);\n    };\n\n    _this.buildCategorizedOptions = function () {\n      return buildCategorizedOptions(_this.props, _this.state.selectValue);\n    };\n\n    _this.getCategorizedOptions = function () {\n      return _this.props.menuIsOpen ? _this.buildCategorizedOptions() : [];\n    };\n\n    _this.buildFocusableOptions = function () {\n      return buildFocusableOptionsFromCategorizedOptions(_this.buildCategorizedOptions());\n    };\n\n    _this.getFocusableOptions = function () {\n      return _this.props.menuIsOpen ? _this.buildFocusableOptions() : [];\n    };\n\n    _this.ariaOnChange = function (value, actionMeta) {\n      _this.setState({\n        ariaSelection: _objectSpread2({\n          value: value\n        }, actionMeta)\n      });\n    };\n\n    _this.onMenuMouseDown = function (event) {\n      if (event.button !== 0) {\n        return;\n      }\n\n      event.stopPropagation();\n      event.preventDefault();\n\n      _this.focusInput();\n    };\n\n    _this.onMenuMouseMove = function (event) {\n      _this.blockOptionHover = false;\n    };\n\n    _this.onControlMouseDown = function (event) {\n      // Event captured by dropdown indicator\n      if (event.defaultPrevented) {\n        return;\n      }\n\n      var openMenuOnClick = _this.props.openMenuOnClick;\n\n      if (!_this.state.isFocused) {\n        if (openMenuOnClick) {\n          _this.openAfterFocus = true;\n        }\n\n        _this.focusInput();\n      } else if (!_this.props.menuIsOpen) {\n        if (openMenuOnClick) {\n          _this.openMenu('first');\n        }\n      } else {\n        if (event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {\n          _this.onMenuClose();\n        }\n      }\n\n      if (event.target.tagName !== 'INPUT' && event.target.tagName !== 'TEXTAREA') {\n        event.preventDefault();\n      }\n    };\n\n    _this.onDropdownIndicatorMouseDown = function (event) {\n      // ignore mouse events that weren't triggered by the primary button\n      if (event && event.type === 'mousedown' && event.button !== 0) {\n        return;\n      }\n\n      if (_this.props.isDisabled) return;\n      var _this$props4 = _this.props,\n          isMulti = _this$props4.isMulti,\n          menuIsOpen = _this$props4.menuIsOpen;\n\n      _this.focusInput();\n\n      if (menuIsOpen) {\n        _this.setState({\n          inputIsHiddenAfterUpdate: !isMulti\n        });\n\n        _this.onMenuClose();\n      } else {\n        _this.openMenu('first');\n      }\n\n      event.preventDefault();\n    };\n\n    _this.onClearIndicatorMouseDown = function (event) {\n      // ignore mouse events that weren't triggered by the primary button\n      if (event && event.type === 'mousedown' && event.button !== 0) {\n        return;\n      }\n\n      _this.clearValue();\n\n      event.preventDefault();\n      _this.openAfterFocus = false;\n\n      if (event.type === 'touchend') {\n        _this.focusInput();\n      } else {\n        setTimeout(function () {\n          return _this.focusInput();\n        });\n      }\n    };\n\n    _this.onScroll = function (event) {\n      if (typeof _this.props.closeMenuOnScroll === 'boolean') {\n        if (event.target instanceof HTMLElement && isDocumentElement(event.target)) {\n          _this.props.onMenuClose();\n        }\n      } else if (typeof _this.props.closeMenuOnScroll === 'function') {\n        if (_this.props.closeMenuOnScroll(event)) {\n          _this.props.onMenuClose();\n        }\n      }\n    };\n\n    _this.onCompositionStart = function () {\n      _this.isComposing = true;\n    };\n\n    _this.onCompositionEnd = function () {\n      _this.isComposing = false;\n    };\n\n    _this.onTouchStart = function (_ref2) {\n      var touches = _ref2.touches;\n      var touch = touches && touches.item(0);\n\n      if (!touch) {\n        return;\n      }\n\n      _this.initialTouchX = touch.clientX;\n      _this.initialTouchY = touch.clientY;\n      _this.userIsDragging = false;\n    };\n\n    _this.onTouchMove = function (_ref3) {\n      var touches = _ref3.touches;\n      var touch = touches && touches.item(0);\n\n      if (!touch) {\n        return;\n      }\n\n      var deltaX = Math.abs(touch.clientX - _this.initialTouchX);\n      var deltaY = Math.abs(touch.clientY - _this.initialTouchY);\n      var moveThreshold = 5;\n      _this.userIsDragging = deltaX > moveThreshold || deltaY > moveThreshold;\n    };\n\n    _this.onTouchEnd = function (event) {\n      if (_this.userIsDragging) return; // close the menu if the user taps outside\n      // we're checking on event.target here instead of event.currentTarget, because we want to assert information\n      // on events on child elements, not the document (which we've attached this handler to).\n\n      if (_this.controlRef && !_this.controlRef.contains(event.target) && _this.menuListRef && !_this.menuListRef.contains(event.target)) {\n        _this.blurInput();\n      } // reset move vars\n\n\n      _this.initialTouchX = 0;\n      _this.initialTouchY = 0;\n    };\n\n    _this.onControlTouchEnd = function (event) {\n      if (_this.userIsDragging) return;\n\n      _this.onControlMouseDown(event);\n    };\n\n    _this.onClearIndicatorTouchEnd = function (event) {\n      if (_this.userIsDragging) return;\n\n      _this.onClearIndicatorMouseDown(event);\n    };\n\n    _this.onDropdownIndicatorTouchEnd = function (event) {\n      if (_this.userIsDragging) return;\n\n      _this.onDropdownIndicatorMouseDown(event);\n    };\n\n    _this.handleInputChange = function (event) {\n      var prevInputValue = _this.props.inputValue;\n      var inputValue = event.currentTarget.value;\n\n      _this.setState({\n        inputIsHiddenAfterUpdate: false\n      });\n\n      _this.onInputChange(inputValue, {\n        action: 'input-change',\n        prevInputValue: prevInputValue\n      });\n\n      if (!_this.props.menuIsOpen) {\n        _this.onMenuOpen();\n      }\n    };\n\n    _this.onInputFocus = function (event) {\n      if (_this.props.onFocus) {\n        _this.props.onFocus(event);\n      }\n\n      _this.setState({\n        inputIsHiddenAfterUpdate: false,\n        isFocused: true\n      });\n\n      if (_this.openAfterFocus || _this.props.openMenuOnFocus) {\n        _this.openMenu('first');\n      }\n\n      _this.openAfterFocus = false;\n    };\n\n    _this.onInputBlur = function (event) {\n      var prevInputValue = _this.props.inputValue;\n\n      if (_this.menuListRef && _this.menuListRef.contains(document.activeElement)) {\n        _this.inputRef.focus();\n\n        return;\n      }\n\n      if (_this.props.onBlur) {\n        _this.props.onBlur(event);\n      }\n\n      _this.onInputChange('', {\n        action: 'input-blur',\n        prevInputValue: prevInputValue\n      });\n\n      _this.onMenuClose();\n\n      _this.setState({\n        focusedValue: null,\n        isFocused: false\n      });\n    };\n\n    _this.onOptionHover = function (focusedOption) {\n      if (_this.blockOptionHover || _this.state.focusedOption === focusedOption) {\n        return;\n      }\n\n      _this.setState({\n        focusedOption: focusedOption\n      });\n    };\n\n    _this.shouldHideSelectedOptions = function () {\n      return shouldHideSelectedOptions(_this.props);\n    };\n\n    _this.onKeyDown = function (event) {\n      var _this$props5 = _this.props,\n          isMulti = _this$props5.isMulti,\n          backspaceRemovesValue = _this$props5.backspaceRemovesValue,\n          escapeClearsValue = _this$props5.escapeClearsValue,\n          inputValue = _this$props5.inputValue,\n          isClearable = _this$props5.isClearable,\n          isDisabled = _this$props5.isDisabled,\n          menuIsOpen = _this$props5.menuIsOpen,\n          onKeyDown = _this$props5.onKeyDown,\n          tabSelectsValue = _this$props5.tabSelectsValue,\n          openMenuOnFocus = _this$props5.openMenuOnFocus;\n      var _this$state = _this.state,\n          focusedOption = _this$state.focusedOption,\n          focusedValue = _this$state.focusedValue,\n          selectValue = _this$state.selectValue;\n      if (isDisabled) return;\n\n      if (typeof onKeyDown === 'function') {\n        onKeyDown(event);\n\n        if (event.defaultPrevented) {\n          return;\n        }\n      } // Block option hover events when the user has just pressed a key\n\n\n      _this.blockOptionHover = true;\n\n      switch (event.key) {\n        case 'ArrowLeft':\n          if (!isMulti || inputValue) return;\n\n          _this.focusValue('previous');\n\n          break;\n\n        case 'ArrowRight':\n          if (!isMulti || inputValue) return;\n\n          _this.focusValue('next');\n\n          break;\n\n        case 'Delete':\n        case 'Backspace':\n          if (inputValue) return;\n\n          if (focusedValue) {\n            _this.removeValue(focusedValue);\n          } else {\n            if (!backspaceRemovesValue) return;\n\n            if (isMulti) {\n              _this.popValue();\n            } else if (isClearable) {\n              _this.clearValue();\n            }\n          }\n\n          break;\n\n        case 'Tab':\n          if (_this.isComposing) return;\n\n          if (event.shiftKey || !menuIsOpen || !tabSelectsValue || !focusedOption || // don't capture the event if the menu opens on focus and the focused\n          // option is already selected; it breaks the flow of navigation\n          openMenuOnFocus && _this.isOptionSelected(focusedOption, selectValue)) {\n            return;\n          }\n\n          _this.selectOption(focusedOption);\n\n          break;\n\n        case 'Enter':\n          if (event.keyCode === 229) {\n            // ignore the keydown event from an Input Method Editor(IME)\n            // ref. https://www.w3.org/TR/uievents/#determine-keydown-keyup-keyCode\n            break;\n          }\n\n          if (menuIsOpen) {\n            if (!focusedOption) return;\n            if (_this.isComposing) return;\n\n            _this.selectOption(focusedOption);\n\n            break;\n          }\n\n          return;\n\n        case 'Escape':\n          if (menuIsOpen) {\n            _this.setState({\n              inputIsHiddenAfterUpdate: false\n            });\n\n            _this.onInputChange('', {\n              action: 'menu-close',\n              prevInputValue: inputValue\n            });\n\n            _this.onMenuClose();\n          } else if (isClearable && escapeClearsValue) {\n            _this.clearValue();\n          }\n\n          break;\n\n        case ' ':\n          // space\n          if (inputValue) {\n            return;\n          }\n\n          if (!menuIsOpen) {\n            _this.openMenu('first');\n\n            break;\n          }\n\n          if (!focusedOption) return;\n\n          _this.selectOption(focusedOption);\n\n          break;\n\n        case 'ArrowUp':\n          if (menuIsOpen) {\n            _this.focusOption('up');\n          } else {\n            _this.openMenu('last');\n          }\n\n          break;\n\n        case 'ArrowDown':\n          if (menuIsOpen) {\n            _this.focusOption('down');\n          } else {\n            _this.openMenu('first');\n          }\n\n          break;\n\n        case 'PageUp':\n          if (!menuIsOpen) return;\n\n          _this.focusOption('pageup');\n\n          break;\n\n        case 'PageDown':\n          if (!menuIsOpen) return;\n\n          _this.focusOption('pagedown');\n\n          break;\n\n        case 'Home':\n          if (!menuIsOpen) return;\n\n          _this.focusOption('first');\n\n          break;\n\n        case 'End':\n          if (!menuIsOpen) return;\n\n          _this.focusOption('last');\n\n          break;\n\n        default:\n          return;\n      }\n\n      event.preventDefault();\n    };\n\n    _this.instancePrefix = 'react-select-' + (_this.props.instanceId || ++instanceId);\n    _this.state.selectValue = cleanValue(_props.value);\n    return _this;\n  }\n\n  _createClass(Select, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.startListeningComposition();\n      this.startListeningToTouch();\n\n      if (this.props.closeMenuOnScroll && document && document.addEventListener) {\n        // Listen to all scroll events, and filter them out inside of 'onScroll'\n        document.addEventListener('scroll', this.onScroll, true);\n      }\n\n      if (this.props.autoFocus) {\n        this.focusInput();\n      }\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps) {\n      var _this$props6 = this.props,\n          isDisabled = _this$props6.isDisabled,\n          menuIsOpen = _this$props6.menuIsOpen;\n      var isFocused = this.state.isFocused;\n\n      if ( // ensure focus is restored correctly when the control becomes enabled\n      isFocused && !isDisabled && prevProps.isDisabled || // ensure focus is on the Input when the menu opens\n      isFocused && menuIsOpen && !prevProps.menuIsOpen) {\n        this.focusInput();\n      }\n\n      if (isFocused && isDisabled && !prevProps.isDisabled) {\n        // ensure select state gets blurred in case Select is programmatically disabled while focused\n        // eslint-disable-next-line react/no-did-update-set-state\n        this.setState({\n          isFocused: false\n        }, this.onMenuClose);\n      } // scroll the focused option into view if necessary\n\n\n      if (this.menuListRef && this.focusedOptionRef && this.scrollToFocusedOptionOnUpdate) {\n        scrollIntoView(this.menuListRef, this.focusedOptionRef);\n        this.scrollToFocusedOptionOnUpdate = false;\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.stopListeningComposition();\n      this.stopListeningToTouch();\n      document.removeEventListener('scroll', this.onScroll, true);\n    } // ==============================\n    // Consumer Handlers\n    // ==============================\n\n  }, {\n    key: \"onMenuOpen\",\n    value: function onMenuOpen() {\n      this.props.onMenuOpen();\n    }\n  }, {\n    key: \"onMenuClose\",\n    value: function onMenuClose() {\n      this.onInputChange('', {\n        action: 'menu-close',\n        prevInputValue: this.props.inputValue\n      });\n      this.props.onMenuClose();\n    }\n  }, {\n    key: \"onInputChange\",\n    value: function onInputChange(newValue, actionMeta) {\n      this.props.onInputChange(newValue, actionMeta);\n    } // ==============================\n    // Methods\n    // ==============================\n\n  }, {\n    key: \"focusInput\",\n    value: function focusInput() {\n      if (!this.inputRef) return;\n      this.inputRef.focus();\n    }\n  }, {\n    key: \"blurInput\",\n    value: function blurInput() {\n      if (!this.inputRef) return;\n      this.inputRef.blur();\n    } // aliased for consumers\n\n  }, {\n    key: \"openMenu\",\n    value: function openMenu(focusOption) {\n      var _this2 = this;\n\n      var _this$state2 = this.state,\n          selectValue = _this$state2.selectValue,\n          isFocused = _this$state2.isFocused;\n      var focusableOptions = this.buildFocusableOptions();\n      var openAtIndex = focusOption === 'first' ? 0 : focusableOptions.length - 1;\n\n      if (!this.props.isMulti) {\n        var selectedIndex = focusableOptions.indexOf(selectValue[0]);\n\n        if (selectedIndex > -1) {\n          openAtIndex = selectedIndex;\n        }\n      } // only scroll if the menu isn't already open\n\n\n      this.scrollToFocusedOptionOnUpdate = !(isFocused && this.menuListRef);\n      this.setState({\n        inputIsHiddenAfterUpdate: false,\n        focusedValue: null,\n        focusedOption: focusableOptions[openAtIndex]\n      }, function () {\n        return _this2.onMenuOpen();\n      });\n    }\n  }, {\n    key: \"focusValue\",\n    value: function focusValue(direction) {\n      var _this$state3 = this.state,\n          selectValue = _this$state3.selectValue,\n          focusedValue = _this$state3.focusedValue; // Only multiselects support value focusing\n\n      if (!this.props.isMulti) return;\n      this.setState({\n        focusedOption: null\n      });\n      var focusedIndex = selectValue.indexOf(focusedValue);\n\n      if (!focusedValue) {\n        focusedIndex = -1;\n      }\n\n      var lastIndex = selectValue.length - 1;\n      var nextFocus = -1;\n      if (!selectValue.length) return;\n\n      switch (direction) {\n        case 'previous':\n          if (focusedIndex === 0) {\n            // don't cycle from the start to the end\n            nextFocus = 0;\n          } else if (focusedIndex === -1) {\n            // if nothing is focused, focus the last value first\n            nextFocus = lastIndex;\n          } else {\n            nextFocus = focusedIndex - 1;\n          }\n\n          break;\n\n        case 'next':\n          if (focusedIndex > -1 && focusedIndex < lastIndex) {\n            nextFocus = focusedIndex + 1;\n          }\n\n          break;\n      }\n\n      this.setState({\n        inputIsHidden: nextFocus !== -1,\n        focusedValue: selectValue[nextFocus]\n      });\n    }\n  }, {\n    key: \"focusOption\",\n    value: function focusOption() {\n      var direction = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'first';\n      var pageSize = this.props.pageSize;\n      var focusedOption = this.state.focusedOption;\n      var options = this.getFocusableOptions();\n      if (!options.length) return;\n      var nextFocus = 0; // handles 'first'\n\n      var focusedIndex = options.indexOf(focusedOption);\n\n      if (!focusedOption) {\n        focusedIndex = -1;\n      }\n\n      if (direction === 'up') {\n        nextFocus = focusedIndex > 0 ? focusedIndex - 1 : options.length - 1;\n      } else if (direction === 'down') {\n        nextFocus = (focusedIndex + 1) % options.length;\n      } else if (direction === 'pageup') {\n        nextFocus = focusedIndex - pageSize;\n        if (nextFocus < 0) nextFocus = 0;\n      } else if (direction === 'pagedown') {\n        nextFocus = focusedIndex + pageSize;\n        if (nextFocus > options.length - 1) nextFocus = options.length - 1;\n      } else if (direction === 'last') {\n        nextFocus = options.length - 1;\n      }\n\n      this.scrollToFocusedOptionOnUpdate = true;\n      this.setState({\n        focusedOption: options[nextFocus],\n        focusedValue: null\n      });\n    }\n  }, {\n    key: \"getTheme\",\n    value: // ==============================\n    // Getters\n    // ==============================\n    function getTheme() {\n      // Use the default theme if there are no customizations.\n      if (!this.props.theme) {\n        return defaultTheme;\n      } // If the theme prop is a function, assume the function\n      // knows how to merge the passed-in default theme with\n      // its own modifications.\n\n\n      if (typeof this.props.theme === 'function') {\n        return this.props.theme(defaultTheme);\n      } // Otherwise, if a plain theme object was passed in,\n      // overlay it with the default theme.\n\n\n      return _objectSpread2(_objectSpread2({}, defaultTheme), this.props.theme);\n    }\n  }, {\n    key: \"getCommonProps\",\n    value: function getCommonProps() {\n      var clearValue = this.clearValue,\n          cx = this.cx,\n          getStyles = this.getStyles,\n          getValue = this.getValue,\n          selectOption = this.selectOption,\n          setValue = this.setValue,\n          props = this.props;\n      var isMulti = props.isMulti,\n          isRtl = props.isRtl,\n          options = props.options;\n      var hasValue = this.hasValue();\n      return {\n        clearValue: clearValue,\n        cx: cx,\n        getStyles: getStyles,\n        getValue: getValue,\n        hasValue: hasValue,\n        isMulti: isMulti,\n        isRtl: isRtl,\n        options: options,\n        selectOption: selectOption,\n        selectProps: props,\n        setValue: setValue,\n        theme: this.getTheme()\n      };\n    }\n  }, {\n    key: \"hasValue\",\n    value: function hasValue() {\n      var selectValue = this.state.selectValue;\n      return selectValue.length > 0;\n    }\n  }, {\n    key: \"hasOptions\",\n    value: function hasOptions() {\n      return !!this.getFocusableOptions().length;\n    }\n  }, {\n    key: \"isClearable\",\n    value: function isClearable() {\n      var _this$props7 = this.props,\n          isClearable = _this$props7.isClearable,\n          isMulti = _this$props7.isMulti; // single select, by default, IS NOT clearable\n      // multi select, by default, IS clearable\n\n      if (isClearable === undefined) return isMulti;\n      return isClearable;\n    }\n  }, {\n    key: \"isOptionDisabled\",\n    value: function isOptionDisabled(option, selectValue) {\n      return _isOptionDisabled(this.props, option, selectValue);\n    }\n  }, {\n    key: \"isOptionSelected\",\n    value: function isOptionSelected(option, selectValue) {\n      return _isOptionSelected(this.props, option, selectValue);\n    }\n  }, {\n    key: \"filterOption\",\n    value: function filterOption(option, inputValue) {\n      return _filterOption(this.props, option, inputValue);\n    }\n  }, {\n    key: \"formatOptionLabel\",\n    value: function formatOptionLabel(data, context) {\n      if (typeof this.props.formatOptionLabel === 'function') {\n        var _inputValue = this.props.inputValue;\n        var _selectValue = this.state.selectValue;\n        return this.props.formatOptionLabel(data, {\n          context: context,\n          inputValue: _inputValue,\n          selectValue: _selectValue\n        });\n      } else {\n        return this.getOptionLabel(data);\n      }\n    }\n  }, {\n    key: \"formatGroupLabel\",\n    value: function formatGroupLabel(data) {\n      return this.props.formatGroupLabel(data);\n    } // ==============================\n    // Mouse Handlers\n    // ==============================\n\n  }, {\n    key: \"startListeningComposition\",\n    value: // ==============================\n    // Composition Handlers\n    // ==============================\n    function startListeningComposition() {\n      if (document && document.addEventListener) {\n        document.addEventListener('compositionstart', this.onCompositionStart, false);\n        document.addEventListener('compositionend', this.onCompositionEnd, false);\n      }\n    }\n  }, {\n    key: \"stopListeningComposition\",\n    value: function stopListeningComposition() {\n      if (document && document.removeEventListener) {\n        document.removeEventListener('compositionstart', this.onCompositionStart);\n        document.removeEventListener('compositionend', this.onCompositionEnd);\n      }\n    }\n  }, {\n    key: \"startListeningToTouch\",\n    value: // ==============================\n    // Touch Handlers\n    // ==============================\n    function startListeningToTouch() {\n      if (document && document.addEventListener) {\n        document.addEventListener('touchstart', this.onTouchStart, false);\n        document.addEventListener('touchmove', this.onTouchMove, false);\n        document.addEventListener('touchend', this.onTouchEnd, false);\n      }\n    }\n  }, {\n    key: \"stopListeningToTouch\",\n    value: function stopListeningToTouch() {\n      if (document && document.removeEventListener) {\n        document.removeEventListener('touchstart', this.onTouchStart);\n        document.removeEventListener('touchmove', this.onTouchMove);\n        document.removeEventListener('touchend', this.onTouchEnd);\n      }\n    }\n  }, {\n    key: \"renderInput\",\n    value: // ==============================\n    // Renderers\n    // ==============================\n    function renderInput() {\n      var _this$props8 = this.props,\n          isDisabled = _this$props8.isDisabled,\n          isSearchable = _this$props8.isSearchable,\n          inputId = _this$props8.inputId,\n          inputValue = _this$props8.inputValue,\n          tabIndex = _this$props8.tabIndex,\n          form = _this$props8.form,\n          menuIsOpen = _this$props8.menuIsOpen;\n\n      var _this$getComponents = this.getComponents(),\n          Input = _this$getComponents.Input;\n\n      var _this$state4 = this.state,\n          inputIsHidden = _this$state4.inputIsHidden,\n          ariaSelection = _this$state4.ariaSelection;\n      var commonProps = this.commonProps;\n      var id = inputId || this.getElementId('input'); // aria attributes makes the JSX \"noisy\", separated for clarity\n\n      var ariaAttributes = _objectSpread2(_objectSpread2(_objectSpread2({\n        'aria-autocomplete': 'list',\n        'aria-expanded': menuIsOpen,\n        'aria-haspopup': true,\n        'aria-errormessage': this.props['aria-errormessage'],\n        'aria-invalid': this.props['aria-invalid'],\n        'aria-label': this.props['aria-label'],\n        'aria-labelledby': this.props['aria-labelledby'],\n        role: 'combobox'\n      }, menuIsOpen && {\n        'aria-controls': this.getElementId('listbox'),\n        'aria-owns': this.getElementId('listbox')\n      }), !isSearchable && {\n        'aria-readonly': true\n      }), this.hasValue() ? (ariaSelection === null || ariaSelection === void 0 ? void 0 : ariaSelection.action) === 'initial-input-focus' && {\n        'aria-describedby': this.getElementId('live-region')\n      } : {\n        'aria-describedby': this.getElementId('placeholder')\n      });\n\n      if (!isSearchable) {\n        // use a dummy input to maintain focus/blur functionality\n        return /*#__PURE__*/React.createElement(DummyInput, _extends({\n          id: id,\n          innerRef: this.getInputRef,\n          onBlur: this.onInputBlur,\n          onChange: noop,\n          onFocus: this.onInputFocus,\n          disabled: isDisabled,\n          tabIndex: tabIndex,\n          inputMode: \"none\",\n          form: form,\n          value: \"\"\n        }, ariaAttributes));\n      }\n\n      return /*#__PURE__*/React.createElement(Input, _extends({}, commonProps, {\n        autoCapitalize: \"none\",\n        autoComplete: \"off\",\n        autoCorrect: \"off\",\n        id: id,\n        innerRef: this.getInputRef,\n        isDisabled: isDisabled,\n        isHidden: inputIsHidden,\n        onBlur: this.onInputBlur,\n        onChange: this.handleInputChange,\n        onFocus: this.onInputFocus,\n        spellCheck: \"false\",\n        tabIndex: tabIndex,\n        form: form,\n        type: \"text\",\n        value: inputValue\n      }, ariaAttributes));\n    }\n  }, {\n    key: \"renderPlaceholderOrValue\",\n    value: function renderPlaceholderOrValue() {\n      var _this3 = this;\n\n      var _this$getComponents2 = this.getComponents(),\n          MultiValue = _this$getComponents2.MultiValue,\n          MultiValueContainer = _this$getComponents2.MultiValueContainer,\n          MultiValueLabel = _this$getComponents2.MultiValueLabel,\n          MultiValueRemove = _this$getComponents2.MultiValueRemove,\n          SingleValue = _this$getComponents2.SingleValue,\n          Placeholder = _this$getComponents2.Placeholder;\n\n      var commonProps = this.commonProps;\n      var _this$props9 = this.props,\n          controlShouldRenderValue = _this$props9.controlShouldRenderValue,\n          isDisabled = _this$props9.isDisabled,\n          isMulti = _this$props9.isMulti,\n          inputValue = _this$props9.inputValue,\n          placeholder = _this$props9.placeholder;\n      var _this$state5 = this.state,\n          selectValue = _this$state5.selectValue,\n          focusedValue = _this$state5.focusedValue,\n          isFocused = _this$state5.isFocused;\n\n      if (!this.hasValue() || !controlShouldRenderValue) {\n        return inputValue ? null : /*#__PURE__*/React.createElement(Placeholder, _extends({}, commonProps, {\n          key: \"placeholder\",\n          isDisabled: isDisabled,\n          isFocused: isFocused,\n          innerProps: {\n            id: this.getElementId('placeholder')\n          }\n        }), placeholder);\n      }\n\n      if (isMulti) {\n        return selectValue.map(function (opt, index) {\n          var isOptionFocused = opt === focusedValue;\n          var key = \"\".concat(_this3.getOptionLabel(opt), \"-\").concat(_this3.getOptionValue(opt));\n          return /*#__PURE__*/React.createElement(MultiValue, _extends({}, commonProps, {\n            components: {\n              Container: MultiValueContainer,\n              Label: MultiValueLabel,\n              Remove: MultiValueRemove\n            },\n            isFocused: isOptionFocused,\n            isDisabled: isDisabled,\n            key: key,\n            index: index,\n            removeProps: {\n              onClick: function onClick() {\n                return _this3.removeValue(opt);\n              },\n              onTouchEnd: function onTouchEnd() {\n                return _this3.removeValue(opt);\n              },\n              onMouseDown: function onMouseDown(e) {\n                e.preventDefault();\n              }\n            },\n            data: opt\n          }), _this3.formatOptionLabel(opt, 'value'));\n        });\n      }\n\n      if (inputValue) {\n        return null;\n      }\n\n      var singleValue = selectValue[0];\n      return /*#__PURE__*/React.createElement(SingleValue, _extends({}, commonProps, {\n        data: singleValue,\n        isDisabled: isDisabled\n      }), this.formatOptionLabel(singleValue, 'value'));\n    }\n  }, {\n    key: \"renderClearIndicator\",\n    value: function renderClearIndicator() {\n      var _this$getComponents3 = this.getComponents(),\n          ClearIndicator = _this$getComponents3.ClearIndicator;\n\n      var commonProps = this.commonProps;\n      var _this$props10 = this.props,\n          isDisabled = _this$props10.isDisabled,\n          isLoading = _this$props10.isLoading;\n      var isFocused = this.state.isFocused;\n\n      if (!this.isClearable() || !ClearIndicator || isDisabled || !this.hasValue() || isLoading) {\n        return null;\n      }\n\n      var innerProps = {\n        onMouseDown: this.onClearIndicatorMouseDown,\n        onTouchEnd: this.onClearIndicatorTouchEnd,\n        'aria-hidden': 'true'\n      };\n      return /*#__PURE__*/React.createElement(ClearIndicator, _extends({}, commonProps, {\n        innerProps: innerProps,\n        isFocused: isFocused\n      }));\n    }\n  }, {\n    key: \"renderLoadingIndicator\",\n    value: function renderLoadingIndicator() {\n      var _this$getComponents4 = this.getComponents(),\n          LoadingIndicator = _this$getComponents4.LoadingIndicator;\n\n      var commonProps = this.commonProps;\n      var _this$props11 = this.props,\n          isDisabled = _this$props11.isDisabled,\n          isLoading = _this$props11.isLoading;\n      var isFocused = this.state.isFocused;\n      if (!LoadingIndicator || !isLoading) return null;\n      var innerProps = {\n        'aria-hidden': 'true'\n      };\n      return /*#__PURE__*/React.createElement(LoadingIndicator, _extends({}, commonProps, {\n        innerProps: innerProps,\n        isDisabled: isDisabled,\n        isFocused: isFocused\n      }));\n    }\n  }, {\n    key: \"renderIndicatorSeparator\",\n    value: function renderIndicatorSeparator() {\n      var _this$getComponents5 = this.getComponents(),\n          DropdownIndicator = _this$getComponents5.DropdownIndicator,\n          IndicatorSeparator = _this$getComponents5.IndicatorSeparator; // separator doesn't make sense without the dropdown indicator\n\n\n      if (!DropdownIndicator || !IndicatorSeparator) return null;\n      var commonProps = this.commonProps;\n      var isDisabled = this.props.isDisabled;\n      var isFocused = this.state.isFocused;\n      return /*#__PURE__*/React.createElement(IndicatorSeparator, _extends({}, commonProps, {\n        isDisabled: isDisabled,\n        isFocused: isFocused\n      }));\n    }\n  }, {\n    key: \"renderDropdownIndicator\",\n    value: function renderDropdownIndicator() {\n      var _this$getComponents6 = this.getComponents(),\n          DropdownIndicator = _this$getComponents6.DropdownIndicator;\n\n      if (!DropdownIndicator) return null;\n      var commonProps = this.commonProps;\n      var isDisabled = this.props.isDisabled;\n      var isFocused = this.state.isFocused;\n      var innerProps = {\n        onMouseDown: this.onDropdownIndicatorMouseDown,\n        onTouchEnd: this.onDropdownIndicatorTouchEnd,\n        'aria-hidden': 'true'\n      };\n      return /*#__PURE__*/React.createElement(DropdownIndicator, _extends({}, commonProps, {\n        innerProps: innerProps,\n        isDisabled: isDisabled,\n        isFocused: isFocused\n      }));\n    }\n  }, {\n    key: \"renderMenu\",\n    value: function renderMenu() {\n      var _this4 = this;\n\n      var _this$getComponents7 = this.getComponents(),\n          Group = _this$getComponents7.Group,\n          GroupHeading = _this$getComponents7.GroupHeading,\n          Menu = _this$getComponents7.Menu,\n          MenuList = _this$getComponents7.MenuList,\n          MenuPortal = _this$getComponents7.MenuPortal,\n          LoadingMessage = _this$getComponents7.LoadingMessage,\n          NoOptionsMessage = _this$getComponents7.NoOptionsMessage,\n          Option = _this$getComponents7.Option;\n\n      var commonProps = this.commonProps;\n      var focusedOption = this.state.focusedOption;\n      var _this$props12 = this.props,\n          captureMenuScroll = _this$props12.captureMenuScroll,\n          inputValue = _this$props12.inputValue,\n          isLoading = _this$props12.isLoading,\n          loadingMessage = _this$props12.loadingMessage,\n          minMenuHeight = _this$props12.minMenuHeight,\n          maxMenuHeight = _this$props12.maxMenuHeight,\n          menuIsOpen = _this$props12.menuIsOpen,\n          menuPlacement = _this$props12.menuPlacement,\n          menuPosition = _this$props12.menuPosition,\n          menuPortalTarget = _this$props12.menuPortalTarget,\n          menuShouldBlockScroll = _this$props12.menuShouldBlockScroll,\n          menuShouldScrollIntoView = _this$props12.menuShouldScrollIntoView,\n          noOptionsMessage = _this$props12.noOptionsMessage,\n          onMenuScrollToTop = _this$props12.onMenuScrollToTop,\n          onMenuScrollToBottom = _this$props12.onMenuScrollToBottom;\n      if (!menuIsOpen) return null; // TODO: Internal Option Type here\n\n      var render = function render(props, id) {\n        var type = props.type,\n            data = props.data,\n            isDisabled = props.isDisabled,\n            isSelected = props.isSelected,\n            label = props.label,\n            value = props.value;\n        var isFocused = focusedOption === data;\n        var onHover = isDisabled ? undefined : function () {\n          return _this4.onOptionHover(data);\n        };\n        var onSelect = isDisabled ? undefined : function () {\n          return _this4.selectOption(data);\n        };\n        var optionId = \"\".concat(_this4.getElementId('option'), \"-\").concat(id);\n        var innerProps = {\n          id: optionId,\n          onClick: onSelect,\n          onMouseMove: onHover,\n          onMouseOver: onHover,\n          tabIndex: -1\n        };\n        return /*#__PURE__*/React.createElement(Option, _extends({}, commonProps, {\n          innerProps: innerProps,\n          data: data,\n          isDisabled: isDisabled,\n          isSelected: isSelected,\n          key: optionId,\n          label: label,\n          type: type,\n          value: value,\n          isFocused: isFocused,\n          innerRef: isFocused ? _this4.getFocusedOptionRef : undefined\n        }), _this4.formatOptionLabel(props.data, 'menu'));\n      };\n\n      var menuUI;\n\n      if (this.hasOptions()) {\n        menuUI = this.getCategorizedOptions().map(function (item) {\n          if (item.type === 'group') {\n            var _data = item.data,\n                options = item.options,\n                groupIndex = item.index;\n            var groupId = \"\".concat(_this4.getElementId('group'), \"-\").concat(groupIndex);\n            var headingId = \"\".concat(groupId, \"-heading\");\n            return /*#__PURE__*/React.createElement(Group, _extends({}, commonProps, {\n              key: groupId,\n              data: _data,\n              options: options,\n              Heading: GroupHeading,\n              headingProps: {\n                id: headingId,\n                data: item.data\n              },\n              label: _this4.formatGroupLabel(item.data)\n            }), item.options.map(function (option) {\n              return render(option, \"\".concat(groupIndex, \"-\").concat(option.index));\n            }));\n          } else if (item.type === 'option') {\n            return render(item, \"\".concat(item.index));\n          }\n        });\n      } else if (isLoading) {\n        var message = loadingMessage({\n          inputValue: inputValue\n        });\n        if (message === null) return null;\n        menuUI = /*#__PURE__*/React.createElement(LoadingMessage, commonProps, message);\n      } else {\n        var _message = noOptionsMessage({\n          inputValue: inputValue\n        });\n\n        if (_message === null) return null;\n        menuUI = /*#__PURE__*/React.createElement(NoOptionsMessage, commonProps, _message);\n      }\n\n      var menuPlacementProps = {\n        minMenuHeight: minMenuHeight,\n        maxMenuHeight: maxMenuHeight,\n        menuPlacement: menuPlacement,\n        menuPosition: menuPosition,\n        menuShouldScrollIntoView: menuShouldScrollIntoView\n      };\n      var menuElement = /*#__PURE__*/React.createElement(MenuPlacer, _extends({}, commonProps, menuPlacementProps), function (_ref4) {\n        var ref = _ref4.ref,\n            _ref4$placerProps = _ref4.placerProps,\n            placement = _ref4$placerProps.placement,\n            maxHeight = _ref4$placerProps.maxHeight;\n        return /*#__PURE__*/React.createElement(Menu, _extends({}, commonProps, menuPlacementProps, {\n          innerRef: ref,\n          innerProps: {\n            onMouseDown: _this4.onMenuMouseDown,\n            onMouseMove: _this4.onMenuMouseMove,\n            id: _this4.getElementId('listbox')\n          },\n          isLoading: isLoading,\n          placement: placement\n        }), /*#__PURE__*/React.createElement(ScrollManager, {\n          captureEnabled: captureMenuScroll,\n          onTopArrive: onMenuScrollToTop,\n          onBottomArrive: onMenuScrollToBottom,\n          lockEnabled: menuShouldBlockScroll\n        }, function (scrollTargetRef) {\n          return /*#__PURE__*/React.createElement(MenuList, _extends({}, commonProps, {\n            innerRef: function innerRef(instance) {\n              _this4.getMenuListRef(instance);\n\n              scrollTargetRef(instance);\n            },\n            isLoading: isLoading,\n            maxHeight: maxHeight,\n            focusedOption: focusedOption\n          }), menuUI);\n        }));\n      }); // positioning behaviour is almost identical for portalled and fixed,\n      // so we use the same component. the actual portalling logic is forked\n      // within the component based on `menuPosition`\n\n      return menuPortalTarget || menuPosition === 'fixed' ? /*#__PURE__*/React.createElement(MenuPortal, _extends({}, commonProps, {\n        appendTo: menuPortalTarget,\n        controlElement: this.controlRef,\n        menuPlacement: menuPlacement,\n        menuPosition: menuPosition\n      }), menuElement) : menuElement;\n    }\n  }, {\n    key: \"renderFormField\",\n    value: function renderFormField() {\n      var _this5 = this;\n\n      var _this$props13 = this.props,\n          delimiter = _this$props13.delimiter,\n          isDisabled = _this$props13.isDisabled,\n          isMulti = _this$props13.isMulti,\n          name = _this$props13.name;\n      var selectValue = this.state.selectValue;\n      if (!name || isDisabled) return;\n\n      if (isMulti) {\n        if (delimiter) {\n          var value = selectValue.map(function (opt) {\n            return _this5.getOptionValue(opt);\n          }).join(delimiter);\n          return /*#__PURE__*/React.createElement(\"input\", {\n            name: name,\n            type: \"hidden\",\n            value: value\n          });\n        } else {\n          var input = selectValue.length > 0 ? selectValue.map(function (opt, i) {\n            return /*#__PURE__*/React.createElement(\"input\", {\n              key: \"i-\".concat(i),\n              name: name,\n              type: \"hidden\",\n              value: _this5.getOptionValue(opt)\n            });\n          }) : /*#__PURE__*/React.createElement(\"input\", {\n            name: name,\n            type: \"hidden\"\n          });\n          return /*#__PURE__*/React.createElement(\"div\", null, input);\n        }\n      } else {\n        var _value = selectValue[0] ? this.getOptionValue(selectValue[0]) : '';\n\n        return /*#__PURE__*/React.createElement(\"input\", {\n          name: name,\n          type: \"hidden\",\n          value: _value\n        });\n      }\n    }\n  }, {\n    key: \"renderLiveRegion\",\n    value: function renderLiveRegion() {\n      var commonProps = this.commonProps;\n      var _this$state6 = this.state,\n          ariaSelection = _this$state6.ariaSelection,\n          focusedOption = _this$state6.focusedOption,\n          focusedValue = _this$state6.focusedValue,\n          isFocused = _this$state6.isFocused,\n          selectValue = _this$state6.selectValue;\n      var focusableOptions = this.getFocusableOptions();\n      return /*#__PURE__*/React.createElement(LiveRegion, _extends({}, commonProps, {\n        id: this.getElementId('live-region'),\n        ariaSelection: ariaSelection,\n        focusedOption: focusedOption,\n        focusedValue: focusedValue,\n        isFocused: isFocused,\n        selectValue: selectValue,\n        focusableOptions: focusableOptions\n      }));\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this$getComponents8 = this.getComponents(),\n          Control = _this$getComponents8.Control,\n          IndicatorsContainer = _this$getComponents8.IndicatorsContainer,\n          SelectContainer = _this$getComponents8.SelectContainer,\n          ValueContainer = _this$getComponents8.ValueContainer;\n\n      var _this$props14 = this.props,\n          className = _this$props14.className,\n          id = _this$props14.id,\n          isDisabled = _this$props14.isDisabled,\n          menuIsOpen = _this$props14.menuIsOpen;\n      var isFocused = this.state.isFocused;\n      var commonProps = this.commonProps = this.getCommonProps();\n      return /*#__PURE__*/React.createElement(SelectContainer, _extends({}, commonProps, {\n        className: className,\n        innerProps: {\n          id: id,\n          onKeyDown: this.onKeyDown\n        },\n        isDisabled: isDisabled,\n        isFocused: isFocused\n      }), this.renderLiveRegion(), /*#__PURE__*/React.createElement(Control, _extends({}, commonProps, {\n        innerRef: this.getControlRef,\n        innerProps: {\n          onMouseDown: this.onControlMouseDown,\n          onTouchEnd: this.onControlTouchEnd\n        },\n        isDisabled: isDisabled,\n        isFocused: isFocused,\n        menuIsOpen: menuIsOpen\n      }), /*#__PURE__*/React.createElement(ValueContainer, _extends({}, commonProps, {\n        isDisabled: isDisabled\n      }), this.renderPlaceholderOrValue(), this.renderInput()), /*#__PURE__*/React.createElement(IndicatorsContainer, _extends({}, commonProps, {\n        isDisabled: isDisabled\n      }), this.renderClearIndicator(), this.renderLoadingIndicator(), this.renderIndicatorSeparator(), this.renderDropdownIndicator())), this.renderMenu(), this.renderFormField());\n    }\n  }], [{\n    key: \"getDerivedStateFromProps\",\n    value: function getDerivedStateFromProps(props, state) {\n      var prevProps = state.prevProps,\n          clearFocusValueOnUpdate = state.clearFocusValueOnUpdate,\n          inputIsHiddenAfterUpdate = state.inputIsHiddenAfterUpdate,\n          ariaSelection = state.ariaSelection,\n          isFocused = state.isFocused,\n          prevWasFocused = state.prevWasFocused;\n      var options = props.options,\n          value = props.value,\n          menuIsOpen = props.menuIsOpen,\n          inputValue = props.inputValue,\n          isMulti = props.isMulti;\n      var selectValue = cleanValue(value);\n      var newMenuOptionsState = {};\n\n      if (prevProps && (value !== prevProps.value || options !== prevProps.options || menuIsOpen !== prevProps.menuIsOpen || inputValue !== prevProps.inputValue)) {\n        var focusableOptions = menuIsOpen ? buildFocusableOptions(props, selectValue) : [];\n        var focusedValue = clearFocusValueOnUpdate ? getNextFocusedValue(state, selectValue) : null;\n        var focusedOption = getNextFocusedOption(state, focusableOptions);\n        newMenuOptionsState = {\n          selectValue: selectValue,\n          focusedOption: focusedOption,\n          focusedValue: focusedValue,\n          clearFocusValueOnUpdate: false\n        };\n      } // some updates should toggle the state of the input visibility\n\n\n      var newInputIsHiddenState = inputIsHiddenAfterUpdate != null && props !== prevProps ? {\n        inputIsHidden: inputIsHiddenAfterUpdate,\n        inputIsHiddenAfterUpdate: undefined\n      } : {};\n      var newAriaSelection = ariaSelection;\n      var hasKeptFocus = isFocused && prevWasFocused;\n\n      if (isFocused && !hasKeptFocus) {\n        // If `value` or `defaultValue` props are not empty then announce them\n        // when the Select is initially focused\n        newAriaSelection = {\n          value: valueTernary(isMulti, selectValue, selectValue[0] || null),\n          options: selectValue,\n          action: 'initial-input-focus'\n        };\n        hasKeptFocus = !prevWasFocused;\n      } // If the 'initial-input-focus' action has been set already\n      // then reset the ariaSelection to null\n\n\n      if ((ariaSelection === null || ariaSelection === void 0 ? void 0 : ariaSelection.action) === 'initial-input-focus') {\n        newAriaSelection = null;\n      }\n\n      return _objectSpread2(_objectSpread2(_objectSpread2({}, newMenuOptionsState), newInputIsHiddenState), {}, {\n        prevProps: props,\n        ariaSelection: newAriaSelection,\n        prevWasFocused: hasKeptFocus\n      });\n    }\n  }]);\n\n  return Select;\n}(Component);\n\nSelect.defaultProps = defaultProps;\n\nexport { Select as S, getOptionLabel$1 as a, defaultProps as b, createFilter as c, defaultTheme as d, getOptionValue$1 as g, mergeStyles as m };\n","import _extends from '@babel/runtime/helpers/esm/extends';\nimport { jsx, keyframes, css as css$2, ClassNames } from '@emotion/react';\nimport _taggedTemplateLiteral from '@babel/runtime/helpers/esm/taggedTemplateLiteral';\nimport _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';\nimport _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';\nimport _typeof from '@babel/runtime/helpers/esm/typeof';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport _defineProperty$1 from '@babel/runtime/helpers/esm/defineProperty';\nimport { Component, createContext } from 'react';\nimport { createPortal } from 'react-dom';\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nfunction _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return _assertThisInitialized(self);\n}\n\nfunction _createSuper(Derived) {\n  var hasNativeReflectConstruct = _isNativeReflectConstruct();\n  return function _createSuperInternal() {\n    var Super = _getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = _getPrototypeOf(this).constructor;\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return _possibleConstructorReturn(this, result);\n  };\n}\n\nvar _excluded$3 = [\"className\", \"clearValue\", \"cx\", \"getStyles\", \"getValue\", \"hasValue\", \"isMulti\", \"isRtl\", \"options\", \"selectOption\", \"selectProps\", \"setValue\", \"theme\"];\n// ==============================\n// NO OP\n// ==============================\nvar noop = function noop() {};\n// Class Name Prefixer\n// ==============================\n\n/**\n String representation of component state for styling with class names.\n\n Expects an array of strings OR a string/object pair:\n - className(['comp', 'comp-arg', 'comp-arg-2'])\n   @returns 'react-select__comp react-select__comp-arg react-select__comp-arg-2'\n - className('comp', { some: true, state: false })\n   @returns 'react-select__comp react-select__comp--some'\n*/\n\nfunction applyPrefixToName(prefix, name) {\n  if (!name) {\n    return prefix;\n  } else if (name[0] === '-') {\n    return prefix + name;\n  } else {\n    return prefix + '__' + name;\n  }\n}\n\nfunction classNames(prefix, state, className) {\n  var arr = [className];\n\n  if (state && prefix) {\n    for (var key in state) {\n      if (state.hasOwnProperty(key) && state[key]) {\n        arr.push(\"\".concat(applyPrefixToName(prefix, key)));\n      }\n    }\n  }\n\n  return arr.filter(function (i) {\n    return i;\n  }).map(function (i) {\n    return String(i).trim();\n  }).join(' ');\n} // ==============================\n// Clean Value\n// ==============================\n\nvar cleanValue = function cleanValue(value) {\n  if (isArray(value)) return value.filter(Boolean);\n  if (_typeof(value) === 'object' && value !== null) return [value];\n  return [];\n}; // ==============================\n// Clean Common Props\n// ==============================\n\nvar cleanCommonProps = function cleanCommonProps(props) {\n  //className\n  props.className;\n      props.clearValue;\n      props.cx;\n      props.getStyles;\n      props.getValue;\n      props.hasValue;\n      props.isMulti;\n      props.isRtl;\n      props.options;\n      props.selectOption;\n      props.selectProps;\n      props.setValue;\n      props.theme;\n      var innerProps = _objectWithoutProperties(props, _excluded$3);\n\n  return _objectSpread2({}, innerProps);\n}; // ==============================\n// Handle Input Change\n// ==============================\n\nfunction handleInputChange(inputValue, actionMeta, onInputChange) {\n  if (onInputChange) {\n    var _newValue = onInputChange(inputValue, actionMeta);\n\n    if (typeof _newValue === 'string') return _newValue;\n  }\n\n  return inputValue;\n} // ==============================\n// Scroll Helpers\n// ==============================\n\nfunction isDocumentElement(el) {\n  return [document.documentElement, document.body, window].indexOf(el) > -1;\n} // Normalized Scroll Top\n// ------------------------------\n\nfunction normalizedHeight(el) {\n  if (isDocumentElement(el)) {\n    return window.innerHeight;\n  }\n\n  return el.clientHeight;\n} // Normalized scrollTo & scrollTop\n// ------------------------------\n\nfunction getScrollTop(el) {\n  if (isDocumentElement(el)) {\n    return window.pageYOffset;\n  }\n\n  return el.scrollTop;\n}\nfunction scrollTo(el, top) {\n  // with a scroll distance, we perform scroll on the element\n  if (isDocumentElement(el)) {\n    window.scrollTo(0, top);\n    return;\n  }\n\n  el.scrollTop = top;\n} // Get Scroll Parent\n// ------------------------------\n\nfunction getScrollParent(element) {\n  var style = getComputedStyle(element);\n  var excludeStaticParent = style.position === 'absolute';\n  var overflowRx = /(auto|scroll)/;\n  if (style.position === 'fixed') return document.documentElement;\n\n  for (var parent = element; parent = parent.parentElement;) {\n    style = getComputedStyle(parent);\n\n    if (excludeStaticParent && style.position === 'static') {\n      continue;\n    }\n\n    if (overflowRx.test(style.overflow + style.overflowY + style.overflowX)) {\n      return parent;\n    }\n  }\n\n  return document.documentElement;\n} // Animated Scroll To\n// ------------------------------\n\n/**\n  @param t: time (elapsed)\n  @param b: initial value\n  @param c: amount of change\n  @param d: duration\n*/\n\nfunction easeOutCubic(t, b, c, d) {\n  return c * ((t = t / d - 1) * t * t + 1) + b;\n}\n\nfunction animatedScrollTo(element, to) {\n  var duration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 200;\n  var callback = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : noop;\n  var start = getScrollTop(element);\n  var change = to - start;\n  var increment = 10;\n  var currentTime = 0;\n\n  function animateScroll() {\n    currentTime += increment;\n    var val = easeOutCubic(currentTime, start, change, duration);\n    scrollTo(element, val);\n\n    if (currentTime < duration) {\n      window.requestAnimationFrame(animateScroll);\n    } else {\n      callback(element);\n    }\n  }\n\n  animateScroll();\n} // Scroll Into View\n// ------------------------------\n\nfunction scrollIntoView(menuEl, focusedEl) {\n  var menuRect = menuEl.getBoundingClientRect();\n  var focusedRect = focusedEl.getBoundingClientRect();\n  var overScroll = focusedEl.offsetHeight / 3;\n\n  if (focusedRect.bottom + overScroll > menuRect.bottom) {\n    scrollTo(menuEl, Math.min(focusedEl.offsetTop + focusedEl.clientHeight - menuEl.offsetHeight + overScroll, menuEl.scrollHeight));\n  } else if (focusedRect.top - overScroll < menuRect.top) {\n    scrollTo(menuEl, Math.max(focusedEl.offsetTop - overScroll, 0));\n  }\n} // ==============================\n// Get bounding client object\n// ==============================\n// cannot get keys using array notation with DOMRect\n\nfunction getBoundingClientObj(element) {\n  var rect = element.getBoundingClientRect();\n  return {\n    bottom: rect.bottom,\n    height: rect.height,\n    left: rect.left,\n    right: rect.right,\n    top: rect.top,\n    width: rect.width\n  };\n}\n// Touch Capability Detector\n// ==============================\n\nfunction isTouchCapable() {\n  try {\n    document.createEvent('TouchEvent');\n    return true;\n  } catch (e) {\n    return false;\n  }\n} // ==============================\n// Mobile Device Detector\n// ==============================\n\nfunction isMobileDevice() {\n  try {\n    return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n  } catch (e) {\n    return false;\n  }\n} // ==============================\n// Passive Event Detector\n// ==============================\n// https://github.com/rafgraph/detect-it/blob/main/src/index.ts#L19-L36\n\nvar passiveOptionAccessed = false;\nvar options = {\n  get passive() {\n    return passiveOptionAccessed = true;\n  }\n\n}; // check for SSR\n\nvar w = typeof window !== 'undefined' ? window : {};\n\nif (w.addEventListener && w.removeEventListener) {\n  w.addEventListener('p', noop, options);\n  w.removeEventListener('p', noop, false);\n}\n\nvar supportsPassiveEvents = passiveOptionAccessed;\nfunction notNullish(item) {\n  return item != null;\n}\nfunction isArray(arg) {\n  return Array.isArray(arg);\n}\nfunction valueTernary(isMulti, multiValue, singleValue) {\n  return isMulti ? multiValue : singleValue;\n}\nfunction singleValueAsValue(singleValue) {\n  return singleValue;\n}\nfunction multiValueAsValue(multiValue) {\n  return multiValue;\n}\nvar removeProps = function removeProps(propsObj) {\n  for (var _len = arguments.length, properties = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    properties[_key - 1] = arguments[_key];\n  }\n\n  var propsMap = Object.entries(propsObj).filter(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 1),\n        key = _ref2[0];\n\n    return !properties.includes(key);\n  });\n  return propsMap.reduce(function (newProps, _ref3) {\n    var _ref4 = _slicedToArray(_ref3, 2),\n        key = _ref4[0],\n        val = _ref4[1];\n\n    newProps[key] = val;\n    return newProps;\n  }, {});\n};\n\nfunction getMenuPlacement(_ref) {\n  var maxHeight = _ref.maxHeight,\n      menuEl = _ref.menuEl,\n      minHeight = _ref.minHeight,\n      placement = _ref.placement,\n      shouldScroll = _ref.shouldScroll,\n      isFixedPosition = _ref.isFixedPosition,\n      theme = _ref.theme;\n  var spacing = theme.spacing;\n  var scrollParent = getScrollParent(menuEl);\n  var defaultState = {\n    placement: 'bottom',\n    maxHeight: maxHeight\n  }; // something went wrong, return default state\n\n  if (!menuEl || !menuEl.offsetParent) return defaultState; // we can't trust `scrollParent.scrollHeight` --> it may increase when\n  // the menu is rendered\n\n  var _scrollParent$getBoun = scrollParent.getBoundingClientRect(),\n      scrollHeight = _scrollParent$getBoun.height;\n\n  var _menuEl$getBoundingCl = menuEl.getBoundingClientRect(),\n      menuBottom = _menuEl$getBoundingCl.bottom,\n      menuHeight = _menuEl$getBoundingCl.height,\n      menuTop = _menuEl$getBoundingCl.top;\n\n  var _menuEl$offsetParent$ = menuEl.offsetParent.getBoundingClientRect(),\n      containerTop = _menuEl$offsetParent$.top;\n\n  var viewHeight = isFixedPosition ? window.innerHeight : normalizedHeight(scrollParent);\n  var scrollTop = getScrollTop(scrollParent);\n  var marginBottom = parseInt(getComputedStyle(menuEl).marginBottom, 10);\n  var marginTop = parseInt(getComputedStyle(menuEl).marginTop, 10);\n  var viewSpaceAbove = containerTop - marginTop;\n  var viewSpaceBelow = viewHeight - menuTop;\n  var scrollSpaceAbove = viewSpaceAbove + scrollTop;\n  var scrollSpaceBelow = scrollHeight - scrollTop - menuTop;\n  var scrollDown = menuBottom - viewHeight + scrollTop + marginBottom;\n  var scrollUp = scrollTop + menuTop - marginTop;\n  var scrollDuration = 160;\n\n  switch (placement) {\n    case 'auto':\n    case 'bottom':\n      // 1: the menu will fit, do nothing\n      if (viewSpaceBelow >= menuHeight) {\n        return {\n          placement: 'bottom',\n          maxHeight: maxHeight\n        };\n      } // 2: the menu will fit, if scrolled\n\n\n      if (scrollSpaceBelow >= menuHeight && !isFixedPosition) {\n        if (shouldScroll) {\n          animatedScrollTo(scrollParent, scrollDown, scrollDuration);\n        }\n\n        return {\n          placement: 'bottom',\n          maxHeight: maxHeight\n        };\n      } // 3: the menu will fit, if constrained\n\n\n      if (!isFixedPosition && scrollSpaceBelow >= minHeight || isFixedPosition && viewSpaceBelow >= minHeight) {\n        if (shouldScroll) {\n          animatedScrollTo(scrollParent, scrollDown, scrollDuration);\n        } // we want to provide as much of the menu as possible to the user,\n        // so give them whatever is available below rather than the minHeight.\n\n\n        var constrainedHeight = isFixedPosition ? viewSpaceBelow - marginBottom : scrollSpaceBelow - marginBottom;\n        return {\n          placement: 'bottom',\n          maxHeight: constrainedHeight\n        };\n      } // 4. Forked beviour when there isn't enough space below\n      // AUTO: flip the menu, render above\n\n\n      if (placement === 'auto' || isFixedPosition) {\n        // may need to be constrained after flipping\n        var _constrainedHeight = maxHeight;\n        var spaceAbove = isFixedPosition ? viewSpaceAbove : scrollSpaceAbove;\n\n        if (spaceAbove >= minHeight) {\n          _constrainedHeight = Math.min(spaceAbove - marginBottom - spacing.controlHeight, maxHeight);\n        }\n\n        return {\n          placement: 'top',\n          maxHeight: _constrainedHeight\n        };\n      } // BOTTOM: allow browser to increase scrollable area and immediately set scroll\n\n\n      if (placement === 'bottom') {\n        if (shouldScroll) {\n          scrollTo(scrollParent, scrollDown);\n        }\n\n        return {\n          placement: 'bottom',\n          maxHeight: maxHeight\n        };\n      }\n\n      break;\n\n    case 'top':\n      // 1: the menu will fit, do nothing\n      if (viewSpaceAbove >= menuHeight) {\n        return {\n          placement: 'top',\n          maxHeight: maxHeight\n        };\n      } // 2: the menu will fit, if scrolled\n\n\n      if (scrollSpaceAbove >= menuHeight && !isFixedPosition) {\n        if (shouldScroll) {\n          animatedScrollTo(scrollParent, scrollUp, scrollDuration);\n        }\n\n        return {\n          placement: 'top',\n          maxHeight: maxHeight\n        };\n      } // 3: the menu will fit, if constrained\n\n\n      if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {\n        var _constrainedHeight2 = maxHeight; // we want to provide as much of the menu as possible to the user,\n        // so give them whatever is available below rather than the minHeight.\n\n        if (!isFixedPosition && scrollSpaceAbove >= minHeight || isFixedPosition && viewSpaceAbove >= minHeight) {\n          _constrainedHeight2 = isFixedPosition ? viewSpaceAbove - marginTop : scrollSpaceAbove - marginTop;\n        }\n\n        if (shouldScroll) {\n          animatedScrollTo(scrollParent, scrollUp, scrollDuration);\n        }\n\n        return {\n          placement: 'top',\n          maxHeight: _constrainedHeight2\n        };\n      } // 4. not enough space, the browser WILL NOT increase scrollable area when\n      // absolutely positioned element rendered above the viewport (only below).\n      // Flip the menu, render below\n\n\n      return {\n        placement: 'bottom',\n        maxHeight: maxHeight\n      };\n\n    default:\n      throw new Error(\"Invalid placement provided \\\"\".concat(placement, \"\\\".\"));\n  }\n\n  return defaultState;\n} // Menu Component\n// ------------------------------\n\nfunction alignToControl(placement) {\n  var placementToCSSProp = {\n    bottom: 'top',\n    top: 'bottom'\n  };\n  return placement ? placementToCSSProp[placement] : 'bottom';\n}\n\nvar coercePlacement = function coercePlacement(p) {\n  return p === 'auto' ? 'bottom' : p;\n};\n\nvar menuCSS = function menuCSS(_ref2) {\n  var _ref3;\n\n  var placement = _ref2.placement,\n      _ref2$theme = _ref2.theme,\n      borderRadius = _ref2$theme.borderRadius,\n      spacing = _ref2$theme.spacing,\n      colors = _ref2$theme.colors;\n  return _ref3 = {\n    label: 'menu'\n  }, _defineProperty$1(_ref3, alignToControl(placement), '100%'), _defineProperty$1(_ref3, \"backgroundColor\", colors.neutral0), _defineProperty$1(_ref3, \"borderRadius\", borderRadius), _defineProperty$1(_ref3, \"boxShadow\", '0 0 0 1px hsla(0, 0%, 0%, 0.1), 0 4px 11px hsla(0, 0%, 0%, 0.1)'), _defineProperty$1(_ref3, \"marginBottom\", spacing.menuGutter), _defineProperty$1(_ref3, \"marginTop\", spacing.menuGutter), _defineProperty$1(_ref3, \"position\", 'absolute'), _defineProperty$1(_ref3, \"width\", '100%'), _defineProperty$1(_ref3, \"zIndex\", 1), _ref3;\n};\nvar PortalPlacementContext = /*#__PURE__*/createContext({\n  getPortalPlacement: null\n}); // NOTE: internal only\n\nvar MenuPlacer = /*#__PURE__*/function (_Component) {\n  _inherits(MenuPlacer, _Component);\n\n  var _super = _createSuper(MenuPlacer);\n\n  function MenuPlacer() {\n    var _this;\n\n    _classCallCheck(this, MenuPlacer);\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _super.call.apply(_super, [this].concat(args));\n    _this.state = {\n      maxHeight: _this.props.maxMenuHeight,\n      placement: null\n    };\n    _this.context = void 0;\n\n    _this.getPlacement = function (ref) {\n      var _this$props = _this.props,\n          minMenuHeight = _this$props.minMenuHeight,\n          maxMenuHeight = _this$props.maxMenuHeight,\n          menuPlacement = _this$props.menuPlacement,\n          menuPosition = _this$props.menuPosition,\n          menuShouldScrollIntoView = _this$props.menuShouldScrollIntoView,\n          theme = _this$props.theme;\n      if (!ref) return; // DO NOT scroll if position is fixed\n\n      var isFixedPosition = menuPosition === 'fixed';\n      var shouldScroll = menuShouldScrollIntoView && !isFixedPosition;\n      var state = getMenuPlacement({\n        maxHeight: maxMenuHeight,\n        menuEl: ref,\n        minHeight: minMenuHeight,\n        placement: menuPlacement,\n        shouldScroll: shouldScroll,\n        isFixedPosition: isFixedPosition,\n        theme: theme\n      });\n      var getPortalPlacement = _this.context.getPortalPlacement;\n      if (getPortalPlacement) getPortalPlacement(state);\n\n      _this.setState(state);\n    };\n\n    _this.getUpdatedProps = function () {\n      var menuPlacement = _this.props.menuPlacement;\n      var placement = _this.state.placement || coercePlacement(menuPlacement);\n      return _objectSpread2(_objectSpread2({}, _this.props), {}, {\n        placement: placement,\n        maxHeight: _this.state.maxHeight\n      });\n    };\n\n    return _this;\n  }\n\n  _createClass(MenuPlacer, [{\n    key: \"render\",\n    value: function render() {\n      var children = this.props.children;\n      return children({\n        ref: this.getPlacement,\n        placerProps: this.getUpdatedProps()\n      });\n    }\n  }]);\n\n  return MenuPlacer;\n}(Component);\nMenuPlacer.contextType = PortalPlacementContext;\n\nvar Menu = function Menu(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerRef = props.innerRef,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('menu', props),\n    className: cx({\n      menu: true\n    }, className),\n    ref: innerRef\n  }, innerProps), children);\n};\n// Menu List\n// ==============================\n\nvar menuListCSS = function menuListCSS(_ref4) {\n  var maxHeight = _ref4.maxHeight,\n      baseUnit = _ref4.theme.spacing.baseUnit;\n  return {\n    maxHeight: maxHeight,\n    overflowY: 'auto',\n    paddingBottom: baseUnit,\n    paddingTop: baseUnit,\n    position: 'relative',\n    // required for offset[Height, Top] > keyboard scroll\n    WebkitOverflowScrolling: 'touch'\n  };\n};\nvar MenuList = function MenuList(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps,\n      innerRef = props.innerRef,\n      isMulti = props.isMulti;\n  return jsx(\"div\", _extends({\n    css: getStyles('menuList', props),\n    className: cx({\n      'menu-list': true,\n      'menu-list--is-multi': isMulti\n    }, className),\n    ref: innerRef\n  }, innerProps), children);\n}; // ==============================\n// Menu Notices\n// ==============================\n\nvar noticeCSS = function noticeCSS(_ref5) {\n  var _ref5$theme = _ref5.theme,\n      baseUnit = _ref5$theme.spacing.baseUnit,\n      colors = _ref5$theme.colors;\n  return {\n    color: colors.neutral40,\n    padding: \"\".concat(baseUnit * 2, \"px \").concat(baseUnit * 3, \"px\"),\n    textAlign: 'center'\n  };\n};\n\nvar noOptionsMessageCSS = noticeCSS;\nvar loadingMessageCSS = noticeCSS;\nvar NoOptionsMessage = function NoOptionsMessage(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('noOptionsMessage', props),\n    className: cx({\n      'menu-notice': true,\n      'menu-notice--no-options': true\n    }, className)\n  }, innerProps), children);\n};\nNoOptionsMessage.defaultProps = {\n  children: 'No options'\n};\nvar LoadingMessage = function LoadingMessage(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('loadingMessage', props),\n    className: cx({\n      'menu-notice': true,\n      'menu-notice--loading': true\n    }, className)\n  }, innerProps), children);\n};\nLoadingMessage.defaultProps = {\n  children: 'Loading...'\n}; // ==============================\n// Menu Portal\n// ==============================\n\nvar menuPortalCSS = function menuPortalCSS(_ref6) {\n  var rect = _ref6.rect,\n      offset = _ref6.offset,\n      position = _ref6.position;\n  return {\n    left: rect.left,\n    position: position,\n    top: offset,\n    width: rect.width,\n    zIndex: 1\n  };\n};\nvar MenuPortal = /*#__PURE__*/function (_Component2) {\n  _inherits(MenuPortal, _Component2);\n\n  var _super2 = _createSuper(MenuPortal);\n\n  function MenuPortal() {\n    var _this2;\n\n    _classCallCheck(this, MenuPortal);\n\n    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    _this2 = _super2.call.apply(_super2, [this].concat(args));\n    _this2.state = {\n      placement: null\n    };\n\n    _this2.getPortalPlacement = function (_ref7) {\n      var placement = _ref7.placement;\n      var initialPlacement = coercePlacement(_this2.props.menuPlacement); // avoid re-renders if the placement has not changed\n\n      if (placement !== initialPlacement) {\n        _this2.setState({\n          placement: placement\n        });\n      }\n    };\n\n    return _this2;\n  }\n\n  _createClass(MenuPortal, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props2 = this.props,\n          appendTo = _this$props2.appendTo,\n          children = _this$props2.children,\n          className = _this$props2.className,\n          controlElement = _this$props2.controlElement,\n          cx = _this$props2.cx,\n          innerProps = _this$props2.innerProps,\n          menuPlacement = _this$props2.menuPlacement,\n          position = _this$props2.menuPosition,\n          getStyles = _this$props2.getStyles;\n      var isFixed = position === 'fixed'; // bail early if required elements aren't present\n\n      if (!appendTo && !isFixed || !controlElement) {\n        return null;\n      }\n\n      var placement = this.state.placement || coercePlacement(menuPlacement);\n      var rect = getBoundingClientObj(controlElement);\n      var scrollDistance = isFixed ? 0 : window.pageYOffset;\n      var offset = rect[placement] + scrollDistance;\n      var state = {\n        offset: offset,\n        position: position,\n        rect: rect\n      }; // same wrapper element whether fixed or portalled\n\n      var menuWrapper = jsx(\"div\", _extends({\n        css: getStyles('menuPortal', state),\n        className: cx({\n          'menu-portal': true\n        }, className)\n      }, innerProps), children);\n      return jsx(PortalPlacementContext.Provider, {\n        value: {\n          getPortalPlacement: this.getPortalPlacement\n        }\n      }, appendTo ? /*#__PURE__*/createPortal(menuWrapper, appendTo) : menuWrapper);\n    }\n  }]);\n\n  return MenuPortal;\n}(Component);\n\nvar containerCSS = function containerCSS(_ref) {\n  var isDisabled = _ref.isDisabled,\n      isRtl = _ref.isRtl;\n  return {\n    label: 'container',\n    direction: isRtl ? 'rtl' : undefined,\n    pointerEvents: isDisabled ? 'none' : undefined,\n    // cancel mouse events when disabled\n    position: 'relative'\n  };\n};\nvar SelectContainer = function SelectContainer(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps,\n      isDisabled = props.isDisabled,\n      isRtl = props.isRtl;\n  return jsx(\"div\", _extends({\n    css: getStyles('container', props),\n    className: cx({\n      '--is-disabled': isDisabled,\n      '--is-rtl': isRtl\n    }, className)\n  }, innerProps), children);\n}; // ==============================\n// Value Container\n// ==============================\n\nvar valueContainerCSS = function valueContainerCSS(_ref2) {\n  var spacing = _ref2.theme.spacing,\n      isMulti = _ref2.isMulti,\n      hasValue = _ref2.hasValue,\n      controlShouldRenderValue = _ref2.selectProps.controlShouldRenderValue;\n  return {\n    alignItems: 'center',\n    display: isMulti && hasValue && controlShouldRenderValue ? 'flex' : 'grid',\n    flex: 1,\n    flexWrap: 'wrap',\n    padding: \"\".concat(spacing.baseUnit / 2, \"px \").concat(spacing.baseUnit * 2, \"px\"),\n    WebkitOverflowScrolling: 'touch',\n    position: 'relative',\n    overflow: 'hidden'\n  };\n};\nvar ValueContainer = function ValueContainer(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      innerProps = props.innerProps,\n      isMulti = props.isMulti,\n      getStyles = props.getStyles,\n      hasValue = props.hasValue;\n  return jsx(\"div\", _extends({\n    css: getStyles('valueContainer', props),\n    className: cx({\n      'value-container': true,\n      'value-container--is-multi': isMulti,\n      'value-container--has-value': hasValue\n    }, className)\n  }, innerProps), children);\n}; // ==============================\n// Indicator Container\n// ==============================\n\nvar indicatorsContainerCSS = function indicatorsContainerCSS() {\n  return {\n    alignItems: 'center',\n    alignSelf: 'stretch',\n    display: 'flex',\n    flexShrink: 0\n  };\n};\nvar IndicatorsContainer = function IndicatorsContainer(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      innerProps = props.innerProps,\n      getStyles = props.getStyles;\n  return jsx(\"div\", _extends({\n    css: getStyles('indicatorsContainer', props),\n    className: cx({\n      indicators: true\n    }, className)\n  }, innerProps), children);\n};\n\nvar _templateObject;\n\nvar _excluded$2 = [\"size\"];\n\nfunction _EMOTION_STRINGIFIED_CSS_ERROR__() { return \"You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop).\"; }\n\nvar _ref2 = process.env.NODE_ENV === \"production\" ? {\n  name: \"8mmkcg\",\n  styles: \"display:inline-block;fill:currentColor;line-height:1;stroke:currentColor;stroke-width:0\"\n} : {\n  name: \"tj5bde-Svg\",\n  styles: \"display:inline-block;fill:currentColor;line-height:1;stroke:currentColor;stroke-width:0;label:Svg;\",\n  map: \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGljYXRvcnMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXdCSSIsImZpbGUiOiJpbmRpY2F0b3JzLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4IGpzeCAqL1xuaW1wb3J0IHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsganN4LCBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5cbmltcG9ydCB7XG4gIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lLFxuICBDU1NPYmplY3RXaXRoTGFiZWwsXG4gIEdyb3VwQmFzZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERyb3Bkb3duICYgQ2xlYXIgSWNvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBTdmcgPSAoe1xuICBzaXplLFxuICAuLi5wcm9wc1xufTogSlNYLkludHJpbnNpY0VsZW1lbnRzWydzdmcnXSAmIHsgc2l6ZTogbnVtYmVyIH0pID0+IChcbiAgPHN2Z1xuICAgIGhlaWdodD17c2l6ZX1cbiAgICB3aWR0aD17c2l6ZX1cbiAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICBjc3M9e3tcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgc3Ryb2tlOiAnY3VycmVudENvbG9yJyxcbiAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgIH19XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcblxuZXhwb3J0IHR5cGUgQ3Jvc3NJY29uUHJvcHMgPSBKU1guSW50cmluc2ljRWxlbWVudHNbJ3N2ZyddICYgeyBzaXplPzogbnVtYmVyIH07XG5leHBvcnQgY29uc3QgQ3Jvc3NJY29uID0gKHByb3BzOiBDcm9zc0ljb25Qcm9wcykgPT4gKFxuICA8U3ZnIHNpemU9ezIwfSB7Li4ucHJvcHN9PlxuICAgIDxwYXRoIGQ9XCJNMTQuMzQ4IDE0Ljg0OWMtMC40NjkgMC40NjktMS4yMjkgMC40NjktMS42OTcgMGwtMi42NTEtMy4wMzAtMi42NTEgMy4wMjljLTAuNDY5IDAuNDY5LTEuMjI5IDAuNDY5LTEuNjk3IDAtMC40NjktMC40NjktMC40NjktMS4yMjkgMC0xLjY5N2wyLjc1OC0zLjE1LTIuNzU5LTMuMTUyYy0wLjQ2OS0wLjQ2OS0wLjQ2OS0xLjIyOCAwLTEuNjk3czEuMjI4LTAuNDY5IDEuNjk3IDBsMi42NTIgMy4wMzEgMi42NTEtMy4wMzFjMC40NjktMC40NjkgMS4yMjgtMC40NjkgMS42OTcgMHMwLjQ2OSAxLjIyOSAwIDEuNjk3bC0yLjc1OCAzLjE1MiAyLjc1OCAzLjE1YzAuNDY5IDAuNDY5IDAuNDY5IDEuMjI5IDAgMS42OTh6XCIgLz5cbiAgPC9Tdmc+XG4pO1xuZXhwb3J0IHR5cGUgRG93bkNoZXZyb25Qcm9wcyA9IEpTWC5JbnRyaW5zaWNFbGVtZW50c1snc3ZnJ10gJiB7IHNpemU/OiBudW1iZXIgfTtcbmV4cG9ydCBjb25zdCBEb3duQ2hldnJvbiA9IChwcm9wczogRG93bkNoZXZyb25Qcm9wcykgPT4gKFxuICA8U3ZnIHNpemU9ezIwfSB7Li4ucHJvcHN9PlxuICAgIDxwYXRoIGQ9XCJNNC41MTYgNy41NDhjMC40MzYtMC40NDYgMS4wNDMtMC40ODEgMS41NzYgMGwzLjkwOCAzLjc0NyAzLjkwOC0zLjc0N2MwLjUzMy0wLjQ4MSAxLjE0MS0wLjQ0NiAxLjU3NCAwIDAuNDM2IDAuNDQ1IDAuNDA4IDEuMTk3IDAgMS42MTUtMC40MDYgMC40MTgtNC42OTUgNC41MDItNC42OTUgNC41MDItMC4yMTcgMC4yMjMtMC41MDIgMC4zMzUtMC43ODcgMC4zMzVzLTAuNTctMC4xMTItMC43ODktMC4zMzVjMCAwLTQuMjg3LTQuMDg0LTQuNjk1LTQuNTAycy0wLjQzNi0xLjE3IDAtMS42MTV6XCIgLz5cbiAgPC9Tdmc+XG4pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERyb3Bkb3duICYgQ2xlYXIgQnV0dG9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25JbmRpY2F0b3JQcm9wczxcbiAgT3B0aW9uID0gdW5rbm93bixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4gPSBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+ID0gR3JvdXBCYXNlPE9wdGlvbj5cbj4gZXh0ZW5kcyBDb21tb25Qcm9wc0FuZENsYXNzTmFtZTxPcHRpb24sIElzTXVsdGksIEdyb3VwPiB7XG4gIC8qKiBUaGUgY2hpbGRyZW4gdG8gYmUgcmVuZGVyZWQgaW5zaWRlIHRoZSBpbmRpY2F0b3IuICovXG4gIGNoaWxkcmVuPzogUmVhY3ROb2RlO1xuICAvKiogUHJvcHMgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgY2hpbGRyZW4uICovXG4gIGlubmVyUHJvcHM6IEpTWC5JbnRyaW5zaWNFbGVtZW50c1snZGl2J107XG4gIC8qKiBUaGUgZm9jdXNlZCBzdGF0ZSBvZiB0aGUgc2VsZWN0LiAqL1xuICBpc0ZvY3VzZWQ6IGJvb2xlYW47XG4gIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IGJhc2VDU1MgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oe1xuICBpc0ZvY3VzZWQsXG4gIHRoZW1lOiB7XG4gICAgc3BhY2luZzogeyBiYXNlVW5pdCB9LFxuICAgIGNvbG9ycyxcbiAgfSxcbn06XG4gIHwgRHJvcGRvd25JbmRpY2F0b3JQcm9wczxPcHRpb24sIElzTXVsdGksIEdyb3VwPlxuICB8IENsZWFySW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD4pOiBDU1NPYmplY3RXaXRoTGFiZWwgPT4gKHtcbiAgbGFiZWw6ICdpbmRpY2F0b3JDb250YWluZXInLFxuICBjb2xvcjogaXNGb2N1c2VkID8gY29sb3JzLm5ldXRyYWw2MCA6IGNvbG9ycy5uZXV0cmFsMjAsXG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgcGFkZGluZzogYmFzZVVuaXQgKiAyLFxuICB0cmFuc2l0aW9uOiAnY29sb3IgMTUwbXMnLFxuXG4gICc6aG92ZXInOiB7XG4gICAgY29sb3I6IGlzRm9jdXNlZCA/IGNvbG9ycy5uZXV0cmFsODAgOiBjb2xvcnMubmV1dHJhbDQwLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBkcm9wZG93bkluZGljYXRvckNTUyA9IGJhc2VDU1M7XG5leHBvcnQgY29uc3QgRHJvcGRvd25JbmRpY2F0b3IgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oXG4gIHByb3BzOiBEcm9wZG93bkluZGljYXRvclByb3BzPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+XG4pID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBjeCwgZ2V0U3R5bGVzLCBpbm5lclByb3BzIH0gPSBwcm9wcztcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldFN0eWxlcygnZHJvcGRvd25JbmRpY2F0b3InLCBwcm9wcyl9XG4gICAgICBjbGFzc05hbWU9e2N4KFxuICAgICAgICB7XG4gICAgICAgICAgaW5kaWNhdG9yOiB0cnVlLFxuICAgICAgICAgICdkcm9wZG93bi1pbmRpY2F0b3InOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4uaW5uZXJQcm9wc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW4gfHwgPERvd25DaGV2cm9uIC8+fVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDbGVhckluZGljYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgLyoqIFRoZSBjaGlsZHJlbiB0byBiZSByZW5kZXJlZCBpbnNpZGUgdGhlIGluZGljYXRvci4gKi9cbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIC8qKiBQcm9wcyB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBjaGlsZHJlbi4gKi9cbiAgaW5uZXJQcm9wczogSlNYLkludHJpbnNpY0VsZW1lbnRzWydkaXYnXTtcbiAgLyoqIFRoZSBmb2N1c2VkIHN0YXRlIG9mIHRoZSBzZWxlY3QuICovXG4gIGlzRm9jdXNlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFySW5kaWNhdG9yQ1NTID0gYmFzZUNTUztcbmV4cG9ydCBjb25zdCBDbGVhckluZGljYXRvciA9IDxcbiAgT3B0aW9uLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbixcbiAgR3JvdXAgZXh0ZW5kcyBHcm91cEJhc2U8T3B0aW9uPlxuPihcbiAgcHJvcHM6IENsZWFySW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNoaWxkcmVuLCBjbGFzc05hbWUsIGN4LCBnZXRTdHlsZXMsIGlubmVyUHJvcHMgfSA9IHByb3BzO1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNzcz17Z2V0U3R5bGVzKCdjbGVhckluZGljYXRvcicsIHByb3BzKX1cbiAgICAgIGNsYXNzTmFtZT17Y3goXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRpY2F0b3I6IHRydWUsXG4gICAgICAgICAgJ2NsZWFyLWluZGljYXRvcic6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbiB8fCA8Q3Jvc3NJY29uIC8+fVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZXBhcmF0b3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGljYXRvclNlcGFyYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBpbm5lclByb3BzPzogSlNYLkludHJpbnNpY0VsZW1lbnRzWydzcGFuJ107XG59XG5cbmV4cG9ydCBjb25zdCBpbmRpY2F0b3JTZXBhcmF0b3JDU1MgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oe1xuICBpc0Rpc2FibGVkLFxuICB0aGVtZToge1xuICAgIHNwYWNpbmc6IHsgYmFzZVVuaXQgfSxcbiAgICBjb2xvcnMsXG4gIH0sXG59OiBJbmRpY2F0b3JTZXBhcmF0b3JQcm9wczxPcHRpb24sIElzTXVsdGksIEdyb3VwPik6IENTU09iamVjdFdpdGhMYWJlbCA9PiAoe1xuICBsYWJlbDogJ2luZGljYXRvclNlcGFyYXRvcicsXG4gIGFsaWduU2VsZjogJ3N0cmV0Y2gnLFxuICBiYWNrZ3JvdW5kQ29sb3I6IGlzRGlzYWJsZWQgPyBjb2xvcnMubmV1dHJhbDEwIDogY29sb3JzLm5ldXRyYWwyMCxcbiAgbWFyZ2luQm90dG9tOiBiYXNlVW5pdCAqIDIsXG4gIG1hcmdpblRvcDogYmFzZVVuaXQgKiAyLFxuICB3aWR0aDogMSxcbn0pO1xuXG5leHBvcnQgY29uc3QgSW5kaWNhdG9yU2VwYXJhdG9yID0gPFxuICBPcHRpb24sXG4gIElzTXVsdGkgZXh0ZW5kcyBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+XG4+KFxuICBwcm9wczogSW5kaWNhdG9yU2VwYXJhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgY3gsIGdldFN0eWxlcywgaW5uZXJQcm9wcyB9ID0gcHJvcHM7XG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgICAgY3NzPXtnZXRTdHlsZXMoJ2luZGljYXRvclNlcGFyYXRvcicsIHByb3BzKX1cbiAgICAgIGNsYXNzTmFtZT17Y3goeyAnaW5kaWNhdG9yLXNlcGFyYXRvcic6IHRydWUgfSwgY2xhc3NOYW1lKX1cbiAgICAvPlxuICApO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMb2FkaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgbG9hZGluZ0RvdEFuaW1hdGlvbnMgPSBrZXlmcmFtZXNgXG4gIDAlLCA4MCUsIDEwMCUgeyBvcGFjaXR5OiAwOyB9XG4gIDQwJSB7IG9wYWNpdHk6IDE7IH1cbmA7XG5cbmV4cG9ydCBjb25zdCBsb2FkaW5nSW5kaWNhdG9yQ1NTID0gPFxuICBPcHRpb24sXG4gIElzTXVsdGkgZXh0ZW5kcyBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+XG4+KHtcbiAgaXNGb2N1c2VkLFxuICBzaXplLFxuICB0aGVtZToge1xuICAgIGNvbG9ycyxcbiAgICBzcGFjaW5nOiB7IGJhc2VVbml0IH0sXG4gIH0sXG59OiBMb2FkaW5nSW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD4pOiBDU1NPYmplY3RXaXRoTGFiZWwgPT4gKHtcbiAgbGFiZWw6ICdsb2FkaW5nSW5kaWNhdG9yJyxcbiAgY29sb3I6IGlzRm9jdXNlZCA/IGNvbG9ycy5uZXV0cmFsNjAgOiBjb2xvcnMubmV1dHJhbDIwLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIHBhZGRpbmc6IGJhc2VVbml0ICogMixcbiAgdHJhbnNpdGlvbjogJ2NvbG9yIDE1MG1zJyxcbiAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgZm9udFNpemU6IHNpemUsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG1hcmdpblJpZ2h0OiBzaXplLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbn0pO1xuXG5pbnRlcmZhY2UgTG9hZGluZ0RvdFByb3BzIHtcbiAgZGVsYXk6IG51bWJlcjtcbiAgb2Zmc2V0OiBib29sZWFuO1xufVxuY29uc3QgTG9hZGluZ0RvdCA9ICh7IGRlbGF5LCBvZmZzZXQgfTogTG9hZGluZ0RvdFByb3BzKSA9PiAoXG4gIDxzcGFuXG4gICAgY3NzPXt7XG4gICAgICBhbmltYXRpb246IGAke2xvYWRpbmdEb3RBbmltYXRpb25zfSAxcyBlYXNlLWluLW91dCAke2RlbGF5fW1zIGluZmluaXRlO2AsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMWVtJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgbWFyZ2luTGVmdDogb2Zmc2V0ID8gJzFlbScgOiB1bmRlZmluZWQsXG4gICAgICBoZWlnaHQ6ICcxZW0nLFxuICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCcsXG4gICAgICB3aWR0aDogJzFlbScsXG4gICAgfX1cbiAgLz5cbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGluZ0luZGljYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgLyoqIFByb3BzIHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGNoaWxkcmVuLiAqL1xuICBpbm5lclByb3BzOiBKU1guSW50cmluc2ljRWxlbWVudHNbJ2RpdiddO1xuICAvKiogVGhlIGZvY3VzZWQgc3RhdGUgb2YgdGhlIHNlbGVjdC4gKi9cbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICAvKiogU2V0IHNpemUgb2YgdGhlIGNvbnRhaW5lci4gKi9cbiAgc2l6ZTogbnVtYmVyO1xufVxuZXhwb3J0IGNvbnN0IExvYWRpbmdJbmRpY2F0b3IgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oXG4gIHByb3BzOiBMb2FkaW5nSW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgY3gsIGdldFN0eWxlcywgaW5uZXJQcm9wcywgaXNSdGwgfSA9IHByb3BzO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY3NzPXtnZXRTdHlsZXMoJ2xvYWRpbmdJbmRpY2F0b3InLCBwcm9wcyl9XG4gICAgICBjbGFzc05hbWU9e2N4KFxuICAgICAgICB7XG4gICAgICAgICAgaW5kaWNhdG9yOiB0cnVlLFxuICAgICAgICAgICdsb2FkaW5nLWluZGljYXRvcic6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgID5cbiAgICAgIDxMb2FkaW5nRG90IGRlbGF5PXswfSBvZmZzZXQ9e2lzUnRsfSAvPlxuICAgICAgPExvYWRpbmdEb3QgZGVsYXk9ezE2MH0gb2Zmc2V0IC8+XG4gICAgICA8TG9hZGluZ0RvdCBkZWxheT17MzIwfSBvZmZzZXQ9eyFpc1J0bH0gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5Mb2FkaW5nSW5kaWNhdG9yLmRlZmF1bHRQcm9wcyA9IHsgc2l6ZTogNCB9O1xuIl19 */\",\n  toString: _EMOTION_STRINGIFIED_CSS_ERROR__\n};\n\n// ==============================\n// Dropdown & Clear Icons\n// ==============================\nvar Svg = function Svg(_ref) {\n  var size = _ref.size,\n      props = _objectWithoutProperties(_ref, _excluded$2);\n\n  return jsx(\"svg\", _extends({\n    height: size,\n    width: size,\n    viewBox: \"0 0 20 20\",\n    \"aria-hidden\": \"true\",\n    focusable: \"false\",\n    css: _ref2\n  }, props));\n};\n\nvar CrossIcon = function CrossIcon(props) {\n  return jsx(Svg, _extends({\n    size: 20\n  }, props), jsx(\"path\", {\n    d: \"M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z\"\n  }));\n};\nvar DownChevron = function DownChevron(props) {\n  return jsx(Svg, _extends({\n    size: 20\n  }, props), jsx(\"path\", {\n    d: \"M4.516 7.548c0.436-0.446 1.043-0.481 1.576 0l3.908 3.747 3.908-3.747c0.533-0.481 1.141-0.446 1.574 0 0.436 0.445 0.408 1.197 0 1.615-0.406 0.418-4.695 4.502-4.695 4.502-0.217 0.223-0.502 0.335-0.787 0.335s-0.57-0.112-0.789-0.335c0 0-4.287-4.084-4.695-4.502s-0.436-1.17 0-1.615z\"\n  }));\n}; // ==============================\n// Dropdown & Clear Buttons\n// ==============================\n\nvar baseCSS = function baseCSS(_ref3) {\n  var isFocused = _ref3.isFocused,\n      _ref3$theme = _ref3.theme,\n      baseUnit = _ref3$theme.spacing.baseUnit,\n      colors = _ref3$theme.colors;\n  return {\n    label: 'indicatorContainer',\n    color: isFocused ? colors.neutral60 : colors.neutral20,\n    display: 'flex',\n    padding: baseUnit * 2,\n    transition: 'color 150ms',\n    ':hover': {\n      color: isFocused ? colors.neutral80 : colors.neutral40\n    }\n  };\n};\n\nvar dropdownIndicatorCSS = baseCSS;\nvar DropdownIndicator = function DropdownIndicator(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('dropdownIndicator', props),\n    className: cx({\n      indicator: true,\n      'dropdown-indicator': true\n    }, className)\n  }, innerProps), children || jsx(DownChevron, null));\n};\nvar clearIndicatorCSS = baseCSS;\nvar ClearIndicator = function ClearIndicator(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('clearIndicator', props),\n    className: cx({\n      indicator: true,\n      'clear-indicator': true\n    }, className)\n  }, innerProps), children || jsx(CrossIcon, null));\n}; // ==============================\n// Separator\n// ==============================\n\nvar indicatorSeparatorCSS = function indicatorSeparatorCSS(_ref4) {\n  var isDisabled = _ref4.isDisabled,\n      _ref4$theme = _ref4.theme,\n      baseUnit = _ref4$theme.spacing.baseUnit,\n      colors = _ref4$theme.colors;\n  return {\n    label: 'indicatorSeparator',\n    alignSelf: 'stretch',\n    backgroundColor: isDisabled ? colors.neutral10 : colors.neutral20,\n    marginBottom: baseUnit * 2,\n    marginTop: baseUnit * 2,\n    width: 1\n  };\n};\nvar IndicatorSeparator = function IndicatorSeparator(props) {\n  var className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"span\", _extends({}, innerProps, {\n    css: getStyles('indicatorSeparator', props),\n    className: cx({\n      'indicator-separator': true\n    }, className)\n  }));\n}; // ==============================\n// Loading\n// ==============================\n\nvar loadingDotAnimations = keyframes(_templateObject || (_templateObject = _taggedTemplateLiteral([\"\\n  0%, 80%, 100% { opacity: 0; }\\n  40% { opacity: 1; }\\n\"])));\nvar loadingIndicatorCSS = function loadingIndicatorCSS(_ref5) {\n  var isFocused = _ref5.isFocused,\n      size = _ref5.size,\n      _ref5$theme = _ref5.theme,\n      colors = _ref5$theme.colors,\n      baseUnit = _ref5$theme.spacing.baseUnit;\n  return {\n    label: 'loadingIndicator',\n    color: isFocused ? colors.neutral60 : colors.neutral20,\n    display: 'flex',\n    padding: baseUnit * 2,\n    transition: 'color 150ms',\n    alignSelf: 'center',\n    fontSize: size,\n    lineHeight: 1,\n    marginRight: size,\n    textAlign: 'center',\n    verticalAlign: 'middle'\n  };\n};\n\nvar LoadingDot = function LoadingDot(_ref6) {\n  var delay = _ref6.delay,\n      offset = _ref6.offset;\n  return jsx(\"span\", {\n    css: /*#__PURE__*/css$2({\n      animation: \"\".concat(loadingDotAnimations, \" 1s ease-in-out \").concat(delay, \"ms infinite;\"),\n      backgroundColor: 'currentColor',\n      borderRadius: '1em',\n      display: 'inline-block',\n      marginLeft: offset ? '1em' : undefined,\n      height: '1em',\n      verticalAlign: 'top',\n      width: '1em'\n    }, process.env.NODE_ENV === \"production\" ? \"\" : \";label:LoadingDot;\", process.env.NODE_ENV === \"production\" ? \"\" : \"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGljYXRvcnMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXFQSSIsImZpbGUiOiJpbmRpY2F0b3JzLnRzeCIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4IGpzeCAqL1xuaW1wb3J0IHsgUmVhY3ROb2RlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsganN4LCBrZXlmcmFtZXMgfSBmcm9tICdAZW1vdGlvbi9yZWFjdCc7XG5cbmltcG9ydCB7XG4gIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lLFxuICBDU1NPYmplY3RXaXRoTGFiZWwsXG4gIEdyb3VwQmFzZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERyb3Bkb3duICYgQ2xlYXIgSWNvbnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jb25zdCBTdmcgPSAoe1xuICBzaXplLFxuICAuLi5wcm9wc1xufTogSlNYLkludHJpbnNpY0VsZW1lbnRzWydzdmcnXSAmIHsgc2l6ZTogbnVtYmVyIH0pID0+IChcbiAgPHN2Z1xuICAgIGhlaWdodD17c2l6ZX1cbiAgICB3aWR0aD17c2l6ZX1cbiAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICBjc3M9e3tcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgc3Ryb2tlOiAnY3VycmVudENvbG9yJyxcbiAgICAgIHN0cm9rZVdpZHRoOiAwLFxuICAgIH19XG4gICAgey4uLnByb3BzfVxuICAvPlxuKTtcblxuZXhwb3J0IHR5cGUgQ3Jvc3NJY29uUHJvcHMgPSBKU1guSW50cmluc2ljRWxlbWVudHNbJ3N2ZyddICYgeyBzaXplPzogbnVtYmVyIH07XG5leHBvcnQgY29uc3QgQ3Jvc3NJY29uID0gKHByb3BzOiBDcm9zc0ljb25Qcm9wcykgPT4gKFxuICA8U3ZnIHNpemU9ezIwfSB7Li4ucHJvcHN9PlxuICAgIDxwYXRoIGQ9XCJNMTQuMzQ4IDE0Ljg0OWMtMC40NjkgMC40NjktMS4yMjkgMC40NjktMS42OTcgMGwtMi42NTEtMy4wMzAtMi42NTEgMy4wMjljLTAuNDY5IDAuNDY5LTEuMjI5IDAuNDY5LTEuNjk3IDAtMC40NjktMC40NjktMC40NjktMS4yMjkgMC0xLjY5N2wyLjc1OC0zLjE1LTIuNzU5LTMuMTUyYy0wLjQ2OS0wLjQ2OS0wLjQ2OS0xLjIyOCAwLTEuNjk3czEuMjI4LTAuNDY5IDEuNjk3IDBsMi42NTIgMy4wMzEgMi42NTEtMy4wMzFjMC40NjktMC40NjkgMS4yMjgtMC40NjkgMS42OTcgMHMwLjQ2OSAxLjIyOSAwIDEuNjk3bC0yLjc1OCAzLjE1MiAyLjc1OCAzLjE1YzAuNDY5IDAuNDY5IDAuNDY5IDEuMjI5IDAgMS42OTh6XCIgLz5cbiAgPC9Tdmc+XG4pO1xuZXhwb3J0IHR5cGUgRG93bkNoZXZyb25Qcm9wcyA9IEpTWC5JbnRyaW5zaWNFbGVtZW50c1snc3ZnJ10gJiB7IHNpemU/OiBudW1iZXIgfTtcbmV4cG9ydCBjb25zdCBEb3duQ2hldnJvbiA9IChwcm9wczogRG93bkNoZXZyb25Qcm9wcykgPT4gKFxuICA8U3ZnIHNpemU9ezIwfSB7Li4ucHJvcHN9PlxuICAgIDxwYXRoIGQ9XCJNNC41MTYgNy41NDhjMC40MzYtMC40NDYgMS4wNDMtMC40ODEgMS41NzYgMGwzLjkwOCAzLjc0NyAzLjkwOC0zLjc0N2MwLjUzMy0wLjQ4MSAxLjE0MS0wLjQ0NiAxLjU3NCAwIDAuNDM2IDAuNDQ1IDAuNDA4IDEuMTk3IDAgMS42MTUtMC40MDYgMC40MTgtNC42OTUgNC41MDItNC42OTUgNC41MDItMC4yMTcgMC4yMjMtMC41MDIgMC4zMzUtMC43ODcgMC4zMzVzLTAuNTctMC4xMTItMC43ODktMC4zMzVjMCAwLTQuMjg3LTQuMDg0LTQuNjk1LTQuNTAycy0wLjQzNi0xLjE3IDAtMS42MTV6XCIgLz5cbiAgPC9Tdmc+XG4pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIERyb3Bkb3duICYgQ2xlYXIgQnV0dG9uc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25JbmRpY2F0b3JQcm9wczxcbiAgT3B0aW9uID0gdW5rbm93bixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4gPSBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+ID0gR3JvdXBCYXNlPE9wdGlvbj5cbj4gZXh0ZW5kcyBDb21tb25Qcm9wc0FuZENsYXNzTmFtZTxPcHRpb24sIElzTXVsdGksIEdyb3VwPiB7XG4gIC8qKiBUaGUgY2hpbGRyZW4gdG8gYmUgcmVuZGVyZWQgaW5zaWRlIHRoZSBpbmRpY2F0b3IuICovXG4gIGNoaWxkcmVuPzogUmVhY3ROb2RlO1xuICAvKiogUHJvcHMgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgY2hpbGRyZW4uICovXG4gIGlubmVyUHJvcHM6IEpTWC5JbnRyaW5zaWNFbGVtZW50c1snZGl2J107XG4gIC8qKiBUaGUgZm9jdXNlZCBzdGF0ZSBvZiB0aGUgc2VsZWN0LiAqL1xuICBpc0ZvY3VzZWQ6IGJvb2xlYW47XG4gIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG59XG5cbmNvbnN0IGJhc2VDU1MgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oe1xuICBpc0ZvY3VzZWQsXG4gIHRoZW1lOiB7XG4gICAgc3BhY2luZzogeyBiYXNlVW5pdCB9LFxuICAgIGNvbG9ycyxcbiAgfSxcbn06XG4gIHwgRHJvcGRvd25JbmRpY2F0b3JQcm9wczxPcHRpb24sIElzTXVsdGksIEdyb3VwPlxuICB8IENsZWFySW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD4pOiBDU1NPYmplY3RXaXRoTGFiZWwgPT4gKHtcbiAgbGFiZWw6ICdpbmRpY2F0b3JDb250YWluZXInLFxuICBjb2xvcjogaXNGb2N1c2VkID8gY29sb3JzLm5ldXRyYWw2MCA6IGNvbG9ycy5uZXV0cmFsMjAsXG4gIGRpc3BsYXk6ICdmbGV4JyxcbiAgcGFkZGluZzogYmFzZVVuaXQgKiAyLFxuICB0cmFuc2l0aW9uOiAnY29sb3IgMTUwbXMnLFxuXG4gICc6aG92ZXInOiB7XG4gICAgY29sb3I6IGlzRm9jdXNlZCA/IGNvbG9ycy5uZXV0cmFsODAgOiBjb2xvcnMubmV1dHJhbDQwLFxuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBkcm9wZG93bkluZGljYXRvckNTUyA9IGJhc2VDU1M7XG5leHBvcnQgY29uc3QgRHJvcGRvd25JbmRpY2F0b3IgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oXG4gIHByb3BzOiBEcm9wZG93bkluZGljYXRvclByb3BzPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+XG4pID0+IHtcbiAgY29uc3QgeyBjaGlsZHJlbiwgY2xhc3NOYW1lLCBjeCwgZ2V0U3R5bGVzLCBpbm5lclByb3BzIH0gPSBwcm9wcztcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjc3M9e2dldFN0eWxlcygnZHJvcGRvd25JbmRpY2F0b3InLCBwcm9wcyl9XG4gICAgICBjbGFzc05hbWU9e2N4KFxuICAgICAgICB7XG4gICAgICAgICAgaW5kaWNhdG9yOiB0cnVlLFxuICAgICAgICAgICdkcm9wZG93bi1pbmRpY2F0b3InOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4uaW5uZXJQcm9wc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW4gfHwgPERvd25DaGV2cm9uIC8+fVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDbGVhckluZGljYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgLyoqIFRoZSBjaGlsZHJlbiB0byBiZSByZW5kZXJlZCBpbnNpZGUgdGhlIGluZGljYXRvci4gKi9cbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIC8qKiBQcm9wcyB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBjaGlsZHJlbi4gKi9cbiAgaW5uZXJQcm9wczogSlNYLkludHJpbnNpY0VsZW1lbnRzWydkaXYnXTtcbiAgLyoqIFRoZSBmb2N1c2VkIHN0YXRlIG9mIHRoZSBzZWxlY3QuICovXG4gIGlzRm9jdXNlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFySW5kaWNhdG9yQ1NTID0gYmFzZUNTUztcbmV4cG9ydCBjb25zdCBDbGVhckluZGljYXRvciA9IDxcbiAgT3B0aW9uLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbixcbiAgR3JvdXAgZXh0ZW5kcyBHcm91cEJhc2U8T3B0aW9uPlxuPihcbiAgcHJvcHM6IENsZWFySW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNoaWxkcmVuLCBjbGFzc05hbWUsIGN4LCBnZXRTdHlsZXMsIGlubmVyUHJvcHMgfSA9IHByb3BzO1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNzcz17Z2V0U3R5bGVzKCdjbGVhckluZGljYXRvcicsIHByb3BzKX1cbiAgICAgIGNsYXNzTmFtZT17Y3goXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRpY2F0b3I6IHRydWUsXG4gICAgICAgICAgJ2NsZWFyLWluZGljYXRvcic6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbiB8fCA8Q3Jvc3NJY29uIC8+fVxuICAgIDwvZGl2PlxuICApO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTZXBhcmF0b3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGljYXRvclNlcGFyYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgaXNEaXNhYmxlZDogYm9vbGVhbjtcbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBpbm5lclByb3BzPzogSlNYLkludHJpbnNpY0VsZW1lbnRzWydzcGFuJ107XG59XG5cbmV4cG9ydCBjb25zdCBpbmRpY2F0b3JTZXBhcmF0b3JDU1MgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oe1xuICBpc0Rpc2FibGVkLFxuICB0aGVtZToge1xuICAgIHNwYWNpbmc6IHsgYmFzZVVuaXQgfSxcbiAgICBjb2xvcnMsXG4gIH0sXG59OiBJbmRpY2F0b3JTZXBhcmF0b3JQcm9wczxPcHRpb24sIElzTXVsdGksIEdyb3VwPik6IENTU09iamVjdFdpdGhMYWJlbCA9PiAoe1xuICBsYWJlbDogJ2luZGljYXRvclNlcGFyYXRvcicsXG4gIGFsaWduU2VsZjogJ3N0cmV0Y2gnLFxuICBiYWNrZ3JvdW5kQ29sb3I6IGlzRGlzYWJsZWQgPyBjb2xvcnMubmV1dHJhbDEwIDogY29sb3JzLm5ldXRyYWwyMCxcbiAgbWFyZ2luQm90dG9tOiBiYXNlVW5pdCAqIDIsXG4gIG1hcmdpblRvcDogYmFzZVVuaXQgKiAyLFxuICB3aWR0aDogMSxcbn0pO1xuXG5leHBvcnQgY29uc3QgSW5kaWNhdG9yU2VwYXJhdG9yID0gPFxuICBPcHRpb24sXG4gIElzTXVsdGkgZXh0ZW5kcyBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+XG4+KFxuICBwcm9wczogSW5kaWNhdG9yU2VwYXJhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgY3gsIGdldFN0eWxlcywgaW5uZXJQcm9wcyB9ID0gcHJvcHM7XG4gIHJldHVybiAoXG4gICAgPHNwYW5cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgICAgY3NzPXtnZXRTdHlsZXMoJ2luZGljYXRvclNlcGFyYXRvcicsIHByb3BzKX1cbiAgICAgIGNsYXNzTmFtZT17Y3goeyAnaW5kaWNhdG9yLXNlcGFyYXRvcic6IHRydWUgfSwgY2xhc3NOYW1lKX1cbiAgICAvPlxuICApO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBMb2FkaW5nXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgbG9hZGluZ0RvdEFuaW1hdGlvbnMgPSBrZXlmcmFtZXNgXG4gIDAlLCA4MCUsIDEwMCUgeyBvcGFjaXR5OiAwOyB9XG4gIDQwJSB7IG9wYWNpdHk6IDE7IH1cbmA7XG5cbmV4cG9ydCBjb25zdCBsb2FkaW5nSW5kaWNhdG9yQ1NTID0gPFxuICBPcHRpb24sXG4gIElzTXVsdGkgZXh0ZW5kcyBib29sZWFuLFxuICBHcm91cCBleHRlbmRzIEdyb3VwQmFzZTxPcHRpb24+XG4+KHtcbiAgaXNGb2N1c2VkLFxuICBzaXplLFxuICB0aGVtZToge1xuICAgIGNvbG9ycyxcbiAgICBzcGFjaW5nOiB7IGJhc2VVbml0IH0sXG4gIH0sXG59OiBMb2FkaW5nSW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD4pOiBDU1NPYmplY3RXaXRoTGFiZWwgPT4gKHtcbiAgbGFiZWw6ICdsb2FkaW5nSW5kaWNhdG9yJyxcbiAgY29sb3I6IGlzRm9jdXNlZCA/IGNvbG9ycy5uZXV0cmFsNjAgOiBjb2xvcnMubmV1dHJhbDIwLFxuICBkaXNwbGF5OiAnZmxleCcsXG4gIHBhZGRpbmc6IGJhc2VVbml0ICogMixcbiAgdHJhbnNpdGlvbjogJ2NvbG9yIDE1MG1zJyxcbiAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgZm9udFNpemU6IHNpemUsXG4gIGxpbmVIZWlnaHQ6IDEsXG4gIG1hcmdpblJpZ2h0OiBzaXplLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbn0pO1xuXG5pbnRlcmZhY2UgTG9hZGluZ0RvdFByb3BzIHtcbiAgZGVsYXk6IG51bWJlcjtcbiAgb2Zmc2V0OiBib29sZWFuO1xufVxuY29uc3QgTG9hZGluZ0RvdCA9ICh7IGRlbGF5LCBvZmZzZXQgfTogTG9hZGluZ0RvdFByb3BzKSA9PiAoXG4gIDxzcGFuXG4gICAgY3NzPXt7XG4gICAgICBhbmltYXRpb246IGAke2xvYWRpbmdEb3RBbmltYXRpb25zfSAxcyBlYXNlLWluLW91dCAke2RlbGF5fW1zIGluZmluaXRlO2AsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnMWVtJyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgbWFyZ2luTGVmdDogb2Zmc2V0ID8gJzFlbScgOiB1bmRlZmluZWQsXG4gICAgICBoZWlnaHQ6ICcxZW0nLFxuICAgICAgdmVydGljYWxBbGlnbjogJ3RvcCcsXG4gICAgICB3aWR0aDogJzFlbScsXG4gICAgfX1cbiAgLz5cbik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGluZ0luZGljYXRvclByb3BzPFxuICBPcHRpb24gPSB1bmtub3duLFxuICBJc011bHRpIGV4dGVuZHMgYm9vbGVhbiA9IGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj4gPSBHcm91cEJhc2U8T3B0aW9uPlxuPiBleHRlbmRzIENvbW1vblByb3BzQW5kQ2xhc3NOYW1lPE9wdGlvbiwgSXNNdWx0aSwgR3JvdXA+IHtcbiAgLyoqIFByb3BzIHRoYXQgd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGNoaWxkcmVuLiAqL1xuICBpbm5lclByb3BzOiBKU1guSW50cmluc2ljRWxlbWVudHNbJ2RpdiddO1xuICAvKiogVGhlIGZvY3VzZWQgc3RhdGUgb2YgdGhlIHNlbGVjdC4gKi9cbiAgaXNGb2N1c2VkOiBib29sZWFuO1xuICBpc0Rpc2FibGVkOiBib29sZWFuO1xuICAvKiogU2V0IHNpemUgb2YgdGhlIGNvbnRhaW5lci4gKi9cbiAgc2l6ZTogbnVtYmVyO1xufVxuZXhwb3J0IGNvbnN0IExvYWRpbmdJbmRpY2F0b3IgPSA8XG4gIE9wdGlvbixcbiAgSXNNdWx0aSBleHRlbmRzIGJvb2xlYW4sXG4gIEdyb3VwIGV4dGVuZHMgR3JvdXBCYXNlPE9wdGlvbj5cbj4oXG4gIHByb3BzOiBMb2FkaW5nSW5kaWNhdG9yUHJvcHM8T3B0aW9uLCBJc011bHRpLCBHcm91cD5cbikgPT4ge1xuICBjb25zdCB7IGNsYXNzTmFtZSwgY3gsIGdldFN0eWxlcywgaW5uZXJQcm9wcywgaXNSdGwgfSA9IHByb3BzO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY3NzPXtnZXRTdHlsZXMoJ2xvYWRpbmdJbmRpY2F0b3InLCBwcm9wcyl9XG4gICAgICBjbGFzc05hbWU9e2N4KFxuICAgICAgICB7XG4gICAgICAgICAgaW5kaWNhdG9yOiB0cnVlLFxuICAgICAgICAgICdsb2FkaW5nLWluZGljYXRvcic6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5pbm5lclByb3BzfVxuICAgID5cbiAgICAgIDxMb2FkaW5nRG90IGRlbGF5PXswfSBvZmZzZXQ9e2lzUnRsfSAvPlxuICAgICAgPExvYWRpbmdEb3QgZGVsYXk9ezE2MH0gb2Zmc2V0IC8+XG4gICAgICA8TG9hZGluZ0RvdCBkZWxheT17MzIwfSBvZmZzZXQ9eyFpc1J0bH0gLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5Mb2FkaW5nSW5kaWNhdG9yLmRlZmF1bHRQcm9wcyA9IHsgc2l6ZTogNCB9O1xuIl19 */\")\n  });\n};\n\nvar LoadingIndicator = function LoadingIndicator(props) {\n  var className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps,\n      isRtl = props.isRtl;\n  return jsx(\"div\", _extends({\n    css: getStyles('loadingIndicator', props),\n    className: cx({\n      indicator: true,\n      'loading-indicator': true\n    }, className)\n  }, innerProps), jsx(LoadingDot, {\n    delay: 0,\n    offset: isRtl\n  }), jsx(LoadingDot, {\n    delay: 160,\n    offset: true\n  }), jsx(LoadingDot, {\n    delay: 320,\n    offset: !isRtl\n  }));\n};\nLoadingIndicator.defaultProps = {\n  size: 4\n};\n\nvar css$1 = function css(_ref) {\n  var isDisabled = _ref.isDisabled,\n      isFocused = _ref.isFocused,\n      _ref$theme = _ref.theme,\n      colors = _ref$theme.colors,\n      borderRadius = _ref$theme.borderRadius,\n      spacing = _ref$theme.spacing;\n  return {\n    label: 'control',\n    alignItems: 'center',\n    backgroundColor: isDisabled ? colors.neutral5 : colors.neutral0,\n    borderColor: isDisabled ? colors.neutral10 : isFocused ? colors.primary : colors.neutral20,\n    borderRadius: borderRadius,\n    borderStyle: 'solid',\n    borderWidth: 1,\n    boxShadow: isFocused ? \"0 0 0 1px \".concat(colors.primary) : undefined,\n    cursor: 'default',\n    display: 'flex',\n    flexWrap: 'wrap',\n    justifyContent: 'space-between',\n    minHeight: spacing.controlHeight,\n    outline: '0 !important',\n    position: 'relative',\n    transition: 'all 100ms',\n    '&:hover': {\n      borderColor: isFocused ? colors.primary : colors.neutral30\n    }\n  };\n};\n\nvar Control = function Control(props) {\n  var children = props.children,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      className = props.className,\n      isDisabled = props.isDisabled,\n      isFocused = props.isFocused,\n      innerRef = props.innerRef,\n      innerProps = props.innerProps,\n      menuIsOpen = props.menuIsOpen;\n  return jsx(\"div\", _extends({\n    ref: innerRef,\n    css: getStyles('control', props),\n    className: cx({\n      control: true,\n      'control--is-disabled': isDisabled,\n      'control--is-focused': isFocused,\n      'control--menu-is-open': menuIsOpen\n    }, className)\n  }, innerProps), children);\n};\n\nvar _excluded$1 = [\"data\"];\nvar groupCSS = function groupCSS(_ref) {\n  var spacing = _ref.theme.spacing;\n  return {\n    paddingBottom: spacing.baseUnit * 2,\n    paddingTop: spacing.baseUnit * 2\n  };\n};\n\nvar Group = function Group(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      Heading = props.Heading,\n      headingProps = props.headingProps,\n      innerProps = props.innerProps,\n      label = props.label,\n      theme = props.theme,\n      selectProps = props.selectProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('group', props),\n    className: cx({\n      group: true\n    }, className)\n  }, innerProps), jsx(Heading, _extends({}, headingProps, {\n    selectProps: selectProps,\n    theme: theme,\n    getStyles: getStyles,\n    cx: cx\n  }), label), jsx(\"div\", null, children));\n};\n\nvar groupHeadingCSS = function groupHeadingCSS(_ref2) {\n  var spacing = _ref2.theme.spacing;\n  return {\n    label: 'group',\n    color: '#999',\n    cursor: 'default',\n    display: 'block',\n    fontSize: '75%',\n    fontWeight: 500,\n    marginBottom: '0.25em',\n    paddingLeft: spacing.baseUnit * 3,\n    paddingRight: spacing.baseUnit * 3,\n    textTransform: 'uppercase'\n  };\n};\nvar GroupHeading = function GroupHeading(props) {\n  var getStyles = props.getStyles,\n      cx = props.cx,\n      className = props.className;\n\n  var _cleanCommonProps = cleanCommonProps(props);\n      _cleanCommonProps.data;\n      var innerProps = _objectWithoutProperties(_cleanCommonProps, _excluded$1);\n\n  return jsx(\"div\", _extends({\n    css: getStyles('groupHeading', props),\n    className: cx({\n      'group-heading': true\n    }, className)\n  }, innerProps));\n};\n\nvar _excluded = [\"innerRef\", \"isDisabled\", \"isHidden\", \"inputClassName\"];\nvar inputCSS = function inputCSS(_ref) {\n  var isDisabled = _ref.isDisabled,\n      value = _ref.value,\n      _ref$theme = _ref.theme,\n      spacing = _ref$theme.spacing,\n      colors = _ref$theme.colors;\n  return _objectSpread2({\n    margin: spacing.baseUnit / 2,\n    paddingBottom: spacing.baseUnit / 2,\n    paddingTop: spacing.baseUnit / 2,\n    visibility: isDisabled ? 'hidden' : 'visible',\n    color: colors.neutral80,\n    // force css to recompute when value change due to @emotion bug.\n    // We can remove it whenever the bug is fixed.\n    transform: value ? 'translateZ(0)' : ''\n  }, containerStyle);\n};\nvar spacingStyle = {\n  gridArea: '1 / 2',\n  font: 'inherit',\n  minWidth: '2px',\n  border: 0,\n  margin: 0,\n  outline: 0,\n  padding: 0\n};\nvar containerStyle = {\n  flex: '1 1 auto',\n  display: 'inline-grid',\n  gridArea: '1 / 1 / 2 / 3',\n  gridTemplateColumns: '0 min-content',\n  '&:after': _objectSpread2({\n    content: 'attr(data-value) \" \"',\n    visibility: 'hidden',\n    whiteSpace: 'pre'\n  }, spacingStyle)\n};\n\nvar inputStyle = function inputStyle(isHidden) {\n  return _objectSpread2({\n    label: 'input',\n    color: 'inherit',\n    background: 0,\n    opacity: isHidden ? 0 : 1,\n    width: '100%'\n  }, spacingStyle);\n};\n\nvar Input = function Input(props) {\n  var className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      value = props.value;\n\n  var _cleanCommonProps = cleanCommonProps(props),\n      innerRef = _cleanCommonProps.innerRef,\n      isDisabled = _cleanCommonProps.isDisabled,\n      isHidden = _cleanCommonProps.isHidden,\n      inputClassName = _cleanCommonProps.inputClassName,\n      innerProps = _objectWithoutProperties(_cleanCommonProps, _excluded);\n\n  return jsx(\"div\", {\n    className: cx({\n      'input-container': true\n    }, className),\n    css: getStyles('input', props),\n    \"data-value\": value || ''\n  }, jsx(\"input\", _extends({\n    className: cx({\n      input: true\n    }, inputClassName),\n    ref: innerRef,\n    style: inputStyle(isHidden),\n    disabled: isDisabled\n  }, innerProps)));\n};\n\nvar multiValueCSS = function multiValueCSS(_ref) {\n  var _ref$theme = _ref.theme,\n      spacing = _ref$theme.spacing,\n      borderRadius = _ref$theme.borderRadius,\n      colors = _ref$theme.colors;\n  return {\n    label: 'multiValue',\n    backgroundColor: colors.neutral10,\n    borderRadius: borderRadius / 2,\n    display: 'flex',\n    margin: spacing.baseUnit / 2,\n    minWidth: 0 // resolves flex/text-overflow bug\n\n  };\n};\nvar multiValueLabelCSS = function multiValueLabelCSS(_ref2) {\n  var _ref2$theme = _ref2.theme,\n      borderRadius = _ref2$theme.borderRadius,\n      colors = _ref2$theme.colors,\n      cropWithEllipsis = _ref2.cropWithEllipsis;\n  return {\n    borderRadius: borderRadius / 2,\n    color: colors.neutral80,\n    fontSize: '85%',\n    overflow: 'hidden',\n    padding: 3,\n    paddingLeft: 6,\n    textOverflow: cropWithEllipsis || cropWithEllipsis === undefined ? 'ellipsis' : undefined,\n    whiteSpace: 'nowrap'\n  };\n};\nvar multiValueRemoveCSS = function multiValueRemoveCSS(_ref3) {\n  var _ref3$theme = _ref3.theme,\n      spacing = _ref3$theme.spacing,\n      borderRadius = _ref3$theme.borderRadius,\n      colors = _ref3$theme.colors,\n      isFocused = _ref3.isFocused;\n  return {\n    alignItems: 'center',\n    borderRadius: borderRadius / 2,\n    backgroundColor: isFocused ? colors.dangerLight : undefined,\n    display: 'flex',\n    paddingLeft: spacing.baseUnit,\n    paddingRight: spacing.baseUnit,\n    ':hover': {\n      backgroundColor: colors.dangerLight,\n      color: colors.danger\n    }\n  };\n};\nvar MultiValueGeneric = function MultiValueGeneric(_ref4) {\n  var children = _ref4.children,\n      innerProps = _ref4.innerProps;\n  return jsx(\"div\", innerProps, children);\n};\nvar MultiValueContainer = MultiValueGeneric;\nvar MultiValueLabel = MultiValueGeneric;\nfunction MultiValueRemove(_ref5) {\n  var children = _ref5.children,\n      innerProps = _ref5.innerProps;\n  return jsx(\"div\", _extends({\n    role: \"button\"\n  }, innerProps), children || jsx(CrossIcon, {\n    size: 14\n  }));\n}\n\nvar MultiValue = function MultiValue(props) {\n  var children = props.children,\n      className = props.className,\n      components = props.components,\n      cx = props.cx,\n      data = props.data,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps,\n      isDisabled = props.isDisabled,\n      removeProps = props.removeProps,\n      selectProps = props.selectProps;\n  var Container = components.Container,\n      Label = components.Label,\n      Remove = components.Remove;\n  return jsx(ClassNames, null, function (_ref6) {\n    var css = _ref6.css,\n        emotionCx = _ref6.cx;\n    return jsx(Container, {\n      data: data,\n      innerProps: _objectSpread2({\n        className: emotionCx(css(getStyles('multiValue', props)), cx({\n          'multi-value': true,\n          'multi-value--is-disabled': isDisabled\n        }, className))\n      }, innerProps),\n      selectProps: selectProps\n    }, jsx(Label, {\n      data: data,\n      innerProps: {\n        className: emotionCx(css(getStyles('multiValueLabel', props)), cx({\n          'multi-value__label': true\n        }, className))\n      },\n      selectProps: selectProps\n    }, children), jsx(Remove, {\n      data: data,\n      innerProps: _objectSpread2({\n        className: emotionCx(css(getStyles('multiValueRemove', props)), cx({\n          'multi-value__remove': true\n        }, className)),\n        'aria-label': \"Remove \".concat(children || 'option')\n      }, removeProps),\n      selectProps: selectProps\n    }));\n  });\n};\n\nvar optionCSS = function optionCSS(_ref) {\n  var isDisabled = _ref.isDisabled,\n      isFocused = _ref.isFocused,\n      isSelected = _ref.isSelected,\n      _ref$theme = _ref.theme,\n      spacing = _ref$theme.spacing,\n      colors = _ref$theme.colors;\n  return {\n    label: 'option',\n    backgroundColor: isSelected ? colors.primary : isFocused ? colors.primary25 : 'transparent',\n    color: isDisabled ? colors.neutral20 : isSelected ? colors.neutral0 : 'inherit',\n    cursor: 'default',\n    display: 'block',\n    fontSize: 'inherit',\n    padding: \"\".concat(spacing.baseUnit * 2, \"px \").concat(spacing.baseUnit * 3, \"px\"),\n    width: '100%',\n    userSelect: 'none',\n    WebkitTapHighlightColor: 'rgba(0, 0, 0, 0)',\n    // provide some affordance on touch devices\n    ':active': {\n      backgroundColor: !isDisabled ? isSelected ? colors.primary : colors.primary50 : undefined\n    }\n  };\n};\n\nvar Option = function Option(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      isDisabled = props.isDisabled,\n      isFocused = props.isFocused,\n      isSelected = props.isSelected,\n      innerRef = props.innerRef,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('option', props),\n    className: cx({\n      option: true,\n      'option--is-disabled': isDisabled,\n      'option--is-focused': isFocused,\n      'option--is-selected': isSelected\n    }, className),\n    ref: innerRef,\n    \"aria-disabled\": isDisabled\n  }, innerProps), children);\n};\n\nvar placeholderCSS = function placeholderCSS(_ref) {\n  var _ref$theme = _ref.theme,\n      spacing = _ref$theme.spacing,\n      colors = _ref$theme.colors;\n  return {\n    label: 'placeholder',\n    color: colors.neutral50,\n    gridArea: '1 / 1 / 2 / 3',\n    marginLeft: spacing.baseUnit / 2,\n    marginRight: spacing.baseUnit / 2\n  };\n};\n\nvar Placeholder = function Placeholder(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('placeholder', props),\n    className: cx({\n      placeholder: true\n    }, className)\n  }, innerProps), children);\n};\n\nvar css = function css(_ref) {\n  var isDisabled = _ref.isDisabled,\n      _ref$theme = _ref.theme,\n      spacing = _ref$theme.spacing,\n      colors = _ref$theme.colors;\n  return {\n    label: 'singleValue',\n    color: isDisabled ? colors.neutral40 : colors.neutral80,\n    gridArea: '1 / 1 / 2 / 3',\n    marginLeft: spacing.baseUnit / 2,\n    marginRight: spacing.baseUnit / 2,\n    maxWidth: '100%',\n    overflow: 'hidden',\n    textOverflow: 'ellipsis',\n    whiteSpace: 'nowrap'\n  };\n};\n\nvar SingleValue = function SingleValue(props) {\n  var children = props.children,\n      className = props.className,\n      cx = props.cx,\n      getStyles = props.getStyles,\n      isDisabled = props.isDisabled,\n      innerProps = props.innerProps;\n  return jsx(\"div\", _extends({\n    css: getStyles('singleValue', props),\n    className: cx({\n      'single-value': true,\n      'single-value--is-disabled': isDisabled\n    }, className)\n  }, innerProps), children);\n};\n\nvar components = {\n  ClearIndicator: ClearIndicator,\n  Control: Control,\n  DropdownIndicator: DropdownIndicator,\n  DownChevron: DownChevron,\n  CrossIcon: CrossIcon,\n  Group: Group,\n  GroupHeading: GroupHeading,\n  IndicatorsContainer: IndicatorsContainer,\n  IndicatorSeparator: IndicatorSeparator,\n  Input: Input,\n  LoadingIndicator: LoadingIndicator,\n  Menu: Menu,\n  MenuList: MenuList,\n  MenuPortal: MenuPortal,\n  LoadingMessage: LoadingMessage,\n  NoOptionsMessage: NoOptionsMessage,\n  MultiValue: MultiValue,\n  MultiValueContainer: MultiValueContainer,\n  MultiValueLabel: MultiValueLabel,\n  MultiValueRemove: MultiValueRemove,\n  Option: Option,\n  Placeholder: Placeholder,\n  SelectContainer: SelectContainer,\n  SingleValue: SingleValue,\n  ValueContainer: ValueContainer\n};\nvar defaultComponents = function defaultComponents(props) {\n  return _objectSpread2(_objectSpread2({}, components), props.components);\n};\n\nexport { isTouchCapable as A, isMobileDevice as B, multiValueAsValue as C, singleValueAsValue as D, valueTernary as E, classNames as F, defaultComponents as G, notNullish as H, isDocumentElement as I, cleanValue as J, scrollIntoView as K, noop as L, MenuPlacer as M, handleInputChange as N, _createSuper as _, _objectSpread2 as a, clearIndicatorCSS as b, components as c, containerCSS as d, css$1 as e, dropdownIndicatorCSS as f, groupCSS as g, groupHeadingCSS as h, indicatorsContainerCSS as i, indicatorSeparatorCSS as j, inputCSS as k, loadingIndicatorCSS as l, loadingMessageCSS as m, menuCSS as n, menuListCSS as o, menuPortalCSS as p, multiValueCSS as q, removeProps as r, supportsPassiveEvents as s, multiValueLabelCSS as t, multiValueRemoveCSS as u, noOptionsMessageCSS as v, optionCSS as w, placeholderCSS as x, css as y, valueContainerCSS as z };\n","import { u as useStateManager } from './useStateManager-68425271.esm.js';\nexport { u as useStateManager } from './useStateManager-68425271.esm.js';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport * as React from 'react';\nimport { forwardRef, Component } from 'react';\nimport { S as Select } from './Select-54ac8379.esm.js';\nexport { c as createFilter, d as defaultTheme, m as mergeStyles } from './Select-54ac8379.esm.js';\nimport _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\nimport _inherits from '@babel/runtime/helpers/esm/inherits';\nimport { _ as _createSuper } from './index-a7690a33.esm.js';\nexport { c as components } from './index-a7690a33.esm.js';\nimport { CacheProvider } from '@emotion/react';\nimport createCache from '@emotion/cache';\nimport memoizeOne from 'memoize-one';\nimport '@babel/runtime/helpers/slicedToArray';\nimport '@babel/runtime/helpers/objectWithoutProperties';\nimport '@babel/runtime/helpers/toConsumableArray';\nimport '@babel/runtime/helpers/taggedTemplateLiteral';\nimport '@babel/runtime/helpers/typeof';\nimport '@babel/runtime/helpers/defineProperty';\nimport 'react-dom';\n\nvar StateManagedSelect = /*#__PURE__*/forwardRef(function (props, ref) {\n  var baseSelectProps = useStateManager(props);\n  return /*#__PURE__*/React.createElement(Select, _extends({\n    ref: ref\n  }, baseSelectProps));\n});\n\nvar NonceProvider = /*#__PURE__*/function (_Component) {\n  _inherits(NonceProvider, _Component);\n\n  var _super = _createSuper(NonceProvider);\n\n  function NonceProvider(props) {\n    var _this;\n\n    _classCallCheck(this, NonceProvider);\n\n    _this = _super.call(this, props);\n\n    _this.createEmotionCache = function (nonce, key) {\n      return createCache({\n        nonce: nonce,\n        key: key\n      });\n    };\n\n    _this.createEmotionCache = memoizeOne(_this.createEmotionCache);\n    return _this;\n  }\n\n  _createClass(NonceProvider, [{\n    key: \"render\",\n    value: function render() {\n      var emotionCache = this.createEmotionCache(this.props.nonce, this.props.cacheKey);\n      return /*#__PURE__*/React.createElement(CacheProvider, {\n        value: emotionCache\n      }, this.props.children);\n    }\n  }]);\n\n  return NonceProvider;\n}(Component);\n\nexport default StateManagedSelect;\nexport { NonceProvider };\n","import { a as _objectSpread2 } from './index-a7690a33.esm.js';\nimport _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';\nimport _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';\nimport { useState, useCallback } from 'react';\n\nvar _excluded = [\"defaultInputValue\", \"defaultMenuIsOpen\", \"defaultValue\", \"inputValue\", \"menuIsOpen\", \"onChange\", \"onInputChange\", \"onMenuClose\", \"onMenuOpen\", \"value\"];\nfunction useStateManager(_ref) {\n  var _ref$defaultInputValu = _ref.defaultInputValue,\n      defaultInputValue = _ref$defaultInputValu === void 0 ? '' : _ref$defaultInputValu,\n      _ref$defaultMenuIsOpe = _ref.defaultMenuIsOpen,\n      defaultMenuIsOpen = _ref$defaultMenuIsOpe === void 0 ? false : _ref$defaultMenuIsOpe,\n      _ref$defaultValue = _ref.defaultValue,\n      defaultValue = _ref$defaultValue === void 0 ? null : _ref$defaultValue,\n      propsInputValue = _ref.inputValue,\n      propsMenuIsOpen = _ref.menuIsOpen,\n      propsOnChange = _ref.onChange,\n      propsOnInputChange = _ref.onInputChange,\n      propsOnMenuClose = _ref.onMenuClose,\n      propsOnMenuOpen = _ref.onMenuOpen,\n      propsValue = _ref.value,\n      restSelectProps = _objectWithoutProperties(_ref, _excluded);\n\n  var _useState = useState(propsInputValue !== undefined ? propsInputValue : defaultInputValue),\n      _useState2 = _slicedToArray(_useState, 2),\n      stateInputValue = _useState2[0],\n      setStateInputValue = _useState2[1];\n\n  var _useState3 = useState(propsMenuIsOpen !== undefined ? propsMenuIsOpen : defaultMenuIsOpen),\n      _useState4 = _slicedToArray(_useState3, 2),\n      stateMenuIsOpen = _useState4[0],\n      setStateMenuIsOpen = _useState4[1];\n\n  var _useState5 = useState(propsValue !== undefined ? propsValue : defaultValue),\n      _useState6 = _slicedToArray(_useState5, 2),\n      stateValue = _useState6[0],\n      setStateValue = _useState6[1];\n\n  var onChange = useCallback(function (value, actionMeta) {\n    if (typeof propsOnChange === 'function') {\n      propsOnChange(value, actionMeta);\n    }\n\n    setStateValue(value);\n  }, [propsOnChange]);\n  var onInputChange = useCallback(function (value, actionMeta) {\n    var newValue;\n\n    if (typeof propsOnInputChange === 'function') {\n      newValue = propsOnInputChange(value, actionMeta);\n    }\n\n    setStateInputValue(newValue !== undefined ? newValue : value);\n  }, [propsOnInputChange]);\n  var onMenuOpen = useCallback(function () {\n    if (typeof propsOnMenuOpen === 'function') {\n      propsOnMenuOpen();\n    }\n\n    setStateMenuIsOpen(true);\n  }, [propsOnMenuOpen]);\n  var onMenuClose = useCallback(function () {\n    if (typeof propsOnMenuClose === 'function') {\n      propsOnMenuClose();\n    }\n\n    setStateMenuIsOpen(false);\n  }, [propsOnMenuClose]);\n  var inputValue = propsInputValue !== undefined ? propsInputValue : stateInputValue;\n  var menuIsOpen = propsMenuIsOpen !== undefined ? propsMenuIsOpen : stateMenuIsOpen;\n  var value = propsValue !== undefined ? propsValue : stateValue;\n  return _objectSpread2(_objectSpread2({}, restSelectProps), {}, {\n    inputValue: inputValue,\n    menuIsOpen: menuIsOpen,\n    onChange: onChange,\n    onInputChange: onInputChange,\n    onMenuClose: onMenuClose,\n    onMenuOpen: onMenuOpen,\n    value: value\n  });\n}\n\nexport { useStateManager as u };\n","import * as React from 'react';\n\nconst LEFT = \"Left\";\nconst RIGHT = \"Right\";\nconst UP = \"Up\";\nconst DOWN = \"Down\";\n\n/* global document */\nconst defaultProps = {\n    delta: 10,\n    preventScrollOnSwipe: false,\n    rotationAngle: 0,\n    trackMouse: false,\n    trackTouch: true,\n    swipeDuration: Infinity,\n    touchEventOptions: { passive: true },\n};\nconst initialState = {\n    first: true,\n    initial: [0, 0],\n    start: 0,\n    swiping: false,\n    xy: [0, 0],\n};\nconst mouseMove = \"mousemove\";\nconst mouseUp = \"mouseup\";\nconst touchEnd = \"touchend\";\nconst touchMove = \"touchmove\";\nconst touchStart = \"touchstart\";\nfunction getDirection(absX, absY, deltaX, deltaY) {\n    if (absX > absY) {\n        if (deltaX > 0) {\n            return RIGHT;\n        }\n        return LEFT;\n    }\n    else if (deltaY > 0) {\n        return DOWN;\n    }\n    return UP;\n}\nfunction rotateXYByAngle(pos, angle) {\n    if (angle === 0)\n        return pos;\n    const angleInRadians = (Math.PI / 180) * angle;\n    const x = pos[0] * Math.cos(angleInRadians) + pos[1] * Math.sin(angleInRadians);\n    const y = pos[1] * Math.cos(angleInRadians) - pos[0] * Math.sin(angleInRadians);\n    return [x, y];\n}\nfunction getHandlers(set, handlerProps) {\n    const onStart = (event) => {\n        const isTouch = \"touches\" in event;\n        // if more than a single touch don't track, for now...\n        if (isTouch && event.touches.length > 1)\n            return;\n        set((state, props) => {\n            // setup mouse listeners on document to track swipe since swipe can leave container\n            if (props.trackMouse && !isTouch) {\n                document.addEventListener(mouseMove, onMove);\n                document.addEventListener(mouseUp, onUp);\n            }\n            const { clientX, clientY } = isTouch ? event.touches[0] : event;\n            const xy = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n            props.onTouchStartOrOnMouseDown &&\n                props.onTouchStartOrOnMouseDown({ event });\n            return Object.assign(Object.assign(Object.assign({}, state), initialState), { initial: xy.slice(), xy, start: event.timeStamp || 0 });\n        });\n    };\n    const onMove = (event) => {\n        set((state, props) => {\n            const isTouch = \"touches\" in event;\n            // Discount a swipe if additional touches are present after\n            // a swipe has started.\n            if (isTouch && event.touches.length > 1) {\n                return state;\n            }\n            // if swipe has exceeded duration stop tracking\n            if (event.timeStamp - state.start > props.swipeDuration) {\n                return state.swiping ? Object.assign(Object.assign({}, state), { swiping: false }) : state;\n            }\n            const { clientX, clientY } = isTouch ? event.touches[0] : event;\n            const [x, y] = rotateXYByAngle([clientX, clientY], props.rotationAngle);\n            const deltaX = x - state.xy[0];\n            const deltaY = y - state.xy[1];\n            const absX = Math.abs(deltaX);\n            const absY = Math.abs(deltaY);\n            const time = (event.timeStamp || 0) - state.start;\n            const velocity = Math.sqrt(absX * absX + absY * absY) / (time || 1);\n            const vxvy = [deltaX / (time || 1), deltaY / (time || 1)];\n            const dir = getDirection(absX, absY, deltaX, deltaY);\n            // if swipe is under delta and we have not started to track a swipe: skip update\n            const delta = typeof props.delta === \"number\"\n                ? props.delta\n                : props.delta[dir.toLowerCase()] ||\n                    defaultProps.delta;\n            if (absX < delta && absY < delta && !state.swiping)\n                return state;\n            const eventData = {\n                absX,\n                absY,\n                deltaX,\n                deltaY,\n                dir,\n                event,\n                first: state.first,\n                initial: state.initial,\n                velocity,\n                vxvy,\n            };\n            // call onSwipeStart if present and is first swipe event\n            eventData.first && props.onSwipeStart && props.onSwipeStart(eventData);\n            // call onSwiping if present\n            props.onSwiping && props.onSwiping(eventData);\n            // track if a swipe is cancelable (handler for swiping or swiped(dir) exists)\n            // so we can call preventDefault if needed\n            let cancelablePageSwipe = false;\n            if (props.onSwiping ||\n                props.onSwiped ||\n                props[`onSwiped${dir}`]) {\n                cancelablePageSwipe = true;\n            }\n            if (cancelablePageSwipe &&\n                props.preventScrollOnSwipe &&\n                props.trackTouch &&\n                event.cancelable) {\n                event.preventDefault();\n            }\n            return Object.assign(Object.assign({}, state), { \n                // first is now always false\n                first: false, eventData, swiping: true });\n        });\n    };\n    const onEnd = (event) => {\n        set((state, props) => {\n            let eventData;\n            if (state.swiping && state.eventData) {\n                // if swipe is less than duration fire swiped callbacks\n                if (event.timeStamp - state.start < props.swipeDuration) {\n                    eventData = Object.assign(Object.assign({}, state.eventData), { event });\n                    props.onSwiped && props.onSwiped(eventData);\n                    const onSwipedDir = props[`onSwiped${eventData.dir}`];\n                    onSwipedDir && onSwipedDir(eventData);\n                }\n            }\n            else {\n                props.onTap && props.onTap({ event });\n            }\n            props.onTouchEndOrOnMouseUp && props.onTouchEndOrOnMouseUp({ event });\n            return Object.assign(Object.assign(Object.assign({}, state), initialState), { eventData });\n        });\n    };\n    const cleanUpMouse = () => {\n        // safe to just call removeEventListener\n        document.removeEventListener(mouseMove, onMove);\n        document.removeEventListener(mouseUp, onUp);\n    };\n    const onUp = (e) => {\n        cleanUpMouse();\n        onEnd(e);\n    };\n    /**\n     * The value of passive on touchMove depends on `preventScrollOnSwipe`:\n     * - true => { passive: false }\n     * - false => { passive: true } // Default\n     *\n     * NOTE: When preventScrollOnSwipe is true, we attempt to call preventDefault to prevent scroll.\n     *\n     * props.touchEventOptions can also be set for all touch event listeners,\n     * but for `touchmove` specifically when `preventScrollOnSwipe` it will\n     * supersede and force passive to false.\n     *\n     */\n    const attachTouch = (el, props) => {\n        let cleanup = () => { };\n        if (el && el.addEventListener) {\n            const baseOptions = Object.assign(Object.assign({}, defaultProps.touchEventOptions), props.touchEventOptions);\n            // attach touch event listeners and handlers\n            const tls = [\n                [touchStart, onStart, baseOptions],\n                // preventScrollOnSwipe option supersedes touchEventOptions.passive\n                [\n                    touchMove,\n                    onMove,\n                    Object.assign(Object.assign({}, baseOptions), (props.preventScrollOnSwipe ? { passive: false } : {})),\n                ],\n                [touchEnd, onEnd, baseOptions],\n            ];\n            tls.forEach(([e, h, o]) => el.addEventListener(e, h, o));\n            // return properly scoped cleanup method for removing listeners, options not required\n            cleanup = () => tls.forEach(([e, h]) => el.removeEventListener(e, h));\n        }\n        return cleanup;\n    };\n    const onRef = (el) => {\n        // \"inline\" ref functions are called twice on render, once with null then again with DOM element\n        // ignore null here\n        if (el === null)\n            return;\n        set((state, props) => {\n            // if the same DOM el as previous just return state\n            if (state.el === el)\n                return state;\n            const addState = {};\n            // if new DOM el clean up old DOM and reset cleanUpTouch\n            if (state.el && state.el !== el && state.cleanUpTouch) {\n                state.cleanUpTouch();\n                addState.cleanUpTouch = void 0;\n            }\n            // only attach if we want to track touch\n            if (props.trackTouch && el) {\n                addState.cleanUpTouch = attachTouch(el, props);\n            }\n            // store event attached DOM el for comparison, clean up, and re-attachment\n            return Object.assign(Object.assign(Object.assign({}, state), { el }), addState);\n        });\n    };\n    // set ref callback to attach touch event listeners\n    const output = {\n        ref: onRef,\n    };\n    // if track mouse attach mouse down listener\n    if (handlerProps.trackMouse) {\n        output.onMouseDown = onStart;\n    }\n    return [output, attachTouch];\n}\nfunction updateTransientState(state, props, previousProps, attachTouch) {\n    // if trackTouch is off or there is no el, then remove handlers if necessary and exit\n    if (!props.trackTouch || !state.el) {\n        if (state.cleanUpTouch) {\n            state.cleanUpTouch();\n        }\n        return Object.assign(Object.assign({}, state), { cleanUpTouch: undefined });\n    }\n    // trackTouch is on, so if there are no handlers attached, attach them and exit\n    if (!state.cleanUpTouch) {\n        return Object.assign(Object.assign({}, state), { cleanUpTouch: attachTouch(state.el, props) });\n    }\n    // trackTouch is on and handlers are already attached, so if preventScrollOnSwipe changes value,\n    // remove and reattach handlers (this is required to update the passive option when attaching\n    // the handlers)\n    if (props.preventScrollOnSwipe !== previousProps.preventScrollOnSwipe ||\n        props.touchEventOptions.passive !== previousProps.touchEventOptions.passive) {\n        state.cleanUpTouch();\n        return Object.assign(Object.assign({}, state), { cleanUpTouch: attachTouch(state.el, props) });\n    }\n    return state;\n}\nfunction useSwipeable(options) {\n    const { trackMouse } = options;\n    const transientState = React.useRef(Object.assign({}, initialState));\n    const transientProps = React.useRef(Object.assign({}, defaultProps));\n    // track previous rendered props\n    const previousProps = React.useRef(Object.assign({}, transientProps.current));\n    previousProps.current = Object.assign({}, transientProps.current);\n    // update current render props & defaults\n    transientProps.current = Object.assign(Object.assign({}, defaultProps), options);\n    // Force defaults for config properties\n    let defaultKey;\n    for (defaultKey in defaultProps) {\n        if (transientProps.current[defaultKey] === void 0) {\n            transientProps.current[defaultKey] = defaultProps[defaultKey];\n        }\n    }\n    const [handlers, attachTouch] = React.useMemo(() => getHandlers((stateSetter) => (transientState.current = stateSetter(transientState.current, transientProps.current)), { trackMouse }), [trackMouse]);\n    transientState.current = updateTransientState(transientState.current, transientProps.current, previousProps.current, attachTouch);\n    return handlers;\n}\n\nexport { DOWN, LEFT, RIGHT, UP, useSwipeable };\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArrowContainer = void 0;\nvar jsx_runtime_1 = require(\"react/jsx-runtime\");\nvar react_1 = require(\"react\");\nvar useArrowContainer_1 = require(\"./useArrowContainer\");\nvar ArrowContainer = function (_a) {\n    var childRect = _a.childRect, popoverRect = _a.popoverRect, position = _a.position, arrowColor = _a.arrowColor, arrowSize = _a.arrowSize, arrowClassName = _a.arrowClassName, externalArrowStyle = _a.arrowStyle, className = _a.className, children = _a.children, externalArrowContainerStyle = _a.style;\n    var _b = useArrowContainer_1.useArrowContainer({\n        childRect: childRect,\n        popoverRect: popoverRect,\n        position: position,\n        arrowColor: arrowColor,\n        arrowSize: arrowSize,\n    }), arrowContainerStyle = _b.arrowContainerStyle, arrowStyle = _b.arrowStyle;\n    var mergedContainerStyle = react_1.useMemo(function () { return (__assign(__assign({}, arrowContainerStyle), externalArrowContainerStyle)); }, [arrowContainerStyle, externalArrowContainerStyle]);\n    var mergedArrowStyle = react_1.useMemo(function () { return (__assign(__assign({}, arrowStyle), externalArrowStyle)); }, [arrowStyle, externalArrowStyle]);\n    return (jsx_runtime_1.jsxs(\"div\", __assign({ className: className, style: mergedContainerStyle }, { children: [jsx_runtime_1.jsx(\"div\", { style: mergedArrowStyle, className: arrowClassName }, void 0), children] }), void 0));\n};\nexports.ArrowContainer = ArrowContainer;\n//# sourceMappingURL=ArrowContainer.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Popover = exports.usePopover = exports.ArrowContainer = exports.useArrowContainer = void 0;\nvar jsx_runtime_1 = require(\"react/jsx-runtime\");\nvar react_1 = require(\"react\");\nvar PopoverPortal_1 = require(\"./PopoverPortal\");\nvar util_1 = require(\"./util\");\nvar usePopover_1 = require(\"./usePopover\");\nObject.defineProperty(exports, \"usePopover\", { enumerable: true, get: function () { return usePopover_1.usePopover; } });\nvar useMemoizedArray_1 = require(\"./useMemoizedArray\");\nvar useArrowContainer_1 = require(\"./useArrowContainer\");\nObject.defineProperty(exports, \"useArrowContainer\", { enumerable: true, get: function () { return useArrowContainer_1.useArrowContainer; } });\nvar ArrowContainer_1 = require(\"./ArrowContainer\");\nObject.defineProperty(exports, \"ArrowContainer\", { enumerable: true, get: function () { return ArrowContainer_1.ArrowContainer; } });\nvar DEFAULT_POSITIONS = ['top', 'left', 'right', 'bottom'];\nvar PopoverInternal = react_1.forwardRef(function (_a, externalRef) {\n    var isOpen = _a.isOpen, children = _a.children, content = _a.content, _b = _a.positions, externalPositions = _b === void 0 ? DEFAULT_POSITIONS : _b, _c = _a.align, align = _c === void 0 ? 'center' : _c, _d = _a.padding, padding = _d === void 0 ? 0 : _d, _e = _a.reposition, reposition = _e === void 0 ? true : _e, _f = _a.parentElement, parentElement = _f === void 0 ? window.document.body : _f, _g = _a.boundaryElement, boundaryElement = _g === void 0 ? parentElement : _g, _h = _a.containerClassName, containerClassName = _h === void 0 ? 'react-tiny-popover-container' : _h, containerStyle = _a.containerStyle, contentLocation = _a.contentLocation, _j = _a.boundaryInset, boundaryInset = _j === void 0 ? 0 : _j, onClickOutside = _a.onClickOutside, _k = _a.clickOutsideCapture, clickOutsideCapture = _k === void 0 ? false : _k;\n    var positions = useMemoizedArray_1.useMemoizedArray(externalPositions);\n    // TODO: factor prevs out into a custom prevs hook\n    var prevIsOpen = react_1.useRef(false);\n    var prevPositions = react_1.useRef();\n    var prevContentLocation = react_1.useRef();\n    var prevReposition = react_1.useRef(reposition);\n    var childRef = react_1.useRef();\n    var _l = react_1.useState({\n        align: align,\n        nudgedLeft: 0,\n        nudgedTop: 0,\n        position: positions[0],\n        padding: padding,\n        childRect: util_1.EMPTY_CLIENT_RECT,\n        popoverRect: util_1.EMPTY_CLIENT_RECT,\n        parentRect: util_1.EMPTY_CLIENT_RECT,\n        boundaryRect: util_1.EMPTY_CLIENT_RECT,\n        boundaryInset: boundaryInset,\n        violations: util_1.EMPTY_CLIENT_RECT,\n        hasViolations: false,\n    }), popoverState = _l[0], setPopoverState = _l[1];\n    var onPositionPopover = react_1.useCallback(function (popoverState) { return setPopoverState(popoverState); }, []);\n    var _m = usePopover_1.usePopover({\n        isOpen: isOpen,\n        childRef: childRef,\n        containerClassName: containerClassName,\n        parentElement: parentElement,\n        boundaryElement: boundaryElement,\n        contentLocation: contentLocation,\n        positions: positions,\n        align: align,\n        padding: padding,\n        boundaryInset: boundaryInset,\n        reposition: reposition,\n        onPositionPopover: onPositionPopover,\n    }), positionPopover = _m.positionPopover, popoverRef = _m.popoverRef, scoutRef = _m.scoutRef;\n    react_1.useLayoutEffect(function () {\n        var shouldUpdate = true;\n        var updatePopover = function () {\n            var _a, _b;\n            if (isOpen && shouldUpdate) {\n                var childRect = (_a = childRef === null || childRef === void 0 ? void 0 : childRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();\n                var popoverRect = (_b = popoverRef === null || popoverRef === void 0 ? void 0 : popoverRef.current) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect();\n                if (childRect != null &&\n                    popoverRect != null &&\n                    (!util_1.rectsAreEqual(childRect, {\n                        top: popoverState.childRect.top,\n                        left: popoverState.childRect.left,\n                        width: popoverState.childRect.width,\n                        height: popoverState.childRect.height,\n                        bottom: popoverState.childRect.top + popoverState.childRect.height,\n                        right: popoverState.childRect.left + popoverState.childRect.width,\n                    }) ||\n                        popoverRect.width !== popoverState.popoverRect.width ||\n                        popoverRect.height !== popoverState.popoverRect.height ||\n                        popoverState.padding !== padding ||\n                        popoverState.align !== align ||\n                        positions !== prevPositions.current ||\n                        contentLocation !== prevContentLocation.current ||\n                        reposition !== prevReposition.current)) {\n                    positionPopover();\n                }\n                // TODO: factor prev checks out into the custom prevs hook\n                if (positions !== prevPositions.current) {\n                    prevPositions.current = positions;\n                }\n                if (contentLocation !== prevContentLocation.current) {\n                    prevContentLocation.current = contentLocation;\n                }\n                if (reposition !== prevReposition.current) {\n                    prevReposition.current = reposition;\n                }\n                if (shouldUpdate) {\n                    window.requestAnimationFrame(updatePopover);\n                }\n            }\n            prevIsOpen.current = isOpen;\n        };\n        window.requestAnimationFrame(updatePopover);\n        return function () {\n            shouldUpdate = false;\n        };\n    }, [\n        align,\n        contentLocation,\n        isOpen,\n        padding,\n        popoverRef,\n        popoverState.align,\n        popoverState.childRect.height,\n        popoverState.childRect.left,\n        popoverState.childRect.top,\n        popoverState.childRect.width,\n        popoverState.padding,\n        popoverState.popoverRect.height,\n        popoverState.popoverRect.width,\n        positionPopover,\n        positions,\n        reposition,\n    ]);\n    react_1.useEffect(function () {\n        var popoverElement = popoverRef.current;\n        Object.assign(popoverElement.style, containerStyle);\n        return function () {\n            Object.keys(containerStyle !== null && containerStyle !== void 0 ? containerStyle : {}).forEach(function (key) {\n                return delete popoverElement.style[key];\n            });\n        };\n    }, [containerStyle, isOpen, popoverRef]);\n    var handleOnClickOutside = react_1.useCallback(function (e) {\n        var _a, _b;\n        if (isOpen &&\n            !((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(e.target)) &&\n            !((_b = childRef.current) === null || _b === void 0 ? void 0 : _b.contains(e.target))) {\n            onClickOutside === null || onClickOutside === void 0 ? void 0 : onClickOutside(e);\n        }\n    }, [isOpen, onClickOutside, popoverRef]);\n    var handleWindowResize = react_1.useCallback(function () {\n        if (childRef.current) {\n            window.requestAnimationFrame(function () { return positionPopover(); });\n        }\n    }, [positionPopover]);\n    react_1.useEffect(function () {\n        window.addEventListener('click', handleOnClickOutside, clickOutsideCapture);\n        window.addEventListener('contextmenu', handleOnClickOutside, clickOutsideCapture);\n        window.addEventListener('resize', handleWindowResize);\n        return function () {\n            window.removeEventListener('click', handleOnClickOutside, clickOutsideCapture);\n            window.removeEventListener('contextmenu', handleOnClickOutside, clickOutsideCapture);\n            window.removeEventListener('resize', handleWindowResize);\n        };\n    }, [clickOutsideCapture, handleOnClickOutside, handleWindowResize]);\n    var handleRef = react_1.useCallback(function (node) {\n        childRef.current = node;\n        if (externalRef != null) {\n            if (typeof externalRef === 'object') {\n                externalRef.current = node;\n            }\n            else if (typeof externalRef === 'function') {\n                externalRef(node);\n            }\n        }\n    }, [externalRef]);\n    var renderChild = function () {\n        return react_1.cloneElement(children, {\n            ref: handleRef,\n        });\n    };\n    var renderPopover = function () {\n        if (!isOpen)\n            return null;\n        return (jsx_runtime_1.jsx(PopoverPortal_1.PopoverPortal, __assign({ element: popoverRef.current, scoutElement: scoutRef.current, container: parentElement }, { children: typeof content === 'function' ? content(popoverState) : content }), void 0));\n    };\n    return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderChild(), renderPopover()] }, void 0));\n});\nexports.Popover = react_1.forwardRef(function (props, ref) {\n    if (typeof window === 'undefined')\n        return props.children;\n    return jsx_runtime_1.jsx(PopoverInternal, __assign({}, props, { ref: ref }), void 0);\n});\n//# sourceMappingURL=Popover.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PopoverPortal = void 0;\nvar react_1 = require(\"react\");\nvar react_dom_1 = require(\"react-dom\");\nvar PopoverPortal = function (_a) {\n    var container = _a.container, element = _a.element, scoutElement = _a.scoutElement, children = _a.children;\n    react_1.useLayoutEffect(function () {\n        container.appendChild(element);\n        container.appendChild(scoutElement);\n        return function () {\n            container.removeChild(element);\n            container.removeChild(scoutElement);\n        };\n    }, [container, element]);\n    return react_dom_1.createPortal(children, element);\n};\nexports.PopoverPortal = PopoverPortal;\n//# sourceMappingURL=PopoverPortal.js.map","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useArrowContainer = void 0;\nvar react_1 = require(\"react\");\nvar useArrowContainer = function (_a) {\n    var childRect = _a.childRect, popoverRect = _a.popoverRect, position = _a.position, arrowSize = _a.arrowSize, arrowColor = _a.arrowColor;\n    var arrowContainerStyle = react_1.useMemo(function () {\n        return ({\n            padding: arrowSize,\n        });\n    }, [arrowSize]);\n    var arrowStyle = react_1.useMemo(function () {\n        return (__assign({ position: 'absolute' }, (function () {\n            var arrowWidth = arrowSize * 2;\n            var top = childRect.top - popoverRect.top + childRect.height / 2 - arrowWidth / 2;\n            var left = childRect.left - popoverRect.left + childRect.width / 2 - arrowWidth / 2;\n            var lowerBound = arrowSize;\n            var leftUpperBound = popoverRect.width - arrowSize;\n            var topUpperBound = popoverRect.height - arrowSize;\n            left = left < lowerBound ? lowerBound : left;\n            left = left + arrowWidth > leftUpperBound ? leftUpperBound - arrowWidth : left;\n            top = top < lowerBound ? lowerBound : top;\n            top = top + arrowWidth > topUpperBound ? topUpperBound - arrowWidth : top;\n            top = Number.isNaN(top) ? 0 : top;\n            left = Number.isNaN(left) ? 0 : left;\n            switch (position) {\n                case 'right':\n                    return {\n                        borderTop: arrowSize + \"px solid transparent\",\n                        borderBottom: arrowSize + \"px solid transparent\",\n                        borderRight: arrowSize + \"px solid \" + arrowColor,\n                        left: 0,\n                        top: top,\n                    };\n                case 'left':\n                    return {\n                        borderTop: arrowSize + \"px solid transparent\",\n                        borderBottom: arrowSize + \"px solid transparent\",\n                        borderLeft: arrowSize + \"px solid \" + arrowColor,\n                        right: 0,\n                        top: top,\n                    };\n                case 'bottom':\n                    return {\n                        borderLeft: arrowSize + \"px solid transparent\",\n                        borderRight: arrowSize + \"px solid transparent\",\n                        borderBottom: arrowSize + \"px solid \" + arrowColor,\n                        top: 0,\n                        left: left,\n                    };\n                case 'top':\n                    return {\n                        borderLeft: arrowSize + \"px solid transparent\",\n                        borderRight: arrowSize + \"px solid transparent\",\n                        borderTop: arrowSize + \"px solid \" + arrowColor,\n                        bottom: 0,\n                        left: left,\n                    };\n                default:\n                    return {\n                        display: 'hidden',\n                    };\n            }\n        })()));\n    }, [\n        arrowColor,\n        arrowSize,\n        childRect.height,\n        childRect.left,\n        childRect.top,\n        childRect.width,\n        popoverRect.height,\n        popoverRect.left,\n        popoverRect.top,\n        popoverRect.width,\n        position,\n    ]);\n    return {\n        arrowContainerStyle: arrowContainerStyle,\n        arrowStyle: arrowStyle,\n    };\n};\nexports.useArrowContainer = useArrowContainer;\n//# sourceMappingURL=useArrowContainer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useElementRef = void 0;\nvar react_1 = require(\"react\");\nvar util_1 = require(\"./util\");\nvar useElementRef = function (containerClassName, containerStyle) {\n    var ref = react_1.useRef();\n    var element = react_1.useMemo(function () { return util_1.createContainer(containerStyle, containerClassName); }, [containerClassName, containerStyle]);\n    ref.current = element;\n    return ref;\n};\nexports.useElementRef = useElementRef;\n//# sourceMappingURL=useElementRef.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.useMemoizedArray = void 0;\nvar react_1 = require(\"react\");\nvar useMemoizedArray = function (externalArray) {\n    var prevArrayRef = react_1.useRef(externalArray);\n    var array = react_1.useMemo(function () {\n        if (prevArrayRef.current === externalArray)\n            return prevArrayRef.current;\n        if (prevArrayRef.current.length !== externalArray.length) {\n            prevArrayRef.current = externalArray;\n            return externalArray;\n        }\n        for (var i = 0; i < externalArray.length; i += 1) {\n            if (externalArray[i] !== prevArrayRef.current[i]) {\n                prevArrayRef.current = externalArray;\n                return externalArray;\n            }\n        }\n        return prevArrayRef.current;\n    }, [externalArray]);\n    return array;\n};\nexports.useMemoizedArray = useMemoizedArray;\n//# sourceMappingURL=useMemoizedArray.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.usePopover = void 0;\nvar react_1 = require(\"react\");\nvar util_1 = require(\"./util\");\nvar useElementRef_1 = require(\"./useElementRef\");\nvar POPOVER_STYLE = {\n    position: 'fixed',\n    overflow: 'visible',\n    top: '0px',\n    left: '0px',\n};\nvar SCOUT_STYLE = {\n    position: 'fixed',\n    top: '0px',\n    left: '0px',\n    width: '0px',\n    height: '0px',\n    visibility: 'hidden',\n};\nvar usePopover = function (_a) {\n    var isOpen = _a.isOpen, childRef = _a.childRef, positions = _a.positions, containerClassName = _a.containerClassName, parentElement = _a.parentElement, contentLocation = _a.contentLocation, align = _a.align, padding = _a.padding, reposition = _a.reposition, boundaryInset = _a.boundaryInset, boundaryElement = _a.boundaryElement, onPositionPopover = _a.onPositionPopover;\n    var popoverRef = useElementRef_1.useElementRef(containerClassName, POPOVER_STYLE);\n    var scoutRef = useElementRef_1.useElementRef('react-tiny-popover-scout', SCOUT_STYLE);\n    var positionPopover = react_1.useCallback(function (_a) {\n        var _b, _c;\n        var _d = _a === void 0 ? {} : _a, _e = _d.positionIndex, positionIndex = _e === void 0 ? 0 : _e, _f = _d.parentRect, parentRect = _f === void 0 ? parentElement.getBoundingClientRect() : _f, _g = _d.childRect, childRect = _g === void 0 ? (_b = childRef === null || childRef === void 0 ? void 0 : childRef.current) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect() : _g, _h = _d.scoutRect, scoutRect = _h === void 0 ? (_c = scoutRef === null || scoutRef === void 0 ? void 0 : scoutRef.current) === null || _c === void 0 ? void 0 : _c.getBoundingClientRect() : _h, _j = _d.popoverRect, popoverRect = _j === void 0 ? popoverRef.current.getBoundingClientRect() : _j, _k = _d.boundaryRect, boundaryRect = _k === void 0 ? boundaryElement === parentElement\n            ? parentRect\n            : boundaryElement.getBoundingClientRect() : _k;\n        if (!childRect || !parentRect || !isOpen) {\n            return;\n        }\n        if (contentLocation) {\n            var _l = typeof contentLocation === 'function'\n                ? contentLocation({\n                    childRect: childRect,\n                    popoverRect: popoverRect,\n                    parentRect: parentRect,\n                    boundaryRect: boundaryRect,\n                    padding: padding,\n                    nudgedTop: 0,\n                    nudgedLeft: 0,\n                    boundaryInset: boundaryInset,\n                    violations: util_1.EMPTY_CLIENT_RECT,\n                    hasViolations: false,\n                })\n                : contentLocation, inputTop = _l.top, inputLeft = _l.left;\n            var left_1 = parentRect.left + inputLeft;\n            var top_1 = parentRect.top + inputTop;\n            popoverRef.current.style.transform = \"translate(\" + (left_1 - scoutRect.left) + \"px, \" + (top_1 - scoutRect.top) + \"px)\";\n            onPositionPopover({\n                childRect: childRect,\n                popoverRect: popoverRect,\n                parentRect: parentRect,\n                boundaryRect: boundaryRect,\n                padding: padding,\n                nudgedTop: 0,\n                nudgedLeft: 0,\n                boundaryInset: boundaryInset,\n                violations: util_1.EMPTY_CLIENT_RECT,\n                hasViolations: false,\n            });\n            return;\n        }\n        var isExhausted = positionIndex === positions.length;\n        var position = isExhausted ? positions[0] : positions[positionIndex];\n        var _m = util_1.getNewPopoverRect({\n            childRect: childRect,\n            popoverRect: popoverRect,\n            boundaryRect: boundaryRect,\n            position: position,\n            align: align,\n            padding: padding,\n            reposition: reposition,\n        }, boundaryInset), rect = _m.rect, boundaryViolation = _m.boundaryViolation;\n        if (boundaryViolation && reposition && !isExhausted) {\n            positionPopover({\n                positionIndex: positionIndex + 1,\n                childRect: childRect,\n                popoverRect: popoverRect,\n                parentRect: parentRect,\n                boundaryRect: boundaryRect,\n            });\n            return;\n        }\n        var top = rect.top, left = rect.left, width = rect.width, height = rect.height;\n        var shouldNudge = reposition && !isExhausted;\n        var _o = util_1.getNudgedPopoverRect(rect, boundaryRect, boundaryInset), nudgedLeft = _o.left, nudgedTop = _o.top;\n        var finalTop = top;\n        var finalLeft = left;\n        if (shouldNudge) {\n            finalTop = nudgedTop;\n            finalLeft = nudgedLeft;\n        }\n        popoverRef.current.style.transform = \"translate(\" + (finalLeft - scoutRect.left) + \"px, \" + (finalTop - scoutRect.top) + \"px)\";\n        var potentialViolations = {\n            top: boundaryRect.top + boundaryInset - finalTop,\n            left: boundaryRect.left + boundaryInset - finalLeft,\n            right: finalLeft + width - boundaryRect.right + boundaryInset,\n            bottom: finalTop + height - boundaryRect.bottom + boundaryInset,\n        };\n        onPositionPopover({\n            childRect: childRect,\n            popoverRect: {\n                top: finalTop,\n                left: finalLeft,\n                width: width,\n                height: height,\n                right: finalLeft + width,\n                bottom: finalTop + height,\n            },\n            parentRect: parentRect,\n            boundaryRect: boundaryRect,\n            position: position,\n            align: align,\n            padding: padding,\n            nudgedTop: nudgedTop - top,\n            nudgedLeft: nudgedLeft - left,\n            boundaryInset: boundaryInset,\n            violations: {\n                top: potentialViolations.top <= 0 ? 0 : potentialViolations.top,\n                left: potentialViolations.left <= 0 ? 0 : potentialViolations.left,\n                right: potentialViolations.right <= 0 ? 0 : potentialViolations.right,\n                bottom: potentialViolations.bottom <= 0 ? 0 : potentialViolations.bottom,\n            },\n            hasViolations: potentialViolations.top > 0 ||\n                potentialViolations.left > 0 ||\n                potentialViolations.right > 0 ||\n                potentialViolations.bottom > 0,\n        });\n    }, [\n        parentElement,\n        childRef,\n        popoverRef,\n        boundaryElement,\n        contentLocation,\n        positions,\n        align,\n        padding,\n        reposition,\n        boundaryInset,\n        onPositionPopover,\n        isOpen,\n    ]);\n    return {\n        positionPopover: positionPopover,\n        popoverRef: popoverRef,\n        scoutRef: scoutRef,\n    };\n};\nexports.usePopover = usePopover;\n//# sourceMappingURL=usePopover.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getNudgedPopoverRect = exports.getNewPopoverRect = exports.popoverRectForPosition = exports.createContainer = exports.rectsAreEqual = exports.EMPTY_CLIENT_RECT = void 0;\nexports.EMPTY_CLIENT_RECT = {\n    top: 0,\n    left: 0,\n    bottom: 0,\n    height: 0,\n    right: 0,\n    width: 0,\n};\nvar rectsAreEqual = function (rectA, rectB) {\n    return rectA === rectB ||\n        ((rectA === null || rectA === void 0 ? void 0 : rectA.bottom) === (rectB === null || rectB === void 0 ? void 0 : rectB.bottom) &&\n            (rectA === null || rectA === void 0 ? void 0 : rectA.height) === (rectB === null || rectB === void 0 ? void 0 : rectB.height) &&\n            (rectA === null || rectA === void 0 ? void 0 : rectA.left) === (rectB === null || rectB === void 0 ? void 0 : rectB.left) &&\n            (rectA === null || rectA === void 0 ? void 0 : rectA.right) === (rectB === null || rectB === void 0 ? void 0 : rectB.right) &&\n            (rectA === null || rectA === void 0 ? void 0 : rectA.top) === (rectB === null || rectB === void 0 ? void 0 : rectB.top) &&\n            (rectA === null || rectA === void 0 ? void 0 : rectA.width) === (rectB === null || rectB === void 0 ? void 0 : rectB.width));\n};\nexports.rectsAreEqual = rectsAreEqual;\nvar createContainer = function (containerStyle, containerClassName) {\n    var container = window.document.createElement('div');\n    if (containerClassName)\n        container.className = containerClassName;\n    Object.assign(container.style, containerStyle);\n    return container;\n};\nexports.createContainer = createContainer;\nvar popoverRectForPosition = function (position, childRect, popoverRect, padding, align) {\n    var targetMidX = childRect.left + childRect.width / 2;\n    var targetMidY = childRect.top + childRect.height / 2;\n    var width = popoverRect.width, height = popoverRect.height;\n    var top;\n    var left;\n    switch (position) {\n        case 'left':\n            top = targetMidY - height / 2;\n            left = childRect.left - padding - width;\n            if (align === 'start') {\n                top = childRect.top;\n            }\n            if (align === 'end') {\n                top = childRect.bottom - height;\n            }\n            break;\n        case 'bottom':\n            top = childRect.bottom + padding;\n            left = targetMidX - width / 2;\n            if (align === 'start') {\n                left = childRect.left;\n            }\n            if (align === 'end') {\n                left = childRect.right - width;\n            }\n            break;\n        case 'right':\n            top = targetMidY - height / 2;\n            left = childRect.right + padding;\n            if (align === 'start') {\n                top = childRect.top;\n            }\n            if (align === 'end') {\n                top = childRect.bottom - height;\n            }\n            break;\n        default:\n            top = childRect.top - height - padding;\n            left = targetMidX - width / 2;\n            if (align === 'start') {\n                left = childRect.left;\n            }\n            if (align === 'end') {\n                left = childRect.right - width;\n            }\n            break;\n    }\n    return { top: top, left: left, width: width, height: height, right: left + width, bottom: top + height };\n};\nexports.popoverRectForPosition = popoverRectForPosition;\nvar getNewPopoverRect = function (_a, boundaryInset) {\n    var position = _a.position, align = _a.align, childRect = _a.childRect, popoverRect = _a.popoverRect, boundaryRect = _a.boundaryRect, padding = _a.padding, reposition = _a.reposition;\n    var rect = exports.popoverRectForPosition(position, childRect, popoverRect, padding, align);\n    var boundaryViolation = reposition &&\n        ((position === 'top' && rect.top < boundaryRect.top + boundaryInset) ||\n            (position === 'left' && rect.left < boundaryRect.left + boundaryInset) ||\n            (position === 'right' && rect.right > boundaryRect.right - boundaryInset) ||\n            (position === 'bottom' && rect.bottom > boundaryRect.bottom - boundaryInset));\n    return {\n        rect: rect,\n        boundaryViolation: boundaryViolation,\n    };\n};\nexports.getNewPopoverRect = getNewPopoverRect;\nvar getNudgedPopoverRect = function (popoverRect, boundaryRect, boundaryInset) {\n    var topBoundary = boundaryRect.top + boundaryInset;\n    var leftBoundary = boundaryRect.left + boundaryInset;\n    var rightBoundary = boundaryRect.right - boundaryInset;\n    var bottomBoundary = boundaryRect.bottom - boundaryInset;\n    var top = popoverRect.top < topBoundary ? topBoundary : popoverRect.top;\n    top = top + popoverRect.height > bottomBoundary ? bottomBoundary - popoverRect.height : top;\n    var left = popoverRect.left < leftBoundary ? leftBoundary : popoverRect.left;\n    left = left + popoverRect.width > rightBoundary ? rightBoundary - popoverRect.width : left;\n    return {\n        top: top,\n        left: left,\n        width: popoverRect.width,\n        height: popoverRect.height,\n        right: left + popoverRect.width,\n        bottom: top + popoverRect.height,\n    };\n};\nexports.getNudgedPopoverRect = getNudgedPopoverRect;\n//# sourceMappingURL=util.js.map","var e=require(\"react\"),t=require(\"clsx\");function n(e){return e&&\"object\"==typeof e&&\"default\"in e?e:{default:e}}var o=/*#__PURE__*/n(e),s=/*#__PURE__*/n(t);const a=e=>\"number\"==typeof e&&!isNaN(e),r=e=>\"string\"==typeof e,i=e=>\"function\"==typeof e,l=e=>r(e)||i(e)?e:null,c=t=>e.isValidElement(t)||r(t)||i(t)||a(t);function u(e,t,n){void 0===n&&(n=300);const{scrollHeight:o,style:s}=e;requestAnimationFrame(()=>{s.minHeight=\"initial\",s.height=o+\"px\",s.transition=`all ${n}ms`,requestAnimationFrame(()=>{s.height=\"0\",s.padding=\"0\",s.margin=\"0\",setTimeout(t,n)})})}function d(t){let{enter:n,exit:s,appendPosition:a=!1,collapse:r=!0,collapseDuration:i=300}=t;return function(t){let{children:l,position:c,preventExitTransition:d,done:f,nodeRef:p,isIn:m}=t;const g=a?`${n}--${c}`:n,h=a?`${s}--${c}`:s,y=e.useRef(0);return e.useLayoutEffect(()=>{const e=p.current,t=g.split(\" \"),n=o=>{o.target===p.current&&(e.dispatchEvent(new Event(\"d\")),e.removeEventListener(\"animationend\",n),e.removeEventListener(\"animationcancel\",n),0===y.current&&\"animationcancel\"!==o.type&&e.classList.remove(...t))};e.classList.add(...t),e.addEventListener(\"animationend\",n),e.addEventListener(\"animationcancel\",n)},[]),e.useEffect(()=>{const e=p.current,t=()=>{e.removeEventListener(\"animationend\",t),r?u(e,f,i):f()};m||(d?t():(y.current=1,e.className+=` ${h}`,e.addEventListener(\"animationend\",t)))},[m]),o.default.createElement(o.default.Fragment,null,l)}}function f(e,t){return{content:e.content,containerId:e.props.containerId,id:e.props.toastId,theme:e.props.theme,type:e.props.type,data:e.props.data||{},isLoading:e.props.isLoading,icon:e.props.icon,status:t}}const p={list:new Map,emitQueue:new Map,on(e,t){return this.list.has(e)||this.list.set(e,[]),this.list.get(e).push(t),this},off(e,t){if(t){const n=this.list.get(e).filter(e=>e!==t);return this.list.set(e,n),this}return this.list.delete(e),this},cancelEmit(e){const t=this.emitQueue.get(e);return t&&(t.forEach(clearTimeout),this.emitQueue.delete(e)),this},emit(e){this.list.has(e)&&this.list.get(e).forEach(t=>{const n=setTimeout(()=>{t(...[].slice.call(arguments,1))},0);this.emitQueue.has(e)||this.emitQueue.set(e,[]),this.emitQueue.get(e).push(n)})}},m=e=>{let{theme:t,type:n,...s}=e;return o.default.createElement(\"svg\",{viewBox:\"0 0 24 24\",width:\"100%\",height:\"100%\",fill:\"colored\"===t?\"currentColor\":`var(--toastify-icon-color-${n})`,...s})},g={info:function(e){return o.default.createElement(m,{...e},o.default.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.013 12.013 0 0012 0zm.25 5a1.5 1.5 0 11-1.5 1.5 1.5 1.5 0 011.5-1.5zm2.25 13.5h-4a1 1 0 010-2h.75a.25.25 0 00.25-.25v-4.5a.25.25 0 00-.25-.25h-.75a1 1 0 010-2h1a2 2 0 012 2v4.75a.25.25 0 00.25.25h.75a1 1 0 110 2z\"}))},warning:function(e){return o.default.createElement(m,{...e},o.default.createElement(\"path\",{d:\"M23.32 17.191L15.438 2.184C14.728.833 13.416 0 11.996 0c-1.42 0-2.733.833-3.443 2.184L.533 17.448a4.744 4.744 0 000 4.368C1.243 23.167 2.555 24 3.975 24h16.05C22.22 24 24 22.044 24 19.632c0-.904-.251-1.746-.68-2.44zm-9.622 1.46c0 1.033-.724 1.823-1.698 1.823s-1.698-.79-1.698-1.822v-.043c0-1.028.724-1.822 1.698-1.822s1.698.79 1.698 1.822v.043zm.039-12.285l-.84 8.06c-.057.581-.408.943-.897.943-.49 0-.84-.367-.896-.942l-.84-8.065c-.057-.624.25-1.095.779-1.095h1.91c.528.005.84.476.784 1.1z\"}))},success:function(e){return o.default.createElement(m,{...e},o.default.createElement(\"path\",{d:\"M12 0a12 12 0 1012 12A12.014 12.014 0 0012 0zm6.927 8.2l-6.845 9.289a1.011 1.011 0 01-1.43.188l-4.888-3.908a1 1 0 111.25-1.562l4.076 3.261 6.227-8.451a1 1 0 111.61 1.183z\"}))},error:function(e){return o.default.createElement(m,{...e},o.default.createElement(\"path\",{d:\"M11.983 0a12.206 12.206 0 00-8.51 3.653A11.8 11.8 0 000 12.207 11.779 11.779 0 0011.8 24h.214A12.111 12.111 0 0024 11.791 11.766 11.766 0 0011.983 0zM10.5 16.542a1.476 1.476 0 011.449-1.53h.027a1.527 1.527 0 011.523 1.47 1.475 1.475 0 01-1.449 1.53h-.027a1.529 1.529 0 01-1.523-1.47zM11 12.5v-6a1 1 0 012 0v6a1 1 0 11-2 0z\"}))},spinner:function(){return o.default.createElement(\"div\",{className:\"Toastify__spinner\"})}};function h(t){const[,n]=e.useReducer(e=>e+1,0),[o,s]=e.useState([]),u=e.useRef(null),d=e.useRef(new Map).current,m=e=>-1!==o.indexOf(e),h=e.useRef({toastKey:1,displayedToast:0,count:0,queue:[],props:t,containerId:null,isToastActive:m,getToast:e=>d.get(e)}).current;function y(e){let{containerId:t}=e;const{limit:n}=h.props;!n||t&&h.containerId!==t||(h.count-=h.queue.length,h.queue=[])}function v(e){s(t=>null==e?[]:t.filter(t=>t!==e))}function T(){const{toastContent:e,toastProps:t,staleId:n}=h.queue.shift();C(e,t,n)}function E(t,o){let{delay:s,staleId:m,...y}=o;if(!c(t)||function(e){return!u.current||h.props.enableMultiContainer&&e.containerId!==h.props.containerId||d.has(e.toastId)&&null==e.updateId}(y))return;const{toastId:E,updateId:I,data:b}=y,{props:_}=h,L=()=>v(E),O=null==I;O&&h.count++;const N={..._,...y,toastId:E,updateId:I,data:b,closeToast:L,isIn:!1,key:y.key||h.toastKey++,className:l(y.className||_.toastClassName),bodyClassName:l(y.bodyClassName||_.bodyClassName),progressClassName:l(y.progressClassName||_.progressClassName),autoClose:!y.isLoading&&(x=y.autoClose,R=_.autoClose,!1===x||a(x)&&x>0?x:R),deleteToast(){const e=f(d.get(E),\"removed\");d.delete(E),p.emit(4,e);const t=h.queue.length;if(h.count=null==E?h.count-h.displayedToast:h.count-1,h.count<0&&(h.count=0),t>0){const e=null==E?h.props.limit:1;if(1===t||1===e)h.displayedToast++,T();else{const n=e>t?t:e;h.displayedToast=n;for(let e=0;e<n;e++)T()}}else n()}};var x,R;N.iconOut=function(t){let{theme:n,type:o,isLoading:s,icon:l}=t,c=null;const u={theme:n,type:o};return!1===l||(i(l)?c=l(u):e.isValidElement(l)?c=e.cloneElement(l,u):r(l)||a(l)?c=l:s?c=g.spinner():(e=>e in g)(o)&&(c=g[o](u))),c}(N),i(y.onOpen)&&(N.onOpen=y.onOpen),i(y.onClose)&&(N.onClose=y.onClose),N.closeButton=_.closeButton,!1===y.closeButton||c(y.closeButton)?N.closeButton=y.closeButton:!0===y.closeButton&&(N.closeButton=!c(_.closeButton)||_.closeButton);let w=t;e.isValidElement(t)&&!r(t.type)?w=e.cloneElement(t,{closeToast:L,toastProps:N,data:b}):i(t)&&(w=t({closeToast:L,toastProps:N,data:b})),_.limit&&_.limit>0&&h.count>_.limit&&O?h.queue.push({toastContent:w,toastProps:N,staleId:m}):a(s)?setTimeout(()=>{C(w,N,m)},s):C(w,N,m)}function C(e,t,n){const{toastId:o}=t;n&&d.delete(n);const a={content:e,props:t};d.set(o,a),s(e=>[...e,o].filter(e=>e!==n)),p.emit(4,f(a,null==a.props.updateId?\"added\":\"updated\"))}return e.useEffect(()=>(h.containerId=t.containerId,p.cancelEmit(3).on(0,E).on(1,e=>u.current&&v(e)).on(5,y).emit(2,h),()=>{d.clear(),p.emit(3,h)}),[]),e.useEffect(()=>{h.props=t,h.isToastActive=m,h.displayedToast=o.length}),{getToastToRender:function(e){const n=new Map,o=Array.from(d.values());return t.newestOnTop&&o.reverse(),o.forEach(e=>{const{position:t}=e.props;n.has(t)||n.set(t,[]),n.get(t).push(e)}),Array.from(n,t=>e(t[0],t[1]))},containerRef:u,isToastActive:m}}function y(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientX:e.clientX}function v(e){return e.targetTouches&&e.targetTouches.length>=1?e.targetTouches[0].clientY:e.clientY}function T(t){const[n,o]=e.useState(!1),[s,a]=e.useState(!1),r=e.useRef(null),l=e.useRef({start:0,x:0,y:0,delta:0,removalDistance:0,canCloseOnClick:!0,canDrag:!1,boundingRect:null,didMove:!1}).current,c=e.useRef(t),{autoClose:u,pauseOnHover:d,closeToast:f,onClick:p,closeOnClick:m}=t;function g(e){if(t.draggable){\"touchstart\"===e.nativeEvent.type&&e.nativeEvent.preventDefault(),l.didMove=!1,document.addEventListener(\"mousemove\",C),document.addEventListener(\"mouseup\",I),document.addEventListener(\"touchmove\",C),document.addEventListener(\"touchend\",I);const n=r.current;l.canCloseOnClick=!0,l.canDrag=!0,l.boundingRect=n.getBoundingClientRect(),n.style.transition=\"\",l.x=y(e.nativeEvent),l.y=v(e.nativeEvent),\"x\"===t.draggableDirection?(l.start=l.x,l.removalDistance=n.offsetWidth*(t.draggablePercent/100)):(l.start=l.y,l.removalDistance=n.offsetHeight*(80===t.draggablePercent?1.5*t.draggablePercent:t.draggablePercent/100))}}function h(e){if(l.boundingRect){const{top:n,bottom:o,left:s,right:a}=l.boundingRect;\"touchend\"!==e.nativeEvent.type&&t.pauseOnHover&&l.x>=s&&l.x<=a&&l.y>=n&&l.y<=o?E():T()}}function T(){o(!0)}function E(){o(!1)}function C(e){const o=r.current;l.canDrag&&o&&(l.didMove=!0,n&&E(),l.x=y(e),l.y=v(e),l.delta=\"x\"===t.draggableDirection?l.x-l.start:l.y-l.start,l.start!==l.x&&(l.canCloseOnClick=!1),o.style.transform=`translate${t.draggableDirection}(${l.delta}px)`,o.style.opacity=\"\"+(1-Math.abs(l.delta/l.removalDistance)))}function I(){document.removeEventListener(\"mousemove\",C),document.removeEventListener(\"mouseup\",I),document.removeEventListener(\"touchmove\",C),document.removeEventListener(\"touchend\",I);const e=r.current;if(l.canDrag&&l.didMove&&e){if(l.canDrag=!1,Math.abs(l.delta)>l.removalDistance)return a(!0),void t.closeToast();e.style.transition=\"transform 0.2s, opacity 0.2s\",e.style.transform=`translate${t.draggableDirection}(0)`,e.style.opacity=\"1\"}}e.useEffect(()=>{c.current=t}),e.useEffect(()=>(r.current&&r.current.addEventListener(\"d\",T,{once:!0}),i(t.onOpen)&&t.onOpen(e.isValidElement(t.children)&&t.children.props),()=>{const t=c.current;i(t.onClose)&&t.onClose(e.isValidElement(t.children)&&t.children.props)}),[]),e.useEffect(()=>(t.pauseOnFocusLoss&&(document.hasFocus()||E(),window.addEventListener(\"focus\",T),window.addEventListener(\"blur\",E)),()=>{t.pauseOnFocusLoss&&(window.removeEventListener(\"focus\",T),window.removeEventListener(\"blur\",E))}),[t.pauseOnFocusLoss]);const b={onMouseDown:g,onTouchStart:g,onMouseUp:h,onTouchEnd:h};return u&&d&&(b.onMouseEnter=E,b.onMouseLeave=T),m&&(b.onClick=e=>{p&&p(e),l.canCloseOnClick&&f()}),{playToast:T,pauseToast:E,isRunning:n,preventExitTransition:s,toastRef:r,eventHandlers:b}}function E(e){let{closeToast:t,theme:n,ariaLabel:s=\"close\"}=e;return o.default.createElement(\"button\",{className:`Toastify__close-button Toastify__close-button--${n}`,type:\"button\",onClick:e=>{e.stopPropagation(),t(e)},\"aria-label\":s},o.default.createElement(\"svg\",{\"aria-hidden\":\"true\",viewBox:\"0 0 14 16\"},o.default.createElement(\"path\",{fillRule:\"evenodd\",d:\"M7.71 8.23l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75L1 11.98l3.75-3.75L1 4.48 2.48 3l3.75 3.75L9.98 3l1.48 1.48-3.75 3.75z\"})))}function C(e){let{delay:t,isRunning:n,closeToast:a,type:r=\"default\",hide:l,className:c,style:u,controlledProgress:d,progress:f,rtl:p,isIn:m,theme:g}=e;const h=l||d&&0===f,y={...u,animationDuration:`${t}ms`,animationPlayState:n?\"running\":\"paused\",opacity:h?0:1};d&&(y.transform=`scaleX(${f})`);const v=s.default(\"Toastify__progress-bar\",d?\"Toastify__progress-bar--controlled\":\"Toastify__progress-bar--animated\",`Toastify__progress-bar-theme--${g}`,`Toastify__progress-bar--${r}`,{\"Toastify__progress-bar--rtl\":p}),T=i(c)?c({rtl:p,type:r,defaultClassName:v}):s.default(v,c);return o.default.createElement(\"div\",{role:\"progressbar\",\"aria-hidden\":h?\"true\":\"false\",\"aria-label\":\"notification timer\",className:T,style:y,[d&&f>=1?\"onTransitionEnd\":\"onAnimationEnd\"]:d&&f<1?null:()=>{m&&a()}})}const I=t=>{const{isRunning:n,preventExitTransition:a,toastRef:r,eventHandlers:l}=T(t),{closeButton:c,children:u,autoClose:d,onClick:f,type:p,hideProgressBar:m,closeToast:g,transition:h,position:y,className:v,style:I,bodyClassName:b,bodyStyle:_,progressClassName:L,progressStyle:O,updateId:N,role:x,progress:R,rtl:w,toastId:M,deleteToast:k,isIn:$,isLoading:B,iconOut:P,closeOnClick:D,theme:A}=t,z=s.default(\"Toastify__toast\",`Toastify__toast-theme--${A}`,`Toastify__toast--${p}`,{\"Toastify__toast--rtl\":w},{\"Toastify__toast--close-on-click\":D}),F=i(v)?v({rtl:w,position:y,type:p,defaultClassName:z}):s.default(z,v),S=!!R||!d,q={closeToast:g,type:p,theme:A};let H=null;return!1===c||(H=i(c)?c(q):e.isValidElement(c)?e.cloneElement(c,q):E(q)),o.default.createElement(h,{isIn:$,done:k,position:y,preventExitTransition:a,nodeRef:r},o.default.createElement(\"div\",{id:M,onClick:f,className:F,...l,style:I,ref:r},o.default.createElement(\"div\",{...$&&{role:x},className:i(b)?b({type:p}):s.default(\"Toastify__toast-body\",b),style:_},null!=P&&o.default.createElement(\"div\",{className:s.default(\"Toastify__toast-icon\",{\"Toastify--animate-icon Toastify__zoom-enter\":!B})},P),o.default.createElement(\"div\",null,u)),H,o.default.createElement(C,{...N&&!S?{key:`pb-${N}`}:{},rtl:w,theme:A,delay:d,isRunning:n,isIn:$,closeToast:g,hide:m,type:p,style:O,className:L,controlledProgress:S,progress:R||0})))},b=function(e,t){return void 0===t&&(t=!1),{enter:`Toastify--animate Toastify__${e}-enter`,exit:`Toastify--animate Toastify__${e}-exit`,appendPosition:t}},_=d(b(\"bounce\",!0)),L=d(b(\"slide\",!0)),O=d(b(\"zoom\")),N=d(b(\"flip\")),x=e.forwardRef((t,n)=>{const{getToastToRender:a,containerRef:r,isToastActive:c}=h(t),{className:u,style:d,rtl:f,containerId:p}=t;function m(e){const t=s.default(\"Toastify__toast-container\",`Toastify__toast-container--${e}`,{\"Toastify__toast-container--rtl\":f});return i(u)?u({position:e,rtl:f,defaultClassName:t}):s.default(t,l(u))}return e.useEffect(()=>{n&&(n.current=r.current)},[]),o.default.createElement(\"div\",{ref:r,className:\"Toastify\",id:p},a((e,t)=>{const n=t.length?{...d}:{...d,pointerEvents:\"none\"};return o.default.createElement(\"div\",{className:m(e),style:n,key:`container-${e}`},t.map((e,n)=>{let{content:s,props:a}=e;return o.default.createElement(I,{...a,isIn:c(a.toastId),style:{...a.style,\"--nth\":n+1,\"--len\":t.length},key:`toast-${a.key}`},s)}))}))});x.displayName=\"ToastContainer\",x.defaultProps={position:\"top-right\",transition:_,autoClose:5e3,closeButton:E,pauseOnHover:!0,pauseOnFocusLoss:!0,closeOnClick:!0,draggable:!0,draggablePercent:80,draggableDirection:\"x\",role:\"alert\",theme:\"light\"};let R,w=new Map,M=[],k=1;function $(){return\"\"+k++}function B(e){return e&&(r(e.toastId)||a(e.toastId))?e.toastId:$()}function P(e,t){return w.size>0?p.emit(0,e,t):M.push({content:e,options:t}),t.toastId}function D(e,t){return{...t,type:t&&t.type||e,toastId:B(t)}}function A(e){return(t,n)=>P(t,D(e,n))}function z(e,t){return P(e,D(\"default\",t))}z.loading=(e,t)=>P(e,D(\"default\",{isLoading:!0,autoClose:!1,closeOnClick:!1,closeButton:!1,draggable:!1,...t})),z.promise=function(e,t,n){let o,{pending:s,error:a,success:l}=t;s&&(o=r(s)?z.loading(s,n):z.loading(s.render,{...n,...s}));const c={isLoading:null,autoClose:null,closeOnClick:null,closeButton:null,draggable:null,delay:100},u=(e,t,s)=>{if(null==t)return void z.dismiss(o);const a={type:e,...c,...n,data:s},i=r(t)?{render:t}:t;return o?z.update(o,{...a,...i}):z(i.render,{...a,...i}),s},d=i(e)?e():e;return d.then(e=>u(\"success\",l,e)).catch(e=>u(\"error\",a,e)),d},z.success=A(\"success\"),z.info=A(\"info\"),z.error=A(\"error\"),z.warning=A(\"warning\"),z.warn=z.warning,z.dark=(e,t)=>P(e,D(\"default\",{theme:\"dark\",...t})),z.dismiss=e=>{w.size>0?p.emit(1,e):M=M.filter(t=>null!=e&&t.options.toastId!==e)},z.clearWaitingQueue=function(e){return void 0===e&&(e={}),p.emit(5,e)},z.isActive=e=>{let t=!1;return w.forEach(n=>{n.isToastActive&&n.isToastActive(e)&&(t=!0)}),t},z.update=function(e,t){void 0===t&&(t={}),setTimeout(()=>{const n=function(e,t){let{containerId:n}=t;const o=w.get(n||R);return o&&o.getToast(e)}(e,t);if(n){const{props:o,content:s}=n,a={...o,...t,toastId:t.toastId||e,updateId:$()};a.toastId!==e&&(a.staleId=e);const r=a.render||s;delete a.render,P(r,a)}},0)},z.done=e=>{z.update(e,{progress:1})},z.onChange=e=>(p.on(4,e),()=>{p.off(4,e)}),z.POSITION={TOP_LEFT:\"top-left\",TOP_RIGHT:\"top-right\",TOP_CENTER:\"top-center\",BOTTOM_LEFT:\"bottom-left\",BOTTOM_RIGHT:\"bottom-right\",BOTTOM_CENTER:\"bottom-center\"},z.TYPE={INFO:\"info\",SUCCESS:\"success\",WARNING:\"warning\",ERROR:\"error\",DEFAULT:\"default\"},p.on(2,e=>{R=e.containerId||e,w.set(R,e),M.forEach(e=>{p.emit(0,e.content,e.options)}),M=[]}).on(3,e=>{w.delete(e.containerId||e),0===w.size&&p.off(0).off(1).off(5)}),exports.Bounce=_,exports.Flip=N,exports.Icons=g,exports.Slide=L,exports.ToastContainer=x,exports.Zoom=O,exports.collapseToast=u,exports.cssTransition=d,exports.toast=z,exports.useToast=T,exports.useToastContainer=h;\n//# sourceMappingURL=react-toastify.js.map\n","export default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}","function replaceClassName(origClass, classToRemove) {\n  return origClass.replace(new RegExp(\"(^|\\\\s)\" + classToRemove + \"(?:\\\\s|$)\", 'g'), '$1').replace(/\\s+/g, ' ').replace(/^\\s*|\\s*$/g, '');\n}\n/**\n * Removes a CSS class from a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\n\nexport default function removeClass(element, className) {\n  if (element.classList) {\n    element.classList.remove(className);\n  } else if (typeof element.className === 'string') {\n    element.className = replaceClassName(element.className, className);\n  } else {\n    element.setAttribute('class', replaceClassName(element.className && element.className.baseVal || '', className));\n  }\n}","export default {\n  disabled: false\n};","import React from 'react';\nexport default React.createContext(null);","export var forceReflow = function forceReflow(node) {\n  return node.scrollTop;\n};","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport config from './config';\nimport { timeoutsShape } from './utils/PropTypes';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { forceReflow } from './utils/reflow';\nexport var UNMOUNTED = 'unmounted';\nexport var EXITED = 'exited';\nexport var ENTERING = 'entering';\nexport var ENTERED = 'entered';\nexport var EXITING = 'exiting';\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * ---\n *\n * **Note**: `Transition` is a platform-agnostic base component. If you're using\n * transitions in CSS, you'll probably want to use\n * [`CSSTransition`](https://reactcommunity.org/react-transition-group/css-transition)\n * instead. It inherits all the features of `Transition`, but contains\n * additional features necessary to play nice with CSS transitions (hence the\n * name of the component).\n *\n * ---\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the\n * components. It's up to you to give meaning and effect to those states. For\n * example we can add styles to a component when it enters or exits:\n *\n * ```jsx\n * import { Transition } from 'react-transition-group';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 1 },\n *   entered:  { opacity: 1 },\n *   exiting:  { opacity: 0 },\n *   exited:  { opacity: 0 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {state => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm a fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * There are 4 main states a Transition can be in:\n *  - `'entering'`\n *  - `'entered'`\n *  - `'exiting'`\n *  - `'exited'`\n *\n * Transition state is toggled via the `in` prop. When `true` the component\n * begins the \"Enter\" stage. During this stage, the component will shift from\n * its current transition state, to `'entering'` for the duration of the\n * transition and then to the `'entered'` stage once it's complete. Let's take\n * the following example (we'll use the\n * [useState](https://reactjs.org/docs/hooks-reference.html#usestate) hook):\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <Transition in={inProp} timeout={500}>\n *         {state => (\n *           // ...\n *         )}\n *       </Transition>\n *       <button onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(Transition, _React$Component);\n\n  function Transition(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n    var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n    var initialStatus;\n    _this.appearStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.appearStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = {\n      status: initialStatus\n    };\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n    var nextIn = _ref.in;\n\n    if (nextIn && prevState.status === UNMOUNTED) {\n      return {\n        status: EXITED\n      };\n    }\n\n    return null;\n  } // getSnapshotBeforeUpdate(prevProps) {\n  //   let nextStatus = null\n  //   if (prevProps !== this.props) {\n  //     const { status } = this.state\n  //     if (this.props.in) {\n  //       if (status !== ENTERING && status !== ENTERED) {\n  //         nextStatus = ENTERING\n  //       }\n  //     } else {\n  //       if (status === ENTERING || status === ENTERED) {\n  //         nextStatus = EXITING\n  //       }\n  //     }\n  //   }\n  //   return { nextStatus }\n  // }\n  ;\n\n  var _proto = Transition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.updateStatus(true, this.appearStatus);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var nextStatus = null;\n\n    if (prevProps !== this.props) {\n      var status = this.state.status;\n\n      if (this.props.in) {\n        if (status !== ENTERING && status !== ENTERED) {\n          nextStatus = ENTERING;\n        }\n      } else {\n        if (status === ENTERING || status === ENTERED) {\n          nextStatus = EXITING;\n        }\n      }\n    }\n\n    this.updateStatus(false, nextStatus);\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  _proto.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n    var exit, enter, appear;\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter; // TODO: remove fallback for next major\n\n      appear = timeout.appear !== undefined ? timeout.appear : enter;\n    }\n\n    return {\n      exit: exit,\n      enter: enter,\n      appear: appear\n    };\n  };\n\n  _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n    if (mounting === void 0) {\n      mounting = false;\n    }\n\n    if (nextStatus !== null) {\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n\n      if (nextStatus === ENTERING) {\n        if (this.props.unmountOnExit || this.props.mountOnEnter) {\n          var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n          // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n          // To make the animation happen,  we have to separate each rendering and avoid being processed as batched.\n\n          if (node) forceReflow(node);\n        }\n\n        this.performEnter(mounting);\n      } else {\n        this.performExit();\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({\n        status: UNMOUNTED\n      });\n    }\n  };\n\n  _proto.performEnter = function performEnter(mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n    var appearing = this.context ? this.context.isMounting : mounting;\n\n    var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n        maybeNode = _ref2[0],\n        maybeAppearing = _ref2[1];\n\n    var timeouts = this.getTimeouts();\n    var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n\n    if (!mounting && !enter || config.disabled) {\n      this.safeSetState({\n        status: ENTERED\n      }, function () {\n        _this2.props.onEntered(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onEnter(maybeNode, maybeAppearing);\n    this.safeSetState({\n      status: ENTERING\n    }, function () {\n      _this2.props.onEntering(maybeNode, maybeAppearing);\n\n      _this2.onTransitionEnd(enterTimeout, function () {\n        _this2.safeSetState({\n          status: ENTERED\n        }, function () {\n          _this2.props.onEntered(maybeNode, maybeAppearing);\n        });\n      });\n    });\n  };\n\n  _proto.performExit = function performExit() {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n    var timeouts = this.getTimeouts();\n    var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n    if (!exit || config.disabled) {\n      this.safeSetState({\n        status: EXITED\n      }, function () {\n        _this3.props.onExited(maybeNode);\n      });\n      return;\n    }\n\n    this.props.onExit(maybeNode);\n    this.safeSetState({\n      status: EXITING\n    }, function () {\n      _this3.props.onExiting(maybeNode);\n\n      _this3.onTransitionEnd(timeouts.exit, function () {\n        _this3.safeSetState({\n          status: EXITED\n        }, function () {\n          _this3.props.onExited(maybeNode);\n        });\n      });\n    });\n  };\n\n  _proto.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  _proto.safeSetState = function safeSetState(nextState, callback) {\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, callback);\n  };\n\n  _proto.setNextCallback = function setNextCallback(callback) {\n    var _this4 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this4.nextCallback = null;\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n    this.setNextCallback(handler);\n    var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n    var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n    if (!node || doesNotHaveTimeoutOrListener) {\n      setTimeout(this.nextCallback, 0);\n      return;\n    }\n\n    if (this.props.addEndListener) {\n      var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n          maybeNode = _ref3[0],\n          maybeNextCallback = _ref3[1];\n\n      this.props.addEndListener(maybeNode, maybeNextCallback);\n    }\n\n    if (timeout != null) {\n      setTimeout(this.nextCallback, timeout);\n    }\n  };\n\n  _proto.render = function render() {\n    var status = this.state.status;\n\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _this$props = this.props,\n        children = _this$props.children,\n        _in = _this$props.in,\n        _mountOnEnter = _this$props.mountOnEnter,\n        _unmountOnExit = _this$props.unmountOnExit,\n        _appear = _this$props.appear,\n        _enter = _this$props.enter,\n        _exit = _this$props.exit,\n        _timeout = _this$props.timeout,\n        _addEndListener = _this$props.addEndListener,\n        _onEnter = _this$props.onEnter,\n        _onEntering = _this$props.onEntering,\n        _onEntered = _this$props.onEntered,\n        _onExit = _this$props.onExit,\n        _onExiting = _this$props.onExiting,\n        _onExited = _this$props.onExited,\n        _nodeRef = _this$props.nodeRef,\n        childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n    return (\n      /*#__PURE__*/\n      // allows for nested Transitions\n      React.createElement(TransitionGroupContext.Provider, {\n        value: null\n      }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n    );\n  };\n\n  return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * A React reference to DOM element that need to transition:\n   * https://stackoverflow.com/a/51127130/4671932\n   *\n   *   - When `nodeRef` prop is used, `node` is not passed to callback functions\n   *      (e.g. `onEnter`) because user already has direct access to the node.\n   *   - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n   *     `nodeRef` need to be provided to `Transition` with changed `key` prop\n   *     (see\n   *     [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n   */\n  nodeRef: PropTypes.shape({\n    current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n      var value = propValue[key];\n      return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n    }\n  }),\n\n  /**\n   * A `function` child can be used instead of a React element. This function is\n   * called with the current transition status (`'entering'`, `'entered'`,\n   * `'exiting'`, `'exited'`), which can be used to apply context\n   * specific props to a component.\n   *\n   * ```jsx\n   * <Transition in={this.state.in} timeout={150}>\n   *   {state => (\n   *     <MyComponent className={`fade fade-${state}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: PropTypes.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: PropTypes.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: PropTypes.bool,\n\n  /**\n   * By default the child component does not perform the enter transition when\n   * it first mounts, regardless of the value of `in`. If you want this\n   * behavior, set both `appear` and `in` to `true`.\n   *\n   * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n   * > only adds an additional enter transition. However, in the\n   * > `<CSSTransition>` component that first enter transition does result in\n   * > additional `.appear-*` classes, that way you can choose to style it\n   * > differently.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEndListener` is provided.\n   *\n   * You may specify a single timeout for all transitions:\n   *\n   * ```jsx\n   * timeout={500}\n   * ```\n   *\n   * or individually:\n   *\n   * ```jsx\n   * timeout={{\n   *  appear: 500,\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * - `appear` defaults to the value of `enter`\n   * - `enter` defaults to `0`\n   * - `exit` defaults to `0`\n   *\n   * @type {number | { enter?: number, exit?: number, appear?: number }}\n   */\n  timeout: function timeout(props) {\n    var pt = timeoutsShape;\n    if (!props.addEndListener) pt = pt.isRequired;\n\n    for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      args[_key - 1] = arguments[_key];\n    }\n\n    return pt.apply(void 0, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. Timeouts are still used as a fallback if provided.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: PropTypes.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport addOneClass from 'dom-helpers/addClass';\nimport removeOneClass from 'dom-helpers/removeClass';\nimport React from 'react';\nimport Transition from './Transition';\nimport { classNamesShape } from './utils/PropTypes';\nimport { forceReflow } from './utils/reflow';\n\nvar _addClass = function addClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return addOneClass(node, c);\n  });\n};\n\nvar removeClass = function removeClass(node, classes) {\n  return node && classes && classes.split(' ').forEach(function (c) {\n    return removeOneClass(node, c);\n  });\n};\n/**\n * A transition component inspired by the excellent\n * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should\n * use it if you're using CSS transitions or animations. It's built upon the\n * [`Transition`](https://reactcommunity.org/react-transition-group/transition)\n * component, so it inherits all of its props.\n *\n * `CSSTransition` applies a pair of class names during the `appear`, `enter`,\n * and `exit` states of the transition. The first class is applied and then a\n * second `*-active` class in order to activate the CSS transition. After the\n * transition, matching `*-done` class names are applied to persist the\n * transition state.\n *\n * ```jsx\n * function App() {\n *   const [inProp, setInProp] = useState(false);\n *   return (\n *     <div>\n *       <CSSTransition in={inProp} timeout={200} classNames=\"my-node\">\n *         <div>\n *           {\"I'll receive my-node-* classes\"}\n *         </div>\n *       </CSSTransition>\n *       <button type=\"button\" onClick={() => setInProp(true)}>\n *         Click to Enter\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the `in` prop is set to `true`, the child component will first receive\n * the class `example-enter`, then the `example-enter-active` will be added in\n * the next tick. `CSSTransition` [forces a\n * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)\n * between before adding the `example-enter-active`. This is an important trick\n * because it allows us to transition between `example-enter` and\n * `example-enter-active` even though they were added immediately one after\n * another. Most notably, this is what makes it possible for us to animate\n * _appearance_.\n *\n * ```css\n * .my-node-enter {\n *   opacity: 0;\n * }\n * .my-node-enter-active {\n *   opacity: 1;\n *   transition: opacity 200ms;\n * }\n * .my-node-exit {\n *   opacity: 1;\n * }\n * .my-node-exit-active {\n *   opacity: 0;\n *   transition: opacity 200ms;\n * }\n * ```\n *\n * `*-active` classes represent which styles you want to animate **to**, so it's\n * important to add `transition` declaration only to them, otherwise transitions\n * might not behave as intended! This might not be obvious when the transitions\n * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in\n * the example above (minus `transition`), but it becomes apparent in more\n * complex transitions.\n *\n * **Note**: If you're using the\n * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)\n * prop, make sure to define styles for `.appear-*` classes as well.\n */\n\n\nvar CSSTransition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(CSSTransition, _React$Component);\n\n  function CSSTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.appliedClasses = {\n      appear: {},\n      enter: {},\n      exit: {}\n    };\n\n    _this.onEnter = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument[0],\n          appearing = _this$resolveArgument[1];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, appearing ? 'appear' : 'enter', 'base');\n\n      if (_this.props.onEnter) {\n        _this.props.onEnter(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntering = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument2[0],\n          appearing = _this$resolveArgument2[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.addClass(node, type, 'active');\n\n      if (_this.props.onEntering) {\n        _this.props.onEntering(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onEntered = function (maybeNode, maybeAppearing) {\n      var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing),\n          node = _this$resolveArgument3[0],\n          appearing = _this$resolveArgument3[1];\n\n      var type = appearing ? 'appear' : 'enter';\n\n      _this.removeClasses(node, type);\n\n      _this.addClass(node, type, 'done');\n\n      if (_this.props.onEntered) {\n        _this.props.onEntered(maybeNode, maybeAppearing);\n      }\n    };\n\n    _this.onExit = function (maybeNode) {\n      var _this$resolveArgument4 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument4[0];\n\n      _this.removeClasses(node, 'appear');\n\n      _this.removeClasses(node, 'enter');\n\n      _this.addClass(node, 'exit', 'base');\n\n      if (_this.props.onExit) {\n        _this.props.onExit(maybeNode);\n      }\n    };\n\n    _this.onExiting = function (maybeNode) {\n      var _this$resolveArgument5 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument5[0];\n\n      _this.addClass(node, 'exit', 'active');\n\n      if (_this.props.onExiting) {\n        _this.props.onExiting(maybeNode);\n      }\n    };\n\n    _this.onExited = function (maybeNode) {\n      var _this$resolveArgument6 = _this.resolveArguments(maybeNode),\n          node = _this$resolveArgument6[0];\n\n      _this.removeClasses(node, 'exit');\n\n      _this.addClass(node, 'exit', 'done');\n\n      if (_this.props.onExited) {\n        _this.props.onExited(maybeNode);\n      }\n    };\n\n    _this.resolveArguments = function (maybeNode, maybeAppearing) {\n      return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`\n      : [maybeNode, maybeAppearing];\n    };\n\n    _this.getClassNames = function (type) {\n      var classNames = _this.props.classNames;\n      var isStringClassNames = typeof classNames === 'string';\n      var prefix = isStringClassNames && classNames ? classNames + \"-\" : '';\n      var baseClassName = isStringClassNames ? \"\" + prefix + type : classNames[type];\n      var activeClassName = isStringClassNames ? baseClassName + \"-active\" : classNames[type + \"Active\"];\n      var doneClassName = isStringClassNames ? baseClassName + \"-done\" : classNames[type + \"Done\"];\n      return {\n        baseClassName: baseClassName,\n        activeClassName: activeClassName,\n        doneClassName: doneClassName\n      };\n    };\n\n    return _this;\n  }\n\n  var _proto = CSSTransition.prototype;\n\n  _proto.addClass = function addClass(node, type, phase) {\n    var className = this.getClassNames(type)[phase + \"ClassName\"];\n\n    var _this$getClassNames = this.getClassNames('enter'),\n        doneClassName = _this$getClassNames.doneClassName;\n\n    if (type === 'appear' && phase === 'done' && doneClassName) {\n      className += \" \" + doneClassName;\n    } // This is to force a repaint,\n    // which is necessary in order to transition styles when adding a class name.\n\n\n    if (phase === 'active') {\n      if (node) forceReflow(node);\n    }\n\n    if (className) {\n      this.appliedClasses[type][phase] = className;\n\n      _addClass(node, className);\n    }\n  };\n\n  _proto.removeClasses = function removeClasses(node, type) {\n    var _this$appliedClasses$ = this.appliedClasses[type],\n        baseClassName = _this$appliedClasses$.base,\n        activeClassName = _this$appliedClasses$.active,\n        doneClassName = _this$appliedClasses$.done;\n    this.appliedClasses[type] = {};\n\n    if (baseClassName) {\n      removeClass(node, baseClassName);\n    }\n\n    if (activeClassName) {\n      removeClass(node, activeClassName);\n    }\n\n    if (doneClassName) {\n      removeClass(node, doneClassName);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        _ = _this$props.classNames,\n        props = _objectWithoutPropertiesLoose(_this$props, [\"classNames\"]);\n\n    return /*#__PURE__*/React.createElement(Transition, _extends({}, props, {\n      onEnter: this.onEnter,\n      onEntered: this.onEntered,\n      onEntering: this.onEntering,\n      onExit: this.onExit,\n      onExiting: this.onExiting,\n      onExited: this.onExited\n    }));\n  };\n\n  return CSSTransition;\n}(React.Component);\n\nCSSTransition.defaultProps = {\n  classNames: ''\n};\nCSSTransition.propTypes = process.env.NODE_ENV !== \"production\" ? _extends({}, Transition.propTypes, {\n  /**\n   * The animation classNames applied to the component as it appears, enters,\n   * exits or has finished the transition. A single name can be provided, which\n   * will be suffixed for each stage, e.g. `classNames=\"fade\"` applies:\n   *\n   * - `fade-appear`, `fade-appear-active`, `fade-appear-done`\n   * - `fade-enter`, `fade-enter-active`, `fade-enter-done`\n   * - `fade-exit`, `fade-exit-active`, `fade-exit-done`\n   *\n   * A few details to note about how these classes are applied:\n   *\n   * 1. They are _joined_ with the ones that are already defined on the child\n   *    component, so if you want to add some base styles, you can use\n   *    `className` without worrying that it will be overridden.\n   *\n   * 2. If the transition component mounts with `in={false}`, no classes are\n   *    applied yet. You might be expecting `*-exit-done`, but if you think\n   *    about it, a component cannot finish exiting if it hasn't entered yet.\n   *\n   * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This\n   *    allows you to define different behavior for when appearing is done and\n   *    when regular entering is done, using selectors like\n   *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply\n   *    an epic entrance animation when element first appears in the DOM using\n   *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can\n   *    simply use `fade-enter-done` for defining both cases.\n   *\n   * Each individual classNames can also be specified independently like:\n   *\n   * ```js\n   * classNames={{\n   *  appear: 'my-appear',\n   *  appearActive: 'my-active-appear',\n   *  appearDone: 'my-done-appear',\n   *  enter: 'my-enter',\n   *  enterActive: 'my-active-enter',\n   *  enterDone: 'my-done-enter',\n   *  exit: 'my-exit',\n   *  exitActive: 'my-active-exit',\n   *  exitDone: 'my-done-exit',\n   * }}\n   * ```\n   *\n   * If you want to set these classes using CSS Modules:\n   *\n   * ```js\n   * import styles from './styles.css';\n   * ```\n   *\n   * you might want to use camelCase in your CSS file, that way could simply\n   * spread them instead of listing them one by one:\n   *\n   * ```js\n   * classNames={{ ...styles }}\n   * ```\n   *\n   * @type {string | {\n   *  appear?: string,\n   *  appearActive?: string,\n   *  appearDone?: string,\n   *  enter?: string,\n   *  enterActive?: string,\n   *  enterDone?: string,\n   *  exit?: string,\n   *  exitActive?: string,\n   *  exitDone?: string,\n   * }}\n   */\n  classNames: classNamesShape,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter-active' or\n   * 'appear-active' class is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'enter' or\n   * 'appear' classes are **removed** and the `done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' class is\n   * applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit-active' is applied.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * A `<Transition>` callback fired immediately after the 'exit' classes\n   * are **removed** and the `exit-done` class is added to the DOM node.\n   *\n   * **Note**: when `nodeRef` prop is passed, `node` is not passed\n   *\n   * @type Function(node: HtmlElement)\n   */\n  onExited: PropTypes.func\n}) : {};\nexport default CSSTransition;","import hasClass from './hasClass';\n/**\n * Adds a CSS class to a given element.\n * \n * @param element the element\n * @param className the CSS class name\n */\n\nexport default function addClass(element, className) {\n  if (element.classList) element.classList.add(className);else if (!hasClass(element, className)) if (typeof element.className === 'string') element.className = element.className + \" \" + className;else element.setAttribute('class', (element.className && element.className.baseVal || '') + \" \" + className);\n}","/**\n * Checks if a given element has a CSS class.\n * \n * @param element the element\n * @param className the CSS class name\n */\nexport default function hasClass(element, className) {\n  if (element.classList) return !!className && element.classList.contains(className);\n  return (\" \" + (element.className.baseVal || element.className) + \" \").indexOf(\" \" + className + \" \") !== -1;\n}","import { Children, cloneElement, isValidElement } from 'react';\n/**\n * Given `this.props.children`, return an object mapping key to child.\n *\n * @param {*} children `this.props.children`\n * @return {object} Mapping of key to child\n */\n\nexport function getChildMapping(children, mapFn) {\n  var mapper = function mapper(child) {\n    return mapFn && isValidElement(child) ? mapFn(child) : child;\n  };\n\n  var result = Object.create(null);\n  if (children) Children.map(children, function (c) {\n    return c;\n  }).forEach(function (child) {\n    // run the map function here instead so that the key is the computed one\n    result[child.key] = mapper(child);\n  });\n  return result;\n}\n/**\n * When you're adding or removing children some may be added or removed in the\n * same render pass. We want to show *both* since we want to simultaneously\n * animate elements in and out. This function takes a previous set of keys\n * and a new set of keys and merges them with its best guess of the correct\n * ordering. In the future we may expose some of the utilities in\n * ReactMultiChild to make this easy, but for now React itself does not\n * directly have this concept of the union of prevChildren and nextChildren\n * so we implement it here.\n *\n * @param {object} prev prev children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @param {object} next next children as returned from\n * `ReactTransitionChildMapping.getChildMapping()`.\n * @return {object} a key set that contains all keys in `prev` and all keys\n * in `next` in a reasonable order.\n */\n\nexport function mergeChildMappings(prev, next) {\n  prev = prev || {};\n  next = next || {};\n\n  function getValueForKey(key) {\n    return key in next ? next[key] : prev[key];\n  } // For each key of `next`, the list of keys to insert before that key in\n  // the combined list\n\n\n  var nextKeysPending = Object.create(null);\n  var pendingKeys = [];\n\n  for (var prevKey in prev) {\n    if (prevKey in next) {\n      if (pendingKeys.length) {\n        nextKeysPending[prevKey] = pendingKeys;\n        pendingKeys = [];\n      }\n    } else {\n      pendingKeys.push(prevKey);\n    }\n  }\n\n  var i;\n  var childMapping = {};\n\n  for (var nextKey in next) {\n    if (nextKeysPending[nextKey]) {\n      for (i = 0; i < nextKeysPending[nextKey].length; i++) {\n        var pendingNextKey = nextKeysPending[nextKey][i];\n        childMapping[nextKeysPending[nextKey][i]] = getValueForKey(pendingNextKey);\n      }\n    }\n\n    childMapping[nextKey] = getValueForKey(nextKey);\n  } // Finally, add the keys which didn't appear before any key in `next`\n\n\n  for (i = 0; i < pendingKeys.length; i++) {\n    childMapping[pendingKeys[i]] = getValueForKey(pendingKeys[i]);\n  }\n\n  return childMapping;\n}\n\nfunction getProp(child, prop, props) {\n  return props[prop] != null ? props[prop] : child.props[prop];\n}\n\nexport function getInitialChildMapping(props, onExited) {\n  return getChildMapping(props.children, function (child) {\n    return cloneElement(child, {\n      onExited: onExited.bind(null, child),\n      in: true,\n      appear: getProp(child, 'appear', props),\n      enter: getProp(child, 'enter', props),\n      exit: getProp(child, 'exit', props)\n    });\n  });\n}\nexport function getNextChildMapping(nextProps, prevChildMapping, onExited) {\n  var nextChildMapping = getChildMapping(nextProps.children);\n  var children = mergeChildMappings(prevChildMapping, nextChildMapping);\n  Object.keys(children).forEach(function (key) {\n    var child = children[key];\n    if (!isValidElement(child)) return;\n    var hasPrev = (key in prevChildMapping);\n    var hasNext = (key in nextChildMapping);\n    var prevChild = prevChildMapping[key];\n    var isLeaving = isValidElement(prevChild) && !prevChild.props.in; // item is new (entering)\n\n    if (hasNext && (!hasPrev || isLeaving)) {\n      // console.log('entering', key)\n      children[key] = cloneElement(child, {\n        onExited: onExited.bind(null, child),\n        in: true,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    } else if (!hasNext && hasPrev && !isLeaving) {\n      // item is old (exiting)\n      // console.log('leaving', key)\n      children[key] = cloneElement(child, {\n        in: false\n      });\n    } else if (hasNext && hasPrev && isValidElement(prevChild)) {\n      // item hasn't changed transition states\n      // copy over the last transition props;\n      // console.log('unchanged', key)\n      children[key] = cloneElement(child, {\n        onExited: onExited.bind(null, child),\n        in: prevChild.props.in,\n        exit: getProp(child, 'exit', nextProps),\n        enter: getProp(child, 'enter', nextProps)\n      });\n    }\n  });\n  return children;\n}","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport TransitionGroupContext from './TransitionGroupContext';\nimport { getChildMapping, getInitialChildMapping, getNextChildMapping } from './utils/ChildMapping';\n\nvar values = Object.values || function (obj) {\n  return Object.keys(obj).map(function (k) {\n    return obj[k];\n  });\n};\n\nvar defaultProps = {\n  component: 'div',\n  childFactory: function childFactory(child) {\n    return child;\n  }\n};\n/**\n * The `<TransitionGroup>` component manages a set of transition components\n * (`<Transition>` and `<CSSTransition>`) in a list. Like with the transition\n * components, `<TransitionGroup>` is a state machine for managing the mounting\n * and unmounting of components over time.\n *\n * Consider the example below. As items are removed or added to the TodoList the\n * `in` prop is toggled automatically by the `<TransitionGroup>`.\n *\n * Note that `<TransitionGroup>`  does not define any animation behavior!\n * Exactly _how_ a list item animates is up to the individual transition\n * component. This means you can mix and match animations across different list\n * items.\n */\n\nvar TransitionGroup = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(TransitionGroup, _React$Component);\n\n  function TransitionGroup(props, context) {\n    var _this;\n\n    _this = _React$Component.call(this, props, context) || this;\n\n    var handleExited = _this.handleExited.bind(_assertThisInitialized(_this)); // Initial children should all be entering, dependent on appear\n\n\n    _this.state = {\n      contextValue: {\n        isMounting: true\n      },\n      handleExited: handleExited,\n      firstRender: true\n    };\n    return _this;\n  }\n\n  var _proto = TransitionGroup.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.mounted = true;\n    this.setState({\n      contextValue: {\n        isMounting: false\n      }\n    });\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    this.mounted = false;\n  };\n\n  TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, _ref) {\n    var prevChildMapping = _ref.children,\n        handleExited = _ref.handleExited,\n        firstRender = _ref.firstRender;\n    return {\n      children: firstRender ? getInitialChildMapping(nextProps, handleExited) : getNextChildMapping(nextProps, prevChildMapping, handleExited),\n      firstRender: false\n    };\n  } // node is `undefined` when user provided `nodeRef` prop\n  ;\n\n  _proto.handleExited = function handleExited(child, node) {\n    var currentChildMapping = getChildMapping(this.props.children);\n    if (child.key in currentChildMapping) return;\n\n    if (child.props.onExited) {\n      child.props.onExited(node);\n    }\n\n    if (this.mounted) {\n      this.setState(function (state) {\n        var children = _extends({}, state.children);\n\n        delete children[child.key];\n        return {\n          children: children\n        };\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        Component = _this$props.component,\n        childFactory = _this$props.childFactory,\n        props = _objectWithoutPropertiesLoose(_this$props, [\"component\", \"childFactory\"]);\n\n    var contextValue = this.state.contextValue;\n    var children = values(this.state.children).map(childFactory);\n    delete props.appear;\n    delete props.enter;\n    delete props.exit;\n\n    if (Component === null) {\n      return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n        value: contextValue\n      }, children);\n    }\n\n    return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n      value: contextValue\n    }, /*#__PURE__*/React.createElement(Component, props, children));\n  };\n\n  return TransitionGroup;\n}(React.Component);\n\nTransitionGroup.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * `<TransitionGroup>` renders a `<div>` by default. You can change this\n   * behavior by providing a `component` prop.\n   * If you use React v16+ and would like to avoid a wrapping `<div>` element\n   * you can pass in `component={null}`. This is useful if the wrapping div\n   * borks your css styles.\n   */\n  component: PropTypes.any,\n\n  /**\n   * A set of `<Transition>` components, that are toggled `in` and out as they\n   * leave. the `<TransitionGroup>` will inject specific transition props, so\n   * remember to spread them through if you are wrapping the `<Transition>` as\n   * with our `<Fade>` example.\n   *\n   * While this component is meant for multiple `Transition` or `CSSTransition`\n   * children, sometimes you may want to have a single transition child with\n   * content that you want to be transitioned out and in when you change it\n   * (e.g. routes, images etc.) In that case you can change the `key` prop of\n   * the transition child as you change its content, this will cause\n   * `TransitionGroup` to transition the child out and back in.\n   */\n  children: PropTypes.node,\n\n  /**\n   * A convenience prop that enables or disables appear animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * A convenience prop that enables or disables enter animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * A convenience prop that enables or disables exit animations\n   * for all children. Note that specifying this will override any defaults set\n   * on individual children Transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * You may need to apply reactive updates to a child as it is exiting.\n   * This is generally done by using `cloneElement` however in the case of an exiting\n   * child the element has already been removed and not accessible to the consumer.\n   *\n   * If you do need to update a child as it leaves you can provide a `childFactory`\n   * to wrap every child, even the ones that are leaving.\n   *\n   * @type Function(child: ReactElement) -> ReactElement\n   */\n  childFactory: PropTypes.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\nexport default TransitionGroup;","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport PropTypes from 'prop-types';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport TransitionGroup from './TransitionGroup';\n/**\n * The `<ReplaceTransition>` component is a specialized `Transition` component\n * that animates between two children.\n *\n * ```jsx\n * <ReplaceTransition in>\n *   <Fade><div>I appear first</div></Fade>\n *   <Fade><div>I replace the above</div></Fade>\n * </ReplaceTransition>\n * ```\n */\n\nvar ReplaceTransition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(ReplaceTransition, _React$Component);\n\n  function ReplaceTransition() {\n    var _this;\n\n    for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) {\n      _args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(_args)) || this;\n\n    _this.handleEnter = function () {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _this.handleLifecycle('onEnter', 0, args);\n    };\n\n    _this.handleEntering = function () {\n      for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n        args[_key3] = arguments[_key3];\n      }\n\n      return _this.handleLifecycle('onEntering', 0, args);\n    };\n\n    _this.handleEntered = function () {\n      for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n        args[_key4] = arguments[_key4];\n      }\n\n      return _this.handleLifecycle('onEntered', 0, args);\n    };\n\n    _this.handleExit = function () {\n      for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n        args[_key5] = arguments[_key5];\n      }\n\n      return _this.handleLifecycle('onExit', 1, args);\n    };\n\n    _this.handleExiting = function () {\n      for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n        args[_key6] = arguments[_key6];\n      }\n\n      return _this.handleLifecycle('onExiting', 1, args);\n    };\n\n    _this.handleExited = function () {\n      for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {\n        args[_key7] = arguments[_key7];\n      }\n\n      return _this.handleLifecycle('onExited', 1, args);\n    };\n\n    return _this;\n  }\n\n  var _proto = ReplaceTransition.prototype;\n\n  _proto.handleLifecycle = function handleLifecycle(handler, idx, originalArgs) {\n    var _child$props;\n\n    var children = this.props.children;\n    var child = React.Children.toArray(children)[idx];\n    if (child.props[handler]) (_child$props = child.props)[handler].apply(_child$props, originalArgs);\n\n    if (this.props[handler]) {\n      var maybeNode = child.props.nodeRef ? undefined : ReactDOM.findDOMNode(this);\n      this.props[handler](maybeNode);\n    }\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        inProp = _this$props.in,\n        props = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\"]);\n\n    var _React$Children$toArr = React.Children.toArray(children),\n        first = _React$Children$toArr[0],\n        second = _React$Children$toArr[1];\n\n    delete props.onEnter;\n    delete props.onEntering;\n    delete props.onEntered;\n    delete props.onExit;\n    delete props.onExiting;\n    delete props.onExited;\n    return /*#__PURE__*/React.createElement(TransitionGroup, props, inProp ? React.cloneElement(first, {\n      key: 'first',\n      onEnter: this.handleEnter,\n      onEntering: this.handleEntering,\n      onEntered: this.handleEntered\n    }) : React.cloneElement(second, {\n      key: 'second',\n      onEnter: this.handleExit,\n      onEntering: this.handleExiting,\n      onEntered: this.handleExited\n    }));\n  };\n\n  return ReplaceTransition;\n}(React.Component);\n\nReplaceTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  in: PropTypes.bool.isRequired,\n  children: function children(props, propName) {\n    if (React.Children.count(props[propName]) !== 2) return new Error(\"\\\"\" + propName + \"\\\" must be exactly two transition components.\");\n    return null;\n  }\n} : {};\nexport default ReplaceTransition;","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\n\nvar _leaveRenders, _enterRenders;\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { ENTERED, ENTERING, EXITING } from './Transition';\nimport TransitionGroupContext from './TransitionGroupContext';\n\nfunction areChildrenDifferent(oldChildren, newChildren) {\n  if (oldChildren === newChildren) return false;\n\n  if (React.isValidElement(oldChildren) && React.isValidElement(newChildren) && oldChildren.key != null && oldChildren.key === newChildren.key) {\n    return false;\n  }\n\n  return true;\n}\n/**\n * Enum of modes for SwitchTransition component\n * @enum { string }\n */\n\n\nexport var modes = {\n  out: 'out-in',\n  in: 'in-out'\n};\n\nvar callHook = function callHook(element, name, cb) {\n  return function () {\n    var _element$props;\n\n    element.props[name] && (_element$props = element.props)[name].apply(_element$props, arguments);\n    cb();\n  };\n};\n\nvar leaveRenders = (_leaveRenders = {}, _leaveRenders[modes.out] = function (_ref) {\n  var current = _ref.current,\n      changeState = _ref.changeState;\n  return React.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(ENTERING, null);\n    })\n  });\n}, _leaveRenders[modes.in] = function (_ref2) {\n  var current = _ref2.current,\n      changeState = _ref2.changeState,\n      children = _ref2.children;\n  return [current, React.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(ENTERING);\n    })\n  })];\n}, _leaveRenders);\nvar enterRenders = (_enterRenders = {}, _enterRenders[modes.out] = function (_ref3) {\n  var children = _ref3.children,\n      changeState = _ref3.changeState;\n  return React.cloneElement(children, {\n    in: true,\n    onEntered: callHook(children, 'onEntered', function () {\n      changeState(ENTERED, React.cloneElement(children, {\n        in: true\n      }));\n    })\n  });\n}, _enterRenders[modes.in] = function (_ref4) {\n  var current = _ref4.current,\n      children = _ref4.children,\n      changeState = _ref4.changeState;\n  return [React.cloneElement(current, {\n    in: false,\n    onExited: callHook(current, 'onExited', function () {\n      changeState(ENTERED, React.cloneElement(children, {\n        in: true\n      }));\n    })\n  }), React.cloneElement(children, {\n    in: true\n  })];\n}, _enterRenders);\n/**\n * A transition component inspired by the [vue transition modes](https://vuejs.org/v2/guide/transitions.html#Transition-Modes).\n * You can use it when you want to control the render between state transitions.\n * Based on the selected mode and the child's key which is the `Transition` or `CSSTransition` component, the `SwitchTransition` makes a consistent transition between them.\n *\n * If the `out-in` mode is selected, the `SwitchTransition` waits until the old child leaves and then inserts a new child.\n * If the `in-out` mode is selected, the `SwitchTransition` inserts a new child first, waits for the new child to enter and then removes the old child.\n *\n * **Note**: If you want the animation to happen simultaneously\n * (that is, to have the old child removed and a new child inserted **at the same time**),\n * you should use\n * [`TransitionGroup`](https://reactcommunity.org/react-transition-group/transition-group)\n * instead.\n *\n * ```jsx\n * function App() {\n *  const [state, setState] = useState(false);\n *  return (\n *    <SwitchTransition>\n *      <CSSTransition\n *        key={state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        addEndListener={(node, done) => node.addEventListener(\"transitionend\", done, false)}\n *        classNames='fade'\n *      >\n *        <button onClick={() => setState(state => !state)}>\n *          {state ? \"Goodbye, world!\" : \"Hello, world!\"}\n *        </button>\n *      </CSSTransition>\n *    </SwitchTransition>\n *  );\n * }\n * ```\n *\n * ```css\n * .fade-enter{\n *    opacity: 0;\n * }\n * .fade-exit{\n *    opacity: 1;\n * }\n * .fade-enter-active{\n *    opacity: 1;\n * }\n * .fade-exit-active{\n *    opacity: 0;\n * }\n * .fade-enter-active,\n * .fade-exit-active{\n *    transition: opacity 500ms;\n * }\n * ```\n */\n\nvar SwitchTransition = /*#__PURE__*/function (_React$Component) {\n  _inheritsLoose(SwitchTransition, _React$Component);\n\n  function SwitchTransition() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this.state = {\n      status: ENTERED,\n      current: null\n    };\n    _this.appeared = false;\n\n    _this.changeState = function (status, current) {\n      if (current === void 0) {\n        current = _this.state.current;\n      }\n\n      _this.setState({\n        status: status,\n        current: current\n      });\n    };\n\n    return _this;\n  }\n\n  var _proto = SwitchTransition.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    this.appeared = true;\n  };\n\n  SwitchTransition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n    if (props.children == null) {\n      return {\n        current: null\n      };\n    }\n\n    if (state.status === ENTERING && props.mode === modes.in) {\n      return {\n        status: ENTERING\n      };\n    }\n\n    if (state.current && areChildrenDifferent(state.current, props.children)) {\n      return {\n        status: EXITING\n      };\n    }\n\n    return {\n      current: React.cloneElement(props.children, {\n        in: true\n      })\n    };\n  };\n\n  _proto.render = function render() {\n    var _this$props = this.props,\n        children = _this$props.children,\n        mode = _this$props.mode,\n        _this$state = this.state,\n        status = _this$state.status,\n        current = _this$state.current;\n    var data = {\n      children: children,\n      current: current,\n      changeState: this.changeState,\n      status: status\n    };\n    var component;\n\n    switch (status) {\n      case ENTERING:\n        component = enterRenders[mode](data);\n        break;\n\n      case EXITING:\n        component = leaveRenders[mode](data);\n        break;\n\n      case ENTERED:\n        component = current;\n    }\n\n    return /*#__PURE__*/React.createElement(TransitionGroupContext.Provider, {\n      value: {\n        isMounting: !this.appeared\n      }\n    }, component);\n  };\n\n  return SwitchTransition;\n}(React.Component);\n\nSwitchTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * Transition modes.\n   * `out-in`: Current element transitions out first, then when complete, the new element transitions in.\n   * `in-out`: New element transitions in first, then when complete, the current element transitions out.\n   *\n   * @type {'out-in'|'in-out'}\n   */\n  mode: PropTypes.oneOf([modes.in, modes.out]),\n\n  /**\n   * Any `Transition` or `CSSTransition` component.\n   */\n  children: PropTypes.oneOfType([PropTypes.element.isRequired])\n} : {};\nSwitchTransition.defaultProps = {\n  mode: modes.out\n};\nexport default SwitchTransition;","/** @license React v16.14.0\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),g=60103;exports.Fragment=60107;if(\"function\"===typeof Symbol&&Symbol.for){var h=Symbol.for;g=h(\"react.element\");exports.Fragment=h(\"react.fragment\")}var m=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,n=Object.prototype.hasOwnProperty,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,k){var b,d={},e=null,l=null;void 0!==k&&(e=\"\"+k);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(l=a.ref);for(b in a)n.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:g,type:c,key:e,ref:l,props:d,_owner:m.current}}exports.jsx=q;exports.jsxs=q;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/** A function that accepts a potential \"extra argument\" value to be injected later,\r\n * and returns an instance of the thunk middleware that uses that value\r\n */\nfunction createThunkMiddleware(extraArgument) {\n  // Standard Redux middleware definition pattern:\n  // See: https://redux.js.org/tutorials/fundamentals/part-4-store#writing-custom-middleware\n  var middleware = function middleware(_ref) {\n    var dispatch = _ref.dispatch,\n        getState = _ref.getState;\n    return function (next) {\n      return function (action) {\n        // The thunk middleware looks for any functions that were passed to `store.dispatch`.\n        // If this \"action\" is really a function, call it and return the result.\n        if (typeof action === 'function') {\n          // Inject the store's `dispatch` and `getState` methods, as well as any \"extra arg\"\n          return action(dispatch, getState, extraArgument);\n        } // Otherwise, pass the action down the middleware chain as usual\n\n\n        return next(action);\n      };\n    };\n  };\n\n  return middleware;\n}\n\nvar thunk = createThunkMiddleware(); // Attach the factory function so users can create a customized version\n// with whatever \"extra arg\" they want to inject into their thunks\n\nthunk.withExtraArgument = createThunkMiddleware;\nexport default thunk;","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n  return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n  return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n  return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n  INIT: \"@@redux/INIT\" + randomString(),\n  REPLACE: \"@@redux/REPLACE\" + randomString(),\n  PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n    return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n  }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n  if (typeof obj !== 'object' || obj === null) return false;\n  var proto = obj;\n\n  while (Object.getPrototypeOf(proto) !== null) {\n    proto = Object.getPrototypeOf(proto);\n  }\n\n  return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n  if (val === void 0) return 'undefined';\n  if (val === null) return 'null';\n  var type = typeof val;\n\n  switch (type) {\n    case 'boolean':\n    case 'string':\n    case 'number':\n    case 'symbol':\n    case 'function':\n      {\n        return type;\n      }\n  }\n\n  if (Array.isArray(val)) return 'array';\n  if (isDate(val)) return 'date';\n  if (isError(val)) return 'error';\n  var constructorName = ctorName(val);\n\n  switch (constructorName) {\n    case 'Symbol':\n    case 'Promise':\n    case 'WeakMap':\n    case 'WeakSet':\n    case 'Map':\n    case 'Set':\n      return constructorName;\n  } // other\n\n\n  return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n  return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n  return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n  if (val instanceof Date) return true;\n  return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n  var typeOfVal = typeof val;\n\n  if (process.env.NODE_ENV !== 'production') {\n    typeOfVal = miniKindOf(val);\n  }\n\n  return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n  var _ref2;\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n  }\n\n  if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n    enhancer = preloadedState;\n    preloadedState = undefined;\n  }\n\n  if (typeof enhancer !== 'undefined') {\n    if (typeof enhancer !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n    }\n\n    return enhancer(createStore)(reducer, preloadedState);\n  }\n\n  if (typeof reducer !== 'function') {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n  }\n\n  var currentReducer = reducer;\n  var currentState = preloadedState;\n  var currentListeners = [];\n  var nextListeners = currentListeners;\n  var isDispatching = false;\n  /**\n   * This makes a shallow copy of currentListeners so we can use\n   * nextListeners as a temporary list while dispatching.\n   *\n   * This prevents any bugs around consumers calling\n   * subscribe/unsubscribe in the middle of a dispatch.\n   */\n\n  function ensureCanMutateNextListeners() {\n    if (nextListeners === currentListeners) {\n      nextListeners = currentListeners.slice();\n    }\n  }\n  /**\n   * Reads the state tree managed by the store.\n   *\n   * @returns {any} The current state tree of your application.\n   */\n\n\n  function getState() {\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n    }\n\n    return currentState;\n  }\n  /**\n   * Adds a change listener. It will be called any time an action is dispatched,\n   * and some part of the state tree may potentially have changed. You may then\n   * call `getState()` to read the current state tree inside the callback.\n   *\n   * You may call `dispatch()` from a change listener, with the following\n   * caveats:\n   *\n   * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n   * If you subscribe or unsubscribe while the listeners are being invoked, this\n   * will not have any effect on the `dispatch()` that is currently in progress.\n   * However, the next `dispatch()` call, whether nested or not, will use a more\n   * recent snapshot of the subscription list.\n   *\n   * 2. The listener should not expect to see all state changes, as the state\n   * might have been updated multiple times during a nested `dispatch()` before\n   * the listener is called. It is, however, guaranteed that all subscribers\n   * registered before the `dispatch()` started will be called with the latest\n   * state by the time it exits.\n   *\n   * @param {Function} listener A callback to be invoked on every dispatch.\n   * @returns {Function} A function to remove this change listener.\n   */\n\n\n  function subscribe(listener) {\n    if (typeof listener !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n    }\n\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n    }\n\n    var isSubscribed = true;\n    ensureCanMutateNextListeners();\n    nextListeners.push(listener);\n    return function unsubscribe() {\n      if (!isSubscribed) {\n        return;\n      }\n\n      if (isDispatching) {\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n      }\n\n      isSubscribed = false;\n      ensureCanMutateNextListeners();\n      var index = nextListeners.indexOf(listener);\n      nextListeners.splice(index, 1);\n      currentListeners = null;\n    };\n  }\n  /**\n   * Dispatches an action. It is the only way to trigger a state change.\n   *\n   * The `reducer` function, used to create the store, will be called with the\n   * current state tree and the given `action`. Its return value will\n   * be considered the **next** state of the tree, and the change listeners\n   * will be notified.\n   *\n   * The base implementation only supports plain object actions. If you want to\n   * dispatch a Promise, an Observable, a thunk, or something else, you need to\n   * wrap your store creating function into the corresponding middleware. For\n   * example, see the documentation for the `redux-thunk` package. Even the\n   * middleware will eventually dispatch plain object actions using this method.\n   *\n   * @param {Object} action A plain object representing “what changed”. It is\n   * a good idea to keep actions serializable so you can record and replay user\n   * sessions, or use the time travelling `redux-devtools`. An action must have\n   * a `type` property which may not be `undefined`. It is a good idea to use\n   * string constants for action types.\n   *\n   * @returns {Object} For convenience, the same action object you dispatched.\n   *\n   * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n   * return something else (for example, a Promise you can await).\n   */\n\n\n  function dispatch(action) {\n    if (!isPlainObject(action)) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n    }\n\n    if (typeof action.type === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n    }\n\n    if (isDispatching) {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n    }\n\n    try {\n      isDispatching = true;\n      currentState = currentReducer(currentState, action);\n    } finally {\n      isDispatching = false;\n    }\n\n    var listeners = currentListeners = nextListeners;\n\n    for (var i = 0; i < listeners.length; i++) {\n      var listener = listeners[i];\n      listener();\n    }\n\n    return action;\n  }\n  /**\n   * Replaces the reducer currently used by the store to calculate the state.\n   *\n   * You might need this if your app implements code splitting and you want to\n   * load some of the reducers dynamically. You might also need this if you\n   * implement a hot reloading mechanism for Redux.\n   *\n   * @param {Function} nextReducer The reducer for the store to use instead.\n   * @returns {void}\n   */\n\n\n  function replaceReducer(nextReducer) {\n    if (typeof nextReducer !== 'function') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n    }\n\n    currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n    // Any reducers that existed in both the new and old rootReducer\n    // will receive the previous state. This effectively populates\n    // the new state tree with any relevant data from the old one.\n\n    dispatch({\n      type: ActionTypes.REPLACE\n    });\n  }\n  /**\n   * Interoperability point for observable/reactive libraries.\n   * @returns {observable} A minimal observable of state changes.\n   * For more information, see the observable proposal:\n   * https://github.com/tc39/proposal-observable\n   */\n\n\n  function observable() {\n    var _ref;\n\n    var outerSubscribe = subscribe;\n    return _ref = {\n      /**\n       * The minimal observable subscription method.\n       * @param {Object} observer Any object that can be used as an observer.\n       * The observer object should have a `next` method.\n       * @returns {subscription} An object with an `unsubscribe` method that can\n       * be used to unsubscribe the observable from the store, and prevent further\n       * emission of values from the observable.\n       */\n      subscribe: function subscribe(observer) {\n        if (typeof observer !== 'object' || observer === null) {\n          throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n        }\n\n        function observeState() {\n          if (observer.next) {\n            observer.next(getState());\n          }\n        }\n\n        observeState();\n        var unsubscribe = outerSubscribe(observeState);\n        return {\n          unsubscribe: unsubscribe\n        };\n      }\n    }, _ref[$$observable] = function () {\n      return this;\n    }, _ref;\n  } // When a store is created, an \"INIT\" action is dispatched so that every\n  // reducer returns their initial state. This effectively populates\n  // the initial state tree.\n\n\n  dispatch({\n    type: ActionTypes.INIT\n  });\n  return _ref2 = {\n    dispatch: dispatch,\n    subscribe: subscribe,\n    getState: getState,\n    replaceReducer: replaceReducer\n  }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n  /* eslint-disable no-console */\n  if (typeof console !== 'undefined' && typeof console.error === 'function') {\n    console.error(message);\n  }\n  /* eslint-enable no-console */\n\n\n  try {\n    // This error was thrown as a convenience so that if you enable\n    // \"break on all exceptions\" in your console,\n    // it would pause the execution at this line.\n    throw new Error(message);\n  } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n  var reducerKeys = Object.keys(reducers);\n  var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n  if (reducerKeys.length === 0) {\n    return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n  }\n\n  if (!isPlainObject(inputState)) {\n    return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n  }\n\n  var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n    return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n  });\n  unexpectedKeys.forEach(function (key) {\n    unexpectedKeyCache[key] = true;\n  });\n  if (action && action.type === ActionTypes.REPLACE) return;\n\n  if (unexpectedKeys.length > 0) {\n    return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n  }\n}\n\nfunction assertReducerShape(reducers) {\n  Object.keys(reducers).forEach(function (key) {\n    var reducer = reducers[key];\n    var initialState = reducer(undefined, {\n      type: ActionTypes.INIT\n    });\n\n    if (typeof initialState === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"If the state passed to the reducer is undefined, you must \" + \"explicitly return the initial state. The initial state may \" + \"not be undefined. If you don't want to set a value for this reducer, \" + \"you can use null instead of undefined.\");\n    }\n\n    if (typeof reducer(undefined, {\n      type: ActionTypes.PROBE_UNKNOWN_ACTION()\n    }) === 'undefined') {\n      throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n    }\n  });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n  var reducerKeys = Object.keys(reducers);\n  var finalReducers = {};\n\n  for (var i = 0; i < reducerKeys.length; i++) {\n    var key = reducerKeys[i];\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (typeof reducers[key] === 'undefined') {\n        warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n      }\n    }\n\n    if (typeof reducers[key] === 'function') {\n      finalReducers[key] = reducers[key];\n    }\n  }\n\n  var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n  // keys multiple times.\n\n  var unexpectedKeyCache;\n\n  if (process.env.NODE_ENV !== 'production') {\n    unexpectedKeyCache = {};\n  }\n\n  var shapeAssertionError;\n\n  try {\n    assertReducerShape(finalReducers);\n  } catch (e) {\n    shapeAssertionError = e;\n  }\n\n  return function combination(state, action) {\n    if (state === void 0) {\n      state = {};\n    }\n\n    if (shapeAssertionError) {\n      throw shapeAssertionError;\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n      if (warningMessage) {\n        warning(warningMessage);\n      }\n    }\n\n    var hasChanged = false;\n    var nextState = {};\n\n    for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n      var _key = finalReducerKeys[_i];\n      var reducer = finalReducers[_key];\n      var previousStateForKey = state[_key];\n      var nextStateForKey = reducer(previousStateForKey, action);\n\n      if (typeof nextStateForKey === 'undefined') {\n        var actionType = action && action.type;\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n      }\n\n      nextState[_key] = nextStateForKey;\n      hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n    }\n\n    hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n    return hasChanged ? nextState : state;\n  };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n  return function () {\n    return dispatch(actionCreator.apply(this, arguments));\n  };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n  if (typeof actionCreators === 'function') {\n    return bindActionCreator(actionCreators, dispatch);\n  }\n\n  if (typeof actionCreators !== 'object' || actionCreators === null) {\n    throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n  }\n\n  var boundActionCreators = {};\n\n  for (var key in actionCreators) {\n    var actionCreator = actionCreators[key];\n\n    if (typeof actionCreator === 'function') {\n      boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n    }\n  }\n\n  return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n  for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n    funcs[_key] = arguments[_key];\n  }\n\n  if (funcs.length === 0) {\n    return function (arg) {\n      return arg;\n    };\n  }\n\n  if (funcs.length === 1) {\n    return funcs[0];\n  }\n\n  return funcs.reduce(function (a, b) {\n    return function () {\n      return a(b.apply(void 0, arguments));\n    };\n  });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n  for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n    middlewares[_key] = arguments[_key];\n  }\n\n  return function (createStore) {\n    return function () {\n      var store = createStore.apply(void 0, arguments);\n\n      var _dispatch = function dispatch() {\n        throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n      };\n\n      var middlewareAPI = {\n        getState: store.getState,\n        dispatch: function dispatch() {\n          return _dispatch.apply(void 0, arguments);\n        }\n      };\n      var chain = middlewares.map(function (middleware) {\n        return middleware(middlewareAPI);\n      });\n      _dispatch = compose.apply(void 0, chain)(store.dispatch);\n      return _objectSpread(_objectSpread({}, store), {}, {\n        dispatch: _dispatch\n      });\n    };\n  };\n}\n\n/*\n * This is a dummy function to check if the function name has been altered by minification.\n * If the function has been minified and NODE_ENV !== 'production', warn the user.\n */\n\nfunction isCrushed() {}\n\nif (process.env.NODE_ENV !== 'production' && typeof isCrushed.name === 'string' && isCrushed.name !== 'isCrushed') {\n  warning('You are currently using minified code outside of NODE_ENV === \"production\". ' + 'This means that you are running a slower development build of Redux. ' + 'You can use loose-envify (https://github.com/zertosh/loose-envify) for browserify ' + 'or setting mode to production in webpack (https://webpack.js.org/concepts/mode/) ' + 'to ensure you have the correct code for your production build.');\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n    if (typeof Map !== 'undefined') {\r\n        return Map;\r\n    }\r\n    /**\r\n     * Returns index in provided array that matches the specified key.\r\n     *\r\n     * @param {Array<Array>} arr\r\n     * @param {*} key\r\n     * @returns {number}\r\n     */\r\n    function getIndex(arr, key) {\r\n        var result = -1;\r\n        arr.some(function (entry, index) {\r\n            if (entry[0] === key) {\r\n                result = index;\r\n                return true;\r\n            }\r\n            return false;\r\n        });\r\n        return result;\r\n    }\r\n    return /** @class */ (function () {\r\n        function class_1() {\r\n            this.__entries__ = [];\r\n        }\r\n        Object.defineProperty(class_1.prototype, \"size\", {\r\n            /**\r\n             * @returns {boolean}\r\n             */\r\n            get: function () {\r\n                return this.__entries__.length;\r\n            },\r\n            enumerable: true,\r\n            configurable: true\r\n        });\r\n        /**\r\n         * @param {*} key\r\n         * @returns {*}\r\n         */\r\n        class_1.prototype.get = function (key) {\r\n            var index = getIndex(this.__entries__, key);\r\n            var entry = this.__entries__[index];\r\n            return entry && entry[1];\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @param {*} value\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.set = function (key, value) {\r\n            var index = getIndex(this.__entries__, key);\r\n            if (~index) {\r\n                this.__entries__[index][1] = value;\r\n            }\r\n            else {\r\n                this.__entries__.push([key, value]);\r\n            }\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.delete = function (key) {\r\n            var entries = this.__entries__;\r\n            var index = getIndex(entries, key);\r\n            if (~index) {\r\n                entries.splice(index, 1);\r\n            }\r\n        };\r\n        /**\r\n         * @param {*} key\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.has = function (key) {\r\n            return !!~getIndex(this.__entries__, key);\r\n        };\r\n        /**\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.clear = function () {\r\n            this.__entries__.splice(0);\r\n        };\r\n        /**\r\n         * @param {Function} callback\r\n         * @param {*} [ctx=null]\r\n         * @returns {void}\r\n         */\r\n        class_1.prototype.forEach = function (callback, ctx) {\r\n            if (ctx === void 0) { ctx = null; }\r\n            for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n                var entry = _a[_i];\r\n                callback.call(ctx, entry[1], entry[0]);\r\n            }\r\n        };\r\n        return class_1;\r\n    }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n    if (typeof global !== 'undefined' && global.Math === Math) {\r\n        return global;\r\n    }\r\n    if (typeof self !== 'undefined' && self.Math === Math) {\r\n        return self;\r\n    }\r\n    if (typeof window !== 'undefined' && window.Math === Math) {\r\n        return window;\r\n    }\r\n    // eslint-disable-next-line no-new-func\r\n    return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n    if (typeof requestAnimationFrame === 'function') {\r\n        // It's required to use a bounded function because IE sometimes throws\r\n        // an \"Invalid calling object\" error if rAF is invoked without the global\r\n        // object on the left hand side.\r\n        return requestAnimationFrame.bind(global$1);\r\n    }\r\n    return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n    var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n    /**\r\n     * Invokes the original callback function and schedules new invocation if\r\n     * the \"proxy\" was called during current request.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function resolvePending() {\r\n        if (leadingCall) {\r\n            leadingCall = false;\r\n            callback();\r\n        }\r\n        if (trailingCall) {\r\n            proxy();\r\n        }\r\n    }\r\n    /**\r\n     * Callback invoked after the specified delay. It will further postpone\r\n     * invocation of the original function delegating it to the\r\n     * requestAnimationFrame.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function timeoutCallback() {\r\n        requestAnimationFrame$1(resolvePending);\r\n    }\r\n    /**\r\n     * Schedules invocation of the original function.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    function proxy() {\r\n        var timeStamp = Date.now();\r\n        if (leadingCall) {\r\n            // Reject immediately following calls.\r\n            if (timeStamp - lastCallTime < trailingTimeout) {\r\n                return;\r\n            }\r\n            // Schedule new call to be in invoked when the pending one is resolved.\r\n            // This is important for \"transitions\" which never actually start\r\n            // immediately so there is a chance that we might miss one if change\r\n            // happens amids the pending invocation.\r\n            trailingCall = true;\r\n        }\r\n        else {\r\n            leadingCall = true;\r\n            trailingCall = false;\r\n            setTimeout(timeoutCallback, delay);\r\n        }\r\n        lastCallTime = timeStamp;\r\n    }\r\n    return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserverController.\r\n     *\r\n     * @private\r\n     */\r\n    function ResizeObserverController() {\r\n        /**\r\n         * Indicates whether DOM listeners have been added.\r\n         *\r\n         * @private {boolean}\r\n         */\r\n        this.connected_ = false;\r\n        /**\r\n         * Tells that controller has subscribed for Mutation Events.\r\n         *\r\n         * @private {boolean}\r\n         */\r\n        this.mutationEventsAdded_ = false;\r\n        /**\r\n         * Keeps reference to the instance of MutationObserver.\r\n         *\r\n         * @private {MutationObserver}\r\n         */\r\n        this.mutationsObserver_ = null;\r\n        /**\r\n         * A list of connected observers.\r\n         *\r\n         * @private {Array<ResizeObserverSPI>}\r\n         */\r\n        this.observers_ = [];\r\n        this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n        this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n    }\r\n    /**\r\n     * Adds observer to observers list.\r\n     *\r\n     * @param {ResizeObserverSPI} observer - Observer to be added.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.addObserver = function (observer) {\r\n        if (!~this.observers_.indexOf(observer)) {\r\n            this.observers_.push(observer);\r\n        }\r\n        // Add listeners if they haven't been added yet.\r\n        if (!this.connected_) {\r\n            this.connect_();\r\n        }\r\n    };\r\n    /**\r\n     * Removes observer from observers list.\r\n     *\r\n     * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.removeObserver = function (observer) {\r\n        var observers = this.observers_;\r\n        var index = observers.indexOf(observer);\r\n        // Remove observer if it's present in registry.\r\n        if (~index) {\r\n            observers.splice(index, 1);\r\n        }\r\n        // Remove listeners if controller has no connected observers.\r\n        if (!observers.length && this.connected_) {\r\n            this.disconnect_();\r\n        }\r\n    };\r\n    /**\r\n     * Invokes the update of observers. It will continue running updates insofar\r\n     * it detects changes.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.refresh = function () {\r\n        var changesDetected = this.updateObservers_();\r\n        // Continue running updates if changes have been detected as there might\r\n        // be future ones caused by CSS transitions.\r\n        if (changesDetected) {\r\n            this.refresh();\r\n        }\r\n    };\r\n    /**\r\n     * Updates every observer from observers list and notifies them of queued\r\n     * entries.\r\n     *\r\n     * @private\r\n     * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n     *      dimensions of it's elements.\r\n     */\r\n    ResizeObserverController.prototype.updateObservers_ = function () {\r\n        // Collect observers that have active observations.\r\n        var activeObservers = this.observers_.filter(function (observer) {\r\n            return observer.gatherActive(), observer.hasActive();\r\n        });\r\n        // Deliver notifications in a separate cycle in order to avoid any\r\n        // collisions between observers, e.g. when multiple instances of\r\n        // ResizeObserver are tracking the same element and the callback of one\r\n        // of them changes content dimensions of the observed target. Sometimes\r\n        // this may result in notifications being blocked for the rest of observers.\r\n        activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n        return activeObservers.length > 0;\r\n    };\r\n    /**\r\n     * Initializes DOM listeners.\r\n     *\r\n     * @private\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.connect_ = function () {\r\n        // Do nothing if running in a non-browser environment or if listeners\r\n        // have been already added.\r\n        if (!isBrowser || this.connected_) {\r\n            return;\r\n        }\r\n        // Subscription to the \"Transitionend\" event is used as a workaround for\r\n        // delayed transitions. This way it's possible to capture at least the\r\n        // final state of an element.\r\n        document.addEventListener('transitionend', this.onTransitionEnd_);\r\n        window.addEventListener('resize', this.refresh);\r\n        if (mutationObserverSupported) {\r\n            this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n            this.mutationsObserver_.observe(document, {\r\n                attributes: true,\r\n                childList: true,\r\n                characterData: true,\r\n                subtree: true\r\n            });\r\n        }\r\n        else {\r\n            document.addEventListener('DOMSubtreeModified', this.refresh);\r\n            this.mutationEventsAdded_ = true;\r\n        }\r\n        this.connected_ = true;\r\n    };\r\n    /**\r\n     * Removes DOM listeners.\r\n     *\r\n     * @private\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.disconnect_ = function () {\r\n        // Do nothing if running in a non-browser environment or if listeners\r\n        // have been already removed.\r\n        if (!isBrowser || !this.connected_) {\r\n            return;\r\n        }\r\n        document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n        window.removeEventListener('resize', this.refresh);\r\n        if (this.mutationsObserver_) {\r\n            this.mutationsObserver_.disconnect();\r\n        }\r\n        if (this.mutationEventsAdded_) {\r\n            document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n        }\r\n        this.mutationsObserver_ = null;\r\n        this.mutationEventsAdded_ = false;\r\n        this.connected_ = false;\r\n    };\r\n    /**\r\n     * \"Transitionend\" event handler.\r\n     *\r\n     * @private\r\n     * @param {TransitionEvent} event\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n        var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n        // Detect whether transition may affect dimensions of an element.\r\n        var isReflowProperty = transitionKeys.some(function (key) {\r\n            return !!~propertyName.indexOf(key);\r\n        });\r\n        if (isReflowProperty) {\r\n            this.refresh();\r\n        }\r\n    };\r\n    /**\r\n     * Returns instance of the ResizeObserverController.\r\n     *\r\n     * @returns {ResizeObserverController}\r\n     */\r\n    ResizeObserverController.getInstance = function () {\r\n        if (!this.instance_) {\r\n            this.instance_ = new ResizeObserverController();\r\n        }\r\n        return this.instance_;\r\n    };\r\n    /**\r\n     * Holds reference to the controller's instance.\r\n     *\r\n     * @private {ResizeObserverController}\r\n     */\r\n    ResizeObserverController.instance_ = null;\r\n    return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n    for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n        var key = _a[_i];\r\n        Object.defineProperty(target, key, {\r\n            value: props[key],\r\n            enumerable: false,\r\n            writable: false,\r\n            configurable: true\r\n        });\r\n    }\r\n    return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n    // Assume that the element is an instance of Node, which means that it\r\n    // has the \"ownerDocument\" property from which we can retrieve a\r\n    // corresponding global object.\r\n    var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n    // Return the local global object if it's not possible extract one from\r\n    // provided element.\r\n    return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n    return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n    var positions = [];\r\n    for (var _i = 1; _i < arguments.length; _i++) {\r\n        positions[_i - 1] = arguments[_i];\r\n    }\r\n    return positions.reduce(function (size, position) {\r\n        var value = styles['border-' + position + '-width'];\r\n        return size + toFloat(value);\r\n    }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n    var positions = ['top', 'right', 'bottom', 'left'];\r\n    var paddings = {};\r\n    for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n        var position = positions_1[_i];\r\n        var value = styles['padding-' + position];\r\n        paddings[position] = toFloat(value);\r\n    }\r\n    return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n *      to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n    var bbox = target.getBBox();\r\n    return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n    // Client width & height properties can't be\r\n    // used exclusively as they provide rounded values.\r\n    var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n    // By this condition we can catch all non-replaced inline, hidden and\r\n    // detached elements. Though elements with width & height properties less\r\n    // than 0.5 will be discarded as well.\r\n    //\r\n    // Without it we would need to implement separate methods for each of\r\n    // those cases and it's not possible to perform a precise and performance\r\n    // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n    // gives wrong results for elements with width & height less than 0.5.\r\n    if (!clientWidth && !clientHeight) {\r\n        return emptyRect;\r\n    }\r\n    var styles = getWindowOf(target).getComputedStyle(target);\r\n    var paddings = getPaddings(styles);\r\n    var horizPad = paddings.left + paddings.right;\r\n    var vertPad = paddings.top + paddings.bottom;\r\n    // Computed styles of width & height are being used because they are the\r\n    // only dimensions available to JS that contain non-rounded values. It could\r\n    // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n    // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n    var width = toFloat(styles.width), height = toFloat(styles.height);\r\n    // Width & height include paddings and borders when the 'border-box' box\r\n    // model is applied (except for IE).\r\n    if (styles.boxSizing === 'border-box') {\r\n        // Following conditions are required to handle Internet Explorer which\r\n        // doesn't include paddings and borders to computed CSS dimensions.\r\n        //\r\n        // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n        // properties then it's either IE, and thus we don't need to subtract\r\n        // anything, or an element merely doesn't have paddings/borders styles.\r\n        if (Math.round(width + horizPad) !== clientWidth) {\r\n            width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n        }\r\n        if (Math.round(height + vertPad) !== clientHeight) {\r\n            height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n        }\r\n    }\r\n    // Following steps can't be applied to the document's root element as its\r\n    // client[Width/Height] properties represent viewport area of the window.\r\n    // Besides, it's as well not necessary as the <html> itself neither has\r\n    // rendered scroll bars nor it can be clipped.\r\n    if (!isDocumentElement(target)) {\r\n        // In some browsers (only in Firefox, actually) CSS width & height\r\n        // include scroll bars size which can be removed at this step as scroll\r\n        // bars are the only difference between rounded dimensions + paddings\r\n        // and \"client\" properties, though that is not always true in Chrome.\r\n        var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n        var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n        // Chrome has a rather weird rounding of \"client\" properties.\r\n        // E.g. for an element with content width of 314.2px it sometimes gives\r\n        // the client width of 315px and for the width of 314.7px it may give\r\n        // 314px. And it doesn't happen all the time. So just ignore this delta\r\n        // as a non-relevant.\r\n        if (Math.abs(vertScrollbar) !== 1) {\r\n            width -= vertScrollbar;\r\n        }\r\n        if (Math.abs(horizScrollbar) !== 1) {\r\n            height -= horizScrollbar;\r\n        }\r\n    }\r\n    return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n    // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n    // interface.\r\n    if (typeof SVGGraphicsElement !== 'undefined') {\r\n        return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n    }\r\n    // If it's so, then check that element is at least an instance of the\r\n    // SVGElement and that it has the \"getBBox\" method.\r\n    // eslint-disable-next-line no-extra-parens\r\n    return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n        typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element (<html>).\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n    return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n    if (!isBrowser) {\r\n        return emptyRect;\r\n    }\r\n    if (isSVGGraphicsElement(target)) {\r\n        return getSVGContentRect(target);\r\n    }\r\n    return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n    var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n    // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n    var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n    var rect = Object.create(Constr.prototype);\r\n    // Rectangle's properties are not writable and non-enumerable.\r\n    defineConfigurable(rect, {\r\n        x: x, y: y, width: width, height: height,\r\n        top: y,\r\n        right: x + width,\r\n        bottom: height + y,\r\n        left: x\r\n    });\r\n    return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n    return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n    /**\r\n     * Creates an instance of ResizeObservation.\r\n     *\r\n     * @param {Element} target - Element to be observed.\r\n     */\r\n    function ResizeObservation(target) {\r\n        /**\r\n         * Broadcasted width of content rectangle.\r\n         *\r\n         * @type {number}\r\n         */\r\n        this.broadcastWidth = 0;\r\n        /**\r\n         * Broadcasted height of content rectangle.\r\n         *\r\n         * @type {number}\r\n         */\r\n        this.broadcastHeight = 0;\r\n        /**\r\n         * Reference to the last observed content rectangle.\r\n         *\r\n         * @private {DOMRectInit}\r\n         */\r\n        this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n        this.target = target;\r\n    }\r\n    /**\r\n     * Updates content rectangle and tells whether it's width or height properties\r\n     * have changed since the last broadcast.\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    ResizeObservation.prototype.isActive = function () {\r\n        var rect = getContentRect(this.target);\r\n        this.contentRect_ = rect;\r\n        return (rect.width !== this.broadcastWidth ||\r\n            rect.height !== this.broadcastHeight);\r\n    };\r\n    /**\r\n     * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n     * from the corresponding properties of the last observed content rectangle.\r\n     *\r\n     * @returns {DOMRectInit} Last observed content rectangle.\r\n     */\r\n    ResizeObservation.prototype.broadcastRect = function () {\r\n        var rect = this.contentRect_;\r\n        this.broadcastWidth = rect.width;\r\n        this.broadcastHeight = rect.height;\r\n        return rect;\r\n    };\r\n    return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n    /**\r\n     * Creates an instance of ResizeObserverEntry.\r\n     *\r\n     * @param {Element} target - Element that is being observed.\r\n     * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n     */\r\n    function ResizeObserverEntry(target, rectInit) {\r\n        var contentRect = createReadOnlyRect(rectInit);\r\n        // According to the specification following properties are not writable\r\n        // and are also not enumerable in the native implementation.\r\n        //\r\n        // Property accessors are not being used as they'd require to define a\r\n        // private WeakMap storage which may cause memory leaks in browsers that\r\n        // don't support this type of collections.\r\n        defineConfigurable(this, { target: target, contentRect: contentRect });\r\n    }\r\n    return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserver.\r\n     *\r\n     * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n     *      when one of the observed elements changes it's content dimensions.\r\n     * @param {ResizeObserverController} controller - Controller instance which\r\n     *      is responsible for the updates of observer.\r\n     * @param {ResizeObserver} callbackCtx - Reference to the public\r\n     *      ResizeObserver instance which will be passed to callback function.\r\n     */\r\n    function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n        /**\r\n         * Collection of resize observations that have detected changes in dimensions\r\n         * of elements.\r\n         *\r\n         * @private {Array<ResizeObservation>}\r\n         */\r\n        this.activeObservations_ = [];\r\n        /**\r\n         * Registry of the ResizeObservation instances.\r\n         *\r\n         * @private {Map<Element, ResizeObservation>}\r\n         */\r\n        this.observations_ = new MapShim();\r\n        if (typeof callback !== 'function') {\r\n            throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n        }\r\n        this.callback_ = callback;\r\n        this.controller_ = controller;\r\n        this.callbackCtx_ = callbackCtx;\r\n    }\r\n    /**\r\n     * Starts observing provided element.\r\n     *\r\n     * @param {Element} target - Element to be observed.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.observe = function (target) {\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        // Do nothing if current environment doesn't have the Element interface.\r\n        if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n            return;\r\n        }\r\n        if (!(target instanceof getWindowOf(target).Element)) {\r\n            throw new TypeError('parameter 1 is not of type \"Element\".');\r\n        }\r\n        var observations = this.observations_;\r\n        // Do nothing if element is already being observed.\r\n        if (observations.has(target)) {\r\n            return;\r\n        }\r\n        observations.set(target, new ResizeObservation(target));\r\n        this.controller_.addObserver(this);\r\n        // Force the update of observations.\r\n        this.controller_.refresh();\r\n    };\r\n    /**\r\n     * Stops observing provided element.\r\n     *\r\n     * @param {Element} target - Element to stop observing.\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.unobserve = function (target) {\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        // Do nothing if current environment doesn't have the Element interface.\r\n        if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n            return;\r\n        }\r\n        if (!(target instanceof getWindowOf(target).Element)) {\r\n            throw new TypeError('parameter 1 is not of type \"Element\".');\r\n        }\r\n        var observations = this.observations_;\r\n        // Do nothing if element is not being observed.\r\n        if (!observations.has(target)) {\r\n            return;\r\n        }\r\n        observations.delete(target);\r\n        if (!observations.size) {\r\n            this.controller_.removeObserver(this);\r\n        }\r\n    };\r\n    /**\r\n     * Stops observing all elements.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.disconnect = function () {\r\n        this.clearActive();\r\n        this.observations_.clear();\r\n        this.controller_.removeObserver(this);\r\n    };\r\n    /**\r\n     * Collects observation instances the associated element of which has changed\r\n     * it's content rectangle.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.gatherActive = function () {\r\n        var _this = this;\r\n        this.clearActive();\r\n        this.observations_.forEach(function (observation) {\r\n            if (observation.isActive()) {\r\n                _this.activeObservations_.push(observation);\r\n            }\r\n        });\r\n    };\r\n    /**\r\n     * Invokes initial callback function with a list of ResizeObserverEntry\r\n     * instances collected from active resize observations.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.broadcastActive = function () {\r\n        // Do nothing if observer doesn't have active observations.\r\n        if (!this.hasActive()) {\r\n            return;\r\n        }\r\n        var ctx = this.callbackCtx_;\r\n        // Create ResizeObserverEntry instance for every active observation.\r\n        var entries = this.activeObservations_.map(function (observation) {\r\n            return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n        });\r\n        this.callback_.call(ctx, entries, ctx);\r\n        this.clearActive();\r\n    };\r\n    /**\r\n     * Clears the collection of active observations.\r\n     *\r\n     * @returns {void}\r\n     */\r\n    ResizeObserverSPI.prototype.clearActive = function () {\r\n        this.activeObservations_.splice(0);\r\n    };\r\n    /**\r\n     * Tells whether observer has active observations.\r\n     *\r\n     * @returns {boolean}\r\n     */\r\n    ResizeObserverSPI.prototype.hasActive = function () {\r\n        return this.activeObservations_.length > 0;\r\n    };\r\n    return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n    /**\r\n     * Creates a new instance of ResizeObserver.\r\n     *\r\n     * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n     *      dimensions of the observed elements change.\r\n     */\r\n    function ResizeObserver(callback) {\r\n        if (!(this instanceof ResizeObserver)) {\r\n            throw new TypeError('Cannot call a class as a function.');\r\n        }\r\n        if (!arguments.length) {\r\n            throw new TypeError('1 argument required, but only 0 present.');\r\n        }\r\n        var controller = ResizeObserverController.getInstance();\r\n        var observer = new ResizeObserverSPI(callback, controller, this);\r\n        observers.set(this, observer);\r\n    }\r\n    return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n    'observe',\r\n    'unobserve',\r\n    'disconnect'\r\n].forEach(function (method) {\r\n    ResizeObserver.prototype[method] = function () {\r\n        var _a;\r\n        return (_a = observers.get(this))[method].apply(_a, arguments);\r\n    };\r\n});\n\nvar index = (function () {\r\n    // Export existing implementation if available.\r\n    if (typeof global$1.ResizeObserver !== 'undefined') {\r\n        return global$1.ResizeObserver;\r\n    }\r\n    return ResizeObserver;\r\n})();\n\nexport default index;\n","function isAbsolute(pathname) {\n  return pathname.charAt(0) === '/';\n}\n\n// About 1.5x faster than the two-arg version of Array#splice()\nfunction spliceOne(list, index) {\n  for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) {\n    list[i] = list[k];\n  }\n\n  list.pop();\n}\n\n// This implementation is based heavily on node's url.parse\nfunction resolvePathname(to, from) {\n  if (from === undefined) from = '';\n\n  var toParts = (to && to.split('/')) || [];\n  var fromParts = (from && from.split('/')) || [];\n\n  var isToAbs = to && isAbsolute(to);\n  var isFromAbs = from && isAbsolute(from);\n  var mustEndAbs = isToAbs || isFromAbs;\n\n  if (to && isAbsolute(to)) {\n    // to is absolute\n    fromParts = toParts;\n  } else if (toParts.length) {\n    // to is relative, drop the filename\n    fromParts.pop();\n    fromParts = fromParts.concat(toParts);\n  }\n\n  if (!fromParts.length) return '/';\n\n  var hasTrailingSlash;\n  if (fromParts.length) {\n    var last = fromParts[fromParts.length - 1];\n    hasTrailingSlash = last === '.' || last === '..' || last === '';\n  } else {\n    hasTrailingSlash = false;\n  }\n\n  var up = 0;\n  for (var i = fromParts.length; i >= 0; i--) {\n    var part = fromParts[i];\n\n    if (part === '.') {\n      spliceOne(fromParts, i);\n    } else if (part === '..') {\n      spliceOne(fromParts, i);\n      up++;\n    } else if (up) {\n      spliceOne(fromParts, i);\n      up--;\n    }\n  }\n\n  if (!mustEndAbs) for (; up--; up) fromParts.unshift('..');\n\n  if (\n    mustEndAbs &&\n    fromParts[0] !== '' &&\n    (!fromParts[0] || !isAbsolute(fromParts[0]))\n  )\n    fromParts.unshift('');\n\n  var result = fromParts.join('/');\n\n  if (hasTrailingSlash && result.substr(-1) !== '/') result += '/';\n\n  return result;\n}\n\nexport default resolvePathname;\n","import Stylis from 'stylis/stylis.min';\nimport _insertRulePlugin from 'stylis-rule-sheet';\nimport React, { cloneElement, createContext, Component, createElement } from 'react';\nimport unitless from '@emotion/unitless';\nimport { isElement, isValidElementType, ForwardRef } from 'react-is';\nimport memoize from 'memoize-one';\nimport PropTypes from 'prop-types';\nimport validAttr from '@emotion/is-prop-valid';\nimport merge from 'merge-anything';\n\n// \n\nvar interleave = (function (strings, interpolations) {\n  var result = [strings[0]];\n\n  for (var i = 0, len = interpolations.length; i < len; i += 1) {\n    result.push(interpolations[i], strings[i + 1]);\n  }\n\n  return result;\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n  var target = {};\n\n  for (var i in obj) {\n    if (keys.indexOf(i) >= 0) continue;\n    if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n    target[i] = obj[i];\n  }\n\n  return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n// \nvar isPlainObject = (function (x) {\n  return (typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'object' && x.constructor === Object;\n});\n\n// \nvar EMPTY_ARRAY = Object.freeze([]);\nvar EMPTY_OBJECT = Object.freeze({});\n\n// \nfunction isFunction(test) {\n  return typeof test === 'function';\n}\n\n// \n\nfunction getComponentName(target) {\n  return (process.env.NODE_ENV !== 'production' ? typeof target === 'string' && target : false) || target.displayName || target.name || 'Component';\n}\n\n// \nfunction isStatelessFunction(test) {\n  return typeof test === 'function' && !(test.prototype && test.prototype.isReactComponent);\n}\n\n// \nfunction isStyledComponent(target) {\n  return target && typeof target.styledComponentId === 'string';\n}\n\n// \n\nvar SC_ATTR = typeof process !== 'undefined' && (process.env.REACT_APP_SC_ATTR || process.env.SC_ATTR) || 'data-styled';\n\nvar SC_VERSION_ATTR = 'data-styled-version';\n\nvar SC_STREAM_ATTR = 'data-styled-streamed';\n\nvar IS_BROWSER = typeof window !== 'undefined' && 'HTMLElement' in window;\n\nvar DISABLE_SPEEDY = typeof SC_DISABLE_SPEEDY === 'boolean' && SC_DISABLE_SPEEDY || typeof process !== 'undefined' && (process.env.REACT_APP_SC_DISABLE_SPEEDY || process.env.SC_DISABLE_SPEEDY) || process.env.NODE_ENV !== 'production';\n\n// Shared empty execution context when generating static styles\nvar STATIC_EXECUTION_CONTEXT = {};\n\n// \n\n\n/**\n * Parse errors.md and turn it into a simple hash of code: message\n */\nvar ERRORS = process.env.NODE_ENV !== 'production' ? {\n  \"1\": \"Cannot create styled-component for component: %s.\\n\\n\",\n  \"2\": \"Can't collect styles once you've consumed a `ServerStyleSheet`'s styles! `ServerStyleSheet` is a one off instance for each server-side render cycle.\\n\\n- Are you trying to reuse it across renders?\\n- Are you accidentally calling collectStyles twice?\\n\\n\",\n  \"3\": \"Streaming SSR is only supported in a Node.js environment; Please do not try to call this method in the browser.\\n\\n\",\n  \"4\": \"The `StyleSheetManager` expects a valid target or sheet prop!\\n\\n- Does this error occur on the client and is your target falsy?\\n- Does this error occur on the server and is the sheet falsy?\\n\\n\",\n  \"5\": \"The clone method cannot be used on the client!\\n\\n- Are you running in a client-like environment on the server?\\n- Are you trying to run SSR on the client?\\n\\n\",\n  \"6\": \"Trying to insert a new style tag, but the given Node is unmounted!\\n\\n- Are you using a custom target that isn't mounted?\\n- Does your document not have a valid head element?\\n- Have you accidentally removed a style tag manually?\\n\\n\",\n  \"7\": \"ThemeProvider: Please return an object from your \\\"theme\\\" prop function, e.g.\\n\\n```js\\ntheme={() => ({})}\\n```\\n\\n\",\n  \"8\": \"ThemeProvider: Please make your \\\"theme\\\" prop an object.\\n\\n\",\n  \"9\": \"Missing document `<head>`\\n\\n\",\n  \"10\": \"Cannot find a StyleSheet instance. Usually this happens if there are multiple copies of styled-components loaded at once. Check out this issue for how to troubleshoot and fix the common cases where this situation can happen: https://github.com/styled-components/styled-components/issues/1941#issuecomment-417862021\\n\\n\",\n  \"11\": \"_This error was replaced with a dev-time warning, it will be deleted for v4 final._ [createGlobalStyle] received children which will not be rendered. Please use the component without passing children elements.\\n\\n\",\n  \"12\": \"It seems you are interpolating a keyframe declaration (%s) into an untagged string. This was supported in styled-components v3, but is not longer supported in v4 as keyframes are now injected on-demand. Please wrap your string in the css\\\\`\\\\` helper which ensures the styles are injected correctly. See https://www.styled-components.com/docs/api#css\\n\\n\",\n  \"13\": \"%s is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.\\n\"\n} : {};\n\n/**\n * super basic version of sprintf\n */\nfunction format() {\n  var a = arguments.length <= 0 ? undefined : arguments[0];\n  var b = [];\n\n  for (var c = 1, len = arguments.length; c < len; c += 1) {\n    b.push(arguments.length <= c ? undefined : arguments[c]);\n  }\n\n  b.forEach(function (d) {\n    a = a.replace(/%[a-z]/, d);\n  });\n\n  return a;\n}\n\n/**\n * Create an error file out of errors.md for development and a simple web link to the full errors\n * in production mode.\n */\n\nvar StyledComponentsError = function (_Error) {\n  inherits(StyledComponentsError, _Error);\n\n  function StyledComponentsError(code) {\n    classCallCheck(this, StyledComponentsError);\n\n    for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      interpolations[_key - 1] = arguments[_key];\n    }\n\n    if (process.env.NODE_ENV === 'production') {\n      var _this = possibleConstructorReturn(this, _Error.call(this, 'An error occurred. See https://github.com/styled-components/styled-components/blob/master/packages/styled-components/src/utils/errors.md#' + code + ' for more information.' + (interpolations.length > 0 ? ' Additional arguments: ' + interpolations.join(', ') : '')));\n    } else {\n      var _this = possibleConstructorReturn(this, _Error.call(this, format.apply(undefined, [ERRORS[code]].concat(interpolations)).trim()));\n    }\n    return possibleConstructorReturn(_this);\n  }\n\n  return StyledComponentsError;\n}(Error);\n\n// \nvar SC_COMPONENT_ID = /^[^\\S\\n]*?\\/\\* sc-component-id:\\s*(\\S+)\\s+\\*\\//gm;\n\nvar extractComps = (function (maybeCSS) {\n  var css = '' + (maybeCSS || ''); // Definitely a string, and a clone\n  var existingComponents = [];\n  css.replace(SC_COMPONENT_ID, function (match, componentId, matchIndex) {\n    existingComponents.push({ componentId: componentId, matchIndex: matchIndex });\n    return match;\n  });\n  return existingComponents.map(function (_ref, i) {\n    var componentId = _ref.componentId,\n        matchIndex = _ref.matchIndex;\n\n    var nextComp = existingComponents[i + 1];\n    var cssFromDOM = nextComp ? css.slice(matchIndex, nextComp.matchIndex) : css.slice(matchIndex);\n    return { componentId: componentId, cssFromDOM: cssFromDOM };\n  });\n});\n\n// \n\nvar COMMENT_REGEX = /^\\s*\\/\\/.*$/gm;\n\n// NOTE: This stylis instance is only used to split rules from SSR'd style tags\nvar stylisSplitter = new Stylis({\n  global: false,\n  cascade: true,\n  keyframe: false,\n  prefix: false,\n  compress: false,\n  semicolon: true\n});\n\nvar stylis = new Stylis({\n  global: false,\n  cascade: true,\n  keyframe: false,\n  prefix: true,\n  compress: false,\n  semicolon: false // NOTE: This means \"autocomplete missing semicolons\"\n});\n\n// Wrap `insertRulePlugin to build a list of rules,\n// and then make our own plugin to return the rules. This\n// makes it easier to hook into the existing SSR architecture\n\nvar parsingRules = [];\n\n// eslint-disable-next-line consistent-return\nvar returnRulesPlugin = function returnRulesPlugin(context) {\n  if (context === -2) {\n    var parsedRules = parsingRules;\n    parsingRules = [];\n    return parsedRules;\n  }\n};\n\nvar parseRulesPlugin = _insertRulePlugin(function (rule) {\n  parsingRules.push(rule);\n});\n\nvar _componentId = void 0;\nvar _selector = void 0;\nvar _selectorRegexp = void 0;\n\nvar selfReferenceReplacer = function selfReferenceReplacer(match, offset, string) {\n  if (\n  // the first self-ref is always untouched\n  offset > 0 &&\n  // there should be at least two self-refs to do a replacement (.b > .b)\n  string.slice(0, offset).indexOf(_selector) !== -1 &&\n  // no consecutive self refs (.b.b); that is a precedence boost and treated differently\n  string.slice(offset - _selector.length, offset) !== _selector) {\n    return '.' + _componentId;\n  }\n\n  return match;\n};\n\n/**\n * When writing a style like\n *\n * & + & {\n *   color: red;\n * }\n *\n * The second ampersand should be a reference to the static component class. stylis\n * has no knowledge of static class so we have to intelligently replace the base selector.\n */\nvar selfReferenceReplacementPlugin = function selfReferenceReplacementPlugin(context, _, selectors) {\n  if (context === 2 && selectors.length && selectors[0].lastIndexOf(_selector) > 0) {\n    // eslint-disable-next-line no-param-reassign\n    selectors[0] = selectors[0].replace(_selectorRegexp, selfReferenceReplacer);\n  }\n};\n\nstylis.use([selfReferenceReplacementPlugin, parseRulesPlugin, returnRulesPlugin]);\nstylisSplitter.use([parseRulesPlugin, returnRulesPlugin]);\n\nvar splitByRules = function splitByRules(css) {\n  return stylisSplitter('', css);\n};\n\nfunction stringifyRules(rules, selector, prefix) {\n  var componentId = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '&';\n\n  var flatCSS = rules.join('').replace(COMMENT_REGEX, ''); // replace JS comments\n\n  var cssStr = selector && prefix ? prefix + ' ' + selector + ' { ' + flatCSS + ' }' : flatCSS;\n\n  // stylis has no concept of state to be passed to plugins\n  // but since JS is single=threaded, we can rely on that to ensure\n  // these properties stay in sync with the current stylis run\n  _componentId = componentId;\n  _selector = selector;\n  _selectorRegexp = new RegExp('\\\\' + _selector + '\\\\b', 'g');\n\n  return stylis(prefix || !selector ? '' : selector, cssStr);\n}\n\n// \n/* eslint-disable camelcase, no-undef */\n\nvar getNonce = (function () {\n  return typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n});\n\n// \n/* These are helpers for the StyleTags to keep track of the injected\n * rule names for each (component) ID that they're keeping track of.\n * They're crucial for detecting whether a name has already been\n * injected.\n * (This excludes rehydrated names) */\n\n/* adds a new ID:name pairing to a names dictionary */\nvar addNameForId = function addNameForId(names, id, name) {\n  if (name) {\n    // eslint-disable-next-line no-param-reassign\n    var namesForId = names[id] || (names[id] = Object.create(null));\n    namesForId[name] = true;\n  }\n};\n\n/* resets an ID entirely by overwriting it in the dictionary */\nvar resetIdNames = function resetIdNames(names, id) {\n  // eslint-disable-next-line no-param-reassign\n  names[id] = Object.create(null);\n};\n\n/* factory for a names dictionary checking the existance of an ID:name pairing */\nvar hasNameForId = function hasNameForId(names) {\n  return function (id, name) {\n    return names[id] !== undefined && names[id][name];\n  };\n};\n\n/* stringifies names for the html/element output */\nvar stringifyNames = function stringifyNames(names) {\n  var str = '';\n  // eslint-disable-next-line guard-for-in\n  for (var id in names) {\n    str += Object.keys(names[id]).join(' ') + ' ';\n  }\n  return str.trim();\n};\n\n/* clones the nested names dictionary */\nvar cloneNames = function cloneNames(names) {\n  var clone = Object.create(null);\n  // eslint-disable-next-line guard-for-in\n  for (var id in names) {\n    clone[id] = _extends({}, names[id]);\n  }\n  return clone;\n};\n\n// \n\n/* These are helpers that deal with the insertRule (aka speedy) API\n * They are used in the StyleTags and specifically the speedy tag\n */\n\n/* retrieve a sheet for a given style tag */\nvar sheetForTag = function sheetForTag(tag) {\n  // $FlowFixMe\n  if (tag.sheet) return tag.sheet;\n\n  /* Firefox quirk requires us to step through all stylesheets to find one owned by the given tag */\n  var size = tag.ownerDocument.styleSheets.length;\n  for (var i = 0; i < size; i += 1) {\n    var sheet = tag.ownerDocument.styleSheets[i];\n    // $FlowFixMe\n    if (sheet.ownerNode === tag) return sheet;\n  }\n\n  /* we should always be able to find a tag */\n  throw new StyledComponentsError(10);\n};\n\n/* insert a rule safely and return whether it was actually injected */\nvar safeInsertRule = function safeInsertRule(sheet, cssRule, index) {\n  /* abort early if cssRule string is falsy */\n  if (!cssRule) return false;\n\n  var maxIndex = sheet.cssRules.length;\n\n  try {\n    /* use insertRule and cap passed index with maxIndex (no of cssRules) */\n    sheet.insertRule(cssRule, index <= maxIndex ? index : maxIndex);\n  } catch (err) {\n    /* any error indicates an invalid rule */\n    return false;\n  }\n\n  return true;\n};\n\n/* deletes `size` rules starting from `removalIndex` */\nvar deleteRules = function deleteRules(sheet, removalIndex, size) {\n  var lowerBound = removalIndex - size;\n  for (var i = removalIndex; i > lowerBound; i -= 1) {\n    sheet.deleteRule(i);\n  }\n};\n\n// \n\n/* this marker separates component styles and is important for rehydration */\nvar makeTextMarker = function makeTextMarker(id) {\n  return '\\n/* sc-component-id: ' + id + ' */\\n';\n};\n\n/* add up all numbers in array up until and including the index */\nvar addUpUntilIndex = function addUpUntilIndex(sizes, index) {\n  var totalUpToIndex = 0;\n  for (var i = 0; i <= index; i += 1) {\n    totalUpToIndex += sizes[i];\n  }\n\n  return totalUpToIndex;\n};\n\n/* create a new style tag after lastEl */\nvar makeStyleTag = function makeStyleTag(target, tagEl, insertBefore) {\n  var targetDocument = document;\n  if (target) targetDocument = target.ownerDocument;else if (tagEl) targetDocument = tagEl.ownerDocument;\n\n  var el = targetDocument.createElement('style');\n  el.setAttribute(SC_ATTR, '');\n  el.setAttribute(SC_VERSION_ATTR, \"4.4.1\");\n\n  var nonce = getNonce();\n  if (nonce) {\n    el.setAttribute('nonce', nonce);\n  }\n\n  /* Work around insertRule quirk in EdgeHTML */\n  el.appendChild(targetDocument.createTextNode(''));\n\n  if (target && !tagEl) {\n    /* Append to target when no previous element was passed */\n    target.appendChild(el);\n  } else {\n    if (!tagEl || !target || !tagEl.parentNode) {\n      throw new StyledComponentsError(6);\n    }\n\n    /* Insert new style tag after the previous one */\n    tagEl.parentNode.insertBefore(el, insertBefore ? tagEl : tagEl.nextSibling);\n  }\n\n  return el;\n};\n\n/* takes a css factory function and outputs an html styled tag factory */\nvar wrapAsHtmlTag = function wrapAsHtmlTag(css, names) {\n  return function (additionalAttrs) {\n    var nonce = getNonce();\n    var attrs = [nonce && 'nonce=\"' + nonce + '\"', SC_ATTR + '=\"' + stringifyNames(names) + '\"', SC_VERSION_ATTR + '=\"' + \"4.4.1\" + '\"', additionalAttrs];\n\n    var htmlAttr = attrs.filter(Boolean).join(' ');\n    return '<style ' + htmlAttr + '>' + css() + '</style>';\n  };\n};\n\n/* takes a css factory function and outputs an element factory */\nvar wrapAsElement = function wrapAsElement(css, names) {\n  return function () {\n    var _props;\n\n    var props = (_props = {}, _props[SC_ATTR] = stringifyNames(names), _props[SC_VERSION_ATTR] = \"4.4.1\", _props);\n\n    var nonce = getNonce();\n    if (nonce) {\n      // $FlowFixMe\n      props.nonce = nonce;\n    }\n\n    // eslint-disable-next-line react/no-danger\n    return React.createElement('style', _extends({}, props, { dangerouslySetInnerHTML: { __html: css() } }));\n  };\n};\n\nvar getIdsFromMarkersFactory = function getIdsFromMarkersFactory(markers) {\n  return function () {\n    return Object.keys(markers);\n  };\n};\n\n/* speedy tags utilise insertRule */\nvar makeSpeedyTag = function makeSpeedyTag(el, getImportRuleTag) {\n  var names = Object.create(null);\n  var markers = Object.create(null);\n  var sizes = [];\n\n  var extractImport = getImportRuleTag !== undefined;\n  /* indicates whether getImportRuleTag was called */\n  var usedImportRuleTag = false;\n\n  var insertMarker = function insertMarker(id) {\n    var prev = markers[id];\n    if (prev !== undefined) {\n      return prev;\n    }\n\n    markers[id] = sizes.length;\n    sizes.push(0);\n    resetIdNames(names, id);\n\n    return markers[id];\n  };\n\n  var insertRules = function insertRules(id, cssRules, name) {\n    var marker = insertMarker(id);\n    var sheet = sheetForTag(el);\n    var insertIndex = addUpUntilIndex(sizes, marker);\n\n    var injectedRules = 0;\n    var importRules = [];\n    var cssRulesSize = cssRules.length;\n\n    for (var i = 0; i < cssRulesSize; i += 1) {\n      var cssRule = cssRules[i];\n      var mayHaveImport = extractImport; /* @import rules are reordered to appear first */\n      if (mayHaveImport && cssRule.indexOf('@import') !== -1) {\n        importRules.push(cssRule);\n      } else if (safeInsertRule(sheet, cssRule, insertIndex + injectedRules)) {\n        mayHaveImport = false;\n        injectedRules += 1;\n      }\n    }\n\n    if (extractImport && importRules.length > 0) {\n      usedImportRuleTag = true;\n      // $FlowFixMe\n      getImportRuleTag().insertRules(id + '-import', importRules);\n    }\n\n    sizes[marker] += injectedRules; /* add up no of injected rules */\n    addNameForId(names, id, name);\n  };\n\n  var removeRules = function removeRules(id) {\n    var marker = markers[id];\n    if (marker === undefined) return;\n    // $FlowFixMe\n    if (el.isConnected === false) return;\n\n    var size = sizes[marker];\n    var sheet = sheetForTag(el);\n    var removalIndex = addUpUntilIndex(sizes, marker) - 1;\n    deleteRules(sheet, removalIndex, size);\n    sizes[marker] = 0;\n    resetIdNames(names, id);\n\n    if (extractImport && usedImportRuleTag) {\n      // $FlowFixMe\n      getImportRuleTag().removeRules(id + '-import');\n    }\n  };\n\n  var css = function css() {\n    var _sheetForTag = sheetForTag(el),\n        cssRules = _sheetForTag.cssRules;\n\n    var str = '';\n\n    // eslint-disable-next-line guard-for-in\n    for (var id in markers) {\n      str += makeTextMarker(id);\n      var marker = markers[id];\n      var end = addUpUntilIndex(sizes, marker);\n      var size = sizes[marker];\n      for (var i = end - size; i < end; i += 1) {\n        var rule = cssRules[i];\n        if (rule !== undefined) {\n          str += rule.cssText;\n        }\n      }\n    }\n\n    return str;\n  };\n\n  return {\n    clone: function clone() {\n      throw new StyledComponentsError(5);\n    },\n\n    css: css,\n    getIds: getIdsFromMarkersFactory(markers),\n    hasNameForId: hasNameForId(names),\n    insertMarker: insertMarker,\n    insertRules: insertRules,\n    removeRules: removeRules,\n    sealed: false,\n    styleTag: el,\n    toElement: wrapAsElement(css, names),\n    toHTML: wrapAsHtmlTag(css, names)\n  };\n};\n\nvar makeTextNode = function makeTextNode(targetDocument, id) {\n  return targetDocument.createTextNode(makeTextMarker(id));\n};\n\nvar makeBrowserTag = function makeBrowserTag(el, getImportRuleTag) {\n  var names = Object.create(null);\n  var markers = Object.create(null);\n\n  var extractImport = getImportRuleTag !== undefined;\n\n  /* indicates whether getImportRuleTag was called */\n  var usedImportRuleTag = false;\n\n  var insertMarker = function insertMarker(id) {\n    var prev = markers[id];\n    if (prev !== undefined) {\n      return prev;\n    }\n\n    markers[id] = makeTextNode(el.ownerDocument, id);\n    el.appendChild(markers[id]);\n    names[id] = Object.create(null);\n\n    return markers[id];\n  };\n\n  var insertRules = function insertRules(id, cssRules, name) {\n    var marker = insertMarker(id);\n    var importRules = [];\n    var cssRulesSize = cssRules.length;\n\n    for (var i = 0; i < cssRulesSize; i += 1) {\n      var rule = cssRules[i];\n      var mayHaveImport = extractImport;\n      if (mayHaveImport && rule.indexOf('@import') !== -1) {\n        importRules.push(rule);\n      } else {\n        mayHaveImport = false;\n        var separator = i === cssRulesSize - 1 ? '' : ' ';\n        marker.appendData('' + rule + separator);\n      }\n    }\n\n    addNameForId(names, id, name);\n\n    if (extractImport && importRules.length > 0) {\n      usedImportRuleTag = true;\n      // $FlowFixMe\n      getImportRuleTag().insertRules(id + '-import', importRules);\n    }\n  };\n\n  var removeRules = function removeRules(id) {\n    var marker = markers[id];\n    if (marker === undefined) return;\n\n    /* create new empty text node and replace the current one */\n    var newMarker = makeTextNode(el.ownerDocument, id);\n    el.replaceChild(newMarker, marker);\n    markers[id] = newMarker;\n    resetIdNames(names, id);\n\n    if (extractImport && usedImportRuleTag) {\n      // $FlowFixMe\n      getImportRuleTag().removeRules(id + '-import');\n    }\n  };\n\n  var css = function css() {\n    var str = '';\n\n    // eslint-disable-next-line guard-for-in\n    for (var id in markers) {\n      str += markers[id].data;\n    }\n\n    return str;\n  };\n\n  return {\n    clone: function clone() {\n      throw new StyledComponentsError(5);\n    },\n\n    css: css,\n    getIds: getIdsFromMarkersFactory(markers),\n    hasNameForId: hasNameForId(names),\n    insertMarker: insertMarker,\n    insertRules: insertRules,\n    removeRules: removeRules,\n    sealed: false,\n    styleTag: el,\n    toElement: wrapAsElement(css, names),\n    toHTML: wrapAsHtmlTag(css, names)\n  };\n};\n\nvar makeServerTag = function makeServerTag(namesArg, markersArg) {\n  var names = namesArg === undefined ? Object.create(null) : namesArg;\n  var markers = markersArg === undefined ? Object.create(null) : markersArg;\n\n  var insertMarker = function insertMarker(id) {\n    var prev = markers[id];\n    if (prev !== undefined) {\n      return prev;\n    }\n\n    return markers[id] = [''];\n  };\n\n  var insertRules = function insertRules(id, cssRules, name) {\n    var marker = insertMarker(id);\n    marker[0] += cssRules.join(' ');\n    addNameForId(names, id, name);\n  };\n\n  var removeRules = function removeRules(id) {\n    var marker = markers[id];\n    if (marker === undefined) return;\n    marker[0] = '';\n    resetIdNames(names, id);\n  };\n\n  var css = function css() {\n    var str = '';\n    // eslint-disable-next-line guard-for-in\n    for (var id in markers) {\n      var cssForId = markers[id][0];\n      if (cssForId) {\n        str += makeTextMarker(id) + cssForId;\n      }\n    }\n    return str;\n  };\n\n  var clone = function clone() {\n    var namesClone = cloneNames(names);\n    var markersClone = Object.create(null);\n\n    // eslint-disable-next-line guard-for-in\n    for (var id in markers) {\n      markersClone[id] = [markers[id][0]];\n    }\n\n    return makeServerTag(namesClone, markersClone);\n  };\n\n  var tag = {\n    clone: clone,\n    css: css,\n    getIds: getIdsFromMarkersFactory(markers),\n    hasNameForId: hasNameForId(names),\n    insertMarker: insertMarker,\n    insertRules: insertRules,\n    removeRules: removeRules,\n    sealed: false,\n    styleTag: null,\n    toElement: wrapAsElement(css, names),\n    toHTML: wrapAsHtmlTag(css, names)\n  };\n\n  return tag;\n};\n\nvar makeTag = function makeTag(target, tagEl, forceServer, insertBefore, getImportRuleTag) {\n  if (IS_BROWSER && !forceServer) {\n    var el = makeStyleTag(target, tagEl, insertBefore);\n\n    if (DISABLE_SPEEDY) {\n      return makeBrowserTag(el, getImportRuleTag);\n    } else {\n      return makeSpeedyTag(el, getImportRuleTag);\n    }\n  }\n\n  return makeServerTag();\n};\n\nvar rehydrate = function rehydrate(tag, els, extracted) {\n  /* add all extracted components to the new tag */\n  for (var i = 0, len = extracted.length; i < len; i += 1) {\n    var _extracted$i = extracted[i],\n        componentId = _extracted$i.componentId,\n        cssFromDOM = _extracted$i.cssFromDOM;\n\n    var cssRules = splitByRules(cssFromDOM);\n    tag.insertRules(componentId, cssRules);\n  }\n\n  /* remove old HTMLStyleElements, since they have been rehydrated */\n  for (var _i = 0, _len = els.length; _i < _len; _i += 1) {\n    var el = els[_i];\n    if (el.parentNode) {\n      el.parentNode.removeChild(el);\n    }\n  }\n};\n\n// \n\nvar SPLIT_REGEX = /\\s+/;\n\n/* determine the maximum number of components before tags are sharded */\nvar MAX_SIZE = void 0;\nif (IS_BROWSER) {\n  /* in speedy mode we can keep a lot more rules in a sheet before a slowdown can be expected */\n  MAX_SIZE = DISABLE_SPEEDY ? 40 : 1000;\n} else {\n  /* for servers we do not need to shard at all */\n  MAX_SIZE = -1;\n}\n\nvar sheetRunningId = 0;\nvar master = void 0;\n\nvar StyleSheet = function () {\n\n  /* a map from ids to tags */\n\n  /* deferred rules for a given id */\n\n  /* this is used for not reinjecting rules via hasNameForId() */\n\n  /* when rules for an id are removed using remove() we have to ignore rehydratedNames for it */\n\n  /* a list of tags belonging to this StyleSheet */\n\n  /* a tag for import rules */\n\n  /* current capacity until a new tag must be created */\n\n  /* children (aka clones) of this StyleSheet inheriting all and future injections */\n\n  function StyleSheet() {\n    var _this = this;\n\n    var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : IS_BROWSER ? document.head : null;\n    var forceServer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    classCallCheck(this, StyleSheet);\n\n    this.getImportRuleTag = function () {\n      var importRuleTag = _this.importRuleTag;\n\n      if (importRuleTag !== undefined) {\n        return importRuleTag;\n      }\n\n      var firstTag = _this.tags[0];\n      var insertBefore = true;\n\n      return _this.importRuleTag = makeTag(_this.target, firstTag ? firstTag.styleTag : null, _this.forceServer, insertBefore);\n    };\n\n    sheetRunningId += 1;\n    this.id = sheetRunningId;\n    this.forceServer = forceServer;\n    this.target = forceServer ? null : target;\n    this.tagMap = {};\n    this.deferred = {};\n    this.rehydratedNames = {};\n    this.ignoreRehydratedNames = {};\n    this.tags = [];\n    this.capacity = 1;\n    this.clones = [];\n  }\n\n  /* rehydrate all SSR'd style tags */\n\n\n  StyleSheet.prototype.rehydrate = function rehydrate$$1() {\n    if (!IS_BROWSER || this.forceServer) return this;\n\n    var els = [];\n    var extracted = [];\n    var isStreamed = false;\n\n    /* retrieve all of our SSR style elements from the DOM */\n    var nodes = document.querySelectorAll('style[' + SC_ATTR + '][' + SC_VERSION_ATTR + '=\"' + \"4.4.1\" + '\"]');\n\n    var nodesSize = nodes.length;\n\n    /* abort rehydration if no previous style tags were found */\n    if (!nodesSize) return this;\n\n    for (var i = 0; i < nodesSize; i += 1) {\n      var el = nodes[i];\n\n      /* check if style tag is a streamed tag */\n      if (!isStreamed) isStreamed = !!el.getAttribute(SC_STREAM_ATTR);\n\n      /* retrieve all component names */\n      var elNames = (el.getAttribute(SC_ATTR) || '').trim().split(SPLIT_REGEX);\n      var elNamesSize = elNames.length;\n      for (var j = 0, name; j < elNamesSize; j += 1) {\n        name = elNames[j];\n        /* add rehydrated name to sheet to avoid re-adding styles */\n        this.rehydratedNames[name] = true;\n      }\n\n      /* extract all components and their CSS */\n      extracted.push.apply(extracted, extractComps(el.textContent));\n\n      /* store original HTMLStyleElement */\n      els.push(el);\n    }\n\n    /* abort rehydration if nothing was extracted */\n    var extractedSize = extracted.length;\n    if (!extractedSize) return this;\n\n    /* create a tag to be used for rehydration */\n    var tag = this.makeTag(null);\n\n    rehydrate(tag, els, extracted);\n\n    /* reset capacity and adjust MAX_SIZE by the initial size of the rehydration */\n    this.capacity = Math.max(1, MAX_SIZE - extractedSize);\n    this.tags.push(tag);\n\n    /* retrieve all component ids */\n    for (var _j = 0; _j < extractedSize; _j += 1) {\n      this.tagMap[extracted[_j].componentId] = tag;\n    }\n\n    return this;\n  };\n\n  /* retrieve a \"master\" instance of StyleSheet which is typically used when no other is available\n   * The master StyleSheet is targeted by createGlobalStyle, keyframes, and components outside of any\n    * StyleSheetManager's context */\n\n\n  /* reset the internal \"master\" instance */\n  StyleSheet.reset = function reset() {\n    var forceServer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    master = new StyleSheet(undefined, forceServer).rehydrate();\n  };\n\n  /* adds \"children\" to the StyleSheet that inherit all of the parents' rules\n   * while their own rules do not affect the parent */\n\n\n  StyleSheet.prototype.clone = function clone() {\n    var sheet = new StyleSheet(this.target, this.forceServer);\n\n    /* add to clone array */\n    this.clones.push(sheet);\n\n    /* clone all tags */\n    sheet.tags = this.tags.map(function (tag) {\n      var ids = tag.getIds();\n      var newTag = tag.clone();\n\n      /* reconstruct tagMap */\n      for (var i = 0; i < ids.length; i += 1) {\n        sheet.tagMap[ids[i]] = newTag;\n      }\n\n      return newTag;\n    });\n\n    /* clone other maps */\n    sheet.rehydratedNames = _extends({}, this.rehydratedNames);\n    sheet.deferred = _extends({}, this.deferred);\n\n    return sheet;\n  };\n\n  /* force StyleSheet to create a new tag on the next injection */\n\n\n  StyleSheet.prototype.sealAllTags = function sealAllTags() {\n    this.capacity = 1;\n\n    this.tags.forEach(function (tag) {\n      // eslint-disable-next-line no-param-reassign\n      tag.sealed = true;\n    });\n  };\n\n  StyleSheet.prototype.makeTag = function makeTag$$1(tag) {\n    var lastEl = tag ? tag.styleTag : null;\n    var insertBefore = false;\n\n    return makeTag(this.target, lastEl, this.forceServer, insertBefore, this.getImportRuleTag);\n  };\n\n  /* get a tag for a given componentId, assign the componentId to one, or shard */\n  StyleSheet.prototype.getTagForId = function getTagForId(id) {\n    /* simply return a tag, when the componentId was already assigned one */\n    var prev = this.tagMap[id];\n    if (prev !== undefined && !prev.sealed) {\n      return prev;\n    }\n\n    var tag = this.tags[this.tags.length - 1];\n\n    /* shard (create a new tag) if the tag is exhausted (See MAX_SIZE) */\n    this.capacity -= 1;\n\n    if (this.capacity === 0) {\n      this.capacity = MAX_SIZE;\n      tag = this.makeTag(tag);\n      this.tags.push(tag);\n    }\n\n    return this.tagMap[id] = tag;\n  };\n\n  /* mainly for createGlobalStyle to check for its id */\n\n\n  StyleSheet.prototype.hasId = function hasId(id) {\n    return this.tagMap[id] !== undefined;\n  };\n\n  /* caching layer checking id+name to already have a corresponding tag and injected rules */\n\n\n  StyleSheet.prototype.hasNameForId = function hasNameForId(id, name) {\n    /* exception for rehydrated names which are checked separately */\n    if (this.ignoreRehydratedNames[id] === undefined && this.rehydratedNames[name]) {\n      return true;\n    }\n\n    var tag = this.tagMap[id];\n    return tag !== undefined && tag.hasNameForId(id, name);\n  };\n\n  /* registers a componentId and registers it on its tag */\n\n\n  StyleSheet.prototype.deferredInject = function deferredInject(id, cssRules) {\n    /* don't inject when the id is already registered */\n    if (this.tagMap[id] !== undefined) return;\n\n    var clones = this.clones;\n\n    for (var i = 0; i < clones.length; i += 1) {\n      clones[i].deferredInject(id, cssRules);\n    }\n\n    this.getTagForId(id).insertMarker(id);\n    this.deferred[id] = cssRules;\n  };\n\n  /* injects rules for a given id with a name that will need to be cached */\n\n\n  StyleSheet.prototype.inject = function inject(id, cssRules, name) {\n    var clones = this.clones;\n\n\n    for (var i = 0; i < clones.length; i += 1) {\n      clones[i].inject(id, cssRules, name);\n    }\n\n    var tag = this.getTagForId(id);\n\n    /* add deferred rules for component */\n    if (this.deferred[id] !== undefined) {\n      // Combine passed cssRules with previously deferred CSS rules\n      // NOTE: We cannot mutate the deferred array itself as all clones\n      // do the same (see clones[i].inject)\n      var rules = this.deferred[id].concat(cssRules);\n      tag.insertRules(id, rules, name);\n\n      this.deferred[id] = undefined;\n    } else {\n      tag.insertRules(id, cssRules, name);\n    }\n  };\n\n  /* removes all rules for a given id, which doesn't remove its marker but resets it */\n\n\n  StyleSheet.prototype.remove = function remove(id) {\n    var tag = this.tagMap[id];\n    if (tag === undefined) return;\n\n    var clones = this.clones;\n\n    for (var i = 0; i < clones.length; i += 1) {\n      clones[i].remove(id);\n    }\n\n    /* remove all rules from the tag */\n    tag.removeRules(id);\n\n    /* ignore possible rehydrated names */\n    this.ignoreRehydratedNames[id] = true;\n\n    /* delete possible deferred rules */\n    this.deferred[id] = undefined;\n  };\n\n  StyleSheet.prototype.toHTML = function toHTML() {\n    return this.tags.map(function (tag) {\n      return tag.toHTML();\n    }).join('');\n  };\n\n  StyleSheet.prototype.toReactElements = function toReactElements() {\n    var id = this.id;\n\n\n    return this.tags.map(function (tag, i) {\n      var key = 'sc-' + id + '-' + i;\n      return cloneElement(tag.toElement(), { key: key });\n    });\n  };\n\n  createClass(StyleSheet, null, [{\n    key: 'master',\n    get: function get$$1() {\n      return master || (master = new StyleSheet().rehydrate());\n    }\n\n    /* NOTE: This is just for backwards-compatibility with jest-styled-components */\n\n  }, {\n    key: 'instance',\n    get: function get$$1() {\n      return StyleSheet.master;\n    }\n  }]);\n  return StyleSheet;\n}();\n\n// \n\nvar Keyframes = function () {\n  function Keyframes(name, rules) {\n    var _this = this;\n\n    classCallCheck(this, Keyframes);\n\n    this.inject = function (styleSheet) {\n      if (!styleSheet.hasNameForId(_this.id, _this.name)) {\n        styleSheet.inject(_this.id, _this.rules, _this.name);\n      }\n    };\n\n    this.toString = function () {\n      throw new StyledComponentsError(12, String(_this.name));\n    };\n\n    this.name = name;\n    this.rules = rules;\n\n    this.id = 'sc-keyframes-' + name;\n  }\n\n  Keyframes.prototype.getName = function getName() {\n    return this.name;\n  };\n\n  return Keyframes;\n}();\n\n// \n\n/**\n * inlined version of\n * https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/hyphenateStyleName.js\n */\n\nvar uppercasePattern = /([A-Z])/g;\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n *   > hyphenateStyleName('backgroundColor')\n *   < \"background-color\"\n *   > hyphenateStyleName('MozTransition')\n *   < \"-moz-transition\"\n *   > hyphenateStyleName('msTransition')\n *   < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n  return string.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');\n}\n\n// \n\n// Taken from https://github.com/facebook/react/blob/b87aabdfe1b7461e7331abb3601d9e6bb27544bc/packages/react-dom/src/shared/dangerousStyleValue.js\nfunction addUnitIfNeeded(name, value) {\n  // https://github.com/amilajack/eslint-plugin-flowtype-errors/issues/133\n  // $FlowFixMe\n  if (value == null || typeof value === 'boolean' || value === '') {\n    return '';\n  }\n\n  if (typeof value === 'number' && value !== 0 && !(name in unitless)) {\n    return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n  }\n\n  return String(value).trim();\n}\n\n// \n\n/**\n * It's falsish not falsy because 0 is allowed.\n */\nvar isFalsish = function isFalsish(chunk) {\n  return chunk === undefined || chunk === null || chunk === false || chunk === '';\n};\n\nvar objToCssArray = function objToCssArray(obj, prevKey) {\n  var rules = [];\n  var keys = Object.keys(obj);\n\n  keys.forEach(function (key) {\n    if (!isFalsish(obj[key])) {\n      if (isPlainObject(obj[key])) {\n        rules.push.apply(rules, objToCssArray(obj[key], key));\n\n        return rules;\n      } else if (isFunction(obj[key])) {\n        rules.push(hyphenateStyleName(key) + ':', obj[key], ';');\n\n        return rules;\n      }\n      rules.push(hyphenateStyleName(key) + ': ' + addUnitIfNeeded(key, obj[key]) + ';');\n    }\n    return rules;\n  });\n\n  return prevKey ? [prevKey + ' {'].concat(rules, ['}']) : rules;\n};\n\nfunction flatten(chunk, executionContext, styleSheet) {\n  if (Array.isArray(chunk)) {\n    var ruleSet = [];\n\n    for (var i = 0, len = chunk.length, result; i < len; i += 1) {\n      result = flatten(chunk[i], executionContext, styleSheet);\n\n      if (result === null) continue;else if (Array.isArray(result)) ruleSet.push.apply(ruleSet, result);else ruleSet.push(result);\n    }\n\n    return ruleSet;\n  }\n\n  if (isFalsish(chunk)) {\n    return null;\n  }\n\n  /* Handle other components */\n  if (isStyledComponent(chunk)) {\n    return '.' + chunk.styledComponentId;\n  }\n\n  /* Either execute or defer the function */\n  if (isFunction(chunk)) {\n    if (isStatelessFunction(chunk) && executionContext) {\n      var _result = chunk(executionContext);\n\n      if (process.env.NODE_ENV !== 'production' && isElement(_result)) {\n        // eslint-disable-next-line no-console\n        console.warn(getComponentName(chunk) + ' is not a styled component and cannot be referred to via component selector. See https://www.styled-components.com/docs/advanced#referring-to-other-components for more details.');\n      }\n\n      return flatten(_result, executionContext, styleSheet);\n    } else return chunk;\n  }\n\n  if (chunk instanceof Keyframes) {\n    if (styleSheet) {\n      chunk.inject(styleSheet);\n      return chunk.getName();\n    } else return chunk;\n  }\n\n  /* Handle objects */\n  return isPlainObject(chunk) ? objToCssArray(chunk) : chunk.toString();\n}\n\n// \n\nfunction css(styles) {\n  for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    interpolations[_key - 1] = arguments[_key];\n  }\n\n  if (isFunction(styles) || isPlainObject(styles)) {\n    // $FlowFixMe\n    return flatten(interleave(EMPTY_ARRAY, [styles].concat(interpolations)));\n  }\n\n  // $FlowFixMe\n  return flatten(interleave(styles, interpolations));\n}\n\n// \n\nfunction constructWithOptions(componentConstructor, tag) {\n  var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n  if (!isValidElementType(tag)) {\n    throw new StyledComponentsError(1, String(tag));\n  }\n\n  /* This is callable directly as a template function */\n  // $FlowFixMe: Not typed to avoid destructuring arguments\n  var templateFunction = function templateFunction() {\n    return componentConstructor(tag, options, css.apply(undefined, arguments));\n  };\n\n  /* If config methods are called, wrap up a new template function and merge options */\n  templateFunction.withConfig = function (config) {\n    return constructWithOptions(componentConstructor, tag, _extends({}, options, config));\n  };\n\n  /* Modify/inject new props at runtime */\n  templateFunction.attrs = function (attrs) {\n    return constructWithOptions(componentConstructor, tag, _extends({}, options, {\n      attrs: Array.prototype.concat(options.attrs, attrs).filter(Boolean)\n    }));\n  };\n\n  return templateFunction;\n}\n\n// \n// Source: https://github.com/garycourt/murmurhash-js/blob/master/murmurhash2_gc.js\nfunction murmurhash(c) {\n  for (var e = c.length | 0, a = e | 0, d = 0, b; e >= 4;) {\n    b = c.charCodeAt(d) & 255 | (c.charCodeAt(++d) & 255) << 8 | (c.charCodeAt(++d) & 255) << 16 | (c.charCodeAt(++d) & 255) << 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), b ^= b >>> 24, b = 1540483477 * (b & 65535) + ((1540483477 * (b >>> 16) & 65535) << 16), a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16) ^ b, e -= 4, ++d;\n  }\n  switch (e) {\n    case 3:\n      a ^= (c.charCodeAt(d + 2) & 255) << 16;\n    case 2:\n      a ^= (c.charCodeAt(d + 1) & 255) << 8;\n    case 1:\n      a ^= c.charCodeAt(d) & 255, a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n  }\n  a ^= a >>> 13;\n  a = 1540483477 * (a & 65535) + ((1540483477 * (a >>> 16) & 65535) << 16);\n  return (a ^ a >>> 15) >>> 0;\n}\n\n// \n/* eslint-disable no-bitwise */\n\n/* This is the \"capacity\" of our alphabet i.e. 2x26 for all letters plus their capitalised\n * counterparts */\nvar charsLength = 52;\n\n/* start at 75 for 'a' until 'z' (25) and then start at 65 for capitalised letters */\nvar getAlphabeticChar = function getAlphabeticChar(code) {\n  return String.fromCharCode(code + (code > 25 ? 39 : 97));\n};\n\n/* input a number, usually a hash and convert it to base-52 */\nfunction generateAlphabeticName(code) {\n  var name = '';\n  var x = void 0;\n\n  /* get a char and divide by alphabet-length */\n  for (x = code; x > charsLength; x = Math.floor(x / charsLength)) {\n    name = getAlphabeticChar(x % charsLength) + name;\n  }\n\n  return getAlphabeticChar(x % charsLength) + name;\n}\n\n// \n\nfunction hasFunctionObjectKey(obj) {\n  // eslint-disable-next-line guard-for-in, no-restricted-syntax\n  for (var key in obj) {\n    if (isFunction(obj[key])) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction isStaticRules(rules, attrs) {\n  for (var i = 0; i < rules.length; i += 1) {\n    var rule = rules[i];\n\n    // recursive case\n    if (Array.isArray(rule) && !isStaticRules(rule, attrs)) {\n      return false;\n    } else if (isFunction(rule) && !isStyledComponent(rule)) {\n      // functions are allowed to be static if they're just being\n      // used to get the classname of a nested styled component\n      return false;\n    }\n  }\n\n  if (attrs.some(function (x) {\n    return isFunction(x) || hasFunctionObjectKey(x);\n  })) return false;\n\n  return true;\n}\n\n// \n\n/* combines hashStr (murmurhash) and nameGenerator for convenience */\nvar hasher = function hasher(str) {\n  return generateAlphabeticName(murmurhash(str));\n};\n\n/*\n ComponentStyle is all the CSS-specific stuff, not\n the React-specific stuff.\n */\n\nvar ComponentStyle = function () {\n  function ComponentStyle(rules, attrs, componentId) {\n    classCallCheck(this, ComponentStyle);\n\n    this.rules = rules;\n    this.isStatic = process.env.NODE_ENV === 'production' && isStaticRules(rules, attrs);\n    this.componentId = componentId;\n\n    if (!StyleSheet.master.hasId(componentId)) {\n      StyleSheet.master.deferredInject(componentId, []);\n    }\n  }\n\n  /*\n   * Flattens a rule set into valid CSS\n   * Hashes it, wraps the whole chunk in a .hash1234 {}\n   * Returns the hash to be injected on render()\n   * */\n\n\n  ComponentStyle.prototype.generateAndInjectStyles = function generateAndInjectStyles(executionContext, styleSheet) {\n    var isStatic = this.isStatic,\n        componentId = this.componentId,\n        lastClassName = this.lastClassName;\n\n    if (IS_BROWSER && isStatic && typeof lastClassName === 'string' && styleSheet.hasNameForId(componentId, lastClassName)) {\n      return lastClassName;\n    }\n\n    var flatCSS = flatten(this.rules, executionContext, styleSheet);\n    var name = hasher(this.componentId + flatCSS.join(''));\n    if (!styleSheet.hasNameForId(componentId, name)) {\n      styleSheet.inject(this.componentId, stringifyRules(flatCSS, '.' + name, undefined, componentId), name);\n    }\n\n    this.lastClassName = name;\n    return name;\n  };\n\n  ComponentStyle.generateName = function generateName(str) {\n    return hasher(str);\n  };\n\n  return ComponentStyle;\n}();\n\n// \n\nvar LIMIT = 200;\n\nvar createWarnTooManyClasses = (function (displayName) {\n  var generatedClasses = {};\n  var warningSeen = false;\n\n  return function (className) {\n    if (!warningSeen) {\n      generatedClasses[className] = true;\n      if (Object.keys(generatedClasses).length >= LIMIT) {\n        // Unable to find latestRule in test environment.\n        /* eslint-disable no-console, prefer-template */\n        console.warn('Over ' + LIMIT + ' classes were generated for component ' + displayName + '. \\n' + 'Consider using the attrs method, together with a style object for frequently changed styles.\\n' + 'Example:\\n' + '  const Component = styled.div.attrs(props => ({\\n' + '    style: {\\n' + '      background: props.background,\\n' + '    },\\n' + '  }))`width: 100%;`\\n\\n' + '  <Component />');\n        warningSeen = true;\n        generatedClasses = {};\n      }\n    }\n  };\n});\n\n// \n\nvar determineTheme = (function (props, fallbackTheme) {\n  var defaultProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EMPTY_OBJECT;\n\n  // Props should take precedence over ThemeProvider, which should take precedence over\n  // defaultProps, but React automatically puts defaultProps on props.\n\n  /* eslint-disable react/prop-types, flowtype-errors/show-errors */\n  var isDefaultTheme = defaultProps ? props.theme === defaultProps.theme : false;\n  var theme = props.theme && !isDefaultTheme ? props.theme : fallbackTheme || defaultProps.theme;\n  /* eslint-enable */\n\n  return theme;\n});\n\n// \nvar escapeRegex = /[[\\].#*$><+~=|^:(),\"'`-]+/g;\nvar dashesAtEnds = /(^-|-$)/g;\n\n/**\n * TODO: Explore using CSS.escape when it becomes more available\n * in evergreen browsers.\n */\nfunction escape(str) {\n  return str\n  // Replace all possible CSS selectors\n  .replace(escapeRegex, '-')\n\n  // Remove extraneous hyphens at the start and end\n  .replace(dashesAtEnds, '');\n}\n\n// \n\nfunction isTag(target) {\n  return typeof target === 'string' && (process.env.NODE_ENV !== 'production' ? target.charAt(0) === target.charAt(0).toLowerCase() : true);\n}\n\n// \n\nfunction generateDisplayName(target) {\n  // $FlowFixMe\n  return isTag(target) ? 'styled.' + target : 'Styled(' + getComponentName(target) + ')';\n}\n\nvar _TYPE_STATICS;\n\nvar REACT_STATICS = {\n  childContextTypes: true,\n  contextTypes: true,\n  defaultProps: true,\n  displayName: true,\n  getDerivedStateFromProps: true,\n  propTypes: true,\n  type: true\n};\n\nvar KNOWN_STATICS = {\n  name: true,\n  length: true,\n  prototype: true,\n  caller: true,\n  callee: true,\n  arguments: true,\n  arity: true\n};\n\nvar TYPE_STATICS = (_TYPE_STATICS = {}, _TYPE_STATICS[ForwardRef] = {\n  $$typeof: true,\n  render: true\n}, _TYPE_STATICS);\n\nvar defineProperty$1 = Object.defineProperty,\n    getOwnPropertyNames = Object.getOwnPropertyNames,\n    _Object$getOwnPropert = Object.getOwnPropertySymbols,\n    getOwnPropertySymbols = _Object$getOwnPropert === undefined ? function () {\n  return [];\n} : _Object$getOwnPropert,\n    getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor,\n    getPrototypeOf = Object.getPrototypeOf,\n    objectPrototype = Object.prototype;\nvar arrayPrototype = Array.prototype;\n\n\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n  if (typeof sourceComponent !== 'string') {\n    // don't hoist over string (html) components\n\n    var inheritedComponent = getPrototypeOf(sourceComponent);\n\n    if (inheritedComponent && inheritedComponent !== objectPrototype) {\n      hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n    }\n\n    var keys = arrayPrototype.concat(getOwnPropertyNames(sourceComponent),\n    // $FlowFixMe\n    getOwnPropertySymbols(sourceComponent));\n\n    var targetStatics = TYPE_STATICS[targetComponent.$$typeof] || REACT_STATICS;\n\n    var sourceStatics = TYPE_STATICS[sourceComponent.$$typeof] || REACT_STATICS;\n\n    var i = keys.length;\n    var descriptor = void 0;\n    var key = void 0;\n\n    // eslint-disable-next-line no-plusplus\n    while (i--) {\n      key = keys[i];\n\n      if (\n      // $FlowFixMe\n      !KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) &&\n      // $FlowFixMe\n      !(targetStatics && targetStatics[key])) {\n        descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n        if (descriptor) {\n          try {\n            // Avoid failures from read-only properties\n            defineProperty$1(targetComponent, key, descriptor);\n          } catch (e) {\n            /* fail silently */\n          }\n        }\n      }\n    }\n\n    return targetComponent;\n  }\n\n  return targetComponent;\n}\n\n// \nfunction isDerivedReactComponent(fn) {\n  return !!(fn && fn.prototype && fn.prototype.isReactComponent);\n}\n\n// \n// Helper to call a given function, only once\nvar once = (function (cb) {\n  var called = false;\n\n  return function () {\n    if (!called) {\n      called = true;\n      cb.apply(undefined, arguments);\n    }\n  };\n});\n\n// \n\nvar ThemeContext = createContext();\n\nvar ThemeConsumer = ThemeContext.Consumer;\n\n/**\n * Provide a theme to an entire react component tree via context\n */\n\nvar ThemeProvider = function (_Component) {\n  inherits(ThemeProvider, _Component);\n\n  function ThemeProvider(props) {\n    classCallCheck(this, ThemeProvider);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n    _this.getContext = memoize(_this.getContext.bind(_this));\n    _this.renderInner = _this.renderInner.bind(_this);\n    return _this;\n  }\n\n  ThemeProvider.prototype.render = function render() {\n    if (!this.props.children) return null;\n\n    return React.createElement(\n      ThemeContext.Consumer,\n      null,\n      this.renderInner\n    );\n  };\n\n  ThemeProvider.prototype.renderInner = function renderInner(outerTheme) {\n    var context = this.getContext(this.props.theme, outerTheme);\n\n    return React.createElement(\n      ThemeContext.Provider,\n      { value: context },\n      this.props.children\n    );\n  };\n\n  /**\n   * Get the theme from the props, supporting both (outerTheme) => {}\n   * as well as object notation\n   */\n\n\n  ThemeProvider.prototype.getTheme = function getTheme(theme, outerTheme) {\n    if (isFunction(theme)) {\n      var mergedTheme = theme(outerTheme);\n\n      if (process.env.NODE_ENV !== 'production' && (mergedTheme === null || Array.isArray(mergedTheme) || (typeof mergedTheme === 'undefined' ? 'undefined' : _typeof(mergedTheme)) !== 'object')) {\n        throw new StyledComponentsError(7);\n      }\n\n      return mergedTheme;\n    }\n\n    if (theme === null || Array.isArray(theme) || (typeof theme === 'undefined' ? 'undefined' : _typeof(theme)) !== 'object') {\n      throw new StyledComponentsError(8);\n    }\n\n    return _extends({}, outerTheme, theme);\n  };\n\n  ThemeProvider.prototype.getContext = function getContext(theme, outerTheme) {\n    return this.getTheme(theme, outerTheme);\n  };\n\n  return ThemeProvider;\n}(Component);\n\n// \n\nvar CLOSING_TAG_R = /^\\s*<\\/[a-z]/i;\n\nvar ServerStyleSheet = function () {\n  function ServerStyleSheet() {\n    classCallCheck(this, ServerStyleSheet);\n\n    /* The master sheet might be reset, so keep a reference here */\n    this.masterSheet = StyleSheet.master;\n    this.instance = this.masterSheet.clone();\n    this.sealed = false;\n  }\n\n  /**\n   * Mark the ServerStyleSheet as being fully emitted and manually GC it from the\n   * StyleSheet singleton.\n   */\n\n\n  ServerStyleSheet.prototype.seal = function seal() {\n    if (!this.sealed) {\n      /* Remove sealed StyleSheets from the master sheet */\n      var index = this.masterSheet.clones.indexOf(this.instance);\n      this.masterSheet.clones.splice(index, 1);\n      this.sealed = true;\n    }\n  };\n\n  ServerStyleSheet.prototype.collectStyles = function collectStyles(children) {\n    if (this.sealed) {\n      throw new StyledComponentsError(2);\n    }\n\n    return React.createElement(\n      StyleSheetManager,\n      { sheet: this.instance },\n      children\n    );\n  };\n\n  ServerStyleSheet.prototype.getStyleTags = function getStyleTags() {\n    this.seal();\n    return this.instance.toHTML();\n  };\n\n  ServerStyleSheet.prototype.getStyleElement = function getStyleElement() {\n    this.seal();\n    return this.instance.toReactElements();\n  };\n\n  ServerStyleSheet.prototype.interleaveWithNodeStream = function interleaveWithNodeStream(readableStream) {\n    var _this = this;\n\n    {\n      throw new StyledComponentsError(3);\n    }\n\n    /* the tag index keeps track of which tags have already been emitted */\n    var instance = this.instance;\n\n    var instanceTagIndex = 0;\n\n    var streamAttr = SC_STREAM_ATTR + '=\"true\"';\n\n    var transformer = new stream.Transform({\n      transform: function appendStyleChunks(chunk, /* encoding */_, callback) {\n        var tags = instance.tags;\n\n        var html = '';\n\n        /* retrieve html for each new style tag */\n        for (; instanceTagIndex < tags.length; instanceTagIndex += 1) {\n          var tag = tags[instanceTagIndex];\n          html += tag.toHTML(streamAttr);\n        }\n\n        /* force our StyleSheets to emit entirely new tags */\n        instance.sealAllTags();\n\n        var renderedHtml = chunk.toString();\n\n        /* prepend style html to chunk, unless the start of the chunk is a closing tag in which case append right after that */\n        if (CLOSING_TAG_R.test(renderedHtml)) {\n          var endOfClosingTag = renderedHtml.indexOf('>');\n\n          this.push(renderedHtml.slice(0, endOfClosingTag + 1) + html + renderedHtml.slice(endOfClosingTag + 1));\n        } else this.push(html + renderedHtml);\n\n        callback();\n      }\n    });\n\n    readableStream.on('end', function () {\n      return _this.seal();\n    });\n\n    readableStream.on('error', function (err) {\n      _this.seal();\n\n      // forward the error to the transform stream\n      transformer.emit('error', err);\n    });\n\n    return readableStream.pipe(transformer);\n  };\n\n  return ServerStyleSheet;\n}();\n\n// \n\nvar StyleSheetContext = createContext();\nvar StyleSheetConsumer = StyleSheetContext.Consumer;\n\nvar StyleSheetManager = function (_Component) {\n  inherits(StyleSheetManager, _Component);\n\n  function StyleSheetManager(props) {\n    classCallCheck(this, StyleSheetManager);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this, props));\n\n    _this.getContext = memoize(_this.getContext);\n    return _this;\n  }\n\n  StyleSheetManager.prototype.getContext = function getContext(sheet, target) {\n    if (sheet) {\n      return sheet;\n    } else if (target) {\n      return new StyleSheet(target);\n    } else {\n      throw new StyledComponentsError(4);\n    }\n  };\n\n  StyleSheetManager.prototype.render = function render() {\n    var _props = this.props,\n        children = _props.children,\n        sheet = _props.sheet,\n        target = _props.target;\n\n\n    return React.createElement(\n      StyleSheetContext.Provider,\n      { value: this.getContext(sheet, target) },\n      process.env.NODE_ENV !== 'production' ? React.Children.only(children) : children\n    );\n  };\n\n  return StyleSheetManager;\n}(Component);\nprocess.env.NODE_ENV !== \"production\" ? StyleSheetManager.propTypes = {\n  sheet: PropTypes.oneOfType([PropTypes.instanceOf(StyleSheet), PropTypes.instanceOf(ServerStyleSheet)]),\n\n  target: PropTypes.shape({\n    appendChild: PropTypes.func.isRequired\n  })\n} : void 0;\n\n// \n\nvar identifiers = {};\n\n/* We depend on components having unique IDs */\nfunction generateId(_ComponentStyle, _displayName, parentComponentId) {\n  var displayName = typeof _displayName !== 'string' ? 'sc' : escape(_displayName);\n\n  /**\n   * This ensures uniqueness if two components happen to share\n   * the same displayName.\n   */\n  var nr = (identifiers[displayName] || 0) + 1;\n  identifiers[displayName] = nr;\n\n  var componentId = displayName + '-' + _ComponentStyle.generateName(displayName + nr);\n\n  return parentComponentId ? parentComponentId + '-' + componentId : componentId;\n}\n\n// $FlowFixMe\n\nvar StyledComponent = function (_Component) {\n  inherits(StyledComponent, _Component);\n\n  function StyledComponent() {\n    classCallCheck(this, StyledComponent);\n\n    var _this = possibleConstructorReturn(this, _Component.call(this));\n\n    _this.attrs = {};\n\n    _this.renderOuter = _this.renderOuter.bind(_this);\n    _this.renderInner = _this.renderInner.bind(_this);\n\n    if (process.env.NODE_ENV !== 'production') {\n      _this.warnInnerRef = once(function (displayName) {\n        return (\n          // eslint-disable-next-line no-console\n          console.warn('The \"innerRef\" API has been removed in styled-components v4 in favor of React 16 ref forwarding, use \"ref\" instead like a typical component. \"innerRef\" was detected on component \"' + displayName + '\".')\n        );\n      });\n\n      _this.warnAttrsFnObjectKeyDeprecated = once(function (key, displayName) {\n        return (\n          // eslint-disable-next-line no-console\n          console.warn('Functions as object-form attrs({}) keys are now deprecated and will be removed in a future version of styled-components. Switch to the new attrs(props => ({})) syntax instead for easier and more powerful composition. The attrs key in question is \"' + key + '\" on component \"' + displayName + '\".', '\\n ' + new Error().stack)\n        );\n      });\n\n      _this.warnNonStyledComponentAttrsObjectKey = once(function (key, displayName) {\n        return (\n          // eslint-disable-next-line no-console\n          console.warn('It looks like you\\'ve used a non styled-component as the value for the \"' + key + '\" prop in an object-form attrs constructor of \"' + displayName + '\".\\n' + 'You should use the new function-form attrs constructor which avoids this issue: attrs(props => ({ yourStuff }))\\n' + \"To continue using the deprecated object syntax, you'll need to wrap your component prop in a function to make it available inside the styled component (you'll still get the deprecation warning though.)\\n\" + ('For example, { ' + key + ': () => InnerComponent } instead of { ' + key + ': InnerComponent }'))\n        );\n      });\n    }\n    return _this;\n  }\n\n  StyledComponent.prototype.render = function render() {\n    return React.createElement(\n      StyleSheetConsumer,\n      null,\n      this.renderOuter\n    );\n  };\n\n  StyledComponent.prototype.renderOuter = function renderOuter() {\n    var styleSheet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : StyleSheet.master;\n\n    this.styleSheet = styleSheet;\n\n    // No need to subscribe a static component to theme changes, it won't change anything\n    if (this.props.forwardedComponent.componentStyle.isStatic) return this.renderInner();\n\n    return React.createElement(\n      ThemeConsumer,\n      null,\n      this.renderInner\n    );\n  };\n\n  StyledComponent.prototype.renderInner = function renderInner(theme) {\n    var _props$forwardedCompo = this.props.forwardedComponent,\n        componentStyle = _props$forwardedCompo.componentStyle,\n        defaultProps = _props$forwardedCompo.defaultProps,\n        displayName = _props$forwardedCompo.displayName,\n        foldedComponentIds = _props$forwardedCompo.foldedComponentIds,\n        styledComponentId = _props$forwardedCompo.styledComponentId,\n        target = _props$forwardedCompo.target;\n\n\n    var generatedClassName = void 0;\n    if (componentStyle.isStatic) {\n      generatedClassName = this.generateAndInjectStyles(EMPTY_OBJECT, this.props);\n    } else {\n      generatedClassName = this.generateAndInjectStyles(determineTheme(this.props, theme, defaultProps) || EMPTY_OBJECT, this.props);\n    }\n\n    var elementToBeCreated = this.props.as || this.attrs.as || target;\n    var isTargetTag = isTag(elementToBeCreated);\n\n    var propsForElement = {};\n    var computedProps = _extends({}, this.props, this.attrs);\n\n    var key = void 0;\n    // eslint-disable-next-line guard-for-in\n    for (key in computedProps) {\n      if (process.env.NODE_ENV !== 'production' && key === 'innerRef' && isTargetTag) {\n        this.warnInnerRef(displayName);\n      }\n\n      if (key === 'forwardedComponent' || key === 'as') {\n        continue;\n      } else if (key === 'forwardedRef') propsForElement.ref = computedProps[key];else if (key === 'forwardedAs') propsForElement.as = computedProps[key];else if (!isTargetTag || validAttr(key)) {\n        // Don't pass through non HTML tags through to HTML elements\n        propsForElement[key] = computedProps[key];\n      }\n    }\n\n    if (this.props.style && this.attrs.style) {\n      propsForElement.style = _extends({}, this.attrs.style, this.props.style);\n    }\n\n    propsForElement.className = Array.prototype.concat(foldedComponentIds, styledComponentId, generatedClassName !== styledComponentId ? generatedClassName : null, this.props.className, this.attrs.className).filter(Boolean).join(' ');\n\n    return createElement(elementToBeCreated, propsForElement);\n  };\n\n  StyledComponent.prototype.buildExecutionContext = function buildExecutionContext(theme, props, attrs) {\n    var _this2 = this;\n\n    var context = _extends({}, props, { theme: theme });\n\n    if (!attrs.length) return context;\n\n    this.attrs = {};\n\n    attrs.forEach(function (attrDef) {\n      var resolvedAttrDef = attrDef;\n      var attrDefWasFn = false;\n      var attr = void 0;\n      var key = void 0;\n\n      if (isFunction(resolvedAttrDef)) {\n        // $FlowFixMe\n        resolvedAttrDef = resolvedAttrDef(context);\n        attrDefWasFn = true;\n      }\n\n      /* eslint-disable guard-for-in */\n      // $FlowFixMe\n      for (key in resolvedAttrDef) {\n        attr = resolvedAttrDef[key];\n\n        if (!attrDefWasFn) {\n          if (isFunction(attr) && !isDerivedReactComponent(attr) && !isStyledComponent(attr)) {\n            if (process.env.NODE_ENV !== 'production') {\n              _this2.warnAttrsFnObjectKeyDeprecated(key, props.forwardedComponent.displayName);\n            }\n\n            attr = attr(context);\n\n            if (process.env.NODE_ENV !== 'production' && React.isValidElement(attr)) {\n              _this2.warnNonStyledComponentAttrsObjectKey(key, props.forwardedComponent.displayName);\n            }\n          }\n        }\n\n        _this2.attrs[key] = attr;\n        context[key] = attr;\n      }\n      /* eslint-enable */\n    });\n\n    return context;\n  };\n\n  StyledComponent.prototype.generateAndInjectStyles = function generateAndInjectStyles(theme, props) {\n    var _props$forwardedCompo2 = props.forwardedComponent,\n        attrs = _props$forwardedCompo2.attrs,\n        componentStyle = _props$forwardedCompo2.componentStyle,\n        warnTooManyClasses = _props$forwardedCompo2.warnTooManyClasses;\n\n    // statically styled-components don't need to build an execution context object,\n    // and shouldn't be increasing the number of class names\n\n    if (componentStyle.isStatic && !attrs.length) {\n      return componentStyle.generateAndInjectStyles(EMPTY_OBJECT, this.styleSheet);\n    }\n\n    var className = componentStyle.generateAndInjectStyles(this.buildExecutionContext(theme, props, attrs), this.styleSheet);\n\n    if (process.env.NODE_ENV !== 'production' && warnTooManyClasses) warnTooManyClasses(className);\n\n    return className;\n  };\n\n  return StyledComponent;\n}(Component);\n\nfunction createStyledComponent(target, options, rules) {\n  var isTargetStyledComp = isStyledComponent(target);\n  var isClass = !isTag(target);\n\n  var _options$displayName = options.displayName,\n      displayName = _options$displayName === undefined ? generateDisplayName(target) : _options$displayName,\n      _options$componentId = options.componentId,\n      componentId = _options$componentId === undefined ? generateId(ComponentStyle, options.displayName, options.parentComponentId) : _options$componentId,\n      _options$ParentCompon = options.ParentComponent,\n      ParentComponent = _options$ParentCompon === undefined ? StyledComponent : _options$ParentCompon,\n      _options$attrs = options.attrs,\n      attrs = _options$attrs === undefined ? EMPTY_ARRAY : _options$attrs;\n\n\n  var styledComponentId = options.displayName && options.componentId ? escape(options.displayName) + '-' + options.componentId : options.componentId || componentId;\n\n  // fold the underlying StyledComponent attrs up (implicit extend)\n  var finalAttrs =\n  // $FlowFixMe\n  isTargetStyledComp && target.attrs ? Array.prototype.concat(target.attrs, attrs).filter(Boolean) : attrs;\n\n  var componentStyle = new ComponentStyle(isTargetStyledComp ? // fold the underlying StyledComponent rules up (implicit extend)\n  // $FlowFixMe\n  target.componentStyle.rules.concat(rules) : rules, finalAttrs, styledComponentId);\n\n  /**\n   * forwardRef creates a new interim component, which we'll take advantage of\n   * instead of extending ParentComponent to create _another_ interim class\n   */\n  var WrappedStyledComponent = void 0;\n  var forwardRef = function forwardRef(props, ref) {\n    return React.createElement(ParentComponent, _extends({}, props, { forwardedComponent: WrappedStyledComponent, forwardedRef: ref }));\n  };\n  forwardRef.displayName = displayName;\n  WrappedStyledComponent = React.forwardRef(forwardRef);\n  WrappedStyledComponent.displayName = displayName;\n\n  // $FlowFixMe\n  WrappedStyledComponent.attrs = finalAttrs;\n  // $FlowFixMe\n  WrappedStyledComponent.componentStyle = componentStyle;\n\n  // $FlowFixMe\n  WrappedStyledComponent.foldedComponentIds = isTargetStyledComp ? // $FlowFixMe\n  Array.prototype.concat(target.foldedComponentIds, target.styledComponentId) : EMPTY_ARRAY;\n\n  // $FlowFixMe\n  WrappedStyledComponent.styledComponentId = styledComponentId;\n\n  // fold the underlying StyledComponent target up since we folded the styles\n  // $FlowFixMe\n  WrappedStyledComponent.target = isTargetStyledComp ? target.target : target;\n\n  // $FlowFixMe\n  WrappedStyledComponent.withComponent = function withComponent(tag) {\n    var previousComponentId = options.componentId,\n        optionsToCopy = objectWithoutProperties(options, ['componentId']);\n\n\n    var newComponentId = previousComponentId && previousComponentId + '-' + (isTag(tag) ? tag : escape(getComponentName(tag)));\n\n    var newOptions = _extends({}, optionsToCopy, {\n      attrs: finalAttrs,\n      componentId: newComponentId,\n      ParentComponent: ParentComponent\n    });\n\n    return createStyledComponent(tag, newOptions, rules);\n  };\n\n  // $FlowFixMe\n  Object.defineProperty(WrappedStyledComponent, 'defaultProps', {\n    get: function get$$1() {\n      return this._foldedDefaultProps;\n    },\n    set: function set$$1(obj) {\n      // $FlowFixMe\n      this._foldedDefaultProps = isTargetStyledComp ? merge(target.defaultProps, obj) : obj;\n    }\n  });\n\n  if (process.env.NODE_ENV !== 'production') {\n    // $FlowFixMe\n    WrappedStyledComponent.warnTooManyClasses = createWarnTooManyClasses(displayName);\n  }\n\n  // $FlowFixMe\n  WrappedStyledComponent.toString = function () {\n    return '.' + WrappedStyledComponent.styledComponentId;\n  };\n\n  if (isClass) {\n    hoistNonReactStatics(WrappedStyledComponent, target, {\n      // all SC-specific things should not be hoisted\n      attrs: true,\n      componentStyle: true,\n      displayName: true,\n      foldedComponentIds: true,\n      styledComponentId: true,\n      target: true,\n      withComponent: true\n    });\n  }\n\n  return WrappedStyledComponent;\n}\n\n// \n// Thanks to ReactDOMFactories for this handy list!\n\nvar domElements = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'big', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'var', 'video', 'wbr',\n\n// SVG\n'circle', 'clipPath', 'defs', 'ellipse', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'svg', 'text', 'tspan'];\n\n// \n\nvar styled = function styled(tag) {\n  return constructWithOptions(createStyledComponent, tag);\n};\n\n// Shorthands for all valid HTML Elements\ndomElements.forEach(function (domElement) {\n  styled[domElement] = styled(domElement);\n});\n\n// \n\nvar GlobalStyle = function () {\n  function GlobalStyle(rules, componentId) {\n    classCallCheck(this, GlobalStyle);\n\n    this.rules = rules;\n    this.componentId = componentId;\n    this.isStatic = isStaticRules(rules, EMPTY_ARRAY);\n\n    if (!StyleSheet.master.hasId(componentId)) {\n      StyleSheet.master.deferredInject(componentId, []);\n    }\n  }\n\n  GlobalStyle.prototype.createStyles = function createStyles(executionContext, styleSheet) {\n    var flatCSS = flatten(this.rules, executionContext, styleSheet);\n    var css = stringifyRules(flatCSS, '');\n\n    styleSheet.inject(this.componentId, css);\n  };\n\n  GlobalStyle.prototype.removeStyles = function removeStyles(styleSheet) {\n    var componentId = this.componentId;\n\n    if (styleSheet.hasId(componentId)) {\n      styleSheet.remove(componentId);\n    }\n  };\n\n  // TODO: overwrite in-place instead of remove+create?\n\n\n  GlobalStyle.prototype.renderStyles = function renderStyles(executionContext, styleSheet) {\n    this.removeStyles(styleSheet);\n    this.createStyles(executionContext, styleSheet);\n  };\n\n  return GlobalStyle;\n}();\n\n// \n\n// place our cache into shared context so it'll persist between HMRs\nif (IS_BROWSER) {\n  window.scCGSHMRCache = {};\n}\n\nfunction createGlobalStyle(strings) {\n  for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    interpolations[_key - 1] = arguments[_key];\n  }\n\n  var rules = css.apply(undefined, [strings].concat(interpolations));\n  var id = 'sc-global-' + murmurhash(JSON.stringify(rules));\n  var style = new GlobalStyle(rules, id);\n\n  var GlobalStyleComponent = function (_React$Component) {\n    inherits(GlobalStyleComponent, _React$Component);\n\n    function GlobalStyleComponent(props) {\n      classCallCheck(this, GlobalStyleComponent);\n\n      var _this = possibleConstructorReturn(this, _React$Component.call(this, props));\n\n      var _this$constructor = _this.constructor,\n          globalStyle = _this$constructor.globalStyle,\n          styledComponentId = _this$constructor.styledComponentId;\n\n\n      if (IS_BROWSER) {\n        window.scCGSHMRCache[styledComponentId] = (window.scCGSHMRCache[styledComponentId] || 0) + 1;\n      }\n\n      /**\n       * This fixes HMR compatibility. Don't ask me why, but this combination of\n       * caching the closure variables via statics and then persisting the statics in\n       * state works across HMR where no other combination did. ¯\\_(ツ)_/¯\n       */\n      _this.state = {\n        globalStyle: globalStyle,\n        styledComponentId: styledComponentId\n      };\n      return _this;\n    }\n\n    GlobalStyleComponent.prototype.componentWillUnmount = function componentWillUnmount() {\n      if (window.scCGSHMRCache[this.state.styledComponentId]) {\n        window.scCGSHMRCache[this.state.styledComponentId] -= 1;\n      }\n      /**\n       * Depending on the order \"render\" is called this can cause the styles to be lost\n       * until the next render pass of the remaining instance, which may\n       * not be immediate.\n       */\n      if (window.scCGSHMRCache[this.state.styledComponentId] === 0) {\n        this.state.globalStyle.removeStyles(this.styleSheet);\n      }\n    };\n\n    GlobalStyleComponent.prototype.render = function render() {\n      var _this2 = this;\n\n      if (process.env.NODE_ENV !== 'production' && React.Children.count(this.props.children)) {\n        // eslint-disable-next-line no-console\n        console.warn('The global style component ' + this.state.styledComponentId + ' was given child JSX. createGlobalStyle does not render children.');\n      }\n\n      return React.createElement(\n        StyleSheetConsumer,\n        null,\n        function (styleSheet) {\n          _this2.styleSheet = styleSheet || StyleSheet.master;\n\n          var globalStyle = _this2.state.globalStyle;\n\n\n          if (globalStyle.isStatic) {\n            globalStyle.renderStyles(STATIC_EXECUTION_CONTEXT, _this2.styleSheet);\n\n            return null;\n          } else {\n            return React.createElement(\n              ThemeConsumer,\n              null,\n              function (theme) {\n                // $FlowFixMe\n                var defaultProps = _this2.constructor.defaultProps;\n\n\n                var context = _extends({}, _this2.props);\n\n                if (typeof theme !== 'undefined') {\n                  context.theme = determineTheme(_this2.props, theme, defaultProps);\n                }\n\n                globalStyle.renderStyles(context, _this2.styleSheet);\n\n                return null;\n              }\n            );\n          }\n        }\n      );\n    };\n\n    return GlobalStyleComponent;\n  }(React.Component);\n\n  GlobalStyleComponent.globalStyle = style;\n  GlobalStyleComponent.styledComponentId = id;\n\n\n  return GlobalStyleComponent;\n}\n\n// \n\nvar replaceWhitespace = function replaceWhitespace(str) {\n  return str.replace(/\\s|\\\\n/g, '');\n};\n\nfunction keyframes(strings) {\n  /* Warning if you've used keyframes on React Native */\n  if (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n    // eslint-disable-next-line no-console\n    console.warn('`keyframes` cannot be used on ReactNative, only on the web. To do animation in ReactNative please use Animated.');\n  }\n\n  for (var _len = arguments.length, interpolations = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    interpolations[_key - 1] = arguments[_key];\n  }\n\n  var rules = css.apply(undefined, [strings].concat(interpolations));\n\n  var name = generateAlphabeticName(murmurhash(replaceWhitespace(JSON.stringify(rules))));\n\n  return new Keyframes(name, stringifyRules(rules, name, '@keyframes'));\n}\n\n// \n\nvar withTheme = (function (Component$$1) {\n  var WithTheme = React.forwardRef(function (props, ref) {\n    return React.createElement(\n      ThemeConsumer,\n      null,\n      function (theme) {\n        // $FlowFixMe\n        var defaultProps = Component$$1.defaultProps;\n\n        var themeProp = determineTheme(props, theme, defaultProps);\n\n        if (process.env.NODE_ENV !== 'production' && themeProp === undefined) {\n          // eslint-disable-next-line no-console\n          console.warn('[withTheme] You are not using a ThemeProvider nor passing a theme prop or a theme in defaultProps in component class \"' + getComponentName(Component$$1) + '\"');\n        }\n\n        return React.createElement(Component$$1, _extends({}, props, { theme: themeProp, ref: ref }));\n      }\n    );\n  });\n\n  hoistNonReactStatics(WithTheme, Component$$1);\n\n  WithTheme.displayName = 'WithTheme(' + getComponentName(Component$$1) + ')';\n\n  return WithTheme;\n});\n\n// \n\n/* eslint-disable */\nvar __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS = {\n  StyleSheet: StyleSheet\n};\n\n// \n\n/* Warning if you've imported this file on React Native */\nif (process.env.NODE_ENV !== 'production' && typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n  // eslint-disable-next-line no-console\n  console.warn(\"It looks like you've imported 'styled-components' on React Native.\\n\" + \"Perhaps you're looking to import 'styled-components/native'?\\n\" + 'Read more about this at https://www.styled-components.com/docs/basics#react-native');\n}\n\n/* Warning if there are several instances of styled-components */\nif (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test' && typeof window !== 'undefined' && typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Node.js') === -1 && navigator.userAgent.indexOf('jsdom') === -1) {\n  window['__styled-components-init__'] = window['__styled-components-init__'] || 0;\n\n  if (window['__styled-components-init__'] === 1) {\n    // eslint-disable-next-line no-console\n    console.warn(\"It looks like there are several instances of 'styled-components' initialized in this application. \" + 'This may cause dynamic styles not rendering properly, errors happening during rehydration process ' + 'and makes your application bigger without a good reason.\\n\\n' + 'See https://s-c.sh/2BAXzed for more info.');\n  }\n\n  window['__styled-components-init__'] += 1;\n}\n\n//\n\nexport default styled;\nexport { createGlobalStyle, css, isStyledComponent, keyframes, ServerStyleSheet, StyleSheetConsumer, StyleSheetContext, StyleSheetManager, ThemeConsumer, ThemeContext, ThemeProvider, withTheme, __DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS };\n//# sourceMappingURL=styled-components.browser.esm.js.map\n","(function (factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? (module['exports'] = factory()) :\n\t\ttypeof define === 'function' && define['amd'] ? define(factory()) :\n\t\t\t(window['stylisRuleSheet'] = factory())\n}(function () {\n\n\t'use strict'\n\n\treturn function (insertRule) {\n\t\tvar delimiter = '/*|*/'\n\t\tvar needle = delimiter+'}'\n\n\t\tfunction toSheet (block) {\n\t\t\tif (block)\n\t\t\t\ttry {\n\t\t\t\t\tinsertRule(block + '}')\n\t\t\t\t} catch (e) {}\n\t\t}\n\n\t\treturn function ruleSheet (context, content, selectors, parents, line, column, length, ns, depth, at) {\n\t\t\tswitch (context) {\n\t\t\t\t// property\n\t\t\t\tcase 1:\n\t\t\t\t\t// @import\n\t\t\t\t\tif (depth === 0 && content.charCodeAt(0) === 64)\n\t\t\t\t\t\treturn insertRule(content+';'), ''\n\t\t\t\t\tbreak\n\t\t\t\t// selector\n\t\t\t\tcase 2:\n\t\t\t\t\tif (ns === 0)\n\t\t\t\t\t\treturn content + delimiter\n\t\t\t\t\tbreak\n\t\t\t\t// at-rule\n\t\t\t\tcase 3:\n\t\t\t\t\tswitch (ns) {\n\t\t\t\t\t\t// @font-face, @page\n\t\t\t\t\t\tcase 102:\n\t\t\t\t\t\tcase 112:\n\t\t\t\t\t\t\treturn insertRule(selectors[0]+content), ''\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn content + (at === 0 ? delimiter : '')\n\t\t\t\t\t}\n\t\t\t\tcase -2:\n\t\t\t\t\tcontent.split(needle).forEach(toSheet)\n\t\t\t}\n\t\t}\n\t}\n}))\n","!function(e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(null):\"function\"==typeof define&&define.amd?define(e(null)):window.stylis=e(null)}(function e(a){\"use strict\";var r=/^\\0+/g,c=/[\\0\\r\\f]/g,s=/: */g,t=/zoo|gra/,i=/([,: ])(transform)/g,f=/,+\\s*(?![^(]*[)])/g,n=/ +\\s*(?![^(]*[)])/g,l=/ *[\\0] */g,o=/,\\r+?/g,h=/([\\t\\r\\n ])*\\f?&/g,u=/:global\\(((?:[^\\(\\)\\[\\]]*|\\[.*\\]|\\([^\\(\\)]*\\))*)\\)/g,d=/\\W+/g,b=/@(k\\w+)\\s*(\\S*)\\s*/,p=/::(place)/g,k=/:(read-only)/g,g=/\\s+(?=[{\\];=:>])/g,A=/([[}=:>])\\s+/g,C=/(\\{[^{]+?);(?=\\})/g,w=/\\s{2,}/g,v=/([^\\(])(:+) */g,m=/[svh]\\w+-[tblr]{2}/,x=/\\(\\s*(.*)\\s*\\)/g,$=/([\\s\\S]*?);/g,y=/-self|flex-/g,O=/[^]*?(:[rp][el]a[\\w-]+)[^]*/,j=/stretch|:\\s*\\w+\\-(?:conte|avail)/,z=/([^-])(image-set\\()/,N=\"-webkit-\",S=\"-moz-\",F=\"-ms-\",W=59,q=125,B=123,D=40,E=41,G=91,H=93,I=10,J=13,K=9,L=64,M=32,P=38,Q=45,R=95,T=42,U=44,V=58,X=39,Y=34,Z=47,_=62,ee=43,ae=126,re=0,ce=12,se=11,te=107,ie=109,fe=115,ne=112,le=111,oe=105,he=99,ue=100,de=112,be=1,pe=1,ke=0,ge=1,Ae=1,Ce=1,we=0,ve=0,me=0,xe=[],$e=[],ye=0,Oe=null,je=-2,ze=-1,Ne=0,Se=1,Fe=2,We=3,qe=0,Be=1,De=\"\",Ee=\"\",Ge=\"\";function He(e,a,s,t,i){for(var f,n,o=0,h=0,u=0,d=0,g=0,A=0,C=0,w=0,m=0,$=0,y=0,O=0,j=0,z=0,R=0,we=0,$e=0,Oe=0,je=0,ze=s.length,Je=ze-1,Re=\"\",Te=\"\",Ue=\"\",Ve=\"\",Xe=\"\",Ye=\"\";R<ze;){if(C=s.charCodeAt(R),R===Je)if(h+d+u+o!==0){if(0!==h)C=h===Z?I:Z;d=u=o=0,ze++,Je++}if(h+d+u+o===0){if(R===Je){if(we>0)Te=Te.replace(c,\"\");if(Te.trim().length>0){switch(C){case M:case K:case W:case J:case I:break;default:Te+=s.charAt(R)}C=W}}if(1===$e)switch(C){case B:case q:case W:case Y:case X:case D:case E:case U:$e=0;case K:case J:case I:case M:break;default:for($e=0,je=R,g=C,R--,C=W;je<ze;)switch(s.charCodeAt(je++)){case I:case J:case W:++R,C=g,je=ze;break;case V:if(we>0)++R,C=g;case B:je=ze}}switch(C){case B:for(g=(Te=Te.trim()).charCodeAt(0),y=1,je=++R;R<ze;){switch(C=s.charCodeAt(R)){case B:y++;break;case q:y--;break;case Z:switch(A=s.charCodeAt(R+1)){case T:case Z:R=Qe(A,R,Je,s)}break;case G:C++;case D:C++;case Y:case X:for(;R++<Je&&s.charCodeAt(R)!==C;);}if(0===y)break;R++}if(Ue=s.substring(je,R),g===re)g=(Te=Te.replace(r,\"\").trim()).charCodeAt(0);switch(g){case L:if(we>0)Te=Te.replace(c,\"\");switch(A=Te.charCodeAt(1)){case ue:case ie:case fe:case Q:f=a;break;default:f=xe}if(je=(Ue=He(a,f,Ue,A,i+1)).length,me>0&&0===je)je=Te.length;if(ye>0)if(f=Ie(xe,Te,Oe),n=Pe(We,Ue,f,a,pe,be,je,A,i,t),Te=f.join(\"\"),void 0!==n)if(0===(je=(Ue=n.trim()).length))A=0,Ue=\"\";if(je>0)switch(A){case fe:Te=Te.replace(x,Me);case ue:case ie:case Q:Ue=Te+\"{\"+Ue+\"}\";break;case te:if(Ue=(Te=Te.replace(b,\"$1 $2\"+(Be>0?De:\"\")))+\"{\"+Ue+\"}\",1===Ae||2===Ae&&Le(\"@\"+Ue,3))Ue=\"@\"+N+Ue+\"@\"+Ue;else Ue=\"@\"+Ue;break;default:if(Ue=Te+Ue,t===de)Ve+=Ue,Ue=\"\"}else Ue=\"\";break;default:Ue=He(a,Ie(a,Te,Oe),Ue,t,i+1)}Xe+=Ue,O=0,$e=0,z=0,we=0,Oe=0,j=0,Te=\"\",Ue=\"\",C=s.charCodeAt(++R);break;case q:case W:if((je=(Te=(we>0?Te.replace(c,\"\"):Te).trim()).length)>1){if(0===z)if((g=Te.charCodeAt(0))===Q||g>96&&g<123)je=(Te=Te.replace(\" \",\":\")).length;if(ye>0)if(void 0!==(n=Pe(Se,Te,a,e,pe,be,Ve.length,t,i,t)))if(0===(je=(Te=n.trim()).length))Te=\"\\0\\0\";switch(g=Te.charCodeAt(0),A=Te.charCodeAt(1),g){case re:break;case L:if(A===oe||A===he){Ye+=Te+s.charAt(R);break}default:if(Te.charCodeAt(je-1)===V)break;Ve+=Ke(Te,g,A,Te.charCodeAt(2))}}O=0,$e=0,z=0,we=0,Oe=0,Te=\"\",C=s.charCodeAt(++R)}}switch(C){case J:case I:if(h+d+u+o+ve===0)switch($){case E:case X:case Y:case L:case ae:case _:case T:case ee:case Z:case Q:case V:case U:case W:case B:case q:break;default:if(z>0)$e=1}if(h===Z)h=0;else if(ge+O===0&&t!==te&&Te.length>0)we=1,Te+=\"\\0\";if(ye*qe>0)Pe(Ne,Te,a,e,pe,be,Ve.length,t,i,t);be=1,pe++;break;case W:case q:if(h+d+u+o===0){be++;break}default:switch(be++,Re=s.charAt(R),C){case K:case M:if(d+o+h===0)switch(w){case U:case V:case K:case M:Re=\"\";break;default:if(C!==M)Re=\" \"}break;case re:Re=\"\\\\0\";break;case ce:Re=\"\\\\f\";break;case se:Re=\"\\\\v\";break;case P:if(d+h+o===0&&ge>0)Oe=1,we=1,Re=\"\\f\"+Re;break;case 108:if(d+h+o+ke===0&&z>0)switch(R-z){case 2:if(w===ne&&s.charCodeAt(R-3)===V)ke=w;case 8:if(m===le)ke=m}break;case V:if(d+h+o===0)z=R;break;case U:if(h+u+d+o===0)we=1,Re+=\"\\r\";break;case Y:case X:if(0===h)d=d===C?0:0===d?C:d;break;case G:if(d+h+u===0)o++;break;case H:if(d+h+u===0)o--;break;case E:if(d+h+o===0)u--;break;case D:if(d+h+o===0){if(0===O)switch(2*w+3*m){case 533:break;default:y=0,O=1}u++}break;case L:if(h+u+d+o+z+j===0)j=1;break;case T:case Z:if(d+o+u>0)break;switch(h){case 0:switch(2*C+3*s.charCodeAt(R+1)){case 235:h=Z;break;case 220:je=R,h=T}break;case T:if(C===Z&&w===T&&je+2!==R){if(33===s.charCodeAt(je+2))Ve+=s.substring(je,R+1);Re=\"\",h=0}}}if(0===h){if(ge+d+o+j===0&&t!==te&&C!==W)switch(C){case U:case ae:case _:case ee:case E:case D:if(0===O){switch(w){case K:case M:case I:case J:Re+=\"\\0\";break;default:Re=\"\\0\"+Re+(C===U?\"\":\"\\0\")}we=1}else switch(C){case D:if(z+7===R&&108===w)z=0;O=++y;break;case E:if(0==(O=--y))we=1,Re+=\"\\0\"}break;case K:case M:switch(w){case re:case B:case q:case W:case U:case ce:case K:case M:case I:case J:break;default:if(0===O)we=1,Re+=\"\\0\"}}if(Te+=Re,C!==M&&C!==K)$=C}}m=w,w=C,R++}if(je=Ve.length,me>0)if(0===je&&0===Xe.length&&0===a[0].length==false)if(t!==ie||1===a.length&&(ge>0?Ee:Ge)===a[0])je=a.join(\",\").length+2;if(je>0){if(f=0===ge&&t!==te?function(e){for(var a,r,s=0,t=e.length,i=Array(t);s<t;++s){for(var f=e[s].split(l),n=\"\",o=0,h=0,u=0,d=0,b=f.length;o<b;++o){if(0===(h=(r=f[o]).length)&&b>1)continue;if(u=n.charCodeAt(n.length-1),d=r.charCodeAt(0),a=\"\",0!==o)switch(u){case T:case ae:case _:case ee:case M:case D:break;default:a=\" \"}switch(d){case P:r=a+Ee;case ae:case _:case ee:case M:case E:case D:break;case G:r=a+r+Ee;break;case V:switch(2*r.charCodeAt(1)+3*r.charCodeAt(2)){case 530:if(Ce>0){r=a+r.substring(8,h-1);break}default:if(o<1||f[o-1].length<1)r=a+Ee+r}break;case U:a=\"\";default:if(h>1&&r.indexOf(\":\")>0)r=a+r.replace(v,\"$1\"+Ee+\"$2\");else r=a+r+Ee}n+=r}i[s]=n.replace(c,\"\").trim()}return i}(a):a,ye>0)if(void 0!==(n=Pe(Fe,Ve,f,e,pe,be,je,t,i,t))&&0===(Ve=n).length)return Ye+Ve+Xe;if(Ve=f.join(\",\")+\"{\"+Ve+\"}\",Ae*ke!=0){if(2===Ae&&!Le(Ve,2))ke=0;switch(ke){case le:Ve=Ve.replace(k,\":\"+S+\"$1\")+Ve;break;case ne:Ve=Ve.replace(p,\"::\"+N+\"input-$1\")+Ve.replace(p,\"::\"+S+\"$1\")+Ve.replace(p,\":\"+F+\"input-$1\")+Ve}ke=0}}return Ye+Ve+Xe}function Ie(e,a,r){var c=a.trim().split(o),s=c,t=c.length,i=e.length;switch(i){case 0:case 1:for(var f=0,n=0===i?\"\":e[0]+\" \";f<t;++f)s[f]=Je(n,s[f],r,i).trim();break;default:f=0;var l=0;for(s=[];f<t;++f)for(var h=0;h<i;++h)s[l++]=Je(e[h]+\" \",c[f],r,i).trim()}return s}function Je(e,a,r,c){var s=a,t=s.charCodeAt(0);if(t<33)t=(s=s.trim()).charCodeAt(0);switch(t){case P:switch(ge+c){case 0:case 1:if(0===e.trim().length)break;default:return s.replace(h,\"$1\"+e.trim())}break;case V:switch(s.charCodeAt(1)){case 103:if(Ce>0&&ge>0)return s.replace(u,\"$1\").replace(h,\"$1\"+Ge);break;default:return e.trim()+s.replace(h,\"$1\"+e.trim())}default:if(r*ge>0&&s.indexOf(\"\\f\")>0)return s.replace(h,(e.charCodeAt(0)===V?\"\":\"$1\")+e.trim())}return e+s}function Ke(e,a,r,c){var l,o=0,h=e+\";\",u=2*a+3*r+4*c;if(944===u)return function(e){var a=e.length,r=e.indexOf(\":\",9)+1,c=e.substring(0,r).trim(),s=e.substring(r,a-1).trim();switch(e.charCodeAt(9)*Be){case 0:break;case Q:if(110!==e.charCodeAt(10))break;default:for(var t=s.split((s=\"\",f)),i=0,r=0,a=t.length;i<a;r=0,++i){for(var l=t[i],o=l.split(n);l=o[r];){var h=l.charCodeAt(0);if(1===Be&&(h>L&&h<90||h>96&&h<123||h===R||h===Q&&l.charCodeAt(1)!==Q))switch(isNaN(parseFloat(l))+(-1!==l.indexOf(\"(\"))){case 1:switch(l){case\"infinite\":case\"alternate\":case\"backwards\":case\"running\":case\"normal\":case\"forwards\":case\"both\":case\"none\":case\"linear\":case\"ease\":case\"ease-in\":case\"ease-out\":case\"ease-in-out\":case\"paused\":case\"reverse\":case\"alternate-reverse\":case\"inherit\":case\"initial\":case\"unset\":case\"step-start\":case\"step-end\":break;default:l+=De}}o[r++]=l}s+=(0===i?\"\":\",\")+o.join(\" \")}}if(s=c+s+\";\",1===Ae||2===Ae&&Le(s,1))return N+s+s;return s}(h);else if(0===Ae||2===Ae&&!Le(h,1))return h;switch(u){case 1015:return 97===h.charCodeAt(10)?N+h+h:h;case 951:return 116===h.charCodeAt(3)?N+h+h:h;case 963:return 110===h.charCodeAt(5)?N+h+h:h;case 1009:if(100!==h.charCodeAt(4))break;case 969:case 942:return N+h+h;case 978:return N+h+S+h+h;case 1019:case 983:return N+h+S+h+F+h+h;case 883:if(h.charCodeAt(8)===Q)return N+h+h;if(h.indexOf(\"image-set(\",11)>0)return h.replace(z,\"$1\"+N+\"$2\")+h;return h;case 932:if(h.charCodeAt(4)===Q)switch(h.charCodeAt(5)){case 103:return N+\"box-\"+h.replace(\"-grow\",\"\")+N+h+F+h.replace(\"grow\",\"positive\")+h;case 115:return N+h+F+h.replace(\"shrink\",\"negative\")+h;case 98:return N+h+F+h.replace(\"basis\",\"preferred-size\")+h}return N+h+F+h+h;case 964:return N+h+F+\"flex-\"+h+h;case 1023:if(99!==h.charCodeAt(8))break;return l=h.substring(h.indexOf(\":\",15)).replace(\"flex-\",\"\").replace(\"space-between\",\"justify\"),N+\"box-pack\"+l+N+h+F+\"flex-pack\"+l+h;case 1005:return t.test(h)?h.replace(s,\":\"+N)+h.replace(s,\":\"+S)+h:h;case 1e3:switch(o=(l=h.substring(13).trim()).indexOf(\"-\")+1,l.charCodeAt(0)+l.charCodeAt(o)){case 226:l=h.replace(m,\"tb\");break;case 232:l=h.replace(m,\"tb-rl\");break;case 220:l=h.replace(m,\"lr\");break;default:return h}return N+h+F+l+h;case 1017:if(-1===h.indexOf(\"sticky\",9))return h;case 975:switch(o=(h=e).length-10,u=(l=(33===h.charCodeAt(o)?h.substring(0,o):h).substring(e.indexOf(\":\",7)+1).trim()).charCodeAt(0)+(0|l.charCodeAt(7))){case 203:if(l.charCodeAt(8)<111)break;case 115:h=h.replace(l,N+l)+\";\"+h;break;case 207:case 102:h=h.replace(l,N+(u>102?\"inline-\":\"\")+\"box\")+\";\"+h.replace(l,N+l)+\";\"+h.replace(l,F+l+\"box\")+\";\"+h}return h+\";\";case 938:if(h.charCodeAt(5)===Q)switch(h.charCodeAt(6)){case 105:return l=h.replace(\"-items\",\"\"),N+h+N+\"box-\"+l+F+\"flex-\"+l+h;case 115:return N+h+F+\"flex-item-\"+h.replace(y,\"\")+h;default:return N+h+F+\"flex-line-pack\"+h.replace(\"align-content\",\"\").replace(y,\"\")+h}break;case 973:case 989:if(h.charCodeAt(3)!==Q||122===h.charCodeAt(4))break;case 931:case 953:if(true===j.test(e))if(115===(l=e.substring(e.indexOf(\":\")+1)).charCodeAt(0))return Ke(e.replace(\"stretch\",\"fill-available\"),a,r,c).replace(\":fill-available\",\":stretch\");else return h.replace(l,N+l)+h.replace(l,S+l.replace(\"fill-\",\"\"))+h;break;case 962:if(h=N+h+(102===h.charCodeAt(5)?F+h:\"\")+h,r+c===211&&105===h.charCodeAt(13)&&h.indexOf(\"transform\",10)>0)return h.substring(0,h.indexOf(\";\",27)+1).replace(i,\"$1\"+N+\"$2\")+h}return h}function Le(e,a){var r=e.indexOf(1===a?\":\":\"{\"),c=e.substring(0,3!==a?r:10),s=e.substring(r+1,e.length-1);return Oe(2!==a?c:c.replace(O,\"$1\"),s,a)}function Me(e,a){var r=Ke(a,a.charCodeAt(0),a.charCodeAt(1),a.charCodeAt(2));return r!==a+\";\"?r.replace($,\" or ($1)\").substring(4):\"(\"+a+\")\"}function Pe(e,a,r,c,s,t,i,f,n,l){for(var o,h=0,u=a;h<ye;++h)switch(o=$e[h].call(Te,e,u,r,c,s,t,i,f,n,l)){case void 0:case false:case true:case null:break;default:u=o}if(u!==a)return u}function Qe(e,a,r,c){for(var s=a+1;s<r;++s)switch(c.charCodeAt(s)){case Z:if(e===T)if(c.charCodeAt(s-1)===T&&a+2!==s)return s+1;break;case I:if(e===Z)return s+1}return s}function Re(e){for(var a in e){var r=e[a];switch(a){case\"keyframe\":Be=0|r;break;case\"global\":Ce=0|r;break;case\"cascade\":ge=0|r;break;case\"compress\":we=0|r;break;case\"semicolon\":ve=0|r;break;case\"preserve\":me=0|r;break;case\"prefix\":if(Oe=null,!r)Ae=0;else if(\"function\"!=typeof r)Ae=1;else Ae=2,Oe=r}}return Re}function Te(a,r){if(void 0!==this&&this.constructor===Te)return e(a);var s=a,t=s.charCodeAt(0);if(t<33)t=(s=s.trim()).charCodeAt(0);if(Be>0)De=s.replace(d,t===G?\"\":\"-\");if(t=1,1===ge)Ge=s;else Ee=s;var i,f=[Ge];if(ye>0)if(void 0!==(i=Pe(ze,r,f,f,pe,be,0,0,0,0))&&\"string\"==typeof i)r=i;var n=He(xe,f,r,0,0);if(ye>0)if(void 0!==(i=Pe(je,n,f,f,pe,be,n.length,0,0,0))&&\"string\"!=typeof(n=i))t=0;return De=\"\",Ge=\"\",Ee=\"\",ke=0,pe=1,be=1,we*t==0?n:n.replace(c,\"\").replace(g,\"\").replace(A,\"$1\").replace(C,\"$1\").replace(w,\" \")}if(Te.use=function e(a){switch(a){case void 0:case null:ye=$e.length=0;break;default:if(\"function\"==typeof a)$e[ye++]=a;else if(\"object\"==typeof a)for(var r=0,c=a.length;r<c;++r)e(a[r]);else qe=0|!!a}return e},Te.set=Re,void 0!==a)Re(a);return Te});\n//# sourceMappingURL=stylis.min.js.map","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n    if (condition) {\n        return;\n    }\n    if (isProduction) {\n        throw new Error(prefix);\n    }\n    var provided = typeof message === 'function' ? message() : message;\n    var value = provided ? prefix + \": \" + provided : prefix;\n    throw new Error(value);\n}\n\nexport { invariant as default };\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n    // find the complete implementation of crypto (msCrypto) on IE11.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n  return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!validate(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || new Array(16);\n  options = options || {};\n  var node = options.node || _nodeId;\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n  // specified.  We do this lazily to minimize issues related to insufficient\n  // system entropy.  See #189\n\n  if (node == null || clockseq == null) {\n    var seedBytes = options.random || (options.rng || rng)();\n\n    if (node == null) {\n      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n    }\n\n    if (clockseq == null) {\n      // Per 4.2.2, randomize (14 bit) clockseq\n      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n    }\n  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n\n\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n  if (nsecs >= 10000) {\n    throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n  msecs += 12219292800000; // `time_low`\n\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff; // `time_mid`\n\n  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff; // `time_high_and_version`\n\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n  b[i++] = clockseq & 0xff; // `node`\n\n  for (var n = 0; n < 6; ++n) {\n    b[i + n] = node[n];\n  }\n\n  return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n  if (!validate(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  var v;\n  var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n  arr[1] = v >>> 16 & 0xff;\n  arr[2] = v >>> 8 & 0xff;\n  arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n  arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n  arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n  arr[9] = v & 0xff; // Parse ........-....-....-....-############\n  // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n  arr[11] = v / 0x100000000 & 0xff;\n  arr[12] = v >>> 24 & 0xff;\n  arr[13] = v >>> 16 & 0xff;\n  arr[14] = v >>> 8 & 0xff;\n  arr[15] = v & 0xff;\n  return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n  str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n  var bytes = [];\n\n  for (var i = 0; i < str.length; ++i) {\n    bytes.push(str.charCodeAt(i));\n  }\n\n  return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n  function generateUUID(value, namespace, buf, offset) {\n    if (typeof value === 'string') {\n      value = stringToBytes(value);\n    }\n\n    if (typeof namespace === 'string') {\n      namespace = parse(namespace);\n    }\n\n    if (namespace.length !== 16) {\n      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n    } // Compute hash of namespace and value, Per 4.3\n    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n    // hashfunc([...namespace, ... value])`\n\n\n    var bytes = new Uint8Array(16 + value.length);\n    bytes.set(namespace);\n    bytes.set(value, namespace.length);\n    bytes = hashfunc(bytes);\n    bytes[6] = bytes[6] & 0x0f | version;\n    bytes[8] = bytes[8] & 0x3f | 0x80;\n\n    if (buf) {\n      offset = offset || 0;\n\n      for (var i = 0; i < 16; ++i) {\n        buf[offset + i] = bytes[i];\n      }\n\n      return buf;\n    }\n\n    return stringify(bytes);\n  } // Function#name is not settable on some platforms (#270)\n\n\n  try {\n    generateUUID.name = name; // eslint-disable-next-line no-empty\n  } catch (err) {} // For CommonJS default export support\n\n\n  generateUUID.DNS = DNS;\n  generateUUID.URL = URL;\n  return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = new Uint8Array(msg.length);\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes[i] = msg.charCodeAt(i);\n    }\n  }\n\n  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n  var output = [];\n  var length32 = input.length * 32;\n  var hexTab = '0123456789abcdef';\n\n  for (var i = 0; i < length32; i += 8) {\n    var x = input[i >> 5] >>> i % 32 & 0xff;\n    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n    output.push(hex);\n  }\n\n  return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n  /* append padding */\n  x[len >> 5] |= 0x80 << len % 32;\n  x[getOutputLength(len) - 1] = len;\n  var a = 1732584193;\n  var b = -271733879;\n  var c = -1732584194;\n  var d = 271733878;\n\n  for (var i = 0; i < x.length; i += 16) {\n    var olda = a;\n    var oldb = b;\n    var oldc = c;\n    var oldd = d;\n    a = md5ff(a, b, c, d, x[i], 7, -680876936);\n    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n    b = md5gg(b, c, d, a, x[i], 20, -373897302);\n    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n    d = md5hh(d, a, b, c, x[i], 11, -358537222);\n    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n    a = md5ii(a, b, c, d, x[i], 6, -198630844);\n    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n    a = safeAdd(a, olda);\n    b = safeAdd(b, oldb);\n    c = safeAdd(c, oldc);\n    d = safeAdd(d, oldd);\n  }\n\n  return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n  if (input.length === 0) {\n    return [];\n  }\n\n  var length8 = input.length * 8;\n  var output = new Uint32Array(getOutputLength(length8));\n\n  for (var i = 0; i < length8; i += 8) {\n    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n  }\n\n  return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n  var lsw = (x & 0xffff) + (y & 0xffff);\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n  return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n  return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n  return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n  return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n  return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n  return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n  options = options || {};\n  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (var i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n  switch (s) {\n    case 0:\n      return x & y ^ ~x & z;\n\n    case 1:\n      return x ^ y ^ z;\n\n    case 2:\n      return x & y ^ x & z ^ y & z;\n\n    case 3:\n      return x ^ y ^ z;\n  }\n}\n\nfunction ROTL(x, n) {\n  return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = [];\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes.push(msg.charCodeAt(i));\n    }\n  } else if (!Array.isArray(bytes)) {\n    // Convert Array-like to Array\n    bytes = Array.prototype.slice.call(bytes);\n  }\n\n  bytes.push(0x80);\n  var l = bytes.length / 4 + 2;\n  var N = Math.ceil(l / 16);\n  var M = new Array(N);\n\n  for (var _i = 0; _i < N; ++_i) {\n    var arr = new Uint32Array(16);\n\n    for (var j = 0; j < 16; ++j) {\n      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n    }\n\n    M[_i] = arr;\n  }\n\n  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n  M[N - 1][14] = Math.floor(M[N - 1][14]);\n  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n  for (var _i2 = 0; _i2 < N; ++_i2) {\n    var W = new Uint32Array(80);\n\n    for (var t = 0; t < 16; ++t) {\n      W[t] = M[_i2][t];\n    }\n\n    for (var _t = 16; _t < 80; ++_t) {\n      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n    }\n\n    var a = H[0];\n    var b = H[1];\n    var c = H[2];\n    var d = H[3];\n    var e = H[4];\n\n    for (var _t2 = 0; _t2 < 80; ++_t2) {\n      var s = Math.floor(_t2 / 20);\n      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n      e = d;\n      d = c;\n      c = ROTL(b, 30) >>> 0;\n      b = a;\n      a = T;\n    }\n\n    H[0] = H[0] + a >>> 0;\n    H[1] = H[1] + b >>> 0;\n    H[2] = H[2] + c >>> 0;\n    H[3] = H[3] + d >>> 0;\n    H[4] = H[4] + e >>> 0;\n  }\n\n  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n  if (!validate(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","function valueOf(obj) {\n  return obj.valueOf ? obj.valueOf() : Object.prototype.valueOf.call(obj);\n}\n\nfunction valueEqual(a, b) {\n  // Test for strict equality first.\n  if (a === b) return true;\n\n  // Otherwise, if either of them == null they are not equal.\n  if (a == null || b == null) return false;\n\n  if (Array.isArray(a)) {\n    return (\n      Array.isArray(b) &&\n      a.length === b.length &&\n      a.every(function(item, index) {\n        return valueEqual(item, b[index]);\n      })\n    );\n  }\n\n  if (typeof a === 'object' || typeof b === 'object') {\n    var aValue = valueOf(a);\n    var bValue = valueOf(b);\n\n    if (aValue !== a || bValue !== b) return valueEqual(aValue, bValue);\n\n    return Object.keys(Object.assign({}, a, b)).every(function(key) {\n      return valueEqual(a[key], b[key]);\n    });\n  }\n\n  return false;\n}\n\nexport default valueEqual;\n","module.exports = XDate;","module.exports = evite.exports.React;","module.exports = evite.exports.ReactDom;","module.exports = evite.exports.ReactRouter;","module.exports = evite.exports.mobx;","module.exports = window.evite;","module.exports = window.evite.exports;","module.exports = window.evite.exports.Store2;","module.exports = window.evite.urls;","export default function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}","export default function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}","export default function _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}","import getPrototypeOf from \"./getPrototypeOf\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct\";\nimport possibleConstructorReturn from \"./possibleConstructorReturn\";\nexport default function _createSuper(Derived) {\n  var hasNativeReflectConstruct = isNativeReflectConstruct();\n  return function _createSuperInternal() {\n    var Super = getPrototypeOf(Derived),\n        result;\n\n    if (hasNativeReflectConstruct) {\n      var NewTarget = getPrototypeOf(this).constructor;\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n\n    return possibleConstructorReturn(this, result);\n  };\n}","export default function _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}","import _typeof from \"../../helpers/esm/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized\";\nexport default function _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return assertThisInitialized(self);\n}","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}","export default function _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}","export default function _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf\";\nexport default function _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}","import defineProperty from \"./defineProperty\";\n\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    });\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nexport default function _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose\";\nexport default function _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nimport nonIterableRest from \"./nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\nexport default function _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n      args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n      _next(undefined);\n    });\n  };\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n  key = toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}","export default function _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nexport default function _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n  return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}","import _typeof from \"./typeof.js\";\nexport default function _regeneratorRuntime() {\n  \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n  _regeneratorRuntime = function _regeneratorRuntime() {\n    return exports;\n  };\n  var exports = {},\n    Op = Object.prototype,\n    hasOwn = Op.hasOwnProperty,\n    defineProperty = Object.defineProperty || function (obj, key, desc) {\n      obj[key] = desc.value;\n    },\n    $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n    iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n    asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n    toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n  function define(obj, key, value) {\n    return Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: !0,\n      configurable: !0,\n      writable: !0\n    }), obj[key];\n  }\n  try {\n    define({}, \"\");\n  } catch (err) {\n    define = function define(obj, key, value) {\n      return obj[key] = value;\n    };\n  }\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n      generator = Object.create(protoGenerator.prototype),\n      context = new Context(tryLocsList || []);\n    return defineProperty(generator, \"_invoke\", {\n      value: makeInvokeMethod(innerFn, self, context)\n    }), generator;\n  }\n  function tryCatch(fn, obj, arg) {\n    try {\n      return {\n        type: \"normal\",\n        arg: fn.call(obj, arg)\n      };\n    } catch (err) {\n      return {\n        type: \"throw\",\n        arg: err\n      };\n    }\n  }\n  exports.wrap = wrap;\n  var ContinueSentinel = {};\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n  var IteratorPrototype = {};\n  define(IteratorPrototype, iteratorSymbol, function () {\n    return this;\n  });\n  var getProto = Object.getPrototypeOf,\n    NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function (method) {\n      define(prototype, method, function (arg) {\n        return this._invoke(method, arg);\n      });\n    });\n  }\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (\"throw\" !== record.type) {\n        var result = record.arg,\n          value = result.value;\n        return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n          invoke(\"next\", value, resolve, reject);\n        }, function (err) {\n          invoke(\"throw\", err, resolve, reject);\n        }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n          result.value = unwrapped, resolve(result);\n        }, function (error) {\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n      reject(record.arg);\n    }\n    var previousPromise;\n    defineProperty(this, \"_invoke\", {\n      value: function value(method, arg) {\n        function callInvokeWithMethodAndArg() {\n          return new PromiseImpl(function (resolve, reject) {\n            invoke(method, arg, resolve, reject);\n          });\n        }\n        return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n      }\n    });\n  }\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = \"suspendedStart\";\n    return function (method, arg) {\n      if (\"executing\" === state) throw new Error(\"Generator is already running\");\n      if (\"completed\" === state) {\n        if (\"throw\" === method) throw arg;\n        return doneResult();\n      }\n      for (context.method = method, context.arg = arg;;) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n        if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n          if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n          context.dispatchException(context.arg);\n        } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n        state = \"executing\";\n        var record = tryCatch(innerFn, self, context);\n        if (\"normal\" === record.type) {\n          if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n          return {\n            value: record.arg,\n            done: context.done\n          };\n        }\n        \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n      }\n    };\n  }\n  function maybeInvokeDelegate(delegate, context) {\n    var methodName = context.method,\n      method = delegate.iterator[methodName];\n    if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n    var record = tryCatch(method, delegate.iterator, context.arg);\n    if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n    var info = record.arg;\n    return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n  }\n  function pushTryEntry(locs) {\n    var entry = {\n      tryLoc: locs[0]\n    };\n    1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n  }\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\", delete record.arg, entry.completion = record;\n  }\n  function Context(tryLocsList) {\n    this.tryEntries = [{\n      tryLoc: \"root\"\n    }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n  }\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) return iteratorMethod.call(iterable);\n      if (\"function\" == typeof iterable.next) return iterable;\n      if (!isNaN(iterable.length)) {\n        var i = -1,\n          next = function next() {\n            for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n            return next.value = undefined, next.done = !0, next;\n          };\n        return next.next = next;\n      }\n    }\n    return {\n      next: doneResult\n    };\n  }\n  function doneResult() {\n    return {\n      value: undefined,\n      done: !0\n    };\n  }\n  return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n    value: GeneratorFunctionPrototype,\n    configurable: !0\n  }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n    value: GeneratorFunction,\n    configurable: !0\n  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n    var ctor = \"function\" == typeof genFun && genFun.constructor;\n    return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n  }, exports.mark = function (genFun) {\n    return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n  }, exports.awrap = function (arg) {\n    return {\n      __await: arg\n    };\n  }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n    return this;\n  }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    void 0 === PromiseImpl && (PromiseImpl = Promise);\n    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n    return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n      return result.done ? result.value : iter.next();\n    });\n  }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n    return this;\n  }), define(Gp, \"toString\", function () {\n    return \"[object Generator]\";\n  }), exports.keys = function (val) {\n    var object = Object(val),\n      keys = [];\n    for (var key in object) keys.push(key);\n    return keys.reverse(), function next() {\n      for (; keys.length;) {\n        var key = keys.pop();\n        if (key in object) return next.value = key, next.done = !1, next;\n      }\n      return next.done = !0, next;\n    };\n  }, exports.values = values, Context.prototype = {\n    constructor: Context,\n    reset: function reset(skipTempReset) {\n      if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n    },\n    stop: function stop() {\n      this.done = !0;\n      var rootRecord = this.tryEntries[0].completion;\n      if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n      return this.rval;\n    },\n    dispatchException: function dispatchException(exception) {\n      if (this.done) throw exception;\n      var context = this;\n      function handle(loc, caught) {\n        return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n      }\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i],\n          record = entry.completion;\n        if (\"root\" === entry.tryLoc) return handle(\"end\");\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n            hasFinally = hasOwn.call(entry, \"finallyLoc\");\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n          } else {\n            if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n          }\n        }\n      }\n    },\n    abrupt: function abrupt(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n      finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n      var record = finallyEntry ? finallyEntry.completion : {};\n      return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n    },\n    complete: function complete(record, afterLoc) {\n      if (\"throw\" === record.type) throw record.arg;\n      return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n    },\n    finish: function finish(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n      }\n    },\n    \"catch\": function _catch(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (\"throw\" === record.type) {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n      throw new Error(\"illegal catch attempt\");\n    },\n    delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n      return this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n    }\n  }, exports;\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n  if (null != _i) {\n    var _s,\n      _e,\n      _x,\n      _r,\n      _arr = [],\n      _n = !0,\n      _d = !1;\n    try {\n      if (_x = (_i = _i.call(arr)).next, 0 === i) {\n        if (Object(_i) !== _i) return;\n        _n = !1;\n      } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n    } catch (err) {\n      _d = !0, _e = err;\n    } finally {\n      try {\n        if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n      } finally {\n        if (_d) throw _e;\n      }\n    }\n    return _arr;\n  }\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n  var key = toPrimitive(arg, \"string\");\n  return _typeof(key) === \"symbol\" ? key : String(key);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n  if (_typeof(input) !== \"object\" || input === null) return input;\n  var prim = input[Symbol.toPrimitive];\n  if (prim !== undefined) {\n    var res = prim.call(input, hint || \"default\");\n    if (_typeof(res) !== \"object\") return res;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (hint === \"string\" ? String : Number)(input);\n}","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","export default function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}","export default function _extends() {\n  _extends = Object.assign ? Object.assign.bind() : function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}","export default function _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n  return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  Object.defineProperty(subClass, \"prototype\", {\n    writable: false\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n  if (_i == null) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n\n  var _s, _e;\n\n  try {\n    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _taggedTemplateLiteral(strings, raw) {\n  if (!raw) {\n    raw = strings.slice(0);\n  }\n\n  return Object.freeze(Object.defineProperties(strings, {\n    raw: {\n      value: Object.freeze(raw)\n    }\n  }));\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var inProgress = {};\nvar dataWebpackPrefix = \"evite:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"chunk.\" + ({\"905\":\"EventDetails\",\"1634\":\"EventGuests\",\"1768\":\"Preview\",\"2135\":\"Success\",\"2607\":\"Content.a313c751\",\"4868\":\"Content.af8b12f8\",\"4992\":\"Upsell\",\"5453\":\"Content.3008d796\",\"6397\":\"MegaNav\",\"6788\":\"Content.0c900bd1\",\"7399\":\"EventGifting\",\"7538\":\"Content.b1893266\",\"7678\":\"GuestOptions\",\"7785\":\"Content.378a9847\",\"8567\":\"Content.7cb4b459\",\"8779\":\"signupModal\",\"8831\":\"EventReview\",\"8847\":\"Content.1cb6ccd7\",\"9393\":\"Content.96a356aa\"}[chunkId] || chunkId) + \"--\" + {\"176\":\"1fd5f83\",\"339\":\"d3f16b5\",\"442\":\"c5495e6\",\"488\":\"ade4eb6\",\"628\":\"6b562b3\",\"794\":\"7529c10\",\"905\":\"e020d0b\",\"1066\":\"5e0a217\",\"1248\":\"dc84e9e\",\"1447\":\"670ee61\",\"1566\":\"b3da330\",\"1583\":\"978b5a1\",\"1634\":\"14912ea\",\"1768\":\"60fe0b3\",\"2135\":\"b39bce7\",\"2497\":\"f201c2b\",\"2607\":\"5baa2dc\",\"2771\":\"f96ba1c\",\"2802\":\"a71d555\",\"2893\":\"e11ff0d\",\"2986\":\"70aad60\",\"3131\":\"8dfdda8\",\"3203\":\"f4e5c02\",\"3235\":\"d3cc96f\",\"3241\":\"acae4bf\",\"3462\":\"a4b925e\",\"4104\":\"91a54d3\",\"4337\":\"633936b\",\"4666\":\"da01b45\",\"4766\":\"b9c02a5\",\"4868\":\"7d00a4b\",\"4898\":\"a712688\",\"4921\":\"c65599b\",\"4992\":\"a14c3b5\",\"5037\":\"130912b\",\"5262\":\"3e71ad9\",\"5366\":\"853c19b\",\"5453\":\"35b6b96\",\"5507\":\"4e2ce8f\",\"5527\":\"a5771a5\",\"6299\":\"1c05336\",\"6397\":\"622f9af\",\"6545\":\"28ed4f3\",\"6575\":\"73d8ba9\",\"6681\":\"5e0fde4\",\"6705\":\"6db35c4\",\"6735\":\"905bf72\",\"6788\":\"a2c8b4a\",\"6973\":\"d8eaf5d\",\"7017\":\"9276bf5\",\"7111\":\"6a284fc\",\"7297\":\"b58db61\",\"7399\":\"0cca1c0\",\"7538\":\"d8c36cd\",\"7545\":\"7dc2f2d\",\"7678\":\"407e198\",\"7704\":\"31e15d1\",\"7785\":\"526391d\",\"7856\":\"24a88bd\",\"8019\":\"8dc955e\",\"8178\":\"c062fbe\",\"8369\":\"cac2569\",\"8460\":\"1ed7124\",\"8567\":\"28c155a\",\"8779\":\"2f05143\",\"8831\":\"95c7316\",\"8847\":\"389ecf4\",\"9095\":\"6ad2977\",\"9115\":\"2b80b01\",\"9124\":\"eb5f8f9\",\"9163\":\"306b3d4\",\"9226\":\"d80b28b\",\"9393\":\"72b099f\",\"9557\":\"634c245\",\"9690\":\"6f2ff58\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"905\":\"EventDetails\",\"1634\":\"EventGuests\",\"1768\":\"Preview\",\"2135\":\"Success\",\"4992\":\"Upsell\",\"6397\":\"MegaNav\",\"7399\":\"EventGifting\",\"7678\":\"GuestOptions\",\"7785\":\"Content.378a9847\",\"8779\":\"signupModal\",\"8831\":\"EventReview\"}[chunkId] || chunkId) + \"--\" + {\"176\":\"1fd5f83\",\"794\":\"7529c10\",\"905\":\"e020d0b\",\"1634\":\"14912ea\",\"1768\":\"60fe0b3\",\"2135\":\"b39bce7\",\"4992\":\"a14c3b5\",\"6397\":\"622f9af\",\"6681\":\"5e0fde4\",\"7399\":\"0cca1c0\",\"7678\":\"407e198\",\"7785\":\"526391d\",\"8779\":\"2f05143\",\"8831\":\"95c7316\"}[chunkId] + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"//g0.evitecdn.com/static/_build/webpack_bundles/\";","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t8444: 0,\n\t3203: 0,\n\t2777: 0,\n\t1066: 0,\n\t6299: 0,\n\t794: 0,\n\t4100: 0,\n\t6681: 0,\n\t9124: 0,\n\t6445: 0,\n\t8019: 0,\n\t4666: 0,\n\t7704: 0,\n\t3241: 0,\n\t5037: 0,\n\t2893: 0,\n\t5366: 0,\n\t9712: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"176\":1,\"794\":1,\"905\":1,\"1634\":1,\"1768\":1,\"2135\":1,\"4992\":1,\"6397\":1,\"6681\":1,\"7399\":1,\"7678\":1,\"7785\":1,\"8779\":1,\"8831\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t8444: 0,\n\t3203: 0,\n\t2777: 0,\n\t1066: 0,\n\t6299: 0,\n\t794: 0,\n\t4100: 0,\n\t6681: 0,\n\t9124: 0,\n\t6445: 0,\n\t8019: 0,\n\t4666: 0,\n\t7704: 0,\n\t3241: 0,\n\t5037: 0,\n\t2893: 0,\n\t5366: 0,\n\t9712: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(7(399|785|94)|1634|176|2135|6397|6681|8831|905)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkevite\"] = self[\"webpackChunkevite\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;","/* public-path Sets the cdn path of the chunks.  Must come first in this file */\nimport '~/common/public-path';\n\n/* Global imports */\nimport React, {useEffect, useRef} from 'react';\nimport ReactDOM from 'react-dom';\nimport {Route, Router, Switch} from 'react-router-dom';\nimport {Provider, useDispatch, useSelector, useStore} from 'react-redux';\nimport {toast, ToastContainer} from 'react-toastify';\nimport 'react-toastify/dist/ReactToastify.min.css';\nimport 'flatpickr/dist/themes/material_green.css';\nimport {ModalProvider} from 'react-modal-hook';\nimport {TransitionGroup} from 'react-transition-group';\nimport {Elements} from '@stripe/react-stripe-js';\nimport {loadStripe} from '@stripe/stripe-js';\nimport {EventCreateDesignContainer} from '~/CreateFabricInvitation/routes/EventCreateDesign/EventCreateDesign';\n\n/* Local imports */\nimport urls from 'urls';\nimport {history} from './history';\nimport {LoginModalReduxWrapper} from './components/LoginModal/LoginModalReduxWrapper';\nimport './app.sass';\nimport {createCreateFabricInvitationStore} from './reducers';\nimport {useTrackPages} from './utils/trackPages';\nimport {NavHeader} from './components';\nimport {EventDetailsAsync} from './routes/EventDetails/EventDetailsAsync';\nimport {EventGiftingAsync} from './routes/EventGifting/EventGiftingAsync';\nimport {EventGuestsAsync} from '~/common/fabric/EventGuests/EventGuestsAsync';\nimport {EventReviewAsync} from './routes/EventReview/EventReviewAsync';\nimport {SuccessAsync} from './routes/Success/SuccessAsync';\nimport {UpsellAsync} from './routes/Upsell/UpsellAsync';\nimport {PreviewAsync} from './routes/Preview/PreviewAsync';\nimport {getCurrentStep, useCurrentRoute} from './navigation';\nimport {PROPAGATE_STEP_CHANGE, SET_ALL_ASSETS} from './reducers/constants';\nimport {INIT_APP} from '~/common/fabric/constants';\nimport {ContentAsync} from './components/Content/ContentAsync';\nimport {setupWebviewNavigation} from './navigation/index';\nimport {NotifyGuestsOverlay} from '~/CreateFabricInvitation/components/modals/NotifyGuestsOverlay';\nimport {\n  isWebview,\n  setupWebviewCheckoutCompleteConnection,\n  setupWebviewDowngradeConnection,\n  setupWebviewPostLoginSuccessConnection,\n  setupWebviewSendCompleteConnection,\n  setupWebviewUpsellAcceptConnection,\n  webViewOnNav,\n  webViewPendingUpgradeToPremium,\n} from '~/CreateFabricInvitation/webview/webview';\nimport {fetchInvitationSummary} from '~/ViewInvitation/reducers/apiActions';\nimport {InjectableFooter} from '~/common/_pb_components/organisms/InjectableFooter';\nimport {\n  eventInEditMode,\n  eventInUpsellMode,\n} from '~/CreateFabricInvitation/reducers/details/selectors';\nimport * as guestsAPI from '~/common/fabric/EventGuests/api/guests';\nimport {UPDATE_GUESTS} from '~/common/fabric/EventGuests/reducers/guests/constants';\nimport {\n  isInGalleryPremiumAdoptionVariation,\n  isInPremiumPricingVariationC,\n} from '~/CreateFabricInvitation/utils/experiments';\nimport {GuestOptionsAsync} from '~/CreateFabricInvitation/routes/GuestOptions/GuestOptionsAsync';\nimport {getLastPathComponent} from './navigation/utils';\nimport {getUserData} from '~/common/auth/utils';\nimport {RoktLauncherContextProvider} from './components/Rokt/RoktLauncherContextProvider';\n\nconst url = new window.URL(window.location.href);\nconst store = createCreateFabricInvitationStore({});\nstore.dispatch({\n  type: INIT_APP,\n  payload: {\n    event: window.evite_event,\n    template: window.fabricTemplate,\n    stamps: [],\n    stickers: [],\n    liners: [],\n    envelopes: [],\n    backgrounds: [],\n    user: getUserData(),\n    category_event_type: window.category_event_type,\n    category_id: new URLSearchParams(window.location.search).get('c'),\n    override_freemium:\n      isInGalleryPremiumAdoptionVariation() &&\n      url.searchParams.get('variant') === 'premium',\n    widgets: {...window.event_widgets},\n  },\n});\n\nif (window.fabricTemplate?.premium) {\n  webViewPendingUpgradeToPremium(false);\n}\n\nif (window.evite_event) {\n  store.dispatch(fetchInvitationSummary(window.evite_event.id));\n  store.dispatch(guestsAPI.fetchGuestsListThunk()); //duplicated because the AddGuests ABTest\n}\n\nconst {id: currentStep} = getCurrentStep({store});\n\nif (currentStep >= 5) {\n  const {id: eventId} = window.evite_event;\n\n  store.dispatch({type: UPDATE_GUESTS, payload: {eventId}});\n  store.dispatch(guestsAPI.fetchContactsThunk());\n  store.dispatch(guestsAPI.fetchGuestsListThunk());\n  store.dispatch(guestsAPI.fetchGuestsImportThunk());\n}\n\nsetupWebviewNavigation(store);\nsetupWebviewDowngradeConnection(store);\nsetupWebviewCheckoutCompleteConnection(store);\nsetupWebviewSendCompleteConnection(store);\nsetupWebviewPostLoginSuccessConnection(store);\nsetupWebviewUpsellAcceptConnection(store);\n\nconst stripePromise = loadStripe(window.stripePublishableKey);\nconst stripeOptions = {\n  fonts: [\n    {\n      src: 'url(https://fonts.evitecdn.com/pb/Brut_Grotesque_WEB-Book.woff2)',\n      family: 'Brut',\n      weight: '400',\n    },\n  ],\n};\nconst TrackRouteChanges = ({contentPanel}) => {\n  const pathObj = useCurrentRoute();\n  let sections = document.getElementsByClassName(\n    'create-flow__content-section'\n  );\n\n  for (let i = 0; i < sections.length; i++) {\n    sections[i].classList.remove('active');\n  }\n\n  let activeSection = document.getElementById(pathObj.name);\n  if (activeSection && contentPanel?.current) {\n    activeSection.classList.add('active');\n    contentPanel.current.scrollTop = activeSection.offsetTop - 120;\n  }\n\n  // Report navigation status back the web apps\n  // We do it here to support browsers forward and back buttons as well as in app navigation\n  webViewOnNav(\n    pathObj.name,\n    pathObj.nextRoute,\n    pathObj.previousRoute,\n    pathObj.nextButtonText\n  );\n\n  // Track GA page views\n  useTrackPages();\n\n  return null;\n};\n\nconst CONTENT_PATHS = [\n  '/:template/details',\n  '/:template/gifting',\n  '/:template/preview',\n  '/:template/review',\n];\n\nconst FabricCreateInvitationApp = (props) => {\n  const contentPanel = useRef(null);\n  const {path, hideInWebView, showFooter} = useCurrentRoute();\n  const inEditMode = useSelector(eventInEditMode);\n  const inUpsellMode = useSelector(eventInUpsellMode);\n  const dispatch = useDispatch();\n\n  const store = useStore();\n\n  useEffect(() => {\n    if (\n      [\n        'create',\n        'customize',\n        'details',\n        'gifting',\n        'preview',\n        'guests',\n        'review',\n      ].includes(path) &&\n      !inUpsellMode\n    ) {\n      document.body.classList.add('no-overflow');\n    }\n\n    store.dispatch({type: PROPAGATE_STEP_CHANGE});\n\n    return () => {\n      window.scroll(0, 0);\n      document.body.classList.remove('no-overflow');\n    };\n  }, [path]);\n\n  useEffect(() => {\n    const appHeight = () => {\n      document.documentElement.style.setProperty(\n        '--app-height',\n        `${window.innerHeight}px`\n      );\n    };\n\n    window.addEventListener('resize', appHeight);\n\n    appHeight();\n\n    return () => {\n      window.removeEventListener('resize', appHeight);\n    };\n  }, []);\n\n  const urlPath = getLastPathComponent(window.location.pathname);\n  const inPremiumPricingVariationC = isInPremiumPricingVariationC(\n    urlPath === 'create' && !window.fabricTemplate.premium\n  );\n  const sending = path === 'send';\n\n  useEffect(() => {\n    const fetchAllAssets = async () => {\n      const url = urls.get('ajax_get_all_assets');\n      const resp = await evite.fetch(url, {\n        method: 'get',\n        credentials: 'include',\n        headers: {Accept: 'application/json'},\n      });\n\n      const response = await resp.json();\n      const {\n        stamps: allStamps,\n        stickers: allStickers,\n        liners: allLiners,\n        backgrounds: allBackgrounds,\n      } = response;\n      const allEnvelopes = response.envelopes\n        ? response.envelopes.filter(({blank}) => !!blank)\n        : [];\n      dispatch({\n        type: SET_ALL_ASSETS,\n        payload: {\n          allAssets: {\n            allStamps,\n            allStickers,\n            allLiners,\n            allBackgrounds,\n            allEnvelopes,\n          },\n        },\n      });\n    };\n    fetchAllAssets();\n  }, []);\n\n  return (\n    <>\n      <TrackRouteChanges contentPanel={contentPanel} />\n      {(path !== 'preview' || !inEditMode) &&\n        (!inPremiumPricingVariationC || !sending) && <NavHeader />}\n      <div className={`root-page-wrapper ${path}`}>\n        <div className={`create-flow__page`} id={path}>\n          {(!hideInWebView || !isWebview()) && (\n            <>\n              <Switch>\n                <Route path={CONTENT_PATHS}>\n                  <ContentAsync contentPanel={contentPanel} />\n                </Route>\n              </Switch>\n              <Switch>\n                <Route\n                  exact={true}\n                  path={['/:template/create', '/:eventId/customize']}\n                  component={EventCreateDesignContainer}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/details']}\n                  component={EventDetailsAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/gifting']}\n                  component={EventGiftingAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/preview']}\n                  component={PreviewAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/guests', '/:template/guests']}\n                  component={EventGuestsAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/guest-options']}\n                  component={() => <GuestOptionsAsync fullscreen />}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/review', '/:template/review']}\n                  component={EventReviewAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/send', '/:template/send']}\n                  component={UpsellAsync}\n                />\n                <Route\n                  exact={true}\n                  path={['/:eventId/confirm', '/:template/confirm']}\n                  component={SuccessAsync}\n                />\n              </Switch>\n            </>\n          )}\n        </div>\n      </div>\n      {showFooter && <InjectableFooter />}\n    </>\n  );\n};\n\nconst FabricCreateInvitationAppWrapper = (props) => {\n  return (\n    <Provider store={store}>\n      <ModalProvider rootComponent={TransitionGroup}>\n        <RoktLauncherContextProvider\n          accountId=\"2835341786096105351\"\n          sandbox={window.roktSandbox}\n        >\n          <Elements stripe={stripePromise} options={stripeOptions}>\n            <Router history={history}>\n              <LoginModalReduxWrapper />\n              <FabricCreateInvitationApp />\n            </Router>\n\n            <ToastContainer\n              position=\"bottom-right\"\n              autoClose={6000}\n              hideProgressBar\n              newestOnTop={false}\n              closeOnClick\n              rtl={false}\n              pauseOnFocusLoss\n              draggable\n              pauseOnHover\n              icon={false}\n            />\n          </Elements>\n          <NotifyGuestsOverlay />\n        </RoktLauncherContextProvider>\n      </ModalProvider>\n    </Provider>\n  );\n};\n\nwindow.toast = toast; // TODO: Remove if toasts irrelevant here.\n\nReactDOM.render(\n  <FabricCreateInvitationAppWrapper />,\n  document.getElementById('fabric-create-invitation-root')\n);\n"],"names":["abs","Math","String","fromCharCode","Object","assign","trim","value","replace","pattern","replacement","indexof","search","indexOf","index","charCodeAt","begin","end","slice","length","array","push","line","column","position","character","characters","node","root","parent","type","props","children","return","copy","prev","next","peek","caret","token","alloc","dealloc","delimit","delimiter","whitespace","escaping","count","commenter","identifier","MS","MOZ","WEBKIT","COMMENT","DECLARATION","KEYFRAMES","serialize","callback","output","i","stringify","element","join","prefix","hash","compile","parse","rule","rules","rulesets","pseudo","points","declarations","offset","atrule","property","previous","variable","scanning","ampersand","reference","comment","declaration","ruleset","post","size","j","k","x","y","z","identifierWithPointTracking","fixedElements","WeakMap","compat","isImplicitRule","get","set","parsed","toRules","getRules","parentRules","removeLabel","defaultStylisPlugins","map","exec","match","options","key","ssrStyles","document","querySelectorAll","Array","prototype","forEach","call","getAttribute","head","appendChild","setAttribute","container","_insert","stylisPlugins","inserted","nodesToHydrate","attrib","split","currentSheet","collection","finalizingPlugins","insert","serializer","concat","selector","serialized","sheet","shouldCache","styles","cache","name","nonce","speedy","prepend","insertionPoint","registered","hydrate","reactPropsRegex","prop","test","fn","arg","undefined","hasOwnProperty","EmotionCacheContext","createContext","HTMLElement","CacheProvider","Provider","withEmotionCache","func","forwardRef","ref","useContext","ThemeContext","useInsertionEffect","create","useInsertionEffectMaybe","typePropName","createEmotionProps","newProps","Insertion","_ref","isStringTag","Emotion","cssProp","css","WrappedComponent","registeredStyles","className","createElement","Fragment","jsx","args","arguments","h","apply","argsLength","createElementArgArray","E","c","_len","_key","useLayoutEffect","keyframes","insertable","anim","toString","this","classnames","len","cls","toAdd","isArray","serializedArr","u","ClassNames","w","content","cx","_len2","_key2","rawClassName","merge","theme","T","ele","str","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","fontWeight","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","hyphenateRegex","animationRegex","isCustomProperty","isProcessableValue","processStyleName","styleName","toLowerCase","processStyleValue","p1","p2","cursor","handleInterpolation","mergedProps","interpolation","__emotion_styles","obj","string","interpolated","_i","createStringFromObject","previousCursor","result","cached","labelPattern","serializeStyles","stringMode","strings","raw","lastIndex","identifierName","StyleSheet","_this","_insertTag","tag","before","tags","nextSibling","firstChild","insertBefore","isSpeedy","ctr","_proto","nodes","createTextNode","createStyleElement","styleSheets","ownerNode","sheetForTag","insertRule","cssRules","e","flush","parentNode","removeChild","getRegisteredStyles","classNames","registerStyles","insertStyles","current","exports","React","emptyFunction","emptyFunctionWithReset","resetWarningCache","module","propTypes","shim","propName","componentName","location","propFullName","secret","err","Error","getShim","isRequired","ReactPropTypes","bool","number","object","symbol","any","arrayOf","elementType","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","factoryWithThrowingShims","ownKeys","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","_objectSpread2","target","source","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","Symbol","iterator","constructor","configurable","writable","_slicedToArray","arr","_arrayWithHoles","_s","_e","_arr","_n","_d","done","_iterableToArrayLimit","o","minLen","_arrayLikeToArray","n","from","_unsupportedIterableToArray","TypeError","_nonIterableRest","arr2","usePrevious","useRef","useEffect","isUnknownObject","PLAIN_OBJECT_STR","isEqual","left","right","leftArray","leftPlainObject","leftKeys","rightKeys","keySet","allKeys","l","r","every","extractAllowedOptionsUpdates","prevOptions","immutableKeys","reduce","newOptions","isUpdated","includes","console","warn","validateStripe","maybeStripe","elements","createToken","createPaymentMethod","confirmCardPayment","parseStripeProp","then","isPromise","stripePromise","Promise","resolve","stripe","ElementsContext","displayName","Elements","rawStripeProp","useMemo","_React$useState2","useState","ctx","setContext","isMounted","safeSetContext","prevStripe","updates","update","anyStripe","_registerWrapper","registerAppInfo","version","url","useElementsContextWithUseCase","useCaseMessage","useCase","parseElementsContext","ElementsConsumer","_ref2","useCallbackReference","cb","noop","createElementComponent","isServer","charAt","toUpperCase","Element","id","_ref$options","_ref$onBlur","onBlur","_ref$onFocus","onFocus","_ref$onReady","onReady","_ref$onChange","onChange","_ref$onEscape","onEscape","_ref$onClick","onClick","_ref$onLoadError","onLoadError","_ref$onLoaderStart","onLoaderStart","elementRef","domNode","callOnReady","callOnBlur","callOnFocus","callOnClick","callOnChange","callOnEscape","callOnLoadError","callOnLoaderStart","mount","on","destroy","__elementType","window","AuBankAccountElement","CardElement","CardNumberElement","CardExpiryElement","CardCvcElement","FpxBankElement","IbanElement","IdealBankElement","P24BankElement","EpsBankElement","PaymentElement","PaymentRequestButtonElement","LinkAuthenticationElement","ShippingAddressElement","AffirmMessageElement","AfterpayClearpayMessageElement","useElements","useStripe","factory","V3_URL","V3_URL_REGEX","EXISTING_SCRIPT_MESSAGE","stripePromise$1","params","reject","Stripe","script","scripts","src","findScript","queryString","advancedFraudSignals","headOrBody","body","injectScript","addEventListener","error","loadCalled","loadStripe","startTime","Date","now","registerWrapper","initStripe","captchaResponse","stateToBackendEventRepresentation","state","sendInvitations","details","giftingOptions","fabricTemplate","eviteEvent","fabricDesign","coverData","background","selectSelectedBackground","stamp","selectSelectedStamp","liner","selectSelectedLiner","envelope","selectSelectedEnvelope","widgets","gift_registry_name","gift_registry_urls","pledgeling_data","host_ids","selectHostIds","pending_host_ids","selectPendingHostIds","fabricArt","objects","Raven","setTagsContext","event","origin","status","template_name","templateName","fabric_design_data","host_name","host","phone_number","phoneNumber","event_type","cohost_name1","cohost","cohost_email1","email","guests_of_honor","guestsOfHonor","location_name","street_address","address","street","city","zip_code","zip","title","message","notes","start_datetime","start","XDate","formatTimezoneOffset","addWeeks","end_datetime","stop_datetime","stop","known_timezone_name","known_timezone_abbr","rsvp_off","gift_keywords","gift_list_url","wishlist","event_option_allow_invite_more","rendered_image_filename","rendered_image_gs_key","rendered_image_url","rendered_text_image_url","custom_image_id","uyoImageId","is_fabric_premium","isPremium","pledgeling_new_api","guessing_games_data","sent_on","last_updated","date_created","design","used_as","usedAs","envelope_flap_down","flap_down_image","envelope_flap_up","blank","envelope_front","image","name_style","align","color","text_color","font","x2","y2","media","label","liner_image","stamp_image","backgroundId","background_image_mobile","background_image_desktop","background_color","backgroundColor","envelope_fabric_stickers","envelopeStickers","log","dyo","removeNestedProperty","tracking_data","gallery_category","tracking_gallery_category","saveToBackend","delayFetchSummary","dispatch","getState","eventId","URL","eventRepresentation","evite","fetch","method","credentials","headers","cookie","Accept","JSON","resp","saveStatus","accept","event_id","captcha","sendResponse","json","jsonResponse","getElementById","style","display","CaptchaWrapper","challenge","onSubmit","_response","onCancel","show","ok","alert","results","updateEventIdInPathname","evite_event","SET_EVITE_EVENT","payload","setTimeout","fetchInvitationSummary","getCalc","store","fabricGreetingCard","guests","response","updateSelectedOffer","selectedOfferKey","offerListName","review","calc","postData","offer_data","offer_list_name","num_guests_being_added","urls","data","removeOffer","max_guest_list","offers","downgraded","custom_logo","custom_logos","event_option_show_gifting","checkoutInvitation","cardSourceId","selectedOffer","selectSelectedOffer","centsToBeCharged","card_source","card_token","selected_offers","cents_to_be_charged","productType","external_virtual_quantity","numGuestsBeingAdded","purchase_response","success","SET_ORDER_DATE","send_response","created","SET_PAYMENT_METHOD","pushDataLayerEventCache","updateSelectedOffers","selectedOffers","isStandalonePayment","errorDefault","FormData","append","checkoutInvitationPaypal","paypalData","checkout_type","stripe_charge_id","finishAndSend","saveEventThunk","numCaptchas","transactionData","purchase_transaction_data","stripe_charge","is_stripe_charge","purchase_platform","dataLayer","line_items","item","invoice_description","total","amount_display","tracking_product_type","updateUser","saveUserDataToLocalStorage","userLoggedIn","user_id","full_name","subscription_plan_name","avatar_disk","image_url","initials","first_name","applyPromotion","eviteEventId","promocode","offerName","center","padding","borderRadius","settings","width","captcha_event","retry","url_parameters","EviteModal","height","square","isActive","dataQaId","disabled","onClickHandler","useCallback","role","colors","highlight","mobile","selectedColor","setSelectedColor","colorsMemo","Typography","variant","AsyncComponent","exportName","loaderStyle","onLoad","redirectTo","selectedLiner","selectedStamp","canvas","forceShowEnvelope","useSelector","selectIsPremium","selectedEnvelope","useEnvelope","isDesktop","useMatchQuery","largishAndUp","matches","loaded","selectLoaded","isProOrPartyPass","selectIsProOrPartyPass","isMobile","navigate","useNavigator","disableAutoOpenEditor","Sections","CARD_DESIGN","setCurrentDimensions","envelopeSizer","offsetWidth","offsetHeight","removeEventListener","StickersCanvas","onConfirmColor","editorDisabled","selectEditorDisabled","isVisible","setIsVisible","toggleVisibility","prevState","handleColorChange","handleButtonClick","Popover","isOpen","positions","onClickOutside","HexColorPicker","containerClassName","clickOutsideCapture","PB_EyeDrop","ratio","extra","dark","as","icon","loading","setLoading","overflow","icons","selectedIcon","iconsMemo","Boolean","useDispatch","path","useCurrentRoute","showModal","loginModal","showLoginModal","LoginWrapper","onSignupSuccess","userId","fullName","subscriptionPlanName","avatarDisk","imgUrl","firstName","onLoginSuccess","onCloser","hideLoginModal","constants","SHOW_LOGIN_MODAL","HIDE_LOGIN_MODAL","userName","USER_LOGGED_IN","initialState","EventCreateContext","currentRoute","useStore","showLeaveModal","setShowLeaveModal","showUpsellModal","setShowUpsellModal","showExitPremiumPreviewModal","setShowExitPremiumPreviewModal","eventIsPremium","usedPremiumFeature","selectUsedPremiumFeature","showSteps","meta","countSteps","currentSection","selectCurrentSection","pristine","selectPristine","pristineUyo","selectPristineUyo","hasBeenSaved","getEventId","eventStepsType","getEventStepsType","totalSteps","eventStepCount","simpleNavObj","UPDATE_EVENT_DETAILS","preventUpdateModal","navigateToRoute","text","qaId","buttonVariant","toggleUpsellModal","changeToState","webViewModalShowing","showMegaNav","InjectableMegaNav","showSimpleNav","SimpleNav","onClosePremiumPreviewClick","defaultNavElem","Button","uyoImage","getObjects","find","isUyo","isError","PB_CloseLine","Diamond","linkPreview","linkBack","OnboardingModalButton","visible","isWebview","inPremiumPricingVariationC","isInPremiumPricingVariationC","ProgressBar","ConfirmLeaveModalContainer","isFirstStep","isEditingFlow","editing","leave","saveAndLeave","force","creating","cancelLeave","UpsellModal","noAutoRestore","closeOverlay","onConfirmAction","hideUpsell","SET_UPSELL_CONFIRMED","webViewPendingUpgradeToPremium","ExitPremiumPreviewModal","REVERT_TO_BASIC","UPDATE_DESIGN_OPTIONS","forceShowOnboardingModal","PB_QuestionCircleUnfilled","eventType","min","max","accountId","sandbox","launcher","setLauncher","Rokt","onload","createLauncher","launcherInstance","terminate","RoktLauncherContext","RoktLauncherContextConsumer","Consumer","upsellModalRef","UpsellDesktop","onClose","onDecline","onUpgradeClick","UpsellTrays","UPDATE_GIFT_OPTIONS","showGifting","ALL","GROUPS","TO","hostId","getEventHostId","loggedUserId","getLoggedUserId","detailsSelectors","selectTitle","selectHost","coHost","selectCohostName","notifyGuestsOverlayShowing","subject","setSubject","rsvpOff","selectRsvpOff","setMessage","to","setTo","confirmationType","HIDE_NOTIFY_GUESTS_OVERLAY","handleSend","q_message_type","virtual_groups","ResponsivePanel","CANCEL_NOTIFY_GUESTS_OVERLAY","secondaryText","primaryText","showCover","group","modifier","t","handleClick","margin","Input","history","createBrowserHistory","basename","promiseListeners","executor","successActionTypes","errorActionTypes","completed","promise","resolve_","reject_","action","finally","actionListener","GREETING_CARD_CHECKED_OUT","_store","ecomerce","selectEcommerceObject","pushDataLayerEcommerceObject","WHO_IS_COMING_MODULE","GIFTING_MODULE","DONATION_MODULE","POLL_MODULE","WHAT_TO_BRING_MODULE","displayOrder","rsvp","reminders","event_reminder_0","event_reminder_1","inStep2","pathname","eventDetails","locationName","streetAddress","zipCode","messageFromHost","hostName","_evite_event","videoChatType","video_chat_type","videoChatLink","video_chat_link","shortLink","shortlink","rsvpStyle","rsvp_style","allowGifts","registriesData","gift_registries_data","allowGuests","event_option_allow_guest_number","allowInviteMore","allowKids","event_option_allow_kids","maxGuests","event_option_max_guest_number","maxTotalGuests","event_option_max_guests","privateGuestlist","event_option_private_guestlist","hasPassed","event_has_passed","removeAds","remove_ads","pledgeling_added","pledgeling_beneficiary","pledgeling_beneficiary_type","pledgeling_category","pledgeling_goal","pledgeling_id","pledgeling_purpose","videoId","event_videos_id","pristineHostMessage","addrState","editedLocation","premiumDesign","user","openBack","closedBack","closedFront","imageDesktop","imageMobile","timezone","getTimezone","timezoneAbbr","timezoneId","template","isHost","hasRsvpd","guestEmail","gifting","UPDATE_INVITATION_SUMMARY","iconUrl","icon_url","vendorName","registry","display_order","gift_registry","registries","gf","giftKeywords","keywords","whatToBring","items","allowOther","creatorId","whatToBringSummary","participants","listId","guestList","rsvpCounts","adults_yes","adults_maybe","kids_yes","kids_maybe","yes","maybe","no","no_reply","rsvpDetails","whoIsComing","isPrivateGuestlist","guestPreviews","adults","guestName","kids","rsvpComment","rsvpWhen","addDays","donation","donations","UPDATE_PLEDGELING_OPTIONS","donation_url","pledge_url","pledge_key","found","TURN_ON_DONATION_LOADING","TURN_OFF_DONATION_LOADING","hasDonations","poll","polls","moduleSet","Set","delete","whatToBrings","moduleOrder","FirstStepLeaveModal","ConfirmLeaveModal","EditionFlowLeaveModal","CreationFlowLeaveModal","createSteps","showBackButton","customize","nextRoute","previousRoute","saveOnLeave","nextButtonText","hideInWebView","nextRouteAvailableSelector","selectIsDirty","preLeaveRouteFunction","validateEventDetails","preview","userHasActivePremiumPass","isUpsellMode","send","setInEditMode","showFooter","confirm","exit","referrer","freemiumSteps","freeSteps","routeName","freeWithGuestsSteps","freemiumWithGuestsSteps","PREMIUM","FREEMIUM_WITH_GUESTS","FREEMIUM","numSteps","FREE_WITH_GUESTS","FREE","eventSteps","premium","saveAndSendGuestsMessage","some","includesPath","savingStep","NotifyGuestsOverlayPromise","editSteps","showBottomNav","isPremiumTemplate","upsellConfirmed","modals","hideBottomNav","preEnterRouteFunction","getNavigationSteps","inEditMode","getCurrentStep","navigationSteps","lastPathComponent","getLastPathComponent","eventInEditMode","useLocation","currentStep","nextStep","nextStepAvailable","nextStepPreEnterRouteStatusMessage","preEnterRouteStatusMessage","previousStep","nextPath","previousPath","nextButtonComponent","backToGallery","back","webViewSetBusy","isGuamWebviewOrLater","webViewSetShouldUserLogIn","loginModalPromise","origEventId","newEventId","webViewSetEventId","trackEventId","route","webViewOnNav","historyPush","webview","components","getGalleryUrl","urlParams","URLSearchParams","category","page","qsArrayTransform","destination","greetingCardId","greetingCardDetails","href","selectEventDetailsValid","request","failed","initGuestsOfHonor","guest","pending","rsvp_optional","hasUpgraded","isProOrPartyPassUser","INIT_APP","override_freemium","category_event_type","category_id","is_upgrade","selectRequestFailed","selectType","selectStart","selectEventDateHasPassed","selectRequiredComplete","selectCohostEmail","selectCohostEmailValid","valid_email","is_valid","selectCohostNameError","selectValidCohost","selectCohostEmailMissing","selectPhoneNumber","selectPhoneNumberIsValid","parse_us_phone_number","selectStartDateBeforeEndDate","getTime","time","rest","flattened","values","diffDays","UPDATE_EVITE_EVENT","host_id","originalFabricArt","silver","stampId","envelopeId","linerId","touched","hasTextbox","editingMobile","editingUyoMobile","textAreaOpen","uyoImagePath","recentTextColors","defaultBackgroundColor","defaultEnvelope","defaultStamp","defaultLiner","_first_matching_art","art","category_list","editable_art","stamps","envelopes","liners","premiumFeaturesPristine","premiumFeaturesWarning","ignorePremiumWarning","SET_UPLOADED_IMAGE","imageKey","allFieldsEdited","allEnvelopes","allStamps","allLiners","allBackgrounds","bg","artist","backgrounds","editableArt","default","metaDescription","snapshot","stickers","SET_FABRIC_TEMPLATE","SET_TEMPLATE_SNAPSHOT","_t","allStickers","display_name","meta_description","rsvpOptional","SET_ALL_ASSETS","allAssets","halloweenStamps","dn","TEMPORARY_STAMP_ASSET_ORDERING","stampOrder","a","b","halloweenStickers","TEMPORARY_STICKER_ASSET_ORDERING","stickerOrder","halloweenLiners","TEMPORARY_LINER_ASSET_ORDERING","linerOrder","sort","Crowdfund","Organization","upgraded","pledgeling","beneficiary_type","purpose","goal","pledgeling_data_item_id","additional_data","pledgeling_uuid","beneficiary_uuid","beneficiary_id","composeEnhancers","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","middleWares","thunk","dataLayerMiddleware","promiseResolverMiddleware","previewTransformMiddleware","createStoreWithMiddleware","applyMiddleware","createStore","rootReducer","SHOW_NOTIFY_GUESTS_OVERLAY","showNotifyGuestsOverlay","SET_UPSELL_MODAL_ORDER","sectionToRemove","combineReducers","UPDATE_NAME_ON_CARD","nameOnCard","UPDATE_REVIEW","UPDATE_PAYMENT_TYPE","paymentType","UPDATE_CARD_NUMBER_LAST_FOUR","cardNumberLastFour","UPDATE_CARD_ENCRYPTED","encryptedCard","UPDATE_CARD_NUMBER_FILLED","cardNumberFilled","UPDATE_CARD_EXP_DATE_FILLED","expDateFilled","UPDATE_CARD_CVC_FILLED","cardSecurityCodeFilled","UPDATE_BILLING_ZIP","billingZip","TOGGLE_PROMO_CODE","hasPromoCode","promoCode","UPDATE_SELECTED_OFFER_KEY","INIT_OFFERS","SET_CALC","availableOffers","TOGGLE_USE_EXISTING_PAYMENT","SET_USE_EXISTING_PAYMENT","useExistingPaymentOnFile","SET_UPDATING_PAYMENT_CALC","isUpdatingPaymentCalc","INVITATION_CHECKED_OUT","checkedOut","GREETING_CARD_E_GIFT_CHECKED_OUT","e_gift_purchase_response","orderDate","paymentMethod","eventHostName","UPDATE_SENDER","TOGGLE_DELIVER_CARD_NOW","deliverCardNow","deliveryCardDateTime","dayPlusOne","UPDATE_DELIVER_CARD_DATE_TIME","UPDATE_DELIVER_CARD_TIMEZONE","RESET_REVIEW","date","setMinutes","setSeconds","send_on","floor","checkDateIsTodayOrBefore","offerKey","selectVirtualQuantity","virtualQuantity","selectDisplayPrice","displayPrice","selectPromoCode","selectPromoType","promoType","selectPurchaseChargeId","charge_id","selectTransactionId","transaction","selectEcommerceDisplayPrice","substring","selectEcommerceProduct","quantity","price","brand","actionFieldDefaults","affiliation","tax","shipping","selectActionField","revenue","actionField","products","purchasePrice","transaction_id","ecommerce","offer_id","offerId","webViewSetIsPremium","CREATE_EDIT_POLL","CREATE_EDIT_WTB","defaultContextValue","setCanvas","activeObjects","setActiveObjects","sectionComponentsMap","EventCreateEditor","BACKGROUND","BackgroundContainer","ENVELOPE_LINER","EnvelopeContainer","STAMP","StampContainer","sectionEditMobileMap","CardEditorMobile","BackgroundEditorMobile","EnvelopeEditorMobile","StampEditorMobile","EventCreateDesign","selectEditingMobile","selectBackgroundColor","selectPremiumFeaturesWarning","Section","NavBottomMobile","selectedBackground","useBackground","shiftPressed","leftIntervalRef","rightIntervalRef","upIntervalRef","downIntervalRef","discardActiveObject","requestRenderAll","onSelectionEvent","onKeyDown","repeat","which","keyCode","setInterval","moveSelected","onKeyUp","clearInterval","fabric","util","addListener","removeListener","direction","activeObject","getActiveObject","stepLength","top","setCoords","renderAll","backgroundImage","backgroundSize","NavBottom","EventCreateParent","Onboarding","EventCreateStampParent","selectFabricArt","Envelope","Card","Container","Background","BackgroundEditor","backgroundIcons","onColorChange","onTextureChange","EditBox","textColorOptions","EditorContainer","MobileBox","selectBackgrounds","selectBackgroundId","selected","selectTouched","checkIfTheresAImageSelected","active","getActiveObjects","el","TextEditor","ResetStyle","menuMappingKeys","FONT_STYLE","Dropdown","FONT_SIZE","TextSize","COLOR","ColorPicker","TEXT_FORMAT","TextFormat","SPACING","LetterSpacing","LineHeight","setText","changeText","exitEditing","onTextEditingEntered","hiddenTextarea","onTextChangeHandler","select","showMenu","setShowMenu","activeMenu","setActiveMenu","onClickMenu","scrollToTop","querySelector","scrollTo","behavior","onClickCloseHandler","onCloseEditorClick","canvasWrapper","clientHeight","ContentBase","resetDataQaId","closeDataQaId","onCloseClick","FontsMobile","SpacingHeight","bodyStyle","paddingRight","UyoEditor","MobileButton","PB_Keyboard","KEYBOARD","PB_Font","PB_FontSize","PB_TextColor","fill","PB_TextFormat","PB_LineHeight","noBodyPadding","onResetClick","hideResetButton","tabs","LETTER_SPACING","component","LINE_HEIGHT","activeTab","setActiveTab","onTabClick","tab","originalText","setOriginalText","selectTextAreaOpen","closeEditor","autoFocus","isUyoSelected","onCloseUyoHandler","currElement","scale","findScaleToCover","_originalObject","angle","UYO","flexDirection","paddingBottom","ImageSize","UyoImageRotate","UploadButton","DoneButton","setColor","onChangeHandler","fire","onInputColorChange","EyeDropper","newArray","pop","RecentColors","Divider","marginTop","marginBottom","selectedFont","fonts","RECOMMENDED_FONTS","rf","option","FontItem","selectedValue","setSelectedValue","wrapperRef","updateValue","mapFabricFontToLocal","fontFamily","fontStyle","toggleDropdown","stopPropagation","closeMenu","useOutsideAlerter","family","weight","UpDownChevron","up","RecommendedFonts","FontsDropdown","placeHolder","isNil","scrollIntoView","block","inline","PB_Checkmark","emeraldWebText","AllFonts","PB_Chevron","convertKnownFontWeight","fabricFontFamily","fabricFontStyle","fabricWeight","selectedFontFamily","selectedFontStyle","selectedWeight","setValue","uyoImg","scaleX","detectPinchGesture","scaleFactor","setNewValue","newScale","Number","MIN_IMAGE_SIZE","MAX_IMAGE_SIZE","step","onLocalChange","hasControls","hiddenInput","charSpacing","setCharSpacing","suffix","setLineHeight","resetElement","newObject","originalObject","fabricToStyleMapping","prevValue","currValue","toSentenceCase","selectedAlignment","setAlignment","textAlign","changeAlignment","leftAlignment","middleAlignment","rightAlignment","PB_LeftAlign","PB_MiddleAlign","PB_RightAlign","Icon","emerald","charcoal","currentLetterCase","setCurrentLetterCase","letterCasing","operation","letterCasingMapping","_originalText","actions","upper","lower","capitalize","word","checked","fontSize","changeTextSize","onObjectScaled","changeFontSize","MIN_FONT_SIZE","MAX_FONT_SIZE","scaleY","forEachObject","inputEditable","imageFileUpload","file","toastAlert","PB_AlertLine","mexicanOpalWebText","autoClose","hideProgressBar","closeOnClick","pauseOnHover","draggable","progress","gcsUploadArgs","gcsPathId","GCS_PATH_IDS","anonymous_image","image_id","gcsUploadImage","processing","setProcessing","fileRef","setUYOImage","img","toJSON","rect","Rect","selectable","insertAt","originX","originY","centeredRotation","remove","setActiveObject","onChangeImage","files","gcsPath","UYOImage","fromURL","click","hidden","PB_UploadSquare","setStyles","selectUyo","_mouse","getPointer","texts","pointer","_searchPossibleTargets","containsPoint","positionBtn","getCenterPoint","getZoom","overrideFindTarget","upperCanvasEl","findTarget","skipGroup","skipTargetFind","_activeObject","aObjects","isTouch","isTouchEvent","shouldLookForActive","targets","_findTargetCorner","_objects","altSelectionKey","bind","imageUploadedCallback","textbox","positionBtnHandler","PB_Rotation","rotate","getHeight","getWidth","controlPosition","localValue","setLocalValue","calculatePercentage","setBackgroundSize","parseNumber","isNaN","calculateValue","onLocalChangeHandler","targetValue","onBlurHandler","newValue","parseFloat","PB_Minus","PB_Plus","isInvalid","inputMode","setChecked","toggleChecked","removeElements","lodash","omit","showTooltip","setShowTooltip","selectOriginalFabricArt","selectHasTextbox","firstTime","ctaWordings","getUsedAsTypeName","saveSnapshot","onCanvasLoadHandler","Uyo","UyoControl","Tooltip","Canvas","configJson","objectTextFilter","modifiedObjects","originalObjects","useLiners","EnvelopeEditor","envelopeIcons","onEnvelopeChange","linerIcons","onLinerChange","selectEnvelopes","selectEnvelopeId","selectLiners","selectLinerId","CardTemplate","CardEditorDesktop","selectIsPremiumTemplate","selectIsUpsellConfirmed","valid","selectPremiumFeaturesPristine","selectIgnorePremiumWarning","selectSavingStep","isFullDyo","selectIsFullDyo","stopSubmitting","errorState","toastId","upgradeAndContinue","NavButton","CardDesign","section","onClickClose","Mail","highLight","premiumFeature","PostStamp","DiagonalLines","loadingMessage","DiamondFill","selectTemplateName","currentIndex","setCurrentIndex","local","open","setOpen","selectForceShowOnboardingModal","activeIndexCallbackHandler","Overlay","steps","modalId","closeOnClickOutside","closeOnEscKeyPress","overlayCloseBtnDataQAId","overlayDataImpressionTracking","Carousel","activeIndexCallback","onClickDone","CarouselItem","Step","subtitle","video","activeIndex","setActiveIndex","updateIndex","newIndex","numberOfItems","Children","handlers","useSwipeable","onSwipedLeft","onSwipedRight","transform","Controller","quantityOfItems","lastItem","dotsMemoized","dots","videoRef","videoCurrentRef","pause","currentTime","play","autoPlay","preload","playsInline","muted","loop","EventCreateStampContext","useStamp","stampIcons","onStampChange","Stickers","refreshCanvasDimensions","Stamp","StampEditor","selectEnvelopeStickers","CanvasStickers","selectStamps","selectStampId","selectStickers","setDisabled","filterIconImage","previousValue","currentValue","stickersIcons","imagesMap","addElementToCanvas","isGif","add","requestAnimFrame","render","onClickStickerHandler","gif","fabricGif","originalUrl","Image","myImg","scaleToWidth","hasCloseButton","localVisible","setLocalVisible","handleClickOutside","contains","PATHNAMES","TRAYS","UpsellFooter","fullWidth","UpsellHeader","desktop","largeScreens","selectUsedAs","Trays","trays","s","findIndex","p","toggle","heading","pathName","Tray","UpsellAnimation","poster","controls","dl_push","ev","track_event","cookieData","eventCache","entries","origDomain","hostname","domain","ecommerceObject","onPinch","initialDistance","previousDistance","currentScale","calculateDistance","touch1","touch2","dx","clientX","dy","clientY","hypot","handleTouchStart","touches","preventDefault","handleTouchMove","currentDistance","clampedScale","handleTouchEnd","getOrSetVariation","experiments","shouldShowPremiumPricingFeaturesInWebview","webkit","messageHandlers","pendingUpgradeToPremium","bucketUser","reduxPromise","extractTab","previousTab","page_title","page_path","pathObj","isDraft","prevIsPremium","prevPathName","event_is_draft","fabricCreateOnNav","closeGuestOptionsMenu","postMessage","modalIsShowing","newStep","prevStep","nextStepLabel","busy","fabricCreateSetBusy","fabricCreateSetEventId","fabricCreateIsPremium","setShouldUserLogIn","webViewSetDowngradeSaveStatus","statusCode","setDowngradeSaveStatus","webViewSetPostCheckoutSaveStatus","setPostCheckoutSaveStatus","webViewSetSendCompleteStatus","setSendCompleteStatus","downgradePremium","checkoutComplete","sendComplete","acceptPostSendUpsell","postLoginSuccess","newUrlParams","has","arrayStr","replaceAll","LoginContainer","setEmail","password","setPassword","loginFailure","setLoginFailure","emailError","setEmailError","forgotPasswordSentModalOpen","setForgotPasswordSentModalOpen","complete","showHostMessage","hideForgotPasswordSentModal","largeScreen","isModal","forgotPasswordMode","onCloseModal","Link","event_title","lgWindow","onGoogleLoginClick","onFacebookLoginClick","onAppleLoginClick","$","ajax","email_forgot","dataType","xhr","errorstr","responseText","validateEmail","user_identifier","is_logged_in","trackUserId","onSuccess","localStorage","removeItem","handlePwReset","placeholder","autoComplete","onForgotPasswordCancel","onForgotPasswordClick","onCreateAccountClick","setForgotPasswordMode","signupOrLogin","setSignupOrLogin","passwordResetOpen","setPasswordResetOpen","onCloseHandler","onGoogleConnect","when","signInView","google_plus_connect","onConnect","getURLParameter","onFacebookConnect","facebook_connect","onAppleConnect","apple_connect","SignupModal","onSignInClick","privacyPolicyHref","termsHref","ResetPasswordModal","setIsOpen","handleClose","guest_id","getMessages","SET_NEW_MESSAGES","postId","getAPI","apiFetcher","DELETE_POST","EDIT_POST","gid","SET_AVATARS","successCallback","failureCallback","UPDATE_GUESTLIST","FETCH_PHOTOS","FETCH_SINGLE_PHOTO_POST","FETCH_WTB","guestId","LIKED_POST","POST_REPLY","wtbListId","itemId","itemName","WTB_UPDATED","refresh","WTB_REMOVE_OTHER","WTB_REMOVE_USER_SIGNUP","isReaction","trackSubmitedRSVP","SUBMIT_RSVP","updateGuestId","updateUserId","updateRsvp","trackInviteRSVP","optin","selectAvatar","fetchAvatarsByUserId","SUBMIT_RSVP_FAILED","UNLIKED_POST","notifications","GUEST_NOTIFICATIONS_UPDATED","pollId","pollAction","POLL_VOTE_UPDATED","variation","FETCH_INVITATION_SUMMARY_STARTED","FETCH_INVITATION_SUMMARY_FAILED","user_ids","UPDATE_AVATARS","dispatchActions","actionPayload","resource","startAction","successAction","failureAction","retries","contentType","avatars","data_layer","userAvatars","avatarsFetched","messaging","stores","rsvpResponse","YES","NO","MAYBE","hasNewMessages","has_unread","rsvp_details","newPosts","_rsvpsFromGuestList","post_id","_extractPost","replies","reply","likedBy","parentPostId","parentPost","replyPost","replyId","replyIds","updatedPost","filteredReplies","posts","photo","singlePost","parentId","liked_by","guest_name","creator","last_name","photoUrl","post_type","creator_id","rsvp_comment","creatorName","viewDate","date_viewed","rsvp_when","comment_when","parent_id","mentions","postType","invite_rsvp_response","invite_rsvp_optin","pollEvent","isCard","eventHasPassed","isCancelled","CaptchaDialog","renderAjaxErrorModal","responseJson","is_host_viewing","VIDEO_CHAT_TYPE_EVITE","VIDEO_CHAT_TYPE_CUSTOM","VALID_VIDEO_CHAT_TYPES","is_premium","is_mobile_site","is_card","hasStatus","isServerError","responseTextMessage","consoleTitle","modal_ajax_error_handler","is_preview","needsRsvp","toEarly","isJoined","isVideoChatTabOpened","isVideoChatEnabled","maxNumHoursBefore","startDateTime","convertToIso","diffHours","allowEmpty","mountedRef","disableProcessing","override","tight","noTextWrap","onMouseEnter","onMouseLeave","formSubmit","processingChildren","marginLeft","marginRight","DropdownIndicator","SingleValue","selectProps","getValue","CustomInput","readOnly","readonly","isClearable","times","setTimes","ariaLabel","setTimeQAData","timeRef","inputRef","dataset","htmlFor","required","tooltipContent","placement","trigger","overlay","overlayClassName","getTooltipContainer","PB_Info","startAdornment","provided","control","isFocused","isDisabled","paddingLeft","borderColor","feedbackError","coin","borderWidth","fog","linen","indicatorSeparator","opt","_","menuPlacement","isSearchable","isValidNewOption","endAdornment","maxLength","rows","onKeyPress","onPaste","thickness","buttonClass","overlayRef","escHandler","handleOutsideClick","fullPage","popupWidth","defaultProps","backArrow","titleVariant","capitalizedTitle","titleArray","PB_Arrow","inToastButtonConfig","toastFunc","toast","v4","Toast","onDismiss","dismiss","buttonText","onButtonClick","Colors","fontColor","mexican_opal","StyledDynamicComponent","styled","LoadingOverlay","isLarge","largeAndUp","mdWindow","showHeader","closeQaId","PanelHeaderRow","showAd","adToShow","footerAd","Footer","MegaNavAsync","defaultModalProps","closeTimeoutMS","ReactModal","setAppElement","combinedProps","ResponsiveModal","primaryAction","showSecondary","secondaryAction","showSpinner","actionText","Spinner","classList","getModalChildren","SlideoutPanel","Modal","EviteLogo","userData","isAuthenticated","userDataObj","timestamp","setItem","checkIfUserDataIsValid","isUserAuthenticated","isAdminNotLoggedIn","isAdmin","checkIfAdminIsLoggedIn","ttl","getItem","loadUserDataFromLocalStorage","user_initials","user_avatar_disk","user_img_url","setCanvasElem","canvasEl","canvasRef","canvasWrapperRef","canvasInstance","canvasSizer","cs","getComputedStyle","paddingX","paddingY","paddingTop","borderX","borderLeftWidth","borderRightWidth","borderY","borderTopWidth","borderBottomWidth","rationHeight","calcCanvasRation","setDimensions","setViewportTransform","useCanvas","initAligningGuidelines","detects","canvasElementSelector","isEmpty","fabricJson","canvasWidth","canvasHeight","saveCanvas","toDataURL","enableRetinaScaling","dispose","includeDefaultValues","selection","setZoom","reviver","loadFromJSON","loadCanvas","imageRef","isFree","useCanvasImage","hasKeyword","hasTitleUyo","hasImgId","backgroundRepeat","generateImage","dataUrl","delay","frameWidth","framesLength","imgOptions","Gif","sprite","getElement","framesIndex","performance","naturalHeight","mode","_render","drawImage","dirty","getStatus","maxWidth","maxHeight","maxDuration","gifToSprite","fabricGifFromBase64","reader","FileReader","onerror","readAsArrayBuffer","arrayBuffer","frames","decompressFrames","parseGIF","dataCanvas","dataCtx","getContext","frameCanvas","frameCtx","spriteCanvas","spriteCtx","dims","acc","cur","duration","splice","ceil","frame","frameImageData","createImageData","patch","putImageData","disposalType","clearRect","getSelectionContext","aligningLineWidth","aligningLineColor","viewportTransform","drawHorizontalLine","coords","drawLine","x1","y1","save","lineWidth","strokeStyle","beginPath","moveTo","lineTo","stroke","restore","isInRange","value1","value2","round","verticalLines","horizontalLines","canvasObjects","activeObjectCenter","activeObjectLeft","activeObjectTop","activeObjectBoundingRect","getBoundingRect","activeObjectHeight","activeObjectWidth","horizontalInTheRange","verticalInTheRange","objectCenter","objectLeft","objectTop","objectBoundingRect","objectHeight","objectWidth","setPositionByOrigin","Point","clearContext","Control","offsetX","offsetY","cursorStyle","mouseUpHandler","eventData","clone","cloned","renderIcon","PB_Duplicate","cornerSize","touchSizeX","touchSizeY","sizeX","sizeY","allObjects","allActiveObjects","filterTextBoxes","containPicture","textObjectsToBeRemoved","textObj","PB_Delete","withConnection","actionName","actionHandler","controlsUtils","rotationWithSnapping","extend","Textbox","fromObject","stylesFromArray","objCopy","promises","load","allSettled","_fromObject","createClass","initialize","callSuper","toObject","propertiesToInclude","loadImage","enterEditing","setControlsVisibility","tl","mt","tr","ml","mr","bl","mb","br","mtr","hoverCursor","moveCursor","touchCornerSize","editingBorderColor","tanzanite","rotationControl","removeControl","cloneControl","transparentCorners","cornerStrokeColor","cornerColor","white","_renderBackgroundOrOverlay","StaticCanvas","_originalElement","DEFAULT_WIDTH_DESKTOP","DEFAULT_HEIGHT_DESKTOP","preserveObjectStacking","DEFAULT_CARD_ZOOM","crossOrigin","setImage","setLoaded","clear","fillStyle","styleOverride","fabricObject","arc","PI","cloud","translate","degreesToRadians","ORIGIN_DICT","AG","CEC","CMM","AOLMAIL","VISAFT","YMAIL","EVT","NEO","EVITE","SPD","IOS","POSTMARK","PLANS","ANDROID","GENESIS","IOS2","ANDROID2","GIFTING","GREETINGCARD2","FABRIC","FABRICGREETINGCARD","CARD_ORIGINS","FABRIC_EVENT_ORIGINS","FABRIC_GRC_ORIGINS","LEGACY_GRC_ORIGINS","LEGACY_PREMIUM_ORIGINS","fetchContactsThunk","returnAll","per_page","MAX_SAFE_INTEGER","searchParams","selectContactsParams","contacts","letters","all_are_guests","contact_groups","UPDATE_GUESTS","fetchGuestsListThunk","getAll","guestListParams","updatedParams","url2","searchParams2","resp2","sent","paginatedResponseInit","checkIfContainsRecipients","UPDATE_GUESTS_UI","contact_group_id","contactsParams","addGuestsThunk","ui","req","adding","fetchGuestsImportThunk","current_page","deleting","curr_page","previousPage","contact","invite_method","phone","import_method","q","uploading","selectImportParams","import_search_string","imports","loadingAddressBook","importing","googleAddressBook","deleteContactsFromListUrl","deleteImportsFromListUrl","deleteAllDraftContactsFromListUrl","toggleAllContactsThunk","guestsToBeAdded","invited","is_invited","newGuestsToBeAdded","uniqWith","paginationParams","eventsParams","sortTypes","event_date_desc","event_date_asc","title_desc","title_asc","events","fetchEventGuestListThunk","eventGuestListParams","source_event_id","eventGuestList","addingGuest","cleanGuestsToBeAdded","validGuestsToBeAdded","isEmail","isPhone","validGuestsAdded","addGuestsPreCondition","hasGuests","alphabet","has_next","num_pages","eventGuestListResponseInit","summary","maybe_count","no_count","undecided_count","yes_count","search_by","search_type","sort_by","reverse","search_param","events_per_page","search_string","past_events_only","guestOptions","eviteGuestList","eviteAddressBook","newGuestContact","eventsListScroll","showShareableLinkBanner","hasGiftCard","UPDATE_CONTACT_GROUP_ID","cd","client_data","emailMd5","evc_h","emailSha256","evc_s256l","is_authenticated","user_phone_number","query","listeners","windowSizeQuery","matchMedia","setMatches","handleWindowResize","listener","__webpack_public_path__","process","event_video","event_custom_logo","video_preview_image","user_profile_photo","event_photo_insert","event_custom_image","premium_custom_stamp","feed_photos","getImageKeyFromPath","m","redirect","forceImageKey","mimetype","request_access","uploadRequest","upload_file_gcs","upload_path","statusText","resizeImageAndUploadToGcs","imageType","dimensions","form_data","onProgress","customXHR","XMLHttpRequest","upload_url","upload_form","upload","isIE","isEdge","onprogress","res","upload_gcs_finish","gcs_path","viewBox","xmlns","d","xmlnsXlink","patternContentUnits","xlinkHref","roseWebText","dataId","bgColor","ghost","strokeLinejoin","shapeRendering","rotateFromRight","rx","gradientUnits","stopColor","fillRule","clipRule","pluralize","capitalizeFirstLetter","insertAfter","newNode","htmlFromString","div","innerHTML","popupWindow","defaultOptions","resizable","scrollbars","toolbar","dependent","window_name","location_bar","status_bar","opts","left_position","top_position","screen","align_value","win","eval","focus","MAX_EMAIL_LENGTH","error_code","error_message","ret_email_invalid","phone_number_text","digits","_get_digits_from","is_standard_length","is_1_prefixed_standard_length","formatted","_format_to_us_phone_number","normalize_phone_number","phone_number_string","string_with_digits","pretty_format_phone_number","phone_digits_string","mock_location_search","RegExp","decodeURIComponent","hasStringInUrl","urlArr","parseParams","re","decodeRE","decode","v","stringifyParams","paramList","encodeURIComponent","addParamsToUrl","currentQuery","keyNames","idx","val","isFunction","Function","isJson","isStringEmptyOrAllWhitespace","inputString","numberWithCommas","areEqual","otherArray","isValidURL","url_string","pad","createUtcOffsetFromDate","sign","getTimezoneOffset","TIMEZONES","localUtcOffset","utc_offset","timezone_id","timezone_abbr","hasRegistry","has_gift_registries","registry_urls","registry_name","registryUrl","qa_id","changePage","newPage","virtualPageview","pageTitle","propertyName","start_formatted","end_formatted","dateFormat","getFullYear","parseInt","templateDates","cents","neg","cityZip","dateTimeStr","year","month","hour","sec","_startDateTime","_endDateTime","timeFormat","startDateStr","endDateTime","dateFormatStr","timeFormatStr","isValidStart","isValidEnd","startTimeStr","datesLineOne","datesLineTwo","endDateStr","endTimeStr","is_invite","shallowEqual","hostUserId","utils","isPreview","cmsUrl","SocialButtons","MobileApps","NewsletterSignup","BlockThisHost","LegalCopy","currentYear","rel","isIOS","appLandingForWeb","googleUrl","iosUrl","buttonsToShow","alt","isSmallButton","subscribeMessage","subscribeButtonMessage","inputValue","setInputValue","showFeedback","setShowFeedback","messageText","setMessageText","isSuccess","setIsSuccess","ariaProps","feedbackBlock","handleAjaxResponse","removeClass","email_addr","marketing_source","timeout","textStatus","errorThrown","responseJSON","addClass","PB_SocialFb","pebble","PB_SocialTwi","PB_SocialPin","PB_SocialIg","PB_SocialYt","modalBody","modalTitle","ModalAjaxError","popup","buttons","PopupModal","html","dialog","clickOutside","defaults","modal","modalInner","modalContent","close","closeAction","dataAttribute","class","loadClass","closeKeys","transitions","transitionEnd","onBeforeOpen","onBeforeClose","onOpen","allowClose","throwError","getNode","skipError","cn","allMatches","ownerDocument","ModalBase","currentInstance","parser","openCloseQueue","closeTransitionHandler","resolveTransition","closeModal","loader","EviteLoadingModal","DOMParser","closeKeyHandler","outsideClickHandler","delegateOpen","delegateClose","listen","modalInstance","filteredArray","dom","getDomNodes","addLoadedCssClass","removeAttribute","activeElement","blur","releaseNode","getElementContext","captureNode","setOpenId","scrollY","lastInput","hasTransition","detectTransition","closeModalWithTransition","removeOpenId","childNodes","doCancel","closeNode","matchedNode","isListening","unlisten","useSettings","page_event","on_response","onResponse","footer","modalHead","buttonLocators","buttonsDataImpression","fetchContent","forceDesktop","_query_string","catch","parseContent","parseFromString","injectContent","parseDependencies","link","scriptTag","buildScriptTag","async","buildFromResponse","serverResponse","modalDom","respond","guid","getInstance","buildContainer","overwrites","ow","closeBtn","cssText","ret","parent_url","encodeUrlParams","buttonMarkup","button_markup","button","buttonLocator","buttonDataImpression","buttonId","dataImpression","self","respondToPopup","currentTarget","innerText","buttonsEl","msg","htmlResponse","buildPopup","buildRemote","loadingModalDefaults","contents","cancel","hasOwn","classes","argType","inner","f","clsx","vendorPrefix","jsCssMap","Webkit","Moz","ms","O","getVendorPrefix","getTransitionName","getTransformName","setTransitionProperty","transitionProperty","setTransform","getComputedStyleX","matrix2d","matrix3d","forceRelayout","elem","originalStyle","getScroll","documentElement","getScrollLeft","getScrollTop","getOffset","pos","box","doc","docElem","getBoundingClientRect","clientLeft","clientTop","getClientPosition","defaultView","parentWindow","isWindow","getDocument","nodeType","_RE_NUM_NO_PX","RE_POS","CURRENT_STYLE","RUNTIME_STYLE","LEFT","getOffsetDirection","dir","useCssRight","useCssBottom","oppositeOffsetDirection","setLeftTop","presetH","presetV","horizontalProperty","verticalProperty","oppositeHorizontalProperty","oppositeVerticalProperty","originalTransition","originalOffset","old","preset","off","_dir","_off","each","isBorderBoxFn","computedStyle","getPropertyValue","rsLeft","pixelLeft","BOX_MODELS","CONTENT_INDEX","PADDING_INDEX","BORDER_INDEX","getPBMWidth","domUtils","getParent","getWH","ex","viewportWidth","viewportHeight","docWidth","docHeight","borderBoxValue","isBorderBox","cssBoxValue","borderBoxValueOrIsBorderBox","refWin","documentElementProp","compatMode","cssShow","visibility","getWHIgnoreDisplay","swap","mix","first","includeMargin","getWindow","ignoreShake","oriOffset","oLeft","toFixed","oTop","tLeft","tTop","useCssTransform","originalXY","matrix","getTransformXY","resultXY","xy","match2d","setTransformXY","setTransform$1","setOffset","getWindowScrollLeft","getWindowScrollTop","getOffsetParent","positionStyle","nodeName","getParent$1","getVisibleRectForElement","alwaysByViewport","visibleRect","Infinity","bottom","navigator","userAgent","clientWidth","originalPosition","scrollX","documentWidth","scrollWidth","documentHeight","scrollHeight","overflowX","innerWidth","overflowY","innerHeight","isAncestorFixed","maxVisibleWidth","maxVisibleHeight","getRegion","outerWidth","outerHeight","getAlignOffset","region","V","H","getElFuturePos","elRegion","refNodeRegion","targetOffset","diff","isFailX","elFuturePos","isFailY","flip","reg","flipOffset","convertOffset","offsetLen","normalizeOffset","doAlign","tgtRegion","isTgtRegionVisible","newOverflowCfg","fail","newElRegion","adjustX","adjustY","newPoints","newOffset","newTargetOffset","isCompleteFailX","_newPoints","_newOffset","_newTargetOffset","isCompleteFailY","isStillFailX","isStillFailY","_newPoints2","resizeWidth","resizeHeight","adjustForViewport","alignElement","refNode","isTargetNotOutOfVisible","targetRegion","isOutOfVisibleRect","alignPoint","tgtPoint","pageX","pageY","pointInView","__getOffsetParent","__getVisibleRectForElement","canUseDOM","ExecutionEnvironment","canUseWorkers","Worker","canUseEventListeners","attachEvent","canUseViewport","global","sqrt","atan2","pow","PiBy180","PiBy2","couldUseAttachEvent","touchEvents","parseEl","supportsOpacity","supportsFilters","reOpacity","setOpacity","proto","originXOffset","originYOffset","multipleSpacesRegex","HTMLDocument","Document","implementation","createHTMLDocument","virtualWindow","JSDOM","features","FetchExternalResources","resources","jsdomImplForWrapper","nodeCanvas","copyGLTo2DDrawImage","gl","pipelineState","glCanvas","targetCanvas","sourceY","copyGLTo2DPutImageData","dWidth","destinationWidth","dHeight","destinationHeight","numBytes","u8","Uint8Array","imageBuffer","u8Clamped","Uint8ClampedArray","readPixels","RGBA","UNSIGNED_BYTE","imgData","ImageData","isTouchSupported","maxTouchPoints","isLikelyNode","Buffer","SHARED_ATTRIBUTES","DPI","reNum","commaWsp","rePathCommand","reNonWord","fontPaths","iMatrix","svgNS","perfLimitSizeTotal","maxCacheSideLimit","minCacheSideLimit","charWidthsCache","textureSize","disableStyleCopyPaste","enableGLFiltering","devicePixelRatio","webkitDevicePixelRatio","mozDevicePixelRatio","browserShadowBlurConstant","arcToSegmentsCache","boundsOfCurveCache","cachesBoundsOfCurve","forceGLPutImageData","initFilterBackend","isWebglSupported","maxTextureSize","WebglFilterBackend","tileSize","Canvas2dFilterBackend","_removeEventListener","eventName","handler","__eventListeners","eventListener","_once","_handler","Observable","listenersForEvent","once","Collection","_onObjectAdded","renderOnAddRemove","nonSplicing","somethingRemoved","_onObjectRemoved","context","deep","complexity","memo","CommonMethods","_setOptions","_initGradient","filler","colorStops","Gradient","_initPattern","Pattern","_setObject","_set","cos","sin","removeFromArray","getRandomInt","random","degrees","radiansToDegrees","radians","rotatePoint","point","newPoint","rotateVector","addEquals","vector","createVector","calcAngleBetweenVectors","acos","getHatVector","multiply","getBisector","A","B","C","AB","AC","alpha","phi","projectStrokeOnPoints","openPath","strokeUniformScalar","strokeUniform","getStrokeHatVector","scalar","miterVector","bisector","bisectorVector","strokeLineJoin","strokeMiterLimit","subtract","SQRT2","transformPoint","ignoreOffset","makeBoundingBoxFromPoints","xPoints","minX","yPoints","minY","invertTransform","fractionDigits","parseUnit","unit","Text","DEFAULT_SVG_FONT_SIZE","falseFunction","getKlass","namespace","camelize","resolveNamespace","getSvgAttributes","attributes","parts","createImage","onLoadCallback","loadImageInDom","enlivenObjects","enlivenedObjects","numLoadedObjects","numTotalObjects","onLoaded","enlivenObjectEnlivables","enlivenProps","ENLIVEN_PROPS","enlivedProps","enlivenPatterns","patterns","numLoadedPatterns","numPatterns","enlivenedPatterns","groupSVGElements","sourcePath","centerPoint","Group","populateWithProperties","properties","createCanvasElement","copyCanvasElement","newCanvas","format","quality","multiplyTransformMatrices","is2x2","qrDecompose","denom","skewX","skewY","translateX","translateY","calcRotateMatrix","theta","calcDimensionsMatrix","scaleMatrix","flipX","flipY","tan","composeMatrix","resetObjectTransform","saveObjectTransform","isTransparent","tolerance","_isTransparent","imageData","getImageData","parsePreserveAspectRatioAttribute","attribute","meetOrSlice","aspectRatioAttrs","alignX","alignY","clearFabricFontCache","limitDimsByArea","ar","maximumArea","roughWidth","perfLimitSizeY","capValue","findScaleToFit","matrixToSVG","NUM_FRACTION_DIGITS","removeTransformFromObject","inverted","finalTransform","calcOwnMatrix","applyTransformToObject","addTransformToObject","sizeAfterTransform","dimX","dimY","transformMatrix","bbox","mergeClipPaths","c1","c2","calcTransformMatrix","clipPath","hasStyleChanged","prevStyle","thisStyle","forTextSpans","deltaY","overline","underline","linethrough","stylesToArray","textLines","charIndex","stylesArray","styleIndex","stylesObject","_join","commandLengths","repeatedCommands","M","segmentToBezier","th2","th3","cosTh","sinTh","ry","cx1","cy1","mT","fromX","fromY","costh2","sinth2","costh3","sinth3","toX","toY","calcVectorAngle","ux","uy","vx","vy","ta","tb","fromArcToBeziers","fx","fy","rot","large","sweep","segsNorm","rotateX","th","px","py","rx2","ry2","py2","px2","pl","cy","mTheta","dtheta","segments","mDelta","arcToSegments","calcLineLength","getPointOnCubicBezierIterator","p1x","p1y","p2x","p2y","p3x","p3y","p4x","p4y","pct","CB2","c3","CB3","c4","CB4","getTangentCubicIterator","invT","tangentX","tangentY","getPointOnQuadraticBezierIterator","QB2","QB3","getTangentQuadraticIterator","pathIterator","perc","tempP","tmpLen","getPathSegmentsInfo","tempInfo","angleFinder","totalLength","info","command","destX","destY","joinPath","pathData","segment","parsePath","pathString","currentPath","coordsStr","rNumber","rNumberCommaWsp","rFlagCommaWsp","regArcArgumentSequence","coordsParsed","jlen","commandLength","repeatedCommand","klen","makePathSimpler","converted","controlX","controlY","destinationPath","getSmoothPathFromPoints","correction","multSignX","multSignY","manyPoints","eq","midPoint","midPointFrom","getBoundsOfCurve","x0","y0","x3","y3","argsString","t1","t2","b2ac","sqrtb2ac","tvalues","bounds","getPointOnPath","distance","infos","segInfo","segPercent","lerp","nextLen","lastPerc","findPercentageForDistance","transformPath","pathOffset","pathSegment","newSegment","byProperty","condition","invoke","getWholeChar","code","firstLetterOnly","escapeXml","graphemeSplit","textstring","chr","graphemes","IS_DONTENUM_BUGGY","addMethods","klass","superclass","returnValue","valueOf","Subclass","methodName","parentMethod","superClassMethod","shift","subclasses","scroll","getScrollLeftTop","_evt","touchProp","changedTouches","getTouchInfo","pointerType","es","currentStyle","hasLayout","setStyle","elementStyle","normalizedProperty","styleFloat","setProperty","sliceCanConvertNodelists","getElementStyle","selectProp","_slice","toArray","arrayLike","makeElement","tagName","docElement","scrollLeft","scrollTop","attr","makeElementUnselectable","onselectstart","unselectable","makeElementSelectable","setImageSmoothing","imageSmoothingEnabled","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","oImageSmoothingEnabled","getById","wrapElement","wrapper","replaceChild","getElementOffset","scrollLeftTop","offsetAttributes","getNodeCanvas","impl","_canvas","_image","cleanUpJsdomNode","_currentSrc","_attributes","_classList","emptyFn","onComplete","parameters","onreadystatechange","readyState","param","addParamToUrl","setRequestHeader","RUNNING_ANIMATIONS","defaultEasing","cancelAll","animations","animation","cancelByCanvas","cancelled","cancelByTarget","findAnimationsByTarget","findAnimationIndex","cancelFunc","findAnimation","_requestAnimFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","_cancelAnimFrame","cancelAnimationFrame","clearTimeout","animate","removeFromRegistry","runningAnimations","startValue","completionRate","durationRate","finish","abort","easing","isMany","endValue","byValue","onStart","tick","ticktime","timePerc","_value","valuePerc","cancelAnimFrame","calculateColor","animateColor","fromColor","toColor","startColor","Color","getSource","endColor","originalOnComplete","originalOnChange","colorEasing","normalize","asin","elastic","easeInBounce","easeOutBounce","ease","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInOutBounce","attributesMap","colorAttributes","fSize","cPath","normalizeAttr","normalizeValue","parentAttributes","parseTransformAttribute","fillIndex","strokeIndex","getSvgRegex","_getMultipleNodes","nodeNames","nodeList","nodeArray","getElementsByTagName","elementMatchesRule","selectors","firstMatching","parentMatching","selectorMatches","doesSomeParentMatch","matcher","elementById","nodelist","svgValidTagNamesRegEx","svgViewBoxElementsRegEx","svgInvalidAncestorsRegEx","svgValidParentsRegEx","gradientDefs","clipPaths","skewMatrix","reTransformList","reTransform","attributeValue","matrices","translateMatrix","rotateMatrix","multiplierX","multiplierY","combinedMatrix","reViewBoxAttrValue","applyViewboxTransform","viewBoxWidth","viewBoxHeight","viewBoxAttr","widthAttr","heightAttr","preserveAspectRatio","missingViewBox","missingDimAttr","toBeParsed","parsedDim","widthDiff","heightDiff","createElementNS","recursivelyParseGradientsXlink","gradient","xlinkAttr","referencedGradient","hasAttribute","referenceClone","cloneNode","parseSVGDocument","parsingOptions","xlinkAttribute","attrs","xlink","el2","currentTrans","oldLength","el3","setAttributeNS","nodeValue","parseUseDirectives","svgUid","__uid","descendants","selectNodes","hasAncestorWithNodeName","getGradientDefs","getCSSRules","parseElements","instances","reFontDeclaration","parseFontDeclaration","oStyle","elList","parseAttributes","parentFontSize","ownAttributes","cssAttrs","getGlobalStylesForElement","parseStyleAttribute","normalizedAttr","normalizedValue","normalizedStyle","mergedAttrs","setAlpha","getAlpha","toRgba","_setStrokeFillOpacity","ElementsParser","chunk","pair","parseStyleString","parseStyleObject","parsePointsAttribute","parsedPoints","allRules","styleContents","textContent","ruleObj","propertyValuePairs","_rule","loadSVGFromURL","xml","responseXML","_options","allElements","loadSVGFromString","regexUrl","numElements","createObjects","createObject","findTag","fromElement","createCallback","checkIfDone","resolveGradient","_removeTransformMatrix","resolveClipPath","extractPropertyDefinition","storage","regex","gradientDef","opacityAttr","createClipPathCallback","_newObj","usingElement","objTransformInv","gTransform","clipPathTag","clipPathOwner","that","scalarAdd","scalarAddEquals","subtractEquals","scalarSubtract","scalarSubtractEquals","multiplyEquals","divide","divideEquals","lt","lte","gt","gte","distanceFrom","setXY","setX","setY","setFromPoint","Intersection","appendPoint","appendPoints","intersectLineLine","a1","a2","b1","b2","uaT","ubT","uB","ua","ub","intersectLinePolygon","inter","intersectPolygonPolygon","points1","points2","intersectPolygonRectangle","r1","r2","topRight","bottomLeft","inter1","inter2","inter3","inter4","_tryParsingColor","setSource","hue2rgb","colorNameMap","sourceFromHex","sourceFromRgb","sourceFromHsl","_rgbToHsl","g","_source","toRgb","toHsl","hsl","toHsla","toHex","toHexa","toGrayscale","average","currentAlpha","toBlackWhite","threshold","overlayWith","otherColor","otherSource","reRGBa","reHSLa","reHex","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","yellowgreen","fromRgb","fromSource","fromRgba","fromHsl","fromHsla","fromHex","isShortNotation","isRGBa","oColor","scaleMap","skewMap","TOP","RIGHT","BOTTOM","CENTER","opposite","findCornerQuadrant","cornerAngle","fireEvent","canvasOptions","scaleIsProportional","uniformIsToggled","uniScaleKey","uniformScaling","isTransformCentered","scalingIsForbidden","by","scaleProportionally","lockX","lockScalingX","lockY","lockScalingY","commonEventInfo","wrapWithFixedAnchor","constraint","translateToOriginPoint","actionPerformed","wrapWithFireEvent","getLocalPoint","corner","localPoint","toLocalPoint","targetHasOneFlip","compensateScaleForSkew","oppositeSkew","scaleToCompensate","axis","_getTransformedDimensions","skewObjectX","newSkew","dimNoSkew","totalSkewSize","currentSkew","hasSkewed","dimBeforeSkewing","skewObjectY","scaleObject","dim","signX","signY","forbidScaling","gestureScale","lockScalingFlip","original","oldScaleX","oldScaleY","scaleCursorStyleHandler","skewCursorStyleHandler","notAllowed","lockSkewingY","lockSkewingX","scaleSkewCursorStyleHandler","altActionKey","pivotPoint","lockRotation","hasRotated","lastAngle","ey","curAngle","snapAngle","snapThreshold","rightAngleLocked","leftAngleLocked","scalingEqually","scalingX","scalingY","scalingYOrSkewingX","skewHandlerX","scalingXOrSkewingY","skewHandlerY","changeWidth","strokePadding","multiplier","oldWidth","newWidth","finalHandler","dragHandler","newLeft","newTop","moveX","moveY","scaleOrSkewActionName","isAlternative","rotationStyleHandler","renderCircleControl","xSize","ySize","myLeft","myTop","renderSquareControl","xSizeBy2","ySizeBy2","strokeRect","mouseDownHandler","getActionHandler","getMouseDownHandler","getMouseUpHandler","cursorStyleHandler","getActionName","getVisibility","controlKey","objectVisibility","_controlsVisibility","setVisibility","positionHandler","finalMatrix","calcCornerCoords","objectAngle","objectCornerSize","centerX","centerY","cosHalfOffset","sinHalfOffset","cosHalfOffsetComp","sinHalfOffsetComp","controlTriangleAngle","cornerHypotenuse","newTheta","newThetaComp","cornerStyle","getColorStop","colorAlpha","keyValuePairs","gradientTransform","addColorStop","toSVG","markup","commonAttributes","needsSwap","withViewport","additionalTransform","minRadius","percentageShift","colorStop","toLive","createLinearGradient","createRadialGradient","instance","svgOptions","colorStopEls","getLinearCoords","getRadialCoords","propValue","finalValue","__convertPercentUnitsToValues","patternTransform","setOptions","patternSource","patternWidth","patternHeight","patternOffsetX","patternOffsetY","patternImgSrc","naturalWidth","createPattern","Shadow","affectStroke","nonScaling","_parseShadow","shadow","shadowStr","offsetsAndBlur","reOffsetsAndBlur","fBoxX","fBoxY","CANVAS_INIT_ERROR","renderAndResetBound","renderAndReset","requestRenderAllBound","_initStatic","overlayColor","overlayImage","stateful","controlsAboveOverlay","allowTouchScrolling","backgroundVpt","overlayVpt","vptCoords","skipOffscreen","_createLowerCanvas","_initOptions","interactive","_initRetinaScaling","setOverlayImage","setBackgroundImage","setBackgroundColor","setOverlayColor","calcOffset","_isRetinaScaling","getRetinaScaling","scaleRatio","__initRetinaScaling","lowerCanvasEl","contextContainer","contextTop","_offset","__setBgOverlayImage","__setBgOverlayColor","_createCanvasElement","_originalCanvasStyle","_applyCanvasStyle","setWidth","setHeight","cssValue","cssOnly","_setBackstoreDimension","hasLostContext","backstoreOnly","_setCssDimension","_isCurrentlyDrawing","freeDrawingBrush","_setBrushStyles","cacheCanvasEl","wrapperEl","vpt","backgroundObject","overlayObject","calcViewportBoundaries","zoomToPoint","after","absolutePan","relativePan","setupState","_hasITextHandlers","_mouseUpITextHandler","_iTextInstances","canvasToDrawOn","renderCanvas","isRendering","iVpt","cancelRequestedRender","_renderBackground","_renderObjects","drawControls","_transformDone","renderCache","forClipping","drawClipPathOnCanvas","_renderOverlay","globalCompositeOperation","zoomX","zoomY","_cacheCanvas","cacheTranslationX","cacheTranslationY","needsVpt","closePath","getCenter","centerObjectH","_centerObject","centerObjectV","centerObject","viewportCenterObject","vpCenter","getVpCenter","viewportCenterObjectH","viewportCenterObjectV","toDatalessJSON","toDatalessObject","_toObjectMethod","_toObjects","excludeFromExport","_toObject","__serializeBgOverlay","originalValue","bgImage","svgViewportTransformation","_setSVGPreamble","_setSVGHeader","clipPathId","_setSVGBgOverlayColor","_setSVGBgOverlayImage","_setSVGObjects","suppressPreamble","encoding","createSVGFontFacesMarkup","createSVGRefElementsMarkup","createSVGClipPathMarkup","toClipPathSVG","shouldTransform","row","rowIndex","fontList","_setSVGObject","finalWidth","finalHeight","sendToBack","objs","activeSelection","unshift","bringToFront","sendBackwards","intersecting","newIdx","objsMoved","_findNewLowerIndex","intersectsWithObject","isContainedWithinObject","bringForward","_findNewUpperIndex","DataURLExporter","EMPTY_JSON","supports","setLineDash","createPNGStream","createJPEGStream","BaseBrush","strokeLineCap","strokeDashArray","limitedToCanvasSize","lineCap","miterLimit","lineJoin","_saveAndTransform","_setShadow","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","needsFullRender","_resetShadow","_isOutSideCanvas","PencilBrush","decimate","drawStraightLine","straightLineKey","_points","_hasStraightLine","_drawSegment","quadraticCurveTo","onMouseDown","_isMainEvent","_prepareForDrawing","_captureDrawingPath","onMouseMove","oldEnd","onMouseUp","_finalizeAndAddPath","_reset","_addPoint","pointerPoint","convertPointsToSVGPath","_isEmptySVGPath","createPath","Path","decimatePoints","adjustedDistance","lastPoint","CircleBrush","drawDot","addPoint","dot","radius","originalRenderOnAddRemove","circles","circle","Circle","circleRadius","circleColor","SprayBrush","density","dotWidth","dotWidthVariance","randomOpacity","optimizeOverlapping","sprayChunks","addSprayChunk","sprayChunkPoints","rects","ilen","sprayChunk","_getOptimizedRects","uniqueRects","uniqueRectsArray","globalAlpha","fillRect","PatternBrush","getPatternSrc","patternCanvas","patternCtx","getPatternSrcFunction","getPattern","topLeft","_getLeftTopCoords","_initInteractive","_createCacheCanvas","centeredScaling","centeredKey","selectionKey","selectionColor","selectionDashArray","selectionBorderColor","selectionLineWidth","selectionFullyContained","defaultCursor","freeDrawingCursor","notAllowedCursor","containerClass","perPixelTargetFind","targetFindTolerance","isDrawingMode","stopContextMenu","fireRightClick","fireMiddleClick","enablePointerEvents","_hoveredTarget","_hoveredTargets","_currentTransform","_groupSelector","_initWrapperElement","_createUpperCanvas","_initEventListeners","_chooseObjectsToRender","objsToRender","activeGroupObjects","contextTopDirty","renderTopLayer","_drawSelection","renderTop","_normalizePointer","invertedM","vptPointer","restorePointerVpt","isTargetTransparent","normalizedPointer","targetRelativeX","targetRelativeY","_cacheContext","contextCache","originalColor","selectionBackgroundColor","_isSelectionKeyPressed","_shouldClearSelection","evented","_shouldCenterTransform","altKey","centerTransform","_getOriginFromCorner","_getActionFromCorner","alreadySelected","_setupCurrentTransform","__corner","lastX","lastY","shiftKey","_beforeTransform","setCursor","viewportStart","viewportExtent","extent","maxX","maxY","strokeOffset","_setLineDash","activeTarget","activeTargetSubs","_checkTarget","globalPointer","isEditing","subTarget","objToCheck","pointerToUse","subTargetCheck","ignoreZoom","_absolutePointer","_pointer","cssScale","boundsWidth","boundsHeight","retinaScaling","lowerCanvasClass","_copyCanvasStyle","getTopContext","fromEl","toEl","getSelectionElement","_discardActiveObject","_fireSelectionEvents","oldObjects","somethingChanged","added","removed","oldObject","deselected","currentActives","_setActiveObject","onSelect","onDeselect","removeListeners","_renderControls","originalProperties","_realizeGroupTransformOnObject","_unwindGroupTransformOnObject","originalValues","clearContextTop","addEventOptions","passive","checkClick","mainTouchId","_bindEvents","addOrRemove","_getEventPrefix","functor","eventjsFunctor","canvasElement","eventTypePrefix","_onResize","_onMouseDown","_onMouseMove","_onMouseOut","_onMouseEnter","_onMouseWheel","_onContextMenu","_onDoubleClick","_onDragOver","_onDragEnter","_onDragLeave","_onDrop","_onTouchStart","eventjs","_onGesture","_onDrag","_onOrientationChange","_onShake","_onLongPress","_onMouseUp","_onTouchEnd","eventsBound","_simpleEventHandler","__onTransformGesture","__onDrag","__onMouseWheel","_target","__onOrientationChange","__onShake","__onLongPress","_fireEnterLeaveEvents","_cacheTransformEventData","_handleEvent","_resetTransformEventData","getPointerId","evt","pointerId","isPrimary","__onMouseDown","__onMouseUp","_willAddMouseDown","__onMouseMove","_shouldRender","groupSelector","shouldRender","isClick","_onMouseUpInDrawingMode","_finalizeCurrentTransform","targetWasActive","_maybeGroupObjects","activeOn","isMoving","originalControl","originalMouseUpHandler","_setCursorFromEvent","subTargets","absolutePointer","currentSubTargets","_scaling","hasStateChanged","_fire","_onMouseDownInDrawingMode","_onMouseMoveInDrawingMode","_previousPointer","shouldGroup","_shouldGroup","_handleGrouping","saveState","_transformObject","_fireOverOutEvents","fireSyntheticInOutEvents","oldTarget","evtOut","canvasEvtOut","evtIn","canvasEvtIn","_draggedoverTarget","config","inOpt","outOpt","inFires","targetChanged","previousTarget","nextTarget","reset","_performTransformAction","getCornerCursor","_updateActiveSelection","_createActiveSelection","currentActiveObjects","removeWithUpdate","addWithUpdate","_createGroup","groupObjects","ActiveSelection","_groupSelectedObjects","aGroup","_collectObjects","currentObject","selectionX1Y1","selectionX2Y2","allowIntersect","intersectsWithRect","isContainedWithinRect","toCanvasElement","cropping","scaledWidth","scaledHeight","originalWidth","originalHeight","newZoom","vp","originalInteractive","newVp","originalRetina","originalContextTop","_enlivenObjects","_setBgOverlay","enlivenedCanvasClip","__setupCanvas","cbIfLoaded","__setBgOverlay","enlivedObject","_toDataURL","_toDataURLWithMultiplier","toDataURLWithMultiplier","cloneWithoutData","backgroundImageOpacity","backgroundImageStretch","objectCaching","borderDashArray","cornerDashArray","strokeDashOffset","borderOpacityWhenMoving","borderScaleFactor","minScaleLimit","hasBorders","lockMovementX","lockMovementY","statefullCache","noScaleCache","paintFirst","stateProperties","cacheProperties","colorProperties","absolutePositioned","_cacheProperties","_updateCacheCanvas","_limitCacheSize","limitedDims","capped","_getCacheCanvasDimensions","objectScale","getTotalObjectScaling","neededX","neededY","drawingWidth","drawingHeight","minCacheSize","dimensionsChanged","cacheWidth","cacheHeight","zoomChanged","shouldRedraw","additionalWidth","additionalHeight","shouldResizeCanvas","sizeGrowing","getHeightOfLine","needFullTransform","_removeDefaultValues","getObjectScaling","retina","getObjectOpacity","shouldConstrainValue","isChanged","groupNeedsUpdate","_constrainScale","isOnACache","setOnGroup","getViewportTransform","isNotVisible","isOnScreen","_setupCompositeOperation","drawSelectionBackground","_setOpacity","drawCacheOnCanvas","_removeCacheCanvas","drawObject","propertySet","isCacheDirty","hasStroke","hasFill","needsItsOwnCache","ownCaching","willDrawShadow","drawClipPathOnCache","originalFill","originalStroke","_setClippingProperties","_drawClipPath","skipCanvas","_getNonTransformedDimensions","_removeShadow","_setStrokeStyles","decl","lineDashOffset","_applyPatternForTransformedGradient","_applyPatternGradientTransform","_setFillStyles","dashArray","drawBorders","forActiveSelection","drawBordersInGroup","scaling","multX","multY","_renderPaintInOrder","_renderStroke","_renderFill","pCtx","pCanvas","_findCenterFromElement","_assignTransformMatrixProps","preserveAspectRatioOptions","cropX","cropY","offsetLeft","offsetTop","objectForm","cloneAsImage","origParams","originalGroup","originalShadow","withoutTransform","withoutShadow","boundingRect","shadowOffset","originalCanvas","isType","shouldCenterOrigin","_setOriginToCenter","_resetOrigin","centerH","viewportCenterH","centerV","viewportCenterV","viewportCenter","getLocalPointer","pClicked","objectLeftTop","createAccessors","extraParam","translateToGivenOrigin","fromOriginX","fromOriginY","toOriginX","toOriginY","translateToCenterPoint","leftTop","getPointByOrigin","adjustPosition","offsetFrom","offsetTo","hypotFull","getScaledWidth","xFull","yFull","_originalOriginX","_originalOriginY","originPoint","multiplyMatrices","oCoords","aCoords","lineCoords","ownMatrixCache","matrixCache","_getCoords","absolute","calculate","calcACoords","calcLineCoords","getCoords","pointTL","pointBR","other","otherCoords","lines","_getImageLines","_findCrossPoints","_containsCenterOfCanvas","isPartiallyOnScreen","topline","rightline","bottomline","leftline","xi","iLine","xcount","lineKey","getScaledHeight","boundingRectFactor","scaleToHeight","cosP","sinP","cosPSinP","cosPMinusSinP","calcOCoords","_calcRotateMatrix","_calcTranslateMatrix","startMatrix","_calculateCurrentDimensions","forEachControl","skipCorners","_setCornerCoords","transformMatrixKey","sep","tMatrix","noSkew","_finalizeDimensions","getSvgColorString","getSvgStyles","skipShadow","getSvgFilter","getSvgSpanStyles","useWhiteSpace","term","textDecoration","getSvgTextDecoration","decoration","getSvgCommons","getSvgTransform","full","_setSVGBg","textBgRects","_getFillAttributes","_createBaseSVGMarkup","_toSVG","_createBaseClipPathSVGMarkup","objectMarkup","commonPieces","clipPathMarkup","noStyle","styleInfo","shadowInfo","withShadow","vectorEffect","absoluteClipPath","addPaintOrder","originalSet","saveProps","tmpObj","_isEqual","origValue","firstPass","dashedPropertySet","forTouch","isControlVisible","touchCorner","controlObject","wh","shouldStroke","setControlVisible","FX_DURATION","fxCenterObjectH","callbacks","empty","fxCenterObjectV","fxRemove","skipCallbacks","propsToAnimate","out","_animate","propPair","propIsColor","valueProgress","timeProgress","coordProps","makeEdgeToOriginGetter","propertyNames","originValues","axis1","axis2","dimension","nearest","farthest","Line","_setWidthHeight","_getLeftToOriginX","_getTopToOriginY","calcLinePoints","origStrokeStyle","xMult","yMult","ATTRIBUTE_NAMES","parsedAttributes","startAngle","endAngle","setRadius","svgString","getRadiusX","getRadiusY","Triangle","widthBy2","heightBy2","piBy2","Ellipse","getRx","getRy","_initRxRy","isRounded","bezierCurveTo","Polyline","exactBoundingBox","_setPositionDimensions","_projectStrokeOnPoints","correctLeftTop","calcDim","_calcDimensions","correctSize","fromSVG","diffX","diffY","commonRender","fromElementGenerator","_class","Polygon","_setPath","_renderPathCommands","subpathStartX","subpathStartY","_getOffsetTransform","aX","aY","pathUrl","elivenedObjects","useSetOnGroup","isAlreadyGrouped","_updateObjectsACoords","_calcBounds","_updateObjectsCoords","_updateObjectCoords","nested","_restoreObjectsState","_includeDefaultValues","objsToObject","originalDefaults","_obj","ownCache","groupMatrix","toActiveSelection","ungroupOnCanvas","setObjectsCoords","onlyWidthHeight","iLen","jLen","_getBounds","minXY","maxXY","toGroup","newGroup","childrenOverride","srcFromAttribute","_lastScaleX","_lastScaleY","_filterScalingX","_filterScalingY","minimumScaleTrigger","cacheKey","imageSmoothing","filters","_initElement","_element","setElement","removeTexture","_initConfig","applyFilters","resizeFilter","applyResizeFilters","backend","filterBackend","evictCachesForKey","getCrossOrigin","getOriginalSize","_stroke","filterObj","getSrc","hasCrop","strokeSvg","imageMarkup","imageRendering","getSvgSrc","origFill","filtered","setSrc","minimumScale","elementToFilter","_filteredEl","sourceWidth","sourceHeight","isNeutralState","imgElement","_needsResize","elementToDraw","elWidth","elHeight","sX","sY","sW","sH","maxDestW","maxDestH","_resetWidthHeight","CSS_CANVAS","_initFilters","pAR","rWidth","rHeight","pWidth","pHeight","_object","resizeFilters","_getAngleValueForStraighten","straighten","fxStraighten","straightenObject","fxStraightenObject","testPrecision","precision","fragmentSource","fragmentShader","createShader","FRAGMENT_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","setupGLContext","captureGPUInfo","isSupported","getParameter","MAX_TEXTURE_SIZE","precisions","webGlPrecision","createWebGLCanvas","aPosition","Float32Array","chooseFastestCopyGLTo2DMethod","canUseImageData","canMeasurePerf","canUseArrayBuffer","ArrayBuffer","canUseUint8Clamped","copyGLTo2D","drawImageTime","testContext","glOptions","premultipliedAlpha","depth","stencil","antialias","clearColor","cachedTexture","getCachedTexture","sourceTexture","createTexture","targetTexture","originalTexture","passes","webgl","programCache","pass","tempFbo","createFramebuffer","bindFramebuffer","FRAMEBUFFER","applyTo","resizeCanvasIfNeeded","bindTexture","TEXTURE_2D","deleteTexture","deleteFramebuffer","clearWebGLCaches","textureCache","textureImageSource","texture","texParameteri","TEXTURE_MAG_FILTER","NEAREST","TEXTURE_MIN_FILTER","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","texImage2D","uniqueId","gpuInfo","renderer","vendor","ext","getExtension","UNMASKED_RENDERER_WEBGL","UNMASKED_VENDOR_WEBGL","sourceElement","originalEl","originalImageData","BaseFilter","vertexSource","createProgram","vertexShader","VERTEX_SHADER","getShaderInfoLog","program","attachShader","linkProgram","getProgramParameter","LINK_STATUS","getProgramInfoLog","attributeLocations","getAttributeLocations","uniformLocations","getUniformLocations","uStepW","getUniformLocation","uStepH","getAttribLocation","sendAttributeData","aPositionData","attributeLocation","buffer","createBuffer","bindBuffer","ARRAY_BUFFER","enableVertexAttribArray","vertexAttribPointer","FLOAT","bufferData","STATIC_DRAW","_setupFrameBuffer","framebufferTexture2D","COLOR_ATTACHMENT0","_swapTextures","temp","main","mainParameter","applyToWebGL","applyTo2d","retrieveShader","shader","useProgram","uniform1f","sendUniformData","viewport","drawArrays","TRIANGLE_STRIP","bindAdditionalTexture","textureUnit","activeTexture","TEXTURE0","unbindAdditionalTexture","getMainParameter","setMainParameter","createHelpLayer","helpLayer","mainP","ColorMatrix","colorsOnly","uColorMatrix","uConstants","uniformMatrix4fv","uniform4fv","Brightness","brightness","uBrightness","Convolute","opaque","Convolute_3_1","Convolute_3_0","Convolute_5_1","Convolute_5_0","Convolute_7_1","Convolute_7_0","Convolute_9_1","Convolute_9_0","dstOff","scx","scy","srcOff","wt","weights","side","halfSide","sw","sh","dst","alphaFac","uMatrix","uOpaque","uHalfSize","uSize","uniform1fv","Grayscale","lightness","luminosity","uMode","uniform1i","Invert","invert","uInvert","Noise","noise","rand","uNoise","uSeed","Pixelate","blocksize","_j","_iLen","_jLen","uBlocksize","RemoveColor","useAlpha","lowC","highC","uLow","uHigh","Brownie","Vintage","Kodachrome","Technicolor","Polaroid","Sepia","BlackWhite","BlendColor","lighten","darken","exclusion","tint","buildSource","tg","alpha1","uColor","BlendImage","mask","TEXTURE1","calculateMatrix","canvas1","blendData","blendImage","uTransformMatrix","uImage","uniformMatrix3fv","Resize","resizeType","lanczosLobes","uDelta","uTaps","uniform2fv","horizontal","taps","filterWindow","getFilterWindow","generateShader","tempScale","getTaps","lobeFunction","lanczosCreate","offsets","fragmentSourceTOP","dW","dH","lobes","xx","rcpScaleX","rcpScaleY","newData","oW","oH","sliceByTwo","hermiteFastResize","bilinearFiltering","lanczosResize","tmpCanvas","mult","doneW","doneH","stepW","stepH","dX","dY","srcData","destImg","destData","lanczos","ratioX","ratioY","rcpRatioX","rcpRatioY","range2X","range2Y","cacheLanc","icenter","fX","fY","xDiff","yDiff","chnl","origPix","w4","pixels","destImage","destPixels","ratioW","ratioH","ratioWHalf","ratioHHalf","img2","data2","weightsAlpha","gxR","gxG","gxB","gxA","yy","w0","Contrast","contrast","contrastF","uContrast","Saturation","saturation","adjust","uSaturation","Vibrance","vibrance","avg","amt","uVibrance","Blur","aspectRatio","simpleBlur","canvas2","blurLayer1","blurLayer2","percent","ctx1","ctx2","newImageData","delta","chooseRightDelta","blurScale","Gamma","gamma","rInv","gInv","bInv","rVals","gVals","bVals","uGamma","uniform3fv","Composed","subFilters","HueRotation","rotation","rad","aThird","aThirdSqtSin","OneMinusCos","additionalProps","_dimensionAffectingProps","_reNewline","_reSpacesAndTabs","_reSpaceAndTab","_reWords","superscript","baseline","subscript","textBackgroundColor","pathStartOffset","pathSide","pathAlign","_fontSizeFraction","_fontSizeMult","_measuringContext","_styleProperties","__charBounds","CACHE_FONT_SIZE","MIN_TEXT_WIDTH","__skipDimension","setPathInfo","initDimensions","segmentsInfo","getMeasuringContext","_splitText","newLines","_splitTextIntoLines","_textLines","graphemeLines","_unwrappedTextLines","_unwrappedLines","_text","graphemeText","_clearCache","calcTextWidth","cursorWidth","calcTextHeight","enlargeSpaces","diffSpace","currentLineWidth","numberOfSpaces","accumulatedSpace","charBound","spaces","isEndOfWrapping","getLineWidth","kernedWidth","lineIndex","missingNewlineOffset","_setTextStyles","_renderTextLinesBackground","_renderTextDecoration","_renderText","_renderTextStroke","_renderTextFill","charStyle","forMeasuring","textBaseline","_getFontDeclaration","_renderTextLine","_renderChars","styleHas","heightOfLine","lineLeftOffset","lastColor","charBox","currentColor","drawStart","leftOffset","_getLeftOffset","lineTopOffset","_getTopOffset","boxStart","boxWidth","_getLineLeftOffset","getValueOfPropertyAt","renderLeft","getFontCache","cacheProp","_measureChar","_char","previousChar","prevCharStyle","coupleWidth","previousWidth","fontCache","couple","stylesAreEqual","fontMultiplier","measureText","getHeightOfChar","measureLine","lineInfo","_measureLine","_getWidthOfCharSpacing","grapheme","prevGrapheme","graphemeInfo","startingPoint","totalPathLength","lineBounds","positionInPath","_getGraphemeBox","_setGraphemeOnPath","numOfSpaces","centerPosition","skipLeft","getCompleteStyleDeclaration","previousBox","__lineHeights","_renderTextCommon","lineHeights","isEmptyStyles","actualStyle","nextStyle","timeToRender","drawingLeft","isJustify","charsToRender","shortCut","isLtr","currentDirection","_renderChar","_applyPatternGradientTransformText","handleFiller","fillOffsets","strokeOffsets","_getStyleDeclaration","fullDecl","shouldFill","fillText","strokeText","setSuperscript","_setScript","setSubscript","schema","loc","get2DCursorLocation","setSelectionStyles","lineDiff","__lineWidths","_shouldClearDimensionCache","shouldClear","_forceClearCache","_size","_dy","lastDecoration","currentDecoration","currentFill","lastFill","topOffset","styleObject","fontIsGeneric","genericFonts","newLine","newText","allProperties","needsDims","isAddingPath","parsedAnchor","textAnchor","originalStrokeWidth","textHeightScaleFactor","scaledDiff","textHeight","offX","objectCopy","textInstance","pathInstance","p3","cleanStyle","letterCount","stylePropertyValue","stylesCount","allStyleObjectPropertiesMatch","graphemeCount","removeStyle","lineNum","charNum","_extendStyles","_getLineStyle","_setLineStyle","_setStyleDeclaration","selectionStart","skipWrapping","getSelectionStyles","startIndex","endIndex","selectionEnd","getStyleAtPosition","lineStyle","_deleteStyleDeclaration","_deleteLineStyle","parseDecoration","IText","editable","cursorColor","cursorDelay","cursorDuration","caching","hiddenTextareaContainer","_reSpace","_currentCursorOpacity","_selectionDirection","_abortCursorAnimation","__widthOfSpace","inCompositionMode","initBehavior","setSelectionStart","_updateAndFire","setSelectionEnd","_fireSelectionChanged","_updateTextarea","initDelayedCursor","cursorOffsetCache","renderCursorOrSelection","skipRestore","_clearTextArea","boundaries","_getCursorBoundaries","renderCursor","renderSelection","_getCursorBoundariesOffsets","cursorPosition","bound","cursorLocation","charHeight","__isMousedown","startLine","endLine","startChar","endChar","realLineHeight","lineOffset","boxEnd","drawWidth","drawHeight","extraTop","compositionColor","getCurrentCharFontSize","cp","_getCurrentCharIndex","getCurrentCharColor","initAddedHandler","initRemovedHandler","initCursorSelectionHandlers","initDoubleClickSimulation","mouseMoveHandler","_initCanvasHandlers","_removeCanvasHandlers","_tick","_currentTickState","_animateCursor","targetOpacity","completeMethod","tickState","isAborted","_onTickComplete","_cursorTimeout1","_currentTickCompleteState","restart","abortCursorAnimation","_cursorTimeout2","selectAll","getSelectedText","findWordBoundaryLeft","startFrom","findWordBoundaryRight","findLineBoundaryLeft","findLineBoundaryRight","searchWordBoundary","selectWord","newSelectionStart","newSelectionEnd","selectLine","exitEditingOnOthers","initHiddenTextarea","_saveEditingProps","_setEditingProps","_textBeforeEdit","initMouseMoveHandler","getSelectionStartFromPointer","currentStart","currentEnd","__selectionStartOnMouseDown","restartCursorIfNeeded","fromStringToGraphemeSelection","smallerTextStart","graphemeStart","smallerTextEnd","fromGraphemeToStringSelection","newSelection","updateTextareaPosition","updateFromTextArea","_calcTextareaPosition","desiredPosition","compositionStart","upperCanvas","upperCanvasWidth","upperCanvasHeight","_savedProps","_restoreEditingProps","isTextChanged","_removeExtraneousStyles","removeStyleFromTo","styleObj","cursorStart","cursorEnd","lineStart","charStart","lineEnd","charEnd","shiftLineStyles","numericChar","clonedStyles","numericLine","insertNewlineStyleObject","qty","copiedStyle","currentCharStyle","newLineStyles","somethingAdded","isEndOfLine","numIndex","styleCarriedOver","insertCharStyleObject","currentLineStyles","currentLineStylesCloned","numericIndex","newStyle","insertNewStyleBlock","insertedText","cursorLoc","addedLines","linesLength","setSelectionStartEndWithShift","setSelectionInBoundaries","__lastClickTime","__lastLastClickTime","__lastPointer","__newClickTime","newPointer","isTripleClick","_stopEvent","__lastIsEditing","__lastSelected","initMousedownHandler","initMouseupHandler","initClicks","doubleClickHandler","tripleClickHandler","_mouseDownHandler","setCursorByClick","_mouseDownHandlerBefore","currentActive","mouseOffset","prevWidth","_getNewSelectionStartFromOffset","distanceBtwLastCharAndCursor","distanceBtwNextCharAndCursor","onInput","paste","onCompositionStart","onCompositionUpdate","onCompositionEnd","_clickHandlerInitialized","keysMap","keysMapRtl","ctrlKeysMapUp","ctrlKeysMapDown","keyMap","ctrlKey","metaKey","stopImmediatePropagation","_copyDone","fromPaste","removedText","removeFrom","removeTo","nextText","charCount","nextCharCount","charDiff","textareaSelection","backDelete","copiedText","copiedTextStyle","compositionEnd","_getClipboardData","clipboardData","_getWidthBeforeCursor","widthBeforeCursor","getDownCursorOffset","isRight","selectionProp","_getSelectionForOffset","indexOnOtherLine","_getIndexOnLine","getUpCursorOffset","textBeforeCursor","charWidth","foundMatch","widthOfCharsOnLine","indexOnLine","leftEdge","rightEdge","offsetFromLeftEdge","moveCursorDown","_moveCursorUpOrDown","moveCursorUp","moveCursorWithShift","moveCursorWithoutShift","moveCursorLeft","_moveCursorLeftOrRight","_move","_moveLeft","_moveRight","moveCursorLeftWithoutShift","change","moveCursorLeftWithShift","moveCursorRight","moveCursorRightWithShift","moveCursorRightWithoutShift","changed","removeChars","insertChars","_getSVGLeftTopOffsets","textAndBg","_getSVGTextAndBg","textTop","textLeft","_wrapSVGTextAndBg","lineTop","textSpans","textTopOffset","textLeftOffset","_setSVGTextLineBg","_setSVGTextLineText","_createTextCharSpan","styleDecl","shouldUseWhitespace","styleProps","fillStyles","dySpan","_pushTextBgRect","fillColor","_getSVGLineTopOffset","lastHeight","minWidth","dynamicMinWidth","__cachedLines","_wordJoiners","splitByGrapheme","_styleMap","_generateStyleMap","textInfo","realLineCount","realLineCharCount","isWrapping","nextOffset","shouldLimit","mapNextLine","_wrapText","desiredWidth","wrapped","_wrapLine","_measureWord","charOffset","_line","reservedSpace","words","infix","wordWidth","infixWidth","largestWordWidth","lineJustStarted","additionalSpace","getMinWidth","linesToKeep","scaleSkewStyleHandler","scaleStyleHandler","objectControls","textBoxControls","deinterlace","newPixels","cpRow","toRow","fromRow","fromPixels","decompressFrame","_gif","__esModule","_jsBinarySchemaParser","_uint","_deinterlace","_lzw","byteData","buildStream","gct","buildImagePatch","totalPixels","descriptor","lzw","minCodeSize","blocks","lct","interlaced","resultImage","exists","colorTable","gce","extras","disposal","transparentColorGiven","transparentIndex","transparentColorIndex","patchData","colorIndex","generatePatch","parsedGif","buildImagePatches","pixelCount","available","code_mask","code_size","end_of_information","in_code","old_code","data_size","datum","bits","pi","bi","MAX_STACK_SIZE","npix","dstPixels","pixelStack","addLeadingSlash","stripLeadingSlash","substr","stripBasename","hasBasename","stripTrailingSlash","hashIndex","searchIndex","createLocation","currentLocation","decodeURI","URIError","locationsAreEqual","createTransitionManager","prompt","setPrompt","nextPrompt","confirmTransitionTo","getUserConfirmation","appendListener","notifyListeners","getConfirmation","PopStateEvent","HashChangeEvent","getHistoryState","globalHistory","canUseHistory","needsHashChangeListener","_props","_props$forceRefresh","forceRefresh","_props$getUserConfirm","_props$keyLength","keyLength","getDOMLocation","historyState","_window$location","createKey","transitionManager","setState","nextState","handlePopState","isExtraneousPopstateEvent","handlePop","handleHashChange","forceNextPop","fromLocation","toLocation","toIndex","fromIndex","go","revertPop","initialLocation","createHref","listenerCount","checkDOMListeners","isBlocked","pushState","prevIndex","nextKeys","replaceState","goBack","goForward","unblock","HashChangeEvent$1","HashPathCoders","hashbang","encodePath","decodePath","noslash","slash","stripHash","getHashPath","replaceHashPath","createHashHistory","_props$hashType","hashType","_HashPathCoders$hashT","ignorePath","encodedPath","prevLocation","allPaths","lastIndexOf","baseTag","pushHashPath","nextPaths","clamp","lowerBound","upperBound","createMemoryHistory","_props$initialEntries","initialEntries","_props$initialIndex","initialIndex","entry","nextIndex","nextEntries","canGo","reactIs","REACT_STATICS","childContextTypes","contextType","contextTypes","getDefaultProps","getDerivedStateFromError","getDerivedStateFromProps","mixins","KNOWN_STATICS","caller","callee","arity","MEMO_STATICS","compare","TYPE_STATICS","getStatics","isMemo","ForwardRef","Memo","getOwnPropertyNames","getPrototypeOf","objectPrototype","hoistNonReactStatics","targetComponent","sourceComponent","blacklist","inheritedComponent","targetStatics","sourceStatics","getType","isPlainObject","isSymbol","conditional","stream","partSchema","conditionFunc","continueFunc","lastStreamPos","newParent","readBits","readArray","readUnsigned","readString","peekBytes","readBytes","peekByte","readByte","uint8Data","subarray","littleEndian","bytes","byteSize","totalOrFunc","_byte","def","subBitsTotal","subBlocksSchema","chunks","streamSize","availableSize","gceSchema","codes","future","userInput","terminator","imageSchema","textSchema","blockSize","preData","applicationSchema","application","commentSchema","_default","header","signature","lsd","resolution","backgroundColorIndex","pixelAspectRatio","nextCode","FUNC_ERROR_TEXT","HASH_UNDEFINED","PLACEHOLDER","WRAP_PARTIAL_FLAG","WRAP_ARY_FLAG","INFINITY","NAN","MAX_ARRAY_LENGTH","wrapFlags","argsTag","arrayTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","objectTag","promiseTag","regexpTag","setTag","stringTag","symbolTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reEmptyStringLeading","reEmptyStringMiddle","reEmptyStringTrailing","reEscapedHtml","reUnescapedHtml","reHasEscapedHtml","reHasUnescapedHtml","reEscape","reEvaluate","reInterpolate","reIsDeepProp","reIsPlainProp","rePropName","reRegExpChar","reHasRegExpChar","reTrimStart","reWhitespace","reWrapComment","reWrapDetails","reSplitDetails","reAsciiWord","reForbiddenIdentifierChars","reEscapeChar","reEsTemplate","reFlags","reIsBadHex","reIsBinary","reIsHostCtor","reIsOctal","reIsUint","reLatin","reNoMatch","reUnescapedString","rsAstralRange","rsComboRange","rsComboMarksRange","rsDingbatRange","rsLowerRange","rsUpperRange","rsVarRange","rsBreakRange","rsMathOpRange","rsAstral","rsBreak","rsCombo","rsDigits","rsDingbat","rsLower","rsMisc","rsFitz","rsNonAstral","rsRegional","rsSurrPair","rsUpper","rsZWJ","rsMiscLower","rsMiscUpper","rsOptContrLower","rsOptContrUpper","reOptMod","rsModifier","rsOptVar","rsSeq","rsEmoji","rsSymbol","reApos","reComboMark","reUnicode","reUnicodeWord","reHasUnicode","reHasUnicodeWord","contextProps","templateCounter","typedArrayTags","cloneableTags","stringEscapes","freeParseFloat","freeParseInt","freeGlobal","freeSelf","freeExports","freeModule","moduleExports","freeProcess","nodeUtil","require","types","binding","nodeIsArrayBuffer","isArrayBuffer","nodeIsDate","isDate","nodeIsMap","isMap","nodeIsRegExp","isRegExp","nodeIsSet","isSet","nodeIsTypedArray","isTypedArray","thisArg","arrayAggregator","setter","iteratee","accumulator","arrayEach","arrayEachRight","arrayEvery","predicate","arrayFilter","resIndex","arrayIncludes","baseIndexOf","arrayIncludesWith","comparator","arrayMap","arrayPush","arrayReduce","initAccum","arrayReduceRight","arraySome","asciiSize","baseProperty","baseFindKey","eachFunc","baseFindIndex","fromRight","strictIndexOf","baseIsNaN","baseIndexOfWith","baseMean","baseSum","basePropertyOf","baseReduce","baseTimes","baseTrim","trimmedEndIndex","baseUnary","baseValues","cacheHas","charsStartIndex","strSymbols","chrSymbols","charsEndIndex","deburrLetter","escapeHtmlChar","escapeStringChar","hasUnicode","mapToArray","overArg","replaceHolders","setToArray","setToPairs","stringSize","unicodeSize","stringToArray","unicodeToArray","asciiToArray","unescapeHtmlChar","runInContext","uid","pick","arrayProto","funcProto","objectProto","coreJsData","funcToString","idCounter","maskSrcKey","IE_PROTO","nativeObjectToString","objectCtorString","oldDash","reIsNative","allocUnsafe","getPrototype","objectCreate","propertyIsEnumerable","spreadableSymbol","isConcatSpreadable","symIterator","symToStringTag","toStringTag","getNative","ctxClearTimeout","ctxNow","ctxSetTimeout","nativeCeil","nativeFloor","nativeGetSymbols","nativeIsBuffer","isBuffer","nativeIsFinite","isFinite","nativeJoin","nativeKeys","nativeMax","nativeMin","nativeNow","nativeParseInt","nativeRandom","nativeReverse","DataView","Map","nativeCreate","metaMap","realNames","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","symbolToString","isObjectLike","LazyWrapper","LodashWrapper","wrapperClone","baseCreate","isObject","baseLodash","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","Hash","ListCache","MapCache","SetCache","__data__","Stack","arrayLikeKeys","inherited","isArr","isArg","isArguments","isBuff","skipIndexes","isIndex","arraySample","baseRandom","arraySampleSize","shuffleSelf","copyArray","baseClamp","arrayShuffle","assignMergeValue","baseAssignValue","assignValue","objValue","assocIndexOf","baseAggregator","baseEach","baseAssign","copyObject","baseAt","paths","skip","baseClone","bitmask","customizer","stack","isDeep","isFlat","isFull","input","initCloneArray","getTag","isFunc","cloneBuffer","initCloneObject","getSymbolsIn","copySymbolsIn","keysIn","baseAssignIn","getSymbols","copySymbols","Ctor","cloneArrayBuffer","dataView","byteOffset","byteLength","cloneDataView","cloneTypedArray","regexp","cloneRegExp","initCloneByTag","stacked","subValue","getAllKeysIn","getAllKeys","baseConformsTo","baseDelay","wait","baseDifference","isCommon","valuesLength","outer","computed","valuesIndex","templateSettings","getMapData","pairs","LARGE_ARRAY_SIZE","createBaseEach","baseForOwn","baseEachRight","baseForOwnRight","baseEvery","baseExtremum","baseFilter","baseFlatten","isStrict","isFlattenable","baseFor","createBaseFor","baseForRight","baseFunctions","baseGet","castPath","toKey","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","isOwn","unmasked","getRawTag","objectToString","baseGt","baseHas","baseHasIn","baseIntersection","arrays","othLength","othIndex","caches","seen","baseInvoke","last","baseIsArguments","baseIsEqual","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","convert","isPartial","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","objProps","objLength","objStacked","othStacked","skipCtor","othValue","compared","objCtor","othCtor","equalObjects","baseIsEqualDeep","baseIsMatch","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","baseIsNative","baseIteratee","identity","baseMatchesProperty","baseMatches","baseKeys","isPrototype","baseLt","baseMap","isArrayLike","getMatchData","matchesStrictComparable","isKey","isStrictComparable","hasIn","baseMerge","srcIndex","mergeFunc","safeGet","isTyped","isArrayLikeObject","toPlainObject","baseMergeDeep","baseNth","baseOrderBy","iteratees","orders","getIteratee","criteria","comparer","objCriteria","othCriteria","ordersLength","compareAscending","compareMultiple","baseSortBy","basePickBy","baseSet","basePullAll","basePullAt","indexes","baseUnset","baseRepeat","baseRest","setToString","overRest","baseSample","baseSampleSize","baseSetData","baseSetToString","constant","baseShuffle","baseSlice","baseSome","baseSortedIndex","retHighest","low","high","mid","baseSortedIndexBy","valIsNaN","valIsNull","valIsSymbol","valIsUndefined","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","setLow","baseSortedUniq","baseToNumber","baseToString","baseUniq","createSet","seenIndex","baseUpdate","updater","baseWhile","isDrop","baseWrapperValue","baseXor","baseZipObject","assignFunc","valsLength","castArrayLikeObject","castFunction","stringToPath","castRest","castSlice","typedArray","valIsDefined","valIsReflexive","composeArgs","partials","holders","isCurried","argsIndex","holdersLength","leftIndex","leftLength","rangeLength","isUncurried","composeArgsRight","holdersIndex","rightIndex","rightLength","isNew","createAggregator","initializer","createAssigner","assigner","sources","guard","isIterateeCall","iterable","createCaseFirst","trailing","createCompounder","deburr","createCtor","thisBinding","createFind","findIndexFunc","createFlow","flatRest","funcs","prereq","thru","getFuncName","funcName","getData","isLaziable","plant","createHybrid","partialsRight","holdersRight","argPos","ary","isAry","isBind","isBindKey","isFlip","getHolder","holdersCount","countHolders","newHolders","createRecurry","arrLength","oldArray","reorder","createInverter","toIteratee","baseInverter","createMathOperation","operator","defaultValue","createOver","arrayFunc","createPadding","chars","charsLength","createRange","toFinite","baseRange","createRelationalOperation","toNumber","wrapFunc","isCurry","setData","setWrapToString","createRound","toInteger","createToPairs","baseToPairs","createWrap","srcBitmask","newBitmask","isCombo","mergeData","createCurry","createPartial","createBind","customDefaultsAssignIn","customDefaultsMerge","customOmitClone","arrStacked","arrValue","flatten","otherFunc","stubArray","hasPath","hasFunc","isLength","ctorString","isMaskable","stubFalse","otherArgs","shortOut","insertWrapDetails","updateWrapDetails","getWrapDetails","lastCalled","remaining","memoize","quote","subString","difference","differenceBy","differenceWith","findLastIndex","intersection","mapped","intersectionBy","intersectionWith","pull","pullAll","pullAt","union","unionBy","unionWith","unzip","unzipWith","without","xor","xorBy","xorWith","zipWith","chain","interceptor","wrapperAt","countBy","findLast","forEachRight","groupBy","invokeMap","keyBy","partition","sortBy","bindKey","WRAP_BIND_FLAG","debounce","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","defer","resolver","memoized","Cache","negate","overArgs","transforms","funcsLength","partial","partialRight","rearg","isInteger","isNumber","isString","iteratorToArray","remainder","toLength","isBinary","assignIn","assignInWith","assignWith","at","propsIndex","propsLength","defaultsDeep","mergeWith","invertBy","nativeKeysIn","isProto","baseKeysIn","CLONE_DEEP_FLAG","basePick","pickBy","toPairs","toPairsIn","camelCase","upperFirst","kebabCase","lowerCase","lowerFirst","snakeCase","startCase","upperCase","hasUnicodeWord","unicodeWords","asciiWords","attempt","bindAll","methodNames","flow","flowRight","methodOf","mixin","over","overEvery","overSome","basePropertyDeep","range","rangeRight","augend","addend","dividend","divisor","multiplicand","minuend","subtrahend","castArray","compact","cond","conforms","baseConforms","curry","curryRight","drop","dropRight","dropRightWhile","dropWhile","baseFill","flatMap","flatMapDeep","flatMapDepth","flattenDeep","flattenDepth","fromPairs","functions","functionsIn","initial","mapKeys","mapValues","matchesProperty","nthArg","omitBy","orderBy","propertyOf","pullAllBy","pullAllWith","sampleSize","setWith","shuffle","sortedUniq","sortedUniqBy","separator","limit","spread","tail","take","takeRight","takeRightWhile","takeWhile","tap","throttle","toPath","isArrLike","unary","uniq","uniqBy","unset","updateWith","valuesIn","wrap","zipObject","zipObjectDeep","entriesIn","extendWith","cloneDeep","cloneDeepWith","cloneWith","conformsTo","defaultTo","endsWith","escape","escapeRegExp","findKey","findLastKey","forIn","forInRight","forOwn","forOwnRight","inRange","baseInRange","isBoolean","isElement","isEqualWith","isMatch","isMatchWith","isNative","isNull","isSafeInteger","isUndefined","isWeakMap","isWeakSet","strictLastIndexOf","maxBy","mean","meanBy","minBy","stubObject","stubString","stubTrue","nth","noConflict","strLength","padEnd","padStart","radix","floating","reduceRight","sample","sortedIndex","sortedIndexBy","sortedIndexOf","sortedLastIndex","sortedLastIndexBy","sortedLastIndexOf","startsWith","sum","sumBy","isEscaping","isEvaluating","importsKeys","importsValues","interpolate","reDelimiters","evaluate","sourceURL","escapeValue","interpolateValue","esTemplateValue","evaluateValue","toLower","toSafeInteger","toUpper","trimEnd","trimStart","truncate","omission","newEnd","unescape","eachRight","VERSION","isFilter","takeName","dropName","checkIteratee","isTaker","lodashFunc","retUnwrapped","isLazy","useLazy","isHybrid","isUnwrapped","onlyLazy","chainName","view","getView","iterLength","takeCount","iterIndex","commit","areInputsEqual","newInputs","lastInputs","resultFn","lastResult","calledOnce","newArgs","__spreadArrays","il","jl","assignProp","carry","newVal","propType","mergeRecursively","newComer","extensions","targetVal","newComers","base","bubbleGum","citrine","citrineWebText","cottonCandy","eviteGreen","feedbackErrorBg","feedbackErrorSubtle","feedbackInformation","feedbackInformationBg","feedbackInformationSuble","feedbackMaybe","feedbackNo","feedbackNoReply","feedbackSuccess","feedbackSuccessBg","feedbackSuccessSubtle","feedbackWarning","feedbackWarningBg","feedbackWarningSubtle","feedbackYes","formBorderDisabled","linkColor","linkHoverColor","mediumAndUp","menuHover","mexicanOpal","mintChip","popoverColor","popoverTextColor","rose","rsvpMaybe","rsvpNo","rsvpYes","smallAndUp","spacingLg","spacingMd","spacingSm","tanzaniteWebText","tigersEye","tooltipColor","tooltipTextColor","vanilla","waffle","appleColor","darkBlue","darkMagenta","darkOrange","darkPurple","darkTeal","eviteBlue","eviteGold","eviteGreenDark","eviteMagenta","eviteOrange","evitePurple","eviteTeal","facebookColor","googleColor","gray2","gray3","gray4","gray5","gray6","maybeGold","paleBlue","paleBlueLight","twitterColor","ReactPropTypesSecret","bigint","autoAdjustOverflow","placements","rightTop","bottomRight","rightBottom","leftBottom","Popup","showArrow","arrowContent","prefixCls","overlayInnerStyle","_props$trigger","_props$mouseEnterDela","mouseEnterDelay","_props$mouseLeaveDela","mouseLeaveDelay","overlayStyle","_props$prefixCls","onVisibleChange","afterVisibleChange","transitionName","motion","_props$placement","_props$align","_props$destroyTooltip","destroyTooltipOnHide","defaultVisible","restProps","domRef","useImperativeHandle","extraProps","popupVisible","destroyTooltip","autoDestroy","keepParent","popupClassName","builtinPlacements","popupPlacement","popupAlign","getPopupContainer","onPopupVisibleChange","afterPopupVisibleChange","popupTransitionName","popupAnimation","popupMotion","defaultPopupVisible","destroyPopupOnHide","popupStyle","makePrefixMap","styleProp","prefixes","domSupport","vendorPrefixes","animationend","transitionend","transition","_document$createEleme","prefixedEventNames","getVendorPrefixedEventName","prefixMap","stylePropList","internalAnimationEndName","internalTransitionEndName","supportTransition","animationEndName","transitionEndName","transitionType","STATUS_NONE","STATUS_APPEAR","STATUS_ENTER","STATUS_LEAVE","STEP_NONE","STEP_PREPARE","STEP_START","STEP_ACTIVE","STEP_ACTIVATED","canUseDom","STEP_QUEUE","_React$Component","DomWrapper","_super","transitionSupport","isSupportTransition","motionName","CSSMotion","_props$visible","_props$removeOnLeave","removeOnLeave","forceRender","leavedClassName","eventProps","supportMotion","nodeRef","wrapperNodeRef","_useStatus","_ref$motionEnter","motionEnter","_ref$motionAppear","motionAppear","_ref$motionLeave","motionLeave","motionDeadline","motionLeaveImmediately","onAppearPrepare","onEnterPrepare","onLeavePrepare","onAppearStart","onEnterStart","onLeaveStart","onAppearActive","onEnterActive","onLeaveActive","onAppearEnd","onEnterEnd","onLeaveEnd","onVisibleChanged","_useState","_useState2","asyncVisible","setAsyncVisible","_useState3","_useState4","setStatus","_useState5","_useState6","deadlineRef","getDomElement","activeRef","onInternalMotionEnd","deadline","canEnd","_useDomMotionEvents","cacheElementRef","callbackRef","removeMotionEvents","useDomMotionEvents","patchMotionEvents","eventHandlers","_ref3","_ref4","_useStepQueue","setStep","_useNextFrame","nextFrameRef","cancelNextFrame","raf","nextFrame","nextFrameId","isCanceled","useNextFrame","_useNextFrame2","doNext","useStepQueue","onPrepare","_eventHandlers$step","_useStepQueue2","startStep","nextStatus","firstMountChangeRef","mergedStyle","useStatus","findDOMNode","_useStatus2","statusStep","statusStyle","mergedVisible","renderedRef","motionChildren","setNodeRef","_classNames","statusSuffix","STATUS_ADD","STATUS_KEEP","STATUS_REMOVE","STATUS_REMOVED","wrapKeyToObject","keyObj","parseKeys","_excluded","_excluded2","MOTION_PROP_NAMES","CSSMotionList","keyEntities","removeKey","nextKeyEntities","entity","_this2","_this$props","_onVisibleChanged","onAllRemoved","Component","motionProps","changedVisible","parsedKeyObjects","mixedKeyEntities","prevKeys","currentKeys","list","currentLen","prevKeyObjects","currentKeyObjects","hit","currentKeyObj","matchKey","diffKeys","prevEntity","_ref5","Mask","maskMotion","maskAnimation","maskTransitionName","monitorResize","prevHeight","resizeObserver","_target$getBoundingCl","fixedWidth","fixedHeight","observe","disconnect","getPoint","Align","onAlign","monitorWindowResize","_ref$monitorBufferTim","monitorBufferTime","cacheRef","childNode","only","forceAlignPropsRef","_useBuffer","calledRef","timeoutRef","cancelTrigger","_forceAlignPropsRef$c","latestDisabled","latestTarget","latestAlign","latestOnAlign","_result","_point","restoreFocus","useBuffer","_useBuffer2","_forceAlign","cancelForceAlign","_React$useState","_React$useState3","_React$useState4","setPoint","forceAlign","RcAlign","StatusQueue","PopupInner","stretch","getRootDomNode","getClassNameFromAlign","onTouchStart","alignRef","alignedClassName","setAlignedClassName","_useStretchStyle","targetSize","setTargetSize","sizeStyle","minHeight","tgtWidth","tgtHeight","_element$getBoundingC","useStretchStyle","_useStretchStyle2","stretchStyle","measureStretchStyle","_useVisibleStatus","doMeasure","setInternalStatus","rafRef","cancelRaf","mark","_callee","_context","useVisibleStatus","_useVisibleStatus2","goNextStatus","alignTimes","setAlignTimes","prepareResolveRef","_alignRef$current","onInternalAlign","popupDomNode","matchAlign","nextAlignedClassName","_prepareResolveRef$cu","onShowPrepare","originHandler","pointerEvents","alignDisabled","motionRef","motionClassName","motionStyle","mergedClassName","onMouseDownCapture","onTouchStartCapture","MobilePopupInner","_props$mobile","_props$mobile$popupMo","popupRender","innerVisible","serInnerVisible","inMobile","setInMobile","cloneProps","popupNode","_defineProperties","toPropertyKey","_assertThisInitialized","ReferenceError","_setPrototypeOf","setPrototypeOf","__proto__","_getPrototypeOf","Portal","didUpdate","getContainer","parentRef","containerRef","initRef","_containerRef$current","_containerRef$current2","isPointsEq","isAlignPoint","ALL_HANDLERS","PortalComponent","Trigger","subClass","superClass","_inherits","Constructor","protoProps","staticProps","Derived","hasNativeReflectConstruct","Reflect","construct","sham","Proxy","Super","NewTarget","_popupVisible","_classCallCheck","fireEvents","delaySetPopupVisible","clearDelayTimer","_this$popupRef$curren","relatedTarget","popupRef","isFocusToShow","focusTime","focusDelay","preClickTime","preTouchTime","isBlurToHide","blurDelay","setPopupVisible","isContextMenuToShow","preTime","isClickToShow","isClickToHide","nextVisible","_this$context","hasPopupMouseDown","mouseDownTimeout","onPopupMouseDown","maskClosable","getPopupDomNode","isContextMenuOnly","getTriggerDOMNode","triggerRef","getPopupClassNameFromAlign","getAlignPopupClassName","_this$props2","onPopupAlign","onPopupClick","_this$state","getPopupAlign","mouseProps","isMouseEnterToShow","onPopupMouseEnter","isMouseLeaveToHide","onPopupMouseLeave","popupContainer","attachId","mountNode","_this$props3","attachParent","portalContainer","prevPopupVisible","newState","componentDidUpdate","currentDocument","clickOutsideHandler","onDocumentClick","touchOutsideHandler","contextMenuOutsideHandler1","onContextMenuClose","contextMenuOutsideHandler2","clearOutsideHandler","_this$popupRef$curren2","placementStr","baseAlign","getAlignFromPlacement","delayS","delayTimer","childPros","_this$props4","showAction","_this$props5","_this$props6","hideAction","_this$props7","_this$props8","_this$props9","_this$props10","_this$popupRef$curren3","childCallback","_this$props11","child","newChildProps","onContextMenu","createTwoChains","childrenClassName","portal","handlePortalUpdate","getComponent","triggerContextValue","getMotion","addEventListenerWrap","offsetParent","SVGGraphicsElement","getBBox","_element$getBBox","_width","_height","useSafeState","destroyRef","_x","_r","ignoreDestroy","warned","warning","obj1","obj2","shallow","refSet","deepEqual","level","circular","newLevel","agent","opera","caf","num","handle","rafUUID","rafIds","cleanup","wrapperRaf","callRef","leftTimes","realId","fillRef","composeRef","refs","refList","supportRef","nodeOrComponent","_type$prototype","_nodeOrComponent$prot","pageXOffset","pageYOffset","onMove","onKey","nativeEvent","tabIndex","grad","turn","S","I","N","P","R","hue","hsva","D","K","L","toHsva","equal","fromHsva","X","Y","colorModel","defaultColor","G","J","Q","U","W","Z","ee","te","oe","ne","ae","le","ue","ce","se","fe","validate","spellCheck","ie","HexAlphaColorPicker","HexColorInput","prefixed","HslColorPicker","HslStringColorPicker","HslaColorPicker","HslaStringColorPicker","HsvColorPicker","HsvStringColorPicker","HsvaColorPicker","HsvaStringColorPicker","RgbColorPicker","RgbStringColorPicker","RgbaColorPicker","RgbaStringColorPicker","setNonce","for","$$typeof","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Lazy","Profiler","StrictMode","Suspense","isAsyncMode","isConcurrentMode","isContextConsumer","isContextProvider","isForwardRef","isFragment","isPortal","isProfiler","isStrictMode","isSuspense","isValidElementType","typeOf","componentWillMount","componentWillReceiveProps","nextProps","componentWillUpdate","prevProps","__reactInternalSnapshotFlag","__reactInternalSnapshot","getSnapshotBeforeUpdate","polyfill","isReactComponent","foundWillMountName","foundWillReceivePropsName","foundWillUpdateName","UNSAFE_componentWillMount","UNSAFE_componentWillReceiveProps","UNSAFE_componentWillUpdate","newApiName","maybeSnapshot","__suppressDeprecationWarning","invariantViolation","ModalContext","hideModal","__assign","ModalRenderer","_a","__rest","ModalRoot","_b","RootComponent","_c","setMountNode","ModalProvider","rootComponent","setModals","newModals","contextValue","generateModalKey","useModal","inputs","isShown","setShown","bodyOpenClassName","portalClassName","_extends","_createClass","_react","_react2","_interopRequireDefault","_reactDom2","_propTypes2","_ModalPortal2","ariaAppHider","newObj","_interopRequireWildcard","_safeHTMLElement","_safeHTMLElement2","_reactLifecyclesCompat","_possibleConstructorReturn","isReact16","createPortal","createHTMLElement","getCreatePortal","unstable_renderSubtreeIntoContainer","getParentElement","parentSelector","_Component","_temp","removePortal","unmountComponentAtNode","portalRef","renderPortal","defaultStyles","prevParent","nextParent","closesAt","beforeClose","closeWithTimeout","htmlOpenClassName","afterOpen","appElement","SafeHTMLCollection","SafeNodeList","onAfterOpen","onRequestClose","ariaHideApp","shouldFocusAfterRender","shouldCloseOnOverlayClick","shouldReturnFocusAfterClose","preventScroll","aria","contentLabel","shouldCloseOnEsc","contentRef","overlayElement","contentElement","contentEl","border","WebkitOverflowScrolling","outline","focusManager","_scopeTab2","_portalOpenInstances2","CLASS_NAMES","ariaHiddenInstances","ModalPortal","setOverlayRef","setContentRef","afterClose","returnFocus","teardownScopedFocus","popWithoutFocus","onAfterClose","deregister","beforeOpen","closeTimer","setupScopedFocus","markForFocusLater","openAnimationFrame","overlayEl","closeWithoutTimeout","focusContent","contentHasFocus","handleKeyDown","requestClose","handleOverlayOnClick","shouldClose","ownerHandlesClose","handleContentOnMouseUp","handleOverlayOnMouseDown","handleContentOnClick","handleContentOnMouseDown","shouldBeClosed","buildClassName","additional","attributesFromObject","moveFromContentToOverlay","hide","register","_props2","contentStyles","overlayStyles","overlayProps","contentProps","testId","resetState","globalElement","assertNodeList","useElement","validateElement","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","documentNotReadyOrSSRTesting","_warning2","HTMLCollection","NodeList","_arr2","_i2","check","subscribe","openInstances","lastChild","parentElement","htmlElement","htmlClassList","_cls","docBodyClassList","classString","classListRef","incrementReference","decrementReference","focusLaterElements","handleBlur","handleFocus","toFocus","modalElement","detachEvent","_tabbable2","needToFocus","portalOpenInstances","PortalOpenInstances","openInstance","emit","subscribers","subscriber","EE","SafeHTMLElement","tabbable","getActiveElement","checkSafari","shadowRoot","findTabbableDescendants","finished","tabbableNode","hidesContents","zeroSize","exception","isTabIndexNaN","isTabIndexNotNaN","rootNode","getRootNode","focusable","_Modal2","ReactReduxContext","batch","getBatch","nullListeners","notify","createSubscription","parentSub","unsubscribe","handleChangeWrapper","subscription","onStateChange","trySubscribe","addNestedSub","isSubscribed","createListenerCollection","notifyNestedSubs","tryUnsubscribe","getListeners","useIsomorphicLayoutEffect","previousState","Context","_objectWithoutPropertiesLoose","excluded","sourceKeys","EMPTY_ARRAY","NO_SUBSCRIPTION_ARRAY","storeStateUpdatesReducer","updateCount","useIsomorphicLayoutEffectWithArgs","effectFunc","effectArgs","dependencies","captureWrapperProps","lastWrapperProps","lastChildProps","renderIsScheduled","wrapperProps","actualChildProps","childPropsFromStoreUpdate","subscribeUpdates","shouldHandleStateChanges","childPropsSelector","forceComponentUpdateDispatch","didUnsubscribe","lastThrownError","checkForUpdates","latestStoreState","initStateUpdates","connectAdvanced","selectorFactory","_ref2$getDisplayName","getDisplayName","_ref2$methodName","_ref2$renderCountProp","renderCountProp","_ref2$shouldHandleSta","_ref2$storeKey","storeKey","_ref2$forwardRef","withRef","_ref2$context","connectOptions","wrappedComponentName","selectorFactoryOptions","pure","usePureOnlyMemo","ConnectFunction","_useMemo","reactReduxForwardedRef","propsContext","ContextToUse","didStoreComeFromProps","createChildSelector","_useMemo2","overriddenContextValue","_useReducer","useReducer","previousStateUpdateResult","renderedWrappedComponent","Connect","forwarded","is","objA","objB","keysA","keysB","wrapMapToPropsConstant","getConstant","constantSelector","dependsOnOwnProps","getDependsOnOwnProps","mapToProps","wrapMapToPropsFunc","proxy","stateOrDispatch","ownProps","mapDispatchToProps","actionCreators","boundActionCreators","_loop","actionCreator","bindActionCreators","mapStateToProps","defaultMergeProps","stateProps","dispatchProps","mergeProps","areMergedPropsEqual","hasRunOnce","nextMergedProps","wrapMergePropsFunc","impureFinalPropsSelectorFactory","pureFinalPropsSelectorFactory","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","hasRunAtLeastOnce","nextOwnProps","nextStateProps","statePropsChanged","propsChanged","stateChanged","handleSubsequentCalls","finalPropsSelectorFactory","initMapStateToProps","initMapDispatchToProps","initMergeProps","factories","strictEqual","createConnect","_ref$connectHOC","connectHOC","_ref$mapStateToPropsF","mapStateToPropsFactories","_ref$mapDispatchToPro","mapDispatchToPropsFactories","_ref$mergePropsFactor","mergePropsFactories","_ref$selectorFactory","_ref3$pure","_ref3$areStatesEqual","_ref3$areOwnPropsEqua","_ref3$areStatePropsEq","_ref3$areMergedPropsE","extraOptions","createStoreHook","useReduxContext","createDispatchHook","refEquality","createSelectorHook","equalityFn","_useReduxContext","selectedState","contextSub","latestSubscriptionCallbackError","latestSelector","latestSelectedState","storeState","newSelectedState","newStoreState","_newSelectedState","useSelectorWithStoreAndSubscription","useDebugValue","newBatch","_inheritsLoose","BrowserRouter","Router","HashRouter","resolveToLocation","normalizeToLocation","forwardRefShim","LinkAnchor","forwardedRef","innerRef","_onClick","defaultPrevented","isModifiedEvent","_ref2$component","__RouterContext","isDuplicateNavigation","forwardRefShim$1","forwardRef$1","NavLink","_ref$ariaCurrent","ariaCurrent","_ref$activeClassName","activeClassName","activeStyle","classNameProp","isActiveProp","locationProp","sensitive","strict","escapedPath","matchPath","joinClassnames","compareOption","accessors","candidate","optionValue","getOptionValue","optionLabel","getOptionLabel","builtins","formatCreateLabel","selectValue","selectOptions","getNewOptionData","__isNew__","useCreatable","_ref$allowCreateWhile","allowCreateWhileLoading","_ref$createOptionPosi","createOptionPosition","_ref$formatCreateLabe","_ref$isValidNewOption","_ref$getNewOptionData","onCreateOption","propsOptions","propsOnChange","restSelectProps","_restSelectProps$getO","getOptionValue$1","_restSelectProps$getO2","getOptionLabel$1","isLoading","isMulti","newOption","actionMeta","valueArray","newOptionData","newActionMeta","A11yText","defaultAriaLiveMessages","guidance","tabSelectsValue","_props$label","labels","focused","_props$label2","isSelected","getArrayIndex","onFilter","resultsMessage","LiveRegion","ariaSelection","focusedOption","focusedValue","focusableOptions","ariaLiveMessages","isOptionDisabled","menuIsOpen","screenReaderStatus","ariaLive","messages","ariaSelected","selectedOptions","removedValue","removedValues","multiSelected","onChangeProps","ariaFocused","focusMsg","onFocusProps","ariaResults","resultsMsg","ariaGuidance","guidanceMsg","ariaContext","ScreenReaderText","isInitialFocus","diacritics","anyDiacritic","diacriticToBase","diacritic","stripDiacritics","memoizedStripDiacriticsForInput","trimString","defaultStringify","createFilter","rawInput","_ignoreCase$ignoreAcc","ignoreCase","ignoreAccents","matchFrom","DummyInput","filteredProps","caretColor","gridArea","STYLE_KEYS","LOCK_STYLES","boxSizing","preventTouchMove","allowTouchMove","preventInertiaScroll","totalScroll","currentScroll","isTouchDevice","activeScrollLocks","listenerOptions","capture","blurSelectInput","ScrollManager","lockEnabled","_ref$captureEnabled","captureEnabled","setScrollCaptureTarget","isEnabled","onBottomArrive","onBottomLeave","onTopArrive","onTopLeave","isBottom","isTop","touchStart","scrollTarget","handleEventDelta","_scrollTarget$current","isDeltaPositive","availableScroll","shouldCancelScroll","cancelScroll","onWheel","onTouchMove","startListening","notPassive","stopListening","useScrollCapture","setScrollLockTarget","_ref$accountForScroll","accountForScrollbars","originalStyles","addScrollLock","touchScrollTarget","targetStyle","currentPadding","adjustedPadding","removeScrollLock","useScrollLock","clearIndicator","dropdownIndicator","groupHeading","indicatorsContainer","loadingIndicator","menu","menuList","menuPortal","multiValue","multiValueLabel","multiValueRemove","noOptionsMessage","singleValue","valueContainer","mergeStyles","keyAsString","rsCss","defaultTheme","primary","primary75","primary50","primary25","danger","dangerLight","neutral0","neutral5","neutral10","neutral20","neutral30","neutral40","neutral50","neutral60","neutral70","neutral80","neutral90","spacing","baseUnit","controlHeight","menuGutter","backspaceRemovesValue","blurInputOnSelect","captureMenuScroll","closeMenuOnSelect","closeMenuOnScroll","controlShouldRenderValue","escapeClearsValue","filterOption","formatGroupLabel","isRtl","maxMenuHeight","minMenuHeight","menuPosition","menuShouldBlockScroll","menuShouldScrollIntoView","openMenuOnFocus","openMenuOnClick","pageSize","toCategorizedOption","_isOptionDisabled","_isOptionSelected","buildCategorizedOptions","groupOrOption","groupOrOptionIndex","categorizedOptions","optionIndex","categorizedOption","isFocusable","buildFocusableOptionsFromCategorizedOptions","optionsAccumulator","_props$inputValue","shouldHideSelectedOptions","_filterOption","isOptionSelected","hideSelectedOptions","instanceId","Select","inputIsHidden","clearFocusValueOnUpdate","prevWasFocused","inputIsHiddenAfterUpdate","blockOptionHover","isComposing","commonProps","initialTouchX","initialTouchY","instancePrefix","openAfterFocus","scrollToFocusedOptionOnUpdate","userIsDragging","controlRef","getControlRef","focusedOptionRef","getFocusedOptionRef","menuListRef","getMenuListRef","getInputRef","focusInput","blurInput","ariaOnChange","onInputChange","prevInputValue","onMenuClose","selectOption","removeValue","newValueArray","clearValue","popValue","lastSelectedValue","classNamePrefix","getStyles","custom","getElementId","getComponents","getCategorizedOptions","buildFocusableOptions","getFocusableOptions","onMenuMouseDown","onMenuMouseMove","onControlMouseDown","openMenu","onDropdownIndicatorMouseDown","onClearIndicatorMouseDown","onScroll","touch","deltaX","onTouchEnd","onControlTouchEnd","onClearIndicatorTouchEnd","onDropdownIndicatorTouchEnd","handleInputChange","onMenuOpen","onInputFocus","onInputBlur","onOptionHover","focusValue","focusOption","startListeningComposition","startListeningToTouch","stopListeningComposition","stopListeningToTouch","_this$state2","openAtIndex","selectedIndex","_this$state3","focusedIndex","nextFocus","hasValue","getTheme","formatOptionLabel","_inputValue","_selectValue","inputId","form","_this$state4","ariaAttributes","autoCapitalize","autoCorrect","isHidden","_this3","_this$getComponents2","MultiValue","MultiValueContainer","MultiValueLabel","MultiValueRemove","Placeholder","_this$state5","innerProps","isOptionFocused","Label","Remove","removeProps","ClearIndicator","LoadingIndicator","_this$getComponents5","IndicatorSeparator","_this4","_this$getComponents7","GroupHeading","Menu","MenuList","MenuPortal","LoadingMessage","NoOptionsMessage","Option","_this$props12","menuPortalTarget","onMenuScrollToTop","onMenuScrollToBottom","menuUI","onHover","optionId","onMouseOver","hasOptions","_data","groupIndex","groupId","headingId","Heading","headingProps","_message","menuPlacementProps","menuElement","_ref4$placerProps","placerProps","scrollTargetRef","appendTo","controlElement","_this5","_this$props13","_this$state6","_this$getComponents8","IndicatorsContainer","SelectContainer","ValueContainer","_this$props14","getCommonProps","renderLiveRegion","renderPlaceholderOrValue","renderInput","renderClearIndicator","renderLoadingIndicator","renderIndicatorSeparator","renderDropdownIndicator","renderMenu","renderFormField","newMenuOptionsState","nextSelectValue","lastFocusedIndex","getNextFocusedValue","lastFocusedOption","getNextFocusedOption","newInputIsHiddenState","newAriaSelection","hasKeptFocus","_createSuper","_isNativeReflectConstruct","_excluded$3","applyPrefixToName","cleanValue","cleanCommonProps","isDocumentElement","animatedScrollTo","animateScroll","menuEl","focusedEl","menuRect","focusedRect","overScroll","isTouchCapable","createEvent","isMobileDevice","passiveOptionAccessed","supportsPassiveEvents","notNullish","valueTernary","singleValueAsValue","multiValueAsValue","propsObj","coercePlacement","menuCSS","_ref2$theme","alignToControl","PortalPlacementContext","getPortalPlacement","MenuPlacer","getPlacement","isFixedPosition","shouldScroll","scrollParent","excludeStaticParent","overflowRx","getScrollParent","defaultState","_menuEl$getBoundingCl","menuBottom","menuHeight","menuTop","containerTop","viewHeight","viewSpaceAbove","viewSpaceBelow","scrollSpaceAbove","scrollSpaceBelow","scrollDown","scrollUp","scrollDuration","_constrainedHeight","spaceAbove","_constrainedHeight2","getMenuPlacement","getUpdatedProps","menuListCSS","noticeCSS","_ref5$theme","noOptionsMessageCSS","loadingMessageCSS","_templateObject","menuPortalCSS","_ref6","_Component2","_super2","_ref7","isFixed","getBoundingClientObj","scrollDistance","menuWrapper","containerCSS","valueContainerCSS","alignItems","flexWrap","indicatorsContainerCSS","alignSelf","_excluded$2","Svg","CrossIcon","DownChevron","baseCSS","_ref3$theme","dropdownIndicatorCSS","clearIndicatorCSS","indicatorSeparatorCSS","_ref4$theme","loadingDotAnimations","loadingIndicatorCSS","verticalAlign","LoadingDot","indicator","css$1","_ref$theme","borderStyle","boxShadow","justifyContent","_excluded$1","groupCSS","groupHeadingCSS","textTransform","inputCSS","containerStyle","spacingStyle","gridTemplateColumns","whiteSpace","inputStyle","multiValueCSS","multiValueLabelCSS","cropWithEllipsis","textOverflow","multiValueRemoveCSS","MultiValueGeneric","optionCSS","userSelect","WebkitTapHighlightColor","placeholderCSS","_cleanCommonProps","indicators","inputClassName","emotionCx","defaultComponents","StateManagedSelect","baseSelectProps","NonceProvider","createEmotionCache","emotionCache","useStateManager","_ref$defaultInputValu","defaultInputValue","_ref$defaultMenuIsOpe","defaultMenuIsOpen","_ref$defaultValue","propsInputValue","propsMenuIsOpen","propsOnInputChange","propsOnMenuClose","propsOnMenuOpen","propsValue","stateInputValue","setStateInputValue","stateMenuIsOpen","setStateMenuIsOpen","stateValue","setStateValue","UP","DOWN","preventScrollOnSwipe","rotationAngle","trackMouse","trackTouch","swipeDuration","touchEventOptions","swiping","mouseMove","mouseUp","touchEnd","touchMove","rotateXYByAngle","angleInRadians","transientState","transientProps","previousProps","defaultKey","attachTouch","handlerProps","onUp","onTouchStartOrOnMouseDown","timeStamp","absX","absY","velocity","vxvy","getDirection","onSwipeStart","onSwiping","cancelablePageSwipe","onSwiped","cancelable","onEnd","onSwipedDir","onTap","onTouchEndOrOnMouseUp","baseOptions","tls","addState","cleanUpTouch","getHandlers","stateSetter","updateTransientState","ArrowContainer","jsx_runtime_1","react_1","useArrowContainer_1","childRect","popoverRect","arrowColor","arrowSize","arrowClassName","externalArrowStyle","arrowStyle","externalArrowContainerStyle","useArrowContainer","arrowContainerStyle","mergedContainerStyle","mergedArrowStyle","jsxs","usePopover","PopoverPortal_1","util_1","usePopover_1","useMemoizedArray_1","ArrowContainer_1","DEFAULT_POSITIONS","PopoverInternal","externalRef","externalPositions","reposition","_f","_g","boundaryElement","_h","contentLocation","boundaryInset","_k","useMemoizedArray","prevIsOpen","prevPositions","prevContentLocation","prevReposition","childRef","_l","nudgedLeft","nudgedTop","EMPTY_CLIENT_RECT","parentRect","boundaryRect","violations","hasViolations","popoverState","setPopoverState","onPositionPopover","_m","positionPopover","popoverRef","scoutRef","shouldUpdate","updatePopover","rectsAreEqual","popoverElement","handleOnClickOutside","handleRef","cloneElement","PopoverPortal","scoutElement","react_dom_1","arrowWidth","leftUpperBound","topUpperBound","borderTop","borderBottom","borderRight","borderLeft","useElementRef","createContainer","externalArray","prevArrayRef","useElementRef_1","POPOVER_STYLE","SCOUT_STYLE","positionIndex","scoutRect","inputTop","inputLeft","left_1","top_1","isExhausted","getNewPopoverRect","boundaryViolation","shouldNudge","_o","getNudgedPopoverRect","finalTop","finalLeft","potentialViolations","popoverRectForPosition","rectA","rectB","targetMidX","targetMidY","topBoundary","leftBoundary","rightBoundary","bottomBoundary","isValidElement","enter","appendPosition","collapse","collapseDuration","preventExitTransition","isIn","dispatchEvent","Event","containerId","emitQueue","cancelEmit","spinner","toastKey","displayedToast","queue","isToastActive","getToast","toastContent","toastProps","staleId","enableMultiContainer","updateId","closeToast","toastClassName","bodyClassName","progressClassName","deleteToast","iconOut","closeButton","getToastToRender","newestOnTop","targetTouches","removalDistance","canCloseOnClick","canDrag","didMove","draggableDirection","draggablePercent","pauseOnFocusLoss","hasFocus","playToast","pauseToast","isRunning","toastRef","controlledProgress","rtl","animationDuration","animationPlayState","defaultClassName","progressStyle","F","clearWaitingQueue","POSITION","TOP_LEFT","TOP_RIGHT","TOP_CENTER","BOTTOM_LEFT","BOTTOM_RIGHT","BOTTOM_CENTER","TYPE","INFO","SUCCESS","WARNING","ERROR","DEFAULT","Bounce","Flip","Icons","Slide","ToastContainer","Zoom","collapseToast","cssTransition","useToast","useToastContainer","replaceClassName","origClass","classToRemove","forceReflow","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","initialStatus","appear","isMounting","appearStatus","in","unmountOnExit","mountOnEnter","nextCallback","componentDidMount","updateStatus","componentWillUnmount","cancelNextCallback","getTimeouts","mounting","performEnter","performExit","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","safeSetState","onEntered","onEnter","onEntering","onTransitionEnd","onExit","onExiting","onExited","setNextCallback","doesNotHaveTimeoutOrListener","addEndListener","maybeNextCallback","childProps","TransitionGroupContext","baseVal","CSSTransition","appliedClasses","_this$resolveArgument","resolveArguments","removeClasses","_this$resolveArgument2","_this$resolveArgument3","getClassNames","isStringClassNames","baseClassName","doneClassName","phase","hasClass","_addClass","_this$appliedClasses$","getChildMapping","mapFn","mapper","getProp","getNextChildMapping","prevChildMapping","nextChildMapping","getValueForKey","nextKeysPending","pendingKeys","prevKey","childMapping","nextKey","pendingNextKey","mergeChildMappings","hasPrev","hasNext","prevChild","isLeaving","TransitionGroup","handleExited","firstRender","mounted","currentChildMapping","childFactory","ReplaceTransition","_args","handleEnter","handleLifecycle","handleEntering","_len3","_key3","handleEntered","_len4","_key4","handleExit","_len5","_key5","handleExiting","_len6","_key6","_len7","_key7","originalArgs","_child$props","inProp","_React$Children$toArr","second","_leaveRenders","_enterRenders","modes","callHook","_element$props","leaveRenders","changeState","enterRenders","SwitchTransition","appeared","oldChildren","newChildren","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","__self","__source","_owner","createThunkMiddleware","extraArgument","withExtraArgument","formatProdErrorMessage","$$observable","observable","randomString","ActionTypes","INIT","REPLACE","PROBE_UNKNOWN_ACTION","reducer","preloadedState","enhancer","currentReducer","currentState","currentListeners","nextListeners","isDispatching","ensureCanMutateNextListeners","replaceReducer","nextReducer","outerSubscribe","observer","observeState","legacy_createStore","reducers","reducerKeys","finalReducers","shapeAssertionError","finalReducerKeys","assertReducerShape","hasChanged","previousStateForKey","nextStateForKey","bindActionCreator","middlewares","_dispatch","middlewareAPI","middleware","MapShim","getIndex","class_1","__entries__","isBrowser","global$1","requestAnimationFrame$1","transitionKeys","mutationObserverSupported","MutationObserver","ResizeObserverController","connected_","mutationEventsAdded_","mutationsObserver_","observers_","onTransitionEnd_","leadingCall","trailingCall","resolvePending","timeoutCallback","addObserver","connect_","removeObserver","observers","disconnect_","updateObservers_","activeObservers","gatherActive","hasActive","broadcastActive","childList","characterData","subtree","instance_","defineConfigurable","getWindowOf","emptyRect","createRectInit","toFloat","getBordersSize","isSVGGraphicsElement","SVGElement","getContentRect","getSVGContentRect","paddings","positions_1","getPaddings","horizPad","vertPad","vertScrollbar","horizScrollbar","getHTMLElementContentRect","ResizeObservation","broadcastWidth","broadcastHeight","contentRect_","broadcastRect","ResizeObserverEntry","rectInit","Constr","contentRect","DOMRectReadOnly","ResizeObserverSPI","controller","callbackCtx","activeObservations_","observations_","callback_","controller_","callbackCtx_","observations","unobserve","clearActive","observation","ResizeObserver","isAbsolute","spliceOne","hasTrailingSlash","toParts","fromParts","isToAbs","isFromAbs","mustEndAbs","part","interleave","interpolations","classCallCheck","inherits","possibleConstructorReturn","freeze","EMPTY_OBJECT","getComponentName","isStyledComponent","styledComponentId","SC_ATTR","REACT_APP_SC_ATTR","SC_VERSION_ATTR","IS_BROWSER","DISABLE_SPEEDY","SC_DISABLE_SPEEDY","REACT_APP_SC_DISABLE_SPEEDY","STATIC_EXECUTION_CONTEXT","StyledComponentsError","_Error","SC_COMPONENT_ID","extractComps","maybeCSS","existingComponents","componentId","matchIndex","nextComp","cssFromDOM","COMMENT_REGEX","stylisSplitter","cascade","keyframe","compress","semicolon","stylis","parsingRules","returnRulesPlugin","parsedRules","parseRulesPlugin","_componentId","_selector","_selectorRegexp","selfReferenceReplacer","use","splitByRules","stringifyRules","flatCSS","cssStr","MAX_SIZE","getNonce","addNameForId","names","resetIdNames","hasNameForId","stringifyNames","safeInsertRule","cssRule","maxIndex","makeTextMarker","addUpUntilIndex","sizes","totalUpToIndex","wrapAsHtmlTag","additionalAttrs","wrapAsElement","dangerouslySetInnerHTML","__html","getIdsFromMarkersFactory","markers","makeTextNode","targetDocument","makeServerTag","namesArg","markersArg","insertMarker","cssForId","namesClone","cloneNames","markersClone","getIds","insertRules","removeRules","marker","sealed","styleTag","toElement","toHTML","makeTag","tagEl","forceServer","getImportRuleTag","makeStyleTag","extractImport","usedImportRuleTag","importRules","cssRulesSize","mayHaveImport","appendData","newMarker","makeBrowserTag","insertIndex","injectedRules","isConnected","removalIndex","deleteRule","deleteRules","makeSpeedyTag","SPLIT_REGEX","sheetRunningId","master","importRuleTag","firstTag","tagMap","deferred","rehydratedNames","ignoreRehydratedNames","capacity","clones","rehydrate","els","extracted","isStreamed","nodesSize","elNames","elNamesSize","extractedSize","_extracted$i","ids","newTag","sealAllTags","lastEl","getTagForId","hasId","deferredInject","inject","toReactElements","Keyframes","styleSheet","getName","uppercasePattern","msPattern","hyphenateStyleName","isFalsish","objToCssArray","executionContext","ruleSet","constructWithOptions","componentConstructor","templateFunction","withConfig","murmurhash","getAlphabeticChar","generateAlphabeticName","isStaticRules","hasFunctionObjectKey","_TYPE_STATICS","hasher","ComponentStyle","isStatic","generateAndInjectStyles","lastClassName","generateName","determineTheme","fallbackTheme","isDefaultTheme","escapeRegex","dashesAtEnds","isTag","defineProperty$1","_Object$getOwnPropert","arrayPrototype","ThemeConsumer","ThemeProvider","renderInner","outerTheme","ServerStyleSheet","masterSheet","seal","collectStyles","StyleSheetManager","getStyleTags","getStyleElement","interleaveWithNodeStream","readableStream","StyleSheetContext","StyleSheetConsumer","identifiers","StyledComponent","renderOuter","forwardedComponent","componentStyle","generatedClassName","_props$forwardedCompo","foldedComponentIds","elementToBeCreated","isTargetTag","propsForElement","computedProps","buildExecutionContext","attrDef","resolvedAttrDef","attrDefWasFn","_props$forwardedCompo2","warnTooManyClasses","createStyledComponent","isTargetStyledComp","isClass","_options$displayName","generateDisplayName","_options$componentId","_ComponentStyle","_displayName","parentComponentId","nr","generateId","_options$ParentCompon","ParentComponent","_options$attrs","finalAttrs","WrappedStyledComponent","withComponent","previousComponentId","optionsToCopy","objectWithoutProperties","newComponentId","_foldedDefaultProps","domElement","GlobalStyle","createStyles","removeStyles","renderStyles","createGlobalStyle","GlobalStyleComponent","_this$constructor","globalStyle","scCGSHMRCache","replaceWhitespace","withTheme","Component$$1","WithTheme","themeProp","__DO_NOT_USE_OR_YOU_WILL_BE_HAUNTED_BY_SPOOKY_GHOSTS","needle","toSheet","parents","ns","he","de","be","pe","ke","ge","Ae","Ce","we","ve","me","xe","$e","ye","Oe","je","ze","Ne","Se","Fe","We","qe","Be","De","Ee","Ge","He","Je","Re","Te","Ue","Ve","Xe","Ye","Qe","Ie","Pe","Me","Le","Ke","isProduction","invariant","getRandomValues","rnds8","rng","crypto","msCrypto","uuid","byteToHex","_nodeId","_clockseq","_lastMSecs","_lastNSecs","buf","clockseq","seedBytes","msecs","nsecs","dt","tmh","hashfunc","generateUUID","stringToBytes","DNS","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","cnt","md5ff","md5gg","md5hh","md5ii","v35","length32","hexTab","hex","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","ROTL","_t2","valueEqual","aValue","bValue","ReactDom","ReactRouter","mobx","Store2","assertThisInitialized","_objectWithoutProperties","sourceSymbolKeys","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","_regeneratorRuntime","Op","desc","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","define","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","makeInvokeMethod","tryCatch","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","record","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","delegate","delegateResult","maybeInvokeDelegate","_sent","dispatchException","abrupt","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iteratorMethod","doneResult","isGeneratorFunction","genFun","ctor","awrap","iter","skipTempReset","rootRecord","rval","caught","hasCatch","hasFinally","finallyEntry","thrown","delegateYield","_toPropertyKey","hint","prim","toPrimitive","unsupportedIterableToArray","_taggedTemplateLiteral","_toConsumableArray","arrayLikeToArray","__webpack_module_cache__","inProgress","dataWebpackPrefix","__webpack_require__","moduleId","cachedModule","__webpack_modules__","amdO","getter","definition","chunkId","all","miniCssF","globalThis","needAttach","charset","nc","onScriptComplete","doneFns","nmd","installedCssChunks","miniCss","fullhref","existingLinkTags","dataHref","existingStyleTags","findStylesheet","oldTag","linkTag","errorType","realHref","createStylesheet","loadStylesheet","installedChunks","installedChunkData","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","createCreateFabricInvitationStore","getUserData","isInGalleryPremiumAdoptionVariation","event_widgets","guestsAPI","setupWebviewNavigation","setupWebviewDowngradeConnection","setupWebviewCheckoutCompleteConnection","setupWebviewSendCompleteConnection","setupWebviewPostLoginSuccessConnection","setupWebviewUpsellAcceptConnection","stripePublishableKey","stripeOptions","TrackRouteChanges","contentPanel","sections","getElementsByClassName","activeSection","useTrackPages","CONTENT_PATHS","FabricCreateInvitationApp","inUpsellMode","eventInUpsellMode","PROPAGATE_STEP_CHANGE","appHeight","urlPath","sending","fetchAllAssets","NavHeader","Switch","Route","ContentAsync","EventCreateDesignContainer","EventDetailsAsync","EventGiftingAsync","PreviewAsync","EventGuestsAsync","GuestOptionsAsync","fullscreen","EventReviewAsync","UpsellAsync","SuccessAsync","InjectableFooter","FabricCreateInvitationAppWrapper","RoktLauncherContextProvider","roktSandbox","LoginModalReduxWrapper","NotifyGuestsOverlay","ReactDOM"],"sourceRoot":""}