{"version":3,"sources":["webpack:///./node_modules/lodash.isequal/index.js","webpack:///./node_modules/mapbox-gl-inspect/lib/InspectButton.js","webpack:///./node_modules/google-maps/lib/esm/loader.js","webpack:///./node_modules/mapbox-gl-inspect/lib/renderPopup.js","webpack:///./node_modules/mapbox-gl-inspect/lib/stylegen.js","webpack:///./node_modules/node-fetch/browser.js","webpack:///./node_modules/mobile-detect/mobile-detect.js","webpack:///./node_modules/mapbox-gl-inspect/index.js","webpack:///./node_modules/mapbox-gl-inspect/lib/colors.js","webpack:///./node_modules/mapbox-gl-inspect/lib/MapboxInspect.js"],"names":["LARGE_ARRAY_SIZE","HASH_UNDEFINED","COMPARE_PARTIAL_FLAG","COMPARE_UNORDERED_FLAG","MAX_SAFE_INTEGER","argsTag","arrayTag","asyncTag","boolTag","dateTag","errorTag","funcTag","genTag","mapTag","numberTag","nullTag","objectTag","promiseTag","proxyTag","regexpTag","setTag","stringTag","symbolTag","undefinedTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","reRegExpChar","reIsHostCtor","reIsUint","typedArrayTags","freeGlobal","global","Object","freeSelf","self","root","Function","freeExports","exports","nodeType","freeModule","module","moduleExports","freeProcess","process","nodeUtil","binding","e","nodeIsTypedArray","isTypedArray","arrayFilter","array","predicate","index","length","resIndex","result","value","arrayPush","values","offset","arraySome","baseTimes","n","iteratee","Array","baseUnary","func","cacheHas","cache","key","has","getValue","object","undefined","mapToArray","map","size","forEach","overArg","transform","arg","setToArray","set","arrayProto","prototype","funcProto","objectProto","coreJsData","funcToString","toString","hasOwnProperty","maskSrcKey","uid","exec","keys","IE_PROTO","nativeObjectToString","reIsNative","RegExp","call","replace","Buffer","Symbol","Uint8Array","propertyIsEnumerable","splice","symToStringTag","toStringTag","nativeGetSymbols","getOwnPropertySymbols","nativeIsBuffer","isBuffer","nativeKeys","DataView","getNative","Map","Promise","Set","WeakMap","nativeCreate","dataViewCtorString","toSource","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","symbolProto","symbolValueOf","valueOf","Hash","entries","this","clear","entry","hashClear","__data__","hashDelete","hashGet","data","hashHas","hashSet","ListCache","listCacheClear","listCacheDelete","assocIndexOf","lastIndex","pop","listCacheGet","listCacheHas","listCacheSet","push","MapCache","mapCacheClear","mapCacheDelete","getMapData","mapCacheGet","get","mapCacheHas","mapCacheSet","SetCache","add","setCacheAdd","setCacheHas","Stack","stackClear","stackDelete","stackGet","stackHas","stackSet","pairs","arrayLikeKeys","inherited","isArr","isArray","isArg","isArguments","isBuff","isType","skipIndexes","String","isIndex","eq","baseGetAllKeys","keysFunc","symbolsFunc","baseGetTag","getRawTag","objectToString","baseIsArguments","isObjectLike","baseIsEqual","other","bitmask","customizer","stack","baseIsEqualDeep","equalFunc","objIsArr","othIsArr","objTag","getTag","othTag","objIsObj","othIsObj","isSameTag","equalArrays","equalByTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","equalObjects","baseIsNative","isObject","isMasked","pattern","isFunction","test","baseIsTypedArray","isLength","baseKeys","isPrototype","isPartial","arrLength","othLength","stacked","seen","arrValue","othValue","compared","othIndex","tag","byteLength","byteOffset","buffer","name","message","convert","objProps","getAllKeys","objLength","othProps","skipCtor","objValue","objCtor","constructor","othCtor","getSymbols","isKeyable","isOwn","unmasked","symbol","stubArray","type","Ctor","proto","ArrayBuffer","resolve","ctorString","arguments","isArrayLike","stubFalse","isEqual","container","child","show","document","createElement","className","appendChild","style","display","button","btn","InspectButton","options","assign","onToggle","_btn","onclick","elem","setInspectIcon","setMapIcon","Loader","apiKey","window","Error","api","loader","CALLBACK_NAME","reject","script","src","createUrl","async","onerror","head","parameters","join","displayValue","Date","toLocaleString","renderProperty","propertyName","property","renderLayer","layerId","renderProperties","feature","sourceProperty","layer","source","typeProperty","geometry","properties","concat","renderFeatures","features","ft","renderPopup","circleLayer","color","vectorLayer","id","paint","filter","polygonLayer","outlineColor","lineLayer","layout","generateColoredLayers","sources","assignLayerColor","polyLayers","circleLayers","lineLayers","alphaColors","bind","obj","circle","line","polygon","polygonOutline","default","sourceId","layers","colors","generateInspectStyle","originalMapStyle","coloredLayers","opts","backgroundColor","backgroundLayer","soources","getGlobal","fetch","Headers","Request","Response","define","impl","fullPattern","shortPattern","tabletPattern","hasOwnProp","equalIC","a","b","toLowerCase","containsIC","valueLC","i","len","convertPropsToRegExp","prepareUserAgent","userAgent","substr","MobileDetect","maxPhoneWidth","ua","_cache","FALLBACK_PHONE","FALLBACK_TABLET","FALLBACK_MOBILE","verPos","mobileDetectRules","props","indexOf","substring","oss","phones","tablets","uas","utils","oss0","WindowsPhoneOS","WindowsMobileOS","findMatch","rules","findMatches","getVersionStr","patterns","match","getVersion","version","prepareVersionNo","NaN","numbers","split","shift","Number","isMobileFallback","detectMobileBrowsers","isTabletFallback","prepareDetectionCache","mobile","phone","tablet","phoneSized","isPhoneSized","mobileGrade","t","$isMobile","os","is","detectOS","getDeviceSmallerSide","screen","width","height","userAgents","versionStr","grade","_impl","factory","MapboxInspect","randomColor","brightColor","alpha","luminosity","hue","rgb","seed","format","rgba","stylegen","isInspectStyle","metadata","markInspectStyle","fixRasterSource","tileSize","tiles","url","fixStyle","notifyVersion","mapboxgl","versions","parseFloat","console","error","popup","Popup","closeButton","closeOnClick","showInspectMap","showInspectButton","showInspectMapPopup","showMapPopup","showMapPopupOnHover","showInspectMapPopupOnHover","blockHoverPopupOnClick","buildInspectStyle","selectThreshold","useInspectStyle","queryParameters","toggleInspector","_popup","_popupBlocked","_showInspectMap","_onSourceChange","_onMousemove","_onStyleChange","_originalStyle","_toggle","render","_inspectStyle","_map","getStyle","setStyle","remove","mapStyle","mapStyleSourcesNames","previousSources","sourceCaches","sourceCache","_source","layerIds","vectorLayerIds","queryBox","point","x","y","queryRenderedFeatures","getCanvas","cursor","setLngLat","lngLat","setHTML","setDOMContent","addTo","onAdd","on","onRemove","off","parentNode","removeChild"],"mappings":"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","file":"js/chunk-vendors~73914085.84022730.js","sourcesContent":["/**\n * Lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright JS Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n asyncTag = '[object AsyncFunction]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n nullTag = '[object Null]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n proxyTag = '[object Proxy]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n undefinedTag = '[object Undefined]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\n/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\n/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n Symbol = root.Symbol,\n Uint8Array = root.Uint8Array,\n propertyIsEnumerable = objectProto.propertyIsEnumerable,\n splice = arrayProto.splice,\n symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols,\n nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n Map = getNative(root, 'Map'),\n Promise = getNative(root, 'Promise'),\n Set = getNative(root, 'Set'),\n WeakMap = getNative(root, 'WeakMap'),\n nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\n/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(array);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked && stack.get(other)) {\n return stacked == other;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n return baseIsEqual(value, other);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\n/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = isEqual;\n","function container(child, show) {\n var container = document.createElement('div');\n container.className = 'mapboxgl-ctrl mapboxgl-ctrl-group';\n container.appendChild(child);\n if (!show) {\n container.style.display = 'none';\n }\n return container;\n}\n\nfunction button() {\n var btn = document.createElement('button');\n btn.className = 'mapboxgl-ctrl-icon mapboxgl-ctrl-inspect';\n btn.type = 'button';\n btn['aria-label'] = 'Inspect';\n return btn;\n}\n\nfunction InspectButton(options) {\n options = Object.assign({\n show: true,\n onToggle: function () {}\n }, options);\n\n this._btn = button();\n this._btn.onclick = options.onToggle;\n this.elem = container(this._btn, options.show);\n}\n\nInspectButton.prototype.setInspectIcon = function () {\n this._btn.className = 'mapboxgl-ctrl-icon mapboxgl-ctrl-inspect';\n};\n\nInspectButton.prototype.setMapIcon = function () {\n this._btn.className = 'mapboxgl-ctrl-icon mapboxgl-ctrl-map';\n};\n\nmodule.exports = InspectButton;\n","export class Loader {\n constructor(apiKey = null, options = {}) {\n this.apiKey = apiKey;\n this.options = options;\n if (typeof window === 'undefined') {\n throw new Error('google-maps is supported only in browser environment');\n }\n }\n load() {\n if (typeof this.api !== 'undefined') {\n return Promise.resolve(this.api);\n }\n if (typeof this.loader !== 'undefined') {\n return this.loader;\n }\n window[Loader.CALLBACK_NAME] = () => {\n this.api = window['google'];\n if (typeof this.resolve === 'undefined') {\n throw new Error('Should not happen');\n }\n this.resolve(this.api);\n };\n window['gm_authFailure'] = () => {\n if (typeof this.reject === 'undefined') {\n throw new Error('Should not happen');\n }\n this.reject(new Error('google-maps: authentication error'));\n };\n return this.loader = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n const script = document.createElement('script');\n script.src = this.createUrl();\n script.async = true;\n script.onerror = (e) => reject(e);\n document.head.appendChild(script);\n });\n }\n createUrl() {\n const parameters = [\n `callback=${Loader.CALLBACK_NAME}`,\n ];\n if (this.apiKey) {\n parameters.push(`key=${this.apiKey}`);\n }\n for (let name in this.options) {\n if (this.options.hasOwnProperty(name)) {\n let value = this.options[name];\n if (name === 'version') {\n name = 'v';\n }\n if (name === 'libraries') {\n value = value.join(',');\n }\n parameters.push(`${name}=${value}`);\n }\n }\n return `https://maps.googleapis.com/maps/api/js?${parameters.join('&')}`;\n }\n}\nLoader.CALLBACK_NAME = '_dk_google_maps_loader_cb';\n//# sourceMappingURL=loader.js.map","function displayValue(value) {\n if (typeof value === 'undefined' || value === null) return value;\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === 'object' ||\n typeof value === 'number' ||\n typeof value === 'string') return value.toString();\n return value;\n}\n\nfunction renderProperty(propertyName, property) {\n return '
' +\n '
' + propertyName + '
' +\n '
' + displayValue(property) + '
' +\n '
';\n}\n\nfunction renderLayer(layerId) {\n return '
' + layerId + '
';\n}\n\nfunction renderProperties(feature) {\n var sourceProperty = renderLayer(feature.layer['source-layer'] || feature.layer.source);\n var typeProperty = renderProperty('$type', feature.geometry.type);\n var properties = Object.keys(feature.properties).map(function (propertyName) {\n return renderProperty(propertyName, feature.properties[propertyName]);\n });\n return [sourceProperty, typeProperty].concat(properties).join('');\n}\n\nfunction renderFeatures(features) {\n return features.map(function (ft) {\n return '
' + renderProperties(ft) + '
';\n }).join('');\n}\n\nfunction renderPopup(features) {\n return '
' + renderFeatures(features) + '
';\n}\n\nmodule.exports = renderPopup;\n","function circleLayer(color, source, vectorLayer) {\n var layer = {\n id: [source, vectorLayer, 'circle'].join('_'),\n source: source,\n type: 'circle',\n paint: {\n 'circle-color': color,\n 'circle-radius': 2\n },\n filter: ['==', '$type', 'Point']\n };\n if (vectorLayer) {\n layer['source-layer'] = vectorLayer;\n }\n return layer;\n}\n\nfunction polygonLayer(color, outlineColor, source, vectorLayer) {\n var layer = {\n id: [source, vectorLayer, 'polygon'].join('_'),\n source: source,\n type: 'fill',\n paint: {\n 'fill-color': color,\n 'fill-antialias': true,\n 'fill-outline-color': color\n },\n filter: ['==', '$type', 'Polygon']\n };\n if (vectorLayer) {\n layer['source-layer'] = vectorLayer;\n }\n return layer;\n}\n\nfunction lineLayer(color, source, vectorLayer) {\n var layer = {\n id: [source, vectorLayer, 'line'].join('_'),\n source: source,\n layout: {\n 'line-join': 'round',\n 'line-cap': 'round'\n },\n type: 'line',\n paint: {\n 'line-color': color\n },\n filter: ['==', '$type', 'LineString']\n };\n if (vectorLayer) {\n layer['source-layer'] = vectorLayer;\n }\n return layer;\n}\n\n/**\n * Generate colored layer styles for the given sources\n * TODO: Improve docs\n * @param {Object} Sources dict containing the vector layer IDs\n * @param {Function} Function to generate a color for a layer\n * @return {array} Array of Mapbox GL layers\n */\nfunction generateColoredLayers(sources, assignLayerColor) {\n var polyLayers = [];\n var circleLayers = [];\n var lineLayers = [];\n\n function alphaColors(layerId) {\n var color = assignLayerColor.bind(null, layerId);\n var obj = {\n circle: color(0.8),\n line: color(0.6),\n polygon: color(0.3),\n polygonOutline: color(0.6),\n default: color(1)\n };\n return obj;\n }\n\n Object.keys(sources).forEach(function (sourceId) {\n var layers = sources[sourceId];\n\n if (!layers || layers.length === 0) {\n var colors = alphaColors(sourceId);\n circleLayers.push(circleLayer(colors.circle, sourceId));\n lineLayers.push(lineLayer(colors.line, sourceId));\n polyLayers.push(polygonLayer(colors.polygon, colors.polygonOutline, sourceId));\n } else {\n layers.forEach(function (layerId) {\n var colors = alphaColors(layerId);\n\n circleLayers.push(circleLayer(colors.circle, sourceId, layerId));\n lineLayers.push(lineLayer(colors.line, sourceId, layerId));\n polyLayers.push(polygonLayer(colors.polygon, colors.polygonOutline, sourceId, layerId));\n });\n }\n });\n\n return polyLayers.concat(lineLayers).concat(circleLayers);\n}\n\n/**\n * Create inspection style out of the original style and the new colored layers\n * @param {Object} Original map styles\n * @param {array} Array of colored Mapbox GL layers\n * @return {Object} Colored inspect style\n */\nfunction generateInspectStyle(originalMapStyle, coloredLayers, opts) {\n opts = Object.assign({\n backgroundColor: '#fff'\n }, opts);\n\n var backgroundLayer = {\n 'id': 'background',\n 'type': 'background',\n 'paint': {\n 'background-color': opts.backgroundColor\n }\n };\n\n var sources = {};\n Object.keys(originalMapStyle.sources).forEach(function (sourceId) {\n var source = originalMapStyle.sources[sourceId];\n if (source.type === 'vector' || source.type === 'geojson') {\n sources[sourceId] = source;\n }\n });\n\n return Object.assign(originalMapStyle, {\n layers: [backgroundLayer].concat(coloredLayers),\n soources: sources\n });\n}\n\nexports.polygonLayer = polygonLayer;\nexports.lineLayer = lineLayer;\nexports.circleLayer = circleLayer;\nexports.generateInspectStyle = generateInspectStyle;\nexports.generateColoredLayers = generateColoredLayers;\n","\"use strict\";\n\n// ref: https://github.com/tc39/proposal-global\nvar getGlobal = function () {\n\t// the only reliable means to get the global object is\n\t// `Function('return this')()`\n\t// However, this causes CSP violations in Chrome apps.\n\tif (typeof self !== 'undefined') { return self; }\n\tif (typeof window !== 'undefined') { return window; }\n\tif (typeof global !== 'undefined') { return global; }\n\tthrow new Error('unable to locate global object');\n}\n\nvar global = getGlobal();\n\nmodule.exports = exports = global.fetch;\n\n// Needed for TypeScript and Webpack.\nexports.default = global.fetch.bind(global);\n\nexports.Headers = global.Headers;\nexports.Request = global.Request;\nexports.Response = global.Response;","// THIS FILE IS GENERATED - DO NOT EDIT!\n/*!mobile-detect v1.4.4 2019-09-21*/\n/*global module:false, define:false*/\n/*jshint latedef:false*/\n/*!@license Copyright 2013, Heinrich Goebl, License: MIT, see https://github.com/hgoebl/mobile-detect.js*/\n(function (define, undefined) {\ndefine(function () {\n 'use strict';\n\n var impl = {};\n\n impl.mobileDetectRules = {\n \"phones\": {\n \"iPhone\": \"\\\\biPhone\\\\b|\\\\biPod\\\\b\",\n \"BlackBerry\": \"BlackBerry|\\\\bBB10\\\\b|rim[0-9]+|\\\\b(BBA100|BBB100|BBD100|BBE100|BBF100|STH100)\\\\b-[0-9]+\",\n \"HTC\": \"HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\\\\bEVO\\\\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel\",\n \"Nexus\": \"Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6\",\n \"Dell\": \"Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\\\\b001DL\\\\b|\\\\b101DL\\\\b|\\\\bGS01\\\\b\",\n \"Motorola\": \"Motorola|DROIDX|DROID BIONIC|\\\\bDroid\\\\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\\\\bMoto E\\\\b|XT1068|XT1092|XT1052\",\n \"Samsung\": \"\\\\bSamsung\\\\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F|SM-J330F\",\n \"LG\": \"\\\\bLG\\\\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323|M257)|LM-G710\",\n \"Sony\": \"SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533\",\n \"Asus\": \"Asus.*Galaxy|PadFone.*Mobile\",\n \"NokiaLumia\": \"Lumia [0-9]{3,4}\",\n \"Micromax\": \"Micromax.*\\\\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\\\\b\",\n \"Palm\": \"PalmSource|Palm\",\n \"Vertu\": \"Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature\",\n \"Pantech\": \"PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790\",\n \"Fly\": \"IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250\",\n \"Wiko\": \"KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM\",\n \"iMobile\": \"i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)\",\n \"SimValley\": \"\\\\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\\\\b\",\n \"Wolfgang\": \"AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q\",\n \"Alcatel\": \"Alcatel\",\n \"Nintendo\": \"Nintendo (3DS|Switch)\",\n \"Amoi\": \"Amoi\",\n \"INQ\": \"INQ\",\n \"OnePlus\": \"ONEPLUS\",\n \"GenericPhone\": \"Tapatalk|PDA;|SAGEM|\\\\bmmp\\\\b|pocket|\\\\bpsp\\\\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\\\\bwap\\\\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser\"\n },\n \"tablets\": {\n \"iPad\": \"iPad|iPad.*Mobile\",\n \"NexusTablet\": \"Android.*Nexus[\\\\s]+(7|9|10)\",\n \"GoogleTablet\": \"Android.*Pixel C\",\n \"SamsungTablet\": \"SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y|SM-T585|SM-T285|SM-T825|SM-W708|SM-T835|SM-T830|SM-T837V|SM-T720|SM-T510|SM-T387V\",\n \"Kindle\": \"Kindle|Silk.*Accelerated|Android.*\\\\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\\\\b|Android.*Silk\\/[0-9.]+ like Chrome\\/[0-9.]+ (?!Mobile)\",\n \"SurfaceTablet\": \"Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)\",\n \"HPTablet\": \"HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10\",\n \"AsusTablet\": \"^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\\\\bK00F\\\\b|\\\\bK00C\\\\b|\\\\bK00E\\\\b|\\\\bK00L\\\\b|TX201LA|ME176C|ME102A|\\\\bM80TA\\\\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\\\\bME70C\\\\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\\\\bP027\\\\b|\\\\bP024\\\\b|\\\\bP00C\\\\b\",\n \"BlackBerryTablet\": \"PlayBook|RIM Tablet\",\n \"HTCtablet\": \"HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410\",\n \"MotorolaTablet\": \"xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617\",\n \"NookTablet\": \"Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2\",\n \"AcerTablet\": \"Android.*; \\\\b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\\\\b|W3-810|\\\\bA3-A10\\\\b|\\\\bA3-A11\\\\b|\\\\bA3-A20\\\\b|\\\\bA3-A30\",\n \"ToshibaTablet\": \"Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO\",\n \"LGTablet\": \"\\\\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\\\\b\",\n \"FujitsuTablet\": \"Android.*\\\\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\\\\b\",\n \"PrestigioTablet\": \"PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002\",\n \"LenovoTablet\": \"Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304X|TB-X304F|TB-X304L|TB-X505F|TB-X505L|TB-X505X|TB-X605F|TB-X605L|TB-8703F|TB-8703X|TB-8703N|TB-8704N|TB-8704F|TB-8704X|TB-8704V|TB-7304F|TB-7304I|TB-7304X|Tab2A7-10F|Tab2A7-20F|TB2-X30L|YT3-X50L|YT3-X50F|YT3-X50M|YT-X705F|YT-X703F|YT-X703L|YT-X705L|YT-X705X|TB2-X30F|TB2-X30L|TB2-X30M|A2107A-F|A2107A-H|TB3-730F|TB3-730M|TB3-730X|TB-7504F|TB-7504X\",\n \"DellTablet\": \"Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7\",\n \"YarvikTablet\": \"Android.*\\\\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\\\\b\",\n \"MedionTablet\": \"Android.*\\\\bOYO\\\\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB\",\n \"ArnovaTablet\": \"97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2\",\n \"IntensoTablet\": \"INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004\",\n \"IRUTablet\": \"M702pro\",\n \"MegafonTablet\": \"MegaFon V9|\\\\bZTE V9\\\\b|Android.*\\\\bMT7A\\\\b\",\n \"EbodaTablet\": \"E-Boda (Supreme|Impresspeed|Izzycomm|Essential)\",\n \"AllViewTablet\": \"Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)\",\n \"ArchosTablet\": \"\\\\b(101G9|80G9|A101IT)\\\\b|Qilive 97R|Archos5|\\\\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\\\\b\",\n \"AinolTablet\": \"NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark\",\n \"NokiaLumiaTablet\": \"Lumia 2520\",\n \"SonyTablet\": \"Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP641|SGP612|SOT31|SGP771|SGP611|SGP612|SGP712\",\n \"PhilipsTablet\": \"\\\\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\\\\b\",\n \"CubeTablet\": \"Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT\",\n \"CobyTablet\": \"MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010\",\n \"MIDTablet\": \"M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10\",\n \"MSITablet\": \"MSI \\\\b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\\\\b\",\n \"SMiTTablet\": \"Android.*(\\\\bMID\\\\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)\",\n \"RockChipTablet\": \"Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A\",\n \"FlyTablet\": \"IQ310|Fly Vision\",\n \"bqTablet\": \"Android.*(bq)?.*\\\\b(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))\\\\b|Maxwell.*Lite|Maxwell.*Plus\",\n \"HuaweiTablet\": \"MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L|BAH-L09|BAH-W09|AGS-L09|CMR-AL19\",\n \"NecTablet\": \"\\\\bN-06D|\\\\bN-08D\",\n \"PantechTablet\": \"Pantech.*P4100\",\n \"BronchoTablet\": \"Broncho.*(N701|N708|N802|a710)\",\n \"VersusTablet\": \"TOUCHPAD.*[78910]|\\\\bTOUCHTAB\\\\b\",\n \"ZyncTablet\": \"z1000|Z99 2G|z930|z990|z909|Z919|z900\",\n \"PositivoTablet\": \"TB07STA|TB10STA|TB07FTA|TB10FTA\",\n \"NabiTablet\": \"Android.*\\\\bNabi\",\n \"KoboTablet\": \"Kobo Touch|\\\\bK080\\\\b|\\\\bVox\\\\b Build|\\\\bArc\\\\b Build\",\n \"DanewTablet\": \"DSlide.*\\\\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\\\\b\",\n \"TexetTablet\": \"NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE\",\n \"PlaystationTablet\": \"Playstation.*(Portable|Vita)\",\n \"TrekstorTablet\": \"ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab\",\n \"PyleAudioTablet\": \"\\\\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\\\\b\",\n \"AdvanTablet\": \"Android.* \\\\b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\\\\b \",\n \"DanyTechTablet\": \"Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1\",\n \"GalapadTablet\": \"Android.*\\\\bG1\\\\b(?!\\\\))\",\n \"MicromaxTablet\": \"Funbook|Micromax.*\\\\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\\\\b\",\n \"KarbonnTablet\": \"Android.*\\\\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\\\\b\",\n \"AllFineTablet\": \"Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide\",\n \"PROSCANTablet\": \"\\\\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\\\\b\",\n \"YONESTablet\": \"BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026\",\n \"ChangJiaTablet\": \"TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503\",\n \"GUTablet\": \"TX-A1301|TX-M9002|Q702|kf026\",\n \"PointOfViewTablet\": \"TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10\",\n \"OvermaxTablet\": \"OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027\",\n \"HCLTablet\": \"HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync\",\n \"DPSTablet\": \"DPS Dream 9|DPS Dual 7\",\n \"VistureTablet\": \"V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10\",\n \"CrestaTablet\": \"CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989\",\n \"MediatekTablet\": \"\\\\bMT8125|MT8389|MT8135|MT8377\\\\b\",\n \"ConcordeTablet\": \"Concorde([ ]+)?Tab|ConCorde ReadMan\",\n \"GoCleverTablet\": \"GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042\",\n \"ModecomTablet\": \"FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003\",\n \"VoninoTablet\": \"\\\\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\\\\bQ8\\\\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\\\\b\",\n \"ECSTablet\": \"V07OT2|TM105A|S10OT1|TR10CS1\",\n \"StorexTablet\": \"eZee[_']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab\",\n \"VodafoneTablet\": \"SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497|VFD 1400\",\n \"EssentielBTablet\": \"Smart[ ']?TAB[ ]+?[0-9]+|Family[ ']?TAB2\",\n \"RossMoorTablet\": \"RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711\",\n \"iMobileTablet\": \"i-mobile i-note\",\n \"TolinoTablet\": \"tolino tab [0-9.]+|tolino shine\",\n \"AudioSonicTablet\": \"\\\\bC-22Q|T7-QC|T-17B|T-17P\\\\b\",\n \"AMPETablet\": \"Android.* A78 \",\n \"SkkTablet\": \"Android.* (SKYPAD|PHOENIX|CYCLOPS)\",\n \"TecnoTablet\": \"TECNO P9|TECNO DP8D\",\n \"JXDTablet\": \"Android.* \\\\b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\\\\b\",\n \"iJoyTablet\": \"Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)\",\n \"FX2Tablet\": \"FX2 PAD7|FX2 PAD10\",\n \"XoroTablet\": \"KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151\",\n \"ViewsonicTablet\": \"ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a\",\n \"VerizonTablet\": \"QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1\",\n \"OdysTablet\": \"LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\\\\bXELIO\\\\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10\",\n \"CaptivaTablet\": \"CAPTIVA PAD\",\n \"IconbitTablet\": \"NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S\",\n \"TeclastTablet\": \"T98 4G|\\\\bP80\\\\b|\\\\bX90HD\\\\b|X98 Air|X98 Air 3G|\\\\bX89\\\\b|P80 3G|\\\\bX80h\\\\b|P98 Air|\\\\bX89HD\\\\b|P98 3G|\\\\bP90HD\\\\b|P89 3G|X98 3G|\\\\bP70h\\\\b|P79HD 3G|G18d 3G|\\\\bP79HD\\\\b|\\\\bP89s\\\\b|\\\\bA88\\\\b|\\\\bP10HD\\\\b|\\\\bP19HD\\\\b|G18 3G|\\\\bP78HD\\\\b|\\\\bA78\\\\b|\\\\bP75\\\\b|G17s 3G|G17h 3G|\\\\bP85t\\\\b|\\\\bP90\\\\b|\\\\bP11\\\\b|\\\\bP98t\\\\b|\\\\bP98HD\\\\b|\\\\bG18d\\\\b|\\\\bP85s\\\\b|\\\\bP11HD\\\\b|\\\\bP88s\\\\b|\\\\bA80HD\\\\b|\\\\bA80se\\\\b|\\\\bA10h\\\\b|\\\\bP89\\\\b|\\\\bP78s\\\\b|\\\\bG18\\\\b|\\\\bP85\\\\b|\\\\bA70h\\\\b|\\\\bA70\\\\b|\\\\bG17\\\\b|\\\\bP18\\\\b|\\\\bA80s\\\\b|\\\\bA11s\\\\b|\\\\bP88HD\\\\b|\\\\bA80h\\\\b|\\\\bP76s\\\\b|\\\\bP76h\\\\b|\\\\bP98\\\\b|\\\\bA10HD\\\\b|\\\\bP78\\\\b|\\\\bP88\\\\b|\\\\bA11\\\\b|\\\\bA10t\\\\b|\\\\bP76a\\\\b|\\\\bP76t\\\\b|\\\\bP76e\\\\b|\\\\bP85HD\\\\b|\\\\bP85a\\\\b|\\\\bP86\\\\b|\\\\bP75HD\\\\b|\\\\bP76v\\\\b|\\\\bA12\\\\b|\\\\bP75a\\\\b|\\\\bA15\\\\b|\\\\bP76Ti\\\\b|\\\\bP81HD\\\\b|\\\\bA10\\\\b|\\\\bT760VE\\\\b|\\\\bT720HD\\\\b|\\\\bP76\\\\b|\\\\bP73\\\\b|\\\\bP71\\\\b|\\\\bP72\\\\b|\\\\bT720SE\\\\b|\\\\bC520Ti\\\\b|\\\\bT760\\\\b|\\\\bT720VE\\\\b|T720-3GE|T720-WiFi\",\n \"OndaTablet\": \"\\\\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\\\\b[\\\\s]+|V10 \\\\b4G\\\\b\",\n \"JaytechTablet\": \"TPC-PA762\",\n \"BlaupunktTablet\": \"Endeavour 800NG|Endeavour 1010\",\n \"DigmaTablet\": \"\\\\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\\\\b\",\n \"EvolioTablet\": \"ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\\\\bEvotab\\\\b|\\\\bNeura\\\\b\",\n \"LavaTablet\": \"QPAD E704|\\\\bIvoryS\\\\b|E-TAB IVORY|\\\\bE-TAB\\\\b\",\n \"AocTablet\": \"MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712\",\n \"MpmanTablet\": \"MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\\\\bMPG7\\\\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010\",\n \"CelkonTablet\": \"CT695|CT888|CT[\\\\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\\\\bCT-1\\\\b\",\n \"WolderTablet\": \"miTab \\\\b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\\\\b\",\n \"MediacomTablet\": \"M-MPI10C3G|M-SP10EG|M-SP10EGP|M-SP10HXAH|M-SP7HXAH|M-SP10HXBH|M-SP8HXAH|M-SP8MXA\",\n \"MiTablet\": \"\\\\bMI PAD\\\\b|\\\\bHM NOTE 1W\\\\b\",\n \"NibiruTablet\": \"Nibiru M1|Nibiru Jupiter One\",\n \"NexoTablet\": \"NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI\",\n \"LeaderTablet\": \"TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100\",\n \"UbislateTablet\": \"UbiSlate[\\\\s]?7C\",\n \"PocketBookTablet\": \"Pocketbook\",\n \"KocasoTablet\": \"\\\\b(TB-1207)\\\\b\",\n \"HisenseTablet\": \"\\\\b(F5281|E2371)\\\\b\",\n \"Hudl\": \"Hudl HT7S3|Hudl 2\",\n \"TelstraTablet\": \"T-Hub2\",\n \"GenericTablet\": \"Android.*\\\\b97D\\\\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\\\\bA7EB\\\\b|CatNova8|A1_07|CT704|CT1002|\\\\bM721\\\\b|rk30sdk|\\\\bEVOTAB\\\\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\\\\bM6pro\\\\b|CT1020W|arc 10HD|\\\\bTP750\\\\b|\\\\bQTAQZ3\\\\b|WVT101|TM1088|KT107\"\n },\n \"oss\": {\n \"AndroidOS\": \"Android\",\n \"BlackBerryOS\": \"blackberry|\\\\bBB10\\\\b|rim tablet os\",\n \"PalmOS\": \"PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino\",\n \"SymbianOS\": \"Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\\\\bS60\\\\b\",\n \"WindowsMobileOS\": \"Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Windows Mobile|Windows Phone [0-9.]+|WCE;\",\n \"WindowsPhoneOS\": \"Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;\",\n \"iOS\": \"\\\\biPhone.*Mobile|\\\\biPod|\\\\biPad|AppleCoreMedia\",\n \"iPadOS\": \"CPU OS 13\",\n \"MeeGoOS\": \"MeeGo\",\n \"MaemoOS\": \"Maemo\",\n \"JavaOS\": \"J2ME\\/|\\\\bMIDP\\\\b|\\\\bCLDC\\\\b\",\n \"webOS\": \"webOS|hpwOS\",\n \"badaOS\": \"\\\\bBada\\\\b\",\n \"BREWOS\": \"BREW\"\n },\n \"uas\": {\n \"Chrome\": \"\\\\bCrMo\\\\b|CriOS|Android.*Chrome\\/[.0-9]* (Mobile)?\",\n \"Dolfin\": \"\\\\bDolfin\\\\b\",\n \"Opera\": \"Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR\\/[0-9.]+$|Coast\\/[0-9.]+\",\n \"Skyfire\": \"Skyfire\",\n \"Edge\": \"Mobile Safari\\/[.0-9]* Edge\",\n \"IE\": \"IEMobile|MSIEMobile\",\n \"Firefox\": \"fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS\",\n \"Bolt\": \"bolt\",\n \"TeaShark\": \"teashark\",\n \"Blazer\": \"Blazer\",\n \"Safari\": \"Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari\",\n \"WeChat\": \"\\\\bMicroMessenger\\\\b\",\n \"UCBrowser\": \"UC.*Browser|UCWEB\",\n \"baiduboxapp\": \"baiduboxapp\",\n \"baidubrowser\": \"baidubrowser\",\n \"DiigoBrowser\": \"DiigoBrowser\",\n \"Mercury\": \"\\\\bMercury\\\\b\",\n \"ObigoBrowser\": \"Obigo\",\n \"NetFront\": \"NF-Browser\",\n \"GenericBrowser\": \"NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger\",\n \"PaleMoon\": \"Android.*PaleMoon|Mobile.*PaleMoon\"\n },\n \"props\": {\n \"Mobile\": \"Mobile\\/[VER]\",\n \"Build\": \"Build\\/[VER]\",\n \"Version\": \"Version\\/[VER]\",\n \"VendorID\": \"VendorID\\/[VER]\",\n \"iPad\": \"iPad.*CPU[a-z ]+[VER]\",\n \"iPhone\": \"iPhone.*CPU[a-z ]+[VER]\",\n \"iPod\": \"iPod.*CPU[a-z ]+[VER]\",\n \"Kindle\": \"Kindle\\/[VER]\",\n \"Chrome\": [\n \"Chrome\\/[VER]\",\n \"CriOS\\/[VER]\",\n \"CrMo\\/[VER]\"\n ],\n \"Coast\": [\n \"Coast\\/[VER]\"\n ],\n \"Dolfin\": \"Dolfin\\/[VER]\",\n \"Firefox\": [\n \"Firefox\\/[VER]\",\n \"FxiOS\\/[VER]\"\n ],\n \"Fennec\": \"Fennec\\/[VER]\",\n \"Edge\": \"Edge\\/[VER]\",\n \"IE\": [\n \"IEMobile\\/[VER];\",\n \"IEMobile [VER]\",\n \"MSIE [VER];\",\n \"Trident\\/[0-9.]+;.*rv:[VER]\"\n ],\n \"NetFront\": \"NetFront\\/[VER]\",\n \"NokiaBrowser\": \"NokiaBrowser\\/[VER]\",\n \"Opera\": [\n \" OPR\\/[VER]\",\n \"Opera Mini\\/[VER]\",\n \"Version\\/[VER]\"\n ],\n \"Opera Mini\": \"Opera Mini\\/[VER]\",\n \"Opera Mobi\": \"Version\\/[VER]\",\n \"UCBrowser\": [\n \"UCWEB[VER]\",\n \"UC.*Browser\\/[VER]\"\n ],\n \"MQQBrowser\": \"MQQBrowser\\/[VER]\",\n \"MicroMessenger\": \"MicroMessenger\\/[VER]\",\n \"baiduboxapp\": \"baiduboxapp\\/[VER]\",\n \"baidubrowser\": \"baidubrowser\\/[VER]\",\n \"SamsungBrowser\": \"SamsungBrowser\\/[VER]\",\n \"Iron\": \"Iron\\/[VER]\",\n \"Safari\": [\n \"Version\\/[VER]\",\n \"Safari\\/[VER]\"\n ],\n \"Skyfire\": \"Skyfire\\/[VER]\",\n \"Tizen\": \"Tizen\\/[VER]\",\n \"Webkit\": \"webkit[ \\/][VER]\",\n \"PaleMoon\": \"PaleMoon\\/[VER]\",\n \"Gecko\": \"Gecko\\/[VER]\",\n \"Trident\": \"Trident\\/[VER]\",\n \"Presto\": \"Presto\\/[VER]\",\n \"Goanna\": \"Goanna\\/[VER]\",\n \"iOS\": \" \\\\bi?OS\\\\b [VER][ ;]{1}\",\n \"Android\": \"Android [VER]\",\n \"BlackBerry\": [\n \"BlackBerry[\\\\w]+\\/[VER]\",\n \"BlackBerry.*Version\\/[VER]\",\n \"Version\\/[VER]\"\n ],\n \"BREW\": \"BREW [VER]\",\n \"Java\": \"Java\\/[VER]\",\n \"Windows Phone OS\": [\n \"Windows Phone OS [VER]\",\n \"Windows Phone [VER]\"\n ],\n \"Windows Phone\": \"Windows Phone [VER]\",\n \"Windows CE\": \"Windows CE\\/[VER]\",\n \"Windows NT\": \"Windows NT [VER]\",\n \"Symbian\": [\n \"SymbianOS\\/[VER]\",\n \"Symbian\\/[VER]\"\n ],\n \"webOS\": [\n \"webOS\\/[VER]\",\n \"hpwOS\\/[VER];\"\n ]\n },\n \"utils\": {\n \"Bot\": \"Googlebot|facebookexternalhit|Google-AMPHTML|s~amp-validator|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom|contentkingapp\",\n \"MobileBot\": \"Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker\\/M1A1-R2D2\",\n \"DesktopMode\": \"WPDesktop\",\n \"TV\": \"SonyDTV|HbbTV\",\n \"WebKit\": \"(webkit)[ \\/]([\\\\w.]+)\",\n \"Console\": \"\\\\b(Nintendo|Nintendo WiiU|Nintendo 3DS|Nintendo Switch|PLAYSTATION|Xbox)\\\\b\",\n \"Watch\": \"SM-V700\"\n }\n};\n\n // following patterns come from http://detectmobilebrowsers.com/\n impl.detectMobileBrowsers = {\n fullPattern: /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,\n shortPattern: /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i,\n tabletPattern: /android|ipad|playbook|silk/i\n };\n\n var hasOwnProp = Object.prototype.hasOwnProperty,\n isArray;\n\n impl.FALLBACK_PHONE = 'UnknownPhone';\n impl.FALLBACK_TABLET = 'UnknownTablet';\n impl.FALLBACK_MOBILE = 'UnknownMobile';\n\n isArray = ('isArray' in Array) ?\n Array.isArray : function (value) { return Object.prototype.toString.call(value) === '[object Array]'; };\n\n function equalIC(a, b) {\n return a != null && b != null && a.toLowerCase() === b.toLowerCase();\n }\n\n function containsIC(array, value) {\n var valueLC, i, len = array.length;\n if (!len || !value) {\n return false;\n }\n valueLC = value.toLowerCase();\n for (i = 0; i < len; ++i) {\n if (valueLC === array[i].toLowerCase()) {\n return true;\n }\n }\n return false;\n }\n\n function convertPropsToRegExp(object) {\n for (var key in object) {\n if (hasOwnProp.call(object, key)) {\n object[key] = new RegExp(object[key], 'i');\n }\n }\n }\n\n function prepareUserAgent(userAgent) {\n return (userAgent || '').substr(0, 500); // mitigate vulnerable to ReDoS\n }\n\n (function init() {\n var key, values, value, i, len, verPos, mobileDetectRules = impl.mobileDetectRules;\n for (key in mobileDetectRules.props) {\n if (hasOwnProp.call(mobileDetectRules.props, key)) {\n values = mobileDetectRules.props[key];\n if (!isArray(values)) {\n values = [values];\n }\n len = values.length;\n for (i = 0; i < len; ++i) {\n value = values[i];\n verPos = value.indexOf('[VER]');\n if (verPos >= 0) {\n value = value.substring(0, verPos) + '([\\\\w._\\\\+]+)' + value.substring(verPos + 5);\n }\n values[i] = new RegExp(value, 'i');\n }\n mobileDetectRules.props[key] = values;\n }\n }\n convertPropsToRegExp(mobileDetectRules.oss);\n convertPropsToRegExp(mobileDetectRules.phones);\n convertPropsToRegExp(mobileDetectRules.tablets);\n convertPropsToRegExp(mobileDetectRules.uas);\n convertPropsToRegExp(mobileDetectRules.utils);\n\n // copy some patterns to oss0 which are tested first (see issue#15)\n mobileDetectRules.oss0 = {\n WindowsPhoneOS: mobileDetectRules.oss.WindowsPhoneOS,\n WindowsMobileOS: mobileDetectRules.oss.WindowsMobileOS\n };\n }());\n\n /**\n * Test userAgent string against a set of rules and find the first matched key.\n * @param {Object} rules (key is String, value is RegExp)\n * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n * @returns {String|null} the matched key if found, otherwise null\n * @private\n */\n impl.findMatch = function(rules, userAgent) {\n for (var key in rules) {\n if (hasOwnProp.call(rules, key)) {\n if (rules[key].test(userAgent)) {\n return key;\n }\n }\n }\n return null;\n };\n\n /**\n * Test userAgent string against a set of rules and return an array of matched keys.\n * @param {Object} rules (key is String, value is RegExp)\n * @param {String} userAgent the navigator.userAgent (or HTTP-Header 'User-Agent').\n * @returns {Array} an array of matched keys, may be empty when there is no match, but not null\n * @private\n */\n impl.findMatches = function(rules, userAgent) {\n var result = [];\n for (var key in rules) {\n if (hasOwnProp.call(rules, key)) {\n if (rules[key].test(userAgent)) {\n result.push(key);\n }\n }\n }\n return result;\n };\n\n /**\n * Check the version of the given property in the User-Agent.\n *\n * @param {String} propertyName\n * @param {String} userAgent\n * @return {String} version or null if version not found\n * @private\n */\n impl.getVersionStr = function (propertyName, userAgent) {\n var props = impl.mobileDetectRules.props, patterns, i, len, match;\n if (hasOwnProp.call(props, propertyName)) {\n patterns = props[propertyName];\n len = patterns.length;\n for (i = 0; i < len; ++i) {\n match = patterns[i].exec(userAgent);\n if (match !== null) {\n return match[1];\n }\n }\n }\n return null;\n };\n\n /**\n * Check the version of the given property in the User-Agent.\n * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n *\n * @param {String} propertyName\n * @param {String} userAgent\n * @return {Number} version or NaN if version not found\n * @private\n */\n impl.getVersion = function (propertyName, userAgent) {\n var version = impl.getVersionStr(propertyName, userAgent);\n return version ? impl.prepareVersionNo(version) : NaN;\n };\n\n /**\n * Prepare the version number.\n *\n * @param {String} version\n * @return {Number} the version number as a floating number\n * @private\n */\n impl.prepareVersionNo = function (version) {\n var numbers;\n\n numbers = version.split(/[a-z._ \\/\\-]/i);\n if (numbers.length === 1) {\n version = numbers[0];\n }\n if (numbers.length > 1) {\n version = numbers[0] + '.';\n numbers.shift();\n version += numbers.join('');\n }\n return Number(version);\n };\n\n impl.isMobileFallback = function (userAgent) {\n return impl.detectMobileBrowsers.fullPattern.test(userAgent) ||\n impl.detectMobileBrowsers.shortPattern.test(userAgent.substr(0,4));\n };\n\n impl.isTabletFallback = function (userAgent) {\n return impl.detectMobileBrowsers.tabletPattern.test(userAgent);\n };\n\n impl.prepareDetectionCache = function (cache, userAgent, maxPhoneWidth) {\n if (cache.mobile !== undefined) {\n return;\n }\n var phone, tablet, phoneSized;\n\n // first check for stronger tablet rules, then phone (see issue#5)\n tablet = impl.findMatch(impl.mobileDetectRules.tablets, userAgent);\n if (tablet) {\n cache.mobile = cache.tablet = tablet;\n cache.phone = null;\n return; // unambiguously identified as tablet\n }\n\n phone = impl.findMatch(impl.mobileDetectRules.phones, userAgent);\n if (phone) {\n cache.mobile = cache.phone = phone;\n cache.tablet = null;\n return; // unambiguously identified as phone\n }\n\n // our rules haven't found a match -> try more general fallback rules\n if (impl.isMobileFallback(userAgent)) {\n phoneSized = MobileDetect.isPhoneSized(maxPhoneWidth);\n if (phoneSized === undefined) {\n cache.mobile = impl.FALLBACK_MOBILE;\n cache.tablet = cache.phone = null;\n } else if (phoneSized) {\n cache.mobile = cache.phone = impl.FALLBACK_PHONE;\n cache.tablet = null;\n } else {\n cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n cache.phone = null;\n }\n } else if (impl.isTabletFallback(userAgent)) {\n cache.mobile = cache.tablet = impl.FALLBACK_TABLET;\n cache.phone = null;\n } else {\n // not mobile at all!\n cache.mobile = cache.tablet = cache.phone = null;\n }\n };\n\n // t is a reference to a MobileDetect instance\n impl.mobileGrade = function (t) {\n // impl note:\n // To keep in sync w/ Mobile_Detect.php easily, the following code is tightly aligned to the PHP version.\n // When changes are made in Mobile_Detect.php, copy this method and replace:\n // $this-> / t.\n // self::MOBILE_GRADE_(.) / '$1'\n // , self::VERSION_TYPE_FLOAT / (nothing)\n // isIOS() / os('iOS')\n // [reg] / (nothing) <-- jsdelivr complaining about unescaped unicode character U+00AE\n var $isMobile = t.mobile() !== null;\n\n if (\n // Apple iOS 3.2-5.1 - Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3), iPad 3 (5.1), original iPhone (3.1), iPhone 3 (3.2), 3GS (4.3), 4 (4.3 / 5.0), and 4S (5.1)\n t.os('iOS') && t.version('iPad')>=4.3 ||\n t.os('iOS') && t.version('iPhone')>=3.1 ||\n t.os('iOS') && t.version('iPod')>=3.1 ||\n\n // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5)\n // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM\n // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices\n // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7\n ( t.version('Android')>2.1 && t.is('Webkit') ) ||\n\n // Windows Phone 7-7.5 - Tested on the HTC Surround (7.0) HTC Trophy (7.5), LG-E900 (7.5), Nokia Lumia 800\n t.version('Windows Phone OS')>=7.0 ||\n\n // Blackberry 7 - Tested on BlackBerry Torch 9810\n // Blackberry 6.0 - Tested on the Torch 9800 and Style 9670\n t.is('BlackBerry') && t.version('BlackBerry')>=6.0 ||\n // Blackberry Playbook (1.0-2.0) - Tested on PlayBook\n t.match('Playbook.*Tablet') ||\n\n // Palm WebOS (1.4-2.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0)\n ( t.version('webOS')>=1.4 && t.match('Palm|Pre|Pixi') ) ||\n // Palm WebOS 3.0 - Tested on HP TouchPad\n t.match('hp.*TouchPad') ||\n\n // Firefox Mobile (12 Beta) - Tested on Android 2.3 device\n ( t.is('Firefox') && t.version('Firefox')>=12 ) ||\n\n // Chrome for Android - Tested on Android 4.0, 4.1 device\n ( t.is('Chrome') && t.is('AndroidOS') && t.version('Android')>=4.0 ) ||\n\n // Skyfire 4.1 - Tested on Android 2.3 device\n ( t.is('Skyfire') && t.version('Skyfire')>=4.1 && t.is('AndroidOS') && t.version('Android')>=2.3 ) ||\n\n // Opera Mobile 11.5-12: Tested on Android 2.3\n ( t.is('Opera') && t.version('Opera Mobi')>11 && t.is('AndroidOS') ) ||\n\n // Meego 1.2 - Tested on Nokia 950 and N9\n t.is('MeeGoOS') ||\n\n // Tizen (pre-release) - Tested on early hardware\n t.is('Tizen') ||\n\n // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser\n // @todo: more tests here!\n t.is('Dolfin') && t.version('Bada')>=2.0 ||\n\n // UC Browser - Tested on Android 2.3 device\n ( (t.is('UC Browser') || t.is('Dolfin')) && t.version('Android')>=2.3 ) ||\n\n // Kindle 3 and Fire - Tested on the built-in WebKit browser for each\n ( t.match('Kindle Fire') ||\n t.is('Kindle') && t.version('Kindle')>=3.0 ) ||\n\n // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet\n t.is('AndroidOS') && t.is('NookTablet') ||\n\n // Chrome Desktop 11-21 - Tested on OS X 10.7 and Windows 7\n t.version('Chrome')>=11 && !$isMobile ||\n\n // Safari Desktop 4-5 - Tested on OS X 10.7 and Windows 7\n t.version('Safari')>=5.0 && !$isMobile ||\n\n // Firefox Desktop 4-13 - Tested on OS X 10.7 and Windows 7\n t.version('Firefox')>=4.0 && !$isMobile ||\n\n // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7\n t.version('MSIE')>=7.0 && !$isMobile ||\n\n // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7\n // @reference: http://my.opera.com/community/openweb/idopera/\n t.version('Opera')>=10 && !$isMobile\n\n ){\n return 'A';\n }\n\n if (\n t.os('iOS') && t.version('iPad')<4.3 ||\n t.os('iOS') && t.version('iPhone')<3.1 ||\n t.os('iOS') && t.version('iPod')<3.1 ||\n\n // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770\n t.is('Blackberry') && t.version('BlackBerry')>=5 && t.version('BlackBerry')<6 ||\n\n //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3\n ( t.version('Opera Mini')>=5.0 && t.version('Opera Mini')<=6.5 &&\n (t.version('Android')>=2.3 || t.is('iOS')) ) ||\n\n // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1)\n t.match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') ||\n\n // @todo: report this (tested on Nokia N71)\n t.version('Opera Mobi')>=11 && t.is('SymbianOS')\n ){\n return 'B';\n }\n\n if (\n // Blackberry 4.x - Tested on the Curve 8330\n t.version('BlackBerry')<5.0 ||\n // Windows Mobile - Tested on the HTC Leo (WinMo 5.2)\n t.match('MSIEMobile|Windows CE.*Mobile') || t.version('Windows Mobile')<=5.2\n\n ){\n return 'C';\n }\n\n //All older smartphone platforms and featurephones - Any device that doesn't support media queries\n //will receive the basic, C grade experience.\n return 'C';\n };\n\n impl.detectOS = function (ua) {\n return impl.findMatch(impl.mobileDetectRules.oss0, ua) ||\n impl.findMatch(impl.mobileDetectRules.oss, ua);\n };\n\n impl.getDeviceSmallerSide = function () {\n return window.screen.width < window.screen.height ?\n window.screen.width :\n window.screen.height;\n };\n\n /**\n * Constructor for MobileDetect object.\n *
\n * Such an object will keep a reference to the given user-agent string and cache most of the detect queries.
\n *
\n * Find information how to download and install:\n * github.com/hgoebl/mobile-detect.js/\n *
\n *\n * @example
\n     *     var md = new MobileDetect(window.navigator.userAgent);\n     *     if (md.mobile()) {\n     *         location.href = (md.mobileGrade() === 'A') ? '/mobile/' : '/lynx/';\n     *     }\n     * 
\n *\n * @param {string} userAgent typically taken from window.navigator.userAgent or http_header['User-Agent']\n * @param {number} [maxPhoneWidth=600] only for browsers specify a value for the maximum\n * width of smallest device side (in logical \"CSS\" pixels) until a device detected as mobile will be handled\n * as phone.\n * This is only used in cases where the device cannot be classified as phone or tablet.
\n * See Declaring Tablet Layouts\n * for Android.
\n * If you provide a value < 0, then this \"fuzzy\" check is disabled.\n * @constructor\n * @global\n */\n function MobileDetect(userAgent, maxPhoneWidth) {\n this.ua = prepareUserAgent(userAgent);\n this._cache = {};\n //600dp is typical 7\" tablet minimum width\n this.maxPhoneWidth = maxPhoneWidth || 600;\n }\n\n MobileDetect.prototype = {\n constructor: MobileDetect,\n\n /**\n * Returns the detected phone or tablet type or null if it is not a mobile device.\n *
\n * For a list of possible return values see {@link MobileDetect#phone} and {@link MobileDetect#tablet}.
\n *
\n * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n * the patterns of detectmobilebrowsers.com. If this test\n * is positive, a value of UnknownPhone, UnknownTablet or\n * UnknownMobile is returned.
\n * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
\n *
\n * When used server-side (node.js), there is no way to tell the difference between UnknownTablet\n * and UnknownMobile, so you will get UnknownMobile here.
\n * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for:\n * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use.\n *
\n * In most cases you will use the return value just as a boolean.\n *\n * @returns {String} the key for the phone family or tablet family, e.g. \"Nexus\".\n * @function MobileDetect#mobile\n */\n mobile: function () {\n impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n return this._cache.mobile;\n },\n\n /**\n * Returns the detected phone type/family string or null.\n *
\n * The returned tablet (family or producer) is one of following keys:
\n *
iPhone, BlackBerry, HTC, Nexus, Dell, Motorola, Samsung, LG, Sony, Asus,\n * NokiaLumia, Micromax, Palm, Vertu, Pantech, Fly, Wiko, iMobile, SimValley,\n * Wolfgang, Alcatel, Nintendo, Amoi, INQ, OnePlus, GenericPhone
\n *
\n * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n * the patterns of detectmobilebrowsers.com. If this test\n * is positive, a value of UnknownPhone or UnknownMobile is returned.
\n * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
\n *
\n * When used server-side (node.js), there is no way to tell the difference between UnknownTablet\n * and UnknownMobile, so you will get null here, while {@link MobileDetect#mobile}\n * will return UnknownMobile.
\n * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for:\n * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use.\n *
\n * In most cases you will use the return value just as a boolean.\n *\n * @returns {String} the key of the phone family or producer, e.g. \"iPhone\"\n * @function MobileDetect#phone\n */\n phone: function () {\n impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n return this._cache.phone;\n },\n\n /**\n * Returns the detected tablet type/family string or null.\n *
\n * The returned tablet (family or producer) is one of following keys:
\n *
iPad, NexusTablet, GoogleTablet, SamsungTablet, Kindle, SurfaceTablet,\n * HPTablet, AsusTablet, BlackBerryTablet, HTCtablet, MotorolaTablet, NookTablet,\n * AcerTablet, ToshibaTablet, LGTablet, FujitsuTablet, PrestigioTablet,\n * LenovoTablet, DellTablet, YarvikTablet, MedionTablet, ArnovaTablet,\n * IntensoTablet, IRUTablet, MegafonTablet, EbodaTablet, AllViewTablet,\n * ArchosTablet, AinolTablet, NokiaLumiaTablet, SonyTablet, PhilipsTablet,\n * CubeTablet, CobyTablet, MIDTablet, MSITablet, SMiTTablet, RockChipTablet,\n * FlyTablet, bqTablet, HuaweiTablet, NecTablet, PantechTablet, BronchoTablet,\n * VersusTablet, ZyncTablet, PositivoTablet, NabiTablet, KoboTablet, DanewTablet,\n * TexetTablet, PlaystationTablet, TrekstorTablet, PyleAudioTablet, AdvanTablet,\n * DanyTechTablet, GalapadTablet, MicromaxTablet, KarbonnTablet, AllFineTablet,\n * PROSCANTablet, YONESTablet, ChangJiaTablet, GUTablet, PointOfViewTablet,\n * OvermaxTablet, HCLTablet, DPSTablet, VistureTablet, CrestaTablet,\n * MediatekTablet, ConcordeTablet, GoCleverTablet, ModecomTablet, VoninoTablet,\n * ECSTablet, StorexTablet, VodafoneTablet, EssentielBTablet, RossMoorTablet,\n * iMobileTablet, TolinoTablet, AudioSonicTablet, AMPETablet, SkkTablet,\n * TecnoTablet, JXDTablet, iJoyTablet, FX2Tablet, XoroTablet, ViewsonicTablet,\n * VerizonTablet, OdysTablet, CaptivaTablet, IconbitTablet, TeclastTablet,\n * OndaTablet, JaytechTablet, BlaupunktTablet, DigmaTablet, EvolioTablet,\n * LavaTablet, AocTablet, MpmanTablet, CelkonTablet, WolderTablet, MediacomTablet,\n * MiTablet, NibiruTablet, NexoTablet, LeaderTablet, UbislateTablet,\n * PocketBookTablet, KocasoTablet, HisenseTablet, Hudl, TelstraTablet,\n * GenericTablet
\n *
\n * If the device is not detected by the regular expressions from Mobile-Detect, a test is made against\n * the patterns of detectmobilebrowsers.com. If this test\n * is positive, a value of UnknownTablet or UnknownMobile is returned.
\n * When used in browser, the decision whether phone or tablet is made based on screen.width/height.
\n *
\n * When used server-side (node.js), there is no way to tell the difference between UnknownTablet\n * and UnknownMobile, so you will get null here, while {@link MobileDetect#mobile}\n * will return UnknownMobile.
\n * Be aware that since v1.0.0 in this special case you will get UnknownMobile only for:\n * {@link MobileDetect#mobile}, not for {@link MobileDetect#phone} and {@link MobileDetect#tablet}.\n * In versions before v1.0.0 all 3 methods returned UnknownMobile which was tedious to use.\n *
\n * In most cases you will use the return value just as a boolean.\n *\n * @returns {String} the key of the tablet family or producer, e.g. \"SamsungTablet\"\n * @function MobileDetect#tablet\n */\n tablet: function () {\n impl.prepareDetectionCache(this._cache, this.ua, this.maxPhoneWidth);\n return this._cache.tablet;\n },\n\n /**\n * Returns the (first) detected user-agent string or null.\n *
\n * The returned user-agent is one of following keys:
\n *
Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n * Safari, WeChat, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Mercury,\n * ObigoBrowser, NetFront, GenericBrowser, PaleMoon
\n *
\n * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n * cases where a mobile device pretends to be more than one particular browser. You can get the\n * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n *\n * @returns {String} the key for the detected user-agent or null\n * @function MobileDetect#userAgent\n */\n userAgent: function () {\n if (this._cache.userAgent === undefined) {\n this._cache.userAgent = impl.findMatch(impl.mobileDetectRules.uas, this.ua);\n }\n return this._cache.userAgent;\n },\n\n /**\n * Returns all detected user-agent strings.\n *
\n * The array is empty or contains one or more of following keys:
\n *
Chrome, Dolfin, Opera, Skyfire, Edge, IE, Firefox, Bolt, TeaShark, Blazer,\n * Safari, WeChat, UCBrowser, baiduboxapp, baidubrowser, DiigoBrowser, Mercury,\n * ObigoBrowser, NetFront, GenericBrowser, PaleMoon
\n *
\n * In most cases calling {@link MobileDetect#userAgent} will be sufficient. But there are rare\n * cases where a mobile device pretends to be more than one particular browser. You can get the\n * list of all matches with {@link MobileDetect#userAgents} or check for a particular value by\n * providing one of the defined keys as first argument to {@link MobileDetect#is}.\n *\n * @returns {Array} the array of detected user-agent keys or []\n * @function MobileDetect#userAgents\n */\n userAgents: function () {\n if (this._cache.userAgents === undefined) {\n this._cache.userAgents = impl.findMatches(impl.mobileDetectRules.uas, this.ua);\n }\n return this._cache.userAgents;\n },\n\n /**\n * Returns the detected operating system string or null.\n *
\n * The operating system is one of following keys:
\n *
AndroidOS, BlackBerryOS, PalmOS, SymbianOS, WindowsMobileOS, WindowsPhoneOS,\n * iOS, iPadOS, MeeGoOS, MaemoOS, JavaOS, webOS, badaOS, BREWOS
\n *\n * @returns {String} the key for the detected operating system.\n * @function MobileDetect#os\n */\n os: function () {\n if (this._cache.os === undefined) {\n this._cache.os = impl.detectOS(this.ua);\n }\n return this._cache.os;\n },\n\n /**\n * Get the version (as Number) of the given property in the User-Agent.\n *
\n * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31)\n *\n * @param {String} key a key defining a thing which has a version.
\n * You can use one of following keys:
\n *
Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n * Opera Mobi, UCBrowser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon, Gecko, Trident,\n * Presto, Goanna, iOS, Android, BlackBerry, BREW, Java, Windows Phone OS, Windows\n * Phone, Windows CE, Windows NT, Symbian, webOS
\n *\n * @returns {Number} the version as float or NaN if User-Agent doesn't contain this version.\n * Be careful when comparing this value with '==' operator!\n * @function MobileDetect#version\n */\n version: function (key) {\n return impl.getVersion(key, this.ua);\n },\n\n /**\n * Get the version (as String) of the given property in the User-Agent.\n *
\n *\n * @param {String} key a key defining a thing which has a version.
\n * You can use one of following keys:
\n *
Mobile, Build, Version, VendorID, iPad, iPhone, iPod, Kindle, Chrome, Coast,\n * Dolfin, Firefox, Fennec, Edge, IE, NetFront, NokiaBrowser, Opera, Opera Mini,\n * Opera Mobi, UCBrowser, MQQBrowser, MicroMessenger, baiduboxapp, baidubrowser,\n * SamsungBrowser, Iron, Safari, Skyfire, Tizen, Webkit, PaleMoon, Gecko, Trident,\n * Presto, Goanna, iOS, Android, BlackBerry, BREW, Java, Windows Phone OS, Windows\n * Phone, Windows CE, Windows NT, Symbian, webOS
\n *\n * @returns {String} the \"raw\" version as String or null if User-Agent doesn't contain this version.\n *\n * @function MobileDetect#versionStr\n */\n versionStr: function (key) {\n return impl.getVersionStr(key, this.ua);\n },\n\n /**\n * Global test key against userAgent, os, phone, tablet and some other properties of userAgent string.\n *\n * @param {String} key the key (case-insensitive) of a userAgent, an operating system, phone or\n * tablet family.
\n * For a complete list of possible values, see {@link MobileDetect#userAgent},\n * {@link MobileDetect#os}, {@link MobileDetect#phone}, {@link MobileDetect#tablet}.
\n * Additionally you have following keys:
\n *
Bot, MobileBot, DesktopMode, TV, WebKit, Console, Watch
\n *\n * @returns {boolean} true when the given key is one of the defined keys of userAgent, os, phone,\n * tablet or one of the listed additional keys, otherwise false\n * @function MobileDetect#is\n */\n is: function (key) {\n return containsIC(this.userAgents(), key) ||\n equalIC(key, this.os()) ||\n equalIC(key, this.phone()) ||\n equalIC(key, this.tablet()) ||\n containsIC(impl.findMatches(impl.mobileDetectRules.utils, this.ua), key);\n },\n\n /**\n * Do a quick test against navigator::userAgent.\n *\n * @param {String|RegExp} pattern the pattern, either as String or RegExp\n * (a string will be converted to a case-insensitive RegExp).\n * @returns {boolean} true when the pattern matches, otherwise false\n * @function MobileDetect#match\n */\n match: function (pattern) {\n if (!(pattern instanceof RegExp)) {\n pattern = new RegExp(pattern, 'i');\n }\n return pattern.test(this.ua);\n },\n\n /**\n * Checks whether the mobile device can be considered as phone regarding screen.width.\n *
\n * Obviously this method makes sense in browser environments only (not for Node.js)!\n * @param {number} [maxPhoneWidth] the maximum logical pixels (aka. CSS-pixels) to be considered as phone.
\n * The argument is optional and if not present or falsy, the value of the constructor is taken.\n * @returns {boolean|undefined} undefined if screen size wasn't detectable, else true\n * when screen.width is less or equal to maxPhoneWidth, otherwise false.
\n * Will always return undefined server-side.\n */\n isPhoneSized: function (maxPhoneWidth) {\n return MobileDetect.isPhoneSized(maxPhoneWidth || this.maxPhoneWidth);\n },\n\n /**\n * Returns the mobile grade ('A', 'B', 'C').\n *\n * @returns {String} one of the mobile grades ('A', 'B', 'C').\n * @function MobileDetect#mobileGrade\n */\n mobileGrade: function () {\n if (this._cache.grade === undefined) {\n this._cache.grade = impl.mobileGrade(this);\n }\n return this._cache.grade;\n }\n };\n\n // environment-dependent\n if (typeof window !== 'undefined' && window.screen) {\n MobileDetect.isPhoneSized = function (maxPhoneWidth) {\n return maxPhoneWidth < 0 ? undefined : impl.getDeviceSmallerSide() <= maxPhoneWidth;\n };\n } else {\n MobileDetect.isPhoneSized = function () {};\n }\n\n // should not be replaced by a completely new object - just overwrite existing methods\n MobileDetect._impl = impl;\n \n MobileDetect.version = '1.4.4 2019-09-21';\n\n return MobileDetect;\n}); // end of call of define()\n})((function (undefined) {\n if (typeof module !== 'undefined' && module.exports) {\n return function (factory) { module.exports = factory(); };\n } else if (typeof define === 'function' && define.amd) {\n return define;\n } else if (typeof window !== 'undefined') {\n return function (factory) { window.MobileDetect = factory(); };\n } else {\n // please file a bug if you get this error!\n throw new Error('unknown environment');\n }\n})());","var MapboxInspect = require('./lib/MapboxInspect');\nmodule.exports = MapboxInspect;\n","var randomColor = require('randomcolor');\n\n/**\n * Assign a color to a unique layer ID and also considering\n * common layer names such as water or wood.\n * @param {string} layerId\n * @return {string} Unique random for the layer ID\n */\nfunction brightColor(layerId, alpha) {\n var luminosity = 'bright';\n var hue = null;\n\n if (/water|ocean|lake|sea|river/.test(layerId)) {\n hue = 'blue';\n }\n\n if (/state|country|place/.test(layerId)) {\n hue = 'pink';\n }\n\n if (/road|highway|transport/.test(layerId)) {\n hue = 'orange';\n }\n\n if (/contour|building/.test(layerId)) {\n hue = 'monochrome';\n }\n\n if (/building/.test(layerId)) {\n luminosity = 'dark';\n }\n\n if (/contour|landuse/.test(layerId)) {\n hue = 'yellow';\n }\n\n if (/wood|forest|park|landcover/.test(layerId)) {\n hue = 'green';\n }\n\n var rgb = randomColor({\n luminosity: luminosity,\n hue: hue,\n seed: layerId,\n format: 'rgbArray'\n });\n\n var rgba = rgb.concat([alpha || 1]);\n return 'rgba(' + rgba.join(', ') + ')';\n}\n\nexports.brightColor = brightColor;\n","var stylegen = require('./stylegen');\nvar InspectButton = require('./InspectButton');\nvar isEqual = require('lodash.isequal');\nvar renderPopup = require('./renderPopup');\nvar colors = require('./colors');\n\nfunction isInspectStyle(style) {\n return style.metadata && style.metadata['mapbox-gl-inspect:inspect'];\n}\n\nfunction markInspectStyle(style) {\n return Object.assign(style, {\n metadata: Object.assign({}, style.metadata, {\n 'mapbox-gl-inspect:inspect': true\n })\n });\n}\n\nfunction fixRasterSource(source) {\n if (\n (source.type === 'raster' || source.type === 'raster-dem') &&\n source.tileSize && source.tiles\n ) {\n return {\n type: source.type,\n tileSize: source.tileSize,\n tiles: source.tiles\n };\n }\n if (\n (source.type === 'raster' || source.type === 'raster-dem') &&\n source.url\n ) {\n return {\n type: source.type,\n url: source.url\n };\n }\n return source;\n}\n\n//TODO: We can remove this at some point in the future\nfunction fixStyle(style) {\n Object.keys(style.sources).forEach(function (sourceId) {\n style.sources[sourceId] = fixRasterSource(style.sources[sourceId]);\n });\n return style;\n}\n\nfunction notifyVersion(mapboxgl) {\n var versions = mapboxgl.version.split('.').map(parseFloat);\n if (versions[0] < 1 && versions[1] < 29) {\n console.error('MapboxInspect only supports Mapbox GL JS >= v0.29.0. Please upgrade your Mapbox GL JS version.');\n }\n}\n\nfunction MapboxInspect(options) {\n if (!(this instanceof MapboxInspect)) {\n throw new Error('MapboxInspect needs to be called with the new keyword');\n }\n\n var popup = null;\n if (window.mapboxgl) {\n notifyVersion(window.mapboxgl);\n popup = new window.mapboxgl.Popup({\n closeButton: false,\n closeOnClick: false\n });\n } else if (!options.popup) {\n console.error('Mapbox GL JS can not be found. Make sure to include it or pass an initialized MapboxGL Popup to MapboxInspect if you are using moduleis.');\n }\n\n this.options = Object.assign({\n showInspectMap: false,\n showInspectButton: true,\n showInspectMapPopup: true,\n showMapPopup: false,\n showMapPopupOnHover: true,\n showInspectMapPopupOnHover: true,\n blockHoverPopupOnClick: false,\n backgroundColor: '#fff',\n assignLayerColor: colors.brightColor,\n buildInspectStyle: stylegen.generateInspectStyle,\n renderPopup: renderPopup,\n popup: popup,\n selectThreshold: 5,\n useInspectStyle: true,\n queryParameters: {},\n sources: {}\n }, options);\n\n this.sources = this.options.sources;\n this.assignLayerColor = this.options.assignLayerColor;\n this.toggleInspector = this.toggleInspector.bind(this);\n this._popup = this.options.popup;\n this._popupBlocked = false;\n this._showInspectMap = this.options.showInspectMap;\n this._onSourceChange = this._onSourceChange.bind(this);\n this._onMousemove = this._onMousemove.bind(this);\n this._onStyleChange = this._onStyleChange.bind(this);\n\n this._originalStyle = null;\n this._toggle = new InspectButton({\n show: this.options.showInspectButton,\n onToggle: this.toggleInspector.bind(this)\n });\n}\n\nMapboxInspect.prototype.toggleInspector = function () {\n this._showInspectMap = !this._showInspectMap;\n this.render();\n};\n\nMapboxInspect.prototype._inspectStyle = function () {\n var coloredLayers = stylegen.generateColoredLayers(this.sources, this.assignLayerColor);\n return this.options.buildInspectStyle(this._map.getStyle(), coloredLayers, {\n backgroundColor: this.options.backgroundColor\n });\n};\n\nMapboxInspect.prototype.render = function () {\n if (this._showInspectMap) {\n if (this.options.useInspectStyle) {\n this._map.setStyle(fixStyle(markInspectStyle(this._inspectStyle())));\n }\n this._toggle.setMapIcon();\n } else if (this._originalStyle) {\n if (this._popup) this._popup.remove();\n if (this.options.useInspectStyle) {\n this._map.setStyle(fixStyle(this._originalStyle));\n }\n this._toggle.setInspectIcon();\n }\n};\n\nMapboxInspect.prototype._onSourceChange = function () {\n var sources = this.sources;\n var map = this._map;\n var mapStyle = map.getStyle();\n var mapStyleSourcesNames = Object.keys(mapStyle.sources);\n var previousSources = Object.assign({}, sources);\n\n //NOTE: This heavily depends on the internal API of Mapbox GL\n //so this breaks between Mapbox GL JS releases\n Object.keys(map.style.sourceCaches).forEach(function (sourceId) {\n var sourceCache = map.style.sourceCaches[sourceId] || {_source: {}};\n var layerIds = sourceCache._source.vectorLayerIds;\n if (layerIds) {\n sources[sourceId] = layerIds;\n } else if (sourceCache._source.type === 'geojson') {\n sources[sourceId] = [];\n }\n });\n\n Object.keys(sources).forEach(function (sourceId) {\n if (mapStyleSourcesNames.indexOf(sourceId) === -1) {\n delete sources[sourceId];\n }\n });\n\n if (!isEqual(previousSources, sources) && Object.keys(sources).length > 0) {\n this.render();\n }\n};\n\nMapboxInspect.prototype._onStyleChange = function () {\n var style = this._map.getStyle();\n if (!isInspectStyle(style)) {\n this._originalStyle = style;\n }\n};\n\nMapboxInspect.prototype._onMousemove = function (e) {\n var queryBox;\n if (this.options.selectThreshold === 0) {\n queryBox = e.point;\n } else {\n // set a bbox around the pointer\n queryBox = [\n [\n e.point.x - this.options.selectThreshold,\n e.point.y + this.options.selectThreshold\n ], // bottom left (SW)\n [\n e.point.x + this.options.selectThreshold,\n e.point.y - this.options.selectThreshold\n ] // top right (NE)\n ];\n }\n\n var features = this._map.queryRenderedFeatures(queryBox, this.options.queryParameters) || [];\n this._map.getCanvas().style.cursor = (features.length) ? 'pointer' : '';\n\n if (this._showInspectMap) {\n if (!this.options.showInspectMapPopup) return;\n if (e.type === 'mousemove' && !this.options.showInspectMapPopupOnHover) return;\n if (e.type === 'click' && this.options.showInspectMapPopupOnHover && this.options.blockHoverPopupOnClick) {\n this._popupBlocked = !this._popupBlocked;\n }\n } else {\n if (!this.options.showMapPopup) return;\n if (e.type === 'mousemove' && !this.options.showMapPopupOnHover) return;\n if (e.type === 'click' && this.options.showMapPopupOnHover && this.options.blockHoverPopupOnClick) {\n this._popupBlocked = !this._popupBlocked;\n }\n }\n\n if (!this._popupBlocked && this._popup) {\n if (!features.length) {\n this._popup.remove();\n } else {\n this._popup.setLngLat(e.lngLat);\n\n var type = typeof this.options.renderPopup(features);\n\n if (type === 'string') {\n this._popup.setHTML(this.options.renderPopup(features));\n } else {\n this._popup.setDOMContent(this.options.renderPopup(features));\n }\n\n this._popup.addTo(this._map);\n }\n }\n};\n\nMapboxInspect.prototype.onAdd = function (map) {\n this._map = map;\n\n // if sources have already been passed as options\n // we do not need to figure out the sources ourselves\n if (Object.keys(this.sources).length === 0) {\n map.on('tiledata', this._onSourceChange);\n map.on('sourcedata', this._onSourceChange);\n }\n\n map.on('styledata', this._onStyleChange);\n map.on('load', this._onStyleChange);\n map.on('mousemove', this._onMousemove);\n map.on('click', this._onMousemove);\n return this._toggle.elem;\n};\n\nMapboxInspect.prototype.onRemove = function () {\n this._map.off('styledata', this._onStyleChange);\n this._map.off('load', this._onStyleChange);\n this._map.off('tiledata', this._onSourceChange);\n this._map.off('sourcedata', this._onSourceChange);\n this._map.off('mousemove', this._onMousemove);\n this._map.off('click', this._onMousemove);\n\n var elem = this._toggle.elem;\n elem.parentNode.removeChild(elem);\n this._map = undefined;\n};\n\nmodule.exports = MapboxInspect;\n"],"sourceRoot":""}