{"version":3,"sources":["sdk/src/utils/logger.ts","sdk/src/utils/underscore.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/store.ts","../node_modules/ua-parser-js/src/ua-parser.js","../node_modules/webpack/buildin/amd-options.js","../node_modules/js-logger/src/logger.js","../node_modules/assign-deep/index.js","../node_modules/is-primitive/index.js","../node_modules/assign-deep/node_modules/assign-symbols/index.js","../node_modules/assign-deep/node_modules/kind-of/index.js","sdk/src/utils/strings.ts"],"names":["logger","useDefaults","Logger","name","_logger","logLevel","this","_getQueryParameters","window","get","setLevel","SET_LOG_LEVEL","log","_log","severity","_isConsoleEnabled","console","str","document","location","search","replace","split","map","n","bind","level","toString","toUpperCase","DEBUG","INFO","WARN","ERROR","OFF","Underscore","input","Object","prototype","call","isNaN","expectedArray","Array","isArray","value","isNull","isUndefined","obj","propChain","properties","length","shift","isNullOrUndefined","constructor","keys","defaultValue","Error","result","Number","expectedNodeList","stringRepr","test","nodeType","expectedElement","HTMLElement","substr","indexOf","src","id","Date","now","type","Promise","resolve","reject","s","createElement","onload","onerror","body","appendChild","s4","Math","floor","random","substring","text","possible","i","charAt","link","url","match","isString","URL","err","isFullScreen","closeFullScreen","openFullScreen","documentElement","Element","DOM","hasClass","addClass","removeClass","event","charCode","which","keyCode","shiftOn","shiftKey","modifiers","target","source","forEach","curr","assign","xmlStr","xmlDoc","ActiveXObject","async","loadXML","DOMParser","parseFromString","_createXmlDoc","pairs","slice","pair","pairMatch","decodeURIComponent","e","JSON","parse","stringify","json","isEmpty","key","encodeURIComponent","join","getBody","toParse","defaultInException","ex","val","undefined","toLowerCase","trim","strFunction","startFunctionParams","endFunctionParams","strFunctionName","strFunctionParams","arrayFunctionParams","rawStringFunction","functionName","functionStringParams","functionArrayParams","options","removeUndefined","removeNull","cleanObject","entries","Boolean","direction","scrollSize","duration","container","smoothLevel","res","stepInterval","ceil","restSize","scrollStepSize","scrollStepFn","scrollLeft","scrollTop","setTimeout","reduce","accum","prop","arr1","arr2","areItemsEqual","num","digits","index","formatMap","symbol","toFixed","fn","context","apply","arguments","DeviceFeatureDetection","DocumentTouch","navigator","maxTouchPoints","DeviceOSDetection","parser","os","getOS","parseInt","version","isMobileOS","isIOS","isAndroid","DeviceViewportDetection","innerWidth","innerHeight","screen","height","width","ratio","systemXDPI","logicalXDPI","devicePixelRatio","matchMedia","matches","DeviceModelDetection","device","getDevice","vendor","model","DeviceBrowserDetection","browser","getBrowser","NATIVE_TYPE","DeviceHybridDetection","_hybrid","_inPoker","_inSport","_embedded","CLASS","buildHybridInfo","casinoHybrid","build_isCasinoHybrid","inPokerHybrid","build_isInPokerHybrid","inSportHybrid","build_isInSportHybrid","genericHybridEmbedded","casinoHybridEmbedded","inPokerHybridEmbedded","inSportHybridEmbedded","dataSanityCheck","isNativeIOS","isNativeAndroid","NativeInterface","Store","storedClientVersion","startsWith","storedSourceProductPackage","className","webkit","messageHandlers","error","Device","_uaParser","UAParser","feature","viewport","hybrid","getUA","connection","effectiveType","rtt","downlink","uuid","media","standalone","isStandalone","getContext","isProbablyIOSDevice","isHybrid","cookieEnabled","isMacOS","isTouch","isIpad","isIphone","isMobile","screenWidth","screenHeight","getIphoneVersion","isTablet","b","m","bd","bmt","t","count","tt","max","_createLogger","element","append","query","el","_","isTag","tag","isId","getElementById","querySelectorAll","isNodeList","selector","querySelector","content","newStyle","innerHTML","html","classList","domElement","_class","isElement","parentNode","removeChild","insertBefore","firstChild","add","toggle","contains","attribute","setAttribute","style","removeProperty","getCurrentStyle","horizontMargin","parseFloat","marginLeft","marginRight","verticalMargin","marginBottom","marginTop","offsetWidth","offsetHeight","horizontPadding","paddingLeft","paddingRight","verticalPadding","paddingBottom","paddingTop","horizontBorder","borderLeftWidth","borderRightWidth","verticalBorder","borderBottomWidth","borderTopWidth","fullWidth","fullHeight","size","unit","getComputedStyle","remove","attr","removeAttribute","tagName","g","data","attributes","camelCaseName","$0","$1","textContent","callback","msgElement","msgType","msgCallback","useCapture","addEventListener","removeEventListener","eventName","isFunction","timeout","namedSetInterval","handle","clearInterval","namedSetTimeout","clearTimeout","CGPLogger","CGPStorage","_selectedStorage","init","isLocalStorageNameSupported","debug","LocalStorage","WindowStorage","setFullYear","getFullYear","cookie","toUTCString","RegExp","testKey","storage","localStorage","setItem","removeItem","set","delKey","delArray","del","clear","_perfix","getQueryParameters","localStorageExists","getKeyConvention","getItem","filter","isKeyConvention","push","Strings","keyConvention","_storgeKeyName","_cgpStorage","storageExists","defaultGetter","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","MODEL","NAME","TYPE","VENDOR","VERSION","ARCHITECTURE","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","EMBEDDED","AMAZON","APPLE","ASUS","BLACKBERRY","FIREFOX","GOOGLE","HUAWEI","LG","MICROSOFT","MOTOROLA","OPERA","SAMSUNG","SONY","XIAOMI","ZEBRA","FACEBOOK","enumerize","arr","enums","has","str1","str2","lowerize","len","rgxMapper","ua","arrays","j","k","p","q","regex","props","exec","strMapper","windowsVersionMap","regexes","CHROME","cpu","engine","EDGE","extensions","getResult","_ua","userAgent","_rgxmap","mergedRegexes","concat","extend","_browser","major","getCPU","_cpu","_device","getEngine","_engine","_os","setUA","BROWSER","CPU","DEVICE","ENGINE","OS","exports","module","define","$","jQuery","Zepto","__webpack_amd_options__","global","logHandler","contextualLoggersByNameMap","scope","func","merge","args","hasOwnProperty","defineLogLevel","TRACE","TIME","ContextualLogger","defaultContext","filterLevel","info","newLevel","getLevel","enabledFor","lvl","trace","invoke","warn","time","label","timeEnd","msgArgs","globalLogger","L","setHandler","createDefaultHandler","formatter","messages","unshift","timerStartTimeByLabelMap","invokeConsoleMethod","hdlr","Function","timerLabel","getTime","defaultLevel","isPrimitive","require","assignSymbols","typeOf","isObject","isValidKey","hasOwn","receiver","objects","TypeError","Symbol","getOwnPropertySymbols","isEnumerable","propertyIsEnumerable","provider","names","String","isBuffer","_curlyBracesPattern","_string","found","currentMatch","_getBindingMethod","bindExpression","bindMap","to","bindRelatedMethod","stringToInjectT","stringToInject","n1","from","partialString","searchString","position","bindingParams","bindTo","tokens"],"mappings":"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","file":"static/js/cgp-sdk~launcher.55982174.chunk.js","sourcesContent":["import logger from 'js-logger';\r\n\r\nlogger.useDefaults();\r\n\r\nexport default class Logger {\r\n\r\n static SET_LOG_LEVEL(level = 'ERROR'): any {\r\n switch (level.toString().toUpperCase()) {\r\n case 'DEBUG':\r\n return logger.DEBUG;\r\n case 'INFO':\r\n return logger.INFO;\r\n case 'WARN':\r\n return logger.WARN;\r\n case 'ERROR':\r\n default:\r\n return logger.ERROR;\r\n case 'OFF':\r\n return logger.OFF;\r\n }\r\n }\r\n\r\n _logger;\r\n\r\n\r\n constructor(name: string) {\r\n let logLevel = this._getQueryParameters()['logLevel'] || window['LOG_LEVEL'];\r\n this._logger = logger.get(name);\r\n this._logger.setLevel(Logger.SET_LOG_LEVEL(logLevel));\r\n }\r\n\r\n\r\n /**\r\n * Fatal errors. Mission critical - application can not run properly when present.\r\n */\r\n error(...log): void {\r\n this._log('error', log);\r\n }\r\n\r\n\r\n /**\r\n * Warning only. Should be fixed but application been able to recover.\r\n */\r\n warn(...log): void {\r\n this._log('warn', log);\r\n }\r\n\r\n\r\n /**\r\n * Information only. General info printed.\r\n */\r\n info(...log): void {\r\n this._log('info', log);\r\n }\r\n\r\n\r\n /**\r\n * Debug mode. Print as much as possible to allow quick and easy debugging when needed.\r\n */\r\n debug(...log): void {\r\n this._log('debug', log);\r\n }\r\n\r\n\r\n /**\r\n * ULTRA Debug mode, almost silly to use. Print as much as possible to allow quick and easy debugging when needed.\r\n * But very useful debugging, should contain ALOT of prints via this method.\r\n */\r\n silly(...log) : void {\r\n this._log('silly', log);\r\n }\r\n\r\n\r\n /**\r\n * Private method, provides single point of access to the \"console.log\" API.\r\n * Prevents mess around the code and a clean way to prevent the output of the log or the severity level.\r\n */\r\n _log(severity: string, log: any) {\r\n if (this._isConsoleEnabled(severity)) {\r\n this._logger[severity](log);\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Checks that console is globally defined and able to use it to print out log data to it.\r\n */\r\n private _isConsoleEnabled(severity: string): boolean {\r\n return 'undefined' !== typeof console && 'undefined' !== typeof console[severity]; // eslint-disable-line no-console\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n */\r\n private _getQueryParameters(str?: string) {\r\n return (str || document.location.search).replace(/(^\\?)/, '').split(\"&\").map(function (n) {\r\n n = n.split(\"=\");\r\n this[n[0]] = n[1];\r\n\r\n return this;\r\n }.bind({}))[0];\r\n }\r\n\r\n}","import DOM from './dom';\r\nimport assign from 'assign-deep';\r\n\r\n\r\nclass Underscore {\r\n isArguments(input) : boolean {\r\n return '[object Arguments]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isFunction(input) : boolean {\r\n return '[object Function]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isString(input) : boolean {\r\n return '[object String]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isNumber(input) : boolean {\r\n return '[object Number]' === Object.prototype.toString.call(input) && !isNaN(input);\r\n }\r\n\r\n isObject(input) : boolean {\r\n return '[object Object]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isDate(input) : boolean {\r\n return '[object Date]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isArray(expectedArray) : boolean {\r\n return Array.isArray(expectedArray);\r\n }\r\n\r\n isBoolean(input) : boolean {\r\n return true === input || false === input || '[object Boolean]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isError(input) : boolean {\r\n return '[object Error]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isSymbol(input) : boolean {\r\n return '[object Symbol]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isUndefined(input) : boolean {\r\n return '[object Undefined]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLDivElement(input) : boolean {\r\n return '[object HTMLDivElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n isHTMLImgElement(input) : boolean {\r\n return '[object HTMLImageElement]' === Object.prototype.toString.call(input);\r\n }\r\n\r\n\r\n isNull(value) : boolean {\r\n return 'null' === value || value === null;\r\n }\r\n\r\n isNullOrUndefined(input) : boolean {\r\n return this.isNull(input) || this.isUndefined(input);\r\n }\r\n\r\n\tpropertyChainExists(obj: any, propChain: string) : boolean {\r\n let properties = propChain.split('.');\r\n while (properties.length > 0) {\r\n obj = obj[properties.shift()];\r\n if (this.isUndefined(obj)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n isEmpty(input) : boolean {\r\n\r\n return this.isNullOrUndefined(input) || 0 === input.length || (input.constructor === Object && Object.keys(input).length === 0);\r\n }\r\n\r\n\r\n safeStringToNumber(str: string, defaultValue?: number) : number {\r\n\r\n if(this.isNullOrUndefined(str)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`str parameter is null or undefined and no default value provided`);\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n let result = Number(str);\r\n\r\n if (Number.isNaN(result)) {\r\n if(this.isNullOrUndefined(defaultValue)) {\r\n throw new Error(`${str} is not a number and no default value provided`);\r\n }\r\n return defaultValue;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n\r\n isNodeList(expectedNodeList: any) : boolean {\r\n var stringRepr = Object.prototype.toString.call(expectedNodeList);\r\n\r\n return typeof expectedNodeList === 'object' &&\r\n /^\\[object (HTMLCollection|NodeList|Object)\\]$/.test(stringRepr) &&\r\n (typeof expectedNodeList.length === 'number') &&\r\n (expectedNodeList.length === 0 || (typeof expectedNodeList[0] === \"object\" && expectedNodeList[0].nodeType > 0));\r\n }\r\n\r\n\r\n isElement(expectedElement: any) : boolean {\r\n return expectedElement instanceof HTMLElement;\r\n }\r\n\r\n /**\r\n * Check if string includes another substring\r\n *\r\n */\r\n includes(str: string, substr: string) : boolean{\r\n return str.indexOf(substr) !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Load async js script code.\r\n *\r\n */\r\n loadAsyncScript(src: string, id: string = 'cgp-dynamic-script-' + Date.now(), type: string = 'text/javascript') : Promise {\r\n return new Promise((resolve, reject) => {\r\n var s;\r\n s = document.createElement('script');\r\n s.src = src;\r\n s.id = id;\r\n s.type = type;\r\n s.onload = resolve;\r\n s.onerror = reject;\r\n document.body.appendChild(s);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Generate GUID\r\n */\r\n getGuid(): string {\r\n let s4 = () => {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n };\r\n\r\n return s4() + s4() + s4() + s4() +\r\n s4() + s4() + s4() + s4();\r\n }\r\n\r\n\r\n /**\r\n * Make id.\r\n *\r\n */\r\n makeid() : string {\r\n var text = \"\";\r\n var possible = \"abcdefghijklmnopqrstuvwxyz\";\r\n\r\n for (var i = 0; i < 10; i++)\r\n text += possible.charAt(Math.floor(Math.random() * possible.length));\r\n\r\n return text;\r\n }\r\n\r\n /**\r\n * return if the link is absolute\r\n * @param link\r\n * @returns {boolean}\r\n */\r\n isAbsoluteLink(link) {\r\n let regex = /^https?:\\/\\//i;\r\n return regex.test(link);\r\n }\r\n\r\n /**\r\n * Get hostname.\r\n *\r\n */\r\n getHostName(url: string) : string {\r\n const match = url.match(/(https?:\\/\\/[^/?#]+)/i);\r\n if (match != null && match.length === 2 && typeof match[1] === 'string' && match[1].length > 0) {\r\n return match[1];\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Determinate if the given URL is valid(support also mailto url)\r\n *\r\n */\r\n isValidUrl(url: any): boolean {\r\n if (!this.isString(url))\r\n return false;\r\n var rg = /(^(((https?):\\/\\/)|(\\/))[^\\s]+$)|((^(mailto:))[^\\s]+@[^\\s]+$)/;\r\n return rg.test(url);\r\n }\r\n\r\n isAbsolutUrl(url: string): boolean {\r\n try {\r\n new URL(url);\r\n }catch (err) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * toggle option, kicks into and out of fullscreen mode.\r\n */\r\n toggleFullScreen(): void {\r\n if (this.isFullScreen()) {\r\n this.closeFullScreen();\r\n } else {\r\n this.openFullScreen();\r\n }\r\n }\r\n\r\n openFullScreen(): void {\r\n if (document.documentElement['requestFullScreen']) {\r\n document.documentElement['requestFullScreen']();\r\n } else if (document.documentElement['mozRequestFullScreen']) {\r\n document.documentElement['mozRequestFullScreen']();\r\n } else if (document.documentElement['webkitRequestFullScreen']) {\r\n document.documentElement['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']);\r\n } else if (document.documentElement['msRequestFullscreen']) {\r\n if (!DOM.hasClass(document.body, 'cgp-ie-fullscreen')) {\r\n DOM.addClass(document.body, 'cgp-ie-fullscreen');\r\n }\r\n document.documentElement['msRequestFullscreen']();\r\n }\r\n\r\n }\r\n\r\n closeFullScreen(): void {\r\n if (document['cancelFullScreen']) {\r\n document['cancelFullScreen']();\r\n } else if (document['mozCancelFullScreen']) {\r\n document['mozCancelFullScreen']();\r\n } else if (document['webkitCancelFullScreen']) {\r\n document['webkitCancelFullScreen']();\r\n } else if (document['msExitFullscreen']) {\r\n DOM.removeClass(document.body, 'cgp-ie-fullscreen');\r\n document['msExitFullscreen']();\r\n }\r\n }\r\n\r\n isFullScreen() : boolean {\r\n return !this.isNullOrUndefined(document['mozFullScreenElement'])\r\n || !this.isNullOrUndefined(document['webkitFullscreenElement'])\r\n || !this.isNullOrUndefined(document['webkitCurrentFullScreenElement'])\r\n || !this.isNullOrUndefined(document['msFullscreenElement'])\r\n || !this.isNullOrUndefined(document['fullscreenElement']);\r\n }\r\n\r\n\r\n /**\r\n * If the user is caps lock.\r\n */\r\n isCapslock(event: any) : boolean {\r\n event = (event) ? event : window.event;\r\n\r\n let charCode: number = null;\r\n if (event.which) {\r\n charCode = event.which;\r\n } else if (event.keyCode) {\r\n charCode = event.keyCode;\r\n }\r\n\r\n let shiftOn = false;\r\n if (event.shiftKey) {\r\n shiftOn = event.shiftKey;\r\n } else if (event.modifiers) {\r\n shiftOn = !!(event.modifiers & 4);\r\n }\r\n\r\n if (charCode >= 97 && charCode <= 122 && shiftOn) {\r\n return true;\r\n }\r\n\r\n if (charCode >= 65 && charCode <= 90 && !shiftOn) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Merge/Extend Object\r\n *\r\n */\r\n mergeDeep(target: any, ...source) : any {\r\n source.forEach(curr => {\r\n assign(target, curr);\r\n });\r\n\r\n return target;\r\n }\r\n\r\n _createXmlDoc(xmlStr: string) {\r\n const xmlDoc = new (window as any).ActiveXObject(\"Microsoft.XMLDOM\");\r\n xmlDoc.async = \"false\";\r\n xmlDoc.loadXML(xmlStr);\r\n return xmlDoc;\r\n }\r\n\r\n parseXml(xmlStr: string)\r\n {\r\n try {\r\n if ((window as any).DOMParser) {\r\n return new DOMParser().parseFromString(xmlStr, \"text/xml\");\r\n } else if ((window as any).ActiveXObject) {\r\n return this._createXmlDoc(xmlStr);\r\n }\r\n }\r\n catch(err) {\r\n return null;\r\n }\r\n if ((window as any).DOMParser) {\r\n try {\r\n return new DOMParser().parseFromString(xmlStr, \"text/xml\");\r\n }\r\n catch(err) {\r\n return null;\r\n }\r\n } else if ((window as any).ActiveXObject) {\r\n try {\r\n return this._createXmlDoc(xmlStr);\r\n }\r\n catch(err) {\r\n return null;\r\n }\r\n }\r\n else\r\n return null;\r\n }\r\n\r\n /**\r\n * Get Query String or \"string\" as Object\r\n *\r\n */\r\n getQueryParameters() : any {\r\n let pairs = window.location.search.slice(1).split('&');\r\n let result = {};\r\n\r\n pairs.forEach(pair => {\r\n try {\r\n let pairMatch = pair.match(/([^?=]+)=(([^&]*))/).slice(1);\r\n result[pairMatch[0]] = decodeURIComponent(pairMatch[1] || '');\r\n } catch(e) {\r\n //failed to parse QS\r\n }\r\n });\r\n\r\n return JSON.parse(JSON.stringify(result));\r\n }\r\n\r\n jsonToQueryString(json: any): string {\r\n return this.isEmpty(json) ? '' : '?' +\r\n Object.keys(json).map(function(key) {\r\n return encodeURIComponent(key) + '=' +\r\n encodeURIComponent(json[key]);\r\n }).join('&');\r\n }\r\n\r\n\r\n /**\r\n * Add stop scrolling class to body.\r\n *\r\n */\r\n stopScrolling() {\r\n DOM.addClass(DOM.getBody(), 'stop-scrolling');\r\n }\r\n\r\n\r\n /**\r\n * Safe way to parse json stringfy.\r\n *\r\n * @param toParse - The string we want to parse to json.\r\n * @param defaultInException - The default value to return when exception thrown.\r\n * @returns {undefined}\r\n */\r\n safeJSON(toParse: string, defaultInException?: any) : any {\r\n try {\r\n return JSON.parse(toParse);\r\n } catch (ex) {\r\n return defaultInException || ex;\r\n }\r\n }\r\n\r\n safeJSONandDecode(input: string): object{\r\n try {\r\n const json = decodeURIComponent(input);\r\n return JSON.parse(json);\r\n } catch(e) {\r\n }\r\n return {};\r\n }\r\n\r\n getJSONVal(json: object, key: string): any {\r\n\r\n let val;\r\n try {\r\n val = json[key];\r\n } catch (e) {\r\n }\r\n return (undefined !== val) ? val : '';\r\n }\r\n\r\n\r\n dasherize(str: string): string {\r\n return (str[0].toLowerCase() + str.slice(1)).trim().replace(/[_\\s]+/g, '-').replace(/([A-Z])/g, '-$1').replace(/-+/g, '-').toLowerCase();\r\n }\r\n\r\n\r\n /**\r\n * Parse string function.\r\n */\r\n parseStringFunction(strFunction: string) : {rawStringFunction: string, functionName: string, functionStringParams:string, functionArrayParams: Array} {\r\n const START = 0;\r\n\r\n let startFunctionParams = strFunction.indexOf('('),\r\n endFunctionParams = strFunction.indexOf(')');\r\n\r\n let strFunctionName = strFunction.substring(START, startFunctionParams),\r\n strFunctionParams = strFunction.substring(startFunctionParams + 1, endFunctionParams),\r\n arrayFunctionParams = strFunctionParams.replace(/\\s+/g, '').split(',');\r\n\r\n return {\r\n rawStringFunction: strFunction,\r\n functionName: strFunctionName,\r\n functionStringParams: strFunctionParams,\r\n functionArrayParams: arrayFunctionParams\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Returns the object without nullable or undefined parameters\r\n */\r\n cleanObject(obj: any, options: any) : any {\r\n options = Object.assign({removeUndefined: true, removeNull: false}, options);\r\n var cleanObject = {};\r\n Object.entries(obj).forEach(([key, value]) => {\r\n if ((undefined === value && true === options.removeUndefined) || (null === value && true === options.removeNull)) {\r\n return;\r\n } else {\r\n cleanObject[key] = value;\r\n }\r\n });\r\n return cleanObject;\r\n }\r\n\r\n\r\n /**\r\n * Generic convert to boolean\r\n */\r\n toBoolean(value) {\r\n if (this.isString(value) && (value === 'false' || value === 'true')) {\r\n return value === 'true';\r\n }\r\n return Boolean(value);\r\n }\r\n\r\n\r\n /**\r\n * Scroll with smooth animation\r\n * @param direction\r\n * @param scrollSize\r\n * @param container\r\n * @param duration\r\n * @param smooothLevel\r\n * @private\r\n */\r\n smoothScrolling(direction: string, scrollSize: number, duration: number, container: HTMLElement, smoothLevel: number = 20): Promise {\r\n return new Promise((res) => {\r\n let stepInterval = Math.ceil(duration / smoothLevel); // 1000 / 20 = 50\r\n let restSize = scrollSize;\r\n let scrollStepSize = Math.ceil(scrollSize / smoothLevel); // 100 / 50 = 2 (0.5 rest)\r\n\r\n let scrollStepFn = () => {\r\n scrollSize = restSize > scrollStepSize ? scrollStepSize : restSize;\r\n switch (direction) {\r\n case 'left':\r\n container.scrollLeft -= scrollSize;\r\n break;\r\n case 'right':\r\n container.scrollLeft += scrollSize;\r\n break;\r\n case 'up':\r\n container.scrollTop -= scrollSize;\r\n break;\r\n case 'down':\r\n container.scrollTop += scrollSize;\r\n break;\r\n }\r\n restSize -= scrollSize;\r\n if (0 < restSize) {\r\n DOM.setTimeout(scrollStepFn, stepInterval, null);\r\n } else {\r\n res();\r\n }\r\n };\r\n scrollStepFn();\r\n // DOM.setTimeout(scrollStepFn, stepInterval);\r\n });\r\n\r\n }\r\n\r\n toLowerCaseKeys(obj: object): object {\r\n return Object.keys(obj).reduce((accum, key) => {\r\n accum[key.toLowerCase()] = obj[key];\r\n return accum;\r\n }, {});\r\n }\r\n\r\n removeEmptyPropertiesfromObject(obj) {\r\n if(typeof(obj) !== 'object') {\r\n return obj;\r\n }\r\n\r\n Object.keys(obj).forEach((prop)=> {\r\n if(this.isNullOrUndefined(obj[prop])) {\r\n delete obj[prop];\r\n }\r\n });\r\n\r\n return obj;\r\n }\r\n\r\n /**\r\n * @description Remove the localhost\r\n */\r\n removeLocalhost(url){\r\n try {\r\n return url.replace(/^[a-z]{4,5}:\\/{2}[a-z]{1,}:[0-9]{1,4}.(.*)/, '$1');\r\n }catch (e) {\r\n return url;\r\n }\r\n }\r\n\r\n capitalizeFirstLetter(str: string): string {\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n }\r\n\r\n\r\n lowerFirstLetter(str: string): string {\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n }\r\n\r\n\r\n arraysAreEqual(arr1: any[], arr2: any[], areItemsEqual?: (item1: any, item2: any) => boolean): boolean {\r\n arr1 = arr1 || [];\r\n arr2 = arr2 || [];\r\n\r\n if(arr1.length !== arr2.length) {\r\n return false;\r\n }\r\n\r\n for(let i = 0; i < arr1.length; i++) {\r\n if(this.isNullOrUndefined(areItemsEqual)) {\r\n if(arr1[i] !== arr2[i]) {\r\n return false;\r\n }\r\n } else {\r\n if(!areItemsEqual(arr1[i], arr2[i])) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * should return the number as bytes notation.\r\n * for example:\r\n * formatNumberToBytesNotation(1000, 0) will return 1K\r\n * formatNumberToBytesNotation(3000000, 0) will return 3M\r\n * formatNumberToBytesNotation(1500, 1) will return 1.5K\r\n * @param num\r\n * @param digits\r\n */\r\n formatNumberToBytesNotation(num: number, digits: number) {\r\n const formatMap = [\r\n { value: 1, symbol: \"\" },\r\n { value: 1E3, symbol: \"K\" },\r\n { value: 1E6, symbol: \"M\" },\r\n { value: 1E9, symbol: \"G\" },\r\n { value: 1E12, symbol: \"T\" },\r\n { value: 1E15, symbol: \"P\" },\r\n { value: 1E18, symbol: \"E\" }\r\n ];\r\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\r\n let index;\r\n for (index = formatMap.length - 1; index > 0; index--) {\r\n if (num >= formatMap[index].value) {\r\n break;\r\n }\r\n }\r\n return (num / formatMap[index].value).toFixed(digits).replace(rx, \"$1\") + formatMap[index].symbol;\r\n }\r\n\r\n once(fn, context = this) {\r\n let result;\r\n return function() {\r\n if (fn) {\r\n result = fn.apply(context || this, arguments);\r\n fn = null;\r\n }\r\n return result;\r\n };\r\n }\r\n}\r\n\r\nexport default new Underscore();","export class DeviceFeatureDetection {\r\n /**\r\n * The device supports touch, does it have a touchscreen\r\n */\r\n public get isTouch() {\r\n return (\r\n ('ontouchstart' in window)\r\n || ((window as any).DocumentTouch && document instanceof (window as any).DocumentTouch)\r\n || (window.navigator.maxTouchPoints !== undefined && window.navigator.maxTouchPoints > 0)\r\n );\r\n }\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceOSDetection {\r\n private os: UAParser.IOS;\r\n constructor(private parser: UAParser) {\r\n this.os = this.parser.getOS();\r\n }\r\n\r\n /**\r\n * Returns the name of the operating system\r\n *\r\n * Possible 'os.name' - data taken from ua-parser-js\r\n * AIX, AmigaOS, Android, Arch, Bada, BeOS, BlackBerry, CentOS, ChromiumOS, Contiki,\r\n * Fedora, FirefoxOS, FreeBSD, Debian, DragonFly, Gentoo, GNU, Haiku, Hurd, iOS,\r\n * Joli, Linpus, Linux, MacOS, Mageia, Mandriva, MeeGo, Minix, Mint, MorphOS, NetBSD,\r\n * Nintendo, OpenBSD, OpenVMS, OS/2, Palm, PCLinuxOS, Plan9, Playstation, QNX, RedHat,\r\n * RIM Tablet OS, RISCOS, Sailfish, Series40, Slackware, Solaris, SUSE, Symbian, Tizen,\r\n * Ubuntu, UNIX, VectorLinux, WebOS, Windows[Phone/Mobile], Zenwalk\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mac OS\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.os.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the operating system\r\n */\r\n public get version() {\r\n return parseInt(this.os.version.split(\".\")[0]);\r\n }\r\n\r\n public get isIOS() {\r\n return this.name === 'ios';\r\n }\r\n\r\n public get isAndroid() {\r\n return this.name === 'android';\r\n }\r\n\r\n public get isPC() {\r\n return [\"centos\", \"fedora\", \"debian\", \"linux\", \"macos\", \"pclinuxos\", \"redhat\", \"ubuntu\", \"unix\", \"vectorlinux\", \"windows\"].indexOf(this.name) && !this.isMobileOS;\r\n }\r\n\r\n public get isMacOS() {\r\n return this.name === 'macos';\r\n }\r\n\r\n public get isMobileOS() {\r\n return (this.isIOS || this.isAndroid);\r\n }\r\n\r\n}\r\n","export class DeviceViewportDetection {\r\n\r\n /**\r\n * Get viewport width.\r\n */\r\n public get width() {\r\n return window.innerWidth;\r\n }\r\n\r\n\r\n /**\r\n * Get viewport height.\r\n */\r\n public get height() {\r\n return window.innerHeight;\r\n }\r\n\r\n /**\r\n * Get screen height.\r\n */\r\n public get screenHeight() {\r\n return window.screen.height;\r\n }\r\n\r\n /**\r\n * Get screen width.\r\n */\r\n public get screenWidth() {\r\n return window.screen.width;\r\n }\r\n\r\n /**\r\n * Get the pixel ratio for the current running device.\r\n */\r\n public get pixelRatio() {\r\n var ratio = 1;\r\n\r\n const screen = window.screen as any;\r\n\r\n // To account for zoom, change to use deviceXDPI instead of systemXDPI\r\n if (screen.systemXDPI !== undefined && screen.logicalXDPI !== undefined && screen.systemXDPI > screen.logicalXDPI) {\r\n // Only allow for values > 1\r\n ratio = screen.systemXDPI / screen.logicalXDPI;\r\n } else if (window.devicePixelRatio !== undefined) {\r\n ratio = window.devicePixelRatio;\r\n }\r\n return ratio;\r\n }\r\n\r\n public get isPortrait() {\r\n return window.matchMedia(\"(orientation: portrait)\").matches;\r\n }\r\n}","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceModelDetection {\r\n private device: UAParser.IDevice;\r\n constructor(private parser: UAParser) {\r\n this.device = this.parser.getDevice();\r\n }\r\n\r\n /**\r\n * Is it an iPhone?\r\n */\r\n public get isIphone() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPhone\";\r\n }\r\n\r\n public get isIpad() {\r\n return this.device.vendor === \"Apple\" && this.device.model === \"iPad\";\r\n }\r\n\r\n}\r\n","import UAParser from \"ua-parser-js\";\r\n\r\nexport class DeviceBrowserDetection {\r\n private browser: UAParser.IBrowser;\r\n constructor(private parser: UAParser) {\r\n this.browser = this.parser.getBrowser();\r\n }\r\n\r\n /**\r\n * Returns the name of the browser\r\n *\r\n * Possible values :\r\n * Amaya, Android Browser, Arora, Avant, Baidu, Blazer, Bolt, Camino, Chimera, Chrome,\r\n * Chromium, Comodo Dragon, Conkeror, Dillo, Dolphin, Doris, Edge, Epiphany, Fennec,\r\n * Firebird, Firefox, Flock, GoBrowser, iCab, ICE Browser, IceApe, IceCat, IceDragon,\r\n * Iceweasel, IE [Mobile], Iron, Jasmine, K-Meleon, Konqueror, Kindle, Links,\r\n * Lunascape, Lynx, Maemo, Maxthon, Midori, Minimo, MIUI Browser, [Mobile] Safari,\r\n * Mosaic, Mozilla, Netfront, Netscape, NetSurf, Nokia, OmniWeb, Opera [Mini/Mobi/Tablet],\r\n * Phoenix, Polaris, QQBrowser, RockMelt, Silk, Skyfire, SeaMonkey, SlimBrowser, Swiftfox,\r\n * Tizen, UCBrowser, Vivaldi, w3m, Yandex\r\n */\r\n public get name() {\r\n // ua-parser-js returns human readable names like \"Mobile Safari\". I want without spaces to be able to use them as keys in an object\r\n // example in the external_links_consts.js where macos and safari are used as keys.\r\n // also, we make it lowercase for comodity\r\n return this.browser.name.replace(/\\s/g, \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Returns the major version of the browser\r\n */\r\n public get version() {\r\n return parseInt(this.browser.version.split(\".\")[0]);\r\n }\r\n\r\n /**\r\n * Is it a Firefox?\r\n */\r\n public get isFirefox() {\r\n return this.browser.name === \"firefox\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Chrome?\r\n */\r\n public get isChrome() {\r\n return this.browser.name === \"chrome\";\r\n }\r\n\r\n\r\n /**\r\n * Is it a Safari?\r\n */\r\n public get isSafari() {\r\n // Can be \"Safari\" or \"Mobile Safari\"\r\n return this.browser.name.indexOf(\"safari\") !== -1;\r\n }\r\n\r\n /**\r\n * Is it a Opera?\r\n */\r\n public get isOpera() {\r\n // Can be \"Opera\", \"Opera Mobi\", \"Opera Mini\", \"Opera Tablet\"\r\n return this.browser.name.indexOf(\"opera\") !== -1;\r\n }\r\n\r\n\r\n /**\r\n * Is browser an Edge instance?\r\n */\r\n public get isEdge() {\r\n return this.browser.name === \"Edge\";\r\n }\r\n\r\n getAllowCameraAttributeValue(){\r\n if (['vivaldi', 'samsung', 'silk', 'edge-chromium', 'chrome', 'chromium-webview', 'opera'].indexOf(this.browser.name) !== -1) {\r\n return \"camera *\";\r\n }\r\n\r\n return \"camera\";\r\n }\r\n\r\n}\r\n","import Store from '../../store';\r\nimport Logger from '../../logger';\r\nimport { DeviceOSDetection } from \"./os\";\r\n\r\nconst NATIVE_TYPE = {\r\n CASINO_IOS: 'cbCallBackHandlerCGP',\r\n CASINO_ANDROID: 'WrapperInterfaceCGP',\r\n POKER_IOS: 'NativeInterface',\r\n POKER_ANDROID: 'NativeInterface',\r\n CIP8_ANDROID: 'pokerNativeInterface',//TODO - will be also used in CGP so that we have a unique source\r\n SPORT_IOS: 'callbackHandler',\r\n SPORT_IOS_EMBEDDED: 'sportHybridOnly',\r\n SPORT_ANDROID: 'WrapperInterface'\r\n};\r\n\r\nexport class DeviceHybridDetection {\r\n private logger: Logger;\r\n private _hybrid = false;\r\n private _inPoker = false;\r\n private _inSport = false;\r\n private _embedded = false;\r\n\r\n constructor(private os: DeviceOSDetection) {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n this.buildHybridInfo();\r\n }\r\n\r\n public get isHybrid() {\r\n return this._hybrid;\r\n }\r\n\r\n public get inPoker() {\r\n return this._inPoker;\r\n }\r\n\r\n public get inSport() {\r\n return this._inSport;\r\n }\r\n\r\n public get isEmbedded() {\r\n return this._embedded;\r\n }\r\n\r\n\r\n /**\r\n * FOR BUILDING HYBRID INFO I AM BEING EXTRA CAREFULL AND DOUBLECHECKING THE RESULTS FROM DIFFERENT DATA\r\n */\r\n private buildHybridInfo() {\r\n const casinoHybrid = this.build_isCasinoHybrid();\r\n const inPokerHybrid = this.build_isInPokerHybrid();\r\n const inSportHybrid = this.build_isInSportHybrid();\r\n\r\n const genericHybridEmbedded = window['cgp_isHybridEmbedded'] || false;\r\n const casinoHybridEmbedded = window['cgp_isHybridCasinoIos'] || false;\r\n const inPokerHybridEmbedded = window['cgp_isHybridPokerIos'] || false;\r\n const inSportHybridEmbedded = window['cgp_isHybridSportIos'] || false;\r\n\r\n if (\r\n casinoHybrid || inPokerHybrid || inSportHybrid ||\r\n genericHybridEmbedded || casinoHybridEmbedded || inPokerHybridEmbedded || inSportHybridEmbedded\r\n ) {\r\n this._hybrid = true;\r\n }\r\n\r\n if (genericHybridEmbedded || casinoHybridEmbedded || inPokerHybridEmbedded || inSportHybridEmbedded) {\r\n this._embedded = true;\r\n }\r\n\r\n if (casinoHybridEmbedded) {\r\n this._inPoker = false;\r\n this._inSport = false;\r\n }\r\n\r\n if (inPokerHybrid || inPokerHybridEmbedded) {\r\n this._inPoker = true;\r\n }\r\n\r\n if (inSportHybrid || inSportHybridEmbedded) {\r\n this._inSport = true;\r\n }\r\n\r\n this.dataSanityCheck(\r\n casinoHybrid, inPokerHybrid, inSportHybrid,\r\n genericHybridEmbedded, casinoHybridEmbedded, inPokerHybridEmbedded, inSportHybridEmbedded\r\n );\r\n }\r\n\r\n private build_isCasinoHybrid() {\r\n // checks for normal casino hybrid\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS();\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid();\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private build_isInPokerHybrid() {\r\n if (this.os.isIOS) {\r\n // On iOS, first check if poker put a known object in global namespace. If it's there, we know it's poker hybrid, we don't need anything else\r\n if ((window as any).NativeInterface && (this.isNativeIOS(NATIVE_TYPE.POKER_IOS))) {\r\n return true;\r\n }\r\n // ... otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n // we are in NJ, so now we have to check for the ClientVersion key in storage. If exists and starts with \"mp-\" or \"sp-\", then it is poker hybrid\r\n let storedClientVersion = Store.get('ClientVersion');\r\n if (storedClientVersion && (storedClientVersion.toLowerCase().startsWith('mp-') || storedClientVersion.toLowerCase().startsWith('sp-'))) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n\r\n }\r\n if (this.os.isAndroid) {\r\n // On Android, first check if poker put a known object in global namespace. If it's there, we know it's poker hybrid, we don't need anything else\r\n if ((window as any)[NATIVE_TYPE.POKER_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.POKER_ANDROID)) {\r\n return true;\r\n }\r\n // Same check for CIP8_ANDROID, because it is a different object name\r\n if ((window as any)[NATIVE_TYPE.CIP8_ANDROID] && this.isNativeAndroid(NATIVE_TYPE.CIP8_ANDROID)) {\r\n return true;\r\n }\r\n // ... otherwise, we have to make an additional check for New Jersey. 103 and 106 are the subbrands of poker in NJ (poker 7, the old one)\r\n if (['103', '106'].indexOf(Store.get('sourceSubBrand')) === -1) {\r\n // not NJ, so it's not poker hybrid\r\n return false;\r\n }\r\n let storedSourceProductPackage = Store.get('sourceProductPackage');\r\n if (storedSourceProductPackage && (storedSourceProductPackage.toString() === '52' || storedSourceProductPackage.toString() === '95')) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private build_isInSportHybrid(): boolean {\r\n if (this.os.isIOS) {\r\n return this.isNativeIOS(NATIVE_TYPE.SPORT_IOS_EMBEDDED);\r\n }\r\n\r\n if (this.os.isAndroid) {\r\n return this.isNativeAndroid(NATIVE_TYPE.SPORT_ANDROID);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Is it an IOS Hybrid?\r\n */\r\n private isNativeIOS(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_IOS;\r\n\r\n return ('object' === typeof ((window as any).webkit)\r\n && 'object' === typeof ((window as any).webkit.messageHandlers[className]));\r\n }\r\n\r\n /**\r\n * Is it an Android Hybrid?\r\n */\r\n private isNativeAndroid(name?: string): boolean {\r\n const className = undefined !== name ? name : NATIVE_TYPE.CASINO_ANDROID;\r\n return ('object' === typeof ((window as any)[className]));\r\n }\r\n\r\n private dataSanityCheck(\r\n casinoHybrid: boolean, inPokerHybrid: boolean, inSportHybrid: boolean,\r\n genericHybridEmbedded: boolean, casinoHybridEmbedded: boolean, inPokerHybridEmbedded: boolean, inSportHybridEmbedded: boolean\r\n ) {\r\n // Casino in Poker and casino in sport cannot be true at the same time\r\n if (inPokerHybrid === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 1. inPokerHybrid and inSportHybrid are both true\");\r\n }\r\n\r\n // From the trio: casinoHybridEmbedded, casinoInPokerHybridEmbedded, casinoInSportHybridEmbedded at most one can be true.\r\n // And this, only if genericHybridEmbedded is true\r\n if (genericHybridEmbedded === false && (casinoHybridEmbedded === true || inPokerHybridEmbedded === true || inSportHybridEmbedded === true)) {\r\n this.logger.error(\"Hybrid data sanity check. 2. if genericHybridEmbedded is false, none of any other embedded flags can be true\");\r\n }\r\n if (casinoHybridEmbedded === true && inPokerHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 3. casinoHybridEmbedded and inPokerHybridEmbedded are both true\");\r\n }\r\n if (casinoHybridEmbedded === true && inSportHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 4. casinoHybridEmbedded and inSportHybridEmbedded are both true\");\r\n }\r\n if (inPokerHybridEmbedded === true && inSportHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 5. inPokerHybridEmbedded and inSportHybridEmbedded are both true\");\r\n }\r\n\r\n // CASINO: If it's not hybrid it cannot be hybrid embedded\r\n if (casinoHybrid === false && genericHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 6. genericHybridEmbedded is true but casinoHybrid is false\");\r\n }\r\n // POKER: If it's not hybrid it cannot be hybrid embedded\r\n if (inPokerHybrid === false && inPokerHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 7. inPokerHybridEmbedded is true but inPokerHybrid is false\");\r\n }\r\n // SPORT: If it's not hybrid it cannot be hybrid embedded\r\n if (inSportHybrid === false && inSportHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 8. inSportHybridEmbedded is true but inSportHybrid is false\");\r\n }\r\n\r\n // In poker and in sport cannot be true at the same time (cross check hybrid and embedded)\r\n if (inPokerHybrid === true && inSportHybridEmbedded === true) {\r\n this.logger.error(\"Hybrid data sanity check. 9. inPokerHybrid and inSportHybridEmbedded are both true\");\r\n }\r\n if (inPokerHybridEmbedded === true && inSportHybrid === true) {\r\n this.logger.error(\"Hybrid data sanity check. 10. inPokerHybridEmbedded and inSportHybrid are both true\");\r\n }\r\n }\r\n}\r\n","import uuid from 'uuid/v4';\r\nimport { UAParser } from 'ua-parser-js';\r\nimport Logger from '../logger';\r\nimport { DeviceFeatureDetection } from './detection/feature';\r\nimport { DeviceOSDetection } from './detection/os';\r\nimport { DeviceViewportDetection } from './detection/viewport';\r\nimport { DeviceModelDetection } from './detection/model';\r\nimport { DeviceBrowserDetection } from './detection/browser';\r\nimport { DeviceHybridDetection } from './detection/hybrid';\r\n\r\nclass Device {\r\n public logger: Logger;\r\n private _uaParser: UAParser = new UAParser();\r\n public readonly feature = new DeviceFeatureDetection();\r\n public readonly os = new DeviceOSDetection(this._uaParser);\r\n public readonly viewport = new DeviceViewportDetection();\r\n public readonly model = new DeviceModelDetection(this._uaParser);\r\n public readonly browser = new DeviceBrowserDetection(this._uaParser);\r\n public readonly hybrid = new DeviceHybridDetection(this.os);\r\n\r\n /**\r\n * Initialize the device.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n this.logger = new Logger((this.constructor as any).CLASS);\r\n }\r\n\r\n /**\r\n * Getter for the user-agent for the client being handled in this request.\r\n *\r\n * @example 'Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53'\r\n */\r\n public get userAgent() {\r\n return this._uaParser.getUA();\r\n }\r\n\r\n public get networkData() {\r\n let connection = navigator[\"connection\"] || navigator[\"mozConnection\"] || navigator[\"webkitConnection\"];\r\n if(connection) {\r\n return (connection.effectiveType?connection.effectiveType:'') + '_'\r\n + (connection.rtt?connection.rtt:'') + '_'\r\n + (connection.downlink?connection.downlink:'');\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Generates a GUID\r\n */\r\n public generateGuid(): string {\r\n return uuid();\r\n }\r\n\r\n private matchMedia(media: string) {\r\n return window.matchMedia(media).matches;\r\n }\r\n\r\n /**\r\n * Used to detected if user clicked and loaded the app using home screen\r\n *\r\n * Returns true if the app is running in standalone mode (iOS only)\r\n */\r\n public get isStandalone() {\r\n return 'standalone' in window.navigator ? (window.navigator as any).standalone : false;\r\n }\r\n\r\n public get isProgressiveWebApp(): boolean {\r\n\t\t// PWA setting is \"display\": \"fullscreen\"\r\n\t\t// but installed on desktop it's detected as \"standalone\" if app is not in fullscreen mode or \"fullscreen\" if user enters fullscreen mode\r\n // iOS is identified through check the navigator to have attribute 'standalone'\r\n\r\n\t\treturn this.isStandalone ||\r\n this.matchMedia('(display-mode: fullscreen)') ||\r\n this.matchMedia('(display-mode: standalone)');\r\n\r\n }\r\n\r\n public get isSupportHTML5() {\r\n return 'function' === typeof document.createElement('canvas').getContext;\r\n }\r\n\r\n public get isMobileWebApp() {\r\n return (this.os.isMobileOS || this.isProbablyIOSDevice) && !this.hybrid.isHybrid;\r\n }\r\n\r\n /**\r\n * Check whether the browser has cookie enable 3rd party.\r\n */\r\n public get isCookieEnable() {\r\n return window.navigator.cookieEnabled;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iOS and iOS + \"Request Desktop Website\", iPhone INCLUDED\r\n */\r\n public get isProbablyIOSDevice() {\r\n if (this.os.isIOS) {\r\n return true;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that we are on Mac\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * From iOS 13, Safari decided to put the \"Request Desktop Website\" setting on true by default on iPad.\r\n * For users that disable this setting, Device.model.isIpad will be true, but for the majority it will be false because\r\n * Safari will send the desktop user agent.\r\n *\r\n * Also, iPhone users have that option also although not many people enable it.\r\n *\r\n * The only clue we have that it is most probably an iPad is to detect if the device has touchscreen because up until now\r\n * Apple does not produce MacBooks or Macs with touchscreens. So it's most probably an iOS (iPad or an iPhone)\r\n *\r\n * @Note IMPORTANT! Should be use only in rare cases (for example force GRS(GGP games) to return the mobile version on iPad)\r\n * @Note IMPORTANT! This method should return true for all iPad and iOS + \"Request Desktop Website\", iPhone NOT INCLUDED\r\n * HOWEVER, FOR IPHONE THAT HAVE \"Request Desktop Website\", this method will return true\r\n */\r\n public get isProbablyIPad() {\r\n // Pre iOS 13 detection\r\n if (this.model.isIpad) {\r\n return true;\r\n }\r\n if (this.model.isIphone) {\r\n return false;\r\n }\r\n if (!this.os.isMacOS) {\r\n return false;\r\n }\r\n // At this point we know that is a Safari browser on Mac (in the past, Safari was available for Windows too)\r\n // Let's see if it has touchscreen\r\n return this.feature.isTouch;\r\n }\r\n\r\n /**\r\n * Check the device is in a portrait mode.\r\n *\r\n * @deprecated use \"Device.viewport.isPortrait\"\r\n */\r\n public get isPortrait(): boolean {\r\n if (this.isMobile() && this.os.isAndroid) {\r\n // fix for Samsung S8 series (S8-S9...).\r\n // In full screen mode window.screen.width and window.screen.height after single rotation get wrong values (width equal to height)\r\n // So we should test it by innerWidth and innerHeight like in iOS\r\n if (this.viewport.screenWidth === this.viewport.screenHeight) {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n return this.viewport.screenWidth < this.viewport.screenHeight;\r\n } else {\r\n return this.viewport.width < this.viewport.height;\r\n }\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n *\r\n * Getting the current running iPhone device version, hardware version.\r\n * Able to detect iPhone 4 and 5 and iphone x (10)\r\n * Returns NULL if device is not an iPhone. Will return a Number of the hardware version.\r\n * @deprecated\r\n */\r\n public getIphoneVersion() {\r\n\r\n if (this.os.isIOS && 11 <= this.os.version &&\r\n (\r\n //iphone 12 pro max\r\n (926 === window.screen.height && 428 === window.screen.width) || (926 === window.screen.width && 428 === window.screen.height)\r\n ||\r\n //iphone 12 pro\r\n (844 === window.screen.height && 390 === window.screen.width) || (844 === window.screen.width && 390 === window.screen.height)\r\n ||\r\n // iPhone X / Xs\r\n (812 === window.screen.height && 375 === window.screen.width) || (812 === window.screen.width && 375 === window.screen.height)\r\n ||\r\n // iPhone Xr / Xs Max\r\n (896 === window.screen.height && 414 === window.screen.width) || (896 === window.screen.width && 414 === window.screen.height)\r\n )\r\n ) {\r\n return 10;\r\n }\r\n\r\n if (this.os.isIOS && 8 <= this.os.version && 375 === window.screen.width) {\r\n return 6;\r\n }\r\n\r\n if (this.os.isIOS && 6 <= this.os.version && 320 === window.screen.width) {\r\n return 5;\r\n }\r\n\r\n // iphone 4/s (Retina)\r\n if (this.os.isIOS && 5 <= this.os.version && 640 === window.screen.width) {\r\n return 4;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**\r\n * TODO: Replace with NOTCH DETECTION. We don't care about the iPhone version, we care to know for iPhone X if it has a notch.\r\n * Is IphoneX\r\n * Returns true if the device is IphoneX\r\n * @deprecated\r\n */\r\n public isIphoneX(): boolean {\r\n return 10 === this.getIphoneVersion();\r\n }\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobileNotTablet(): boolean {\r\n return this.viewport.width < 1280 && !this.isTablet();\r\n }\r\n\r\n\r\n /**\r\n * TODO: Check usages and delete/refactor\r\n * Returns true only for ipads smaller than 1280\r\n * @deprecated\r\n */\r\n public isTablet(): boolean {\r\n return this.model.isIpad && this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Those are not the droids you are looking for\r\n * Use media queries, feature detection, client hints, os detection.\r\n * Think of what you want to achieve with your code and put a condition for that, not a general isMobile condition\r\n *\r\n * TODO: Check usages and delete/refactor\r\n * @deprecated\r\n */\r\n public isMobile(): boolean {\r\n return this.viewport.width < 1280;\r\n }\r\n\r\n /**\r\n * Get benchmark.\r\n */\r\n public getBenchMark() {\r\n var b = { m: 0 }, bd = [], bmt = + new Date() + 50;\r\n do {\r\n var t, count = 0, tt = + new Date();\r\n do { t = + new Date(); } while (t === tt);\r\n do { count++; tt = +new Date(); } while (t === tt);\r\n if ((tt - t) === 1) { bd[bd.length] = count; }\r\n } while ((bd.length < 20) && (t < bmt));\r\n\r\n if (bd.length === 0) b.m = 0; else b.m = Math.max.apply(Math, bd);\r\n\r\n return b.m;\r\n }\r\n\r\n}\r\n\r\nexport default new Device();\r\n","import _ from './underscore';\r\nimport Logger from './logger';\r\nimport {namedSetInterval, namedSetTimeout} from '../../../common/utils/time-functions';\r\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\r\n\r\nexport interface TimeoutSubscription {\r\n clear(): void;\r\n}\r\n\r\n\r\n\r\nexport interface ElementDimensions {\r\n\r\n width: number,\r\n height: number,\r\n horizontMargin: number,\r\n verticalMargin: number,\r\n horizontPadding: number,\r\n verticalPadding: number,\r\n horizontBorder: number,\r\n verticalBorder: number,\r\n fullWidth: number,\r\n fullHeight: number,\r\n marginRight: number,\r\n marginLeft: number,\r\n marginTop: number,\r\n marginBottom: number\r\n}\r\n\r\nexport interface ElementSize {\r\n width: number,\r\n height: number\r\n}\r\n\r\nexport interface DomEventSubscription {\r\n remove: () => void\r\n}\r\n\r\n\r\n\r\nclass DOM {\r\n\r\n static CLASS = 'DOM';\r\n\r\n constructor() {\r\n this._createLogger();\r\n }\r\n\r\n logger: Logger;\r\n _createLogger() {\r\n this.logger = new Logger(DOM.CLASS);\r\n }\r\n\r\n\r\n getBody() : HTMLElement {\r\n return document.body;\r\n }\r\n\r\n\r\n getHTML(): HTMLElement {\r\n return document.documentElement;\r\n }\r\n\r\n\r\n /**\r\n * Draw element into the DOM.\r\n */\r\n draw(element: Element) : DOM {\r\n\r\n this.append(this.getBody(), element);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Selector jQuery like for getting the object from the dom.\r\n * $$ is double the fun, $ is cool, $$ is cooler.\r\n */\r\n $$(query: any): any {\r\n let el = null;\r\n\r\n // first off if it's not a string assume it's already an element\r\n if (!_.isString(query)) {\r\n el = query;\r\n } else if ( this.isTag(query) ) {\r\n // check if it's a tag\r\n let tag = query.substring(1, query.length - 1);\r\n el = document.createElement( tag );\r\n } else if ( this.isId(query) ) {\r\n // check if it's an id\r\n let id = query.substr(1);\r\n el = document.getElementById( id );\r\n } else {\r\n // run a basic query\r\n el = document.querySelectorAll(query);\r\n }\r\n\r\n if (_.isNodeList(el)) {\r\n el = [].slice.call(el);\r\n }\r\n\r\n return el;\r\n }\r\n\r\n querySelector(selector: string): Element {\r\n return document.querySelector(selector);\r\n }\r\n\r\n\r\n injectStyleToDOM(content: string): HTMLStyleElement {\r\n let newStyle = document.createElement('style');\r\n newStyle.innerHTML = content;\r\n return document.body.appendChild(newStyle);\r\n }\r\n\r\n createElement(type: string = 'div', html: string = '', classList = []): HTMLElement {\r\n let domElement = document.createElement(type);\r\n if(html) {\r\n domElement.innerHTML = html;\r\n }\r\n\r\n if(classList.length > 0){\r\n classList.forEach(_class => this.addClass(domElement, _class));\r\n }\r\n\r\n return domElement;\r\n }\r\n\r\n append(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n target.appendChild(el);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n removeElement(target: Element, el: Element) : DOM {\r\n if (!target || !_.isElement(target)) {\r\n return this;\r\n }\r\n\r\n if (!el || !_.isElement(el)) {\r\n return this;\r\n }\r\n el.parentNode.removeChild(el);\r\n\r\n return this;\r\n }\r\n\r\n appendFirst(target: Element, el: Element): void {\r\n\r\n if (!_.isElement(target)) {\r\n throw new Error('target argument must be an Element');\r\n }\r\n\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an Element');\r\n }\r\n\r\n target.insertBefore(el, target.firstChild);\r\n }\r\n\r\n addClass(el: Element, className: any) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className || 0 === className.length) {\r\n return this;\r\n }\r\n\r\n let name = _.isArray(className) ? className[0] : className;\r\n\r\n if (el.classList) {\r\n el.classList.add(name);\r\n } else {\r\n el.className += ' ' + name;\r\n }\r\n\r\n return _.isArray(className) ? this.addClass(el, className.slice(1)) : this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * toggle class to element\r\n */\r\n toggleClass(el: Element, className: string) : DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n\r\n if (!className) {\r\n return this;\r\n }\r\n\r\n el.classList.toggle(className);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * if element already has the class\r\n */\r\n hasClass(el: Element, className: string) : boolean {\r\n if (!_.isElement(el)) {\r\n throw new Error(`el argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n if (!className) {\r\n throw new Error(`className argument is required! el = ${el}; className = ${className}`);\r\n }\r\n\r\n return el.classList.contains(className);\r\n }\r\n\r\n\r\n /**\r\n * Add attribute to the element.\r\n */\r\n addAttribute(el: Element, attribute: string = '', value: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.setAttribute(attribute, value);\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Add Style to the element.\r\n */\r\n addStyle(el: HTMLElement, key: string, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style[key] = value;\r\n\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove Style from the element.\r\n */\r\n removeStyle(el: HTMLElement, key: string): DOM {\r\n if (!_.isElement(el)) {\r\n return this;\r\n }\r\n el.style.removeProperty(key);\r\n\r\n return this;\r\n }\r\n\r\n\r\n\r\n /**\r\n * Get current element dimensions\r\n */\r\n getDimensions(el: HTMLElement): ElementDimensions {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n\r\n let style = this.getCurrentStyle(el);\r\n let horizontMargin = parseFloat(style.marginLeft) + parseFloat(style.marginRight);\r\n let verticalMargin = parseFloat(style.marginBottom) + parseFloat(style.marginTop);\r\n\r\n return {\r\n width: el.offsetWidth,\r\n height: el.offsetHeight,\r\n horizontMargin: horizontMargin,\r\n verticalMargin: verticalMargin,\r\n horizontPadding: parseFloat(style.paddingLeft) + parseFloat(style.paddingRight),\r\n verticalPadding: parseFloat(style.paddingBottom) + parseFloat(style.paddingTop),\r\n horizontBorder: parseFloat(style.borderLeftWidth) + parseFloat(style.borderRightWidth),\r\n verticalBorder: parseFloat(style.borderBottomWidth) + parseFloat(style.borderTopWidth),\r\n fullWidth: el.offsetWidth + horizontMargin,\r\n fullHeight: el.offsetHeight + verticalMargin,\r\n marginRight: parseFloat(style.marginRight),\r\n marginLeft: parseFloat(style.marginLeft),\r\n marginTop: parseFloat(style.marginTop),\r\n marginBottom: parseFloat(style.marginBottom)\r\n };\r\n }\r\n\r\n setElementSize(element: HTMLElement, size: ElementSize, unit: string = 'px') : void {\r\n element.style.width = size.width + unit;\r\n element.style.height = size.height + unit;\r\n }\r\n\r\n getCurrentStyle(el: HTMLElement) : CSSStyleDeclaration {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an HTMLElement');\r\n }\r\n return window.getComputedStyle(el) || el['currentStyle'];\r\n }\r\n\r\n\r\n /**\r\n * Hide element from dom.\r\n */\r\n hide(el: Element): DOM {\r\n this.removeClass(el, 'show');\r\n this.addClass(el, 'hide');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Get element to be invisible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n invisible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-visible');\r\n this.addClass(el, 'cgp-invisible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Show element on dom\r\n * @param el\r\n */\r\n show(el: Element): DOM {\r\n this.removeClass(el, 'hide');\r\n this.addClass(el, 'show');\r\n return this;\r\n }\r\n\r\n /**\r\n * Get element to be visible\r\n * @param el\r\n * @returns {DOM}\r\n */\r\n visible(el: HTMLElement): DOM {\r\n this.removeClass(el, 'cgp-invisible');\r\n this.addClass(el, 'cgp-visible');\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Remove class from element.\r\n * @param el\r\n * @param className\r\n */\r\n removeClass(el: Element, className: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.classList.remove(className);\r\n return this;\r\n }\r\n\r\n\r\n removeAttribute(el: Element, attr: string = ''): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be an element');\r\n }\r\n\r\n el.removeAttribute(attr);\r\n return this;\r\n }\r\n\r\n isInputElement(tagName: string = ''): boolean {\r\n return 'INPUT' === tagName;\r\n }\r\n\r\n\r\n /**\r\n * Sets the innerHTML for the provided element\r\n */\r\n html(html: string, el: Element): DOM {\r\n if (_.isNullOrUndefined(html)) {\r\n this.logger.error('Html is not valid parameter');\r\n return this;\r\n }\r\n el.innerHTML = html;\r\n return this;\r\n }\r\n\r\n\r\n /**\r\n * Clear elements from his node childs nor content.\r\n */\r\n clear(target: Element): DOM {\r\n while (target.firstChild) {\r\n target.removeChild(target.firstChild);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n\r\n camelCase(str: string): string {\r\n return str.replace(/-([a-z])/g, (g) => {\r\n return g[1].toUpperCase();\r\n });\r\n }\r\n\r\n\r\n isTag(str: string): boolean {\r\n return 0 === str.search(/^<\\w+>$/);\r\n }\r\n\r\n isId(str: string ) {\r\n return 0 === str.search(/^#\\w+$/);\r\n }\r\n\r\n parseDataAttributes(el: Element): object {\r\n let data = {};\r\n\r\n [].forEach.call(el.attributes, (attr) => {\r\n if (/^data-/.test(attr.name)) {\r\n let camelCaseName = attr.name.substr(5).replace(/-(.)/g, ($0, $1) => {\r\n return $1.toUpperCase();\r\n });\r\n data[camelCaseName] = attr.value;\r\n }\r\n });\r\n\r\n return data;\r\n }\r\n\r\n text(el: Element, value: string): DOM {\r\n if (!_.isElement(el)) {\r\n throw new Error('el argument must be a HTMLElement');\r\n }\r\n el.textContent = value;\r\n return this;\r\n }\r\n\r\n /**\r\n * wrapper for add event listeners on DOM, returns a self removing method.\r\n */\r\n addEventListener(el: Element | Document, type: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n el.addEventListener(type, callback, useCapture);\r\n\r\n return {\r\n remove: function(msgElement: Element | Document, msgType: string, msgCallback: EventListenerOrEventListenerObject) {\r\n return () => {\r\n return msgElement.removeEventListener(msgType, msgCallback);\r\n };\r\n }(el, type, callback)\r\n };\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n *\r\n *\r\n * @description - Generic event handler, all the component should subscribe to one event function,\r\n * They should pass the element it self define specific id inside the element,\r\n * Event type, And the event callback.\r\n *\r\n * @usage:\r\n * onDOMEvent(DOMElement, '#testid', 'click', ()=> {alert('onClick happend'});\r\n * onDOMEvent(DOMElement, 'click', ()=> {alert('onClick happend'});\r\n */\r\n onDOMElementEvent(element: Element, eventName: string, callback: EventListenerOrEventListenerObject, useCapture: boolean = false) : DomEventSubscription {\r\n\r\n if (!_.isElement(element)) {\r\n throw new Error('element argument must be of type HTMLElement');\r\n }\r\n\r\n if(!_.isString(eventName)) {\r\n throw new Error('eventName argument must be of type String');\r\n }\r\n\r\n if(!_.isFunction(callback)) {\r\n throw new Error('callback argument must be of type Function');\r\n }\r\n\r\n element.addEventListener(eventName, callback, useCapture);\r\n\r\n return {\r\n remove: () => element.removeEventListener(eventName, callback)\r\n };\r\n }\r\n\r\n\r\n setInterval(callback: () => void, timeout: number, name?: TimeIntervalName) : number {\r\n return namedSetInterval(name, callback, timeout);\r\n }\r\n\r\n\r\n clearInterval(handle: number): void {\r\n clearInterval(handle);\r\n }\r\n\r\n\r\n setTimeout(callback: () => void, timeout: number, name?: TimeIntervalName): number {\r\n return namedSetTimeout(name, callback, timeout);\r\n }\r\n\r\n clearTimeout(handle: number): void {\r\n clearTimeout(handle);\r\n }\r\n}\r\n\r\nexport default new DOM();\r\n","import CGPLogger from './logger';\r\nimport Strings from './strings';\r\nimport _ from './underscore';\r\n\r\ninterface IStorage {\r\n set(key: string, value: any) : boolean;\r\n\r\n del(key: string): boolean;\r\n\r\n get(key: string, defaultValue: any): any | null;\r\n\r\n clear(): void;\r\n};\r\n\r\nconst logger = new CGPLogger('Store');\r\n\r\nclass CGPStorage {\r\n /**\r\n * @property\r\n * @type {null|LocalStorage|WindowStorage}\r\n */\r\n _selectedStorage: IStorage = null;\r\n\r\n\r\n /**\r\n * CGP storage business logic place.\r\n */\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initialize the storage and initialize the currect instance of storage\r\n * Or from the window['localStorage'] or our window cgp storage ;).\r\n *\r\n * @returns {LocalStorage}\r\n */\r\n init() : void {\r\n if (this.isLocalStorageNameSupported()) {\r\n logger.debug('Selected to be main priority cgp storage from localstorage.');\r\n this._selectedStorage = new LocalStorage();\r\n } else {\r\n logger.debug('Selected to be main priority cgp storage from window unique localstorage.');\r\n this._selectedStorage = new WindowStorage();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Create cookie that shared/not between sub domains\r\n * @param name\r\n * @param value\r\n */\r\n setCookie(name: string, value: string) : void {\r\n let now = new Date();\r\n now.setFullYear(now.getFullYear() + 1);\r\n document.cookie = name + '=' + value + ';expires=' + now.toUTCString() + ';path=/';\r\n }\r\n\r\n /**\r\n * Get cookie by key\r\n * @param name\r\n * @returns {string}\r\n */\r\n getCookie(name: string): string {\r\n let match = document.cookie.match(new RegExp(name + '=([^;]+)'));\r\n if (match) {\r\n return match[1];\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * Remove cookie by key\r\n * @param name\r\n */\r\n removeCookie(name: string) : void {\r\n document.cookie = name + \"=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/\";\r\n }\r\n\r\n /**\r\n * Check wheter local storage supported.\r\n *\r\n * @returns {boolean}\r\n */\r\n isLocalStorageNameSupported(): boolean {\r\n let testKey = 'test';\r\n\r\n try\r\n {\r\n const storage: Storage = window.localStorage;\r\n storage.setItem(testKey, '1');\r\n storage.removeItem(testKey);\r\n return 'localStorage' in window && null !== window.localStorage;\r\n }\r\n catch (error)\r\n {\r\n logger.error('Local storage is not supported the user might running under incognito mode on safari yak!');\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n return this._selectedStorage.set(key, value);\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: any): boolean {\r\n if(typeof key === 'string') {\r\n return this.delKey(key);\r\n } else {\r\n return this.delArray(key);\r\n }\r\n }\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n delKey(key: string): boolean {\r\n return this._selectedStorage.del(key);\r\n }\r\n\r\n /**\r\n * remove array of keys from storage, also check if exists.\r\n * @param keys\r\n * @returns {boolean} stating the delete was successfully or not\r\n */\r\n delArray(keys: string[]): boolean {\r\n let result = true;\r\n keys.forEach(function (key) {\r\n result = result && this._selectedStorage.del(key);\r\n }, this);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n return this._selectedStorage.get(key, defaultValue);\r\n }\r\n\r\n clearLocalStorage() {\r\n this._selectedStorage.clear();\r\n }\r\n}\r\n\r\n/**\r\n *\r\n */\r\nclass LocalStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _perfix = 'cgp_';\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n localStorage.setItem(this.getKeyConvention(key), value);\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.localStorageExists() || null === this.get(key)) {\r\n return false;\r\n }\r\n\r\n localStorage.removeItem(this.getKeyConvention(key));\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.localStorageExists()) {\r\n return false;\r\n }\r\n\r\n key = this.getKeyConvention(key);\r\n\r\n return null === localStorage.getItem(key) && 'undefined' !== typeof defaultValue ? defaultValue : localStorage.getItem(key);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll() : any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.localStorageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(localStorage)\r\n .filter(key => this.isKeyConvention(key))\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Verify localStore is defined and can be used in here :)\r\n *\r\n *\r\n * @returns {boolean} makes sure that localStorage exists and we are allowed to use it.\r\n * @public\r\n */\r\n localStorageExists() {\r\n try {\r\n return 'localStorage' in window && null !== window.localStorage;\r\n } catch (error) {\r\n logger.error(['localStorage not found, features related to store will be disabled for this session.']);\r\n return false;\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clearLocalStorage() {\r\n * // if the localStorage is defined in the global window.\r\n * return true;\r\n * };\r\n *\r\n * @public\r\n */\r\n clear() : void {\r\n if (!this.localStorageExists()) {\r\n return;\r\n }\r\n\r\n localStorage.clear();\r\n }\r\n\r\n\r\n /**\r\n * This function will check key start with cgp prefix.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * isKeyConvention('test') {\r\n * return false;\r\n * };\r\n *\r\n * getKeyConvention('cgp_test') {\r\n * return true;\r\n * };\r\n *\r\n *\r\n * @param {string} key - that needs to be verified for convention.\r\n * @returns {boolean} if they key is valid.\r\n * @public\r\n */\r\n isKeyConvention(key: string) {\r\n let stringUtil = new Strings(key);\r\n if (stringUtil.startsWith(this._perfix)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n\r\n /**\r\n * Get string convention for localStorage key.\r\n * Extend the input key with the static prefix we define.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * getKeyConvention('test') {\r\n * return cgp_test\r\n * };\r\n *\r\n * @param {string} key - that needs to be converted to our convention.\r\n * @returns {string} of the key to be stored. With naming convention set.\r\n * @public\r\n */\r\n getKeyConvention(key: string) {\r\n if (!key) {\r\n return '';\r\n }\r\n\r\n // remove unwanted white spaces.\r\n let keyConvention = key.trim();\r\n let stringUtil = new Strings(keyConvention);\r\n if (!stringUtil.startsWith(this._perfix)) {\r\n return this._perfix + keyConvention;\r\n }\r\n\r\n return keyConvention;\r\n }\r\n}\r\n\r\nclass WindowStorage implements IStorage {\r\n /**\r\n * @property\r\n * @type {string}\r\n * @private\r\n */\r\n private readonly _storgeKeyName = 'cgpStorage';\r\n\r\n\r\n /**\r\n * @property\r\n * @type {null|object}\r\n * @private\r\n */\r\n private _cgpStorage: {[key: string]: any} = null;\r\n\r\n\r\n /**\r\n * Creates the store object and ensures it remains a Singleton.\r\n *\r\n * @constructor\r\n */\r\n constructor() {\r\n if (_.getQueryParameters()['clearstorage']) {\r\n this.clear();\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n\r\n /**\r\n * Initializing the CGP window local storage.\r\n */\r\n init() {\r\n // Define CGP storage on the global window.\r\n this._cgpStorage = (window as any)[this._storgeKeyName] = {};\r\n\r\n logger.debug('Defined a new window cgp local storage.');\r\n logger.debug('Finish initializing window storage.');\r\n }\r\n\r\n\r\n /**\r\n * Stores a value to the assigned key.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be stored.\r\n * @param {*} value - could be anything, Array/String/Object.\r\n *\r\n * @returns {boolean} stating the save was successfully or not.\r\n * @public\r\n */\r\n set(key: string, value: any): boolean {\r\n if (!this.storageExists()) {\r\n return false;\r\n }\r\n\r\n try {\r\n this._cgpStorage[key] = value;\r\n } catch (error) {\r\n throw new Error(error);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Removes a key from the storage, also checks if exists.\r\n *\r\n *\r\n * @param {string} key - the name of the key to be deleted.\r\n * @returns {boolean} stating the delete was successfully or not.\r\n * @public\r\n */\r\n del(key: string): boolean {\r\n if (!this.storageExists() || _.isUndefined(this.get(key))) {\r\n return false;\r\n }\r\n\r\n delete this._cgpStorage[key];\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Get a specific key from the store. If is not set, optionally can set a default value\r\n *\r\n *\r\n * @param {string} key - the name of the key to be returned.\r\n * @param {*} defaultValue - if key is empty, will return the default\r\n *\r\n * @returns {*} the data is mixed, what-ever is stored in the cache will be returned.\r\n * @public\r\n */\r\n get(key: string, defaultValue?: any): any | null {\r\n if (!this.storageExists()) {\r\n return defaultValue;\r\n }\r\n\r\n const defaultGetter = _.isUndefined(defaultValue) ? undefined : defaultValue;\r\n return this._cgpStorage[key] || defaultGetter;\r\n }\r\n\r\n\r\n /**\r\n * Check if window cgp stroage is exist.\r\n *\r\n * @returns {boolean}\r\n */\r\n storageExists(): boolean {\r\n return !_.isNull(this._cgpStorage);\r\n }\r\n\r\n\r\n /**\r\n * Get all keys for the whole key convention\r\n *\r\n *\r\n *\r\n * @usage:\r\n * // Defined already in localstorage\r\n * localStorageKeys = [cgp_test1,test2,cgp_test3,test4]\r\n *\r\n * getAll() {\r\n * return [cgp_test1, cgp_test3];\r\n * };\r\n *\r\n * @returns {*} Gets all the data stored in the cache.\r\n * @public\r\n */\r\n getAll(): any[] {\r\n let keys: any[] = [];\r\n\r\n if (!this.storageExists()) {\r\n return keys;\r\n }\r\n\r\n Object\r\n .keys(this._cgpStorage)\r\n .forEach((key) => {\r\n keys.push(key);\r\n });\r\n\r\n return keys;\r\n }\r\n\r\n\r\n /**\r\n * Clear all the data from the localStorage, return true when the local is clear\r\n * and false when the localStorage not found in the global scope.\r\n *\r\n *\r\n *\r\n * @usage:\r\n * clear() {\r\n * };\r\n *\r\n * @returns {boolean} stating the clear was successfully or not.\r\n * @public\r\n */\r\n clear() : void {\r\n (window as any)[this._storgeKeyName] = {};\r\n }\r\n}\r\n\r\n\r\nexport default new CGPStorage();\r\n","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.2\n Copyright © 2012-2021 Faisal Salman \n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.2',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 255;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant |iemobile|slim)(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/ ]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /\\bqbcore\\/([\\w\\.]+)/i // WeChat Desktop for Windows Built-in Browser\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 '+BROWSER]], [\n /(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(metasr)[\\/ ]?([\\w\\.]+)/i, // SouGouBrowser\n /(lbbrowser)/i // LieBao Browser\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w\\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, VERSION]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\w ]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}-[atu]?[ln][01259x][012359][an]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+)(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[12]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ ([c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)( bui|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i // Sharp\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w ]*; *(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows) nt 6\\.2; (arm)/i, // Windows RT\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i, // Windows Phone\n /(windows)[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /(win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+ ([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser.major = majorize(_browser.version);\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","/*!\r\n * js-logger - http://github.com/jonnyreeves/js-logger\r\n * Jonny Reeves, http://jonnyreeves.co.uk/\r\n * js-logger may be freely distributed under the MIT license.\r\n */\r\n(function (global) {\r\n\t\"use strict\";\r\n\r\n\t// Top level module for the global, static logger instance.\r\n\tvar Logger = { };\r\n\r\n\t// For those that are at home that are keeping score.\r\n\tLogger.VERSION = \"1.6.0\";\r\n\r\n\t// Function which handles all incoming log messages.\r\n\tvar logHandler;\r\n\r\n\t// Map of ContextualLogger instances by name; used by Logger.get() to return the same named instance.\r\n\tvar contextualLoggersByNameMap = {};\r\n\r\n\t// Polyfill for ES5's Function.bind.\r\n\tvar bind = function(scope, func) {\r\n\t\treturn function() {\r\n\t\t\treturn func.apply(scope, arguments);\r\n\t\t};\r\n\t};\r\n\r\n\t// Super exciting object merger-matron 9000 adding another 100 bytes to your download.\r\n\tvar merge = function () {\r\n\t\tvar args = arguments, target = args[0], key, i;\r\n\t\tfor (i = 1; i < args.length; i++) {\r\n\t\t\tfor (key in args[i]) {\r\n\t\t\t\tif (!(key in target) && args[i].hasOwnProperty(key)) {\r\n\t\t\t\t\ttarget[key] = args[i][key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn target;\r\n\t};\r\n\r\n\t// Helper to define a logging level object; helps with optimisation.\r\n\tvar defineLogLevel = function(value, name) {\r\n\t\treturn { value: value, name: name };\r\n\t};\r\n\r\n\t// Predefined logging levels.\r\n\tLogger.TRACE = defineLogLevel(1, 'TRACE');\r\n\tLogger.DEBUG = defineLogLevel(2, 'DEBUG');\r\n\tLogger.INFO = defineLogLevel(3, 'INFO');\r\n\tLogger.TIME = defineLogLevel(4, 'TIME');\r\n\tLogger.WARN = defineLogLevel(5, 'WARN');\r\n\tLogger.ERROR = defineLogLevel(8, 'ERROR');\r\n\tLogger.OFF = defineLogLevel(99, 'OFF');\r\n\r\n\t// Inner class which performs the bulk of the work; ContextualLogger instances can be configured independently\r\n\t// of each other.\r\n\tvar ContextualLogger = function(defaultContext) {\r\n\t\tthis.context = defaultContext;\r\n\t\tthis.setLevel(defaultContext.filterLevel);\r\n\t\tthis.log = this.info; // Convenience alias.\r\n\t};\r\n\r\n\tContextualLogger.prototype = {\r\n\t\t// Changes the current logging level for the logging instance.\r\n\t\tsetLevel: function (newLevel) {\r\n\t\t\t// Ensure the supplied Level object looks valid.\r\n\t\t\tif (newLevel && \"value\" in newLevel) {\r\n\t\t\t\tthis.context.filterLevel = newLevel;\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t// Gets the current logging level for the logging instance\r\n\t\tgetLevel: function () {\r\n\t\t\treturn this.context.filterLevel;\r\n\t\t},\r\n\r\n\t\t// Is the logger configured to output messages at the supplied level?\r\n\t\tenabledFor: function (lvl) {\r\n\t\t\tvar filterLevel = this.context.filterLevel;\r\n\t\t\treturn lvl.value >= filterLevel.value;\r\n\t\t},\r\n\r\n\t\ttrace: function () {\r\n\t\t\tthis.invoke(Logger.TRACE, arguments);\r\n\t\t},\r\n\r\n\t\tdebug: function () {\r\n\t\t\tthis.invoke(Logger.DEBUG, arguments);\r\n\t\t},\r\n\r\n\t\tinfo: function () {\r\n\t\t\tthis.invoke(Logger.INFO, arguments);\r\n\t\t},\r\n\r\n\t\twarn: function () {\r\n\t\t\tthis.invoke(Logger.WARN, arguments);\r\n\t\t},\r\n\r\n\t\terror: function () {\r\n\t\t\tthis.invoke(Logger.ERROR, arguments);\r\n\t\t},\r\n\r\n\t\ttime: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'start' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttimeEnd: function (label) {\r\n\t\t\tif (typeof label === 'string' && label.length > 0) {\r\n\t\t\t\tthis.invoke(Logger.TIME, [ label, 'end' ]);\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\t// Invokes the logger callback if it's not being filtered.\r\n\t\tinvoke: function (level, msgArgs) {\r\n\t\t\tif (logHandler && this.enabledFor(level)) {\r\n\t\t\t\tlogHandler(msgArgs, merge({ level: level }, this.context));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Protected instance which all calls to the to level `Logger` module will be routed through.\r\n\tvar globalLogger = new ContextualLogger({ filterLevel: Logger.OFF });\r\n\r\n\t// Configure the global Logger instance.\r\n\t(function() {\r\n\t\t// Shortcut for optimisers.\r\n\t\tvar L = Logger;\r\n\r\n\t\tL.enabledFor = bind(globalLogger, globalLogger.enabledFor);\r\n\t\tL.trace = bind(globalLogger, globalLogger.trace);\r\n\t\tL.debug = bind(globalLogger, globalLogger.debug);\r\n\t\tL.time = bind(globalLogger, globalLogger.time);\r\n\t\tL.timeEnd = bind(globalLogger, globalLogger.timeEnd);\r\n\t\tL.info = bind(globalLogger, globalLogger.info);\r\n\t\tL.warn = bind(globalLogger, globalLogger.warn);\r\n\t\tL.error = bind(globalLogger, globalLogger.error);\r\n\r\n\t\t// Don't forget the convenience alias!\r\n\t\tL.log = L.info;\r\n\t}());\r\n\r\n\t// Set the global logging handler. The supplied function should expect two arguments, the first being an arguments\r\n\t// object with the supplied log messages and the second being a context object which contains a hash of stateful\r\n\t// parameters which the logging function can consume.\r\n\tLogger.setHandler = function (func) {\r\n\t\tlogHandler = func;\r\n\t};\r\n\r\n\t// Sets the global logging filter level which applies to *all* previously registered, and future Logger instances.\r\n\t// (note that named loggers (retrieved via `Logger.get`) can be configured independently if required).\r\n\tLogger.setLevel = function(level) {\r\n\t\t// Set the globalLogger's level.\r\n\t\tglobalLogger.setLevel(level);\r\n\r\n\t\t// Apply this level to all registered contextual loggers.\r\n\t\tfor (var key in contextualLoggersByNameMap) {\r\n\t\t\tif (contextualLoggersByNameMap.hasOwnProperty(key)) {\r\n\t\t\t\tcontextualLoggersByNameMap[key].setLevel(level);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Gets the global logging filter level\r\n\tLogger.getLevel = function() {\r\n\t\treturn globalLogger.getLevel();\r\n\t};\r\n\r\n\t// Retrieve a ContextualLogger instance. Note that named loggers automatically inherit the global logger's level,\r\n\t// default context and log handler.\r\n\tLogger.get = function (name) {\r\n\t\t// All logger instances are cached so they can be configured ahead of use.\r\n\t\treturn contextualLoggersByNameMap[name] ||\r\n\t\t\t(contextualLoggersByNameMap[name] = new ContextualLogger(merge({ name: name }, globalLogger.context)));\r\n\t};\r\n\r\n\t// CreateDefaultHandler returns a handler function which can be passed to `Logger.setHandler()` which will\r\n\t// write to the window's console object (if present); the optional options object can be used to customise the\r\n\t// formatter used to format each log message.\r\n\tLogger.createDefaultHandler = function (options) {\r\n\t\toptions = options || {};\r\n\r\n\t\toptions.formatter = options.formatter || function defaultMessageFormatter(messages, context) {\r\n\t\t\t// Prepend the logger's name to the log message for easy identification.\r\n\t\t\tif (context.name) {\r\n\t\t\t\tmessages.unshift(\"[\" + context.name + \"]\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Map of timestamps by timer labels used to track `#time` and `#timeEnd()` invocations in environments\r\n\t\t// that don't offer a native console method.\r\n\t\tvar timerStartTimeByLabelMap = {};\r\n\r\n\t\t// Support for IE8+ (and other, slightly more sane environments)\r\n\t\tvar invokeConsoleMethod = function (hdlr, messages) {\r\n\t\t\tFunction.prototype.apply.call(hdlr, console, messages);\r\n\t\t};\r\n\r\n\t\t// Check for the presence of a logger.\r\n\t\tif (typeof console === \"undefined\") {\r\n\t\t\treturn function () { /* no console */ };\r\n\t\t}\r\n\r\n\t\treturn function(messages, context) {\r\n\t\t\t// Convert arguments object to Array.\r\n\t\t\tmessages = Array.prototype.slice.call(messages);\r\n\r\n\t\t\tvar hdlr = console.log;\r\n\t\t\tvar timerLabel;\r\n\r\n\t\t\tif (context.level === Logger.TIME) {\r\n\t\t\t\ttimerLabel = (context.name ? '[' + context.name + '] ' : '') + messages[0];\r\n\r\n\t\t\t\tif (messages[1] === 'start') {\r\n\t\t\t\t\tif (console.time) {\r\n\t\t\t\t\t\tconsole.time(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\ttimerStartTimeByLabelMap[timerLabel] = new Date().getTime();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (console.timeEnd) {\r\n\t\t\t\t\t\tconsole.timeEnd(timerLabel);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tinvokeConsoleMethod(hdlr, [ timerLabel + ': ' +\r\n\t\t\t\t\t\t\t(new Date().getTime() - timerStartTimeByLabelMap[timerLabel]) + 'ms' ]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Delegate through to custom warn/error loggers if present on the console.\r\n\t\t\t\tif (context.level === Logger.WARN && console.warn) {\r\n\t\t\t\t\thdlr = console.warn;\r\n\t\t\t\t} else if (context.level === Logger.ERROR && console.error) {\r\n\t\t\t\t\thdlr = console.error;\r\n\t\t\t\t} else if (context.level === Logger.INFO && console.info) {\r\n\t\t\t\t\thdlr = console.info;\r\n\t\t\t\t} else if (context.level === Logger.DEBUG && console.debug) {\r\n\t\t\t\t\thdlr = console.debug;\r\n\t\t\t\t} else if (context.level === Logger.TRACE && console.trace) {\r\n\t\t\t\t\thdlr = console.trace;\r\n\t\t\t\t}\r\n\r\n\t\t\t\toptions.formatter(messages, context);\r\n\t\t\t\tinvokeConsoleMethod(hdlr, messages);\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// Configure and example a Default implementation which writes to the `window.console` (if present). The\r\n\t// `options` hash can be used to configure the default logLevel and provide a custom message formatter.\r\n\tLogger.useDefaults = function(options) {\r\n\t\tLogger.setLevel(options && options.defaultLevel || Logger.DEBUG);\r\n\t\tLogger.setHandler(Logger.createDefaultHandler(options));\r\n\t};\r\n\r\n\t// Export to popular environments boilerplate.\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\tdefine(Logger);\r\n\t}\r\n\telse if (typeof module !== 'undefined' && module.exports) {\r\n\t\tmodule.exports = Logger;\r\n\t}\r\n\telse {\r\n\t\tLogger._prevLogger = global.Logger;\r\n\r\n\t\tLogger.noConflict = function () {\r\n\t\t\tglobal.Logger = Logger._prevLogger;\r\n\t\t\treturn Logger;\r\n\t\t};\r\n\r\n\t\tglobal.Logger = Logger;\r\n\t}\r\n}(this));\r\n","/*!\n * assign-deep \n *\n * Copyright (c) 2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n'use strict';\n\nvar isPrimitive = require('is-primitive');\nvar assignSymbols = require('assign-symbols');\nvar typeOf = require('kind-of');\n\nfunction assign(target/*, objects*/) {\n target = target || {};\n var len = arguments.length, i = 0;\n if (len === 1) {\n return target;\n }\n while (++i < len) {\n var val = arguments[i];\n if (isPrimitive(target)) {\n target = val;\n }\n if (isObject(val)) {\n extend(target, val);\n }\n }\n return target;\n}\n\n/**\n * Shallow extend\n */\n\nfunction extend(target, obj) {\n assignSymbols(target, obj);\n\n for (var key in obj) {\n if (isValidKey(key) && hasOwn(obj, key)) {\n var val = obj[key];\n if (isObject(val)) {\n if (typeOf(target[key]) === 'undefined' && typeOf(val) === 'function') {\n target[key] = val;\n }\n target[key] = assign(target[key] || {}, val);\n } else {\n target[key] = val;\n }\n }\n }\n return target;\n}\n\n/**\n * Returns true if the object is a plain object or a function.\n */\n\nfunction isObject(obj) {\n return typeOf(obj) === 'object' || typeOf(obj) === 'function';\n}\n\n/**\n * Returns true if the given `key` is an own property of `obj`.\n */\n\nfunction hasOwn(obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\n/**\n * Returns true if the given `key` is a valid key that can be used for assigning properties.\n */\n\nfunction isValidKey(key) {\n return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n}\n\n/**\n * Expose `assign`\n */\n\nmodule.exports = assign;\n","/*!\n * is-primitive \n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\n// see http://jsperf.com/testing-value-is-primitive/7\nmodule.exports = function isPrimitive(value) {\n return value == null || (typeof value !== 'function' && typeof value !== 'object');\n};\n","/*!\n * assign-symbols \n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nmodule.exports = function(receiver, objects) {\n if (receiver === null || typeof receiver === 'undefined') {\n throw new TypeError('expected first argument to be an object.');\n }\n\n if (typeof objects === 'undefined' || typeof Symbol === 'undefined') {\n return receiver;\n }\n\n if (typeof Object.getOwnPropertySymbols !== 'function') {\n return receiver;\n }\n\n var isEnumerable = Object.prototype.propertyIsEnumerable;\n var target = Object(receiver);\n var len = arguments.length, i = 0;\n\n while (++i < len) {\n var provider = Object(arguments[i]);\n var names = Object.getOwnPropertySymbols(provider);\n\n for (var j = 0; j < names.length; j++) {\n var key = names[j];\n\n if (isEnumerable.call(provider, key)) {\n target[key] = provider[key];\n }\n }\n }\n return target;\n};\n","var toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n var type = typeof val;\n\n // primitivies\n if (type === 'undefined') {\n return 'undefined';\n }\n if (val === null) {\n return 'null';\n }\n if (val === true || val === false || val instanceof Boolean) {\n return 'boolean';\n }\n if (type === 'string' || val instanceof String) {\n return 'string';\n }\n if (type === 'number' || val instanceof Number) {\n return 'number';\n }\n\n // functions\n if (type === 'function' || val instanceof Function) {\n if (typeof val.constructor.name !== 'undefined' && val.constructor.name.slice(0, 9) === 'Generator') {\n return 'generatorfunction';\n }\n return 'function';\n }\n\n // array\n if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n return 'array';\n }\n\n // check for instances of RegExp and Date before calling `toString`\n if (val instanceof RegExp) {\n return 'regexp';\n }\n if (val instanceof Date) {\n return 'date';\n }\n\n // other objects\n type = toString.call(val);\n\n if (type === '[object RegExp]') {\n return 'regexp';\n }\n if (type === '[object Date]') {\n return 'date';\n }\n if (type === '[object Arguments]') {\n return 'arguments';\n }\n if (type === '[object Error]') {\n return 'error';\n }\n if (type === '[object Promise]') {\n return 'promise';\n }\n\n // buffer\n if (isBuffer(val)) {\n return 'buffer';\n }\n\n // es6: Map, WeakMap, Set, WeakSet\n if (type === '[object Set]') {\n return 'set';\n }\n if (type === '[object WeakSet]') {\n return 'weakset';\n }\n if (type === '[object Map]') {\n return 'map';\n }\n if (type === '[object WeakMap]') {\n return 'weakmap';\n }\n if (type === '[object Symbol]') {\n return 'symbol';\n }\n \n if (type === '[object Map Iterator]') {\n return 'mapiterator';\n }\n if (type === '[object Set Iterator]') {\n return 'setiterator';\n }\n if (type === '[object String Iterator]') {\n return 'stringiterator';\n }\n if (type === '[object Array Iterator]') {\n return 'arrayiterator';\n }\n \n // typed arrays\n if (type === '[object Int8Array]') {\n return 'int8array';\n }\n if (type === '[object Uint8Array]') {\n return 'uint8array';\n }\n if (type === '[object Uint8ClampedArray]') {\n return 'uint8clampedarray';\n }\n if (type === '[object Int16Array]') {\n return 'int16array';\n }\n if (type === '[object Uint16Array]') {\n return 'uint16array';\n }\n if (type === '[object Int32Array]') {\n return 'int32array';\n }\n if (type === '[object Uint32Array]') {\n return 'uint32array';\n }\n if (type === '[object Float32Array]') {\n return 'float32array';\n }\n if (type === '[object Float64Array]') {\n return 'float64array';\n }\n\n // must be a plain object\n return 'object';\n};\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n return val.constructor\n && typeof val.constructor.isBuffer === 'function'\n && val.constructor.isBuffer(val);\n}\n","interface ICurlyBracesBinding {\r\n to: string,\r\n value: string,\r\n fn: string\r\n}\r\n\r\n/**\r\n * Basic String\r\n *\r\n * Enables chaning events, output must be called, else will return a chain\r\n *\r\n *\r\n */\r\nexport default class Strings {\r\n\r\n\r\n private _curlyBracesPattern = /{([^}]+)}/g;\r\n\r\n\r\n /**\r\n * Initialized the object with the source string to work with.\r\n */\r\n constructor(str: string) {\r\n this._string = str || '';\r\n }\r\n\r\n _string: string;\r\n\r\n\r\n\r\n /**\r\n * Make a string's first character uppercase\r\n * @see: http://php.net/manual/en/function.ucfirst.php\r\n */\r\n ucFirst() : string {\r\n return this._string.charAt(0).toUpperCase() + this._string.slice(1);\r\n }\r\n\r\n getCurlyBracesBinding(): Array {\r\n let found: Array = []; // an array to collect the strings that are found\r\n\r\n let currentMatch = this._curlyBracesPattern.exec(this._string);\r\n while (currentMatch) {\r\n found.push(this._getBindingMethod(currentMatch[1]));\r\n currentMatch = this._curlyBracesPattern.exec(this._string)\r\n }\r\n\r\n return found;\r\n }\r\n\r\n private _getBindingMethod(bindExpression: string) : ICurlyBracesBinding {\r\n let bindMap = {\r\n to: bindExpression,\r\n value: '',\r\n fn: ''\r\n };\r\n\r\n let bindRelatedMethod = bindExpression.split('|');\r\n if (2 === bindRelatedMethod.length) {\r\n bindMap.value = bindRelatedMethod[0].trim();\r\n bindMap.fn = bindRelatedMethod[1].trim();\r\n }\r\n\r\n return bindMap;\r\n }\r\n\r\n\r\n /**\r\n * @description - Insert char at a specific position in the string.\r\n */\r\n insertAt(index: number, stringToInjectT: string, stringToInject: string) {\r\n return stringToInjectT.substr(0, index) + stringToInject + stringToInjectT.substr(index);\r\n }\r\n\r\n /**\r\n *\r\n * @returns {string}\r\n */\r\n stripslashes(): string {\r\n return (this._string + '')\r\n .replace(/\\\\(.?)/g, function (s, n1) {\r\n switch (n1) {\r\n case '\\\\':\r\n return '\\\\'\r\n case '0':\r\n return '\\u0000'\r\n case '':\r\n return ''\r\n default:\r\n return n1\r\n }\r\n });\r\n }\r\n replaceAll(from: string, to: string)\r\n {\r\n return this._string.replace(new RegExp(to, 'g'), from);\r\n }\r\n\r\n getString() :string {\r\n return this._string;\r\n }\r\n\r\n setString(str): void {\r\n this._string = str;\r\n }\r\n\r\n /**\r\n * @description - Determines if a value is a empty string.\r\n */\r\n isEmpty(): boolean {\r\n return this._string.length === 0 || !this._string.trim();\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param partialString\r\n */\r\n startsWith(partialString) {\r\n if (!String.prototype.startsWith) {\r\n // eslint-disable-next-line\r\n String.prototype.startsWith = function (searchString, position) {\r\n position = position || 0;\r\n return this.substr(position, searchString.length) === searchString;\r\n };\r\n }\r\n\r\n return this._string.startsWith(partialString);\r\n }\r\n\r\n injectIntoCurly(bindingParams: object): string {\r\n if (bindingParams === undefined || bindingParams === null) {\r\n return this._string;\r\n }\r\n Object\r\n .keys(bindingParams)\r\n .forEach((bindTo) => {\r\n let tokens = this._string.split('{' + bindTo + '}');\r\n this._string = tokens.join(bindingParams[bindTo]);\r\n });\r\n\r\n return this._string;\r\n }\r\n}\r\n"],"sourceRoot":""}