{"version":3,"file":"static/js/270.53b0cf97.chunk.js","mappings":"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","sources":["app-react/components/base-components/orbit-component-with-state/orbit-component-with-state.ts","app-react/components/base-components/orbit-component/orbit-component.ts","app-react/components/raw-components/image/image.tsx","app-react/components/tap-handler/tap-handler.component.tsx","app-react/orbit-context.ts","app-react/services/dom/dom.service.ts","app-react/services/routing/route/fallback-route.ts","app-react/services/routing/route/route-base.ts","app-react/services/routing/routing-utils.ts","app-react/services/splash/splash.service.ts","common/utils/time-functions.ts","sdk/src/utils/device/detection/feature.ts","sdk/src/utils/device/detection/os.ts","sdk/src/utils/device/detection/viewport.ts","sdk/src/utils/device/detection/model.ts","sdk/src/utils/device/detection/browser.ts","sdk/src/utils/device/detection/hybrid.ts","sdk/src/utils/device/device.ts","sdk/src/utils/dom.ts","sdk/src/utils/logger.ts","sdk/src/utils/store.ts","sdk/src/utils/strings.ts","sdk/src/utils/underscore.ts","utils/Lazy.ts","utils/array-helper.ts","utils/automation-helpers.ts","utils/string-helpers.ts"],"sourcesContent":["import React from 'react';\r\nimport {IServiceFactory} from '../../../services/service-factory.interface';\r\nimport {OrbitContext} from '../../../orbit-context';\r\nimport {reaction as mobxReaction, IReactionDisposer, IReactionOptions, IReactionPublic} from 'mobx';\r\n\r\n\r\nexport class OrbitComponentWithState extends React.Component {\r\n\r\n private _reactions: IReactionDisposer[] = [];\r\n\r\n protected get services(): IServiceFactory {\r\n /** This code is for unit tests, enzyme is not compatible wit the current react context api so we pass the context through a prop */\r\n if ((this.props as any)['context']) {\r\n return (this.props as any)['context'].services;\r\n }\r\n\r\n return (this.context as any).services;\r\n }\r\n\r\n //React life time hooks stubs for future use\r\n componentDidMount() {}\r\n\r\n componentWillUnmount() {\r\n this._disposeReactions();\r\n }\r\n\r\n\r\n reaction(expression: (r: IReactionPublic) => T, effect: (arg: T, prev: FireImmediately extends true ? T | undefined : T, r: IReactionPublic) => void, opts?: IReactionOptions): IReactionDisposer {\r\n let disposer = mobxReaction(expression, effect, opts);\r\n this._reactions.push(disposer);\r\n return disposer;\r\n }\r\n\r\n private _disposeReactions() {\r\n this._reactions.forEach(disposer => disposer());\r\n }\r\n}\r\n\r\nOrbitComponentWithState.contextType = OrbitContext;\r\n","import {ReactNode} from 'react';\r\nimport {OrbitComponentWithState} from \"../orbit-component-with-state/orbit-component-with-state\";\r\n\r\n\r\n\r\nexport class OrbitComponent extends OrbitComponentWithState {\r\n}\r\n\r\n\r\n\r\n","import React, {createRef, PropsWithChildren} from 'react';\r\nimport {TapHandlerLogic} from '../../tap-handler/tap-handler.component';\r\nimport {OrbitComponentWithState} from \"../../base-components/orbit-component-with-state/orbit-component-with-state\";\r\n\r\nenum IMAGE_TYPE {\r\n EMPTY_IMAGE_BASE64,\r\n FALLBACK,\r\n SRC\r\n};\r\nenum IMAGE_STATUS {\r\n LAZY,\r\n LOADING,\r\n SETTLED\r\n}\r\n\r\ninterface ImageSettleStatus {\r\n value: \"load\" | \"error\",\r\n type: IMAGE_TYPE,\r\n}\r\n\r\n/**\r\n * We could have defined this interface as \"ImageProps extends React.ImgHTMLAttributes\"\r\n * and define inside only what's extra (like \"lazy\" or \"fallbackSrc\") and props that alter the original def (like \"width: number\" instead of default \"width: string | number\")\r\n * But in case of someone styling the \"Image\" component with: styled(Image)<{squareIcon: boolean}>. The extra prop will bleed into the DOM and React will throw:\r\n * -- \"Warning: React does not recognize the `squareIcon` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `squareicon` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\r\n * Also, ocasionally I am getting this warning\r\n * -- \"Warning: React does not recognize the `forwardedRef` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `forwardedref` instead. If you accidentally passed it from a parent component, remove it from the DOM element.\"\r\n *\r\n * So I am whitelisting props we actually use, and I am filtering based on that\r\n */\r\nexport interface ImageProps extends PropsWithChildren {\r\n // props common with React.ImgHTMLAttributes\r\n src: string;\r\n alt?: string;\r\n className?: string;\r\n style?: React.CSSProperties,\r\n title?: string;\r\n onClick?(event: React.MouseEvent): void;\r\n onLoad?(e: React.SyntheticEvent): void;\r\n onError?(e: React.SyntheticEvent): void;\r\n\r\n // props derived from React.ImgHTMLAttributes with slight changes\r\n width?: number; // instead of string | number\r\n height?: number; // instead of string | number\r\n\r\n // custom props\r\n fallbackSrc?: string;\r\n enableTap?: boolean;\r\n lazy?: boolean;\r\n onLoadStart?(): void;\r\n onSettled?(settleStatus: ImageSettleStatus): void;\r\n}\r\n\r\ninterface ImageState {\r\n src: string;\r\n type: IMAGE_TYPE;\r\n status: IMAGE_STATUS;\r\n}\r\n\r\nconst EMPTY_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=';\r\n\r\nexport class Image extends OrbitComponentWithState {\r\n\r\n private _imgRef: React.RefObject = createRef();\r\n\r\n constructor(props: ImageProps) {\r\n super(props);\r\n this.state = this._getInitialSrcState();\r\n }\r\n\r\n componentDidMount() {\r\n super.componentDidMount();\r\n if (this._imgRef.current) {\r\n this._createTapLogicHandler(this._imgRef.current);\r\n this._createIntersectionObserver(this._imgRef.current);\r\n }\r\n }\r\n\r\n private _getInitialSrcState() {\r\n /**\r\n * If this is a lazy load image we initialize the state.src with the fallback image from props\r\n * but in case this is not provided we just set an empty image gif.\r\n * This will prevent the borders to be visible around the image while scrolled into the view.\r\n */\r\n if (this.props.lazy) {\r\n return {\r\n src: this.props.fallbackSrc || EMPTY_IMAGE,\r\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n status: IMAGE_STATUS.LAZY\r\n };\r\n }\r\n if (this.props.onLoadStart) {\r\n this.props.onLoadStart();\r\n }\r\n return {\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC,\r\n status: IMAGE_STATUS.LOADING\r\n };\r\n }\r\n\r\n private _onLoad = (e: React.SyntheticEvent) => {\r\n if (this.state.status === IMAGE_STATUS.LAZY) {\r\n return;\r\n }\r\n if (this.state.status === IMAGE_STATUS.LOADING) {\r\n this.setState({\r\n status: IMAGE_STATUS.SETTLED\r\n });\r\n if (this.state.type === IMAGE_TYPE.SRC && this.props.onLoad) {\r\n this.props.onLoad(e);\r\n }\r\n if (this.props.onSettled) {\r\n this.props.onSettled({\r\n value: \"load\",\r\n type: this.state.type\r\n });\r\n }\r\n }\r\n }\r\n private _onError = (e: React.SyntheticEvent) => {\r\n if (this.state.status === IMAGE_STATUS.LAZY && this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: EMPTY_IMAGE,\r\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n });\r\n }\r\n if (this.state.status === IMAGE_STATUS.LOADING) {\r\n if (this.state.type === IMAGE_TYPE.SRC) {\r\n this.setState({\r\n src: this.props.fallbackSrc || EMPTY_IMAGE,\r\n type: this.props.fallbackSrc ? IMAGE_TYPE.FALLBACK : IMAGE_TYPE.EMPTY_IMAGE_BASE64\r\n });\r\n if (this.props.onError) {\r\n this.props.onError(e);\r\n }\r\n } else if (this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: EMPTY_IMAGE,\r\n type: IMAGE_TYPE.EMPTY_IMAGE_BASE64,\r\n });\r\n } else if (this.state.type === IMAGE_TYPE.EMPTY_IMAGE_BASE64) {\r\n this.setState({\r\n status: IMAGE_STATUS.SETTLED\r\n });\r\n if (this.props.onSettled) {\r\n this.props.onSettled({\r\n value: \"error\",\r\n type: this.state.type\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n super.componentWillUnmount();\r\n this._destroyIntersectionObserver();\r\n this._destroyTapLogicHandler();\r\n }\r\n\r\n componentDidUpdate(prevProps: ImageProps) {\r\n if (this.props.fallbackSrc !== prevProps.fallbackSrc && this.state.type === IMAGE_TYPE.FALLBACK) {\r\n this.setState({\r\n src: this.props.fallbackSrc\r\n });\r\n }\r\n if (this.props.src !== prevProps.src) {\r\n if (this.state.status === IMAGE_STATUS.SETTLED) {\r\n this.setState({\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC\r\n });\r\n }\r\n }\r\n }\r\n\r\n private _tapHandlerLogic: TapHandlerLogic | null = null;\r\n private _createTapLogicHandler(element: HTMLElement) {\r\n if (this.props.enableTap) {\r\n this._destroyTapLogicHandler();\r\n this._tapHandlerLogic = new TapHandlerLogic(element);\r\n }\r\n }\r\n\r\n private _destroyTapLogicHandler() {\r\n if (this._tapHandlerLogic) {\r\n this._tapHandlerLogic.dispose();\r\n this._tapHandlerLogic = null;\r\n }\r\n }\r\n\r\n private _intersectionObserver: IntersectionObserver | null;\r\n\r\n private _createIntersectionObserver(element: HTMLImageElement) {\r\n if (!this.props.lazy) {\r\n return;\r\n }\r\n\r\n // just in case this is called twice for this component we want to discard the existing intersection observer and create a new one\r\n this._destroyIntersectionObserver();\r\n\r\n this._intersectionObserver = new IntersectionObserver(this._intersectionObserverCallback, {\r\n rootMargin: '15px',\r\n threshold: 0.1\r\n });\r\n\r\n this._intersectionObserver.observe(element);\r\n }\r\n\r\n private _destroyIntersectionObserver() {\r\n if (this._intersectionObserver) {\r\n this._intersectionObserver.disconnect();\r\n this._intersectionObserver = null;\r\n }\r\n }\r\n\r\n private _intersectionObserverCallback = (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => {\r\n if (entries[0].intersectionRatio > 0 || entries[0].isIntersecting) {\r\n this._destroyIntersectionObserver();\r\n\r\n this.setState({\r\n src: this.props.src,\r\n type: IMAGE_TYPE.SRC,\r\n status: IMAGE_STATUS.LOADING\r\n });\r\n if (this.props.onLoadStart) {\r\n this.props.onLoadStart();\r\n }\r\n } else {\r\n if(this._imgRef.current){\r\n this._createIntersectionObserver(this._imgRef.current);\r\n }\r\n }\r\n };\r\n\r\n render() {\r\n\r\n let {\r\n // standard img props that need to be altered\r\n alt,\r\n // pass-through props\r\n className, title, width, height, style\r\n } = this.props;\r\n\r\n return ;\r\n }\r\n\r\n}\r\n","import React, {PropsWithChildren} from 'react';\r\nimport {OrbitComponent} from '../base-components/orbit-component/orbit-component';\r\nimport {ORBIT_TAP} from '../../themes/css-global-classes';\r\n\r\n\r\ninterface TapHandlerProps extends PropsWithChildren {\r\n enabled: boolean;\r\n elementRef: any;\r\n}\r\n\r\nexport class TapHandlerLogic {\r\n constructor(private _element: HTMLElement) {\r\n this._element.addEventListener('click', this._onClickHandler);\r\n }\r\n\r\n private _timeoutRef = null;\r\n\r\n private _onClickHandler = () => {\r\n if (this._timeoutRef) {\r\n return;\r\n }\r\n\r\n this._element.classList.add(ORBIT_TAP);\r\n this._timeoutRef = setTimeout(() => {\r\n this._element.classList.remove(ORBIT_TAP);\r\n this._timeoutRef = null;\r\n }, 150);\r\n\r\n };\r\n\r\n dispose() {\r\n if(this._timeoutRef) {\r\n clearTimeout(this._timeoutRef);\r\n }\r\n\r\n this._element.removeEventListener('click', this._onClickHandler);\r\n }\r\n\r\n}\r\n\r\n\r\nexport class TapHandler extends OrbitComponent {\r\n\r\n\r\n render() {\r\n return (\r\n <>\r\n {this.props.children}\r\n \r\n )\r\n }\r\n\r\n\r\n private _tapHandlerLogic: TapHandlerLogic | null = null;\r\n\r\n componentDidMount() {\r\n super.componentDidMount();\r\n if(this.props.enabled) {\r\n this._tapHandlerLogic = new TapHandlerLogic(this.props.elementRef.current);\r\n }\r\n\r\n }\r\n\r\n componentWillUnmount() {\r\n super.componentWillUnmount();\r\n if(this._tapHandlerLogic) {\r\n this._tapHandlerLogic.dispose();\r\n }\r\n }\r\n\r\n\r\n}\r\n","import React from 'react';\r\nimport {IServiceFactory} from './services/service-factory.interface';\r\n\r\n\r\n\r\nexport interface IOrbitContext {\r\n services: IServiceFactory\r\n}\r\n\r\nexport const OrbitContext = React.createContext(null!);\r\n\r\nexport const OrbitContextProvider = OrbitContext.Provider;\r\nexport const OrbitContextConsumer = OrbitContext.Consumer;\r\n","import {IDomService, IFormSubmitParams} from './dom.service.interface';\r\nimport {EventListenerRegistration} from '../../../utils/event-listener-registration';\r\nimport DOM from \"../../../sdk/src/utils/dom\";\r\nimport _ from \"../../../sdk/src/utils/underscore\";\r\nimport { observable, runInAction, makeObservable } from \"mobx\";\r\nimport {Check} from \"@sparkware/app-utils\";\r\n\r\n\r\nexport class DomService implements IDomService {\r\n constructor() {\r\n makeObservable(this);\r\n\r\n this._eventListenerRegistration = new EventListenerRegistration(document);\r\n DOM.addEventListener(document, 'webkitfullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'mozfullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'fullscreenchange', this._onFullScreenChange, false);\r\n DOM.addEventListener(document, 'MSFullscreenChange', this._onFullScreenChange, false);\r\n this.isInFullScreen = _.isFullScreen();\r\n }\r\n\r\n private initialBodyPaddingRight: string | null = null;\r\n private bodyPaddingRightAltered = false;\r\n disableScrolling(): void {\r\n // before we add the class \"no-scrolling\" (that has overflow: hidden) on the body\r\n // we check if a scrollbar exists. If it exists, we compute the scrollbar thickness and we add it to body's padding-right\r\n // WE COULD HAVE USED CSS `scrollbar-gutter: stable;` on `html` but that has problems. The spacing auto-added by the browser is outside the DOM\r\n // and seems to be above everything. Above the overlay, so clicking in that area does not close it\r\n // and above the right drawer, so the scrollbar of the drawer is not visible on desktop (on Chrome, doesn't happen on Firefox)\r\n // and also creates positioning problems for right drawers (like user menu on rtl languages)\r\n\r\n // instead of comparing document.body.scrollHeight > window.innerHeight to see if we have scrollable content we compare the widths\r\n // to see if we have a scrollbar. And the difference is the scrollbar thickness.\r\n if (window.innerWidth > document.body.clientWidth) {\r\n let scrollbarThickness = window.innerWidth - document.body.clientWidth;\r\n let bodyComputedStyles: CSSStyleDeclaration = window.getComputedStyle(document.body);\r\n this.initialBodyPaddingRight = bodyComputedStyles.paddingRight;\r\n this.bodyPaddingRightAltered = true;\r\n\r\n // increase padding by the scrollbar thickness\r\n this.body.style.paddingRight = \"calc(\" + this.initialBodyPaddingRight + \" + \" + scrollbarThickness + \"px)\";\r\n }\r\n this.body.classList.add('no-scrolling');\r\n }\r\n\r\n enableScrolling(): void {\r\n this.body.classList.remove('no-scrolling');\r\n if (this.bodyPaddingRightAltered) {\r\n this.bodyPaddingRightAltered = false;\r\n this.body.style.paddingRight = this.initialBodyPaddingRight;\r\n }\r\n }\r\n\r\n querySelector(selector: string): Element | null {\r\n return document.querySelector(selector);\r\n }\r\n\r\n get body(): HTMLElement {\r\n return document.body;\r\n }\r\n\r\n get head(): HTMLElement {\r\n return document.head;\r\n }\r\n\r\n get html(): HTMLElement {\r\n return document.documentElement;\r\n }\r\n\r\n setDocumentTitle(title: string): void {\r\n if(title) {\r\n document.title = title;\r\n }\r\n }\r\n\r\n get locationPathName(): string {\r\n return document.location.pathname;\r\n }\r\n\r\n private readonly _eventListenerRegistration;\r\n get subscribeTo(): EventListenerRegistration {\r\n return this._eventListenerRegistration;\r\n }\r\n\r\n getElementsByClassName(className: string): HTMLCollectionOf {\r\n return document.getElementsByClassName(className);\r\n }\r\n\r\n getElementsByTagName(tagName: string): HTMLCollectionOf {\r\n return document.getElementsByTagName(tagName);\r\n }\r\n\r\n getElementById(id: string): HTMLElement | null {\r\n return document.getElementById(id);\r\n }\r\n\r\n createElement(tagName: string): HTMLElement {\r\n return document.createElement(tagName);\r\n }\r\n\r\n @observable.ref\r\n isInFullScreen: boolean;\r\n\r\n private _onFullScreenChange = () => {\r\n runInAction(() => {\r\n this.isInFullScreen = _.isFullScreen()\r\n });\r\n }\r\n\r\n enterFullScreen(): void {\r\n _.openFullScreen();\r\n }\r\n exitFullScreen(): void {\r\n _.closeFullScreen();\r\n }\r\n\r\n\r\n performFormPostForUrl(url: string, options?: Pick): void {\r\n const urlBuilder = new URL(url);\r\n const urlParams: Record = {};\r\n\r\n urlBuilder.searchParams.forEach((paramValue, paramName) => {\r\n urlParams[paramName] = paramValue;\r\n });\r\n\r\n urlBuilder.search = \"\";\r\n urlBuilder.hash = \"\";\r\n\r\n this.submitForm({\r\n ...options,\r\n method: 'post',\r\n url: urlBuilder.href,\r\n extraParams: urlParams\r\n });\r\n }\r\n\r\n submitForm(params: IFormSubmitParams) {\r\n const form: HTMLFormElement = this.createElement(\"form\") as HTMLFormElement;\r\n form.className = 'cy-form-post-form';\r\n form.setAttribute('method', params.method);\r\n form.setAttribute('target', Check.isNullOrUndefined(params.target) ? '_blank' : params.target);\r\n form.setAttribute('action', params.url);\r\n\r\n let hiddenField: HTMLInputElement = null;\r\n if (!Check.isNullOrUndefined(params.extraParams)) {\r\n for (const key in params.extraParams) {\r\n hiddenField = document.createElement('input');\r\n hiddenField.setAttribute('type', 'hidden');\r\n hiddenField.setAttribute('name', key);\r\n hiddenField.setAttribute('value', params.extraParams[key]);\r\n form.appendChild(hiddenField);\r\n }\r\n }\r\n\r\n this.body.appendChild(form);\r\n form.submit();\r\n //Timeout is for automation purposes.\r\n setTimeout(() => this.body.removeChild(form), 500);\r\n }\r\n}\r\n","import {RouteDefinition, RouteParams, RouteRender} from '../../routing-configuration/route-definition/route-definition';\r\nimport {IRoute} from \"./route.interface\";\r\nimport React from \"react\";\r\n\r\nexport class FallbackRoute implements IRoute{\r\n private readonly _routeDefinition: RouteDefinition;\r\n\r\n constructor(render: RouteRender) {\r\n this._routeDefinition = {\r\n paths: [],\r\n render: render\r\n }\r\n }\r\n\r\n render(): React.ReactNode {\r\n return this._routeDefinition.render(this.routeParams);\r\n }\r\n\r\n get routeParams(): RouteParams {\r\n return {};\r\n }\r\n\r\n get isOrbitRoute(): boolean {\r\n return false;\r\n }\r\n\r\n get data(): any {\r\n return {};\r\n }\r\n\r\n get routeDefinition(): RouteDefinition {\r\n return this._routeDefinition;\r\n }\r\n\r\n protected _isMiniOrbitRoute(): boolean {\r\n return false;\r\n }\r\n}\r\n","import {IRoute} from './route.interface';\r\nimport {RouteData, RouteDefinition, RouteParams} from '../../routing-configuration/route-definition/route-definition';\r\nimport React from 'react';\r\n\r\nexport abstract class RouteBase implements IRoute {\r\n constructor(private _routeDefinition: RouteDefinition, private _routeParams: RouteParams) {}\r\n\r\n render(): React.ReactNode {\r\n return this._routeDefinition?.render(this._routeParams);\r\n }\r\n\r\n get routeParams(): RouteParams {\r\n return this._routeParams;\r\n }\r\n\r\n get isOrbitRoute(): boolean {\r\n return this._isOrbitRoute();\r\n }\r\n\r\n get data(): RouteData {\r\n return this._routeDefinition.data;\r\n }\r\n\r\n get routeDefinition(): RouteDefinition {\r\n return this._routeDefinition;\r\n }\r\n\r\n\r\n protected abstract _isOrbitRoute(): boolean;\r\n\r\n}\r\n","import { matchPath } from 'react-router';\r\nimport {RouteDefinition, RouteParams} from '../routing-configuration/route-definition/route-definition';\r\n\r\n\r\nexport interface RouteMatchResult {\r\n routeDefinition: RouteDefinition;\r\n routeParams: RouteParams;\r\n}\r\nexport function tryMatchPath(pathToMatch: string, routes: RouteDefinition[]): RouteMatchResult {\r\n for(let i = 0; i < routes.length; i++) {\r\n let routeDefinition = routes[i];\r\n\r\n for(let j = 0; j < routeDefinition.paths.length; j++) {\r\n let pattern = routeDefinition.paths[j];\r\n let match = matchPath({\r\n path: pattern,\r\n caseSensitive: routeDefinition.exact,\r\n end: true\r\n }, pathToMatch);\r\n\r\n if(match) {\r\n return {\r\n routeDefinition: routeDefinition,\r\n routeParams: match.params\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}","import {ISplashService} from './splash-service.interface';\r\nimport {Check} from '@sparkware/app-utils';\r\nimport {isInsideAutomation} from \"../../../utils/automation-helpers\";\r\n\r\n\r\nexport class SplashService implements ISplashService {\r\n constructor(private readonly onAfterRemoveSplash?: () => void) {\r\n\r\n //document.body.style.position = 'fixed';\r\n document.body.classList.add('disable-animations');\r\n }\r\n\r\n computeSplashTimeInSeconds(startTime: number): number {\r\n return parseFloat(((performance.now() - startTime) / 1000).toFixed(2));\r\n }\r\n\r\n splashTime: number = null;\r\n\r\n removeSplash(): void {\r\n if(!Check.isNull(this.splashTime)) {\r\n console.error('removeSplash called second time!');\r\n return;\r\n }\r\n //document.body.style.removeProperty('position');\r\n document.body.classList.remove('disable-animations');\r\n let splashPageElement = document.getElementById('splash-page');\r\n if(splashPageElement) {\r\n splashPageElement.remove();\r\n }\r\n this.splashTime = this.computeSplashTimeInSeconds(window['splashStart']);\r\n\r\n this._splashRemovedSubscribers.forEach(callback => callback());\r\n\r\n this._enablePrerender();\r\n\r\n if(this.onAfterRemoveSplash) {\r\n this.onAfterRemoveSplash();\r\n }\r\n }\r\n\r\n private _splashRemovedSubscribers: Array<() => void> = [];\r\n onSplashRemoved(callback: () => void) {\r\n this._splashRemovedSubscribers.push(callback);\r\n }\r\n\r\n private _enablePrerender() {\r\n const timeoutValue = isInsideAutomation() ? 0 : 5000;\r\n //We want to give 5 more sec of delay before pre render take the snapshot to make sure all b2c banner loaded\r\n setTimeout(() => {\r\n window['prerenderReady'] = true;\r\n }, timeoutValue);\r\n }\r\n}\r\n","import {getCypressToOrbitHooks, NamedIntervalType, isInsideAutomation} from '../../utils/automation-helpers';\r\nimport {TimeIntervalName} from './time-interval-names';\r\nimport {Check, TimeSpan} from '@sparkware/app-utils';\r\n\r\nfunction convertToTimeSpan(interval: number | TimeSpan): TimeSpan {\r\n if(Check.isNumber(interval)) {\r\n return TimeSpan.fromMilliseconds(interval);\r\n } else {\r\n return interval;\r\n }\r\n}\r\n\r\nfunction namedTimer(name: TimeIntervalName | null | undefined,\r\n handler: () => void,\r\n interval: TimeSpan | number | undefined,\r\n intervalType: NamedIntervalType,\r\n javascriptFunction: (handler: () => void, timeout: number) => number): number {\r\n\r\n if(Check.isNullOrUndefined(handler)) {\r\n throw new Error('namedInterval: handler argument cannot be null or undefined');\r\n }\r\n\r\n if(Check.isNullOrUndefined(interval)) {\r\n interval = TimeSpan.fromMilliseconds(0);\r\n }\r\n\r\n let timeSpan = convertToTimeSpan(interval);\r\n\r\n if(name && isInsideAutomation()) {\r\n const response = getCypressToOrbitHooks().onTimeIntervalCreation(name, handler, timeSpan, intervalType);\r\n if(response.ignoreJavaScriptImplementation) {\r\n // we are here because current running test decided to fake this timer\r\n return response.timerId;\r\n }\r\n }\r\n\r\n\r\n\r\n return javascriptFunction(handler, timeSpan.totalMilliseconds);\r\n}\r\n\r\n\r\n\r\nexport function namedSetInterval(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\r\n return namedTimer(name, handler, interval, NamedIntervalType.setInterval, setInterval);\r\n}\r\n\r\nexport function namedSetTimeout(name: TimeIntervalName, handler: () => void, interval: TimeSpan | number): number {\r\n return namedTimer(name, handler, interval, NamedIntervalType.setTimeout, setTimeout);\r\n}","export class DeviceFeatureDetection {\r\n /**\r\n * The device supports touch, does it have a touchscreen\r\n */\r\n public get isTouch() {\r\n return (\r\n ('ontouchstart' in window)\r\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\r\n || (window.navigator.maxTouchPoints !== undefined && window.navigator.maxTouchPoints > 0)\r\n );\r\n }\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceOSDetection {\r\n private os: UAParser.IOS;\r\n constructor(private parser: UAParser) {\r\n this.os = this.parser.getOS();\r\n }\r\n\r\n /**\r\n * Returns the name of the operating system\r\n *\r\n * Possible 'os.name' - data taken from ua-parser-js\r\n * AIX, AmigaOS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, ChromiumOS, Contiki,\r\n * Fedora, FirefoxOS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,\r\n * Joli, Linpus, Linux, MacOS, Mageia, Mandriva, MeeGo, Minix, Mint, MorphOS, NetBSD,\r\n * Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,\r\n * RIM Tablet OS, RISCOS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,\r\n * Ubuntu, UNIX, VectorLinux, WebOS, Windows[Phone/Mobile], Zenwalk\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mac OS\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.os.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the operating system\r\n */\r\n public get version() {\r\n return parseInt(this.os.version.split(\".\")[0]);\r\n }\r\n\r\n public get isIOS() {\r\n return this.name === 'ios';\r\n }\r\n\r\n public get isAndroid() {\r\n return this.name === 'android';\r\n }\r\n\r\n public get isPC() {\r\n return [\"centos\", \"fedora\", \"debian\", \"linux\", \"macos\", \"pclinuxos\", \"redhat\", \"ubuntu\", \"unix\", \"vectorlinux\", \"windows\"].indexOf(this.name) && !this.isMobileOS;\r\n }\r\n\r\n public get isMacOS() {\r\n return this.name === 'macos';\r\n }\r\n\r\n public get isMobileOS() {\r\n return (this.isIOS || this.isAndroid);\r\n }\r\n\r\n}\r\n","export class DeviceViewportDetection {\r\n\r\n /**\r\n * Get viewport width.\r\n */\r\n public get width() {\r\n return window.innerWidth;\r\n }\r\n\r\n /**\r\n * Get viewport height.\r\n */\r\n public get height() {\r\n return window.innerHeight;\r\n }\r\n\r\n /**\r\n * Get screen height.\r\n */\r\n public get screenHeight() {\r\n return window.screen.height;\r\n }\r\n\r\n /**\r\n * Get screen width.\r\n */\r\n public get screenWidth() {\r\n return window.screen.width;\r\n }\r\n\r\n /**\r\n * Get the pixel ratio for the current running device.\r\n */\r\n public get pixelRatio() {\r\n var ratio = 1;\r\n\r\n const screen = window.screen as any;\r\n\r\n // To account for zoom, change to use deviceXDPI instead of systemXDPI\r\n if (screen.systemXDPI !== undefined && screen.logicalXDPI !== undefined && screen.systemXDPI > screen.logicalXDPI) {\r\n // Only allow for values > 1\r\n ratio = screen.systemXDPI / screen.logicalXDPI;\r\n } else if (window.devicePixelRatio !== undefined) {\r\n ratio = window.devicePixelRatio;\r\n }\r\n return ratio;\r\n }\r\n\r\n public get isPortrait() {\r\n return window.matchMedia(\"(orientation: portrait)\").matches;\r\n }\r\n}","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceModelDetection {\r\n private device: UAParser.IDevice;\r\n constructor(private parser: UAParser) {\r\n this.device = this.parser.getDevice();\r\n }\r\n\r\n /**\r\n * Is it an iPhone?\r\n */\r\n public get isIphone() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPhone\";\r\n }\r\n\r\n public get isIpad() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPad\";\r\n }\r\n\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n//https://confluence/pages/viewpage.action?spaceKey=WEB&title=iframe-allow-camera\r\nimport { getAllowAttr } from '@888webteam/iframe-allow-camera';\r\n\r\nexport class DeviceBrowserDetection {\r\n private browser: UAParser.IBrowser;\r\n constructor(private parser: UAParser) {\r\n this.browser = this.parser.getBrowser();\r\n }\r\n\r\n /**\r\n * Returns the name of the browser\r\n *\r\n * Possible values :\r\n * Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,\r\n * Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,\r\n * Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,\r\n * Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,\r\n * Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,\r\n * Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],\r\n * Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox,\r\n * Tizen, UCBrowser, Vivaldi, w3m, Yandex\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mobile Safari\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.browser.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the browser\r\n */\r\n public get version() {\r\n return parseInt(this.browser.version.split(\".\")[0]);\r\n }\r\n\r\n /**\r\n * Is it a Firefox?\r\n */\r\n public get isFirefox() {\r\n return this.name === \"firefox\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Chrome?\r\n */\r\n public get isChrome() {\r\n return this.name === \"chrome\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Safari?\r\n */\r\n public get isSafari() {\r\n // Can be \"Safari\" or \"Mobile Safari\"\r\n return this.name.indexOf(\"safari\") !== -1;\r\n }\r\n\r\n /**\r\n * Is it a Opera?\r\n */\r\n public get isOpera() {\r\n // Can be \"Opera\", \"Opera Mobi\", \"Opera Mini\", \"Opera Tablet\"\r\n return this.name.indexOf(\"opera\") !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Is browser an Edge instance?\r\n */\r\n public get isEdge() {\r\n return this.name === \"edge\";\r\n }\r\n\r\n getIframeAllowAttributeValue(){\r\n let allowAttrValue = getAllowAttr();\r\n if(allowAttrValue.indexOf('autoplay') >= 0) {\r\n return allowAttrValue;\r\n } else {\r\n return `autoplay; ${allowAttrValue}`;\r\n }\r\n }\r\n\r\n}\r\n","import Store from '../../store';\r\nimport Logger from '../../logger';\r\nimport { DeviceOSDetection } from \"./os\";\r\n\r\nconst NATIVE_TYPE = {\r\n CASINO_IOS: 'cbCallBackHandlerCGP',\r\n CASINO_ANDROID: 'WrapperInterfaceCGP',\r\n POKER_IOS: 'NativeInterface',\r\n POKER_ANDROID: 'NativeInterface',\r\n POKER_7_ANDROID: 'PokerSecondWebView',\r\n CIP8_ANDROID: 'pokerNativeInterface',//TODO - will be also used in CGP so that we have a unique source\r\n SPORT_IOS: 'callbackHandler',\r\n SPORT_CIS_WEBVIEW: 'sportNativeInterface',\r\n SPORT_ANDROID: 'WrapperInterface'\r\n};\r\n\r\nexport class DeviceHybridDetection {\r\n private logger: Logger;\r\n private _hybrid = false;\r\n private _inCasino = false;\r\n private _inPoker = false;\r\n private _inSport = false;\r\n private _embedded = false;\r\n\r\n constructor(private os: DeviceOSDetection) {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n this.buildHybridInfo();\r\n }\r\n\r\n public get isHybrid() {\r\n return this._hybrid;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Casino\r\n */\r\n public get inCasino() {\r\n return this._inCasino;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Poker\r\n */\r\n public get inPoker() {\r\n return this._inPoker;\r\n }\r\n\r\n /**\r\n * The hybrid host app that loads the CGP (Orbit) is owned by Sport\r\n */\r\n public get inSport() {\r\n return this._inSport;\r\n }\r\n\r\n /**\r\n * The hybrid type is embedded (like AOD - Apple On Demand Resources). All games are bundled and deployed at Apple servers and downloaded by demand by the hybrid app\r\n */\r\n public get isEmbedded() {\r\n return this._embedded;\r\n }\r\n\r\n\r\n /**\r\n * FOR BUILDING HYBRID INFO I AM BEING EXTRA CAREFULL AND DOUBLECHECKING THE RESULTS FROM DIFFERENT DATA\r\n */\r\n private buildHybridInfo() {\r\n\r\n const genericHybridEmbedded = window['cgp_isHybridEmbedded'] || false;\r\n\r\n const inPokerHybrid = this.build_isInPokerHybrid();\r\n const casinoHybrid = this.build_isCasinoHybrid(inPokerHybrid);\r\n const inSportHybrid = this.build_isInSportHybrid();\r\n\r\n if (casinoHybrid || inPokerHybrid || inSportHybrid || genericHybridEmbedded) {\r\n this._hybrid = true;\r\n }\r\n\r\n if (genericHybridEmbedded) {\r\n this._embedded = true;\r\n }\r\n\r\n this._inCasino = false;\r\n this._inPoker = false;\r\n this._inSport = false;\r\n\r\n if (casinoHybrid) {\r\n this._inCasino = true;\r\n }\r\n\r\n if (inPokerHybrid) {\r\n this._inPoker = true;\r\n }\r\n\r\n if (inSportHybrid) {\r\n this._inSport = true;\r\n }\r\n\r\n this.dataSanityCheck(casinoHybrid, inPokerHybrid, inSportHybrid, genericHybridEmbedded);\r\n }\r\n\r\n private build_isCasinoHybrid(inPoker) {\r\n // checks for normal casino hybrid\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS() && !inPoker;//isNativeIOS include cip8\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private build_isInPokerHybrid() {\r\n if (this.os.isIOS) {\r\n // On iOS, first check if poker put a known object in global namespace. If it's there, we know it's poker hybrid, we don't need anything else\r\n if ((window as any).NativeInterface && (this.isNativeIOS(NATIVE_TYPE.POKER_IOS))) {\r\n return true;\r\n }\r\n // Otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n // Once poker7 will use AOD in NJ this code below can be removed\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n // we are in NJ, so now we have to check for the ClientVersion key in storage. If exists and starts with \"mp-\" or \"sp-\", then it is poker hybrid\r\n let storedClientVersion = Store.get('ClientVersion');\r\n if (storedClientVersion && (storedClientVersion.toLowerCase().startsWith('mp-') || storedClientVersion.toLowerCase().startsWith('sp-'))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n if (this.os.isAndroid) {\r\n // On Android, first check if poker put a known object in global namespace. If it's there, we know it's poker7 hybrid, we don't need anything else\r\n if ((window as any)[NATIVE_TYPE.POKER_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_ANDROID)) {\r\n return true;\r\n }\r\n // For Some reason poker 7 have 2 different name.. do we need to check both\r\n if ((window as any)[NATIVE_TYPE.POKER_7_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_7_ANDROID)) {\r\n return true;\r\n }\r\n\r\n //For Poker8 (new Poker) - Same check for CIP8_ANDROID, because it is a different object name\r\n if ((window as any)[NATIVE_TYPE.CIP8_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.CIP8_ANDROID)) {\r\n return true;\r\n }\r\n\r\n //Once poker7 Baruch will go live with the the new POKER_7_ANDROID name we can remove the code below - for now we leave it for backward\r\n // ... otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n //Todo check this store get logic, I think we have timing issue here\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n\r\n let storedSourceProductPackage = Store.get('sourceProductPackage');\r\n if (storedSourceProductPackage && (storedSourceProductPackage.toString() === '52' || storedSourceProductPackage.toString() === '95')) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private build_isInSportHybrid(): boolean {\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid(NATIVE_TYPE.SPORT_ANDROID) || this.isNativeAndroid(NATIVE_TYPE.SPORT_CIS_WEBVIEW);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Is it an IOS Hybrid?\r\n */\r\n private isNativeIOS(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_IOS;\r\n\r\n return ('object' === typeof ((window as any).webkit)\r\n && 'object' === typeof ((window as any).webkit.messageHandlers[className]));\r\n }\r\n\r\n /**\r\n * Is it an Android Hybrid?\r\n */\r\n private isNativeAndroid(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_ANDROID;\r\n return ('object' === typeof ((window as any)[className]));\r\n }\r\n\r\n\r\n private dataSanityCheck(casinoHybrid: boolean, inPokerHybrid: boolean, inSportHybrid: boolean, genericHybridEmbedded: boolean) {\r\n // Casino in Poker and casino in sport cannot be true at the same time\r\n if (inPokerHybrid === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 1. inPokerHybrid and inSportHybrid are both true\");\r\n }\r\n\r\n if (casinoHybrid === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 2. casinoHybrid and inSportHybrid are both true\");\r\n }\r\n\r\n if (inPokerHybrid === true && casinoHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 3. inPokerHybrid and casinoHybrid are both true\");\r\n }\r\n\r\n // From the trio: casinoHybrid, inPokerHybrid, inSportHybrid at most one need to be true.\r\n // And this, only if genericHybridEmbedded is true\r\n if (genericHybridEmbedded === true && (casinoHybrid === false || inPokerHybrid === false || inSportHybrid === false)) {\r\n this.logger.error(\"Hybrid data sanity check. 4. if genericHybridEmbedded is false, none of any other embedded flags can be true\");\r\n }\r\n\r\n }\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { UAParser } from 'ua-parser-js';\r\nimport Logger from '../logger';\r\nimport { DeviceFeatureDetection } from './detection/feature';\r\nimport { DeviceOSDetection } from './detection/os';\r\nimport { DeviceViewportDetection } from './detection/viewport';\r\nimport { DeviceModelDetection } from './detection/model';\r\nimport { DeviceBrowserDetection } from './detection/browser';\r\nimport { DeviceHybridDetection } from './detection/hybrid';\r\n\r\nclass Device {\r\n public logger: Logger;\r\n private _uaParser: UAParser = new UAParser();\r\n public readonly feature = new DeviceFeatureDetection();\r\n public readonly os = new DeviceOSDetection(this._uaParser);\r\n public readonly viewport = new DeviceViewportDetection();\r\n public readonly model = new DeviceModelDetection(this._uaParser);\r\n public readonly browser = new DeviceBrowserDetection(this._uaParser);\r\n public readonly hybrid = new DeviceHybridDetection(this.os);\r\n\r\n /**\r\n * Initialize the device.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n }\r\n\r\n /**\r\n * Getter for the user-agent for the client being handled in this request.\r\n *\r\n * @example 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'\r\n */\r\n public get userAgent() {\r\n return this._uaParser.getUA();\r\n }\r\n\r\n /**\r\n * Generates a GUID\r\n */\r\n public generateGuid(): string {\r\n return uuidv4();\r\n }\r\n\r\n private matchMedia(media: string) {\r\n return window.matchMedia(media).matches;\r\n }\r\n\r\n /**\r\n * Used to detected if user clicked and loaded the app using home screen\r\n *\r\n * Returns true if the app is running in standalone mode (iOS only)\r\n */\r\n public get isStandalone() {\r\n return 'standalone' in window.navigator ? (window.navigator as any).standalone : false;\r\n }\r\n\r\n public get isProgressiveWebApp(): boolean {\r\n\t\t// PWA setting is \"display\": \"fullscreen\"\r\n\t\t// but installed on desktop it's detected as \"standalone\" if app is not in fullscreen mode or \"fullscreen\" if user enters fullscreen mode\r\n // iOS is identified through check the navigator to have attribute 'standalone'\r\n\r\n\t\treturn !this.hybrid.isHybrid && (this.isStandalone ||\r\n this.matchMedia('(display-mode: fullscreen)') ||\r\n this.matchMedia('(display-mode: standalone)'));\r\n\r\n }\r\n\r\n public get isSupportHTML5() {\r\n return 'function' === typeof document.createElement('canvas').getContext;\r\n }\r\n\r\n public get isMobileWebApp() {\r\n return (this.os.isMobileOS || this.isProbablyIOSDevice) && !this.hybrid.isHybrid;\r\n }\r\n\r\n /**\r\n * Check whether the browser has cookie enable 3rd party.\r\n */\r\n public get isCookieEnable() {\r\n return window.navigator.cookieEnabled;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iOS and iOS + \"Request Desktop Website\", iPhone INCLUDED\r\n */\r\n public get isProbablyIOSDevice() {\r\n if (this.os.isIOS) {\r\n return true;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that we are on Mac\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iPad and iOS + \"Request Desktop Website\", iPhone NOT INCLUDED\r\n * HOWEVER, FOR IPHONE THAT HAVE \"Request Desktop Website\", this method will return true\r\n */\r\n public get isProbablyIPad() {\r\n // Pre iOS 13 detection\r\n if (this.model.isIpad) {\r\n return true;\r\n }\r\n if (this.model.isIphone) {\r\n return false;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that is a Safari browser on Mac (in the past, Safari was available for Windows too)\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * Check the device is in a portrait mode.\r\n *\r\n * @deprecated use \"Device.viewport.isPortrait\"\r\n */\r\n public get isPortrait(): boolean {\r\n if (this.isMobile() && this.os.isAndroid) {\r\n // fix for Samsung S8 series (S8-S9...).\r\n // In full screen mode window.screen.width and window.screen.height after single rotation get wrong values (width equal to height)\r\n // So we should test it by innerWidth and innerHeight like in iOS\r\n if (this.viewport.screenWidth === this.viewport.screenHeight) {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n return this.viewport.screenWidth < this.viewport.screenHeight;\r\n } else {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n *\r\n * Getting the current running iPhone device version, hardware version.\r\n * Able to detect iPhone 4 and 5 and iphone x (10)\r\n * Returns NULL if device is not an iPhone. Will return a Number of the hardware version.\r\n * @deprecated\r\n */\r\n public getIphoneVersion() {\r\n\r\n if (this.os.isIOS && 11 <= this.os.version &&\r\n (\r\n //iphone 12 pro max\r\n (926 === window.screen.height && 428 === window.screen.width) || (926 === window.screen.width && 428 === window.screen.height)\r\n ||\r\n //iphone 12 pro\r\n (844 === window.screen.height && 390 === window.screen.width) || (844 === window.screen.width && 390 === window.screen.height)\r\n ||\r\n // iPhone X / Xs\r\n (812 === window.screen.height && 375 === window.screen.width) || (812 === window.screen.width && 375 === window.screen.height)\r\n ||\r\n // iPhone Xr / Xs Max\r\n (896 === window.screen.height && 414 === window.screen.width) || (896 === window.screen.width && 414 === window.screen.height)\r\n )\r\n ) {\r\n return 10;\r\n }\r\n\r\n if (this.os.isIOS && 8 <= this.os.version && 375 === window.screen.width) {\r\n return 6;\r\n }\r\n\r\n if (this.os.isIOS && 6 <= this.os.version && 320 === window.screen.width) {\r\n return 5;\r\n }\r\n\r\n // iphone 4/s (Retina)\r\n if (this.os.isIOS && 5 <= this.os.version && 640 === window.screen.width) {\r\n return 4;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n * Is IphoneX\r\n * Returns true if the device is IphoneX\r\n * @deprecated\r\n */\r\n public isIphoneX(): boolean {\r\n return 10 === this.getIphoneVersion();\r\n }\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobileNotTablet(): boolean {\r\n return this.viewport.width < 1280 && !this.isTablet();\r\n }\r\n\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * Returns true only for ipads smaller than 1280\r\n * @deprecated\r\n */\r\n public isTablet(): boolean {\r\n return this.model.isIpad && this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Those are not the droids you are looking for\r\n * Use media queries, feature detection, client hints, os detection.\r\n * Think of what you want to achieve with your code and put a condition for that, not a general isMobile condition\r\n *\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobile(): boolean {\r\n return this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Get benchmark.\r\n */\r\n public getBenchMark() {\r\n var b = { m: 0 }, bd = [], bmt = + new Date() + 50;\r\n do {\r\n var t, count = 0, tt = + new Date();\r\n do { t = + new Date(); } while (t === tt);\r\n do { count++; tt = +new Date(); } while (t === tt);\r\n if ((tt - t) === 1) { bd[bd.length] = count; }\r\n } while ((bd.length < 20) && (t < bmt));\r\n\r\n if (bd.length === 0) b.m = 0; else b.m = Math.max.apply(Math, bd);\r\n\r\n return b.m;\r\n }\r\n\r\n}\r\n\r\nexport default new Device();\r\n","import _ from './underscore';\r\nimport Logger from './logger';\r\nimport {namedSetInterval, namedSetTimeout} from '../../../common/utils/time-functions';\r\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\r\n\r\nexport interface TimeoutSubscription {\r\n clear(): void;\r\n}\r\n\r\n\r\n\r\nexport interface ElementDimensions {\r\n\r\n width: number,\r\n height: number,\r\n horizontMargin: number,\r\n verticalMargin: number,\r\n horizontPadding: number,\r\n verticalPadding: number,\r\n horizontBorder: number,\r\n verticalBorder: number,\r\n fullWidth: number,\r\n fullHeight: number,\r\n marginRight: number,\r\n marginLeft: number,\r\n marginTop: number,\r\n marginBottom: number\r\n}\r\n\r\nexport interface ElementSize {\r\n width: number,\r\n height: number\r\n}\r\n\r\nexport interface DomEventSubscription {\r\n remove: () => void\r\n}\r\n\r\n\r\n\r\nclass DOM {\r\n\r\n static CLASS = 'DOM';\r\n\r\n constructor() {\r\n this._createLogger();\r\n }\r\n\r\n logger: Logger;\r\n _createLogger() {\r\n this.logger = new Logger(DOM.CLASS);\r\n }\r\n\r\n\r\n getBody() : HTMLElement {\r\n return document.body;\r\n }\r\n\r\n\r\n getHTML(): HTMLElement {\r\n return document.documentElement;\r\n }\r\n\r\n\r\n /**\r\n * Draw element into the DOM.\r\n */\r\n draw(element: Element) : DOM {\r\n\r\n this.append(this.getBody(), element);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Selector jQuery like for getting the object from the dom.\r\n * $$ is double the fun, $ is cool, $$ is cooler.\r\n */\r\n $$(query: any): any {\r\n let el = null;\r\n\r\n // first off if it's not a string assume it's already an element\r\n if (!_.isString(query)) {\r\n el = query;\r\n } else if ( this.isTag(query) ) {\r\n // check if it's a tag\r\n let tag = query.substring(1, query.length - 1);\r\n el = document.createElement( tag );\r\n } else if ( this.isId(query) ) {\r\n // check if it's an id\r\n let id = query.substr(1);\r\n el = document.getElementById( id );\r\n } else {\r\n // run a basic query\r\n el = document.querySelectorAll(query);\r\n }\r\n\r\n if (_.isNodeList(el)) {\r\n el = [].slice.call(el);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n querySelector(selector: string): Element {\r\n return document.querySelector(selector);\r\n }\r\n\r\n\r\n injectStyleToDOM(content: string): HTMLStyleElement {\r\n let newStyle = document.createElement('style');\r\n newStyle.innerHTML = content;\r\n return document.body.appendChild(newStyle);\r\n }\r\n\r\n createElement(type: string = 'div', html: string = '', classList = []): HTMLElement {\r\n let domElement = document.createElement(type);\r\n if(html) {\r\n domElement.innerHTML = html;\r\n }\r\n\r\n if(classList.length > 0){\r\n classList.forEach(_class => this.addClass(domElement, _class));\r\n }\r\n\r\n return domElement;\r\n }\r\n\r\n append(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n target.appendChild(el);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n removeElement(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n el.parentNode.removeChild(el);\r\n\r\n return this;\r\n }\r\n\r\n appendFirst(target: Element, el: Element): void {\r\n\r\n if (!_.isElement(target)) {\r\n throw new Error('target argument must be an Element');\r\n }\r\n\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an Element');\r\n }\r\n\r\n target.insertBefore(el, target.firstChild);\r\n }\r\n\r\n addClass(el: Element, className: any) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className || 0 === className.length) {\r\n return this;\r\n }\r\n\r\n let name = _.isArray(className) ? className[0] : className;\r\n\r\n if (el.classList) {\r\n el.classList.add(name);\r\n } else {\r\n el.className += ' ' + name;\r\n }\r\n\r\n return _.isArray(className) ? this.addClass(el, className.slice(1)) : this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * toggle class to element\r\n */\r\n toggleClass(el: Element, className: string) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className) {\r\n return this;\r\n }\r\n\r\n el.classList.toggle(className);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * if element already has the class\r\n */\r\n hasClass(el: Element, className: string) : boolean {\r\n if (!_.isElement(el)) {\r\n throw new Error(`el argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n if (!className) {\r\n throw new Error(`className argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n return el.classList.contains(className);\r\n }\r\n\r\n\r\n /**\r\n * Add attribute to the element.\r\n */\r\n addAttribute(el: Element, attribute: string = '', value: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.setAttribute(attribute, value);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Add Style to the element.\r\n */\r\n addStyle(el: HTMLElement, key: string, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style[key] = value;\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove Style from the element.\r\n */\r\n removeStyle(el: HTMLElement, key: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style.removeProperty(key);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get current element dimensions\r\n */\r\n getDimensions(el: HTMLElement): ElementDimensions {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n\r\n let style = this.getCurrentStyle(el);\r\n let horizontMargin = parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n let verticalMargin = parseFloat(style.marginBottom) + parseFloat(style.marginTop);\r\n\r\n return {\r\n width: el.offsetWidth,\r\n height: el.offsetHeight,\r\n horizontMargin: horizontMargin,\r\n verticalMargin: verticalMargin,\r\n horizontPadding: parseFloat(style.paddingLeft) + parseFloat(style.paddingRight),\r\n verticalPadding: parseFloat(style.paddingBottom) + parseFloat(style.paddingTop),\r\n horizontBorder: parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth),\r\n verticalBorder: parseFloat(style.borderBottomWidth) + parseFloat(style.borderTopWidth),\r\n fullWidth: el.offsetWidth + horizontMargin,\r\n fullHeight: el.offsetHeight + verticalMargin,\r\n marginRight: parseFloat(style.marginRight),\r\n marginLeft: parseFloat(style.marginLeft),\r\n marginTop: parseFloat(style.marginTop),\r\n marginBottom: parseFloat(style.marginBottom)\r\n };\r\n }\r\n\r\n setElementSize(element: HTMLElement, size: ElementSize, unit: string = 'px') : void {\r\n element.style.width = size.width + unit;\r\n element.style.height = size.height + unit;\r\n }\r\n\r\n getCurrentStyle(el: HTMLElement) : CSSStyleDeclaration {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n return window.getComputedStyle(el) || el['currentStyle'];\r\n }\r\n\r\n\r\n /**\r\n * Hide element from dom.\r\n */\r\n hide(el: Element): DOM {\r\n this.removeClass(el, 'show');\r\n this.addClass(el, 'hide');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Get element to be invisible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n invisible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-visible');\r\n this.addClass(el, 'cgp-invisible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Show element on dom\r\n * @param el\r\n */\r\n show(el: Element): DOM {\r\n this.removeClass(el, 'hide');\r\n this.addClass(el, 'show');\r\n return this;\r\n }\r\n\r\n /**\r\n * Get element to be visible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n visible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-invisible');\r\n this.addClass(el, 'cgp-visible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove class from element.\r\n * @param el\r\n * @param className\r\n */\r\n removeClass(el: Element, className: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.classList.remove(className);\r\n return this;\r\n }\r\n\r\n\r\n removeAttribute(el: Element, attr: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.removeAttribute(attr);\r\n return this;\r\n }\r\n\r\n isInputElement(tagName: string = ''): boolean {\r\n return 'INPUT' === tagName;\r\n }\r\n\r\n\r\n /**\r\n * Sets the innerHTML for the provided element\r\n */\r\n html(html: string, el: Element): DOM {\r\n if (_.isNullOrUndefined(html)) {\r\n this.logger.error('Html is not valid parameter');\r\n return this;\r\n }\r\n el.innerHTML = html;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Clear elements from his node childs nor content.\r\n */\r\n clear(target: Element): DOM {\r\n while (target.firstChild) {\r\n target.removeChild(target.firstChild);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n camelCase(str: string): string {\r\n return str.replace(/-([a-z])/g, (g) => {\r\n return g[1].toUpperCase();\r\n });\r\n }\r\n\r\n\r\n isTag(str: string): boolean {\r\n return 0 === str.search(/^<\\w+>$/);\r\n }\r\n\r\n isId(str: string ) {\r\n return 0 === str.search(/^#\\w+$/);\r\n }\r\n\r\n parseDataAttributes(el: Element): object {\r\n let data = {};\r\n\r\n [].forEach.call(el.attributes, (attr) => {\r\n if (/^data-/.test(attr.name)) {\r\n let camelCaseName = attr.name.substr(5).replace(/-(.)/g, ($0, $1) => {\r\n return $1.toUpperCase();\r\n });\r\n data[camelCaseName] = attr.value;\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n\r\n text(el: Element, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be a HTMLElement');\r\n }\r\n el.textContent = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * wrapper for add event listeners on DOM, returns a self removing method.\r\n */\r\n addEventListener(el: Element | Document, type: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n el.addEventListener(type, callback, useCapture);\r\n\r\n return {\r\n remove: function(msgElement: Element | Document, msgType: string, msgCallback: EventListenerOrEventListenerObject) {\r\n return () => {\r\n return msgElement.removeEventListener(msgType, msgCallback);\r\n };\r\n }(el, type, callback)\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n *\r\n *\r\n * @description - Generic event handler, all the component should subscribe to one event function,\r\n * They should pass the element it self define specific id inside the element,\r\n * Event type, And the event callback.\r\n *\r\n * @usage:\r\n * onDOMEvent(DOMElement, '#testid', 'click', ()=> {alert('onClick happend'});\r\n * onDOMEvent(DOMElement, 'click', ()=> {alert('onClick happend'});\r\n */\r\n onDOMElementEvent(element: Element, eventName: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n if (!_.isElement(element)) {\r\n throw new Error('element argument must be of type HTMLElement');\r\n }\r\n\r\n if(!_.isString(eventName)) {\r\n throw new Error('eventName argument must be of type String');\r\n }\r\n\r\n if(!_.isFunction(callback)) {\r\n throw new Error('callback argument must be of type Function');\r\n }\r\n\r\n element.addEventListener(eventName, callback, useCapture);\r\n\r\n return {\r\n remove: () => element.removeEventListener(eventName, callback)\r\n };\r\n }\r\n\r\n\r\n setInterval(callback: () => void, timeout: number, name?: TimeIntervalName) : number {\r\n return namedSetInterval(name, callback, timeout);\r\n }\r\n\r\n\r\n clearInterval(handle: number): void {\r\n clearInterval(handle);\r\n }\r\n\r\n\r\n setTimeout(callback: () => void, timeout: number, name?: TimeIntervalName): number {\r\n return namedSetTimeout(name, callback, timeout);\r\n }\r\n\r\n clearTimeout(handle: number): void {\r\n clearTimeout(handle);\r\n }\r\n}\r\n\r\nexport default new DOM();\r\n","import logger from 'js-logger';\r\n\r\nlogger.useDefaults();\r\n\r\nexport default class Logger {\r\n\r\n static SET_LOG_LEVEL(level = 'ERROR'): any {\r\n switch (level.toString().toUpperCase()) {\r\n case 'DEBUG':\r\n return logger.DEBUG;\r\n case 'INFO':\r\n return logger.INFO;\r\n case 'WARN':\r\n return logger.WARN;\r\n case 'ERROR':\r\n default:\r\n return logger.ERROR;\r\n case 'OFF':\r\n return logger.OFF;\r\n }\r\n }\r\n\r\n _logger;\r\n\r\n\r\n constructor(name: string) {\r\n let logLevel = this._getQueryParameters()['logLevel'] || window['LOG_LEVEL'];\r\n this._logger = logger.get(name);\r\n this._logger.setLevel(Logger.SET_LOG_LEVEL(logLevel));\r\n }\r\n\r\n\r\n /**\r\n * Fatal errors. Mission critical - application can not run properly when present.\r\n */\r\n error(...log): void {\r\n this._log('error', log);\r\n }\r\n\r\n\r\n /**\r\n * Warning only. Should be fixed but application been able to recover.\r\n */\r\n warn(...log): void {\r\n this._log('warn', log);\r\n }\r\n\r\n\r\n /**\r\n * Information only. General info printed.\r\n */\r\n info(...log): void {\r\n this._log('info', log);\r\n }\r\n\r\n\r\n /**\r\n * Debug mode. Print as much as possible to allow quick and easy debugging when needed.\r\n */\r\n debug(...log): void {\r\n this._log('debug', log);\r\n }\r\n\r\n\r\n /**\r\n * ULTRA Debug mode, almost silly to use. Print as much as possible to allow quick and easy debugging when needed.\r\n * But very useful debugging, should contain ALOT of prints via this method.\r\n */\r\n silly(...log) : void {\r\n this._log('silly', log);\r\n }\r\n\r\n\r\n /**\r\n * Private method, provides single point of access to the \"console.log\" API.\r\n * Prevents mess around the code and a clean way to prevent the output of the log or the severity level.\r\n */\r\n _log(severity: string, log: any) {\r\n if (this._isConsoleEnabled(severity)) {\r\n this._logger[severity](log);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Checks that console is globally defined and able to use it to print out log data to it.\r\n */\r\n private _isConsoleEnabled(severity: string): boolean {\r\n return 'undefined' !== typeof console && 'undefined' !== typeof console[severity]; // eslint-disable-line no-console\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n */\r\n private _getQueryParameters(str?: string) {\r\n return (str || document.location.search).replace(/(^\\?)/, '').split(\"&\").map(function (n) {\r\n n = n.split(\"=\");\r\n this[n[0]] = n[1];\r\n\r\n return this;\r\n }.bind({}))[0];\r\n }\r\n\r\n}","import CGPLogger from './logger';\r\nimport Strings from './strings';\r\nimport _ from './underscore';\r\n\r\ninterface IStorage {\r\n set(key: string, value: any) : boolean;\r\n\r\n del(key: string): boolean;\r\n\r\n get(key: string, defaultValue: any): any | null;\r\n\r\n clear(): void;\r\n};\r\n\r\nconst logger = new CGPLogger('Store');\r\n\r\nclass CGPStorage {\r\n /**\r\n * @property\r\n * @type {null|LocalStorage|WindowStorage}\r\n */\r\n _selectedStorage: IStorage = null;\r\n\r\n\r\n /**\r\n * CGP storage business logic place.\r\n */\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initialize the storage and initialize the currect instance of storage\r\n * Or from the window['localStorage'] or our window cgp storage ;).\r\n *\r\n * @returns {LocalStorage}\r\n */\r\n init() : void {\r\n if (this.isLocalStorageNameSupported()) {\r\n logger.debug('Selected to be main priority cgp storage from localstorage.');\r\n this._selectedStorage = new LocalStorage();\r\n } else {\r\n logger.debug('Selected to be main priority cgp storage from window unique localstorage.');\r\n this._selectedStorage = new WindowStorage();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Create cookie that shared/not between sub domains\r\n * @param name\r\n * @param value\r\n */\r\n setCookie(name: string, value: string) : void {\r\n let now = new Date();\r\n now.setFullYear(now.getFullYear() + 1);\r\n document.cookie = name + '=' + value + ';expires=' + now.toUTCString() + ';path=/';\r\n }\r\n\r\n /**\r\n * Get cookie by key\r\n * @param name\r\n * @returns {string}\r\n */\r\n getCookie(name: string): string {\r\n let match = document.cookie.match(new RegExp(name + '=([^;]+)'));\r\n if (match) {\r\n return match[1];\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Remove cookie by key\r\n * @param name\r\n */\r\n removeCookie(name: string) : void {\r\n document.cookie = name + \"=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/\";\r\n }\r\n\r\n /**\r\n * Check wheter local storage supported.\r\n *\r\n * @returns {boolean}\r\n */\r\n isLocalStorageNameSupported(): boolean {\r\n let testKey = 'test';\r\n\r\n try\r\n {\r\n const storage: Storage = window.localStorage;\r\n storage.setItem(testKey, '1');\r\n storage.removeItem(testKey);\r\n return 'localStorage' in window && null !== window.localStorage;\r\n }\r\n catch (error)\r\n {\r\n logger.error('Local storage is not supported the user might running under incognito mode on safari yak!');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n return this._selectedStorage.set(key, value);\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: any): boolean {\r\n if(typeof key === 'string') {\r\n return this.delKey(key);\r\n } else {\r\n return this.delArray(key);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n delKey(key: string): boolean {\r\n return this._selectedStorage.del(key);\r\n }\r\n\r\n /**\r\n * remove array of keys from storage, also check if exists.\r\n * @param keys\r\n * @returns {boolean} stating the delete was successfully or not\r\n */\r\n delArray(keys: string[]): boolean {\r\n let result = true;\r\n keys.forEach(function (key) {\r\n result = result && this._selectedStorage.del(key);\r\n }, this);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n return this._selectedStorage.get(key, defaultValue);\r\n }\r\n\r\n clearLocalStorage() {\r\n this._selectedStorage.clear();\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nclass LocalStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _perfix = 'cgp_';\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n localStorage.setItem(this.getKeyConvention(key), value);\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.localStorageExists() || null === this.get(key)) {\r\n return false;\r\n }\r\n\r\n localStorage.removeItem(this.getKeyConvention(key));\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n key = this.getKeyConvention(key);\r\n\r\n return null === localStorage.getItem(key) && 'undefined' !== typeof defaultValue ? defaultValue : localStorage.getItem(key);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll() : any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.localStorageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(localStorage)\r\n .filter(key => this.isKeyConvention(key))\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Verify localStore is defined and can be used in here :)\r\n *\r\n *\r\n * @returns {boolean} makes sure that localStorage exists and we are allowed to use it.\r\n * @public\r\n */\r\n localStorageExists() {\r\n try {\r\n return 'localStorage' in window && null !== window.localStorage;\r\n } catch (error) {\r\n logger.error(['localStorage not found, features related to store will be disabled for this session.']);\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clearLocalStorage() {\r\n * // if the localStorage is defined in the global window.\r\n * return true;\r\n * };\r\n *\r\n * @public\r\n */\r\n clear() : void {\r\n if (!this.localStorageExists()) {\r\n return;\r\n }\r\n\r\n localStorage.clear();\r\n }\r\n\r\n\r\n /**\r\n * This function will check key start with cgp prefix.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * isKeyConvention('test') {\r\n * return false;\r\n * };\r\n *\r\n * getKeyConvention('cgp_test') {\r\n * return true;\r\n * };\r\n *\r\n *\r\n * @param {string} key - that needs to be verified for convention.\r\n * @returns {boolean} if they key is valid.\r\n * @public\r\n */\r\n isKeyConvention(key: string) {\r\n let stringUtil = new Strings(key);\r\n if (stringUtil.startsWith(this._perfix)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n /**\r\n * Get string convention for localStorage key.\r\n * Extend the input key with the static prefix we define.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * getKeyConvention('test') {\r\n * return cgp_test\r\n * };\r\n *\r\n * @param {string} key - that needs to be converted to our convention.\r\n * @returns {string} of the key to be stored. With naming convention set.\r\n * @public\r\n */\r\n getKeyConvention(key: string) {\r\n if (!key) {\r\n return '';\r\n }\r\n\r\n // remove unwanted white spaces.\r\n let keyConvention = key.trim();\r\n let stringUtil = new Strings(keyConvention);\r\n if (!stringUtil.startsWith(this._perfix)) {\r\n return this._perfix + keyConvention;\r\n }\r\n\r\n return keyConvention;\r\n }\r\n}\r\n\r\nclass WindowStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _storgeKeyName = 'cgpStorage';\r\n\r\n\r\n /**\r\n * @property\r\n * @type {null|object}\r\n * @private\r\n */\r\n private _cgpStorage: {[key: string]: any} = null;\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initializing the CGP window local storage.\r\n */\r\n init() {\r\n // Define CGP storage on the global window.\r\n this._cgpStorage = (window as any)[this._storgeKeyName] = {};\r\n\r\n logger.debug('Defined a new window cgp local storage.');\r\n logger.debug('Finish initializing window storage.');\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.storageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n this._cgpStorage[key] = value;\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.storageExists() || _.isUndefined(this.get(key))) {\r\n return false;\r\n }\r\n\r\n delete this._cgpStorage[key];\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.storageExists()) {\r\n return defaultValue;\r\n }\r\n\r\n const defaultGetter = _.isUndefined(defaultValue) ? undefined : defaultValue;\r\n return this._cgpStorage[key] || defaultGetter;\r\n }\r\n\r\n\r\n /**\r\n * Check if window cgp stroage is exist.\r\n *\r\n * @returns {boolean}\r\n */\r\n storageExists(): boolean {\r\n return !_.isNull(this._cgpStorage);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll(): any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.storageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(this._cgpStorage)\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clear() {\r\n * };\r\n *\r\n * @returns {boolean} stating the clear was successfully or not.\r\n * @public\r\n */\r\n clear() : void {\r\n (window as any)[this._storgeKeyName] = {};\r\n }\r\n}\r\n\r\n\r\nexport default new CGPStorage();\r\n","interface ICurlyBracesBinding {\r\n to: string,\r\n value: string,\r\n fn: string\r\n}\r\n\r\n/**\r\n * Basic String\r\n *\r\n * Enables chaning events, output must be called, else will return a chain\r\n *\r\n *\r\n */\r\nexport default class Strings {\r\n\r\n\r\n private _curlyBracesPattern = /{([^}]+)}/g;\r\n\r\n\r\n /**\r\n * Initialized the object with the source string to work with.\r\n */\r\n constructor(str: string) {\r\n this._string = str || '';\r\n }\r\n\r\n _string: string;\r\n\r\n\r\n\r\n /**\r\n * Make a string's first character uppercase\r\n * @see: http://php.net/manual/en/function.ucfirst.php\r\n */\r\n ucFirst() : string {\r\n return this._string.charAt(0).toUpperCase() + this._string.slice(1);\r\n }\r\n\r\n getCurlyBracesBinding(): Array {\r\n let found: Array = []; // an array to collect the strings that are found\r\n\r\n let currentMatch = this._curlyBracesPattern.exec(this._string);\r\n while (currentMatch) {\r\n found.push(this._getBindingMethod(currentMatch[1]));\r\n currentMatch = this._curlyBracesPattern.exec(this._string)\r\n }\r\n\r\n return found;\r\n }\r\n\r\n private _getBindingMethod(bindExpression: string) : ICurlyBracesBinding {\r\n let bindMap = {\r\n to: bindExpression,\r\n value: '',\r\n fn: ''\r\n };\r\n\r\n let bindRelatedMethod = bindExpression.split('|');\r\n if (2 === bindRelatedMethod.length) {\r\n bindMap.value = bindRelatedMethod[0].trim();\r\n bindMap.fn = bindRelatedMethod[1].trim();\r\n }\r\n\r\n return bindMap;\r\n }\r\n\r\n\r\n /**\r\n * @description - Insert char at a specific position in the string.\r\n */\r\n insertAt(index: number, stringToInjectT: string, stringToInject: string) {\r\n return stringToInjectT.substr(0, index) + stringToInject + stringToInjectT.substr(index);\r\n }\r\n\r\n /**\r\n *\r\n * @returns {string}\r\n */\r\n stripslashes(): string {\r\n return (this._string + '')\r\n .replace(/\\\\(.?)/g, function (s, n1) {\r\n switch (n1) {\r\n case '\\\\':\r\n return '\\\\'\r\n case '0':\r\n return '\\u0000'\r\n case '':\r\n return ''\r\n default:\r\n return n1\r\n }\r\n });\r\n }\r\n replaceAll(from: string, to: string)\r\n {\r\n return this._string.replace(new RegExp(to, 'g'), from);\r\n }\r\n\r\n getString() :string {\r\n return this._string;\r\n }\r\n\r\n setString(str): void {\r\n this._string = str;\r\n }\r\n\r\n /**\r\n * @description - Determines if a value is a empty string.\r\n */\r\n isEmpty(): boolean {\r\n return this._string.length === 0 || !this._string.trim();\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param partialString\r\n */\r\n startsWith(partialString) {\r\n if (!String.prototype.startsWith) {\r\n // eslint-disable-next-line\r\n String.prototype.startsWith = function (searchString, position) {\r\n position = position || 0;\r\n return this.substr(position, searchString.length) === searchString;\r\n };\r\n }\r\n\r\n return this._string.startsWith(partialString);\r\n }\r\n\r\n injectIntoCurly(bindingParams: object): string {\r\n if (bindingParams === undefined || bindingParams === null) {\r\n return this._string;\r\n }\r\n Object\r\n .keys(bindingParams)\r\n .forEach((bindTo) => {\r\n let tokens = this._string.split('{' + bindTo + '}');\r\n this._string = tokens.join(bindingParams[bindTo]);\r\n });\r\n\r\n return this._string;\r\n }\r\n}\r\n","import DOM from './dom';\r\nimport assign from 'assign-deep';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\n\r\nclass Underscore {\r\n isArguments(input) : boolean {\r\n return '[object Arguments]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isFunction(input) : boolean {\r\n return '[object Function]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isString(input) : boolean {\r\n return '[object String]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isNumber(input) : boolean {\r\n return '[object Number]' === Object.prototype.toString.call(input) && !isNaN(input);\r\n }\r\n\r\n isObject(input) : boolean {\r\n return '[object Object]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isDate(input) : boolean {\r\n return '[object Date]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isArray(expectedArray) : boolean {\r\n return Array.isArray(expectedArray);\r\n }\r\n\r\n isBoolean(input) : boolean {\r\n return true === input || false === input || '[object Boolean]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isError(input) : boolean {\r\n return '[object Error]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isSymbol(input) : boolean {\r\n return '[object Symbol]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isUndefined(input) : boolean {\r\n return '[object Undefined]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLDivElement(input) : boolean {\r\n return '[object HTMLDivElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLImgElement(input) : boolean {\r\n return '[object HTMLImageElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isNull(value) : boolean {\r\n return 'null' === value || value === null;\r\n }\r\n\r\n isNullOrUndefined(input) : boolean {\r\n return this.isNull(input) || this.isUndefined(input);\r\n }\r\n\r\n\tpropertyChainExists(obj: any, propChain: string) : boolean {\r\n let properties = propChain.split('.');\r\n while (properties.length > 0) {\r\n obj = obj[properties.shift()];\r\n if (this.isUndefined(obj)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n isEmpty(input) : boolean {\r\n\r\n return this.isNullOrUndefined(input) || 0 === input.length || (input.constructor === Object && Object.keys(input).length === 0);\r\n }\r\n\r\n\r\n safeStringToNumber(str: string, defaultValue?: number) : number {\r\n\r\n if(this.isNullOrUndefined(str)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`str parameter is null or undefined and no default value provided`);\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n let result = Number(str);\r\n\r\n if (Number.isNaN(result)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`${str} is not a number and no default value provided`);\r\n }\r\n return defaultValue;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n\r\n isNodeList(expectedNodeList: any) : boolean {\r\n var stringRepr = Object.prototype.toString.call(expectedNodeList);\r\n\r\n return typeof expectedNodeList === 'object' &&\r\n /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) &&\r\n (typeof expectedNodeList.length === 'number') &&\r\n (expectedNodeList.length === 0 || (typeof expectedNodeList[0] === \"object\" && expectedNodeList[0].nodeType > 0));\r\n }\r\n\r\n\r\n isElement(expectedElement: any) : boolean {\r\n return expectedElement instanceof HTMLElement;\r\n }\r\n\r\n /**\r\n * Check if string includes another substring\r\n *\r\n */\r\n includes(str: string, substr: string) : boolean{\r\n return str.indexOf(substr) !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Load async js script code.\r\n *\r\n */\r\n loadAsyncScript(src: string, id: string = 'cgp-dynamic-script-' + Date.now(), type: string = 'text/javascript') : Promise {\r\n return new Promise((resolve, reject) => {\r\n var s;\r\n s = document.createElement('script');\r\n s.src = src;\r\n s.id = id;\r\n s.type = type;\r\n s.onload = resolve;\r\n s.onerror = reject;\r\n document.body.appendChild(s);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Generate GUID\r\n */\r\n getGuid(): string {\r\n return uuidv4();\r\n }\r\n\r\n\r\n /**\r\n * Make id.\r\n *\r\n */\r\n makeid() : string {\r\n var text = \"\";\r\n var possible = \"abcdefghijklmnopqrstuvwxyz\";\r\n\r\n for (var i = 0; i < 10; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * return if the link is absolute\r\n * @param link\r\n * @returns {boolean}\r\n */\r\n isAbsoluteLink(link) {\r\n let regex = /^https?:\\/\\//i;\r\n return regex.test(link);\r\n }\r\n\r\n /**\r\n * Get hostname.\r\n *\r\n */\r\n getHostName(url: string) : string {\r\n const match = url.match(/(https?:\\/\\/[^/?#]+)/i);\r\n if (match != null && match.length === 2 && typeof match[1] === 'string' && match[1].length > 0) {\r\n return match[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Determinate if the given URL is valid(support also mailto url)\r\n *\r\n */\r\n isValidUrl(url: any): boolean {\r\n if (!this.isString(url))\r\n return false;\r\n var rg = /(^(((https?):\\/\\/)|(\\/))[^\\s]+$)|((^(mailto:))[^\\s]+@[^\\s]+$)/;\r\n return rg.test(url);\r\n }\r\n\r\n isAbsolutUrl(url: string): boolean {\r\n try {\r\n new URL(url);\r\n }catch (err) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * toggle option, kicks into and out of fullscreen mode.\r\n */\r\n toggleFullScreen(): void {\r\n if (this.isFullScreen()) {\r\n this.closeFullScreen();\r\n } else {\r\n this.openFullScreen();\r\n }\r\n }\r\n\r\n openFullScreen(): void {\r\n if (document.documentElement['requestFullScreen']) {\r\n document.documentElement['requestFullScreen']();\r\n } else if (document.documentElement['mozRequestFullScreen']) {\r\n document.documentElement['mozRequestFullScreen']();\r\n } else if (document.documentElement['webkitRequestFullScreen']) {\r\n document.documentElement['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']);\r\n } else if (document.documentElement['msRequestFullscreen']) {\r\n if (!DOM.hasClass(document.body, 'cgp-ie-fullscreen')) {\r\n DOM.addClass(document.body, 'cgp-ie-fullscreen');\r\n }\r\n document.documentElement['msRequestFullscreen']();\r\n }\r\n\r\n }\r\n\r\n closeFullScreen(): void {\r\n if (document['cancelFullScreen']) {\r\n document['cancelFullScreen']();\r\n } else if (document['mozCancelFullScreen']) {\r\n document['mozCancelFullScreen']();\r\n } else if (document['webkitCancelFullScreen']) {\r\n document['webkitCancelFullScreen']();\r\n } else if (document['msExitFullscreen']) {\r\n DOM.removeClass(document.body, 'cgp-ie-fullscreen');\r\n document['msExitFullscreen']();\r\n }\r\n }\r\n\r\n isFullScreen() : boolean {\r\n return !this.isNullOrUndefined(document['mozFullScreenElement'])\r\n || !this.isNullOrUndefined(document['webkitFullscreenElement'])\r\n || !this.isNullOrUndefined(document['webkitCurrentFullScreenElement'])\r\n || !this.isNullOrUndefined(document['msFullscreenElement'])\r\n || !this.isNullOrUndefined(document['fullscreenElement']);\r\n }\r\n\r\n\r\n /**\r\n * If the user is caps lock.\r\n */\r\n isCapslock(event: any) : boolean {\r\n event = (event) ? event : window.event;\r\n\r\n let charCode: number = null;\r\n if (event.which) {\r\n charCode = event.which;\r\n } else if (event.keyCode) {\r\n charCode = event.keyCode;\r\n }\r\n\r\n let shiftOn = false;\r\n if (event.shiftKey) {\r\n shiftOn = event.shiftKey;\r\n } else if (event.modifiers) {\r\n shiftOn = !!(event.modifiers & 4);\r\n }\r\n\r\n if (charCode >= 97 && charCode <= 122 && shiftOn) {\r\n return true;\r\n }\r\n\r\n if (charCode >= 65 && charCode <= 90 && !shiftOn) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Merge/Extend Object\r\n *\r\n */\r\n mergeDeep(target: any, ...source) : any {\r\n source.forEach(curr => {\r\n assign(target, curr);\r\n });\r\n\r\n return target;\r\n }\r\n\r\n _createXmlDoc(xmlStr: string) {\r\n const xmlDoc = new (window as any).ActiveXObject(\"Microsoft.XMLDOM\");\r\n xmlDoc.async = \"false\";\r\n xmlDoc.loadXML(xmlStr);\r\n return xmlDoc;\r\n }\r\n\r\n parseXml(xmlStr: string)\r\n {\r\n try {\r\n if ((window as any).DOMParser) {\r\n return new DOMParser().parseFromString(xmlStr, \"text/xml\");\r\n } else if ((window as any).ActiveXObject) {\r\n return this._createXmlDoc(xmlStr);\r\n } else {\r\n return null;\r\n }\r\n }\r\n catch(err) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n *\r\n */\r\n getQueryParameters() : any {\r\n let pairs = window.location.search.slice(1).split('&');\r\n let result = {};\r\n\r\n pairs.forEach(pair => {\r\n try {\r\n let pairMatch = pair.match(/([^?=]+)=(([^&]*))/).slice(1);\r\n result[pairMatch[0]] = decodeURIComponent(pairMatch[1] || '');\r\n } catch(e) {\r\n //failed to parse QS\r\n }\r\n });\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n jsonToQueryString(json: any): string {\r\n return this.isEmpty(json) ? '' : '?' +\r\n Object.keys(json).map(function(key) {\r\n return encodeURIComponent(key) + '=' +\r\n encodeURIComponent(json[key]);\r\n }).join('&');\r\n }\r\n\r\n\r\n /**\r\n * Add stop scrolling class to body.\r\n *\r\n */\r\n stopScrolling() {\r\n DOM.addClass(DOM.getBody(), 'stop-scrolling');\r\n }\r\n\r\n\r\n /**\r\n * Safe way to parse json stringfy.\r\n *\r\n * @param toParse - The string we want to parse to json.\r\n * @param defaultInException - The default value to return when exception thrown.\r\n * @returns {undefined}\r\n */\r\n safeJSON(toParse: string, defaultInException?: any) : any {\r\n try {\r\n return JSON.parse(toParse);\r\n } catch (ex) {\r\n return defaultInException || ex;\r\n }\r\n }\r\n\r\n safeJSONandDecode(input: string): object{\r\n try {\r\n const json = decodeURIComponent(input);\r\n return JSON.parse(json);\r\n } catch(e) {\r\n }\r\n return {};\r\n }\r\n\r\n getJSONVal(json: object, key: string): any {\r\n\r\n let val;\r\n try {\r\n val = json[key];\r\n } catch (e) {\r\n }\r\n return (undefined !== val) ? val : '';\r\n }\r\n\r\n\r\n dasherize(str: string): string {\r\n return (str[0].toLowerCase() + str.slice(1)).trim().replace(/[_\\s]+/g, '-').replace(/([A-Z])/g, '-$1').replace(/-+/g, '-').toLowerCase();\r\n }\r\n\r\n\r\n /**\r\n * Parse string function.\r\n */\r\n parseStringFunction(strFunction: string) : {rawStringFunction: string, functionName: string, functionStringParams:string, functionArrayParams: Array} {\r\n const START = 0;\r\n\r\n let startFunctionParams = strFunction.indexOf('('),\r\n endFunctionParams = strFunction.indexOf(')');\r\n\r\n let strFunctionName = strFunction.substring(START, startFunctionParams),\r\n strFunctionParams = strFunction.substring(startFunctionParams + 1, endFunctionParams),\r\n arrayFunctionParams = strFunctionParams.replace(/\\s+/g, '').split(',');\r\n\r\n return {\r\n rawStringFunction: strFunction,\r\n functionName: strFunctionName,\r\n functionStringParams: strFunctionParams,\r\n functionArrayParams: arrayFunctionParams\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Returns the object without nullable or undefined parameters\r\n */\r\n cleanObject(obj: any, options: any) : any {\r\n options = Object.assign({removeUndefined: true, removeNull: false}, options);\r\n var cleanObject = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if ((undefined === value && true === options.removeUndefined) || (null === value && true === options.removeNull)) {\r\n return;\r\n } else {\r\n cleanObject[key] = value;\r\n }\r\n });\r\n return cleanObject;\r\n }\r\n\r\n\r\n /**\r\n * Generic convert to boolean\r\n */\r\n toBoolean(value) {\r\n if (this.isString(value) && (value === 'false' || value === 'true')) {\r\n return value === 'true';\r\n }\r\n return Boolean(value);\r\n }\r\n\r\n\r\n /**\r\n * Scroll with smooth animation\r\n * @param direction\r\n * @param scrollSize\r\n * @param container\r\n * @param duration\r\n * @param smooothLevel\r\n * @private\r\n */\r\n smoothScrolling(direction: string, scrollSize: number, duration: number, container: HTMLElement, smoothLevel: number = 20): Promise {\r\n return new Promise((res) => {\r\n let stepInterval = Math.ceil(duration / smoothLevel); // 1000 / 20 = 50\r\n let restSize = scrollSize;\r\n let scrollStepSize = Math.ceil(scrollSize / smoothLevel); // 100 / 50 = 2 (0.5 rest)\r\n\r\n let scrollStepFn = () => {\r\n scrollSize = restSize > scrollStepSize ? scrollStepSize : restSize;\r\n switch (direction) {\r\n case 'left':\r\n container.scrollLeft -= scrollSize;\r\n break;\r\n case 'right':\r\n container.scrollLeft += scrollSize;\r\n break;\r\n case 'up':\r\n container.scrollTop -= scrollSize;\r\n break;\r\n case 'down':\r\n container.scrollTop += scrollSize;\r\n break;\r\n }\r\n restSize -= scrollSize;\r\n if (0 < restSize) {\r\n DOM.setTimeout(scrollStepFn, stepInterval, null);\r\n } else {\r\n res();\r\n }\r\n };\r\n scrollStepFn();\r\n // DOM.setTimeout(scrollStepFn, stepInterval);\r\n });\r\n\r\n }\r\n\r\n toLowerCaseKeys(obj: object): object {\r\n return Object.keys(obj).reduce((accum, key) => {\r\n accum[key.toLowerCase()] = obj[key];\r\n return accum;\r\n }, {});\r\n }\r\n\r\n removeEmptyPropertiesfromObject(obj) {\r\n if(typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n\r\n Object.keys(obj).forEach((prop)=> {\r\n if(this.isNullOrUndefined(obj[prop])) {\r\n delete obj[prop];\r\n }\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * @description Remove the localhost\r\n */\r\n removeLocalhost(url){\r\n try {\r\n return url.replace(/^[a-z]{4,5}:\\/{2}[a-z]{1,}:[0-9]{1,4}.(.*)/, '$1');\r\n }catch (e) {\r\n return url;\r\n }\r\n }\r\n\r\n capitalizeFirstLetter(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n\r\n\r\n lowerFirstLetter(str: string): string {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n }\r\n\r\n\r\n arraysAreEqual(arr1: any[], arr2: any[], areItemsEqual?: (item1: any, item2: any) => boolean): boolean {\r\n arr1 = arr1 || [];\r\n arr2 = arr2 || [];\r\n\r\n if(arr1.length !== arr2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < arr1.length; i++) {\r\n if(this.isNullOrUndefined(areItemsEqual)) {\r\n if(arr1[i] !== arr2[i]) {\r\n return false;\r\n }\r\n } else {\r\n if(!areItemsEqual(arr1[i], arr2[i])) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * should return the number as bytes notation.\r\n * for example:\r\n * formatNumberToBytesNotation(1000, 0) will return 1K\r\n * formatNumberToBytesNotation(3000000, 0) will return 3M\r\n * formatNumberToBytesNotation(1500, 1) will return 1.5K\r\n * @param num\r\n * @param digits\r\n */\r\n formatNumberToBytesNotation(num: number, digits: number) {\r\n const formatMap = [\r\n { value: 1, symbol: \"\" },\r\n { value: 1E3, symbol: \"K\" },\r\n { value: 1E6, symbol: \"M\" },\r\n { value: 1E9, symbol: \"G\" },\r\n { value: 1E12, symbol: \"T\" },\r\n { value: 1E15, symbol: \"P\" },\r\n { value: 1E18, symbol: \"E\" }\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n let index;\r\n for (index = formatMap.length - 1; index > 0; index--) {\r\n if (num >= formatMap[index].value) {\r\n break;\r\n }\r\n }\r\n return (num / formatMap[index].value).toFixed(digits).replace(rx, \"$1\") + formatMap[index].symbol;\r\n }\r\n\r\n once(fn, context = this) {\r\n let result;\r\n return function() {\r\n if (fn) {\r\n result = fn.apply(context || this, arguments);\r\n fn = null;\r\n }\r\n return result;\r\n };\r\n }\r\n}\r\n\r\nexport default new Underscore();","import {Check} from '@sparkware/app-utils';\r\n\r\nexport class Lazy{\r\n constructor(private _valueFactory: () => T) {\r\n }\r\n\r\n private _value = undefined;\r\n private _initializing = false;\r\n private _initValue() {\r\n if(this._initializing) {\r\n throw new Error('Lazy circular dependency detected: ' + this._valueFactory)\r\n }\r\n if(Check.isUndefined(this._value)) {\r\n this._initializing = true;\r\n try {\r\n this._value = this._valueFactory();\r\n }\r\n finally {\r\n this._initializing = false;\r\n }\r\n\r\n }\r\n }\r\n\r\n get value(): T {\r\n this._initValue();\r\n\r\n return this._value;\r\n }\r\n\r\n forceInit() {\r\n this._initValue();\r\n }\r\n}\r\n","\r\nexport function splitArrayToChunks(originalArray: T[], chunkSize: number): Array {\r\n\r\n if(!originalArray || originalArray.length === 0) {\r\n return [];\r\n }\r\n\r\n let result: Array = [];\r\n for(let i = 0; i * chunkSize < originalArray.length; i++) {\r\n result.push(originalArray.slice(i * chunkSize, i * chunkSize + chunkSize));\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function arraysEqual(arr1: T[], arr2: T[]) {\r\n if (arr1 === arr2) return true;\r\n if (arr1 == null || arr2 == null) return false;\r\n if (arr1.length !== arr2.length) return false;\r\n\r\n for (let i = 0; i < arr1.length; ++i) {\r\n if (arr1[i] !== arr2[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Shuffle an array using the Fisher-Yates unbiased algorithm\r\n * Read more about the algorithm here: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\r\n * The implementation is taken from here: https://bost.ocks.org/mike/shuffle/\r\n * and updated a bit for typescript\r\n */\r\nexport function shuffle(array: unknown[]) {\r\n let m = array.length, t: unknown;\r\n\r\n // While there remain elements to shuffle…\r\n while (m) {\r\n\r\n // Pick a remaining element…\r\n let i = Math.floor(Math.random() * m--);\r\n\r\n // And swap it with the current element.\r\n t = array[m];\r\n array[m] = array[i];\r\n array[i] = t;\r\n }\r\n\r\n return array;\r\n}\r\n","import {Check, TimeSpan} from '@sparkware/app-utils';\r\nimport {ApplicationStartupConfigurations} from '../app-react/app-bootstrap/config-interfaces/application-startup.configurations';\r\nimport {TimeIntervalName} from '../common/utils/time-interval-names';\r\n\r\nexport const CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME = 'CypressToOrbitHooks';\r\nexport const CYPRESS_GLOBAL_OBJECT_NAME = 'Cypress';\r\n\r\nexport function isInsideAutomation(): boolean {\r\n return !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME])\r\n && !Check.isNullOrUndefined(window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME])\r\n}\r\n\r\n\r\nexport function mockApplicationStartupConfigs(configs: ApplicationStartupConfigurations): ApplicationStartupConfigurations {\r\n if(isInsideAutomation()) {\r\n getCypressToOrbitHooks().onAppStartupConfigs(configs);\r\n }\r\n return configs;\r\n}\r\n\r\nexport function getCypressToOrbitHooks(): ICypressToOrbitHooks {\r\n if(!isInsideAutomation()) {\r\n throw new Error('You can only call getCypressToOrbitHooks inside automation');\r\n }\r\n return window[CYPRESS_GLOBAL_OBJECT_NAME][CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME] as ICypressToOrbitHooks;\r\n}\r\n\r\nexport interface OnTimeIntervalCreationResult {\r\n ignoreJavaScriptImplementation: boolean;\r\n timerId?: number;\r\n}\r\n\r\nexport enum NamedIntervalType {\r\n setInterval,\r\n setTimeout\r\n}\r\n\r\nexport interface ICypressToOrbitHooks {\r\n onAppStartupConfigs(configs: ApplicationStartupConfigurations);\r\n onTimeIntervalCreation(name: TimeIntervalName, callback: () => void, interval: TimeSpan, intervalType: NamedIntervalType): OnTimeIntervalCreationResult;\r\n}\r\n\r\n","export function matchAllWords(text: string, words: RegExp[]): boolean {\r\n for(let index = 0; index < words.length; index++) {\r\n if(!text.match(words[index])) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function removeSpaces(str) {\r\n return str.replace(/\\s/g, '');\r\n}\r\n\r\nexport function removeSpecialCharacters(str: string): string {\r\n return str.replace(/[^a-zA-Z ]/g, \"\");\r\n}\r\n\r\n/**\r\n * Given a string extracts all the words from it and converts them in case insensitive regular expressions\r\n * @param {string} text\r\n * @return {RegExp[]}\r\n */\r\nexport function extractWordsRegularExpressions(text: string): RegExp[] {\r\n if(!text) {\r\n return [];\r\n }\r\n\r\n return text.split(' ')\r\n .map(word => word.trim())\r\n .filter(word => word)\r\n .map(word => new RegExp(word, 'gi'));\r\n}\r\n\r\nexport function convertStringArrayToString(messages: string[], joinCharacters: string): string {\r\n return messages.join(joinCharacters);\r\n\r\n}\r\n\r\nexport function parseCommaSeparatedNumbers(values: string): number[] {\r\n return values.split(',')\r\n .map(n => n.trim())\r\n .filter(n => n !== '')\r\n .map(n => parseInt(n))\r\n}"],"names":["OrbitComponentWithState","_reactions","this","props","services","context","_disposeReactions","expression","effect","opts","disposer","mobxReaction","push","forEach","React","contextType","OrbitContext","OrbitComponent","IMAGE_TYPE","IMAGE_STATUS","EMPTY_IMAGE","Image","_imgRef","createRef","_onLoad","e","state","status","LAZY","LOADING","setState","SETTLED","type","SRC","onLoad","onSettled","value","_onError","FALLBACK","src","EMPTY_IMAGE_BASE64","fallbackSrc","onError","_tapHandlerLogic","_intersectionObserver","_intersectionObserverCallback","entries","observer","intersectionRatio","isIntersecting","_destroyIntersectionObserver","onLoadStart","current","_createIntersectionObserver","_getInitialSrcState","_createTapLogicHandler","lazy","_destroyTapLogicHandler","prevProps","element","enableTap","TapHandlerLogic","dispose","IntersectionObserver","rootMargin","threshold","observe","disconnect","alt","className","title","width","height","style","ref","onClick","_element","_timeoutRef","_onClickHandler","classList","add","ORBIT_TAP","setTimeout","remove","addEventListener","clearTimeout","removeEventListener","TapHandler","children","enabled","elementRef","OrbitContextProvider","Provider","Consumer","DomService","observable","initialBodyPaddingRight","bodyPaddingRightAltered","_eventListenerRegistration","_onFullScreenChange","runInAction","isInFullScreen","_","makeObservable","EventListenerRegistration","document","DOM","window","innerWidth","body","clientWidth","scrollbarThickness","bodyComputedStyles","getComputedStyle","paddingRight","selector","querySelector","head","documentElement","location","pathname","getElementsByClassName","tagName","getElementsByTagName","id","getElementById","createElement","url","options","urlBuilder","URL","urlParams","searchParams","paramValue","paramName","search","hash","submitForm","method","href","extraParams","params","form","setAttribute","Check","target","hiddenField","key","appendChild","submit","removeChild","FallbackRoute","render","_routeDefinition","paths","routeParams","RouteBase","_routeParams","_isOrbitRoute","data","tryMatchPath","pathToMatch","routes","i","length","routeDefinition","j","pattern","match","matchPath","path","caseSensitive","exact","end","SplashService","onAfterRemoveSplash","splashTime","_splashRemovedSubscribers","startTime","parseFloat","performance","now","toFixed","splashPageElement","computeSplashTimeInSeconds","callback","_enablePrerender","console","error","timeoutValue","isInsideAutomation","namedTimer","name","handler","interval","intervalType","javascriptFunction","Error","TimeSpan","timeSpan","convertToTimeSpan","response","getCypressToOrbitHooks","onTimeIntervalCreation","ignoreJavaScriptImplementation","timerId","totalMilliseconds","namedSetInterval","NamedIntervalType","setInterval","namedSetTimeout","DeviceFeatureDetection","DocumentTouch","undefined","navigator","maxTouchPoints","DeviceOSDetection","parser","os","getOS","replace","toLowerCase","parseInt","version","split","indexOf","isMobileOS","isIOS","isAndroid","DeviceViewportDetection","innerHeight","screen","ratio","systemXDPI","logicalXDPI","devicePixelRatio","matchMedia","matches","DeviceModelDetection","device","getDevice","vendor","model","DeviceBrowserDetection","browser","getBrowser","allowAttrValue","getAllowAttr","NATIVE_TYPE","DeviceHybridDetection","logger","_hybrid","_inCasino","_inPoker","_inSport","_embedded","Logger","constructor","CLASS","buildHybridInfo","genericHybridEmbedded","inPokerHybrid","build_isInPokerHybrid","casinoHybrid","build_isCasinoHybrid","inSportHybrid","build_isInSportHybrid","dataSanityCheck","inPoker","isNativeIOS","isNativeAndroid","NativeInterface","Store","storedClientVersion","startsWith","storedSourceProductPackage","toString","webkit","messageHandlers","_uaParser","UAParser","feature","viewport","hybrid","getUA","uuidv4","media","standalone","isHybrid","isStandalone","getContext","isProbablyIOSDevice","cookieEnabled","isMacOS","isTouch","isIpad","isIphone","isMobile","screenWidth","screenHeight","getIphoneVersion","isTablet","b","m","bd","bmt","Date","t","count","tt","Math","max","apply","_createLogger","append","getBody","query","el","isTag","tag","substring","isId","substr","querySelectorAll","slice","call","content","newStyle","innerHTML","html","domElement","_class","addClass","parentNode","insertBefore","firstChild","toggle","contains","attribute","removeProperty","getCurrentStyle","horizontMargin","marginLeft","marginRight","verticalMargin","marginBottom","marginTop","offsetWidth","offsetHeight","horizontPadding","paddingLeft","verticalPadding","paddingBottom","paddingTop","horizontBorder","borderLeftWidth","borderRightWidth","verticalBorder","borderBottomWidth","borderTopWidth","fullWidth","fullHeight","size","unit","removeClass","attr","removeAttribute","str","g","toUpperCase","attributes","test","camelCaseName","$0","$1","textContent","msgElement","msgType","msgCallback","useCapture","eventName","timeout","handle","clearInterval","_logger","logLevel","_getQueryParameters","setLevel","SET_LOG_LEVEL","log","_log","severity","_isConsoleEnabled","map","n","bind","CGPLogger","CGPStorage","_selectedStorage","init","isLocalStorageNameSupported","debug","LocalStorage","WindowStorage","setFullYear","getFullYear","cookie","toUTCString","RegExp","testKey","storage","localStorage","setItem","removeItem","set","delKey","delArray","del","keys","result","defaultValue","get","clear","_perfix","localStorageExists","getKeyConvention","getItem","Object","filter","isKeyConvention","Strings","keyConvention","trim","_storgeKeyName","_cgpStorage","storageExists","defaultGetter","_curlyBracesPattern","_string","charAt","found","currentMatch","exec","_getBindingMethod","bindExpression","bindMap","to","fn","bindRelatedMethod","index","stringToInjectT","stringToInject","s","n1","from","partialString","String","prototype","searchString","position","bindingParams","bindTo","tokens","join","Underscore","input","isNaN","expectedArray","Array","isArray","isNull","isUndefined","obj","propChain","properties","shift","isNullOrUndefined","Number","expectedNodeList","stringRepr","nodeType","expectedElement","HTMLElement","Promise","resolve","reject","onload","onerror","text","possible","floor","random","link","isString","err","isFullScreen","closeFullScreen","openFullScreen","Element","event","charCode","which","keyCode","shiftOn","shiftKey","modifiers","source","curr","assign","xmlStr","xmlDoc","ActiveXObject","async","loadXML","DOMParser","parseFromString","_createXmlDoc","pairs","pair","pairMatch","decodeURIComponent","JSON","parse","stringify","json","isEmpty","encodeURIComponent","toParse","defaultInException","ex","val","strFunction","startFunctionParams","endFunctionParams","strFunctionName","strFunctionParams","arrayFunctionParams","rawStringFunction","functionName","functionStringParams","functionArrayParams","removeUndefined","removeNull","cleanObject","Boolean","direction","scrollSize","duration","container","smoothLevel","res","stepInterval","ceil","restSize","scrollStepSize","scrollStepFn","scrollLeft","scrollTop","reduce","accum","prop","arr1","arr2","areItemsEqual","num","digits","formatMap","symbol","arguments","Lazy","_valueFactory","_value","_initializing","_initValue","splitArrayToChunks","originalArray","chunkSize","arraysEqual","shuffle","array","CYPRESS_TO_ORBIT_HOOKS_OBJECT_NAME","CYPRESS_GLOBAL_OBJECT_NAME","mockApplicationStartupConfigs","configs","onAppStartupConfigs","matchAllWords","words","removeSpaces","removeSpecialCharacters","extractWordsRegularExpressions","word","convertStringArrayToString","messages","joinCharacters","parseCommaSeparatedNumbers","values"],"sourceRoot":""}