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