@tagadapay/plugin-sdk 3.1.22 → 3.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build-cdn.js +274 -6
- package/dist/external-tracker.js +236 -3906
- package/dist/external-tracker.min.js +2 -25
- package/dist/external-tracker.min.js.map +4 -4
- package/dist/react/config/payment.d.ts +14 -4
- package/dist/react/config/payment.js +47 -9
- package/dist/react/hooks/useCheckout.d.ts +3 -0
- package/dist/react/hooks/useCheckout.js +4 -1
- package/dist/react/hooks/usePluginConfig.js +9 -10
- package/dist/react/providers/TagadaProvider.js +1 -1
- package/dist/tagada-react-sdk-minimal.min.js +36 -0
- package/dist/tagada-react-sdk-minimal.min.js.map +7 -0
- package/dist/tagada-react-sdk.js +37821 -0
- package/dist/tagada-react-sdk.min.js +78 -0
- package/dist/tagada-react-sdk.min.js.map +7 -0
- package/dist/tagada-sdk.js +10309 -6331
- package/dist/tagada-sdk.min.js +4 -22
- package/dist/tagada-sdk.min.js.map +4 -4
- package/dist/v2/cdn-react-minimal.d.ts +23 -0
- package/dist/v2/cdn-react-minimal.js +26 -0
- package/dist/v2/core/client.js +1 -1
- package/dist/v2/core/config/environment.js +2 -1
- package/dist/v2/core/funnelClient.d.ts +98 -10
- package/dist/v2/core/funnelClient.js +121 -27
- package/dist/v2/core/index.d.ts +0 -1
- package/dist/v2/core/index.js +0 -2
- package/dist/v2/core/isoData.d.ts +4 -4
- package/dist/v2/core/isoData.js +7 -7
- package/dist/v2/core/pixelMapping.js +64 -26
- package/dist/v2/core/resources/checkout.d.ts +10 -0
- package/dist/v2/core/resources/checkout.js +6 -0
- package/dist/v2/core/resources/expressPaymentMethods.d.ts +1 -0
- package/dist/v2/core/resources/payments.d.ts +7 -2
- package/dist/v2/core/resources/payments.js +1 -0
- package/dist/v2/core/resources/postPurchases.d.ts +17 -0
- package/dist/v2/core/resources/postPurchases.js +20 -0
- package/dist/v2/core/utils/deviceInfo.d.ts +0 -10
- package/dist/v2/core/utils/deviceInfo.js +152 -76
- package/dist/v2/core/utils/order.d.ts +2 -0
- package/dist/v2/core/utils/pluginConfig.js +18 -22
- package/dist/v2/index.d.ts +4 -3
- package/dist/v2/index.js +4 -2
- package/dist/v2/react/components/FunnelScriptInjector.js +145 -77
- package/dist/v2/react/components/StripeExpressButton.d.ts +13 -0
- package/dist/v2/react/components/StripeExpressButton.js +171 -0
- package/dist/v2/react/components/WhopCheckout.js +7 -1
- package/dist/v2/react/hooks/payment-actions/useProcessorAuthAction.js +21 -3
- package/dist/v2/react/hooks/useApplePayCheckout.js +8 -8
- package/dist/v2/react/hooks/useCheckoutQuery.d.ts +10 -0
- package/dist/v2/react/hooks/useCheckoutQuery.js +21 -13
- package/dist/v2/react/hooks/useFunnel.d.ts +15 -4
- package/dist/v2/react/hooks/useFunnel.js +8 -4
- package/dist/v2/react/hooks/useGoogleAutocomplete.d.ts +2 -0
- package/dist/v2/react/hooks/useGoogleAutocomplete.js +29 -15
- package/dist/v2/react/hooks/useISOData.d.ts +2 -5
- package/dist/v2/react/hooks/useISOData.js +25 -26
- package/dist/v2/react/hooks/usePaymentPolling.d.ts +2 -2
- package/dist/v2/react/hooks/usePixelTracking.js +151 -70
- package/dist/v2/react/hooks/usePostPurchasesQuery.js +34 -2
- package/dist/v2/react/hooks/useRemappableParams.d.ts +2 -6
- package/dist/v2/react/hooks/useRemappableParams.js +23 -23
- package/dist/v2/react/hooks/useSetPaymentMethod.d.ts +16 -0
- package/dist/v2/react/hooks/useSetPaymentMethod.js +33 -0
- package/dist/v2/react/hooks/useStepConfig.d.ts +23 -6
- package/dist/v2/react/hooks/useStepConfig.js +14 -7
- package/dist/v2/react/hooks/useTranslation.js +23 -8
- package/dist/v2/react/index.d.ts +8 -1
- package/dist/v2/react/index.js +3 -0
- package/dist/v2/react/providers/ExpressPaymentMethodsProvider.d.ts +1 -0
- package/dist/v2/react/providers/ExpressPaymentMethodsProvider.js +9 -1
- package/dist/v2/react/providers/TagadaProvider.js +4 -4
- package/dist/v2/standalone/index.d.ts +21 -3
- package/dist/v2/standalone/index.js +25 -3
- package/dist/v2/standalone/payment-service.d.ts +134 -0
- package/dist/v2/standalone/payment-service.js +928 -0
- package/package.json +4 -2
package/dist/external-tracker.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TagadaPay External Tracker v3.1.
|
|
2
|
+
* TagadaPay External Tracker v3.1.24
|
|
3
3
|
* CDN Bundle - Standalone tracking for external pages (Debug Build)
|
|
4
4
|
* @license MIT
|
|
5
5
|
*/
|
|
6
6
|
"use strict";
|
|
7
7
|
var TagadaTrackerBundle = (() => {
|
|
8
|
-
var __create = Object.create;
|
|
9
8
|
var __defProp = Object.defineProperty;
|
|
10
9
|
var __defProps = Object.defineProperties;
|
|
11
10
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
12
11
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
13
12
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
14
13
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
15
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
16
14
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
17
15
|
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
18
16
|
var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for("Symbol." + name);
|
|
@@ -35,9 +33,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
35
33
|
var __esm = (fn, res) => function __init() {
|
|
36
34
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
37
35
|
};
|
|
38
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
39
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
40
|
-
};
|
|
41
36
|
var __export = (target, all3) => {
|
|
42
37
|
for (var name in all3)
|
|
43
38
|
__defProp(target, name, { get: all3[name], enumerable: true });
|
|
@@ -50,14 +45,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
50
45
|
}
|
|
51
46
|
return to;
|
|
52
47
|
};
|
|
53
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
54
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
55
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
56
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
57
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
58
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
59
|
-
mod
|
|
60
|
-
));
|
|
61
48
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
62
49
|
var __await = function(promise, isYieldStar) {
|
|
63
50
|
this[0] = promise;
|
|
@@ -170,7 +157,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
170
157
|
const hostname = window.location.hostname;
|
|
171
158
|
const href = window.location.href;
|
|
172
159
|
console.log('[SDK] detectEnvironment() - hostname: "'.concat(hostname, '"'));
|
|
173
|
-
if (hostname === "localhost" || hostname.startsWith("127.") || hostname.startsWith("192.168.") || hostname.startsWith("10.") || hostname.includes(".local") || hostname === "" || hostname === "0.0.0.0" || hostname.includes("ngrok-free.dev") || hostname.includes("ngrok-free.app") || hostname.includes("ngrok.io") || hostname.includes("ngrok.app")) {
|
|
160
|
+
if (hostname === "localhost" || hostname.startsWith("127.") || hostname.startsWith("192.168.") || hostname.startsWith("10.") || hostname.includes(".local") || hostname === "" || hostname === "0.0.0.0" || hostname.includes("ngrok-free.dev") || hostname.includes("ngrok-free.app") || hostname.includes("ngrok.io") || hostname.includes("ngrok.app") || hostname.includes(".loclx.io")) {
|
|
174
161
|
console.log("[SDK] detectEnvironment() - returning LOCAL");
|
|
175
162
|
if (typeof window !== "undefined" && ((_a = window == null ? void 0 : window.__TAGADA_ENV__) == null ? void 0 : _a.TAGADA_ENVIRONMENT)) {
|
|
176
163
|
const override = window.__TAGADA_ENV__.TAGADA_ENVIRONMENT.toLowerCase();
|
|
@@ -687,6 +674,12 @@ var TagadaTrackerBundle = (() => {
|
|
|
687
674
|
});
|
|
688
675
|
|
|
689
676
|
// src/v2/core/utils/previewModeIndicator.ts
|
|
677
|
+
var previewModeIndicator_exports = {};
|
|
678
|
+
__export(previewModeIndicator_exports, {
|
|
679
|
+
injectPreviewModeIndicator: () => injectPreviewModeIndicator,
|
|
680
|
+
isIndicatorInjected: () => isIndicatorInjected,
|
|
681
|
+
removePreviewModeIndicator: () => removePreviewModeIndicator
|
|
682
|
+
});
|
|
690
683
|
function clearSpecificCookie(cookieName) {
|
|
691
684
|
if (typeof window === "undefined" || typeof document === "undefined") return;
|
|
692
685
|
const hostname = window.location.hostname;
|
|
@@ -942,6 +935,16 @@ var TagadaTrackerBundle = (() => {
|
|
|
942
935
|
indicatorElement = container;
|
|
943
936
|
isInjected = true;
|
|
944
937
|
}
|
|
938
|
+
function removePreviewModeIndicator() {
|
|
939
|
+
if (indicatorElement && indicatorElement.parentNode) {
|
|
940
|
+
indicatorElement.parentNode.removeChild(indicatorElement);
|
|
941
|
+
indicatorElement = null;
|
|
942
|
+
isInjected = false;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
function isIndicatorInjected() {
|
|
946
|
+
return isInjected;
|
|
947
|
+
}
|
|
945
948
|
var indicatorElement, isInjected;
|
|
946
949
|
var init_previewModeIndicator = __esm({
|
|
947
950
|
"src/v2/core/utils/previewModeIndicator.ts"() {
|
|
@@ -959,14 +962,48 @@ var TagadaTrackerBundle = (() => {
|
|
|
959
962
|
__export(funnelClient_exports, {
|
|
960
963
|
FunnelClient: () => FunnelClient,
|
|
961
964
|
TrackingProvider: () => TrackingProvider,
|
|
965
|
+
findMethod: () => findMethod,
|
|
966
|
+
getAssignedOrderBumpOfferIds: () => getAssignedOrderBumpOfferIds,
|
|
962
967
|
getAssignedPaymentFlowId: () => getAssignedPaymentFlowId,
|
|
963
968
|
getAssignedPixels: () => getAssignedPixels,
|
|
969
|
+
getAssignedResources: () => getAssignedResources,
|
|
964
970
|
getAssignedScripts: () => getAssignedScripts,
|
|
965
971
|
getAssignedStaticResources: () => getAssignedStaticResources,
|
|
966
972
|
getAssignedStepConfig: () => getAssignedStepConfig,
|
|
973
|
+
getAssignedUpsellOfferIds: () => getAssignedUpsellOfferIds,
|
|
974
|
+
getEnabledMethods: () => getEnabledMethods,
|
|
975
|
+
getExpressMethods: () => getExpressMethods,
|
|
976
|
+
getExpressMethodsByProcessor: () => getExpressMethodsByProcessor,
|
|
967
977
|
getLocalFunnelConfig: () => getLocalFunnelConfig,
|
|
978
|
+
isMethodEnabled: () => isMethodEnabled,
|
|
968
979
|
loadLocalFunnelConfig: () => loadLocalFunnelConfig
|
|
969
980
|
});
|
|
981
|
+
function getEnabledMethods(config) {
|
|
982
|
+
if (!config) return [];
|
|
983
|
+
return Object.values(config).filter((m) => m.enabled);
|
|
984
|
+
}
|
|
985
|
+
function getExpressMethods(config) {
|
|
986
|
+
return getEnabledMethods(config).filter((m) => m.express);
|
|
987
|
+
}
|
|
988
|
+
function getExpressMethodsByProcessor(config) {
|
|
989
|
+
const groups = {};
|
|
990
|
+
for (const m of getExpressMethods(config)) {
|
|
991
|
+
const key = m.processorId || m.integrationId || m.provider;
|
|
992
|
+
if (!groups[key]) groups[key] = [];
|
|
993
|
+
groups[key].push(m);
|
|
994
|
+
}
|
|
995
|
+
return groups;
|
|
996
|
+
}
|
|
997
|
+
function findMethod(config, method) {
|
|
998
|
+
if (!config) return void 0;
|
|
999
|
+
for (const entry of Object.values(config)) {
|
|
1000
|
+
if (entry.method === method && entry.enabled) return entry;
|
|
1001
|
+
}
|
|
1002
|
+
return void 0;
|
|
1003
|
+
}
|
|
1004
|
+
function isMethodEnabled(config, method) {
|
|
1005
|
+
return !!findMethod(config, method);
|
|
1006
|
+
}
|
|
970
1007
|
function getAssignedFunnelId() {
|
|
971
1008
|
if (typeof window === "undefined") return void 0;
|
|
972
1009
|
if (window.__TGD_FUNNEL_ID__) {
|
|
@@ -1065,11 +1102,14 @@ var TagadaTrackerBundle = (() => {
|
|
|
1065
1102
|
return localFunnelConfigCache != null ? localFunnelConfigCache : null;
|
|
1066
1103
|
}
|
|
1067
1104
|
function localConfigToStepConfig(local) {
|
|
1105
|
+
const merged = __spreadValues(__spreadValues({}, local.staticResources), local.resources);
|
|
1068
1106
|
return {
|
|
1069
1107
|
payment: local.paymentFlowId ? { paymentFlowId: local.paymentFlowId } : void 0,
|
|
1070
|
-
|
|
1108
|
+
resources: Object.keys(merged).length > 0 ? merged : void 0,
|
|
1071
1109
|
scripts: local.scripts,
|
|
1072
|
-
pixels: local.pixels
|
|
1110
|
+
pixels: local.pixels,
|
|
1111
|
+
orderBumps: local.orderBumps,
|
|
1112
|
+
upsellOffers: local.upsellOffers
|
|
1073
1113
|
};
|
|
1074
1114
|
}
|
|
1075
1115
|
function getAssignedStepConfig() {
|
|
@@ -1095,9 +1135,13 @@ var TagadaTrackerBundle = (() => {
|
|
|
1095
1135
|
return void 0;
|
|
1096
1136
|
}
|
|
1097
1137
|
function getAssignedPaymentFlowId() {
|
|
1098
|
-
var _a;
|
|
1138
|
+
var _a, _b;
|
|
1099
1139
|
const stepConfig = getAssignedStepConfig();
|
|
1100
|
-
|
|
1140
|
+
const cardConfig = (_a = stepConfig == null ? void 0 : stepConfig.paymentSetupConfig) == null ? void 0 : _a.card;
|
|
1141
|
+
if (cardConfig == null ? void 0 : cardConfig.paymentFlowId) {
|
|
1142
|
+
return cardConfig.paymentFlowId;
|
|
1143
|
+
}
|
|
1144
|
+
if ((_b = stepConfig == null ? void 0 : stepConfig.payment) == null ? void 0 : _b.paymentFlowId) {
|
|
1101
1145
|
return stepConfig.payment.paymentFlowId;
|
|
1102
1146
|
}
|
|
1103
1147
|
if (typeof window !== "undefined") {
|
|
@@ -1111,9 +1155,15 @@ var TagadaTrackerBundle = (() => {
|
|
|
1111
1155
|
}
|
|
1112
1156
|
return void 0;
|
|
1113
1157
|
}
|
|
1114
|
-
function
|
|
1158
|
+
function getAssignedResources() {
|
|
1115
1159
|
const stepConfig = getAssignedStepConfig();
|
|
1116
|
-
|
|
1160
|
+
const legacy = stepConfig == null ? void 0 : stepConfig.staticResources;
|
|
1161
|
+
const current = stepConfig == null ? void 0 : stepConfig.resources;
|
|
1162
|
+
if (!legacy && !current) return void 0;
|
|
1163
|
+
return __spreadValues(__spreadValues({}, legacy), current);
|
|
1164
|
+
}
|
|
1165
|
+
function getAssignedStaticResources() {
|
|
1166
|
+
return getAssignedResources();
|
|
1117
1167
|
}
|
|
1118
1168
|
function getAssignedScripts(position) {
|
|
1119
1169
|
const stepConfig = getAssignedStepConfig();
|
|
@@ -1124,6 +1174,14 @@ var TagadaTrackerBundle = (() => {
|
|
|
1124
1174
|
}
|
|
1125
1175
|
return scripts.length > 0 ? scripts : void 0;
|
|
1126
1176
|
}
|
|
1177
|
+
function splitPixelConfig(px) {
|
|
1178
|
+
const idField = "containerId" in px ? "containerId" : "pixelId";
|
|
1179
|
+
const rawId = px[idField];
|
|
1180
|
+
if (!rawId || !rawId.includes(";") && !rawId.includes(",")) return [px];
|
|
1181
|
+
const ids = rawId.split(/[;,]/).map((id) => id.trim()).filter((id) => id.length > 0);
|
|
1182
|
+
if (ids.length <= 1) return [px];
|
|
1183
|
+
return ids.map((id) => __spreadProps(__spreadValues({}, px), { [idField]: id }));
|
|
1184
|
+
}
|
|
1127
1185
|
function getAssignedPixels() {
|
|
1128
1186
|
const stepConfig = getAssignedStepConfig();
|
|
1129
1187
|
const rawPixels = stepConfig == null ? void 0 : stepConfig.pixels;
|
|
@@ -1132,14 +1190,26 @@ var TagadaTrackerBundle = (() => {
|
|
|
1132
1190
|
for (const [key, value] of Object.entries(rawPixels)) {
|
|
1133
1191
|
if (!value) continue;
|
|
1134
1192
|
if (Array.isArray(value)) {
|
|
1135
|
-
normalized[key] = value;
|
|
1193
|
+
normalized[key] = value.flatMap((px) => splitPixelConfig(px));
|
|
1136
1194
|
} else if (typeof value === "object") {
|
|
1137
|
-
normalized[key] =
|
|
1195
|
+
normalized[key] = splitPixelConfig(value);
|
|
1138
1196
|
}
|
|
1139
1197
|
}
|
|
1140
1198
|
return Object.keys(normalized).length > 0 ? normalized : void 0;
|
|
1141
1199
|
}
|
|
1142
|
-
|
|
1200
|
+
function getAssignedOrderBumpOfferIds() {
|
|
1201
|
+
const stepConfig = getAssignedStepConfig();
|
|
1202
|
+
if (!(stepConfig == null ? void 0 : stepConfig.orderBumps)) return void 0;
|
|
1203
|
+
if (stepConfig.orderBumps.mode !== "custom") return void 0;
|
|
1204
|
+
return stepConfig.orderBumps.enabledOfferIds;
|
|
1205
|
+
}
|
|
1206
|
+
function getAssignedUpsellOfferIds() {
|
|
1207
|
+
const stepConfig = getAssignedStepConfig();
|
|
1208
|
+
if (!(stepConfig == null ? void 0 : stepConfig.upsellOffers)) return void 0;
|
|
1209
|
+
if (stepConfig.upsellOffers.mode !== "custom") return void 0;
|
|
1210
|
+
return stepConfig.upsellOffers.enabledUpsellIds;
|
|
1211
|
+
}
|
|
1212
|
+
var lazyInjectPreviewIndicator, TrackingProvider, localFunnelConfigCache, localFunnelConfigLoading, FunnelClient;
|
|
1143
1213
|
var init_funnelClient = __esm({
|
|
1144
1214
|
"src/v2/core/funnelClient.ts"() {
|
|
1145
1215
|
"use strict";
|
|
@@ -1147,8 +1217,8 @@ var TagadaTrackerBundle = (() => {
|
|
|
1147
1217
|
init_funnel();
|
|
1148
1218
|
init_eventDispatcher();
|
|
1149
1219
|
init_previewMode();
|
|
1150
|
-
init_previewModeIndicator();
|
|
1151
1220
|
init_sessionStorage();
|
|
1221
|
+
lazyInjectPreviewIndicator = () => Promise.resolve().then(() => (init_previewModeIndicator(), previewModeIndicator_exports)).then((m) => m.injectPreviewModeIndicator());
|
|
1152
1222
|
TrackingProvider = /* @__PURE__ */ ((TrackingProvider2) => {
|
|
1153
1223
|
TrackingProvider2["FACEBOOK"] = "facebook";
|
|
1154
1224
|
TrackingProvider2["TIKTOK"] = "tiktok";
|
|
@@ -1299,7 +1369,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
1299
1369
|
if (response.success && response.context) {
|
|
1300
1370
|
const enriched = this.enrichContext(response.context);
|
|
1301
1371
|
this.handleSessionSuccess(enriched);
|
|
1302
|
-
|
|
1372
|
+
lazyInjectPreviewIndicator();
|
|
1303
1373
|
return enriched;
|
|
1304
1374
|
} else {
|
|
1305
1375
|
throw new Error(response.error || "Failed to initialize funnel session");
|
|
@@ -1345,7 +1415,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
1345
1415
|
if (response.success && response.context) {
|
|
1346
1416
|
const enriched = this.enrichContext(response.context);
|
|
1347
1417
|
this.handleSessionSuccess(enriched);
|
|
1348
|
-
|
|
1418
|
+
lazyInjectPreviewIndicator();
|
|
1349
1419
|
return enriched;
|
|
1350
1420
|
} else {
|
|
1351
1421
|
throw new Error(response.error || "Failed to initialize");
|
|
@@ -1442,12 +1512,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
1442
1512
|
return result;
|
|
1443
1513
|
}
|
|
1444
1514
|
const shouldAutoRedirect = (options == null ? void 0 : options.autoRedirect) !== void 0 ? options.autoRedirect : this.config.autoRedirect !== false;
|
|
1445
|
-
if (!shouldAutoRedirect) {
|
|
1446
|
-
if (this.config.debugMode) {
|
|
1447
|
-
console.log("\u{1F504} [FunnelClient] Refreshing session (no auto-redirect)");
|
|
1448
|
-
}
|
|
1449
|
-
await this.refreshSession();
|
|
1450
|
-
}
|
|
1451
1515
|
this.updateState({ isNavigating: false, isLoading: false });
|
|
1452
1516
|
if (shouldAutoRedirect && (result == null ? void 0 : result.url) && typeof window !== "undefined") {
|
|
1453
1517
|
if (this.config.debugMode) {
|
|
@@ -1562,361 +1626,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
1562
1626
|
}
|
|
1563
1627
|
});
|
|
1564
1628
|
|
|
1565
|
-
// ../../node_modules/.pnpm/path-to-regexp@8.3.0/node_modules/path-to-regexp/dist/index.js
|
|
1566
|
-
var require_dist = __commonJS({
|
|
1567
|
-
"../../node_modules/.pnpm/path-to-regexp@8.3.0/node_modules/path-to-regexp/dist/index.js"(exports) {
|
|
1568
|
-
"use strict";
|
|
1569
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1570
|
-
exports.PathError = exports.TokenData = void 0;
|
|
1571
|
-
exports.parse = parse;
|
|
1572
|
-
exports.compile = compile;
|
|
1573
|
-
exports.match = match2;
|
|
1574
|
-
exports.pathToRegexp = pathToRegexp;
|
|
1575
|
-
exports.stringify = stringify;
|
|
1576
|
-
var DEFAULT_DELIMITER = "/";
|
|
1577
|
-
var NOOP_VALUE = (value) => value;
|
|
1578
|
-
var ID_START = new RegExp("^[$_\\p{ID_Start}]$", "u");
|
|
1579
|
-
var ID_CONTINUE = new RegExp("^[$\\u200c\\u200d\\p{ID_Continue}]$", "u");
|
|
1580
|
-
var SIMPLE_TOKENS = {
|
|
1581
|
-
// Groups.
|
|
1582
|
-
"{": "{",
|
|
1583
|
-
"}": "}",
|
|
1584
|
-
// Reserved.
|
|
1585
|
-
"(": "(",
|
|
1586
|
-
")": ")",
|
|
1587
|
-
"[": "[",
|
|
1588
|
-
"]": "]",
|
|
1589
|
-
"+": "+",
|
|
1590
|
-
"?": "?",
|
|
1591
|
-
"!": "!"
|
|
1592
|
-
};
|
|
1593
|
-
function escapeText(str) {
|
|
1594
|
-
return str.replace(/[{}()\[\]+?!:*\\]/g, "\\$&");
|
|
1595
|
-
}
|
|
1596
|
-
function escape(str) {
|
|
1597
|
-
return str.replace(/[.+*?^${}()[\]|/\\]/g, "\\$&");
|
|
1598
|
-
}
|
|
1599
|
-
var TokenData = class {
|
|
1600
|
-
constructor(tokens, originalPath) {
|
|
1601
|
-
this.tokens = tokens;
|
|
1602
|
-
this.originalPath = originalPath;
|
|
1603
|
-
}
|
|
1604
|
-
};
|
|
1605
|
-
exports.TokenData = TokenData;
|
|
1606
|
-
var PathError = class extends TypeError {
|
|
1607
|
-
constructor(message, originalPath) {
|
|
1608
|
-
let text = message;
|
|
1609
|
-
if (originalPath)
|
|
1610
|
-
text += ": ".concat(originalPath);
|
|
1611
|
-
text += "; visit https://git.new/pathToRegexpError for info";
|
|
1612
|
-
super(text);
|
|
1613
|
-
this.originalPath = originalPath;
|
|
1614
|
-
}
|
|
1615
|
-
};
|
|
1616
|
-
exports.PathError = PathError;
|
|
1617
|
-
function parse(str, options = {}) {
|
|
1618
|
-
const { encodePath = NOOP_VALUE } = options;
|
|
1619
|
-
const chars = [...str];
|
|
1620
|
-
const tokens = [];
|
|
1621
|
-
let index = 0;
|
|
1622
|
-
let pos = 0;
|
|
1623
|
-
function name() {
|
|
1624
|
-
let value = "";
|
|
1625
|
-
if (ID_START.test(chars[index])) {
|
|
1626
|
-
do {
|
|
1627
|
-
value += chars[index++];
|
|
1628
|
-
} while (ID_CONTINUE.test(chars[index]));
|
|
1629
|
-
} else if (chars[index] === '"') {
|
|
1630
|
-
let quoteStart = index;
|
|
1631
|
-
while (index++ < chars.length) {
|
|
1632
|
-
if (chars[index] === '"') {
|
|
1633
|
-
index++;
|
|
1634
|
-
quoteStart = 0;
|
|
1635
|
-
break;
|
|
1636
|
-
}
|
|
1637
|
-
if (chars[index] === "\\")
|
|
1638
|
-
index++;
|
|
1639
|
-
value += chars[index];
|
|
1640
|
-
}
|
|
1641
|
-
if (quoteStart) {
|
|
1642
|
-
throw new PathError("Unterminated quote at index ".concat(quoteStart), str);
|
|
1643
|
-
}
|
|
1644
|
-
}
|
|
1645
|
-
if (!value) {
|
|
1646
|
-
throw new PathError("Missing parameter name at index ".concat(index), str);
|
|
1647
|
-
}
|
|
1648
|
-
return value;
|
|
1649
|
-
}
|
|
1650
|
-
while (index < chars.length) {
|
|
1651
|
-
const value = chars[index];
|
|
1652
|
-
const type = SIMPLE_TOKENS[value];
|
|
1653
|
-
if (type) {
|
|
1654
|
-
tokens.push({ type, index: index++, value });
|
|
1655
|
-
} else if (value === "\\") {
|
|
1656
|
-
tokens.push({ type: "escape", index: index++, value: chars[index++] });
|
|
1657
|
-
} else if (value === ":") {
|
|
1658
|
-
tokens.push({ type: "param", index: index++, value: name() });
|
|
1659
|
-
} else if (value === "*") {
|
|
1660
|
-
tokens.push({ type: "wildcard", index: index++, value: name() });
|
|
1661
|
-
} else {
|
|
1662
|
-
tokens.push({ type: "char", index: index++, value });
|
|
1663
|
-
}
|
|
1664
|
-
}
|
|
1665
|
-
tokens.push({ type: "end", index, value: "" });
|
|
1666
|
-
function consumeUntil(endType) {
|
|
1667
|
-
const output = [];
|
|
1668
|
-
while (true) {
|
|
1669
|
-
const token = tokens[pos++];
|
|
1670
|
-
if (token.type === endType)
|
|
1671
|
-
break;
|
|
1672
|
-
if (token.type === "char" || token.type === "escape") {
|
|
1673
|
-
let path = token.value;
|
|
1674
|
-
let cur = tokens[pos];
|
|
1675
|
-
while (cur.type === "char" || cur.type === "escape") {
|
|
1676
|
-
path += cur.value;
|
|
1677
|
-
cur = tokens[++pos];
|
|
1678
|
-
}
|
|
1679
|
-
output.push({
|
|
1680
|
-
type: "text",
|
|
1681
|
-
value: encodePath(path)
|
|
1682
|
-
});
|
|
1683
|
-
continue;
|
|
1684
|
-
}
|
|
1685
|
-
if (token.type === "param" || token.type === "wildcard") {
|
|
1686
|
-
output.push({
|
|
1687
|
-
type: token.type,
|
|
1688
|
-
name: token.value
|
|
1689
|
-
});
|
|
1690
|
-
continue;
|
|
1691
|
-
}
|
|
1692
|
-
if (token.type === "{") {
|
|
1693
|
-
output.push({
|
|
1694
|
-
type: "group",
|
|
1695
|
-
tokens: consumeUntil("}")
|
|
1696
|
-
});
|
|
1697
|
-
continue;
|
|
1698
|
-
}
|
|
1699
|
-
throw new PathError("Unexpected ".concat(token.type, " at index ").concat(token.index, ", expected ").concat(endType), str);
|
|
1700
|
-
}
|
|
1701
|
-
return output;
|
|
1702
|
-
}
|
|
1703
|
-
return new TokenData(consumeUntil("end"), str);
|
|
1704
|
-
}
|
|
1705
|
-
function compile(path, options = {}) {
|
|
1706
|
-
const { encode: encode3 = encodeURIComponent, delimiter = DEFAULT_DELIMITER } = options;
|
|
1707
|
-
const data = typeof path === "object" ? path : parse(path, options);
|
|
1708
|
-
const fn = tokensToFunction(data.tokens, delimiter, encode3);
|
|
1709
|
-
return function path2(params = {}) {
|
|
1710
|
-
const [path3, ...missing] = fn(params);
|
|
1711
|
-
if (missing.length) {
|
|
1712
|
-
throw new TypeError("Missing parameters: ".concat(missing.join(", ")));
|
|
1713
|
-
}
|
|
1714
|
-
return path3;
|
|
1715
|
-
};
|
|
1716
|
-
}
|
|
1717
|
-
function tokensToFunction(tokens, delimiter, encode3) {
|
|
1718
|
-
const encoders = tokens.map((token) => tokenToFunction(token, delimiter, encode3));
|
|
1719
|
-
return (data) => {
|
|
1720
|
-
const result = [""];
|
|
1721
|
-
for (const encoder of encoders) {
|
|
1722
|
-
const [value, ...extras] = encoder(data);
|
|
1723
|
-
result[0] += value;
|
|
1724
|
-
result.push(...extras);
|
|
1725
|
-
}
|
|
1726
|
-
return result;
|
|
1727
|
-
};
|
|
1728
|
-
}
|
|
1729
|
-
function tokenToFunction(token, delimiter, encode3) {
|
|
1730
|
-
if (token.type === "text")
|
|
1731
|
-
return () => [token.value];
|
|
1732
|
-
if (token.type === "group") {
|
|
1733
|
-
const fn = tokensToFunction(token.tokens, delimiter, encode3);
|
|
1734
|
-
return (data) => {
|
|
1735
|
-
const [value, ...missing] = fn(data);
|
|
1736
|
-
if (!missing.length)
|
|
1737
|
-
return [value];
|
|
1738
|
-
return [""];
|
|
1739
|
-
};
|
|
1740
|
-
}
|
|
1741
|
-
const encodeValue = encode3 || NOOP_VALUE;
|
|
1742
|
-
if (token.type === "wildcard" && encode3 !== false) {
|
|
1743
|
-
return (data) => {
|
|
1744
|
-
const value = data[token.name];
|
|
1745
|
-
if (value == null)
|
|
1746
|
-
return ["", token.name];
|
|
1747
|
-
if (!Array.isArray(value) || value.length === 0) {
|
|
1748
|
-
throw new TypeError('Expected "'.concat(token.name, '" to be a non-empty array'));
|
|
1749
|
-
}
|
|
1750
|
-
return [
|
|
1751
|
-
value.map((value2, index) => {
|
|
1752
|
-
if (typeof value2 !== "string") {
|
|
1753
|
-
throw new TypeError('Expected "'.concat(token.name, "/").concat(index, '" to be a string'));
|
|
1754
|
-
}
|
|
1755
|
-
return encodeValue(value2);
|
|
1756
|
-
}).join(delimiter)
|
|
1757
|
-
];
|
|
1758
|
-
};
|
|
1759
|
-
}
|
|
1760
|
-
return (data) => {
|
|
1761
|
-
const value = data[token.name];
|
|
1762
|
-
if (value == null)
|
|
1763
|
-
return ["", token.name];
|
|
1764
|
-
if (typeof value !== "string") {
|
|
1765
|
-
throw new TypeError('Expected "'.concat(token.name, '" to be a string'));
|
|
1766
|
-
}
|
|
1767
|
-
return [encodeValue(value)];
|
|
1768
|
-
};
|
|
1769
|
-
}
|
|
1770
|
-
function match2(path, options = {}) {
|
|
1771
|
-
const { decode = decodeURIComponent, delimiter = DEFAULT_DELIMITER } = options;
|
|
1772
|
-
const { regexp, keys } = pathToRegexp(path, options);
|
|
1773
|
-
const decoders = keys.map((key) => {
|
|
1774
|
-
if (decode === false)
|
|
1775
|
-
return NOOP_VALUE;
|
|
1776
|
-
if (key.type === "param")
|
|
1777
|
-
return decode;
|
|
1778
|
-
return (value) => value.split(delimiter).map(decode);
|
|
1779
|
-
});
|
|
1780
|
-
return function match3(input) {
|
|
1781
|
-
const m = regexp.exec(input);
|
|
1782
|
-
if (!m)
|
|
1783
|
-
return false;
|
|
1784
|
-
const path2 = m[0];
|
|
1785
|
-
const params = /* @__PURE__ */ Object.create(null);
|
|
1786
|
-
for (let i = 1; i < m.length; i++) {
|
|
1787
|
-
if (m[i] === void 0)
|
|
1788
|
-
continue;
|
|
1789
|
-
const key = keys[i - 1];
|
|
1790
|
-
const decoder = decoders[i - 1];
|
|
1791
|
-
params[key.name] = decoder(m[i]);
|
|
1792
|
-
}
|
|
1793
|
-
return { path: path2, params };
|
|
1794
|
-
};
|
|
1795
|
-
}
|
|
1796
|
-
function pathToRegexp(path, options = {}) {
|
|
1797
|
-
const { delimiter = DEFAULT_DELIMITER, end = true, sensitive = false, trailing = true } = options;
|
|
1798
|
-
const keys = [];
|
|
1799
|
-
const flags = sensitive ? "" : "i";
|
|
1800
|
-
const sources = [];
|
|
1801
|
-
for (const input of pathsToArray(path, [])) {
|
|
1802
|
-
const data = typeof input === "object" ? input : parse(input, options);
|
|
1803
|
-
for (const tokens of flatten(data.tokens, 0, [])) {
|
|
1804
|
-
sources.push(toRegExpSource(tokens, delimiter, keys, data.originalPath));
|
|
1805
|
-
}
|
|
1806
|
-
}
|
|
1807
|
-
let pattern = "^(?:".concat(sources.join("|"), ")");
|
|
1808
|
-
if (trailing)
|
|
1809
|
-
pattern += "(?:".concat(escape(delimiter), "$)?");
|
|
1810
|
-
pattern += end ? "$" : "(?=".concat(escape(delimiter), "|$)");
|
|
1811
|
-
const regexp = new RegExp(pattern, flags);
|
|
1812
|
-
return { regexp, keys };
|
|
1813
|
-
}
|
|
1814
|
-
function pathsToArray(paths, init) {
|
|
1815
|
-
if (Array.isArray(paths)) {
|
|
1816
|
-
for (const p of paths)
|
|
1817
|
-
pathsToArray(p, init);
|
|
1818
|
-
} else {
|
|
1819
|
-
init.push(paths);
|
|
1820
|
-
}
|
|
1821
|
-
return init;
|
|
1822
|
-
}
|
|
1823
|
-
function* flatten(tokens, index, init) {
|
|
1824
|
-
if (index === tokens.length) {
|
|
1825
|
-
return yield init;
|
|
1826
|
-
}
|
|
1827
|
-
const token = tokens[index];
|
|
1828
|
-
if (token.type === "group") {
|
|
1829
|
-
for (const seq of flatten(token.tokens, 0, init.slice())) {
|
|
1830
|
-
yield* __yieldStar(flatten(tokens, index + 1, seq));
|
|
1831
|
-
}
|
|
1832
|
-
} else {
|
|
1833
|
-
init.push(token);
|
|
1834
|
-
}
|
|
1835
|
-
yield* __yieldStar(flatten(tokens, index + 1, init));
|
|
1836
|
-
}
|
|
1837
|
-
function toRegExpSource(tokens, delimiter, keys, originalPath) {
|
|
1838
|
-
let result = "";
|
|
1839
|
-
let backtrack = "";
|
|
1840
|
-
let isSafeSegmentParam = true;
|
|
1841
|
-
for (const token of tokens) {
|
|
1842
|
-
if (token.type === "text") {
|
|
1843
|
-
result += escape(token.value);
|
|
1844
|
-
backtrack += token.value;
|
|
1845
|
-
isSafeSegmentParam || (isSafeSegmentParam = token.value.includes(delimiter));
|
|
1846
|
-
continue;
|
|
1847
|
-
}
|
|
1848
|
-
if (token.type === "param" || token.type === "wildcard") {
|
|
1849
|
-
if (!isSafeSegmentParam && !backtrack) {
|
|
1850
|
-
throw new PathError('Missing text before "'.concat(token.name, '" ').concat(token.type), originalPath);
|
|
1851
|
-
}
|
|
1852
|
-
if (token.type === "param") {
|
|
1853
|
-
result += "(".concat(negate(delimiter, isSafeSegmentParam ? "" : backtrack), "+)");
|
|
1854
|
-
} else {
|
|
1855
|
-
result += "([\\s\\S]+)";
|
|
1856
|
-
}
|
|
1857
|
-
keys.push(token);
|
|
1858
|
-
backtrack = "";
|
|
1859
|
-
isSafeSegmentParam = false;
|
|
1860
|
-
continue;
|
|
1861
|
-
}
|
|
1862
|
-
}
|
|
1863
|
-
return result;
|
|
1864
|
-
}
|
|
1865
|
-
function negate(delimiter, backtrack) {
|
|
1866
|
-
if (backtrack.length < 2) {
|
|
1867
|
-
if (delimiter.length < 2)
|
|
1868
|
-
return "[^".concat(escape(delimiter + backtrack), "]");
|
|
1869
|
-
return "(?:(?!".concat(escape(delimiter), ")[^").concat(escape(backtrack), "])");
|
|
1870
|
-
}
|
|
1871
|
-
if (delimiter.length < 2) {
|
|
1872
|
-
return "(?:(?!".concat(escape(backtrack), ")[^").concat(escape(delimiter), "])");
|
|
1873
|
-
}
|
|
1874
|
-
return "(?:(?!".concat(escape(backtrack), "|").concat(escape(delimiter), ")[\\s\\S])");
|
|
1875
|
-
}
|
|
1876
|
-
function stringifyTokens(tokens) {
|
|
1877
|
-
let value = "";
|
|
1878
|
-
let i = 0;
|
|
1879
|
-
function name(value2) {
|
|
1880
|
-
const isSafe = isNameSafe(value2) && isNextNameSafe(tokens[i]);
|
|
1881
|
-
return isSafe ? value2 : JSON.stringify(value2);
|
|
1882
|
-
}
|
|
1883
|
-
while (i < tokens.length) {
|
|
1884
|
-
const token = tokens[i++];
|
|
1885
|
-
if (token.type === "text") {
|
|
1886
|
-
value += escapeText(token.value);
|
|
1887
|
-
continue;
|
|
1888
|
-
}
|
|
1889
|
-
if (token.type === "group") {
|
|
1890
|
-
value += "{".concat(stringifyTokens(token.tokens), "}");
|
|
1891
|
-
continue;
|
|
1892
|
-
}
|
|
1893
|
-
if (token.type === "param") {
|
|
1894
|
-
value += ":".concat(name(token.name));
|
|
1895
|
-
continue;
|
|
1896
|
-
}
|
|
1897
|
-
if (token.type === "wildcard") {
|
|
1898
|
-
value += "*".concat(name(token.name));
|
|
1899
|
-
continue;
|
|
1900
|
-
}
|
|
1901
|
-
throw new TypeError("Unknown token type: ".concat(token.type));
|
|
1902
|
-
}
|
|
1903
|
-
return value;
|
|
1904
|
-
}
|
|
1905
|
-
function stringify(data) {
|
|
1906
|
-
return stringifyTokens(data.tokens);
|
|
1907
|
-
}
|
|
1908
|
-
function isNameSafe(name) {
|
|
1909
|
-
const [first, ...rest] = name;
|
|
1910
|
-
return ID_START.test(first) && rest.every((char) => ID_CONTINUE.test(char));
|
|
1911
|
-
}
|
|
1912
|
-
function isNextNameSafe(token) {
|
|
1913
|
-
if (token && token.type === "text")
|
|
1914
|
-
return !ID_CONTINUE.test(token.value[0]);
|
|
1915
|
-
return true;
|
|
1916
|
-
}
|
|
1917
|
-
}
|
|
1918
|
-
});
|
|
1919
|
-
|
|
1920
1629
|
// src/v2/standalone/external-tracker.ts
|
|
1921
1630
|
var external_tracker_exports = {};
|
|
1922
1631
|
__export(external_tracker_exports, {
|
|
@@ -4749,26 +4458,26 @@ var TagadaTrackerBundle = (() => {
|
|
|
4749
4458
|
// Circuit Breaker Implementation
|
|
4750
4459
|
checkRequestLimit(key) {
|
|
4751
4460
|
const now = Date.now();
|
|
4752
|
-
const
|
|
4753
|
-
if (!
|
|
4461
|
+
const history = this.requestHistory.get(key);
|
|
4462
|
+
if (!history) {
|
|
4754
4463
|
this.requestHistory.set(key, { count: 1, firstRequestTime: now });
|
|
4755
4464
|
return;
|
|
4756
4465
|
}
|
|
4757
|
-
if (now -
|
|
4466
|
+
if (now - history.firstRequestTime > this.WINDOW_MS) {
|
|
4758
4467
|
this.requestHistory.set(key, { count: 1, firstRequestTime: now });
|
|
4759
4468
|
return;
|
|
4760
4469
|
}
|
|
4761
|
-
|
|
4762
|
-
if (
|
|
4470
|
+
history.count++;
|
|
4471
|
+
if (history.count > this.MAX_REQUESTS) {
|
|
4763
4472
|
throw new TagadaCircuitBreakerError(
|
|
4764
|
-
"Circuit Breaker: Too many requests to ".concat(key, " (").concat(
|
|
4473
|
+
"Circuit Breaker: Too many requests to ".concat(key, " (").concat(history.count, " in ").concat(this.WINDOW_MS, "ms)")
|
|
4765
4474
|
);
|
|
4766
4475
|
}
|
|
4767
4476
|
}
|
|
4768
4477
|
cleanupHistory() {
|
|
4769
4478
|
const now = Date.now();
|
|
4770
|
-
for (const [key,
|
|
4771
|
-
if (now -
|
|
4479
|
+
for (const [key, history] of this.requestHistory.entries()) {
|
|
4480
|
+
if (now - history.firstRequestTime > this.WINDOW_MS) {
|
|
4772
4481
|
this.requestHistory.delete(key);
|
|
4773
4482
|
}
|
|
4774
4483
|
}
|
|
@@ -4811,3262 +4520,125 @@ var TagadaTrackerBundle = (() => {
|
|
|
4811
4520
|
}
|
|
4812
4521
|
};
|
|
4813
4522
|
|
|
4814
|
-
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/main/ua-parser.mjs
|
|
4815
|
-
var LIBVERSION = "2.0.6";
|
|
4816
|
-
var UA_MAX_LENGTH = 500;
|
|
4817
|
-
var USER_AGENT = "user-agent";
|
|
4818
|
-
var EMPTY = "";
|
|
4819
|
-
var UNKNOWN = "?";
|
|
4820
|
-
var TYPEOF = {
|
|
4821
|
-
FUNCTION: "function",
|
|
4822
|
-
OBJECT: "object",
|
|
4823
|
-
STRING: "string",
|
|
4824
|
-
UNDEFINED: "undefined"
|
|
4825
|
-
};
|
|
4826
|
-
var BROWSER = "browser";
|
|
4827
|
-
var CPU = "cpu";
|
|
4828
|
-
var DEVICE = "device";
|
|
4829
|
-
var ENGINE = "engine";
|
|
4830
|
-
var OS = "os";
|
|
4831
|
-
var RESULT = "result";
|
|
4832
|
-
var NAME = "name";
|
|
4833
|
-
var TYPE = "type";
|
|
4834
|
-
var VENDOR = "vendor";
|
|
4835
|
-
var VERSION3 = "version";
|
|
4836
|
-
var ARCHITECTURE = "architecture";
|
|
4837
|
-
var MAJOR = "major";
|
|
4838
|
-
var MODEL = "model";
|
|
4839
|
-
var CONSOLE = "console";
|
|
4840
|
-
var MOBILE = "mobile";
|
|
4841
|
-
var TABLET = "tablet";
|
|
4842
|
-
var SMARTTV = "smarttv";
|
|
4843
|
-
var WEARABLE = "wearable";
|
|
4844
|
-
var XR = "xr";
|
|
4845
|
-
var EMBEDDED = "embedded";
|
|
4846
|
-
var INAPP = "inapp";
|
|
4847
|
-
var BRANDS = "brands";
|
|
4848
|
-
var FORMFACTORS = "formFactors";
|
|
4849
|
-
var FULLVERLIST = "fullVersionList";
|
|
4850
|
-
var PLATFORM = "platform";
|
|
4851
|
-
var PLATFORMVER = "platformVersion";
|
|
4852
|
-
var BITNESS = "bitness";
|
|
4853
|
-
var CH = "sec-ch-ua";
|
|
4854
|
-
var CH_FULL_VER_LIST = CH + "-full-version-list";
|
|
4855
|
-
var CH_ARCH = CH + "-arch";
|
|
4856
|
-
var CH_BITNESS = CH + "-" + BITNESS;
|
|
4857
|
-
var CH_FORM_FACTORS = CH + "-form-factors";
|
|
4858
|
-
var CH_MOBILE = CH + "-" + MOBILE;
|
|
4859
|
-
var CH_MODEL = CH + "-" + MODEL;
|
|
4860
|
-
var CH_PLATFORM = CH + "-" + PLATFORM;
|
|
4861
|
-
var CH_PLATFORM_VER = CH_PLATFORM + "-version";
|
|
4862
|
-
var CH_ALL_VALUES = [BRANDS, FULLVERLIST, MOBILE, MODEL, PLATFORM, PLATFORMVER, ARCHITECTURE, FORMFACTORS, BITNESS];
|
|
4863
|
-
var AMAZON = "Amazon";
|
|
4864
|
-
var APPLE = "Apple";
|
|
4865
|
-
var ASUS = "ASUS";
|
|
4866
|
-
var BLACKBERRY = "BlackBerry";
|
|
4867
|
-
var GOOGLE = "Google";
|
|
4868
|
-
var HUAWEI = "Huawei";
|
|
4869
|
-
var LENOVO = "Lenovo";
|
|
4870
|
-
var HONOR = "Honor";
|
|
4871
|
-
var LG = "LG";
|
|
4872
|
-
var MICROSOFT = "Microsoft";
|
|
4873
|
-
var MOTOROLA = "Motorola";
|
|
4874
|
-
var NVIDIA = "Nvidia";
|
|
4875
|
-
var ONEPLUS = "OnePlus";
|
|
4876
|
-
var OPPO = "OPPO";
|
|
4877
|
-
var SAMSUNG = "Samsung";
|
|
4878
|
-
var SHARP = "Sharp";
|
|
4879
|
-
var SONY = "Sony";
|
|
4880
|
-
var XIAOMI = "Xiaomi";
|
|
4881
|
-
var ZEBRA = "Zebra";
|
|
4882
|
-
var CHROME = "Chrome";
|
|
4883
|
-
var CHROMIUM = "Chromium";
|
|
4884
|
-
var CHROMECAST = "Chromecast";
|
|
4885
|
-
var EDGE = "Edge";
|
|
4886
|
-
var FIREFOX = "Firefox";
|
|
4887
|
-
var OPERA = "Opera";
|
|
4888
|
-
var FACEBOOK = "Facebook";
|
|
4889
|
-
var SOGOU = "Sogou";
|
|
4890
|
-
var PREFIX_MOBILE = "Mobile ";
|
|
4891
|
-
var SUFFIX_BROWSER = " Browser";
|
|
4892
|
-
var WINDOWS = "Windows";
|
|
4893
|
-
var isWindow = typeof window !== TYPEOF.UNDEFINED;
|
|
4894
|
-
var NAVIGATOR = isWindow && window.navigator ? window.navigator : void 0;
|
|
4895
|
-
var NAVIGATOR_UADATA = NAVIGATOR && NAVIGATOR.userAgentData ? NAVIGATOR.userAgentData : void 0;
|
|
4896
|
-
var extend2 = function(defaultRgx, extensions) {
|
|
4897
|
-
var mergedRgx = {};
|
|
4898
|
-
var extraRgx = extensions;
|
|
4899
|
-
if (!isExtensions(extensions)) {
|
|
4900
|
-
extraRgx = {};
|
|
4901
|
-
for (var i in extensions) {
|
|
4902
|
-
for (var j in extensions[i]) {
|
|
4903
|
-
extraRgx[j] = extensions[i][j].concat(extraRgx[j] ? extraRgx[j] : []);
|
|
4904
|
-
}
|
|
4905
|
-
}
|
|
4906
|
-
}
|
|
4907
|
-
for (var k in defaultRgx) {
|
|
4908
|
-
mergedRgx[k] = extraRgx[k] && extraRgx[k].length % 2 === 0 ? extraRgx[k].concat(defaultRgx[k]) : defaultRgx[k];
|
|
4909
|
-
}
|
|
4910
|
-
return mergedRgx;
|
|
4911
|
-
};
|
|
4912
|
-
var enumerize = function(arr) {
|
|
4913
|
-
var enums = {};
|
|
4914
|
-
for (var i = 0; i < arr.length; i++) {
|
|
4915
|
-
enums[arr[i].toUpperCase()] = arr[i];
|
|
4916
|
-
}
|
|
4917
|
-
return enums;
|
|
4918
|
-
};
|
|
4919
|
-
var has = function(str1, str2) {
|
|
4920
|
-
if (typeof str1 === TYPEOF.OBJECT && str1.length > 0) {
|
|
4921
|
-
for (var i in str1) {
|
|
4922
|
-
if (lowerize(str2) == lowerize(str1[i])) return true;
|
|
4923
|
-
}
|
|
4924
|
-
return false;
|
|
4925
|
-
}
|
|
4926
|
-
return isString2(str1) ? lowerize(str2) == lowerize(str1) : false;
|
|
4927
|
-
};
|
|
4928
|
-
var isExtensions = function(obj, deep) {
|
|
4929
|
-
for (var prop in obj) {
|
|
4930
|
-
return /^(browser|cpu|device|engine|os)$/.test(prop) || (deep ? isExtensions(obj[prop]) : false);
|
|
4931
|
-
}
|
|
4932
|
-
};
|
|
4933
|
-
var isString2 = function(val) {
|
|
4934
|
-
return typeof val === TYPEOF.STRING;
|
|
4935
|
-
};
|
|
4936
|
-
var itemListToArray = function(header) {
|
|
4937
|
-
if (!header) return void 0;
|
|
4938
|
-
var arr = [];
|
|
4939
|
-
var tokens = strip(/\\?\"/g, header).split(",");
|
|
4940
|
-
for (var i = 0; i < tokens.length; i++) {
|
|
4941
|
-
if (tokens[i].indexOf(";") > -1) {
|
|
4942
|
-
var token = trim2(tokens[i]).split(";v=");
|
|
4943
|
-
arr[i] = { brand: token[0], version: token[1] };
|
|
4944
|
-
} else {
|
|
4945
|
-
arr[i] = trim2(tokens[i]);
|
|
4946
|
-
}
|
|
4947
|
-
}
|
|
4948
|
-
return arr;
|
|
4949
|
-
};
|
|
4950
|
-
var lowerize = function(str) {
|
|
4951
|
-
return isString2(str) ? str.toLowerCase() : str;
|
|
4952
|
-
};
|
|
4953
|
-
var majorize = function(version) {
|
|
4954
|
-
return isString2(version) ? strip(/[^\d\.]/g, version).split(".")[0] : void 0;
|
|
4955
|
-
};
|
|
4956
|
-
var setProps = function(arr) {
|
|
4957
|
-
for (var i in arr) {
|
|
4958
|
-
if (!arr.hasOwnProperty(i)) continue;
|
|
4959
|
-
var propName = arr[i];
|
|
4960
|
-
if (typeof propName == TYPEOF.OBJECT && propName.length == 2) {
|
|
4961
|
-
this[propName[0]] = propName[1];
|
|
4962
|
-
} else {
|
|
4963
|
-
this[propName] = void 0;
|
|
4964
|
-
}
|
|
4965
|
-
}
|
|
4966
|
-
return this;
|
|
4967
|
-
};
|
|
4968
|
-
var strip = function(pattern, str) {
|
|
4969
|
-
return isString2(str) ? str.replace(pattern, EMPTY) : str;
|
|
4970
|
-
};
|
|
4971
|
-
var stripQuotes = function(str) {
|
|
4972
|
-
return strip(/\\?\"/g, str);
|
|
4973
|
-
};
|
|
4974
|
-
var trim2 = function(str, len) {
|
|
4975
|
-
str = strip(/^\s\s*/, String(str));
|
|
4976
|
-
return typeof len === TYPEOF.UNDEFINED ? str : str.substring(0, len);
|
|
4977
|
-
};
|
|
4978
|
-
var rgxMapper = function(ua, arrays) {
|
|
4979
|
-
if (!ua || !arrays) return;
|
|
4980
|
-
var i = 0, j, k, p, q, matches, match2;
|
|
4981
|
-
while (i < arrays.length && !matches) {
|
|
4982
|
-
var regex = arrays[i], props = arrays[i + 1];
|
|
4983
|
-
j = k = 0;
|
|
4984
|
-
while (j < regex.length && !matches) {
|
|
4985
|
-
if (!regex[j]) {
|
|
4986
|
-
break;
|
|
4987
|
-
}
|
|
4988
|
-
matches = regex[j++].exec(ua);
|
|
4989
|
-
if (!!matches) {
|
|
4990
|
-
for (p = 0; p < props.length; p++) {
|
|
4991
|
-
match2 = matches[++k];
|
|
4992
|
-
q = props[p];
|
|
4993
|
-
if (typeof q === TYPEOF.OBJECT && q.length > 0) {
|
|
4994
|
-
if (q.length === 2) {
|
|
4995
|
-
if (typeof q[1] == TYPEOF.FUNCTION) {
|
|
4996
|
-
this[q[0]] = q[1].call(this, match2);
|
|
4997
|
-
} else {
|
|
4998
|
-
this[q[0]] = q[1];
|
|
4999
|
-
}
|
|
5000
|
-
} else if (q.length >= 3) {
|
|
5001
|
-
if (typeof q[1] === TYPEOF.FUNCTION && !(q[1].exec && q[1].test)) {
|
|
5002
|
-
if (q.length > 3) {
|
|
5003
|
-
this[q[0]] = match2 ? q[1].apply(this, q.slice(2)) : void 0;
|
|
5004
|
-
} else {
|
|
5005
|
-
this[q[0]] = match2 ? q[1].call(this, match2, q[2]) : void 0;
|
|
5006
|
-
}
|
|
5007
|
-
} else {
|
|
5008
|
-
if (q.length == 3) {
|
|
5009
|
-
this[q[0]] = match2 ? match2.replace(q[1], q[2]) : void 0;
|
|
5010
|
-
} else if (q.length == 4) {
|
|
5011
|
-
this[q[0]] = match2 ? q[3].call(this, match2.replace(q[1], q[2])) : void 0;
|
|
5012
|
-
} else if (q.length > 4) {
|
|
5013
|
-
this[q[0]] = match2 ? q[3].apply(this, [match2.replace(q[1], q[2])].concat(q.slice(4))) : void 0;
|
|
5014
|
-
}
|
|
5015
|
-
}
|
|
5016
|
-
}
|
|
5017
|
-
} else {
|
|
5018
|
-
this[q] = match2 ? match2 : void 0;
|
|
5019
|
-
}
|
|
5020
|
-
}
|
|
5021
|
-
}
|
|
5022
|
-
}
|
|
5023
|
-
i += 2;
|
|
5024
|
-
}
|
|
5025
|
-
};
|
|
5026
|
-
var strMapper = function(str, map) {
|
|
5027
|
-
for (var i in map) {
|
|
5028
|
-
if (typeof map[i] === TYPEOF.OBJECT && map[i].length > 0) {
|
|
5029
|
-
for (var j = 0; j < map[i].length; j++) {
|
|
5030
|
-
if (has(map[i][j], str)) {
|
|
5031
|
-
return i === UNKNOWN ? void 0 : i;
|
|
5032
|
-
}
|
|
5033
|
-
}
|
|
5034
|
-
} else if (has(map[i], str)) {
|
|
5035
|
-
return i === UNKNOWN ? void 0 : i;
|
|
5036
|
-
}
|
|
5037
|
-
}
|
|
5038
|
-
return map.hasOwnProperty("*") ? map["*"] : str;
|
|
5039
|
-
};
|
|
5040
|
-
var windowsVersionMap = {
|
|
5041
|
-
"ME": "4.90",
|
|
5042
|
-
"NT 3.51": "3.51",
|
|
5043
|
-
"NT 4.0": "4.0",
|
|
5044
|
-
"2000": ["5.0", "5.01"],
|
|
5045
|
-
"XP": ["5.1", "5.2"],
|
|
5046
|
-
"Vista": "6.0",
|
|
5047
|
-
"7": "6.1",
|
|
5048
|
-
"8": "6.2",
|
|
5049
|
-
"8.1": "6.3",
|
|
5050
|
-
"10": ["6.4", "10.0"],
|
|
5051
|
-
"NT": ""
|
|
5052
|
-
};
|
|
5053
|
-
var formFactorsMap = {
|
|
5054
|
-
"embedded": "Automotive",
|
|
5055
|
-
"mobile": "Mobile",
|
|
5056
|
-
"tablet": ["Tablet", "EInk"],
|
|
5057
|
-
"smarttv": "TV",
|
|
5058
|
-
"wearable": "Watch",
|
|
5059
|
-
"xr": ["VR", "XR"],
|
|
5060
|
-
"?": ["Desktop", "Unknown"],
|
|
5061
|
-
"*": void 0
|
|
5062
|
-
};
|
|
5063
|
-
var browserHintsMap = {
|
|
5064
|
-
"Chrome": "Google Chrome",
|
|
5065
|
-
"Edge": "Microsoft Edge",
|
|
5066
|
-
"Edge WebView2": "Microsoft Edge WebView2",
|
|
5067
|
-
"Chrome WebView": "Android WebView",
|
|
5068
|
-
"Chrome Headless": "HeadlessChrome",
|
|
5069
|
-
"Huawei Browser": "HuaweiBrowser",
|
|
5070
|
-
"MIUI Browser": "Miui Browser",
|
|
5071
|
-
"Opera Mobi": "OperaMobile",
|
|
5072
|
-
"Yandex": "YaBrowser"
|
|
5073
|
-
};
|
|
5074
|
-
var defaultRegexes = {
|
|
5075
|
-
browser: [
|
|
5076
|
-
[
|
|
5077
|
-
// Most common regardless engine
|
|
5078
|
-
/\b(?:crmo|crios)\/([\w\.]+)/i
|
|
5079
|
-
// Chrome for Android/iOS
|
|
5080
|
-
],
|
|
5081
|
-
[VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
|
|
5082
|
-
[
|
|
5083
|
-
/webview.+edge\/([\w\.]+)/i
|
|
5084
|
-
// Microsoft Edge
|
|
5085
|
-
],
|
|
5086
|
-
[VERSION3, [NAME, EDGE + " WebView"]],
|
|
5087
|
-
[
|
|
5088
|
-
/edg(?:e|ios|a)?\/([\w\.]+)/i
|
|
5089
|
-
],
|
|
5090
|
-
[VERSION3, [NAME, "Edge"]],
|
|
5091
|
-
[
|
|
5092
|
-
// Presto based
|
|
5093
|
-
/(opera mini)\/([-\w\.]+)/i,
|
|
5094
|
-
// Opera Mini
|
|
5095
|
-
/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,
|
|
5096
|
-
// Opera Mobi/Tablet
|
|
5097
|
-
/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i
|
|
5098
|
-
// Opera
|
|
5099
|
-
],
|
|
5100
|
-
[NAME, VERSION3],
|
|
5101
|
-
[
|
|
5102
|
-
/opios[\/ ]+([\w\.]+)/i
|
|
5103
|
-
// Opera mini on iphone >= 8.0
|
|
5104
|
-
],
|
|
5105
|
-
[VERSION3, [NAME, OPERA + " Mini"]],
|
|
5106
|
-
[
|
|
5107
|
-
/\bop(?:rg)?x\/([\w\.]+)/i
|
|
5108
|
-
// Opera GX
|
|
5109
|
-
],
|
|
5110
|
-
[VERSION3, [NAME, OPERA + " GX"]],
|
|
5111
|
-
[
|
|
5112
|
-
/\bopr\/([\w\.]+)/i
|
|
5113
|
-
// Opera Webkit
|
|
5114
|
-
],
|
|
5115
|
-
[VERSION3, [NAME, OPERA]],
|
|
5116
|
-
[
|
|
5117
|
-
// Mixed
|
|
5118
|
-
/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i
|
|
5119
|
-
// Baidu
|
|
5120
|
-
],
|
|
5121
|
-
[VERSION3, [NAME, "Baidu"]],
|
|
5122
|
-
[
|
|
5123
|
-
/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i
|
|
5124
|
-
// Maxthon
|
|
5125
|
-
],
|
|
5126
|
-
[VERSION3, [NAME, "Maxthon"]],
|
|
5127
|
-
[
|
|
5128
|
-
/(kindle)\/([\w\.]+)/i,
|
|
5129
|
-
// Kindle
|
|
5130
|
-
/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,
|
|
5131
|
-
// Lunascape/Maxthon/Netfront/Jasmine/Blazer/Sleipnir
|
|
5132
|
-
// Trident based
|
|
5133
|
-
/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,
|
|
5134
|
-
// Avant/IEMobile/SlimBrowser/SlimBoat/Slimjet
|
|
5135
|
-
/(?:ms|\()(ie) ([\w\.]+)/i,
|
|
5136
|
-
// Internet Explorer
|
|
5137
|
-
// Blink/Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon/LG Browser/Otter/qutebrowser/Dooble/Palemoon
|
|
5138
|
-
/(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,
|
|
5139
|
-
// Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ//Vivaldi/DuckDuckGo/Klar/Helio/Dragon
|
|
5140
|
-
/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,
|
|
5141
|
-
// HeyTap/Ovi/115/Surf
|
|
5142
|
-
/(qwant)(?:ios|mobile)\/([\d\.]+)/i,
|
|
5143
|
-
// Qwant
|
|
5144
|
-
/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i
|
|
5145
|
-
// Ecosia/Weibo
|
|
5146
|
-
],
|
|
5147
|
-
[NAME, VERSION3],
|
|
5148
|
-
[
|
|
5149
|
-
/quark(?:pc)?\/([-\w\.]+)/i
|
|
5150
|
-
// Quark
|
|
5151
|
-
],
|
|
5152
|
-
[VERSION3, [NAME, "Quark"]],
|
|
5153
|
-
[
|
|
5154
|
-
/\bddg\/([\w\.]+)/i
|
|
5155
|
-
// DuckDuckGo
|
|
5156
|
-
],
|
|
5157
|
-
[VERSION3, [NAME, "DuckDuckGo"]],
|
|
5158
|
-
[
|
|
5159
|
-
/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i
|
|
5160
|
-
// UCBrowser
|
|
5161
|
-
],
|
|
5162
|
-
[VERSION3, [NAME, "UCBrowser"]],
|
|
5163
|
-
[
|
|
5164
|
-
/microm.+\bqbcore\/([\w\.]+)/i,
|
|
5165
|
-
// WeChat Desktop for Windows Built-in Browser
|
|
5166
|
-
/\bqbcore\/([\w\.]+).+microm/i,
|
|
5167
|
-
/micromessenger\/([\w\.]+)/i
|
|
5168
|
-
// WeChat
|
|
5169
|
-
],
|
|
5170
|
-
[VERSION3, [NAME, "WeChat"]],
|
|
5171
|
-
[
|
|
5172
|
-
/konqueror\/([\w\.]+)/i
|
|
5173
|
-
// Konqueror
|
|
5174
|
-
],
|
|
5175
|
-
[VERSION3, [NAME, "Konqueror"]],
|
|
5176
|
-
[
|
|
5177
|
-
/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i
|
|
5178
|
-
// IE11
|
|
5179
|
-
],
|
|
5180
|
-
[VERSION3, [NAME, "IE"]],
|
|
5181
|
-
[
|
|
5182
|
-
/ya(?:search)?browser\/([\w\.]+)/i
|
|
5183
|
-
// Yandex
|
|
5184
|
-
],
|
|
5185
|
-
[VERSION3, [NAME, "Yandex"]],
|
|
5186
|
-
[
|
|
5187
|
-
/slbrowser\/([\w\.]+)/i
|
|
5188
|
-
// Smart Lenovo Browser
|
|
5189
|
-
],
|
|
5190
|
-
[VERSION3, [NAME, "Smart " + LENOVO + SUFFIX_BROWSER]],
|
|
5191
|
-
[
|
|
5192
|
-
/(avast|avg)\/([\w\.]+)/i
|
|
5193
|
-
// Avast/AVG Secure Browser
|
|
5194
|
-
],
|
|
5195
|
-
[[NAME, /(.+)/, "$1 Secure" + SUFFIX_BROWSER], VERSION3],
|
|
5196
|
-
[
|
|
5197
|
-
/\bfocus\/([\w\.]+)/i
|
|
5198
|
-
// Firefox Focus
|
|
5199
|
-
],
|
|
5200
|
-
[VERSION3, [NAME, FIREFOX + " Focus"]],
|
|
5201
|
-
[
|
|
5202
|
-
/\bopt\/([\w\.]+)/i
|
|
5203
|
-
// Opera Touch
|
|
5204
|
-
],
|
|
5205
|
-
[VERSION3, [NAME, OPERA + " Touch"]],
|
|
5206
|
-
[
|
|
5207
|
-
/coc_coc\w+\/([\w\.]+)/i
|
|
5208
|
-
// Coc Coc Browser
|
|
5209
|
-
],
|
|
5210
|
-
[VERSION3, [NAME, "Coc Coc"]],
|
|
5211
|
-
[
|
|
5212
|
-
/dolfin\/([\w\.]+)/i
|
|
5213
|
-
// Dolphin
|
|
5214
|
-
],
|
|
5215
|
-
[VERSION3, [NAME, "Dolphin"]],
|
|
5216
|
-
[
|
|
5217
|
-
/coast\/([\w\.]+)/i
|
|
5218
|
-
// Opera Coast
|
|
5219
|
-
],
|
|
5220
|
-
[VERSION3, [NAME, OPERA + " Coast"]],
|
|
5221
|
-
[
|
|
5222
|
-
/miuibrowser\/([\w\.]+)/i
|
|
5223
|
-
// MIUI Browser
|
|
5224
|
-
],
|
|
5225
|
-
[VERSION3, [NAME, "MIUI" + SUFFIX_BROWSER]],
|
|
5226
|
-
[
|
|
5227
|
-
/fxios\/([\w\.-]+)/i
|
|
5228
|
-
// Firefox for iOS
|
|
5229
|
-
],
|
|
5230
|
-
[VERSION3, [NAME, PREFIX_MOBILE + FIREFOX]],
|
|
5231
|
-
[
|
|
5232
|
-
/\bqihoobrowser\/?([\w\.]*)/i
|
|
5233
|
-
// 360
|
|
5234
|
-
],
|
|
5235
|
-
[VERSION3, [NAME, "360"]],
|
|
5236
|
-
[
|
|
5237
|
-
/\b(qq)\/([\w\.]+)/i
|
|
5238
|
-
// QQ
|
|
5239
|
-
],
|
|
5240
|
-
[[NAME, /(.+)/, "$1Browser"], VERSION3],
|
|
5241
|
-
[
|
|
5242
|
-
/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i
|
|
5243
|
-
],
|
|
5244
|
-
[[NAME, /(.+)/, "$1" + SUFFIX_BROWSER], VERSION3],
|
|
5245
|
-
[
|
|
5246
|
-
// Oculus/Sailfish/HuaweiBrowser/VivoBrowser/PicoBrowser
|
|
5247
|
-
/samsungbrowser\/([\w\.]+)/i
|
|
5248
|
-
// Samsung Internet
|
|
5249
|
-
],
|
|
5250
|
-
[VERSION3, [NAME, SAMSUNG + " Internet"]],
|
|
5251
|
-
[
|
|
5252
|
-
/metasr[\/ ]?([\d\.]+)/i
|
|
5253
|
-
// Sogou Explorer
|
|
5254
|
-
],
|
|
5255
|
-
[VERSION3, [NAME, SOGOU + " Explorer"]],
|
|
5256
|
-
[
|
|
5257
|
-
/(sogou)mo\w+\/([\d\.]+)/i
|
|
5258
|
-
// Sogou Mobile
|
|
5259
|
-
],
|
|
5260
|
-
[[NAME, SOGOU + " Mobile"], VERSION3],
|
|
5261
|
-
[
|
|
5262
|
-
/(electron)\/([\w\.]+) safari/i,
|
|
5263
|
-
// Electron-based App
|
|
5264
|
-
/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,
|
|
5265
|
-
// Tesla
|
|
5266
|
-
/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i
|
|
5267
|
-
// QQ/2345
|
|
5268
|
-
],
|
|
5269
|
-
[NAME, VERSION3],
|
|
5270
|
-
[
|
|
5271
|
-
/(lbbrowser|rekonq)/i
|
|
5272
|
-
// LieBao Browser/Rekonq
|
|
5273
|
-
],
|
|
5274
|
-
[NAME],
|
|
5275
|
-
[
|
|
5276
|
-
/ome\/([\w\.]+) \w* ?(iron) saf/i,
|
|
5277
|
-
// Iron
|
|
5278
|
-
/ome\/([\w\.]+).+qihu (360)[es]e/i
|
|
5279
|
-
// 360
|
|
5280
|
-
],
|
|
5281
|
-
[VERSION3, NAME],
|
|
5282
|
-
[
|
|
5283
|
-
// WebView
|
|
5284
|
-
/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i
|
|
5285
|
-
// Facebook App for iOS & Android
|
|
5286
|
-
],
|
|
5287
|
-
[[NAME, FACEBOOK], VERSION3, [TYPE, INAPP]],
|
|
5288
|
-
[
|
|
5289
|
-
/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,
|
|
5290
|
-
// Kakao App
|
|
5291
|
-
/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,
|
|
5292
|
-
// Naver InApp
|
|
5293
|
-
/(daum)apps[\/ ]([\w\.]+)/i,
|
|
5294
|
-
// Daum App
|
|
5295
|
-
/safari (line)\/([\w\.]+)/i,
|
|
5296
|
-
// Line App for iOS
|
|
5297
|
-
/\b(line)\/([\w\.]+)\/iab/i,
|
|
5298
|
-
// Line App for Android
|
|
5299
|
-
/(alipay)client\/([\w\.]+)/i,
|
|
5300
|
-
// Alipay
|
|
5301
|
-
/(twitter)(?:and| f.+e\/([\w\.]+))/i,
|
|
5302
|
-
// Twitter
|
|
5303
|
-
/(bing)(?:web|sapphire)\/([\w\.]+)/i,
|
|
5304
|
-
// Bing
|
|
5305
|
-
/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i
|
|
5306
|
-
// Instagram/Snapchat/Klarna
|
|
5307
|
-
],
|
|
5308
|
-
[NAME, VERSION3, [TYPE, INAPP]],
|
|
5309
|
-
[
|
|
5310
|
-
/\bgsa\/([\w\.]+) .*safari\//i
|
|
5311
|
-
// Google Search Appliance on iOS
|
|
5312
|
-
],
|
|
5313
|
-
[VERSION3, [NAME, "GSA"], [TYPE, INAPP]],
|
|
5314
|
-
[
|
|
5315
|
-
/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i
|
|
5316
|
-
// TikTok
|
|
5317
|
-
],
|
|
5318
|
-
[VERSION3, [NAME, "TikTok"], [TYPE, INAPP]],
|
|
5319
|
-
[
|
|
5320
|
-
/\[(linkedin)app\]/i
|
|
5321
|
-
// LinkedIn App for iOS & Android
|
|
5322
|
-
],
|
|
5323
|
-
[NAME, [TYPE, INAPP]],
|
|
5324
|
-
[
|
|
5325
|
-
/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i
|
|
5326
|
-
// Zalo
|
|
5327
|
-
],
|
|
5328
|
-
[[NAME, /(.+)/, "Zalo"], VERSION3, [TYPE, INAPP]],
|
|
5329
|
-
[
|
|
5330
|
-
/(chromium)[\/ ]([-\w\.]+)/i
|
|
5331
|
-
// Chromium
|
|
5332
|
-
],
|
|
5333
|
-
[NAME, VERSION3],
|
|
5334
|
-
[
|
|
5335
|
-
/headlesschrome(?:\/([\w\.]+)| )/i
|
|
5336
|
-
// Chrome Headless
|
|
5337
|
-
],
|
|
5338
|
-
[VERSION3, [NAME, CHROME + " Headless"]],
|
|
5339
|
-
[
|
|
5340
|
-
/wv\).+chrome\/([\w\.]+).+edgw\//i
|
|
5341
|
-
// Edge WebView2
|
|
5342
|
-
],
|
|
5343
|
-
[VERSION3, [NAME, EDGE + " WebView2"]],
|
|
5344
|
-
[
|
|
5345
|
-
/ wv\).+(chrome)\/([\w\.]+)/i
|
|
5346
|
-
// Chrome WebView
|
|
5347
|
-
],
|
|
5348
|
-
[[NAME, CHROME + " WebView"], VERSION3],
|
|
5349
|
-
[
|
|
5350
|
-
/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i
|
|
5351
|
-
// Android Browser
|
|
5352
|
-
],
|
|
5353
|
-
[VERSION3, [NAME, "Android" + SUFFIX_BROWSER]],
|
|
5354
|
-
[
|
|
5355
|
-
/chrome\/([\w\.]+) mobile/i
|
|
5356
|
-
// Chrome Mobile
|
|
5357
|
-
],
|
|
5358
|
-
[VERSION3, [NAME, PREFIX_MOBILE + "Chrome"]],
|
|
5359
|
-
[
|
|
5360
|
-
/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i
|
|
5361
|
-
// Chrome/OmniWeb/Arora/Tizen/Nokia
|
|
5362
|
-
],
|
|
5363
|
-
[NAME, VERSION3],
|
|
5364
|
-
[
|
|
5365
|
-
/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i
|
|
5366
|
-
// Safari Mobile
|
|
5367
|
-
],
|
|
5368
|
-
[VERSION3, [NAME, PREFIX_MOBILE + "Safari"]],
|
|
5369
|
-
[
|
|
5370
|
-
/iphone .*mobile(?:\/\w+ | ?)safari/i
|
|
5371
|
-
],
|
|
5372
|
-
[[NAME, PREFIX_MOBILE + "Safari"]],
|
|
5373
|
-
[
|
|
5374
|
-
/version\/([\w\.\,]+) .*(safari)/i
|
|
5375
|
-
// Safari
|
|
5376
|
-
],
|
|
5377
|
-
[VERSION3, NAME],
|
|
5378
|
-
[
|
|
5379
|
-
/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i
|
|
5380
|
-
// Safari < 3.0
|
|
5381
|
-
],
|
|
5382
|
-
[NAME, [VERSION3, "1"]],
|
|
5383
|
-
[
|
|
5384
|
-
/(webkit|khtml)\/([\w\.]+)/i
|
|
5385
|
-
],
|
|
5386
|
-
[NAME, VERSION3],
|
|
5387
|
-
[
|
|
5388
|
-
// Gecko based
|
|
5389
|
-
/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i
|
|
5390
|
-
// Firefox Mobile
|
|
5391
|
-
],
|
|
5392
|
-
[[NAME, PREFIX_MOBILE + FIREFOX], VERSION3],
|
|
5393
|
-
[
|
|
5394
|
-
/(navigator|netscape\d?)\/([-\w\.]+)/i
|
|
5395
|
-
// Netscape
|
|
5396
|
-
],
|
|
5397
|
-
[[NAME, "Netscape"], VERSION3],
|
|
5398
|
-
[
|
|
5399
|
-
/(wolvic|librewolf)\/([\w\.]+)/i
|
|
5400
|
-
// Wolvic/LibreWolf
|
|
5401
|
-
],
|
|
5402
|
-
[NAME, VERSION3],
|
|
5403
|
-
[
|
|
5404
|
-
/mobile vr; rv:([\w\.]+)\).+firefox/i
|
|
5405
|
-
// Firefox Reality
|
|
5406
|
-
],
|
|
5407
|
-
[VERSION3, [NAME, FIREFOX + " Reality"]],
|
|
5408
|
-
[
|
|
5409
|
-
/ekiohf.+(flow)\/([\w\.]+)/i,
|
|
5410
|
-
// Flow
|
|
5411
|
-
/(swiftfox)/i,
|
|
5412
|
-
// Swiftfox
|
|
5413
|
-
/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,
|
|
5414
|
-
// IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror
|
|
5415
|
-
/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,
|
|
5416
|
-
// Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix
|
|
5417
|
-
/(firefox)\/([\w\.]+)/i,
|
|
5418
|
-
// Other Firefox-based
|
|
5419
|
-
/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,
|
|
5420
|
-
// Mozilla
|
|
5421
|
-
// Other
|
|
5422
|
-
/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,
|
|
5423
|
-
// Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Obigo/Mosaic/Go/ICE/UP.Browser/Ladybird
|
|
5424
|
-
/\b(links) \(([\w\.]+)/i
|
|
5425
|
-
// Links
|
|
5426
|
-
],
|
|
5427
|
-
[NAME, [VERSION3, /_/g, "."]],
|
|
5428
|
-
[
|
|
5429
|
-
/(cobalt)\/([\w\.]+)/i
|
|
5430
|
-
// Cobalt
|
|
5431
|
-
],
|
|
5432
|
-
[NAME, [VERSION3, /[^\d\.]+./, EMPTY]]
|
|
5433
|
-
],
|
|
5434
|
-
cpu: [
|
|
5435
|
-
[
|
|
5436
|
-
/\b((amd|x|x86[-_]?|wow|win)64)\b/i
|
|
5437
|
-
// AMD64 (x64)
|
|
5438
|
-
],
|
|
5439
|
-
[[ARCHITECTURE, "amd64"]],
|
|
5440
|
-
[
|
|
5441
|
-
/(ia32(?=;))/i,
|
|
5442
|
-
// IA32 (quicktime)
|
|
5443
|
-
/\b((i[346]|x)86)(pc)?\b/i
|
|
5444
|
-
// IA32 (x86)
|
|
5445
|
-
],
|
|
5446
|
-
[[ARCHITECTURE, "ia32"]],
|
|
5447
|
-
[
|
|
5448
|
-
/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i
|
|
5449
|
-
// ARM64
|
|
5450
|
-
],
|
|
5451
|
-
[[ARCHITECTURE, "arm64"]],
|
|
5452
|
-
[
|
|
5453
|
-
/\b(arm(v[67])?ht?n?[fl]p?)\b/i
|
|
5454
|
-
// ARMHF
|
|
5455
|
-
],
|
|
5456
|
-
[[ARCHITECTURE, "armhf"]],
|
|
5457
|
-
[
|
|
5458
|
-
// PocketPC mistakenly identified as PowerPC
|
|
5459
|
-
/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i
|
|
5460
|
-
],
|
|
5461
|
-
[[ARCHITECTURE, "arm"]],
|
|
5462
|
-
[
|
|
5463
|
-
/ sun4\w[;\)]/i
|
|
5464
|
-
// SPARC
|
|
5465
|
-
],
|
|
5466
|
-
[[ARCHITECTURE, "sparc"]],
|
|
5467
|
-
[
|
|
5468
|
-
// IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC
|
|
5469
|
-
/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,
|
|
5470
|
-
/((ppc|powerpc)(64)?)( mac|;|\))/i,
|
|
5471
|
-
// PowerPC
|
|
5472
|
-
/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i
|
|
5473
|
-
// Alpha
|
|
5474
|
-
],
|
|
5475
|
-
[[ARCHITECTURE, /ower/, EMPTY, lowerize]],
|
|
5476
|
-
[
|
|
5477
|
-
/mc680.0/i
|
|
5478
|
-
],
|
|
5479
|
-
[[ARCHITECTURE, "68k"]],
|
|
5480
|
-
[
|
|
5481
|
-
/winnt.+\[axp/i
|
|
5482
|
-
],
|
|
5483
|
-
[[ARCHITECTURE, "alpha"]]
|
|
5484
|
-
],
|
|
5485
|
-
device: [
|
|
5486
|
-
[
|
|
5487
|
-
//////////////////////////
|
|
5488
|
-
// MOBILES & TABLETS
|
|
5489
|
-
/////////////////////////
|
|
5490
|
-
// Samsung
|
|
5491
|
-
/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i
|
|
5492
|
-
],
|
|
5493
|
-
[MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]],
|
|
5494
|
-
[
|
|
5495
|
-
/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,
|
|
5496
|
-
/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,
|
|
5497
|
-
/sec-(sgh\w+)/i
|
|
5498
|
-
],
|
|
5499
|
-
[MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]],
|
|
5500
|
-
[
|
|
5501
|
-
// Apple
|
|
5502
|
-
/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i
|
|
5503
|
-
// iPod/iPhone
|
|
5504
|
-
],
|
|
5505
|
-
[MODEL, [VENDOR, APPLE], [TYPE, MOBILE]],
|
|
5506
|
-
[
|
|
5507
|
-
/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,
|
|
5508
|
-
// iPad
|
|
5509
|
-
/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i
|
|
5510
|
-
],
|
|
5511
|
-
[MODEL, [VENDOR, APPLE], [TYPE, TABLET]],
|
|
5512
|
-
[
|
|
5513
|
-
/(macintosh);/i
|
|
5514
|
-
],
|
|
5515
|
-
[MODEL, [VENDOR, APPLE]],
|
|
5516
|
-
[
|
|
5517
|
-
// Sharp
|
|
5518
|
-
/\b(sh-?[altvz]?\d\d[a-ekm]?)/i
|
|
5519
|
-
],
|
|
5520
|
-
[MODEL, [VENDOR, SHARP], [TYPE, MOBILE]],
|
|
5521
|
-
[
|
|
5522
|
-
// Honor
|
|
5523
|
-
/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i
|
|
5524
|
-
],
|
|
5525
|
-
[MODEL, [VENDOR, HONOR], [TYPE, TABLET]],
|
|
5526
|
-
[
|
|
5527
|
-
/honor([-\w ]+)[;\)]/i
|
|
5528
|
-
],
|
|
5529
|
-
[MODEL, [VENDOR, HONOR], [TYPE, MOBILE]],
|
|
5530
|
-
[
|
|
5531
|
-
// Huawei
|
|
5532
|
-
/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i
|
|
5533
|
-
],
|
|
5534
|
-
[MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]],
|
|
5535
|
-
[
|
|
5536
|
-
/(?:huawei) ?([-\w ]+)[;\)]/i,
|
|
5537
|
-
/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i
|
|
5538
|
-
],
|
|
5539
|
-
[MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]],
|
|
5540
|
-
[
|
|
5541
|
-
// Xiaomi
|
|
5542
|
-
/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,
|
|
5543
|
-
/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i
|
|
5544
|
-
// Mi Pad tablets
|
|
5545
|
-
],
|
|
5546
|
-
[[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, TABLET]],
|
|
5547
|
-
[
|
|
5548
|
-
/\b(poco[\w ]+|m2\d{3}j\d\d[a-z]{2})(?: bui|\))/i,
|
|
5549
|
-
// Xiaomi POCO
|
|
5550
|
-
/\b; (\w+) build\/hm\1/i,
|
|
5551
|
-
// Xiaomi Hongmi 'numeric' models
|
|
5552
|
-
/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,
|
|
5553
|
-
// Xiaomi Hongmi
|
|
5554
|
-
/\b(redmi[\-_ ]?(?:note|k)?[\w_ ]+)(?: bui|\))/i,
|
|
5555
|
-
// Xiaomi Redmi
|
|
5556
|
-
/oid[^\)]+; (m?[12][0-389][01]\w{3,6}[c-y])( bui|; wv|\))/i,
|
|
5557
|
-
// Xiaomi Redmi 'numeric' models
|
|
5558
|
-
/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,
|
|
5559
|
-
// Xiaomi Mi
|
|
5560
|
-
/ ([\w ]+) miui\/v?\d/i
|
|
5561
|
-
],
|
|
5562
|
-
[[MODEL, /_/g, " "], [VENDOR, XIAOMI], [TYPE, MOBILE]],
|
|
5563
|
-
[
|
|
5564
|
-
// OnePlus
|
|
5565
|
-
/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,
|
|
5566
|
-
/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i
|
|
5567
|
-
],
|
|
5568
|
-
[MODEL, [VENDOR, ONEPLUS], [TYPE, MOBILE]],
|
|
5569
|
-
[
|
|
5570
|
-
// OPPO
|
|
5571
|
-
/; (\w+) bui.+ oppo/i,
|
|
5572
|
-
/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i
|
|
5573
|
-
],
|
|
5574
|
-
[MODEL, [VENDOR, OPPO], [TYPE, MOBILE]],
|
|
5575
|
-
[
|
|
5576
|
-
/\b(opd2(\d{3}a?))(?: bui|\))/i
|
|
5577
|
-
],
|
|
5578
|
-
[MODEL, [VENDOR, strMapper, { "OnePlus": ["203", "304", "403", "404", "413", "415"], "*": OPPO }], [TYPE, TABLET]],
|
|
5579
|
-
[
|
|
5580
|
-
// BLU
|
|
5581
|
-
/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i
|
|
5582
|
-
// Vivo series
|
|
5583
|
-
],
|
|
5584
|
-
[MODEL, [VENDOR, "BLU"], [TYPE, MOBILE]],
|
|
5585
|
-
[
|
|
5586
|
-
// Vivo
|
|
5587
|
-
/; vivo (\w+)(?: bui|\))/i,
|
|
5588
|
-
/\b(v[12]\d{3}\w?[at])(?: bui|;)/i
|
|
5589
|
-
],
|
|
5590
|
-
[MODEL, [VENDOR, "Vivo"], [TYPE, MOBILE]],
|
|
5591
|
-
[
|
|
5592
|
-
// Realme
|
|
5593
|
-
/\b(rmx[1-3]\d{3})(?: bui|;|\))/i
|
|
5594
|
-
],
|
|
5595
|
-
[MODEL, [VENDOR, "Realme"], [TYPE, MOBILE]],
|
|
5596
|
-
[
|
|
5597
|
-
// Lenovo
|
|
5598
|
-
/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,
|
|
5599
|
-
/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i
|
|
5600
|
-
],
|
|
5601
|
-
[MODEL, [VENDOR, LENOVO], [TYPE, TABLET]],
|
|
5602
|
-
[
|
|
5603
|
-
/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i
|
|
5604
|
-
],
|
|
5605
|
-
[MODEL, [VENDOR, LENOVO], [TYPE, MOBILE]],
|
|
5606
|
-
[
|
|
5607
|
-
// Motorola
|
|
5608
|
-
/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,
|
|
5609
|
-
/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,
|
|
5610
|
-
/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i
|
|
5611
|
-
],
|
|
5612
|
-
[MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]],
|
|
5613
|
-
[
|
|
5614
|
-
/\b(mz60\d|xoom[2 ]{0,2}) build\//i
|
|
5615
|
-
],
|
|
5616
|
-
[MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]],
|
|
5617
|
-
[
|
|
5618
|
-
// LG
|
|
5619
|
-
/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i
|
|
5620
|
-
],
|
|
5621
|
-
[MODEL, [VENDOR, LG], [TYPE, TABLET]],
|
|
5622
|
-
[
|
|
5623
|
-
/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,
|
|
5624
|
-
/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,
|
|
5625
|
-
/\blg-?([\d\w]+) bui/i
|
|
5626
|
-
],
|
|
5627
|
-
[MODEL, [VENDOR, LG], [TYPE, MOBILE]],
|
|
5628
|
-
[
|
|
5629
|
-
// Nokia
|
|
5630
|
-
/(nokia) (t[12][01])/i
|
|
5631
|
-
],
|
|
5632
|
-
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
5633
|
-
[
|
|
5634
|
-
/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,
|
|
5635
|
-
/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i
|
|
5636
|
-
],
|
|
5637
|
-
[[MODEL, /_/g, " "], [TYPE, MOBILE], [VENDOR, "Nokia"]],
|
|
5638
|
-
[
|
|
5639
|
-
// Google
|
|
5640
|
-
/(pixel (c|tablet))\b/i
|
|
5641
|
-
// Google Pixel C/Tablet
|
|
5642
|
-
],
|
|
5643
|
-
[MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]],
|
|
5644
|
-
[
|
|
5645
|
-
// Google Pixel
|
|
5646
|
-
/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i
|
|
5647
|
-
],
|
|
5648
|
-
[MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]],
|
|
5649
|
-
[
|
|
5650
|
-
/(google) (pixelbook( go)?)/i
|
|
5651
|
-
],
|
|
5652
|
-
[VENDOR, MODEL],
|
|
5653
|
-
[
|
|
5654
|
-
// Sony
|
|
5655
|
-
/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i
|
|
5656
|
-
],
|
|
5657
|
-
[MODEL, [VENDOR, SONY], [TYPE, MOBILE]],
|
|
5658
|
-
[
|
|
5659
|
-
/sony tablet [ps]/i,
|
|
5660
|
-
/\b(?:sony)?sgp\w+(?: bui|\))/i
|
|
5661
|
-
],
|
|
5662
|
-
[[MODEL, "Xperia Tablet"], [VENDOR, SONY], [TYPE, TABLET]],
|
|
5663
|
-
[
|
|
5664
|
-
// Amazon
|
|
5665
|
-
/(alexa)webm/i,
|
|
5666
|
-
/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,
|
|
5667
|
-
// Kindle Fire without Silk / Echo Show
|
|
5668
|
-
/(kf[a-z]+)( bui|\)).+silk\//i
|
|
5669
|
-
// Kindle Fire HD
|
|
5670
|
-
],
|
|
5671
|
-
[MODEL, [VENDOR, AMAZON], [TYPE, TABLET]],
|
|
5672
|
-
[
|
|
5673
|
-
/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i
|
|
5674
|
-
// Fire Phone
|
|
5675
|
-
],
|
|
5676
|
-
[[MODEL, /(.+)/g, "Fire Phone $1"], [VENDOR, AMAZON], [TYPE, MOBILE]],
|
|
5677
|
-
[
|
|
5678
|
-
// BlackBerry
|
|
5679
|
-
/(playbook);[-\w\),; ]+(rim)/i
|
|
5680
|
-
// BlackBerry PlayBook
|
|
5681
|
-
],
|
|
5682
|
-
[MODEL, VENDOR, [TYPE, TABLET]],
|
|
5683
|
-
[
|
|
5684
|
-
/\b((?:bb[a-f]|st[hv])100-\d)/i,
|
|
5685
|
-
/(?:blackberry|\(bb10;) (\w+)/i
|
|
5686
|
-
],
|
|
5687
|
-
[MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]],
|
|
5688
|
-
[
|
|
5689
|
-
// Asus
|
|
5690
|
-
/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i
|
|
5691
|
-
],
|
|
5692
|
-
[MODEL, [VENDOR, ASUS], [TYPE, TABLET]],
|
|
5693
|
-
[
|
|
5694
|
-
/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i
|
|
5695
|
-
],
|
|
5696
|
-
[MODEL, [VENDOR, ASUS], [TYPE, MOBILE]],
|
|
5697
|
-
[
|
|
5698
|
-
// HTC
|
|
5699
|
-
/(nexus 9)/i
|
|
5700
|
-
// HTC Nexus 9
|
|
5701
|
-
],
|
|
5702
|
-
[MODEL, [VENDOR, "HTC"], [TYPE, TABLET]],
|
|
5703
|
-
[
|
|
5704
|
-
/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,
|
|
5705
|
-
// HTC
|
|
5706
|
-
// ZTE
|
|
5707
|
-
/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,
|
|
5708
|
-
/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i
|
|
5709
|
-
// Alcatel/GeeksPhone/Nexian/Panasonic/Sony
|
|
5710
|
-
],
|
|
5711
|
-
[VENDOR, [MODEL, /_/g, " "], [TYPE, MOBILE]],
|
|
5712
|
-
[
|
|
5713
|
-
// TCL
|
|
5714
|
-
/tcl (xess p17aa)/i,
|
|
5715
|
-
/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i
|
|
5716
|
-
],
|
|
5717
|
-
[MODEL, [VENDOR, "TCL"], [TYPE, TABLET]],
|
|
5718
|
-
[
|
|
5719
|
-
/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i
|
|
5720
|
-
],
|
|
5721
|
-
[MODEL, [VENDOR, "TCL"], [TYPE, MOBILE]],
|
|
5722
|
-
[
|
|
5723
|
-
// itel
|
|
5724
|
-
/(itel) ((\w+))/i
|
|
5725
|
-
],
|
|
5726
|
-
[[VENDOR, lowerize], MODEL, [TYPE, strMapper, { "tablet": ["p10001l", "w7001"], "*": "mobile" }]],
|
|
5727
|
-
[
|
|
5728
|
-
// Acer
|
|
5729
|
-
/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i
|
|
5730
|
-
],
|
|
5731
|
-
[MODEL, [VENDOR, "Acer"], [TYPE, TABLET]],
|
|
5732
|
-
[
|
|
5733
|
-
// Meizu
|
|
5734
|
-
/droid.+; (m[1-5] note) bui/i,
|
|
5735
|
-
/\bmz-([-\w]{2,})/i
|
|
5736
|
-
],
|
|
5737
|
-
[MODEL, [VENDOR, "Meizu"], [TYPE, MOBILE]],
|
|
5738
|
-
[
|
|
5739
|
-
// Ulefone
|
|
5740
|
-
/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i
|
|
5741
|
-
],
|
|
5742
|
-
[MODEL, [VENDOR, "Ulefone"], [TYPE, MOBILE]],
|
|
5743
|
-
[
|
|
5744
|
-
// Energizer
|
|
5745
|
-
/; (energy ?\w+)(?: bui|\))/i,
|
|
5746
|
-
/; energizer ([\w ]+)(?: bui|\))/i
|
|
5747
|
-
],
|
|
5748
|
-
[MODEL, [VENDOR, "Energizer"], [TYPE, MOBILE]],
|
|
5749
|
-
[
|
|
5750
|
-
// Cat
|
|
5751
|
-
/; cat (b35);/i,
|
|
5752
|
-
/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i
|
|
5753
|
-
],
|
|
5754
|
-
[MODEL, [VENDOR, "Cat"], [TYPE, MOBILE]],
|
|
5755
|
-
[
|
|
5756
|
-
// Smartfren
|
|
5757
|
-
/((?:new )?andromax[\w- ]+)(?: bui|\))/i
|
|
5758
|
-
],
|
|
5759
|
-
[MODEL, [VENDOR, "Smartfren"], [TYPE, MOBILE]],
|
|
5760
|
-
[
|
|
5761
|
-
// Nothing
|
|
5762
|
-
/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i
|
|
5763
|
-
],
|
|
5764
|
-
[MODEL, [VENDOR, "Nothing"], [TYPE, MOBILE]],
|
|
5765
|
-
[
|
|
5766
|
-
// Archos
|
|
5767
|
-
/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,
|
|
5768
|
-
/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i
|
|
5769
|
-
],
|
|
5770
|
-
[MODEL, [VENDOR, "Archos"], [TYPE, TABLET]],
|
|
5771
|
-
[
|
|
5772
|
-
/archos ([\w ]+)( b|\))/i,
|
|
5773
|
-
/; (ac[3-6]\d\w{2,8})( b|\))/i
|
|
5774
|
-
],
|
|
5775
|
-
[MODEL, [VENDOR, "Archos"], [TYPE, MOBILE]],
|
|
5776
|
-
[
|
|
5777
|
-
// HMD
|
|
5778
|
-
/; (n159v)/i
|
|
5779
|
-
],
|
|
5780
|
-
[MODEL, [VENDOR, "HMD"], [TYPE, MOBILE]],
|
|
5781
|
-
[
|
|
5782
|
-
// MIXED
|
|
5783
|
-
/(imo) (tab \w+)/i,
|
|
5784
|
-
// IMO
|
|
5785
|
-
/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i
|
|
5786
|
-
// Infinix XPad / Tecno
|
|
5787
|
-
],
|
|
5788
|
-
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
5789
|
-
[
|
|
5790
|
-
/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,
|
|
5791
|
-
// BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron/Tecno/Micromax/Advan
|
|
5792
|
-
// BLU/HMD/IMO/Infinix/Lava/OnePlus/TCL/Wiko
|
|
5793
|
-
/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,
|
|
5794
|
-
/(hp) ([\w ]+\w)/i,
|
|
5795
|
-
// HP iPAQ
|
|
5796
|
-
/(microsoft); (lumia[\w ]+)/i,
|
|
5797
|
-
// Microsoft Lumia
|
|
5798
|
-
/(oppo) ?([\w ]+) bui/i,
|
|
5799
|
-
// OPPO
|
|
5800
|
-
/(hisense) ([ehv][\w ]+)\)/i,
|
|
5801
|
-
// Hisense
|
|
5802
|
-
/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i
|
|
5803
|
-
// Philips
|
|
5804
|
-
],
|
|
5805
|
-
[VENDOR, MODEL, [TYPE, MOBILE]],
|
|
5806
|
-
[
|
|
5807
|
-
/(kobo)\s(ereader|touch)/i,
|
|
5808
|
-
// Kobo
|
|
5809
|
-
/(hp).+(touchpad(?!.+tablet)|tablet)/i,
|
|
5810
|
-
// HP TouchPad
|
|
5811
|
-
/(kindle)\/([\w\.]+)/i
|
|
5812
|
-
// Kindle
|
|
5813
|
-
],
|
|
5814
|
-
[VENDOR, MODEL, [TYPE, TABLET]],
|
|
5815
|
-
[
|
|
5816
|
-
/(surface duo)/i
|
|
5817
|
-
// Surface Duo
|
|
5818
|
-
],
|
|
5819
|
-
[MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]],
|
|
5820
|
-
[
|
|
5821
|
-
/droid [\d\.]+; (fp\du?)(?: b|\))/i
|
|
5822
|
-
// Fairphone
|
|
5823
|
-
],
|
|
5824
|
-
[MODEL, [VENDOR, "Fairphone"], [TYPE, MOBILE]],
|
|
5825
|
-
[
|
|
5826
|
-
/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i
|
|
5827
|
-
// Nvidia Tablets
|
|
5828
|
-
],
|
|
5829
|
-
[MODEL, [VENDOR, NVIDIA], [TYPE, TABLET]],
|
|
5830
|
-
[
|
|
5831
|
-
/(sprint) (\w+)/i
|
|
5832
|
-
// Sprint Phones
|
|
5833
|
-
],
|
|
5834
|
-
[VENDOR, MODEL, [TYPE, MOBILE]],
|
|
5835
|
-
[
|
|
5836
|
-
/(kin\.[onetw]{3})/i
|
|
5837
|
-
// Microsoft Kin
|
|
5838
|
-
],
|
|
5839
|
-
[[MODEL, /\./g, " "], [VENDOR, MICROSOFT], [TYPE, MOBILE]],
|
|
5840
|
-
[
|
|
5841
|
-
/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i
|
|
5842
|
-
// Zebra
|
|
5843
|
-
],
|
|
5844
|
-
[MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]],
|
|
5845
|
-
[
|
|
5846
|
-
/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i
|
|
5847
|
-
],
|
|
5848
|
-
[MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]],
|
|
5849
|
-
[
|
|
5850
|
-
///////////////////
|
|
5851
|
-
// SMARTTVS
|
|
5852
|
-
///////////////////
|
|
5853
|
-
/(philips)[\w ]+tv/i,
|
|
5854
|
-
// Philips
|
|
5855
|
-
/smart-tv.+(samsung)/i
|
|
5856
|
-
// Samsung
|
|
5857
|
-
],
|
|
5858
|
-
[VENDOR, [TYPE, SMARTTV]],
|
|
5859
|
-
[
|
|
5860
|
-
/hbbtv.+maple;(\d+)/i
|
|
5861
|
-
],
|
|
5862
|
-
[[MODEL, /^/, "SmartTV"], [VENDOR, SAMSUNG], [TYPE, SMARTTV]],
|
|
5863
|
-
[
|
|
5864
|
-
/(vizio)(?: |.+model\/)(\w+-\w+)/i,
|
|
5865
|
-
// Vizio
|
|
5866
|
-
/tcast.+(lg)e?. ([-\w]+)/i
|
|
5867
|
-
// LG SmartTV
|
|
5868
|
-
],
|
|
5869
|
-
[VENDOR, MODEL, [TYPE, SMARTTV]],
|
|
5870
|
-
[
|
|
5871
|
-
/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i
|
|
5872
|
-
],
|
|
5873
|
-
[[VENDOR, LG], [TYPE, SMARTTV]],
|
|
5874
|
-
[
|
|
5875
|
-
/(apple) ?tv/i
|
|
5876
|
-
// Apple TV
|
|
5877
|
-
],
|
|
5878
|
-
[VENDOR, [MODEL, APPLE + " TV"], [TYPE, SMARTTV]],
|
|
5879
|
-
[
|
|
5880
|
-
/crkey.*devicetype\/chromecast/i
|
|
5881
|
-
// Google Chromecast Third Generation
|
|
5882
|
-
],
|
|
5883
|
-
[[MODEL, CHROMECAST + " Third Generation"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
5884
|
-
[
|
|
5885
|
-
/crkey.*devicetype\/([^/]*)/i
|
|
5886
|
-
// Google Chromecast with specific device type
|
|
5887
|
-
],
|
|
5888
|
-
[[MODEL, /^/, "Chromecast "], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
5889
|
-
[
|
|
5890
|
-
/fuchsia.*crkey/i
|
|
5891
|
-
// Google Chromecast Nest Hub
|
|
5892
|
-
],
|
|
5893
|
-
[[MODEL, CHROMECAST + " Nest Hub"], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
5894
|
-
[
|
|
5895
|
-
/crkey/i
|
|
5896
|
-
// Google Chromecast, Linux-based or unknown
|
|
5897
|
-
],
|
|
5898
|
-
[[MODEL, CHROMECAST], [VENDOR, GOOGLE], [TYPE, SMARTTV]],
|
|
5899
|
-
[
|
|
5900
|
-
/(portaltv)/i
|
|
5901
|
-
// Facebook Portal TV
|
|
5902
|
-
],
|
|
5903
|
-
[MODEL, [VENDOR, FACEBOOK], [TYPE, SMARTTV]],
|
|
5904
|
-
[
|
|
5905
|
-
/droid.+aft(\w+)( bui|\))/i
|
|
5906
|
-
// Fire TV
|
|
5907
|
-
],
|
|
5908
|
-
[MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]],
|
|
5909
|
-
[
|
|
5910
|
-
/(shield \w+ tv)/i
|
|
5911
|
-
// Nvidia Shield TV
|
|
5912
|
-
],
|
|
5913
|
-
[MODEL, [VENDOR, NVIDIA], [TYPE, SMARTTV]],
|
|
5914
|
-
[
|
|
5915
|
-
/\(dtv[\);].+(aquos)/i,
|
|
5916
|
-
/(aquos-tv[\w ]+)\)/i
|
|
5917
|
-
// Sharp
|
|
5918
|
-
],
|
|
5919
|
-
[MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],
|
|
5920
|
-
[
|
|
5921
|
-
/(bravia[\w ]+)( bui|\))/i
|
|
5922
|
-
// Sony
|
|
5923
|
-
],
|
|
5924
|
-
[MODEL, [VENDOR, SONY], [TYPE, SMARTTV]],
|
|
5925
|
-
[
|
|
5926
|
-
/(mi(tv|box)-?\w+) bui/i
|
|
5927
|
-
// Xiaomi
|
|
5928
|
-
],
|
|
5929
|
-
[MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]],
|
|
5930
|
-
[
|
|
5931
|
-
/Hbbtv.*(technisat) (.*);/i
|
|
5932
|
-
// TechniSAT
|
|
5933
|
-
],
|
|
5934
|
-
[VENDOR, MODEL, [TYPE, SMARTTV]],
|
|
5935
|
-
[
|
|
5936
|
-
/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,
|
|
5937
|
-
// Roku
|
|
5938
|
-
/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i
|
|
5939
|
-
// HbbTV devices
|
|
5940
|
-
],
|
|
5941
|
-
[[VENDOR, /.+\/(\w+)/, "$1", strMapper, { "LG": "lge" }], [MODEL, trim2], [TYPE, SMARTTV]],
|
|
5942
|
-
[
|
|
5943
|
-
///////////////////
|
|
5944
|
-
// CONSOLES
|
|
5945
|
-
///////////////////
|
|
5946
|
-
/(playstation \w+)/i
|
|
5947
|
-
// Playstation
|
|
5948
|
-
],
|
|
5949
|
-
[MODEL, [VENDOR, SONY], [TYPE, CONSOLE]],
|
|
5950
|
-
[
|
|
5951
|
-
/\b(xbox(?: one)?(?!; xbox))[\); ]/i
|
|
5952
|
-
// Microsoft Xbox
|
|
5953
|
-
],
|
|
5954
|
-
[MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]],
|
|
5955
|
-
[
|
|
5956
|
-
/(ouya)/i,
|
|
5957
|
-
// Ouya
|
|
5958
|
-
/(nintendo) (\w+)/i,
|
|
5959
|
-
// Nintendo
|
|
5960
|
-
/(retroid) (pocket ([^\)]+))/i
|
|
5961
|
-
// Retroid Pocket
|
|
5962
|
-
],
|
|
5963
|
-
[VENDOR, MODEL, [TYPE, CONSOLE]],
|
|
5964
|
-
[
|
|
5965
|
-
/droid.+; (shield)( bui|\))/i
|
|
5966
|
-
// Nvidia Portable
|
|
5967
|
-
],
|
|
5968
|
-
[MODEL, [VENDOR, NVIDIA], [TYPE, CONSOLE]],
|
|
5969
|
-
[
|
|
5970
|
-
///////////////////
|
|
5971
|
-
// WEARABLES
|
|
5972
|
-
///////////////////
|
|
5973
|
-
/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i
|
|
5974
|
-
// Samsung Galaxy Watch
|
|
5975
|
-
],
|
|
5976
|
-
[MODEL, [VENDOR, SAMSUNG], [TYPE, WEARABLE]],
|
|
5977
|
-
[
|
|
5978
|
-
/((pebble))app/i,
|
|
5979
|
-
// Pebble
|
|
5980
|
-
/(asus|google|lg|oppo) ((pixel |zen)?watch[\w ]*)( bui|\))/i
|
|
5981
|
-
// Asus ZenWatch / LG Watch / Pixel Watch
|
|
5982
|
-
],
|
|
5983
|
-
[VENDOR, MODEL, [TYPE, WEARABLE]],
|
|
5984
|
-
[
|
|
5985
|
-
/(ow(?:19|20)?we?[1-3]{1,3})/i
|
|
5986
|
-
// Oppo Watch
|
|
5987
|
-
],
|
|
5988
|
-
[MODEL, [VENDOR, OPPO], [TYPE, WEARABLE]],
|
|
5989
|
-
[
|
|
5990
|
-
/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i
|
|
5991
|
-
// Apple Watch
|
|
5992
|
-
],
|
|
5993
|
-
[MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]],
|
|
5994
|
-
[
|
|
5995
|
-
/(opwwe\d{3})/i
|
|
5996
|
-
// OnePlus Watch
|
|
5997
|
-
],
|
|
5998
|
-
[MODEL, [VENDOR, ONEPLUS], [TYPE, WEARABLE]],
|
|
5999
|
-
[
|
|
6000
|
-
/(moto 360)/i
|
|
6001
|
-
// Motorola 360
|
|
6002
|
-
],
|
|
6003
|
-
[MODEL, [VENDOR, MOTOROLA], [TYPE, WEARABLE]],
|
|
6004
|
-
[
|
|
6005
|
-
/(smartwatch 3)/i
|
|
6006
|
-
// Sony SmartWatch
|
|
6007
|
-
],
|
|
6008
|
-
[MODEL, [VENDOR, SONY], [TYPE, WEARABLE]],
|
|
6009
|
-
[
|
|
6010
|
-
/(g watch r)/i
|
|
6011
|
-
// LG G Watch R
|
|
6012
|
-
],
|
|
6013
|
-
[MODEL, [VENDOR, LG], [TYPE, WEARABLE]],
|
|
6014
|
-
[
|
|
6015
|
-
/droid.+; (wt63?0{2,3})\)/i
|
|
6016
|
-
],
|
|
6017
|
-
[MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]],
|
|
6018
|
-
[
|
|
6019
|
-
///////////////////
|
|
6020
|
-
// XR
|
|
6021
|
-
///////////////////
|
|
6022
|
-
/droid.+; (glass) \d/i
|
|
6023
|
-
// Google Glass
|
|
6024
|
-
],
|
|
6025
|
-
[MODEL, [VENDOR, GOOGLE], [TYPE, XR]],
|
|
6026
|
-
[
|
|
6027
|
-
/(pico) ([\w ]+) os\d/i
|
|
6028
|
-
// Pico
|
|
6029
|
-
],
|
|
6030
|
-
[VENDOR, MODEL, [TYPE, XR]],
|
|
6031
|
-
[
|
|
6032
|
-
/(quest( \d| pro)?s?).+vr/i
|
|
6033
|
-
// Meta Quest
|
|
6034
|
-
],
|
|
6035
|
-
[MODEL, [VENDOR, FACEBOOK], [TYPE, XR]],
|
|
6036
|
-
[
|
|
6037
|
-
/mobile vr; rv.+firefox/i
|
|
6038
|
-
// Unidentifiable VR device using Firefox Reality / Wolvic
|
|
6039
|
-
],
|
|
6040
|
-
[[TYPE, XR]],
|
|
6041
|
-
[
|
|
6042
|
-
///////////////////
|
|
6043
|
-
// EMBEDDED
|
|
6044
|
-
///////////////////
|
|
6045
|
-
/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i
|
|
6046
|
-
// Tesla
|
|
6047
|
-
],
|
|
6048
|
-
[VENDOR, [TYPE, EMBEDDED]],
|
|
6049
|
-
[
|
|
6050
|
-
/(aeobc)\b/i
|
|
6051
|
-
// Echo Dot
|
|
6052
|
-
],
|
|
6053
|
-
[MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]],
|
|
6054
|
-
[
|
|
6055
|
-
/(homepod).+mac os/i
|
|
6056
|
-
// Apple HomePod
|
|
6057
|
-
],
|
|
6058
|
-
[MODEL, [VENDOR, APPLE], [TYPE, EMBEDDED]],
|
|
6059
|
-
[
|
|
6060
|
-
/windows iot/i
|
|
6061
|
-
// Unidentifiable embedded device using Windows IoT
|
|
6062
|
-
],
|
|
6063
|
-
[[TYPE, EMBEDDED]],
|
|
6064
|
-
[
|
|
6065
|
-
////////////////////
|
|
6066
|
-
// MIXED (GENERIC)
|
|
6067
|
-
///////////////////
|
|
6068
|
-
/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i
|
|
6069
|
-
// Unidentifiable SmartTV
|
|
6070
|
-
],
|
|
6071
|
-
[MODEL, [TYPE, SMARTTV]],
|
|
6072
|
-
[
|
|
6073
|
-
/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i
|
|
6074
|
-
],
|
|
6075
|
-
[[TYPE, SMARTTV]],
|
|
6076
|
-
[
|
|
6077
|
-
/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i
|
|
6078
|
-
],
|
|
6079
|
-
[MODEL, [TYPE, strMapper, { "mobile": "Mobile", "xr": "VR", "*": TABLET }]],
|
|
6080
|
-
[
|
|
6081
|
-
/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i
|
|
6082
|
-
// Unidentifiable Tablet
|
|
6083
|
-
],
|
|
6084
|
-
[[TYPE, TABLET]],
|
|
6085
|
-
[
|
|
6086
|
-
/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i
|
|
6087
|
-
// Unidentifiable Mobile
|
|
6088
|
-
],
|
|
6089
|
-
[[TYPE, MOBILE]],
|
|
6090
|
-
[
|
|
6091
|
-
/droid .+?; ([\w\. -]+)( bui|\))/i
|
|
6092
|
-
// Generic Android Device
|
|
6093
|
-
],
|
|
6094
|
-
[MODEL, [VENDOR, "Generic"]]
|
|
6095
|
-
],
|
|
6096
|
-
engine: [
|
|
6097
|
-
[
|
|
6098
|
-
/windows.+ edge\/([\w\.]+)/i
|
|
6099
|
-
// EdgeHTML
|
|
6100
|
-
],
|
|
6101
|
-
[VERSION3, [NAME, EDGE + "HTML"]],
|
|
6102
|
-
[
|
|
6103
|
-
/(arkweb)\/([\w\.]+)/i
|
|
6104
|
-
// ArkWeb
|
|
6105
|
-
],
|
|
6106
|
-
[NAME, VERSION3],
|
|
6107
|
-
[
|
|
6108
|
-
/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i
|
|
6109
|
-
// Blink
|
|
6110
|
-
],
|
|
6111
|
-
[VERSION3, [NAME, "Blink"]],
|
|
6112
|
-
[
|
|
6113
|
-
/(presto)\/([\w\.]+)/i,
|
|
6114
|
-
// Presto
|
|
6115
|
-
/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,
|
|
6116
|
-
// WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna/Servo
|
|
6117
|
-
/ekioh(flow)\/([\w\.]+)/i,
|
|
6118
|
-
// Flow
|
|
6119
|
-
/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,
|
|
6120
|
-
// KHTML/Tasman/Links
|
|
6121
|
-
/(icab)[\/ ]([23]\.[\d\.]+)/i,
|
|
6122
|
-
// iCab
|
|
6123
|
-
/\b(libweb)/i
|
|
6124
|
-
// LibWeb
|
|
6125
|
-
],
|
|
6126
|
-
[NAME, VERSION3],
|
|
6127
|
-
[
|
|
6128
|
-
/ladybird\//i
|
|
6129
|
-
],
|
|
6130
|
-
[[NAME, "LibWeb"]],
|
|
6131
|
-
[
|
|
6132
|
-
/rv\:([\w\.]{1,9})\b.+(gecko)/i
|
|
6133
|
-
// Gecko
|
|
6134
|
-
],
|
|
6135
|
-
[VERSION3, NAME]
|
|
6136
|
-
],
|
|
6137
|
-
os: [
|
|
6138
|
-
[
|
|
6139
|
-
// Windows
|
|
6140
|
-
/(windows nt) (6\.[23]); arm/i
|
|
6141
|
-
// Windows RT
|
|
6142
|
-
],
|
|
6143
|
-
[[NAME, /N/, "R"], [VERSION3, strMapper, windowsVersionMap]],
|
|
6144
|
-
[
|
|
6145
|
-
/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,
|
|
6146
|
-
// Windows IoT/Mobile/Phone
|
|
6147
|
-
// Windows NT/3.1/95/98/ME/2000/XP/Vista/7/8/8.1/10/11
|
|
6148
|
-
/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i
|
|
6149
|
-
],
|
|
6150
|
-
[NAME, VERSION3],
|
|
6151
|
-
[
|
|
6152
|
-
/windows nt ?([\d\.\)]*)(?!.+xbox)/i,
|
|
6153
|
-
/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i
|
|
6154
|
-
],
|
|
6155
|
-
[[VERSION3, /(;|\))/g, "", strMapper, windowsVersionMap], [NAME, WINDOWS]],
|
|
6156
|
-
[
|
|
6157
|
-
/(windows ce)\/?([\d\.]*)/i
|
|
6158
|
-
// Windows CE
|
|
6159
|
-
],
|
|
6160
|
-
[NAME, VERSION3],
|
|
6161
|
-
[
|
|
6162
|
-
// iOS/macOS
|
|
6163
|
-
/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,
|
|
6164
|
-
// iOS
|
|
6165
|
-
/(?:ios;fbsv|ios(?=.+ip(?:ad|hone))|ip(?:ad|hone)(?: |.+i(?:pad)?)os)[\/ ]([\w\.]+)/i,
|
|
6166
|
-
/cfnetwork\/.+darwin/i
|
|
6167
|
-
],
|
|
6168
|
-
[[VERSION3, /_/g, "."], [NAME, "iOS"]],
|
|
6169
|
-
[
|
|
6170
|
-
/(mac os x) ?([\w\. ]*)/i,
|
|
6171
|
-
/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i
|
|
6172
|
-
// Mac OS
|
|
6173
|
-
],
|
|
6174
|
-
[[NAME, "macOS"], [VERSION3, /_/g, "."]],
|
|
6175
|
-
[
|
|
6176
|
-
// Google Chromecast
|
|
6177
|
-
/android ([\d\.]+).*crkey/i
|
|
6178
|
-
// Google Chromecast, Android-based
|
|
6179
|
-
],
|
|
6180
|
-
[VERSION3, [NAME, CHROMECAST + " Android"]],
|
|
6181
|
-
[
|
|
6182
|
-
/fuchsia.*crkey\/([\d\.]+)/i
|
|
6183
|
-
// Google Chromecast, Fuchsia-based
|
|
6184
|
-
],
|
|
6185
|
-
[VERSION3, [NAME, CHROMECAST + " Fuchsia"]],
|
|
6186
|
-
[
|
|
6187
|
-
/crkey\/([\d\.]+).*devicetype\/smartspeaker/i
|
|
6188
|
-
// Google Chromecast, Linux-based Smart Speaker
|
|
6189
|
-
],
|
|
6190
|
-
[VERSION3, [NAME, CHROMECAST + " SmartSpeaker"]],
|
|
6191
|
-
[
|
|
6192
|
-
/linux.*crkey\/([\d\.]+)/i
|
|
6193
|
-
// Google Chromecast, Legacy Linux-based
|
|
6194
|
-
],
|
|
6195
|
-
[VERSION3, [NAME, CHROMECAST + " Linux"]],
|
|
6196
|
-
[
|
|
6197
|
-
/crkey\/([\d\.]+)/i
|
|
6198
|
-
// Google Chromecast, unknown
|
|
6199
|
-
],
|
|
6200
|
-
[VERSION3, [NAME, CHROMECAST]],
|
|
6201
|
-
[
|
|
6202
|
-
// Mobile OSes
|
|
6203
|
-
/droid ([\w\.]+)\b.+(android[- ]x86)/i
|
|
6204
|
-
// Android-x86
|
|
6205
|
-
],
|
|
6206
|
-
[VERSION3, NAME],
|
|
6207
|
-
[
|
|
6208
|
-
/(ubuntu) ([\w\.]+) like android/i
|
|
6209
|
-
// Ubuntu Touch
|
|
6210
|
-
],
|
|
6211
|
-
[[NAME, /(.+)/, "$1 Touch"], VERSION3],
|
|
6212
|
-
[
|
|
6213
|
-
/(harmonyos)[\/ ]?([\d\.]*)/i,
|
|
6214
|
-
// HarmonyOS
|
|
6215
|
-
// Android/Blackberry/WebOS/QNX/Bada/RIM/KaiOS/Maemo/MeeGo/S40/Sailfish OS/OpenHarmony/Tizen
|
|
6216
|
-
/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i
|
|
6217
|
-
],
|
|
6218
|
-
[NAME, VERSION3],
|
|
6219
|
-
[
|
|
6220
|
-
/\(bb(10);/i
|
|
6221
|
-
// BlackBerry 10
|
|
6222
|
-
],
|
|
6223
|
-
[VERSION3, [NAME, BLACKBERRY]],
|
|
6224
|
-
[
|
|
6225
|
-
/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i
|
|
6226
|
-
// Symbian
|
|
6227
|
-
],
|
|
6228
|
-
[VERSION3, [NAME, "Symbian"]],
|
|
6229
|
-
[
|
|
6230
|
-
/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i
|
|
6231
|
-
// Firefox OS
|
|
6232
|
-
],
|
|
6233
|
-
[VERSION3, [NAME, FIREFOX + " OS"]],
|
|
6234
|
-
[
|
|
6235
|
-
/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,
|
|
6236
|
-
// WebOS
|
|
6237
|
-
/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i
|
|
6238
|
-
],
|
|
6239
|
-
[VERSION3, [NAME, "webOS"]],
|
|
6240
|
-
[
|
|
6241
|
-
/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i
|
|
6242
|
-
// https://webostv.developer.lge.com/develop/specifications/web-api-and-web-engine
|
|
6243
|
-
],
|
|
6244
|
-
[[VERSION3, strMapper, { "25": "120", "24": "108", "23": "94", "22": "87", "6": "79", "5": "68", "4": "53", "3": "38", "2": "538", "1": "537", "*": "TV" }], [NAME, "webOS"]],
|
|
6245
|
-
[
|
|
6246
|
-
/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i
|
|
6247
|
-
// watchOS
|
|
6248
|
-
],
|
|
6249
|
-
[VERSION3, [NAME, "watchOS"]],
|
|
6250
|
-
[
|
|
6251
|
-
// Google ChromeOS
|
|
6252
|
-
/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i
|
|
6253
|
-
// Chromium OS
|
|
6254
|
-
],
|
|
6255
|
-
[[NAME, "Chrome OS"], VERSION3],
|
|
6256
|
-
[
|
|
6257
|
-
// Smart TVs
|
|
6258
|
-
/panasonic;(viera)/i,
|
|
6259
|
-
// Panasonic Viera
|
|
6260
|
-
/(netrange)mmh/i,
|
|
6261
|
-
// Netrange
|
|
6262
|
-
/(nettv)\/(\d+\.[\w\.]+)/i,
|
|
6263
|
-
// NetTV
|
|
6264
|
-
// Console
|
|
6265
|
-
/(nintendo|playstation) (\w+)/i,
|
|
6266
|
-
// Nintendo/Playstation
|
|
6267
|
-
/(xbox); +xbox ([^\);]+)/i,
|
|
6268
|
-
// Microsoft Xbox (360, One, X, S, Series X, Series S)
|
|
6269
|
-
/(pico) .+os([\w\.]+)/i,
|
|
6270
|
-
// Pico
|
|
6271
|
-
// Other
|
|
6272
|
-
/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,
|
|
6273
|
-
// Joli/Palm
|
|
6274
|
-
/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,
|
|
6275
|
-
// Mint
|
|
6276
|
-
/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,
|
|
6277
|
-
// Mageia/VectorLinux/Fuchsia/ArcaOS/Arch
|
|
6278
|
-
/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,
|
|
6279
|
-
// Ubuntu/Debian/SUSE/Gentoo/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire/Knoppix
|
|
6280
|
-
/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,
|
|
6281
|
-
// Solaris
|
|
6282
|
-
/\b(aix)[; ]([1-9\.]{0,4})/i,
|
|
6283
|
-
// AIX
|
|
6284
|
-
/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,
|
|
6285
|
-
// Hurd/Linux/MorphOS
|
|
6286
|
-
/(gnu) ?([\w\.]*)/i,
|
|
6287
|
-
// GNU
|
|
6288
|
-
/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,
|
|
6289
|
-
// FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly
|
|
6290
|
-
/(haiku) ?(r\d)?/i
|
|
6291
|
-
// Haiku
|
|
6292
|
-
],
|
|
6293
|
-
[NAME, VERSION3],
|
|
6294
|
-
[
|
|
6295
|
-
/(sunos) ?([\d\.]*)/i
|
|
6296
|
-
// Solaris
|
|
6297
|
-
],
|
|
6298
|
-
[[NAME, "Solaris"], VERSION3],
|
|
6299
|
-
[
|
|
6300
|
-
/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,
|
|
6301
|
-
// BeOS/OS2/AmigaOS/OpenVMS/HP-UX/SerenityOS
|
|
6302
|
-
/(unix) ?([\w\.]*)/i
|
|
6303
|
-
// UNIX
|
|
6304
|
-
],
|
|
6305
|
-
[NAME, VERSION3]
|
|
6306
|
-
]
|
|
6307
|
-
};
|
|
6308
|
-
var defaultProps = function() {
|
|
6309
|
-
var props = { init: {}, isIgnore: {}, isIgnoreRgx: {}, toString: {} };
|
|
6310
|
-
setProps.call(props.init, [
|
|
6311
|
-
[BROWSER, [NAME, VERSION3, MAJOR, TYPE]],
|
|
6312
|
-
[CPU, [ARCHITECTURE]],
|
|
6313
|
-
[DEVICE, [TYPE, MODEL, VENDOR]],
|
|
6314
|
-
[ENGINE, [NAME, VERSION3]],
|
|
6315
|
-
[OS, [NAME, VERSION3]]
|
|
6316
|
-
]);
|
|
6317
|
-
setProps.call(props.isIgnore, [
|
|
6318
|
-
[BROWSER, [VERSION3, MAJOR]],
|
|
6319
|
-
[ENGINE, [VERSION3]],
|
|
6320
|
-
[OS, [VERSION3]]
|
|
6321
|
-
]);
|
|
6322
|
-
setProps.call(props.isIgnoreRgx, [
|
|
6323
|
-
[BROWSER, / ?browser$/i],
|
|
6324
|
-
[OS, / ?os$/i]
|
|
6325
|
-
]);
|
|
6326
|
-
setProps.call(props.toString, [
|
|
6327
|
-
[BROWSER, [NAME, VERSION3]],
|
|
6328
|
-
[CPU, [ARCHITECTURE]],
|
|
6329
|
-
[DEVICE, [VENDOR, MODEL]],
|
|
6330
|
-
[ENGINE, [NAME, VERSION3]],
|
|
6331
|
-
[OS, [NAME, VERSION3]]
|
|
6332
|
-
]);
|
|
6333
|
-
return props;
|
|
6334
|
-
}();
|
|
6335
|
-
var createIData = function(item, itemType) {
|
|
6336
|
-
var init_props = defaultProps.init[itemType], is_ignoreProps = defaultProps.isIgnore[itemType] || 0, is_ignoreRgx = defaultProps.isIgnoreRgx[itemType] || 0, toString_props = defaultProps.toString[itemType] || 0;
|
|
6337
|
-
function IData() {
|
|
6338
|
-
setProps.call(this, init_props);
|
|
6339
|
-
}
|
|
6340
|
-
IData.prototype.getItem = function() {
|
|
6341
|
-
return item;
|
|
6342
|
-
};
|
|
6343
|
-
IData.prototype.withClientHints = function() {
|
|
6344
|
-
if (!NAVIGATOR_UADATA) {
|
|
6345
|
-
return item.parseCH().get();
|
|
6346
|
-
}
|
|
6347
|
-
return NAVIGATOR_UADATA.getHighEntropyValues(CH_ALL_VALUES).then(function(res) {
|
|
6348
|
-
return item.setCH(new UACHData(res, false)).parseCH().get();
|
|
6349
|
-
});
|
|
6350
|
-
};
|
|
6351
|
-
IData.prototype.withFeatureCheck = function() {
|
|
6352
|
-
return item.detectFeature().get();
|
|
6353
|
-
};
|
|
6354
|
-
if (itemType != RESULT) {
|
|
6355
|
-
IData.prototype.is = function(strToCheck) {
|
|
6356
|
-
var is = false;
|
|
6357
|
-
for (var i in this) {
|
|
6358
|
-
if (this.hasOwnProperty(i) && !has(is_ignoreProps, i) && lowerize(is_ignoreRgx ? strip(is_ignoreRgx, this[i]) : this[i]) == lowerize(is_ignoreRgx ? strip(is_ignoreRgx, strToCheck) : strToCheck)) {
|
|
6359
|
-
is = true;
|
|
6360
|
-
if (strToCheck != TYPEOF.UNDEFINED) break;
|
|
6361
|
-
} else if (strToCheck == TYPEOF.UNDEFINED && is) {
|
|
6362
|
-
is = !is;
|
|
6363
|
-
break;
|
|
6364
|
-
}
|
|
6365
|
-
}
|
|
6366
|
-
return is;
|
|
6367
|
-
};
|
|
6368
|
-
IData.prototype.toString = function() {
|
|
6369
|
-
var str = EMPTY;
|
|
6370
|
-
for (var i in toString_props) {
|
|
6371
|
-
if (typeof this[toString_props[i]] !== TYPEOF.UNDEFINED) {
|
|
6372
|
-
str += (str ? " " : EMPTY) + this[toString_props[i]];
|
|
6373
|
-
}
|
|
6374
|
-
}
|
|
6375
|
-
return str || TYPEOF.UNDEFINED;
|
|
6376
|
-
};
|
|
6377
|
-
}
|
|
6378
|
-
if (!NAVIGATOR_UADATA) {
|
|
6379
|
-
IData.prototype.then = function(cb) {
|
|
6380
|
-
var that = this;
|
|
6381
|
-
var IDataResolve = function() {
|
|
6382
|
-
for (var prop in that) {
|
|
6383
|
-
if (that.hasOwnProperty(prop)) {
|
|
6384
|
-
this[prop] = that[prop];
|
|
6385
|
-
}
|
|
6386
|
-
}
|
|
6387
|
-
};
|
|
6388
|
-
IDataResolve.prototype = {
|
|
6389
|
-
is: IData.prototype.is,
|
|
6390
|
-
toString: IData.prototype.toString
|
|
6391
|
-
};
|
|
6392
|
-
var resolveData = new IDataResolve();
|
|
6393
|
-
cb(resolveData);
|
|
6394
|
-
return resolveData;
|
|
6395
|
-
};
|
|
6396
|
-
}
|
|
6397
|
-
return new IData();
|
|
6398
|
-
};
|
|
6399
|
-
function UACHData(uach, isHttpUACH) {
|
|
6400
|
-
uach = uach || {};
|
|
6401
|
-
setProps.call(this, CH_ALL_VALUES);
|
|
6402
|
-
if (isHttpUACH) {
|
|
6403
|
-
setProps.call(this, [
|
|
6404
|
-
[BRANDS, itemListToArray(uach[CH])],
|
|
6405
|
-
[FULLVERLIST, itemListToArray(uach[CH_FULL_VER_LIST])],
|
|
6406
|
-
[MOBILE, /\?1/.test(uach[CH_MOBILE])],
|
|
6407
|
-
[MODEL, stripQuotes(uach[CH_MODEL])],
|
|
6408
|
-
[PLATFORM, stripQuotes(uach[CH_PLATFORM])],
|
|
6409
|
-
[PLATFORMVER, stripQuotes(uach[CH_PLATFORM_VER])],
|
|
6410
|
-
[ARCHITECTURE, stripQuotes(uach[CH_ARCH])],
|
|
6411
|
-
[FORMFACTORS, itemListToArray(uach[CH_FORM_FACTORS])],
|
|
6412
|
-
[BITNESS, stripQuotes(uach[CH_BITNESS])]
|
|
6413
|
-
]);
|
|
6414
|
-
} else {
|
|
6415
|
-
for (var prop in uach) {
|
|
6416
|
-
if (this.hasOwnProperty(prop) && typeof uach[prop] !== TYPEOF.UNDEFINED) this[prop] = uach[prop];
|
|
6417
|
-
}
|
|
6418
|
-
}
|
|
6419
|
-
}
|
|
6420
|
-
function UAItem(itemType, ua, rgxMap, uaCH) {
|
|
6421
|
-
this.get = function(prop) {
|
|
6422
|
-
if (!prop) return this.data;
|
|
6423
|
-
return this.data.hasOwnProperty(prop) ? this.data[prop] : void 0;
|
|
6424
|
-
};
|
|
6425
|
-
this.set = function(prop, val) {
|
|
6426
|
-
this.data[prop] = val;
|
|
6427
|
-
return this;
|
|
6428
|
-
};
|
|
6429
|
-
this.setCH = function(ch) {
|
|
6430
|
-
this.uaCH = ch;
|
|
6431
|
-
return this;
|
|
6432
|
-
};
|
|
6433
|
-
this.detectFeature = function() {
|
|
6434
|
-
if (NAVIGATOR && NAVIGATOR.userAgent == this.ua) {
|
|
6435
|
-
switch (this.itemType) {
|
|
6436
|
-
case BROWSER:
|
|
6437
|
-
if (NAVIGATOR.brave && typeof NAVIGATOR.brave.isBrave == TYPEOF.FUNCTION) {
|
|
6438
|
-
this.set(NAME, "Brave");
|
|
6439
|
-
}
|
|
6440
|
-
break;
|
|
6441
|
-
case DEVICE:
|
|
6442
|
-
if (!this.get(TYPE) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[MOBILE]) {
|
|
6443
|
-
this.set(TYPE, MOBILE);
|
|
6444
|
-
}
|
|
6445
|
-
if (this.get(MODEL) == "Macintosh" && NAVIGATOR && typeof NAVIGATOR.standalone !== TYPEOF.UNDEFINED && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 2) {
|
|
6446
|
-
this.set(MODEL, "iPad").set(TYPE, TABLET);
|
|
6447
|
-
}
|
|
6448
|
-
break;
|
|
6449
|
-
case OS:
|
|
6450
|
-
if (!this.get(NAME) && NAVIGATOR_UADATA && NAVIGATOR_UADATA[PLATFORM]) {
|
|
6451
|
-
this.set(NAME, NAVIGATOR_UADATA[PLATFORM]);
|
|
6452
|
-
}
|
|
6453
|
-
break;
|
|
6454
|
-
case RESULT:
|
|
6455
|
-
var data = this.data;
|
|
6456
|
-
var detect = function(itemType2) {
|
|
6457
|
-
return data[itemType2].getItem().detectFeature().get();
|
|
6458
|
-
};
|
|
6459
|
-
this.set(BROWSER, detect(BROWSER)).set(CPU, detect(CPU)).set(DEVICE, detect(DEVICE)).set(ENGINE, detect(ENGINE)).set(OS, detect(OS));
|
|
6460
|
-
}
|
|
6461
|
-
}
|
|
6462
|
-
return this;
|
|
6463
|
-
};
|
|
6464
|
-
this.parseUA = function() {
|
|
6465
|
-
if (this.itemType != RESULT) {
|
|
6466
|
-
rgxMapper.call(this.data, this.ua, this.rgxMap);
|
|
6467
|
-
}
|
|
6468
|
-
switch (this.itemType) {
|
|
6469
|
-
case BROWSER:
|
|
6470
|
-
this.set(MAJOR, majorize(this.get(VERSION3)));
|
|
6471
|
-
break;
|
|
6472
|
-
case OS:
|
|
6473
|
-
if (this.get(NAME) == "iOS" && this.get(VERSION3) == "18.6") {
|
|
6474
|
-
var realVersion = /\) Version\/([\d\.]+)/.exec(this.ua);
|
|
6475
|
-
if (realVersion && parseInt(realVersion[1].substring(0, 2), 10) >= 26) {
|
|
6476
|
-
this.set(VERSION3, realVersion[1]);
|
|
6477
|
-
}
|
|
6478
|
-
}
|
|
6479
|
-
break;
|
|
6480
|
-
}
|
|
6481
|
-
return this;
|
|
6482
|
-
};
|
|
6483
|
-
this.parseCH = function() {
|
|
6484
|
-
var uaCH2 = this.uaCH, rgxMap2 = this.rgxMap;
|
|
6485
|
-
switch (this.itemType) {
|
|
6486
|
-
case BROWSER:
|
|
6487
|
-
case ENGINE:
|
|
6488
|
-
var brands = uaCH2[FULLVERLIST] || uaCH2[BRANDS], prevName;
|
|
6489
|
-
if (brands) {
|
|
6490
|
-
for (var i = 0; i < brands.length; i++) {
|
|
6491
|
-
var brandName = brands[i].brand || brands[i], brandVersion = brands[i].version;
|
|
6492
|
-
if (this.itemType == BROWSER && !/not.a.brand/i.test(brandName) && (!prevName || /Chrom/.test(prevName) && brandName != CHROMIUM || prevName == EDGE && /WebView2/.test(brandName))) {
|
|
6493
|
-
brandName = strMapper(brandName, browserHintsMap);
|
|
6494
|
-
prevName = this.get(NAME);
|
|
6495
|
-
if (!(prevName && !/Chrom/.test(prevName) && /Chrom/.test(brandName))) {
|
|
6496
|
-
this.set(NAME, brandName).set(VERSION3, brandVersion).set(MAJOR, majorize(brandVersion));
|
|
6497
|
-
}
|
|
6498
|
-
prevName = brandName;
|
|
6499
|
-
}
|
|
6500
|
-
if (this.itemType == ENGINE && brandName == CHROMIUM) {
|
|
6501
|
-
this.set(VERSION3, brandVersion);
|
|
6502
|
-
}
|
|
6503
|
-
}
|
|
6504
|
-
}
|
|
6505
|
-
break;
|
|
6506
|
-
case CPU:
|
|
6507
|
-
var archName = uaCH2[ARCHITECTURE];
|
|
6508
|
-
if (archName) {
|
|
6509
|
-
if (archName && uaCH2[BITNESS] == "64") archName += "64";
|
|
6510
|
-
rgxMapper.call(this.data, archName + ";", rgxMap2);
|
|
6511
|
-
}
|
|
6512
|
-
break;
|
|
6513
|
-
case DEVICE:
|
|
6514
|
-
if (uaCH2[MOBILE]) {
|
|
6515
|
-
this.set(TYPE, MOBILE);
|
|
6516
|
-
}
|
|
6517
|
-
if (uaCH2[MODEL]) {
|
|
6518
|
-
this.set(MODEL, uaCH2[MODEL]);
|
|
6519
|
-
if (!this.get(TYPE) || !this.get(VENDOR)) {
|
|
6520
|
-
var reParse = {};
|
|
6521
|
-
rgxMapper.call(reParse, "droid 9; " + uaCH2[MODEL] + ")", rgxMap2);
|
|
6522
|
-
if (!this.get(TYPE) && !!reParse.type) {
|
|
6523
|
-
this.set(TYPE, reParse.type);
|
|
6524
|
-
}
|
|
6525
|
-
if (!this.get(VENDOR) && !!reParse.vendor) {
|
|
6526
|
-
this.set(VENDOR, reParse.vendor);
|
|
6527
|
-
}
|
|
6528
|
-
}
|
|
6529
|
-
}
|
|
6530
|
-
if (uaCH2[FORMFACTORS]) {
|
|
6531
|
-
var ff;
|
|
6532
|
-
if (typeof uaCH2[FORMFACTORS] !== "string") {
|
|
6533
|
-
var idx = 0;
|
|
6534
|
-
while (!ff && idx < uaCH2[FORMFACTORS].length) {
|
|
6535
|
-
ff = strMapper(uaCH2[FORMFACTORS][idx++], formFactorsMap);
|
|
6536
|
-
}
|
|
6537
|
-
} else {
|
|
6538
|
-
ff = strMapper(uaCH2[FORMFACTORS], formFactorsMap);
|
|
6539
|
-
}
|
|
6540
|
-
this.set(TYPE, ff);
|
|
6541
|
-
}
|
|
6542
|
-
break;
|
|
6543
|
-
case OS:
|
|
6544
|
-
var osName = uaCH2[PLATFORM];
|
|
6545
|
-
if (osName) {
|
|
6546
|
-
var osVersion = uaCH2[PLATFORMVER];
|
|
6547
|
-
if (osName == WINDOWS) osVersion = parseInt(majorize(osVersion), 10) >= 13 ? "11" : "10";
|
|
6548
|
-
this.set(NAME, osName).set(VERSION3, osVersion);
|
|
6549
|
-
}
|
|
6550
|
-
if (this.get(NAME) == WINDOWS && uaCH2[MODEL] == "Xbox") {
|
|
6551
|
-
this.set(NAME, "Xbox").set(VERSION3, void 0);
|
|
6552
|
-
}
|
|
6553
|
-
break;
|
|
6554
|
-
case RESULT:
|
|
6555
|
-
var data = this.data;
|
|
6556
|
-
var parse = function(itemType2) {
|
|
6557
|
-
return data[itemType2].getItem().setCH(uaCH2).parseCH().get();
|
|
6558
|
-
};
|
|
6559
|
-
this.set(BROWSER, parse(BROWSER)).set(CPU, parse(CPU)).set(DEVICE, parse(DEVICE)).set(ENGINE, parse(ENGINE)).set(OS, parse(OS));
|
|
6560
|
-
}
|
|
6561
|
-
return this;
|
|
6562
|
-
};
|
|
6563
|
-
setProps.call(this, [
|
|
6564
|
-
["itemType", itemType],
|
|
6565
|
-
["ua", ua],
|
|
6566
|
-
["uaCH", uaCH],
|
|
6567
|
-
["rgxMap", rgxMap],
|
|
6568
|
-
["data", createIData(this, itemType)]
|
|
6569
|
-
]);
|
|
6570
|
-
return this;
|
|
6571
|
-
}
|
|
6572
|
-
function UAParser(ua, extensions, headers) {
|
|
6573
|
-
if (typeof ua === TYPEOF.OBJECT) {
|
|
6574
|
-
if (isExtensions(ua, true)) {
|
|
6575
|
-
if (typeof extensions === TYPEOF.OBJECT) {
|
|
6576
|
-
headers = extensions;
|
|
6577
|
-
}
|
|
6578
|
-
extensions = ua;
|
|
6579
|
-
} else {
|
|
6580
|
-
headers = ua;
|
|
6581
|
-
extensions = void 0;
|
|
6582
|
-
}
|
|
6583
|
-
ua = void 0;
|
|
6584
|
-
} else if (typeof ua === TYPEOF.STRING && !isExtensions(extensions, true)) {
|
|
6585
|
-
headers = extensions;
|
|
6586
|
-
extensions = void 0;
|
|
6587
|
-
}
|
|
6588
|
-
if (headers) {
|
|
6589
|
-
if (typeof headers.append === TYPEOF.FUNCTION) {
|
|
6590
|
-
var kv = {};
|
|
6591
|
-
headers.forEach(function(v, k) {
|
|
6592
|
-
kv[String(k).toLowerCase()] = v;
|
|
6593
|
-
});
|
|
6594
|
-
headers = kv;
|
|
6595
|
-
} else {
|
|
6596
|
-
var normalized = {};
|
|
6597
|
-
for (var header in headers) {
|
|
6598
|
-
if (headers.hasOwnProperty(header)) {
|
|
6599
|
-
normalized[String(header).toLowerCase()] = headers[header];
|
|
6600
|
-
}
|
|
6601
|
-
}
|
|
6602
|
-
headers = normalized;
|
|
6603
|
-
}
|
|
6604
|
-
}
|
|
6605
|
-
if (!(this instanceof UAParser)) {
|
|
6606
|
-
return new UAParser(ua, extensions, headers).getResult();
|
|
6607
|
-
}
|
|
6608
|
-
var userAgent = typeof ua === TYPEOF.STRING ? ua : (
|
|
6609
|
-
// Passed user-agent string
|
|
6610
|
-
headers && headers[USER_AGENT] ? headers[USER_AGENT] : (
|
|
6611
|
-
// User-Agent from passed headers
|
|
6612
|
-
NAVIGATOR && NAVIGATOR.userAgent ? NAVIGATOR.userAgent : (
|
|
6613
|
-
// navigator.userAgent
|
|
6614
|
-
EMPTY
|
|
6615
|
-
)
|
|
6616
|
-
)
|
|
6617
|
-
), httpUACH = new UACHData(headers, true), regexMap = extensions ? extend2(defaultRegexes, extensions) : defaultRegexes, createItemFunc = function(itemType) {
|
|
6618
|
-
if (itemType == RESULT) {
|
|
6619
|
-
return function() {
|
|
6620
|
-
return new UAItem(itemType, userAgent, regexMap, httpUACH).set("ua", userAgent).set(BROWSER, this.getBrowser()).set(CPU, this.getCPU()).set(DEVICE, this.getDevice()).set(ENGINE, this.getEngine()).set(OS, this.getOS()).get();
|
|
6621
|
-
};
|
|
6622
|
-
} else {
|
|
6623
|
-
return function() {
|
|
6624
|
-
return new UAItem(itemType, userAgent, regexMap[itemType], httpUACH).parseUA().get();
|
|
6625
|
-
};
|
|
6626
|
-
}
|
|
6627
|
-
};
|
|
6628
|
-
setProps.call(this, [
|
|
6629
|
-
["getBrowser", createItemFunc(BROWSER)],
|
|
6630
|
-
["getCPU", createItemFunc(CPU)],
|
|
6631
|
-
["getDevice", createItemFunc(DEVICE)],
|
|
6632
|
-
["getEngine", createItemFunc(ENGINE)],
|
|
6633
|
-
["getOS", createItemFunc(OS)],
|
|
6634
|
-
["getResult", createItemFunc(RESULT)],
|
|
6635
|
-
["getUA", function() {
|
|
6636
|
-
return userAgent;
|
|
6637
|
-
}],
|
|
6638
|
-
["setUA", function(ua2) {
|
|
6639
|
-
if (isString2(ua2)) userAgent = trim2(ua2, UA_MAX_LENGTH);
|
|
6640
|
-
return this;
|
|
6641
|
-
}]
|
|
6642
|
-
]).setUA(userAgent);
|
|
6643
|
-
return this;
|
|
6644
|
-
}
|
|
6645
|
-
UAParser.VERSION = LIBVERSION;
|
|
6646
|
-
UAParser.BROWSER = enumerize([NAME, VERSION3, MAJOR, TYPE]);
|
|
6647
|
-
UAParser.CPU = enumerize([ARCHITECTURE]);
|
|
6648
|
-
UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);
|
|
6649
|
-
UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION3]);
|
|
6650
|
-
|
|
6651
|
-
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/enums/ua-parser-enums.mjs
|
|
6652
|
-
var BrowserName = Object.freeze({
|
|
6653
|
-
"115": "115",
|
|
6654
|
-
"2345": "2345",
|
|
6655
|
-
"360": "360",
|
|
6656
|
-
ALIPAY: "Alipay",
|
|
6657
|
-
AMAYA: "Amaya",
|
|
6658
|
-
ANDROID: "Android Browser",
|
|
6659
|
-
ARORA: "Arora",
|
|
6660
|
-
AVANT: "Avant",
|
|
6661
|
-
AVAST: "Avast Secure Browser",
|
|
6662
|
-
AVG: "AVG Secure Browser",
|
|
6663
|
-
BAIDU: "Baidu Browser",
|
|
6664
|
-
BASILISK: "Basilisk",
|
|
6665
|
-
BING: "Bing",
|
|
6666
|
-
BLAZER: "Blazer",
|
|
6667
|
-
BOLT: "Bolt",
|
|
6668
|
-
BOWSER: "Bowser",
|
|
6669
|
-
BRAVE: "Brave",
|
|
6670
|
-
CAMINO: "Camino",
|
|
6671
|
-
CHIMERA: "Chimera",
|
|
6672
|
-
CHROME: "Chrome",
|
|
6673
|
-
CHROME_HEADLESS: "Chrome Headless",
|
|
6674
|
-
CHROME_MOBILE: "Mobile Chrome",
|
|
6675
|
-
CHROME_WEBVIEW: "Chrome WebView",
|
|
6676
|
-
CHROMIUM: "Chromium",
|
|
6677
|
-
COBALT: "Cobalt",
|
|
6678
|
-
COC_COC: "Coc Coc",
|
|
6679
|
-
CONKEROR: "Conkeror",
|
|
6680
|
-
DAUM: "Daum",
|
|
6681
|
-
DILLO: "Dillo",
|
|
6682
|
-
DOLPHIN: "Dolphin",
|
|
6683
|
-
DOOBLE: "Dooble",
|
|
6684
|
-
DORIS: "Doris",
|
|
6685
|
-
DRAGON: "Dragon",
|
|
6686
|
-
DUCKDUCKGO: "DuckDuckGo",
|
|
6687
|
-
ECOSIA: "Ecosia",
|
|
6688
|
-
EDGE: "Edge",
|
|
6689
|
-
EDGE_WEBVIEW: "Edge WebView",
|
|
6690
|
-
EDGE_WEBVIEW2: "Edge WebView2",
|
|
6691
|
-
EPIPHANY: "Epiphany",
|
|
6692
|
-
FACEBOOK: "Facebook",
|
|
6693
|
-
FALKON: "Falkon",
|
|
6694
|
-
FIREBIRD: "Firebird",
|
|
6695
|
-
FIREFOX: "Firefox",
|
|
6696
|
-
FIREFOX_FOCUS: "Firefox Focus",
|
|
6697
|
-
FIREFOX_MOBILE: "Mobile Firefox",
|
|
6698
|
-
FIREFOX_REALITY: "Firefox Reality",
|
|
6699
|
-
FENNEC: "Fennec",
|
|
6700
|
-
FLOCK: "Flock",
|
|
6701
|
-
FLOW: "Flow",
|
|
6702
|
-
GO: "GoBrowser",
|
|
6703
|
-
GOOGLE_SEARCH: "GSA",
|
|
6704
|
-
HELIO: "Helio",
|
|
6705
|
-
HEYTAP: "HeyTap",
|
|
6706
|
-
HONOR: "Honor",
|
|
6707
|
-
HUAWEI: "Huawei Browser",
|
|
6708
|
-
ICAB: "iCab",
|
|
6709
|
-
ICE: "ICE Browser",
|
|
6710
|
-
ICEAPE: "IceApe",
|
|
6711
|
-
ICECAT: "IceCat",
|
|
6712
|
-
ICEDRAGON: "IceDragon",
|
|
6713
|
-
ICEWEASEL: "IceWeasel",
|
|
6714
|
-
IE: "IE",
|
|
6715
|
-
INSTAGRAM: "Instagram",
|
|
6716
|
-
IRIDIUM: "Iridium",
|
|
6717
|
-
IRON: "Iron",
|
|
6718
|
-
JASMINE: "Jasmine",
|
|
6719
|
-
KONQUEROR: "Konqueror",
|
|
6720
|
-
KAKAO: "KakaoTalk",
|
|
6721
|
-
KHTML: "KHTML",
|
|
6722
|
-
K_MELEON: "K-Meleon",
|
|
6723
|
-
KLAR: "Klar",
|
|
6724
|
-
KLARNA: "Klarna",
|
|
6725
|
-
KINDLE: "Kindle",
|
|
6726
|
-
LENOVO: "Smart Lenovo Browser",
|
|
6727
|
-
LADYBIRD: "Ladybird",
|
|
6728
|
-
LG: "LG Browser",
|
|
6729
|
-
LIBREWOLF: "LibreWolf",
|
|
6730
|
-
LIEBAO: "LBBROWSER",
|
|
6731
|
-
LINE: "Line",
|
|
6732
|
-
LINKEDIN: "LinkedIn",
|
|
6733
|
-
LINKS: "Links",
|
|
6734
|
-
LUNASCAPE: "Lunascape",
|
|
6735
|
-
LYNX: "Lynx",
|
|
6736
|
-
MAEMO: "Maemo Browser",
|
|
6737
|
-
MAXTHON: "Maxthon",
|
|
6738
|
-
MIDORI: "Midori",
|
|
6739
|
-
MINIMO: "Minimo",
|
|
6740
|
-
MIUI: "MIUI Browser",
|
|
6741
|
-
MOZILLA: "Mozilla",
|
|
6742
|
-
MOSAIC: "Mosaic",
|
|
6743
|
-
NAVER: "Naver",
|
|
6744
|
-
NETFRONT: "NetFront",
|
|
6745
|
-
NETSCAPE: "Netscape",
|
|
6746
|
-
NETSURF: "Netsurf",
|
|
6747
|
-
NOKIA: "Nokia Browser",
|
|
6748
|
-
OBIGO: "Obigo",
|
|
6749
|
-
OCULUS: "Oculus Browser",
|
|
6750
|
-
OMNIWEB: "OmniWeb",
|
|
6751
|
-
OPERA: "Opera",
|
|
6752
|
-
OPERA_COAST: "Opera Coast",
|
|
6753
|
-
OPERA_GX: "Opera GX",
|
|
6754
|
-
OPERA_MINI: "Opera Mini",
|
|
6755
|
-
OPERA_MOBI: "Opera Mobi",
|
|
6756
|
-
OPERA_TABLET: "Opera Tablet",
|
|
6757
|
-
OPERA_TOUCH: "Opera Touch",
|
|
6758
|
-
OTTER: "Otter",
|
|
6759
|
-
OVI: "OviBrowser",
|
|
6760
|
-
PALEMOON: "PaleMoon",
|
|
6761
|
-
PHANTOMJS: "PhantomJS",
|
|
6762
|
-
PHOENIX: "Phoenix",
|
|
6763
|
-
PICOBROWSER: "Pico Browser",
|
|
6764
|
-
POLARIS: "Polaris",
|
|
6765
|
-
PUFFIN: "Puffin",
|
|
6766
|
-
QQ: "QQBrowser",
|
|
6767
|
-
QQ_LITE: "QQBrowserLite",
|
|
6768
|
-
QUARK: "Quark",
|
|
6769
|
-
QUPZILLA: "QupZilla",
|
|
6770
|
-
QUTEBROWSER: "qutebrowser",
|
|
6771
|
-
QWANT: "Qwant",
|
|
6772
|
-
REKONQ: "rekonq",
|
|
6773
|
-
ROCKMELT: "Rockmelt",
|
|
6774
|
-
SAFARI: "Safari",
|
|
6775
|
-
SAFARI_MOBILE: "Mobile Safari",
|
|
6776
|
-
SAILFISH: "Sailfish Browser",
|
|
6777
|
-
SAMSUNG: "Samsung Internet",
|
|
6778
|
-
SEAMONKEY: "SeaMonkey",
|
|
6779
|
-
SILK: "Silk",
|
|
6780
|
-
SKYFIRE: "Skyfire",
|
|
6781
|
-
SLEIPNIR: "Sleipnir",
|
|
6782
|
-
SLIMBOAT: "SlimBoat",
|
|
6783
|
-
SLIMBROWSER: "SlimBrowser",
|
|
6784
|
-
SLIMJET: "Slimjet",
|
|
6785
|
-
SNAPCHAT: "Snapchat",
|
|
6786
|
-
SOGOU_EXPLORER: "Sogou Explorer",
|
|
6787
|
-
SOGOU_MOBILE: "Sogou Mobile",
|
|
6788
|
-
SURF: "Surf",
|
|
6789
|
-
SWIFTFOX: "Swiftfox",
|
|
6790
|
-
TESLA: "Tesla",
|
|
6791
|
-
TIKTOK: "TikTok",
|
|
6792
|
-
TIZEN: "Tizen Browser",
|
|
6793
|
-
TWITTER: "Twitter",
|
|
6794
|
-
UC: "UCBrowser",
|
|
6795
|
-
UP: "UP.Browser",
|
|
6796
|
-
VIVALDI: "Vivaldi",
|
|
6797
|
-
VIVO: "Vivo Browser",
|
|
6798
|
-
W3M: "w3m",
|
|
6799
|
-
WATERFOX: "Waterfox",
|
|
6800
|
-
WEBKIT: "WebKit",
|
|
6801
|
-
WECHAT: "WeChat",
|
|
6802
|
-
WEIBO: "Weibo",
|
|
6803
|
-
WHALE: "Whale",
|
|
6804
|
-
WOLVIC: "Wolvic",
|
|
6805
|
-
YANDEX: "Yandex",
|
|
6806
|
-
ZALO: "Zalo"
|
|
6807
|
-
// TODO : test!
|
|
6808
|
-
});
|
|
6809
|
-
var BrowserType = Object.freeze({
|
|
6810
|
-
CRAWLER: "crawler",
|
|
6811
|
-
CLI: "cli",
|
|
6812
|
-
EMAIL: "email",
|
|
6813
|
-
FETCHER: "fetcher",
|
|
6814
|
-
INAPP: "inapp",
|
|
6815
|
-
MEDIAPLAYER: "mediaplayer",
|
|
6816
|
-
LIBRARY: "library"
|
|
6817
|
-
});
|
|
6818
|
-
var CPUArch = Object.freeze({
|
|
6819
|
-
"68K": "68k",
|
|
6820
|
-
ALPHA: "alpha",
|
|
6821
|
-
ARM: "arm",
|
|
6822
|
-
ARM_64: "arm64",
|
|
6823
|
-
ARM_HF: "armhf",
|
|
6824
|
-
AVR: "avr",
|
|
6825
|
-
AVR_32: "avr32",
|
|
6826
|
-
IA64: "ia64",
|
|
6827
|
-
IRIX: "irix",
|
|
6828
|
-
IRIX_64: "irix64",
|
|
6829
|
-
MIPS: "mips",
|
|
6830
|
-
MIPS_64: "mips64",
|
|
6831
|
-
PA_RISC: "pa-risc",
|
|
6832
|
-
PPC: "ppc",
|
|
6833
|
-
SPARC: "sparc",
|
|
6834
|
-
SPARC_64: "sparc64",
|
|
6835
|
-
X86: "ia32",
|
|
6836
|
-
X86_64: "amd64"
|
|
6837
|
-
});
|
|
6838
|
-
var DeviceType = Object.freeze({
|
|
6839
|
-
CONSOLE: "console",
|
|
6840
|
-
DESKTOP: "desktop",
|
|
6841
|
-
EMBEDDED: "embedded",
|
|
6842
|
-
MOBILE: "mobile",
|
|
6843
|
-
SMARTTV: "smarttv",
|
|
6844
|
-
TABLET: "tablet",
|
|
6845
|
-
WEARABLE: "wearable",
|
|
6846
|
-
XR: "xr"
|
|
6847
|
-
});
|
|
6848
|
-
var DeviceVendor = Object.freeze({
|
|
6849
|
-
ACER: "Acer",
|
|
6850
|
-
ADVAN: "Advan",
|
|
6851
|
-
ALCATEL: "Alcatel",
|
|
6852
|
-
APPLE: "Apple",
|
|
6853
|
-
AMAZON: "Amazon",
|
|
6854
|
-
ARCHOS: "Archos",
|
|
6855
|
-
ASUS: "ASUS",
|
|
6856
|
-
ATT: "AT&T",
|
|
6857
|
-
BENQ: "BenQ",
|
|
6858
|
-
BLACKBERRY: "BlackBerry",
|
|
6859
|
-
BLU: "BLU",
|
|
6860
|
-
CAT: "Cat",
|
|
6861
|
-
DELL: "Dell",
|
|
6862
|
-
ENERGIZER: "Energizer",
|
|
6863
|
-
ESSENTIAL: "Essential",
|
|
6864
|
-
FACEBOOK: "Facebook",
|
|
6865
|
-
FAIRPHONE: "Fairphone",
|
|
6866
|
-
GEEKSPHONE: "GeeksPhone",
|
|
6867
|
-
GENERIC: "Generic",
|
|
6868
|
-
GOOGLE: "Google",
|
|
6869
|
-
HISENSE: "Hisense",
|
|
6870
|
-
HMD: "HMD",
|
|
6871
|
-
HP: "HP",
|
|
6872
|
-
HTC: "HTC",
|
|
6873
|
-
HUAWEI: "Huawei",
|
|
6874
|
-
IMO: "IMO",
|
|
6875
|
-
INFINIX: "Infinix",
|
|
6876
|
-
ITEL: "itel",
|
|
6877
|
-
JOLLA: "Jolla",
|
|
6878
|
-
KOBO: "Kobo",
|
|
6879
|
-
LAVA: "Lava",
|
|
6880
|
-
LENOVO: "Lenovo",
|
|
6881
|
-
LG: "LG",
|
|
6882
|
-
MEIZU: "Meizu",
|
|
6883
|
-
MICROMAX: "Micromax",
|
|
6884
|
-
MICROSOFT: "Microsoft",
|
|
6885
|
-
MOTOROLA: "Motorola",
|
|
6886
|
-
NEXIAN: "Nexian",
|
|
6887
|
-
NINTENDO: "Nintendo",
|
|
6888
|
-
NOKIA: "Nokia",
|
|
6889
|
-
NOTHING: "Nothing",
|
|
6890
|
-
NVIDIA: "Nvidia",
|
|
6891
|
-
ONEPLUS: "OnePlus",
|
|
6892
|
-
OPPO: "OPPO",
|
|
6893
|
-
OUYA: "Ouya",
|
|
6894
|
-
PALM: "Palm",
|
|
6895
|
-
PANASONIC: "Panasonic",
|
|
6896
|
-
PEBBLE: "Pebble",
|
|
6897
|
-
PHILIPS: "Philips",
|
|
6898
|
-
PICO: "Pico",
|
|
6899
|
-
POLYTRON: "Polytron",
|
|
6900
|
-
REALME: "Realme",
|
|
6901
|
-
RETROID: "Retroid",
|
|
6902
|
-
RIM: "RIM",
|
|
6903
|
-
ROKU: "Roku",
|
|
6904
|
-
SAMSUNG: "Samsung",
|
|
6905
|
-
SHARP: "Sharp",
|
|
6906
|
-
SIEMENS: "Siemens",
|
|
6907
|
-
SMARTFREN: "Smartfren",
|
|
6908
|
-
SONY: "Sony",
|
|
6909
|
-
SPRINT: "Sprint",
|
|
6910
|
-
TCL: "TCL",
|
|
6911
|
-
TECHNISAT: "TechniSAT",
|
|
6912
|
-
TECNO: "TECNO",
|
|
6913
|
-
TESLA: "Tesla",
|
|
6914
|
-
ULEFONE: "Ulefone",
|
|
6915
|
-
VIVO: "Vivo",
|
|
6916
|
-
VIZIO: "Vizio",
|
|
6917
|
-
VODAFONE: "Vodafone",
|
|
6918
|
-
WIKO: "Wiko",
|
|
6919
|
-
XBOX: "Xbox",
|
|
6920
|
-
XIAOMI: "Xiaomi",
|
|
6921
|
-
ZEBRA: "Zebra",
|
|
6922
|
-
ZTE: "ZTE"
|
|
6923
|
-
// TODO : test!
|
|
6924
|
-
});
|
|
6925
|
-
var EngineName = Object.freeze({
|
|
6926
|
-
AMAYA: "Amaya",
|
|
6927
|
-
ARKWEB: "ArkWeb",
|
|
6928
|
-
BLINK: "Blink",
|
|
6929
|
-
EDGEHTML: "EdgeHTML",
|
|
6930
|
-
FLOW: "Flow",
|
|
6931
|
-
GECKO: "Gecko",
|
|
6932
|
-
GOANNA: "Goanna",
|
|
6933
|
-
ICAB: "iCab",
|
|
6934
|
-
KHTML: "KHTML",
|
|
6935
|
-
LIBWEB: "LibWeb",
|
|
6936
|
-
LINKS: "Links",
|
|
6937
|
-
LYNX: "Lynx",
|
|
6938
|
-
NETFRONT: "NetFront",
|
|
6939
|
-
NETSURF: "NetSurf",
|
|
6940
|
-
PRESTO: "Presto",
|
|
6941
|
-
SERVO: "Servo",
|
|
6942
|
-
TASMAN: "Tasman",
|
|
6943
|
-
TRIDENT: "Trident",
|
|
6944
|
-
W3M: "w3m",
|
|
6945
|
-
WEBKIT: "WebKit"
|
|
6946
|
-
});
|
|
6947
|
-
var OSName = Object.freeze({
|
|
6948
|
-
AIX: "AIX",
|
|
6949
|
-
AMIGA_OS: "Amiga OS",
|
|
6950
|
-
ANDROID: "Android",
|
|
6951
|
-
ANDROID_X86: "Android-x86",
|
|
6952
|
-
ARCAOS: "ArcaOS",
|
|
6953
|
-
ARCH: "Arch",
|
|
6954
|
-
BADA: "Bada",
|
|
6955
|
-
BEOS: "BeOS",
|
|
6956
|
-
BLACKBERRY: "BlackBerry",
|
|
6957
|
-
CENTOS: "CentOS",
|
|
6958
|
-
CHROME_OS: "Chrome OS",
|
|
6959
|
-
CHROMECAST: "Chromecast",
|
|
6960
|
-
CHROMECAST_ANDROID: "Chromecast Android",
|
|
6961
|
-
CHROMECAST_FUCHSIA: "Chromecast Fuchsia",
|
|
6962
|
-
CHROMECAST_LINUX: "Chromecast Linux",
|
|
6963
|
-
CHROMECAST_SMARTSPEAKER: "Chromecast SmartSpeaker",
|
|
6964
|
-
CONTIKI: "Contiki",
|
|
6965
|
-
DEBIAN: "Debian",
|
|
6966
|
-
DEEPIN: "Deepin",
|
|
6967
|
-
DRAGONFLY: "DragonFly",
|
|
6968
|
-
ELEMENTARY_OS: "elementary OS",
|
|
6969
|
-
FEDORA: "Fedora",
|
|
6970
|
-
FIREFOX_OS: "Firefox OS",
|
|
6971
|
-
FREEBSD: "FreeBSD",
|
|
6972
|
-
FUCHSIA: "Fuchsia",
|
|
6973
|
-
GENTOO: "Gentoo",
|
|
6974
|
-
GHOSTBSD: "GhostBSD",
|
|
6975
|
-
GNU: "GNU",
|
|
6976
|
-
HAIKU: "Haiku",
|
|
6977
|
-
HARMONYOS: "HarmonyOS",
|
|
6978
|
-
HP_UX: "HP-UX",
|
|
6979
|
-
HURD: "Hurd",
|
|
6980
|
-
IOS: "iOS",
|
|
6981
|
-
JOLI: "Joli",
|
|
6982
|
-
KAIOS: "KaiOS",
|
|
6983
|
-
KNOPPIX: "Knoppix",
|
|
6984
|
-
KUBUNTU: "Kubuntu",
|
|
6985
|
-
LINPUS: "Linpus",
|
|
6986
|
-
LINSPIRE: "Linspire",
|
|
6987
|
-
LINUX: "Linux",
|
|
6988
|
-
MACOS: "macOS",
|
|
6989
|
-
MAEMO: "Maemo",
|
|
6990
|
-
MAGEIA: "Mageia",
|
|
6991
|
-
MANDRIVA: "Mandriva",
|
|
6992
|
-
MANJARO: "Manjaro",
|
|
6993
|
-
MEEGO: "MeeGo",
|
|
6994
|
-
MINIX: "Minix",
|
|
6995
|
-
MINT: "Mint",
|
|
6996
|
-
MORPH_OS: "Morph OS",
|
|
6997
|
-
NETBSD: "NetBSD",
|
|
6998
|
-
NETRANGE: "NetRange",
|
|
6999
|
-
NETTV: "NetTV",
|
|
7000
|
-
NINTENDO: "Nintendo",
|
|
7001
|
-
OPENHARMONY: "OpenHarmony",
|
|
7002
|
-
OPENBSD: "OpenBSD",
|
|
7003
|
-
OPENVMS: "OpenVMS",
|
|
7004
|
-
OS2: "OS/2",
|
|
7005
|
-
PALM: "Palm",
|
|
7006
|
-
PC_BSD: "PC-BSD",
|
|
7007
|
-
PCLINUXOS: "PCLinuxOS",
|
|
7008
|
-
PICO: "Pico",
|
|
7009
|
-
PLAN9: "Plan9",
|
|
7010
|
-
PLAYSTATION: "PlayStation",
|
|
7011
|
-
QNX: "QNX",
|
|
7012
|
-
RASPBIAN: "Raspbian",
|
|
7013
|
-
REDHAT: "RedHat",
|
|
7014
|
-
RIM_TABLET_OS: "RIM Tablet OS",
|
|
7015
|
-
RISC_OS: "RISC OS",
|
|
7016
|
-
SABAYON: "Sabayon",
|
|
7017
|
-
SAILFISH: "Sailfish",
|
|
7018
|
-
SERENITYOS: "SerenityOS",
|
|
7019
|
-
SERIES40: "Series40",
|
|
7020
|
-
SLACKWARE: "Slackware",
|
|
7021
|
-
SOLARIS: "Solaris",
|
|
7022
|
-
SUSE: "SUSE",
|
|
7023
|
-
SYMBIAN: "Symbian",
|
|
7024
|
-
TIZEN: "Tizen",
|
|
7025
|
-
UBUNTU: "Ubuntu",
|
|
7026
|
-
UBUNTU_TOUCH: "Ubuntu Touch",
|
|
7027
|
-
UNIX: "Unix",
|
|
7028
|
-
VECTORLINUX: "VectorLinux",
|
|
7029
|
-
WATCHOS: "watchOS",
|
|
7030
|
-
WEBOS: "WebOS",
|
|
7031
|
-
WINDOWS: "Windows",
|
|
7032
|
-
WINDOWS_CE: "Windows CE",
|
|
7033
|
-
WINDOWS_IOT: "Windows IoT",
|
|
7034
|
-
WINDOWS_MOBILE: "Windows Mobile",
|
|
7035
|
-
WINDOWS_PHONE: "Windows Phone",
|
|
7036
|
-
WINDOWS_RT: "Windows RT",
|
|
7037
|
-
XBOX: "Xbox",
|
|
7038
|
-
XUBUNTU: "Xubuntu",
|
|
7039
|
-
ZENWALK: "Zenwalk"
|
|
7040
|
-
// TODO : test!
|
|
7041
|
-
});
|
|
7042
|
-
var Extension = Object.freeze({
|
|
7043
|
-
BrowserName: {
|
|
7044
|
-
CLI: {
|
|
7045
|
-
CURL: "curl",
|
|
7046
|
-
ELINKS: "ELinks",
|
|
7047
|
-
HTTPIE: "HTTPie",
|
|
7048
|
-
LYNX: "Lynx",
|
|
7049
|
-
WGET: "Wget"
|
|
7050
|
-
},
|
|
7051
|
-
Crawler: {
|
|
7052
|
-
AHREFS_BOT: "AhrefsBot",
|
|
7053
|
-
AI2_BOT: "AI2Bot",
|
|
7054
|
-
AIHIT_BOT: "aiHitBot",
|
|
7055
|
-
ALGOLIA_CRAWLER: "Algolia Crawler",
|
|
7056
|
-
APPLE_BOT: "Applebot",
|
|
7057
|
-
APPLE_BOT_EXTENDED: "Applebot-Extended",
|
|
7058
|
-
ASK_TEOMA: "Teoma",
|
|
7059
|
-
AMAZON_BOT: "Amazonbot",
|
|
7060
|
-
AMAZON_CONTXBOT: "contxbot",
|
|
7061
|
-
ANTHROPIC_AI: "anthropic-ai",
|
|
7062
|
-
ANTHROPIC_CLAUDE_BOT: "ClaudeBot",
|
|
7063
|
-
ANTHROPIC_CLAUDE_SEARCHBOT: "Claude-SearchBot",
|
|
7064
|
-
ANTHROPIC_CLAUDE_WEB: "Claude-Web",
|
|
7065
|
-
ARCHIVEORG_BOT: "archive.org_bot",
|
|
7066
|
-
BAIDU_ADS: "Baidu-ADS",
|
|
7067
|
-
BAIDU_SPIDER: "Baiduspider",
|
|
7068
|
-
BAIDU_SPIDER_ADS: "Baiduspider-ads",
|
|
7069
|
-
BAIDU_SPIDER_CPRO: "Baiduspider-cpro",
|
|
7070
|
-
BAIDU_SPIDER_FAVO: "Baiduspider-favo",
|
|
7071
|
-
BAIDU_SPIDER_IMAGE: "Baiduspider-image",
|
|
7072
|
-
BAIDU_SPIDER_NEWS: "Baiduspider-news",
|
|
7073
|
-
BAIDU_SPIDER_RENDER: "Baiduspider-render",
|
|
7074
|
-
BAIDU_SPIDER_VIDEO: "Baiduspider-video",
|
|
7075
|
-
BLEX_BOT: "BLEXBot",
|
|
7076
|
-
BOTIFY: "botify",
|
|
7077
|
-
BRAVE_BOT: "Bravebot",
|
|
7078
|
-
BYTEDANCE_BYTESPIDER: "Bytespider",
|
|
7079
|
-
BYTEDANCE_TIKTOKSPIDER: "TikTokSpider",
|
|
7080
|
-
COMMON_CRAWL_CCBOT: "CCBot",
|
|
7081
|
-
COCCOC_BOT_WEB: "coccocbot-web",
|
|
7082
|
-
COCCOC_BOT_IMAGE: "coccocbot-image",
|
|
7083
|
-
COHERE_TRAINING_DATA_CRAWLER: "cohere-training-data-crawler",
|
|
7084
|
-
COTOYOGI: "Cotoyogi",
|
|
7085
|
-
COVEO_BOT: "Coveobot",
|
|
7086
|
-
CRITEO_BOT: "CriteoBot",
|
|
7087
|
-
DATAFORSEO_BOT: "DataForSeoBot",
|
|
7088
|
-
DAUM: "Daum",
|
|
7089
|
-
DAUM_DAUMOA: "Daumoa",
|
|
7090
|
-
DAUM_DAUMOA_IMAGE: "Daumoa-image",
|
|
7091
|
-
DEEPSEEK_BOT: "DeepSeekBot",
|
|
7092
|
-
DIFFBOT: "Diffbot",
|
|
7093
|
-
DUCKDUCKGO_BOT: "DuckDuckBot",
|
|
7094
|
-
DUCKDUCKGO_FAVICONS_BOT: "DuckDuckGo-Favicons-Bot",
|
|
7095
|
-
ELASTIC: "Elastic",
|
|
7096
|
-
ELASTIC_SWIFTYPE_BOT: "Swiftbot",
|
|
7097
|
-
EXALEAD_EXABOT: "Exabot",
|
|
7098
|
-
FIRECRAWL_AGENT: "FirecrawlAgent",
|
|
7099
|
-
FREESPOKE: "Freespoke",
|
|
7100
|
-
GOOGLE_ADSBOT: "AdsBot-Google",
|
|
7101
|
-
GOOGLE_ADSBOT_MOBILE: "Adsbot-Google-Mobile",
|
|
7102
|
-
GOOGLE_ADSENSE: "AdSense",
|
|
7103
|
-
GOOGLE_APIS: "APIs-Google",
|
|
7104
|
-
GOOGLE_BOT: "Googlebot",
|
|
7105
|
-
GOOGLE_BOT_IMAGE: "Googlebot-Image",
|
|
7106
|
-
GOOGLE_BOT_NEWS: "Googlebot-News",
|
|
7107
|
-
GOOGLE_BOT_VIDEO: "Googlebot-Video",
|
|
7108
|
-
GOOGLE_CLOUDVERTEXBOT: "Google-CloudVertexBot",
|
|
7109
|
-
GOOGLE_EXTENDED: "Google-Extended",
|
|
7110
|
-
GOOGLE_INSPECTIONTOOL: "Google-InspectionTool",
|
|
7111
|
-
GOOGLE_OTHER: "GoogleOther",
|
|
7112
|
-
GOOGLE_OTHER_IMAGE: "GoogleOther-Image",
|
|
7113
|
-
GOOGLE_OTHER_VIDEO: "GoogleOther-Video",
|
|
7114
|
-
GOOGLE_SAFETY: "Google-Safety",
|
|
7115
|
-
GOOGLE_STOREBOT: "Storebot-Google",
|
|
7116
|
-
HIVE_IMAGESIFTBOT: "ImagesiftBot",
|
|
7117
|
-
HUAWEI_PANGUBOT: "PanguBot",
|
|
7118
|
-
HUAWEI_PETALBOT: "PetalBot",
|
|
7119
|
-
HUGGINGFACE_BOT: "HuggingFace-Bot",
|
|
7120
|
-
HUNTER_VELENPUBLICWEBCRAWLER: "VelenPublicWebCrawler",
|
|
7121
|
-
IA_ARCHIVER: "ia_archiver",
|
|
7122
|
-
IASK_BOT: "iAskBot",
|
|
7123
|
-
KAGI_BOT: "Kagibot",
|
|
7124
|
-
KANGAROO_BOT: "Kangaroo Bot",
|
|
7125
|
-
LINE_SPIDER: "Linespider",
|
|
7126
|
-
LINKEDIN_BOT: "LinkedInBot",
|
|
7127
|
-
MAGPIE_CRAWLER: "magpie-crawler",
|
|
7128
|
-
MARGINALIA: "marginalia",
|
|
7129
|
-
META_EXTERNALAGENT: "meta-externalagent",
|
|
7130
|
-
META_FACEBOOKBOT: "FacebookBot",
|
|
7131
|
-
META_FACEBOOKCATALOG: "facebookcatalog",
|
|
7132
|
-
META_FACEBOOKEXTERNALHIT: "facebookexternalhit",
|
|
7133
|
-
MAJESTIC_MJ12BOT: "MJ12bot",
|
|
7134
|
-
MICROSOFT_BINGBOT: "Bingbot",
|
|
7135
|
-
MICROSOFT_MSNBOT: "msnbot",
|
|
7136
|
-
MICROSOFT_ADIDXBOT: "adidxbot",
|
|
7137
|
-
MOJEEK_BOT: "MojeekBot",
|
|
7138
|
-
MOZ_DOTBOT: "DotBot",
|
|
7139
|
-
ONCRAWL: "OnCrawl",
|
|
7140
|
-
ONESPOT_SCRAPERBOT: "Onespot-ScraperBot",
|
|
7141
|
-
OPENAI_GPTBOT: "GPTBot",
|
|
7142
|
-
OPENAI_SEARCH_BOT: "OAI-SearchBot",
|
|
7143
|
-
PERPLEXITY_BOT: "PerplexityBot",
|
|
7144
|
-
QIHOO_360_SPIDER: "360Spider",
|
|
7145
|
-
QWANT_BOT: "Qwantbot",
|
|
7146
|
-
QWANT_BOT_NEWS: "Qwantbot-news",
|
|
7147
|
-
REPLICATE_BOT: "Replicate-Bot",
|
|
7148
|
-
RUNPOD_BOT: "RunPod-Bot",
|
|
7149
|
-
SB_INTUITIONS_BOT: "SBIntuitionsBot",
|
|
7150
|
-
SEEKPORT_BOT: "SeekportBot",
|
|
7151
|
-
SEMRUSH_BOT: "SemrushBot",
|
|
7152
|
-
SEMRUSH_BOT_BACKLINK: "SemrushBot-BA",
|
|
7153
|
-
SEMRUSH_BOT_CONTENTSHAKE: "SemrushBot-OCOB",
|
|
7154
|
-
SEMRUSH_BOT_SEO_CHECKER: "SemrushBot-SI",
|
|
7155
|
-
SEZNAM_BOT: "SeznamBot",
|
|
7156
|
-
SITEIMPROVE: "Siteimprove",
|
|
7157
|
-
SOGOU_PIC_SPIDER: "Sogou Pic Spider",
|
|
7158
|
-
SOGOU_WEB_SPIDER: "Sogou web spider",
|
|
7159
|
-
STARTPAGE: "Startpage",
|
|
7160
|
-
SURLY_BOT: "SurdotlyBot",
|
|
7161
|
-
TIMPI_BOT: "Timpibot",
|
|
7162
|
-
TOGETHER_BOT: "Together-Bot",
|
|
7163
|
-
TURNITIN_BOT: "TurnitinBot",
|
|
7164
|
-
TWIN_AGENT: "TwinAgent",
|
|
7165
|
-
VERCEL_V0BOT: "v0bot",
|
|
7166
|
-
WEBZIO: "webzio",
|
|
7167
|
-
WEBZIO_EXTENDED: "Webzio-Extended",
|
|
7168
|
-
WEBZIO_OMGILI: "omgili",
|
|
7169
|
-
WEBZIO_OMGILI_BOT: "omgilibot",
|
|
7170
|
-
XAI_BOT: "xAI-Bot",
|
|
7171
|
-
YAHOO_JAPAN: "Y!J-BRW",
|
|
7172
|
-
YAHOO_SLURP: "Yahoo! Slurp",
|
|
7173
|
-
YANDEX_ACCESSIBILITY_BOT: "YandexAccessibilityBot",
|
|
7174
|
-
YANDEX_ADDITIONAL_BOT: "YandexAdditionalBot",
|
|
7175
|
-
YANDEX_ADNET: "YandexAdNet",
|
|
7176
|
-
YANDEX_BLOGS: "YandexBlogs",
|
|
7177
|
-
YANDEX_BOT: "YandexBot",
|
|
7178
|
-
YANDEX_BOT_MIRRORDETECTOR: "YandexBot MirrorDetector",
|
|
7179
|
-
YANDEX_COMBOT: "YandexComBot",
|
|
7180
|
-
YANDEX_FAVICONS: "YandexFavicons",
|
|
7181
|
-
YANDEX_IMAGE_RESIZER: "YandexImageResizer",
|
|
7182
|
-
YANDEX_IMAGES: "YandexImages",
|
|
7183
|
-
YANDEX_MARKET: "YandexMarket",
|
|
7184
|
-
YANDEX_MEDIA: "YandexMedia",
|
|
7185
|
-
YANDEX_METRIKA: "YandexMetrika",
|
|
7186
|
-
YANDEX_MOBILE_BOT: "YandexMobileBot",
|
|
7187
|
-
YANDEX_MOBILE_SCREENSHOT_BOT: "YandexMobileScreenShotBot",
|
|
7188
|
-
YANDEX_NEWS: "YandexNews",
|
|
7189
|
-
YANDEX_ONTODB: "YandexOntoDB",
|
|
7190
|
-
YANDEX_ONTODB_API: "YandexOntoDBAPI",
|
|
7191
|
-
YANDEX_PARTNER: "YandexPartner",
|
|
7192
|
-
YANDEX_RCA: "YandexRCA",
|
|
7193
|
-
YANDEX_RENDERRESOURCES_BOT: "YandexRenderResourcesBot",
|
|
7194
|
-
YANDEX_SCREENSHOT_BOT: "YandexScreenshotBot",
|
|
7195
|
-
YANDEX_SPRAV_BOT: "YandexSpravBot",
|
|
7196
|
-
YANDEX_TRACKER: "YandexTracker",
|
|
7197
|
-
YANDEX_VERTICALS: "YandexVerticals",
|
|
7198
|
-
YANDEX_VERTIS: "YandexVertis",
|
|
7199
|
-
YANDEX_VIDEO: "YandexVideo",
|
|
7200
|
-
YANDEX_VIDEO_PARSER: "YandexVideoParser",
|
|
7201
|
-
YANDEX_WEBMASTER: "YandexWebmaster",
|
|
7202
|
-
YEP_BOT: "YepBot",
|
|
7203
|
-
YETI: "Yeti",
|
|
7204
|
-
YISOU_SPIDER: "YisouSpider",
|
|
7205
|
-
YOU_BOT: "YouBot",
|
|
7206
|
-
ZHIPU_CHATGLM_SPIDER: "ChatGLM-Spider",
|
|
7207
|
-
ZUM_BOT: "ZumBot"
|
|
7208
|
-
},
|
|
7209
|
-
Email: {
|
|
7210
|
-
AIRMAIL: "Airmail",
|
|
7211
|
-
APPLE_MAIL: "Mail",
|
|
7212
|
-
BLUEMAIL: "BlueMail",
|
|
7213
|
-
DAUM_MAIL: "DaumMail",
|
|
7214
|
-
EVOLUTION: "Evolution",
|
|
7215
|
-
EM_CLIENT: "eM Client",
|
|
7216
|
-
FOXMAIL: "Foxmail",
|
|
7217
|
-
KMAIL: "KMail",
|
|
7218
|
-
KMAIL2: "kmail2",
|
|
7219
|
-
KONTACT: "Kontact",
|
|
7220
|
-
MICROSOFT_OUTLOOK: "Microsoft Outlook",
|
|
7221
|
-
MICROSOFT_OUTLOOK_MAC: "MacOutlook",
|
|
7222
|
-
NAVER_MAILAPP: "NaverMailApp",
|
|
7223
|
-
POLYMAIL: "Polymail",
|
|
7224
|
-
PROTON_MAIL: "ProtonMail",
|
|
7225
|
-
SPARK_MAIL: "SparkDesktop",
|
|
7226
|
-
SPARROW: "Sparrow",
|
|
7227
|
-
THUNDERBIRD: "Thunderbird",
|
|
7228
|
-
YAHOO_MAIL: "Yahoo",
|
|
7229
|
-
ZIMBRA: "Zimbra",
|
|
7230
|
-
ZOHO_MAIL: "ZohoMail-Desktop"
|
|
7231
|
-
},
|
|
7232
|
-
Fetcher: {
|
|
7233
|
-
AHREFS_SITEAUDIT: "AhrefsSiteAudit",
|
|
7234
|
-
ANTHROPIC_CLAUDE_USER: "Claude-User",
|
|
7235
|
-
ASANA: "Asana",
|
|
7236
|
-
BETTER_UPTIME_BOT: "Better Uptime Bot",
|
|
7237
|
-
BITLY_BOT: "bitlybot",
|
|
7238
|
-
BLUESKY: "Bluesky",
|
|
7239
|
-
BUFFER_LINKPREVIEWBOT: "BufferLinkPreviewBot",
|
|
7240
|
-
COHERE_AI: "Cohere-AI",
|
|
7241
|
-
DISCORD_BOT: "Discordbot",
|
|
7242
|
-
DUCKDUCKGO_ASSISTBOT: "DuckAssistBot",
|
|
7243
|
-
GOOGLE_CHROME_LIGHTHOUSE: "Chrome-Lighthouse",
|
|
7244
|
-
GOOGLE_FEEDFETCHER: "FeedFetcher-Google",
|
|
7245
|
-
GOOGLE_GEMINI_DEEP_RESEARCH: "Gemini-Deep-Research",
|
|
7246
|
-
GOOGLE_IMAGEPROXY: "GoogleImageProxy",
|
|
7247
|
-
GOOGLE_PAGERENDERER: "Google-PageRenderer",
|
|
7248
|
-
GOOGLE_READ_ALOUD: "Google-Read-Aloud",
|
|
7249
|
-
GOOGLE_PRODUCER: "GoogleProducer",
|
|
7250
|
-
GOOGLE_SITE_VERIFICATION: "Google-Site-Verification",
|
|
7251
|
-
HUBSPOT_PAGE_FETCHER: "HubSpot Page Fetcher",
|
|
7252
|
-
IFRAMELY: "Iframely",
|
|
7253
|
-
KAKAOTALK_SCRAP: "kakaotalk-scrap",
|
|
7254
|
-
KEYBASE_BOT: "KeybaseBot",
|
|
7255
|
-
META_EXTERNALFETCHER: "meta-externalfetcher",
|
|
7256
|
-
META_WHATSAPP: "WhatsApp",
|
|
7257
|
-
MICROSOFT_BINGPREVIEW: "BingPreview",
|
|
7258
|
-
MICROSOFT_PREVIEW: "MicrosoftPreview",
|
|
7259
|
-
MISTRALAI_USER: "MistralAI-User",
|
|
7260
|
-
NAVER_BLUENO: "Blueno",
|
|
7261
|
-
ONCRAWL_ROGERBOT: "rogerbot",
|
|
7262
|
-
OPENAI_CHATGPT_USER: "ChatGPT-User",
|
|
7263
|
-
PERPLEXITY_USER: "Perplexity-User",
|
|
7264
|
-
PINTEREST_BOT: "Pinterestbot",
|
|
7265
|
-
SEMRUSH_SITEAUDITBOT: "SiteAuditBot",
|
|
7266
|
-
SLACK_BOT: "Slackbot",
|
|
7267
|
-
SLACK_BOT_LINKEXPANDING: "Slackbot-LinkExpanding",
|
|
7268
|
-
SLACK_IMGPROXY: "Slack-ImgProxy",
|
|
7269
|
-
SNAP_URL_PREVIEW: "Snap URL Preview",
|
|
7270
|
-
SKYPE_URIPREVIEW: "SkypeUriPreview",
|
|
7271
|
-
TELEGRAM_BOT: "TelegramBot",
|
|
7272
|
-
UPTIMEROBOT: "UptimeRobot",
|
|
7273
|
-
VERCEL_FAVICON_BOT: "vercel-favicon-bot",
|
|
7274
|
-
VERCEL_SCREENSHOT_BOT: "vercel-screenshot-bot",
|
|
7275
|
-
VERCEL_BOT: "Vercelbot",
|
|
7276
|
-
VERCEL_FLAGS: "vercelflags",
|
|
7277
|
-
VERCEL_TRACING: "verceltracing",
|
|
7278
|
-
X_TWITTERBOT: "Twitterbot",
|
|
7279
|
-
YANDEX_CALENDAR: "YandexCalendar",
|
|
7280
|
-
YANDEX_DIRECT: "YandexDirect",
|
|
7281
|
-
YANDEX_DIRECTDYN: "YandexDirectDyn",
|
|
7282
|
-
YANDEX_DIRECTFETCHER: "YaDirectFetcher",
|
|
7283
|
-
YANDEX_FORDOMAIN: "YandexForDomain",
|
|
7284
|
-
YANDEX_PAGECHECKER: "YandexPagechecker",
|
|
7285
|
-
YANDEX_SEARCHSHOP: "YandexSearchShop",
|
|
7286
|
-
YANDEX_SITELINKS: "YandexSitelinks",
|
|
7287
|
-
YANDEX_USERPROXY: "YandexUserproxy",
|
|
7288
|
-
ZOOMINFO_BOT: "Zoombot"
|
|
7289
|
-
},
|
|
7290
|
-
InApp: {
|
|
7291
|
-
DISCORD: "Discord",
|
|
7292
|
-
EVERNOTE: "Evernote",
|
|
7293
|
-
FIGMA: "Figma",
|
|
7294
|
-
FLIPBOARD: "Flipboard",
|
|
7295
|
-
MATTERMOST: "Mattermost",
|
|
7296
|
-
TEAMS: "Teams",
|
|
7297
|
-
NOTION: "Notion",
|
|
7298
|
-
POSTMAN: "Postman",
|
|
7299
|
-
RAMBOX: "Rambox",
|
|
7300
|
-
ROCKETCHAT: "Rocket.Chat",
|
|
7301
|
-
SLACK: "Slack",
|
|
7302
|
-
TIKTOK_LITE: "TikTok Lite",
|
|
7303
|
-
VSCODE: "VS Code",
|
|
7304
|
-
YAHOO_JAPAN: "Yahoo! Japan"
|
|
7305
|
-
},
|
|
7306
|
-
Library: {
|
|
7307
|
-
ADOBE_AIR: "AdobeAIR",
|
|
7308
|
-
AIOHTTP: "aiohttp",
|
|
7309
|
-
APACHE_HTTPCLIENT: "Apache-HttpClient",
|
|
7310
|
-
AXIOS: "axios",
|
|
7311
|
-
GO_HTTP_CLIENT: "go-http-client",
|
|
7312
|
-
GOT: "got",
|
|
7313
|
-
GUZZLEHTTP: "GuzzleHttp",
|
|
7314
|
-
JAVA: "Java",
|
|
7315
|
-
JAVA_HTTPCLIENT: "Java-http-client",
|
|
7316
|
-
JSDOM: "jsdom",
|
|
7317
|
-
LIBWWW_PERL: "libwww-perl",
|
|
7318
|
-
LUA_RESTY_HTTP: "lua-resty-http",
|
|
7319
|
-
NEEDLE: "Needle",
|
|
7320
|
-
NUTCH: "Nutch",
|
|
7321
|
-
OKHTTP: "OkHttp",
|
|
7322
|
-
NODE_FETCH: "node-fetch",
|
|
7323
|
-
NODE_SUPERAGENT: "node-superagent",
|
|
7324
|
-
PHP_SOAP: "PHP-SOAP",
|
|
7325
|
-
POSTMAN_RUNTIME: "PostmanRuntime",
|
|
7326
|
-
PYTHON_HTTPX: "python-httpx",
|
|
7327
|
-
PYTHON_URLLIB: "python-urllib",
|
|
7328
|
-
PYTHON_URLLIB3: "python-urllib3",
|
|
7329
|
-
PYTHON_REQUESTS: "python-requests",
|
|
7330
|
-
SCRAPY: "Scrapy"
|
|
7331
|
-
}
|
|
7332
|
-
},
|
|
7333
|
-
DeviceVendor: {
|
|
7334
|
-
Vehicle: {
|
|
7335
|
-
BMW: "BMW",
|
|
7336
|
-
BYD: "BYD",
|
|
7337
|
-
JEEP: "Jeep",
|
|
7338
|
-
RIVIAN: "Rivian",
|
|
7339
|
-
TESLA: "Tesla",
|
|
7340
|
-
VOLVO: "Volvo"
|
|
7341
|
-
}
|
|
7342
|
-
}
|
|
7343
|
-
});
|
|
7344
|
-
|
|
7345
|
-
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/extensions/ua-parser-extensions.mjs
|
|
7346
|
-
var MODEL2 = "model";
|
|
7347
|
-
var NAME2 = "name";
|
|
7348
|
-
var TYPE2 = "type";
|
|
7349
|
-
var VENDOR2 = "vendor";
|
|
7350
|
-
var VERSION4 = "version";
|
|
7351
|
-
var MOBILE2 = "mobile";
|
|
7352
|
-
var TABLET2 = "tablet";
|
|
7353
|
-
var CRAWLER = "crawler";
|
|
7354
|
-
var CLI = "cli";
|
|
7355
|
-
var EMAIL = "email";
|
|
7356
|
-
var FETCHER = "fetcher";
|
|
7357
|
-
var INAPP2 = "inapp";
|
|
7358
|
-
var MEDIAPLAYER = "mediaplayer";
|
|
7359
|
-
var LIBRARY = "library";
|
|
7360
|
-
var CLIs = Object.freeze({
|
|
7361
|
-
browser: [
|
|
7362
|
-
// wget / curl / Lynx / ELinks / HTTPie
|
|
7363
|
-
[/(wget|curl|lynx|elinks|httpie)[\/ ]\(?([\w\.-]+)/i],
|
|
7364
|
-
[NAME2, VERSION4, [TYPE2, CLI]]
|
|
7365
|
-
]
|
|
7366
|
-
});
|
|
7367
|
-
var Crawlers = Object.freeze({
|
|
7368
|
-
browser: [
|
|
7369
|
-
[
|
|
7370
|
-
// AhrefsBot - https://ahrefs.com/robot
|
|
7371
|
-
// Amazonbot - https://developer.amazon.com/amazonbot
|
|
7372
|
-
// Bingbot / AdIdxBot - https://www.bing.com/webmasters/help/which-crawlers-does-bing-use-8c184ec0
|
|
7373
|
-
// Bravebot - https://search.brave.com/help/brave-search-crawler
|
|
7374
|
-
// CCBot - https://commoncrawl.org/faq
|
|
7375
|
-
// contxbot - https://affiliate-program.amazon.com/help/node/topic/GT98G5PPRERNVZ2C
|
|
7376
|
-
// Coveobot - https://connect.coveo.com/s/article/19648
|
|
7377
|
-
// CriteoBot - https://www.criteo.com/criteo-crawler/
|
|
7378
|
-
// Dotbot - https://moz.com/help/moz-procedures/crawlers/dotbot
|
|
7379
|
-
// DuckDuckBot - http://duckduckgo.com/duckduckbot.html
|
|
7380
|
-
// FacebookBot - https://developers.facebook.com/docs/sharing/bot/
|
|
7381
|
-
// GPTBot - https://platform.openai.com/docs/gptbot
|
|
7382
|
-
// iAskBot - https://iask.ai
|
|
7383
|
-
// Kagibot - https://kagi.com/bot
|
|
7384
|
-
// Kangaroo Bot - https://kangaroollm.com.au/kangaroo-bot/
|
|
7385
|
-
// LinkedInBot - http://www.linkedin.com
|
|
7386
|
-
// MJ12bot - https://mj12bot.com/
|
|
7387
|
-
// MojeekBot - https://www.mojeek.com/bot.html
|
|
7388
|
-
// Onespot - https://www.onespot.com/identifying-traffic.html
|
|
7389
|
-
// OpenAI's SearchGPT - https://platform.openai.com/docs/bots
|
|
7390
|
-
// PerplexityBot - https://perplexity.ai/perplexitybot
|
|
7391
|
-
// SBIntuitionsBot - https://www.sbintuitions.co.jp/bot/
|
|
7392
|
-
// SeznamBot - http://napoveda.seznam.cz/seznambot-intro
|
|
7393
|
-
// SurdotlyBot - http://sur.ly/bot.html
|
|
7394
|
-
// Swiftbot - https://swiftype.com/swiftbot
|
|
7395
|
-
// YepBot - https://yep.com/yepbot/
|
|
7396
|
-
/((?:adidx|ahrefs|amazon|bing|brave|cc|contx|coveo|criteo|dot|duckduck(?:go-favicons-)?|exa|facebook|gpt|iask|kagi|kangaroo |linkedin|mj12|mojeek|oai-search|onespot-scraper|perplexity|sbintuitions|semrush|seznam|surdotly|swift|yep)bot)\/([\w\.-]+)/i,
|
|
7397
|
-
// Algolia Crawler
|
|
7398
|
-
/(algolia crawler(?: renderscript)?)\/?([\w\.]*)/i,
|
|
7399
|
-
// Applebot - http://apple.com/go/applebot
|
|
7400
|
-
/(applebot(?:-extended)?)\/?([\w\.]*)/i,
|
|
7401
|
-
// Baiduspider https://help.baidu.com/question?prod_id=99&class=0&id=3001
|
|
7402
|
-
/(baiduspider[-imagevdonwsfcpr]{0,7})\/?([\w\.]*)/i,
|
|
7403
|
-
// ClaudeBot (Anthropic)
|
|
7404
|
-
/(claude(?:bot|-searchbot|-web)|anthropic-ai)\/?([\w\.]*)/i,
|
|
7405
|
-
// Coc Coc Bot - https://help.coccoc.com/en/search-engine
|
|
7406
|
-
/(coccocbot-(?:image|web))\/([\w\.]+)/i,
|
|
7407
|
-
// Daum
|
|
7408
|
-
/(daum(?:oa)?(?:-image)?)[ \/]([\w\.]+)/i,
|
|
7409
|
-
// Facebook / Meta
|
|
7410
|
-
// https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
|
|
7411
|
-
/(facebook(?:externalhit|catalog)|meta-externalagent)\/([\w\.]+)/i,
|
|
7412
|
-
// Googlebot - http://www.google.com/bot.html
|
|
7413
|
-
/(google(?:bot|other|-inspectiontool)(?:-image|-video|-news)?|storebot-google)\/?([\w\.]*)/i,
|
|
7414
|
-
// Internet Archive (archive.org)
|
|
7415
|
-
/(ia_archiver|archive\.org_bot)\/?([\w\.]*)/i,
|
|
7416
|
-
// OnCrawl
|
|
7417
|
-
/(oncrawl) mobile\/([\w\.]+)/i,
|
|
7418
|
-
// Qwantbot - https://help.qwant.com/bot
|
|
7419
|
-
/(qwantbot(?:-news)?)[-\w]*\/?([\w\.]*)/i,
|
|
7420
|
-
// SemrushBot - http://www.semrush.com/bot.html
|
|
7421
|
-
/((?:semrush|splitsignal)bot[-abcfimostw]*)\/?([\w\.-]*)/i,
|
|
7422
|
-
// Sogou Spider
|
|
7423
|
-
/(sogou (?:pic|head|web|orion|news) spider)\/([\w\.]+)/i,
|
|
7424
|
-
// Yahoo! Japan - https://support.yahoo-net.jp/PccSearch/s/article/H000007955
|
|
7425
|
-
/(y!?j-(?:asr|br[uw]|dscv|mmp|vsidx|wsc))\/([\w\.]+)/i,
|
|
7426
|
-
// Yandex Bots - https://yandex.com/bots
|
|
7427
|
-
/(yandex(?:(?:mobile)?(?:accessibility|additional|com|renderresources|screenshot|sprav)?bot(?!.+mirror)|image(?:s|resizer)|adnet|blogs|favicons|market|media|metrika|news|ontodb(?:api)?|partner|rca|tracker|turbo|verti(?:cal)?s|webmaster|video(?:parser)?))\/([\w\.]+)/i,
|
|
7428
|
-
// Yeti (Naver)
|
|
7429
|
-
/(yeti)\/([\w\.]+)/i,
|
|
7430
|
-
// aiHitBot / Algolia Crawler / BLEXBot / Diffbot / FirecrawlAgent / HuggingFace-Bot / Linespider / MSNBot / Magpie-Crawler / Omgilibot / OpenAI Image Downloader / PanguBot / Replicate-Bot / RunPod-Bot / Webzio-Extended / Screaming Frog SEO Spider / Startpage / Timpibot / Together-Bot / VelenPublicWebCrawler / xAI-Bot / YisouSpider / YouBot / ZumBot
|
|
7431
|
-
// Cotoyogi - https://ds.rois.ac.jp/en_center8/en_crawler/
|
|
7432
|
-
// Freespoke - https://docs.freespoke.com/search/bot/
|
|
7433
|
-
/((?:aihit|blex|diff|huggingface-|msn|pangu|replicate-|runpod-|timpi|together-|xai-|you|zum)bot|(?:magpie-|velenpublicweb)crawler|(?:chatglm-|line|screaming frog seo |yisou)spider|cotoyogi|firecrawlagent|freespoke|omgili(?:bot)?|openai image downloader|startpageprivateimageproxy|twinagent|webzio-extended)\/?([\w\.]*)/i
|
|
7434
|
-
],
|
|
7435
|
-
[NAME2, VERSION4, [TYPE2, CRAWLER]],
|
|
7436
|
-
[
|
|
7437
|
-
// YandexBot MirrorDetector
|
|
7438
|
-
/(yandexbot\/([\w\.]+); mirrordetector)/i
|
|
7439
|
-
],
|
|
7440
|
-
[[NAME2, /\/.+;/ig, ""], VERSION4, [TYPE2, CRAWLER]],
|
|
7441
|
-
[
|
|
7442
|
-
// Google Bots
|
|
7443
|
-
/((?:adsbot|apis|mediapartners)-google(?:-mobile)?|google-?(?:other|cloudvertexbot|extended|safety))/i,
|
|
7444
|
-
// AI2Bot - https://allenai.org/crawler
|
|
7445
|
-
// DataForSeoBot - https://dataforseo.com/dataforseo-bot
|
|
7446
|
-
// Huawei AspiegelBot / PetalBot https://aspiegel.com/petalbot
|
|
7447
|
-
// ImagesiftBot - https://imagesift.com/about
|
|
7448
|
-
// Siteimprove - https://help.siteimprove.com/support/solutions/articles/80000448553
|
|
7449
|
-
// TurnitinBot - https://www.turnitin.com/robot/crawlerinfo.html
|
|
7450
|
-
// v0bot - https://vercel.com/docs/bot-management
|
|
7451
|
-
// Yahoo! Slurp - http://help.yahoo.com/help/us/ysearch/slurp
|
|
7452
|
-
// Botify / Bytespider / DeepSeekBot / Qihoo 360Spider / SeekportBot / TikTokSpider
|
|
7453
|
-
/\b((ai2|aspiegel|dataforseo|deepseek|imagesift|petal|seekport|turnitin|v0)bot|360spider-?(image|video)?|baidu-ads|botify|(byte|tiktok)spider|cohere-training-data-crawler|elastic(?=\/s)|marginalia|siteimprove(?=bot|\.com)|teoma|webzio|yahoo! slurp)/i
|
|
7454
|
-
],
|
|
7455
|
-
[NAME2, [TYPE2, CRAWLER]]
|
|
7456
|
-
]
|
|
7457
|
-
});
|
|
7458
|
-
var ExtraDevices = Object.freeze({
|
|
7459
|
-
device: [
|
|
7460
|
-
[
|
|
7461
|
-
/(nook)[\w ]+build\/(\w+)/i,
|
|
7462
|
-
// Nook
|
|
7463
|
-
/(dell) (strea[kpr\d ]*[\dko])/i,
|
|
7464
|
-
// Dell Streak
|
|
7465
|
-
/(le[- ]+pan)[- ]+(\w{1,9}) bui/i,
|
|
7466
|
-
// Le Pan Tablets
|
|
7467
|
-
/(trinity)[- ]*(t\d{3}) bui/i,
|
|
7468
|
-
// Trinity Tablets
|
|
7469
|
-
/(gigaset)[- ]+(q\w{1,9}) bui/i,
|
|
7470
|
-
// Gigaset Tablets
|
|
7471
|
-
/(vodafone) ([\w ]+)(?:\)| bui)/i
|
|
7472
|
-
// Vodafone
|
|
7473
|
-
],
|
|
7474
|
-
[VENDOR2, MODEL2, [TYPE2, TABLET2]],
|
|
7475
|
-
[
|
|
7476
|
-
/(u304aa)/i
|
|
7477
|
-
// AT&T
|
|
7478
|
-
],
|
|
7479
|
-
[MODEL2, [VENDOR2, "AT&T"], [TYPE2, MOBILE2]],
|
|
7480
|
-
[
|
|
7481
|
-
/\bsie-(\w*)/i
|
|
7482
|
-
// Siemens
|
|
7483
|
-
],
|
|
7484
|
-
[MODEL2, [VENDOR2, "Siemens"], [TYPE2, MOBILE2]],
|
|
7485
|
-
[
|
|
7486
|
-
/\b(rct\w+) b/i
|
|
7487
|
-
// RCA Tablets
|
|
7488
|
-
],
|
|
7489
|
-
[MODEL2, [VENDOR2, "RCA"], [TYPE2, TABLET2]],
|
|
7490
|
-
[
|
|
7491
|
-
/\b(venue[\d ]{2,7}) b/i
|
|
7492
|
-
// Dell Venue Tablets
|
|
7493
|
-
],
|
|
7494
|
-
[MODEL2, [VENDOR2, "Dell"], [TYPE2, TABLET2]],
|
|
7495
|
-
[
|
|
7496
|
-
/\b(q(?:mv|ta)\w+) b/i
|
|
7497
|
-
// Verizon Tablet
|
|
7498
|
-
],
|
|
7499
|
-
[MODEL2, [VENDOR2, "Verizon"], [TYPE2, TABLET2]],
|
|
7500
|
-
[
|
|
7501
|
-
/\b(?:barnes[& ]+noble |bn[rt])([\w\+ ]*) b/i
|
|
7502
|
-
// Barnes & Noble Tablet
|
|
7503
|
-
],
|
|
7504
|
-
[MODEL2, [VENDOR2, "Barnes & Noble"], [TYPE2, TABLET2]],
|
|
7505
|
-
[
|
|
7506
|
-
/\b(tm\d{3}\w+) b/i
|
|
7507
|
-
],
|
|
7508
|
-
[MODEL2, [VENDOR2, "NuVision"], [TYPE2, TABLET2]],
|
|
7509
|
-
[
|
|
7510
|
-
/\b(k88) b/i
|
|
7511
|
-
// ZTE K Series Tablet
|
|
7512
|
-
],
|
|
7513
|
-
[MODEL2, [VENDOR2, "ZTE"], [TYPE2, TABLET2]],
|
|
7514
|
-
[
|
|
7515
|
-
/\b(nx\d{3}j) b/i
|
|
7516
|
-
// ZTE Nubia
|
|
7517
|
-
],
|
|
7518
|
-
[MODEL2, [VENDOR2, "ZTE"], [TYPE2, MOBILE2]],
|
|
7519
|
-
[
|
|
7520
|
-
/\b(gen\d{3}) b.+49h/i
|
|
7521
|
-
// Swiss GEN Mobile
|
|
7522
|
-
],
|
|
7523
|
-
[MODEL2, [VENDOR2, "Swiss"], [TYPE2, MOBILE2]],
|
|
7524
|
-
[
|
|
7525
|
-
/\b(zur\d{3}) b/i
|
|
7526
|
-
// Swiss ZUR Tablet
|
|
7527
|
-
],
|
|
7528
|
-
[MODEL2, [VENDOR2, "Swiss"], [TYPE2, TABLET2]],
|
|
7529
|
-
[
|
|
7530
|
-
/^((zeki)?tb.*\b) b/i
|
|
7531
|
-
// Zeki Tablets
|
|
7532
|
-
],
|
|
7533
|
-
[MODEL2, [VENDOR2, "Zeki"], [TYPE2, TABLET2]],
|
|
7534
|
-
[
|
|
7535
|
-
/\b([yr]\d{2}) b/i,
|
|
7536
|
-
/\b(?:dragon[- ]+touch |dt)(\w{5}) b/i
|
|
7537
|
-
// Dragon Touch Tablet
|
|
7538
|
-
],
|
|
7539
|
-
[MODEL2, [VENDOR2, "Dragon Touch"], [TYPE2, TABLET2]],
|
|
7540
|
-
[
|
|
7541
|
-
/\b(ns-?\w{0,9}) b/i
|
|
7542
|
-
// Insignia Tablets
|
|
7543
|
-
],
|
|
7544
|
-
[MODEL2, [VENDOR2, "Insignia"], [TYPE2, TABLET2]],
|
|
7545
|
-
[
|
|
7546
|
-
/\b((nxa|next)-?\w{0,9}) b/i
|
|
7547
|
-
// NextBook Tablets
|
|
7548
|
-
],
|
|
7549
|
-
[MODEL2, [VENDOR2, "NextBook"], [TYPE2, TABLET2]],
|
|
7550
|
-
[
|
|
7551
|
-
/\b(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i
|
|
7552
|
-
// Voice Xtreme Phones
|
|
7553
|
-
],
|
|
7554
|
-
[[VENDOR2, "Voice"], MODEL2, [TYPE2, MOBILE2]],
|
|
7555
|
-
[
|
|
7556
|
-
/\b(lvtel\-)?(v1[12]) b/i
|
|
7557
|
-
// LvTel Phones
|
|
7558
|
-
],
|
|
7559
|
-
[[VENDOR2, "LvTel"], MODEL2, [TYPE2, MOBILE2]],
|
|
7560
|
-
[
|
|
7561
|
-
/\b(ph-1) /i
|
|
7562
|
-
// Essential PH-1
|
|
7563
|
-
],
|
|
7564
|
-
[MODEL2, [VENDOR2, "Essential"], [TYPE2, MOBILE2]],
|
|
7565
|
-
[
|
|
7566
|
-
/\b(v(100md|700na|7011|917g).*\b) b/i
|
|
7567
|
-
// Envizen Tablets
|
|
7568
|
-
],
|
|
7569
|
-
[MODEL2, [VENDOR2, "Envizen"], [TYPE2, TABLET2]],
|
|
7570
|
-
[
|
|
7571
|
-
/\b(trio[-\w\. ]+) b/i
|
|
7572
|
-
// MachSpeed Tablets
|
|
7573
|
-
],
|
|
7574
|
-
[MODEL2, [VENDOR2, "MachSpeed"], [TYPE2, TABLET2]],
|
|
7575
|
-
[
|
|
7576
|
-
/\btu_(1491) b/i
|
|
7577
|
-
// Rotor Tablets
|
|
7578
|
-
],
|
|
7579
|
-
[MODEL2, [VENDOR2, "Rotor"], [TYPE2, TABLET2]]
|
|
7580
|
-
]
|
|
7581
|
-
});
|
|
7582
|
-
var Emails = Object.freeze({
|
|
7583
|
-
browser: [
|
|
7584
|
-
[
|
|
7585
|
-
// Evolution / Kontact/KMail[2] / [Microsoft/Mac] Outlook / Thunderbird
|
|
7586
|
-
// Airmail / BlueMail / DaumMail / eMClient / Foxmail / NaverMailApp / Polymail
|
|
7587
|
-
// ProtonMail / SparkDesktop / Sparrow / Yahoo! Mail / Zimbra / ZohoMail-Desktop
|
|
7588
|
-
/((?:air|blue|daum|fox|poly|proton)mail|emclient|evolution|kmail2?|kontact|(?:microsoft |mac)?outlook(?:-express)?|navermailapp|(?!chrom.+)sparrow|sparkdesktop|thunderbird|yahoo|zohomail-desktop)(?:m.+ail; |[\/ ])([\w\.]+)/i,
|
|
7589
|
-
// Apple's Mail
|
|
7590
|
-
/(mail)\/([\w\.]+) cf/i
|
|
7591
|
-
],
|
|
7592
|
-
[NAME2, VERSION4, [TYPE2, EMAIL]],
|
|
7593
|
-
[
|
|
7594
|
-
// Zimbra
|
|
7595
|
-
/zdesktop\/([\w\.]+)/i
|
|
7596
|
-
],
|
|
7597
|
-
[VERSION4, [NAME2, "Zimbra"], [TYPE2, EMAIL]]
|
|
7598
|
-
]
|
|
7599
|
-
});
|
|
7600
|
-
var Fetchers = Object.freeze({
|
|
7601
|
-
browser: [
|
|
7602
|
-
[
|
|
7603
|
-
// Asana / Bitlybot / Better Uptime / BingPreview / Blueno / Cohere-AI / HubSpot Page Fetcher / kakaotalk-scrap / Mastodon / MicrosoftPreview / Pinterestbot / Redditbot / Rogerbot / SiteAuditBot / Telegrambot / Twitterbot / UptimeRobot
|
|
7604
|
-
// AhrefsSiteAudit - https://ahrefs.com/robot/site-audit
|
|
7605
|
-
// Buffer Link Preview Bot - https://scraper.buffer.com/about/bots/link-preview-bot
|
|
7606
|
-
// ChatGPT-User - https://platform.openai.com/docs/plugins/bot
|
|
7607
|
-
// DuckAssistBot - https://duckduckgo.com/duckassistbot/
|
|
7608
|
-
// Google Site Verifier / Meta / Yahoo! Japan
|
|
7609
|
-
// Iframely - https://iframely.com/docs/about
|
|
7610
|
-
// Perplexity-User - https://docs.perplexity.ai/guides/bots
|
|
7611
|
-
// MistralAI-User - https://docs.mistral.ai/robots/
|
|
7612
|
-
// Yandex Bots - https://yandex.com/bots
|
|
7613
|
-
/(asana|ahrefssiteaudit|(?:bing|microsoft)preview|blueno|(?:chatgpt|claude|mistralai|perplexity)-user|cohere-ai|hubspot page fetcher|mastodon|(?:bitly|bufferlinkpreview|discord|duckassist|linkedin|pinterest|reddit|roger|siteaudit|twitter|uptimero|zoom)bot|google-site-verification|iframely|kakaotalk-scrap|meta-externalfetcher|y!?j-dlc|yandex(?:calendar|direct(?:dyn)?|fordomain|pagechecker|searchshop)|yadirectfetcher)\/([\w\.]+)/i,
|
|
7614
|
-
// Bluesky
|
|
7615
|
-
/(bluesky) cardyb\/([\w\.]+)/i,
|
|
7616
|
-
// Skype
|
|
7617
|
-
/(skypeuripreview) preview\/([\w\.]+)/i,
|
|
7618
|
-
// Slackbot - https://api.slack.com/robots
|
|
7619
|
-
/(slack(?:bot)?(?:-imgproxy|-linkexpanding)?) ([\w\.]+)/i,
|
|
7620
|
-
// WhatsApp
|
|
7621
|
-
/(whatsapp)\/([\w\.]+)/i
|
|
7622
|
-
],
|
|
7623
|
-
[NAME2, VERSION4, [TYPE2, FETCHER]],
|
|
7624
|
-
[
|
|
7625
|
-
// Google Bots / Chrome-Lighthouse / Gemini-Deep-Research / KeybaseBot / Snapchat / Vercelbot / Yandex Bots
|
|
7626
|
-
/((?:better uptime |keybase|telegram|vercel)bot|chrome-lighthouse|feedfetcher-google|gemini-deep-research|google(?:imageproxy|-read-aloud|-pagerenderer|producer)|snap url preview|vercel(flags|tracing|-(favicon|screenshot)-bot)|yandex(?:sitelinks|userproxy))/i
|
|
7627
|
-
],
|
|
7628
|
-
[NAME2, [TYPE2, FETCHER]]
|
|
7629
|
-
],
|
|
7630
|
-
os: [
|
|
7631
|
-
[/whatsapp\/[\d\.]+ (a|i)/i],
|
|
7632
|
-
[[NAME2, (os) => os == "A" ? "Android" : "iOS"]]
|
|
7633
|
-
]
|
|
7634
|
-
});
|
|
7635
|
-
var InApps = Object.freeze({
|
|
7636
|
-
browser: [
|
|
7637
|
-
[
|
|
7638
|
-
// Discord/Figma/Flipboard/Mattermost/Notion/Postman/Rambox/Rocket.Chat/Slack/Teams
|
|
7639
|
-
/\b(discord|figma|mattermost|notion|postman|rambox|rocket.chat|slack|teams)\/([\w\.]+).+(electron\/|; ios)/i,
|
|
7640
|
-
/(flipboard)\/([\w\.]+)/i
|
|
7641
|
-
],
|
|
7642
|
-
[NAME2, VERSION4, [TYPE2, INAPP2]],
|
|
7643
|
-
[
|
|
7644
|
-
// Evernote/Teams on mobile
|
|
7645
|
-
/(evernote) win/i,
|
|
7646
|
-
/(teams)mobile-(ios|and)/i
|
|
7647
|
-
],
|
|
7648
|
-
[NAME2, [TYPE2, INAPP2]],
|
|
7649
|
-
[
|
|
7650
|
-
// Slack
|
|
7651
|
-
/chatlyio\/([\d\.]+)/i
|
|
7652
|
-
],
|
|
7653
|
-
[VERSION4, [NAME2, "Slack"], [TYPE2, INAPP2]],
|
|
7654
|
-
[
|
|
7655
|
-
// TikTok Lite
|
|
7656
|
-
/ultralite app_version\/([\w\.]+)/i
|
|
7657
|
-
],
|
|
7658
|
-
[VERSION4, [NAME2, "TikTok Lite"], [TYPE2, INAPP2]],
|
|
7659
|
-
[
|
|
7660
|
-
// VS Code
|
|
7661
|
-
/\) code\/([\d\.]+).+electron\//i
|
|
7662
|
-
],
|
|
7663
|
-
[VERSION4, [NAME2, "VS Code"], [TYPE2, INAPP2]],
|
|
7664
|
-
[
|
|
7665
|
-
// Yahoo! Japan
|
|
7666
|
-
/jp\.co\.yahoo\.(?:android\.yjtop|ipn\.appli)\/([\d\.]+)/i
|
|
7667
|
-
],
|
|
7668
|
-
[VERSION4, [NAME2, "Yahoo! Japan"], [TYPE2, INAPP2]]
|
|
7669
|
-
]
|
|
7670
|
-
});
|
|
7671
|
-
var MediaPlayers = Object.freeze({
|
|
7672
|
-
browser: [
|
|
7673
|
-
[
|
|
7674
|
-
/(apple(?:coremedia|tv))\/([\w\._]+)/i,
|
|
7675
|
-
// Generic Apple CoreMedia
|
|
7676
|
-
/(coremedia) v([\w\._]+)/i,
|
|
7677
|
-
// Ares/Nexplayer/OSSProxy
|
|
7678
|
-
/(ares|clementine|music player daemon|nexplayer|ossproxy) ([\w\.-]+)/i,
|
|
7679
|
-
// Aqualung/Lyssna/BSPlayer/Clementine/MPD
|
|
7680
|
-
// Audacious/AudiMusicStream/Amarok/BASS/OpenCORE/GnomeMplayer/MoC
|
|
7681
|
-
// NSPlayer/PSP-InternetRadioPlayer/Videos
|
|
7682
|
-
// Nero Home/Nero Scout/Nokia
|
|
7683
|
-
// QuickTime/RealMedia/RadioApp/RadioClientApplication/
|
|
7684
|
-
// SoundTap/Totem/Stagefright/Streamium
|
|
7685
|
-
// XBMC/gvfs/Xine/XMMS/irapp
|
|
7686
|
-
/^(aqualung|audacious|audimusicstream|amarok|bass|bsplayer|core|gnomemplayer|gvfs|irapp|lyssna|music on console|nero (?:home|scout)|nokia\d+|nsplayer|psp-internetradioplayer|quicktime|rma|radioapp|radioclientapplication|soundtap|stagefright|streamium|totem|videos|xbmc|xine|xmms)\/([\w\.-]+)/i,
|
|
7687
|
-
/(lg player|nexplayer) ([\d\.]+)/i,
|
|
7688
|
-
/player\/(nexplayer|lg player) ([\w\.-]+)/i,
|
|
7689
|
-
// NexPlayer/LG Player
|
|
7690
|
-
/(gstreamer) souphttpsrc.+libsoup\/([\w\.-]+)/i,
|
|
7691
|
-
// Gstreamer
|
|
7692
|
-
/(htc streaming player) [\w_]+ \/ ([\d\.]+)/i,
|
|
7693
|
-
// HTC Streaming Player
|
|
7694
|
-
/(lavf)([\d\.]+)/i,
|
|
7695
|
-
// Lavf (FFMPEG)
|
|
7696
|
-
// MPlayer SVN
|
|
7697
|
-
/(mplayer)(?: |\/)(?:(?:sherpya-){0,1}svn)(?:-| )(r\d+(?:-\d+[\w\.-]+))/i,
|
|
7698
|
-
/ (songbird)\/([\w\.-]+)/i,
|
|
7699
|
-
// Songbird/Philips-Songbird
|
|
7700
|
-
/(winamp)(?:3 version|mpeg| ) ([\w\.-]+)/i,
|
|
7701
|
-
// Winamp
|
|
7702
|
-
/(vlc)(?:\/| media player - version )([\w\.-]+)/i,
|
|
7703
|
-
// VLC Videolan
|
|
7704
|
-
/^(foobar2000|itunes|smp)\/([\d\.]+)/i,
|
|
7705
|
-
// Foobar2000/iTunes/SMP
|
|
7706
|
-
/com\.(riseupradioalarm)\/([\d\.]*)/i,
|
|
7707
|
-
// RiseUP Radio Alarm
|
|
7708
|
-
/(mplayer)(?:\s|\/| unknown-)([\w\.\-]+)/i,
|
|
7709
|
-
// MPlayer
|
|
7710
|
-
// Windows Media Server
|
|
7711
|
-
/(windows)\/([\w\.-]+) upnp\/[\d\.]+ dlnadoc\/[\d\.]+ home media server/i
|
|
7712
|
-
],
|
|
7713
|
-
[NAME2, VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
7714
|
-
[
|
|
7715
|
-
/(flrp)\/([\w\.-]+)/i
|
|
7716
|
-
// Flip Player
|
|
7717
|
-
],
|
|
7718
|
-
[[NAME2, "Flip Player"], VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
7719
|
-
[
|
|
7720
|
-
// FStream/NativeHost/QuerySeekSpider
|
|
7721
|
-
// MPlayer (no other info)/Media Player Classic/Nero ShowTime
|
|
7722
|
-
// OCMS-bot/tap in radio/tunein/unknown/winamp (no other info)
|
|
7723
|
-
// inlight radio / YourMuze
|
|
7724
|
-
/(fstream|media player classic|inlight radio|mplayer|nativehost|nero showtime|ocms-bot|queryseekspider|tapinradio|tunein radio|winamp|yourmuze)/i
|
|
7725
|
-
],
|
|
7726
|
-
[NAME2, [TYPE2, MEDIAPLAYER]],
|
|
7727
|
-
[
|
|
7728
|
-
/(htc_one_s|windows-media-player|wmplayer)\/([\w\.-]+)/i
|
|
7729
|
-
// HTC One S / Windows Media Player
|
|
7730
|
-
],
|
|
7731
|
-
[[NAME2, /[_-]/g, " "], VERSION4, [TYPE2, MEDIAPLAYER]],
|
|
7732
|
-
[
|
|
7733
|
-
/(rad.io|radio.(?:de|at|fr)) ([\d\.]+)/i
|
|
7734
|
-
// Rad.io
|
|
7735
|
-
],
|
|
7736
|
-
[[NAME2, "rad.io"], VERSION4, [TYPE2, MEDIAPLAYER]]
|
|
7737
|
-
]
|
|
7738
|
-
});
|
|
7739
|
-
var Libraries = Object.freeze({
|
|
7740
|
-
browser: [
|
|
7741
|
-
// Apache-HttpClient/Axios/go-http-client/got/GuzzleHttp/Java[-HttpClient]/jsdom/libwww-perl/lua-resty-http/Needle/node-fetch/OkHttp/PHP-SOAP/PostmanRuntime/python-urllib/python-requests/Scrapy/superagent
|
|
7742
|
-
[
|
|
7743
|
-
/^(apache-httpclient|axios|(?:go|java)-http-client|got|guzzlehttp|java|libwww-perl|lua-resty-http|needle|node-(?:fetch|superagent)|okhttp|php-soap|postmanruntime|python-(?:httpx|urllib[23]?|requests)|scrapy)\/([\w\.]+)/i,
|
|
7744
|
-
/(adobeair|aiohttp|jsdom)\/([\w\.]+)/i,
|
|
7745
|
-
/(nutch)-([\w\.-]+)(\(|$)/i,
|
|
7746
|
-
/\((java)\/([\w\.]+)/i
|
|
7747
|
-
],
|
|
7748
|
-
[NAME2, VERSION4, [TYPE2, LIBRARY]]
|
|
7749
|
-
]
|
|
7750
|
-
});
|
|
7751
|
-
var Vehicles = Object.freeze({
|
|
7752
|
-
device: [
|
|
7753
|
-
[/aftlbt962e2/i],
|
|
7754
|
-
// BMW
|
|
7755
|
-
[[VENDOR2, "BMW"]],
|
|
7756
|
-
[/dilink.+(byd) auto/i],
|
|
7757
|
-
// BYD
|
|
7758
|
-
[VENDOR2],
|
|
7759
|
-
[/aftlft962x3/i],
|
|
7760
|
-
// Jeep
|
|
7761
|
-
[[VENDOR2, "Jeep"], [MODEL2, "Wagooner"]],
|
|
7762
|
-
[/(rivian) (r1t)/i],
|
|
7763
|
-
// Rivian
|
|
7764
|
-
[VENDOR2, MODEL2],
|
|
7765
|
-
[/vcc.+netfront/i],
|
|
7766
|
-
// Volvo
|
|
7767
|
-
[[VENDOR2, "Volvo"]]
|
|
7768
|
-
]
|
|
7769
|
-
});
|
|
7770
|
-
var Bots = Object.freeze({
|
|
7771
|
-
browser: [
|
|
7772
|
-
...CLIs.browser,
|
|
7773
|
-
...Fetchers.browser,
|
|
7774
|
-
...Crawlers.browser,
|
|
7775
|
-
...Libraries.browser
|
|
7776
|
-
],
|
|
7777
|
-
os: [
|
|
7778
|
-
...Fetchers.os
|
|
7779
|
-
]
|
|
7780
|
-
});
|
|
7781
|
-
|
|
7782
|
-
// ../../node_modules/.pnpm/detect-europe-js@0.1.2/node_modules/detect-europe-js/dist/esm/index.js
|
|
7783
|
-
var TIMEZONE = {
|
|
7784
|
-
ANDORRA: {
|
|
7785
|
-
ANDORRA: "Europe/Andorra"
|
|
7786
|
-
},
|
|
7787
|
-
AUSTRIA: {
|
|
7788
|
-
VIENNA: "Europe/Vienna"
|
|
7789
|
-
},
|
|
7790
|
-
BELGIUM: {
|
|
7791
|
-
BRUSSELS: "Europe/Brussels"
|
|
7792
|
-
},
|
|
7793
|
-
BULGARIA: {
|
|
7794
|
-
SOFIA: "Europe/Sofia"
|
|
7795
|
-
},
|
|
7796
|
-
CROATIA: {
|
|
7797
|
-
ZAGREB: "Europe/Zagreb"
|
|
7798
|
-
},
|
|
7799
|
-
CYPRUS: {
|
|
7800
|
-
NICOSIA_EUROPE: "Europe/Nicosia",
|
|
7801
|
-
NICOSIA_ASIA: "Asia/Nicosia",
|
|
7802
|
-
FAMAGUSTA: "Asia/Famagusta"
|
|
7803
|
-
},
|
|
7804
|
-
CZECHIA: {
|
|
7805
|
-
PRAGUE: "Europe/Prague"
|
|
7806
|
-
},
|
|
7807
|
-
DENMARK: {
|
|
7808
|
-
COPENHAGEN: "Europe/Copenhagen",
|
|
7809
|
-
FAROE: "Atlantic/Faroe"
|
|
7810
|
-
},
|
|
7811
|
-
ESTONIA: {
|
|
7812
|
-
TALLINN: "Europe/Tallinn"
|
|
7813
|
-
},
|
|
7814
|
-
FINLAND: {
|
|
7815
|
-
HELSINKI: "Europe/Helsinki",
|
|
7816
|
-
MARIEHAMN: "Europe/Mariehamn"
|
|
7817
|
-
},
|
|
7818
|
-
FRANCE: {
|
|
7819
|
-
PARIS: "Europe/Paris",
|
|
7820
|
-
CAYENNE: "America/Cayenne",
|
|
7821
|
-
GUADELOUPE: "America/Guadeloupe",
|
|
7822
|
-
MARIGOT: "America/Marigot",
|
|
7823
|
-
MARTINIQUE: "America/Martinique",
|
|
7824
|
-
MAYOTTE: "Indian/Mayotte",
|
|
7825
|
-
REUNION: "Indian/Reunion"
|
|
7826
|
-
},
|
|
7827
|
-
GERMANY: {
|
|
7828
|
-
BERLIN: "Europe/Berlin",
|
|
7829
|
-
BUSINGEN: "Europe/Busingen"
|
|
7830
|
-
},
|
|
7831
|
-
GREECE: {
|
|
7832
|
-
ATHENS: "Europe/Athens"
|
|
7833
|
-
},
|
|
7834
|
-
HUNGARY: {
|
|
7835
|
-
BUDAPEST: "Europe/Budapest"
|
|
7836
|
-
},
|
|
7837
|
-
ICELAND: {
|
|
7838
|
-
REYKJAVIK: "Atlantic/Reykjavik"
|
|
7839
|
-
},
|
|
7840
|
-
IRELAND: {
|
|
7841
|
-
DUBLIN: "Europe/Dublin"
|
|
7842
|
-
},
|
|
7843
|
-
ITALY: {
|
|
7844
|
-
ROME: "Europe/Rome"
|
|
7845
|
-
},
|
|
7846
|
-
LATVIA: {
|
|
7847
|
-
RIGA: "Europe/Riga"
|
|
7848
|
-
},
|
|
7849
|
-
LIECHTENSTEIN: {
|
|
7850
|
-
VADUZ: "Europe/Vaduz"
|
|
7851
|
-
},
|
|
7852
|
-
LITHUANIA: {
|
|
7853
|
-
VILNIUS: "Europe/Vilnius"
|
|
7854
|
-
},
|
|
7855
|
-
LUXEMBOURG: {
|
|
7856
|
-
LUXEMBOURG: "Europe/Luxembourg"
|
|
7857
|
-
},
|
|
7858
|
-
MALTA: {
|
|
7859
|
-
MALTA: "Europe/Malta"
|
|
7860
|
-
},
|
|
7861
|
-
MONACO: {
|
|
7862
|
-
MONACO: "Europe/Monaco"
|
|
7863
|
-
},
|
|
7864
|
-
NETHERLANDS: {
|
|
7865
|
-
AMSTERDAM: "Europe/Amsterdam",
|
|
7866
|
-
ARUBA: "America/Aruba",
|
|
7867
|
-
CURACAO: "America/Curacao",
|
|
7868
|
-
KRALENDIJK: "America/Kralendijk",
|
|
7869
|
-
LOWER_PRINCES: "America/Lower_Princes"
|
|
7870
|
-
},
|
|
7871
|
-
NORWAY: {
|
|
7872
|
-
OSLO: "Europe/Oslo",
|
|
7873
|
-
JAN_MAYEN: "Atlantic/Jan_Mayen",
|
|
7874
|
-
LONGYEARBYEN: "Arctic/Longyearbyen"
|
|
7875
|
-
},
|
|
7876
|
-
POLAND: {
|
|
7877
|
-
WARSAW: "Europe/Warsaw"
|
|
7878
|
-
},
|
|
7879
|
-
PORTUGAL: {
|
|
7880
|
-
LISBON: "Europe/Lisbon",
|
|
7881
|
-
AZORES: "Atlantic/Azores",
|
|
7882
|
-
MADEIRA: "Atlantic/Madeira"
|
|
7883
|
-
},
|
|
7884
|
-
ROMANIA: {
|
|
7885
|
-
BUCHAREST: "Europe/Bucharest"
|
|
7886
|
-
},
|
|
7887
|
-
SAN_MARINO: {
|
|
7888
|
-
SAN_MARINO: "Europe/San_Marino"
|
|
7889
|
-
},
|
|
7890
|
-
SLOVAKIA: {
|
|
7891
|
-
BRATISLAVA: "Europe/Bratislava"
|
|
7892
|
-
},
|
|
7893
|
-
SLOVENIA: {
|
|
7894
|
-
LJUBLJANA: "Europe/Ljubljana"
|
|
7895
|
-
},
|
|
7896
|
-
SPAIN: {
|
|
7897
|
-
MADRID: "Europe/Madrid",
|
|
7898
|
-
CANARY: "Atlantic/Canary",
|
|
7899
|
-
CEUTA: "Africa/Ceuta"
|
|
7900
|
-
},
|
|
7901
|
-
SWEDEN: {
|
|
7902
|
-
STOCKHOLM: "Europe/Stockholm"
|
|
7903
|
-
},
|
|
7904
|
-
SWITZERLAND: {
|
|
7905
|
-
ZURICH: "Europe/Zurich"
|
|
7906
|
-
},
|
|
7907
|
-
VATICAN: {
|
|
7908
|
-
VATICAN: "Europe/Vatican"
|
|
7909
|
-
}
|
|
7910
|
-
};
|
|
7911
|
-
var EU_TIMEZONE = [
|
|
7912
|
-
TIMEZONE.AUSTRIA.VIENNA,
|
|
7913
|
-
TIMEZONE.BELGIUM.BRUSSELS,
|
|
7914
|
-
TIMEZONE.BULGARIA.SOFIA,
|
|
7915
|
-
TIMEZONE.CROATIA.ZAGREB,
|
|
7916
|
-
TIMEZONE.CYPRUS.NICOSIA_EUROPE,
|
|
7917
|
-
TIMEZONE.CYPRUS.NICOSIA_ASIA,
|
|
7918
|
-
TIMEZONE.CYPRUS.FAMAGUSTA,
|
|
7919
|
-
TIMEZONE.CZECHIA.PRAGUE,
|
|
7920
|
-
TIMEZONE.DENMARK.COPENHAGEN,
|
|
7921
|
-
TIMEZONE.ESTONIA.TALLINN,
|
|
7922
|
-
TIMEZONE.FINLAND.HELSINKI,
|
|
7923
|
-
TIMEZONE.FINLAND.MARIEHAMN,
|
|
7924
|
-
TIMEZONE.FRANCE.PARIS,
|
|
7925
|
-
TIMEZONE.GERMANY.BERLIN,
|
|
7926
|
-
TIMEZONE.GREECE.ATHENS,
|
|
7927
|
-
TIMEZONE.HUNGARY.BUDAPEST,
|
|
7928
|
-
TIMEZONE.IRELAND.DUBLIN,
|
|
7929
|
-
TIMEZONE.ITALY.ROME,
|
|
7930
|
-
TIMEZONE.LATVIA.RIGA,
|
|
7931
|
-
TIMEZONE.LITHUANIA.VILNIUS,
|
|
7932
|
-
TIMEZONE.LUXEMBOURG.LUXEMBOURG,
|
|
7933
|
-
TIMEZONE.MALTA.MALTA,
|
|
7934
|
-
TIMEZONE.NETHERLANDS.AMSTERDAM,
|
|
7935
|
-
TIMEZONE.POLAND.WARSAW,
|
|
7936
|
-
TIMEZONE.PORTUGAL.LISBON,
|
|
7937
|
-
TIMEZONE.ROMANIA.BUCHAREST,
|
|
7938
|
-
TIMEZONE.SLOVAKIA.BRATISLAVA,
|
|
7939
|
-
TIMEZONE.SLOVENIA.LJUBLJANA,
|
|
7940
|
-
TIMEZONE.SPAIN.MADRID,
|
|
7941
|
-
TIMEZONE.SWEDEN.STOCKHOLM,
|
|
7942
|
-
TIMEZONE.FRANCE.CAYENNE,
|
|
7943
|
-
TIMEZONE.FRANCE.GUADELOUPE,
|
|
7944
|
-
TIMEZONE.FRANCE.MARIGOT,
|
|
7945
|
-
TIMEZONE.FRANCE.MARTINIQUE,
|
|
7946
|
-
TIMEZONE.FRANCE.MAYOTTE,
|
|
7947
|
-
TIMEZONE.FRANCE.REUNION,
|
|
7948
|
-
TIMEZONE.PORTUGAL.AZORES,
|
|
7949
|
-
TIMEZONE.PORTUGAL.MADEIRA,
|
|
7950
|
-
TIMEZONE.SPAIN.CANARY
|
|
7951
|
-
];
|
|
7952
|
-
var EEA_EFTA_TIMEZONE = [
|
|
7953
|
-
TIMEZONE.ICELAND.REYKJAVIK,
|
|
7954
|
-
TIMEZONE.LIECHTENSTEIN.VADUZ,
|
|
7955
|
-
TIMEZONE.NORWAY.OSLO,
|
|
7956
|
-
TIMEZONE.NORWAY.JAN_MAYEN
|
|
7957
|
-
];
|
|
7958
|
-
var EEA_TIMEZONE = [
|
|
7959
|
-
...EU_TIMEZONE,
|
|
7960
|
-
...EEA_EFTA_TIMEZONE
|
|
7961
|
-
];
|
|
7962
|
-
var EFTA_TIMEZONE = [
|
|
7963
|
-
TIMEZONE.SWITZERLAND.ZURICH,
|
|
7964
|
-
...EEA_EFTA_TIMEZONE
|
|
7965
|
-
];
|
|
7966
|
-
var SCHENGEN_TIMEZONE = [
|
|
7967
|
-
TIMEZONE.AUSTRIA.VIENNA,
|
|
7968
|
-
TIMEZONE.BELGIUM.BRUSSELS,
|
|
7969
|
-
TIMEZONE.BULGARIA.SOFIA,
|
|
7970
|
-
TIMEZONE.CROATIA.ZAGREB,
|
|
7971
|
-
TIMEZONE.CZECHIA.PRAGUE,
|
|
7972
|
-
TIMEZONE.DENMARK.COPENHAGEN,
|
|
7973
|
-
TIMEZONE.ESTONIA.TALLINN,
|
|
7974
|
-
TIMEZONE.FINLAND.HELSINKI,
|
|
7975
|
-
TIMEZONE.FINLAND.MARIEHAMN,
|
|
7976
|
-
TIMEZONE.FRANCE.PARIS,
|
|
7977
|
-
TIMEZONE.GERMANY.BERLIN,
|
|
7978
|
-
TIMEZONE.GREECE.ATHENS,
|
|
7979
|
-
TIMEZONE.HUNGARY.BUDAPEST,
|
|
7980
|
-
TIMEZONE.ITALY.ROME,
|
|
7981
|
-
TIMEZONE.LATVIA.RIGA,
|
|
7982
|
-
TIMEZONE.LITHUANIA.VILNIUS,
|
|
7983
|
-
TIMEZONE.LUXEMBOURG.LUXEMBOURG,
|
|
7984
|
-
TIMEZONE.MALTA.MALTA,
|
|
7985
|
-
TIMEZONE.NETHERLANDS.AMSTERDAM,
|
|
7986
|
-
TIMEZONE.POLAND.WARSAW,
|
|
7987
|
-
TIMEZONE.PORTUGAL.LISBON,
|
|
7988
|
-
TIMEZONE.PORTUGAL.AZORES,
|
|
7989
|
-
TIMEZONE.PORTUGAL.MADEIRA,
|
|
7990
|
-
TIMEZONE.ROMANIA.BUCHAREST,
|
|
7991
|
-
TIMEZONE.SLOVAKIA.BRATISLAVA,
|
|
7992
|
-
TIMEZONE.SLOVENIA.LJUBLJANA,
|
|
7993
|
-
TIMEZONE.SPAIN.MADRID,
|
|
7994
|
-
TIMEZONE.SPAIN.CANARY,
|
|
7995
|
-
TIMEZONE.SWEDEN.STOCKHOLM,
|
|
7996
|
-
TIMEZONE.ANDORRA.ANDORRA,
|
|
7997
|
-
TIMEZONE.GERMANY.BUSINGEN,
|
|
7998
|
-
TIMEZONE.ICELAND.REYKJAVIK,
|
|
7999
|
-
TIMEZONE.LIECHTENSTEIN.VADUZ,
|
|
8000
|
-
TIMEZONE.MONACO.MONACO,
|
|
8001
|
-
TIMEZONE.NORWAY.OSLO,
|
|
8002
|
-
TIMEZONE.SAN_MARINO.SAN_MARINO,
|
|
8003
|
-
TIMEZONE.SPAIN.CEUTA,
|
|
8004
|
-
TIMEZONE.SWITZERLAND.ZURICH,
|
|
8005
|
-
TIMEZONE.VATICAN.VATICAN
|
|
8006
|
-
];
|
|
8007
|
-
|
|
8008
|
-
// ../../node_modules/.pnpm/is-standalone-pwa@0.1.1/node_modules/is-standalone-pwa/dist/esm/index.js
|
|
8009
|
-
function isStandalonePWA() {
|
|
8010
|
-
var _a;
|
|
8011
|
-
return typeof window !== "undefined" && ((window === null || window === void 0 ? void 0 : window.matchMedia("(display-mode: standalone)").matches) || ((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone) || document.referrer.startsWith("android-app://") || (window === null || window === void 0 ? void 0 : window.Windows) || /trident.+(msapphost|webview)\//i.test(navigator.userAgent) || document.referrer.startsWith("app-info://platform/microsoft-store"));
|
|
8012
|
-
}
|
|
8013
|
-
|
|
8014
|
-
// ../../node_modules/.pnpm/@ua-parser-js+pro-enterprise@2.0.6/node_modules/@ua-parser-js/pro-enterprise/src/helpers/ua-parser-helpers.mjs
|
|
8015
|
-
var { Crawler } = Extension.BrowserName;
|
|
8016
|
-
var toResult = (value, head, ext) => typeof value === "string" ? UAParser(value, head, ext) : value;
|
|
8017
|
-
var isAppleSilicon = (resultOrUA) => {
|
|
8018
|
-
const res = toResult(resultOrUA);
|
|
8019
|
-
if (res.os.is(OSName.MACOS)) {
|
|
8020
|
-
if (res.cpu.is(CPUArch.ARM)) {
|
|
8021
|
-
return true;
|
|
8022
|
-
}
|
|
8023
|
-
if (typeof resultOrUA !== "string" && typeof window !== "undefined") {
|
|
8024
|
-
try {
|
|
8025
|
-
const canvas = document.createElement("canvas");
|
|
8026
|
-
const webgl = canvas.getContext("webgl2") || canvas.getContext("webgl") || canvas.getContext("experimental-webgl");
|
|
8027
|
-
const debug = webgl.getExtension("WEBGL_debug_renderer_info");
|
|
8028
|
-
const renderer = webgl.getParameter(debug.UNMASKED_RENDERER_WEBGL);
|
|
8029
|
-
if (renderer.match(/apple m\d/i)) {
|
|
8030
|
-
return true;
|
|
8031
|
-
}
|
|
8032
|
-
} catch (e) {
|
|
8033
|
-
return false;
|
|
8034
|
-
}
|
|
8035
|
-
}
|
|
8036
|
-
}
|
|
8037
|
-
return false;
|
|
8038
|
-
};
|
|
8039
|
-
var isBot = (resultOrUA) => [
|
|
8040
|
-
BrowserType.CLI,
|
|
8041
|
-
BrowserType.CRAWLER,
|
|
8042
|
-
BrowserType.FETCHER,
|
|
8043
|
-
BrowserType.LIBRARY
|
|
8044
|
-
].includes(toResult(resultOrUA, Bots).browser.type);
|
|
8045
|
-
var isChromeFamily = (resultOrUA) => toResult(resultOrUA).engine.is(EngineName.BLINK);
|
|
8046
|
-
|
|
8047
4523
|
// src/v2/core/utils/deviceInfo.ts
|
|
8048
4524
|
function getScreenResolution() {
|
|
8049
|
-
return {
|
|
8050
|
-
width: window.screen.width,
|
|
8051
|
-
height: window.screen.height
|
|
8052
|
-
};
|
|
4525
|
+
return { width: window.screen.width, height: window.screen.height };
|
|
8053
4526
|
}
|
|
8054
4527
|
function getTimeZone() {
|
|
8055
4528
|
try {
|
|
8056
4529
|
return Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
8057
|
-
} catch (
|
|
8058
|
-
console.error("Failed to get timezone:", error);
|
|
4530
|
+
} catch (e) {
|
|
8059
4531
|
return "UTC";
|
|
8060
4532
|
}
|
|
8061
4533
|
}
|
|
8062
4534
|
function getBrowserLocale() {
|
|
8063
4535
|
try {
|
|
8064
4536
|
return navigator.language || "en-US";
|
|
8065
|
-
} catch (
|
|
8066
|
-
console.error("Failed to get browser locale:", error);
|
|
4537
|
+
} catch (e) {
|
|
8067
4538
|
return "en-US";
|
|
8068
4539
|
}
|
|
8069
4540
|
}
|
|
4541
|
+
var UA = typeof navigator !== "undefined" ? navigator.userAgent : "";
|
|
4542
|
+
function match(ua, ...patterns) {
|
|
4543
|
+
for (const p of patterns) {
|
|
4544
|
+
const m = ua.match(p);
|
|
4545
|
+
if (m) return m;
|
|
4546
|
+
}
|
|
4547
|
+
return null;
|
|
4548
|
+
}
|
|
4549
|
+
function parseBrowser(ua) {
|
|
4550
|
+
const tests = [
|
|
4551
|
+
[/EdgA?\/([\d.]+)/i, "Edge"],
|
|
4552
|
+
[/OPR\/([\d.]+)/i, "Opera"],
|
|
4553
|
+
[/Brave\/([\d.]+)/i, "Brave"],
|
|
4554
|
+
[/Vivaldi\/([\d.]+)/i, "Vivaldi"],
|
|
4555
|
+
[/SamsungBrowser\/([\d.]+)/i, "Samsung Internet"],
|
|
4556
|
+
[/UCBrowser\/([\d.]+)/i, "UC Browser"],
|
|
4557
|
+
[/Firefox\/([\d.]+)/i, "Firefox"],
|
|
4558
|
+
[/CriOS\/([\d.]+)/i, "Chrome"],
|
|
4559
|
+
// Chrome on iOS
|
|
4560
|
+
[/FxiOS\/([\d.]+)/i, "Firefox"],
|
|
4561
|
+
// Firefox on iOS
|
|
4562
|
+
[/Chrome\/([\d.]+)/i, "Chrome"],
|
|
4563
|
+
[/Version\/([\d.]+).*Safari/i, "Safari"],
|
|
4564
|
+
[/Safari\/([\d.]+)/i, "Safari"]
|
|
4565
|
+
];
|
|
4566
|
+
for (const [re, name] of tests) {
|
|
4567
|
+
const m = ua.match(re);
|
|
4568
|
+
if (m) {
|
|
4569
|
+
const version = m[1] || "";
|
|
4570
|
+
return { name, version, major: version.split(".")[0] || "" };
|
|
4571
|
+
}
|
|
4572
|
+
}
|
|
4573
|
+
return { name: "", version: "", major: "" };
|
|
4574
|
+
}
|
|
4575
|
+
function parseOS(ua) {
|
|
4576
|
+
const m = match(ua, /Windows NT ([\d.]+)/i) || match(ua, /Mac OS X ([\d_.]+)/i) || match(ua, /Android ([\d.]+)/i) || match(ua, /iPhone OS ([\d_]+)/i) || match(ua, /iPad.*OS ([\d_]+)/i) || match(ua, /CrOS[\w ]*\/([\d.]+)/i) || match(ua, /Linux/i);
|
|
4577
|
+
if (!m) return { name: "", version: "" };
|
|
4578
|
+
const raw = m[0];
|
|
4579
|
+
const version = (m[1] || "").replace(/_/g, ".");
|
|
4580
|
+
if (/Windows/i.test(raw)) {
|
|
4581
|
+
const ntMap = {
|
|
4582
|
+
"10.0": "10",
|
|
4583
|
+
"6.3": "8.1",
|
|
4584
|
+
"6.2": "8",
|
|
4585
|
+
"6.1": "7",
|
|
4586
|
+
"6.0": "Vista",
|
|
4587
|
+
"5.1": "XP"
|
|
4588
|
+
};
|
|
4589
|
+
return { name: "Windows", version: ntMap[version] || version };
|
|
4590
|
+
}
|
|
4591
|
+
if (/Mac OS X/i.test(raw)) return { name: "macOS", version };
|
|
4592
|
+
if (/Android/i.test(raw)) return { name: "Android", version };
|
|
4593
|
+
if (/iPhone|iPad/i.test(raw)) return { name: "iOS", version };
|
|
4594
|
+
if (/CrOS/i.test(raw)) return { name: "Chrome OS", version };
|
|
4595
|
+
if (/Linux/i.test(raw)) return { name: "Linux", version: "" };
|
|
4596
|
+
return { name: "", version: "" };
|
|
4597
|
+
}
|
|
4598
|
+
function parseDevice(ua) {
|
|
4599
|
+
var _a;
|
|
4600
|
+
if (/iPad/i.test(ua)) return { type: "tablet", vendor: "Apple", model: "iPad" };
|
|
4601
|
+
if (/iPhone/i.test(ua)) return { type: "mobile", vendor: "Apple", model: "iPhone" };
|
|
4602
|
+
if (/iPod/i.test(ua)) return { type: "mobile", vendor: "Apple", model: "iPod" };
|
|
4603
|
+
if (/Android/i.test(ua)) {
|
|
4604
|
+
const m = ua.match(/Android[\s\d.]+;\s*([^)]+?)(?:\s+Build)/i);
|
|
4605
|
+
const mobile = /Mobile/i.test(ua);
|
|
4606
|
+
return { type: mobile ? "mobile" : "tablet", model: (_a = m == null ? void 0 : m[1]) == null ? void 0 : _a.trim() };
|
|
4607
|
+
}
|
|
4608
|
+
return void 0;
|
|
4609
|
+
}
|
|
4610
|
+
function parseEngine(ua) {
|
|
4611
|
+
const m = match(ua, /AppleWebKit\/([\d.]+)/i) || match(ua, /Gecko\/([\d.]+)/i) || match(ua, /Trident\/([\d.]+)/i) || match(ua, /Presto\/([\d.]+)/i);
|
|
4612
|
+
if (!m) return { name: "", version: "" };
|
|
4613
|
+
const raw = m[0];
|
|
4614
|
+
const version = m[1] || "";
|
|
4615
|
+
if (/AppleWebKit/i.test(raw)) return { name: "WebKit", version };
|
|
4616
|
+
if (/Gecko/i.test(raw)) return { name: "Gecko", version };
|
|
4617
|
+
if (/Trident/i.test(raw)) return { name: "Trident", version };
|
|
4618
|
+
if (/Presto/i.test(raw)) return { name: "Presto", version };
|
|
4619
|
+
return { name: "", version: "" };
|
|
4620
|
+
}
|
|
4621
|
+
function parseCPU(ua) {
|
|
4622
|
+
if (/x86_64|x64|amd64|Win64/i.test(ua)) return { architecture: "amd64" };
|
|
4623
|
+
if (/ia32|x86/i.test(ua)) return { architecture: "ia32" };
|
|
4624
|
+
if (/aarch64|arm64/i.test(ua)) return { architecture: "arm64" };
|
|
4625
|
+
if (/arm/i.test(ua)) return { architecture: "arm" };
|
|
4626
|
+
return { architecture: "" };
|
|
4627
|
+
}
|
|
4628
|
+
function detectIsBot() {
|
|
4629
|
+
if (navigator.webdriver) return true;
|
|
4630
|
+
return /bot|crawl|spider|slurp|Googlebot|bingbot|yandex|baidu|duckduck|facebookexternalhit|Twitterbot|linkedinbot|embedly|quora|pinterest|redditbot|Slackbot|Discordbot|WhatsApp|TelegramBot|Applebot/i.test(UA);
|
|
4631
|
+
}
|
|
4632
|
+
function detectIsChromeFamily(browserName) {
|
|
4633
|
+
return /Chrome|Chromium|Edge|Brave|Opera|Vivaldi|Arc/i.test(browserName);
|
|
4634
|
+
}
|
|
4635
|
+
function detectIsStandalonePWA() {
|
|
4636
|
+
return window.matchMedia("(display-mode: standalone)").matches || navigator.standalone === true;
|
|
4637
|
+
}
|
|
4638
|
+
function detectIsAppleSilicon(osName) {
|
|
4639
|
+
if (!/mac/i.test(osName)) return false;
|
|
4640
|
+
return navigator.maxTouchPoints > 0;
|
|
4641
|
+
}
|
|
8070
4642
|
function collectDeviceInfo() {
|
|
8071
4643
|
if (typeof window === "undefined") {
|
|
8072
4644
|
return {
|
|
@@ -8080,68 +4652,34 @@ var TagadaTrackerBundle = (() => {
|
|
|
8080
4652
|
},
|
|
8081
4653
|
screenResolution: { width: 0, height: 0 },
|
|
8082
4654
|
timeZone: "UTC",
|
|
8083
|
-
flags: {
|
|
8084
|
-
isBot: false,
|
|
8085
|
-
isChromeFamily: false,
|
|
8086
|
-
isStandalonePWA: false,
|
|
8087
|
-
isAppleSilicon: false
|
|
8088
|
-
}
|
|
4655
|
+
flags: { isBot: false, isChromeFamily: false, isStandalonePWA: false, isAppleSilicon: false }
|
|
8089
4656
|
};
|
|
8090
4657
|
}
|
|
8091
|
-
const
|
|
8092
|
-
const
|
|
4658
|
+
const browser = parseBrowser(UA);
|
|
4659
|
+
const os = parseOS(UA);
|
|
4660
|
+
const device = parseDevice(UA);
|
|
4661
|
+
const engine = parseEngine(UA);
|
|
4662
|
+
const cpu = parseCPU(UA);
|
|
8093
4663
|
let flags;
|
|
8094
4664
|
try {
|
|
8095
4665
|
flags = {
|
|
8096
|
-
isBot:
|
|
8097
|
-
isChromeFamily:
|
|
8098
|
-
isStandalonePWA:
|
|
8099
|
-
isAppleSilicon:
|
|
8100
|
-
};
|
|
8101
|
-
} catch (error) {
|
|
8102
|
-
console.error("Failed to compute device flags:", error);
|
|
8103
|
-
flags = {
|
|
8104
|
-
isBot: false,
|
|
8105
|
-
isChromeFamily: false,
|
|
8106
|
-
isStandalonePWA: false,
|
|
8107
|
-
isAppleSilicon: false
|
|
4666
|
+
isBot: detectIsBot(),
|
|
4667
|
+
isChromeFamily: detectIsChromeFamily(browser.name),
|
|
4668
|
+
isStandalonePWA: detectIsStandalonePWA(),
|
|
4669
|
+
isAppleSilicon: detectIsAppleSilicon(os.name)
|
|
8108
4670
|
};
|
|
4671
|
+
} catch (e) {
|
|
4672
|
+
flags = { isBot: false, isChromeFamily: false, isStandalonePWA: false, isAppleSilicon: false };
|
|
8109
4673
|
}
|
|
8110
4674
|
return {
|
|
8111
|
-
userAgent: {
|
|
8112
|
-
name: result.ua,
|
|
8113
|
-
browser: {
|
|
8114
|
-
major: result.browser.major || "",
|
|
8115
|
-
name: result.browser.name || "",
|
|
8116
|
-
version: result.browser.version || "",
|
|
8117
|
-
type: result.browser.type
|
|
8118
|
-
},
|
|
8119
|
-
os: {
|
|
8120
|
-
name: result.os.name || "",
|
|
8121
|
-
version: result.os.version || ""
|
|
8122
|
-
},
|
|
8123
|
-
device: result.device.model || result.device.type || result.device.vendor ? {
|
|
8124
|
-
model: result.device.model,
|
|
8125
|
-
type: result.device.type,
|
|
8126
|
-
vendor: result.device.vendor
|
|
8127
|
-
} : void 0,
|
|
8128
|
-
engine: {
|
|
8129
|
-
name: result.engine.name || "",
|
|
8130
|
-
version: result.engine.version || ""
|
|
8131
|
-
},
|
|
8132
|
-
cpu: {
|
|
8133
|
-
architecture: result.cpu.architecture || ""
|
|
8134
|
-
}
|
|
8135
|
-
},
|
|
4675
|
+
userAgent: { name: UA, browser, os, device, engine, cpu },
|
|
8136
4676
|
screenResolution: getScreenResolution(),
|
|
8137
4677
|
timeZone: getTimeZone(),
|
|
8138
4678
|
flags
|
|
8139
4679
|
};
|
|
8140
4680
|
}
|
|
8141
4681
|
function getUrlParams() {
|
|
8142
|
-
if (typeof window === "undefined") {
|
|
8143
|
-
return {};
|
|
8144
|
-
}
|
|
4682
|
+
if (typeof window === "undefined") return {};
|
|
8145
4683
|
const params = new URLSearchParams(window.location.search);
|
|
8146
4684
|
return {
|
|
8147
4685
|
locale: params.get("locale") || void 0,
|
|
@@ -8374,6 +4912,17 @@ var TagadaTrackerBundle = (() => {
|
|
|
8374
4912
|
const metaTag = document.querySelector('meta[name="'.concat(name, '"]'));
|
|
8375
4913
|
return (metaTag == null ? void 0 : metaTag.getAttribute("content")) || void 0;
|
|
8376
4914
|
};
|
|
4915
|
+
var readWindowConfig = () => {
|
|
4916
|
+
if (typeof window !== "undefined" && window.__TAGADA_PLUGIN_CONFIG__) {
|
|
4917
|
+
return window.__TAGADA_PLUGIN_CONFIG__;
|
|
4918
|
+
}
|
|
4919
|
+
try {
|
|
4920
|
+
const encoded = getMetaContent("x-plugin-config");
|
|
4921
|
+
if (encoded) return JSON.parse(decodeURIComponent(encoded));
|
|
4922
|
+
} catch (e) {
|
|
4923
|
+
}
|
|
4924
|
+
return {};
|
|
4925
|
+
};
|
|
8377
4926
|
var loadProductionConfig = async () => {
|
|
8378
4927
|
try {
|
|
8379
4928
|
if (typeof document === "undefined") {
|
|
@@ -8385,16 +4934,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
8385
4934
|
return null;
|
|
8386
4935
|
}
|
|
8387
4936
|
const basePath = getMetaContent("x-plugin-base-path") || "/";
|
|
8388
|
-
|
|
8389
|
-
try {
|
|
8390
|
-
const encodedConfig = getMetaContent("x-plugin-config");
|
|
8391
|
-
if (encodedConfig) {
|
|
8392
|
-
const decodedConfig = decodeURIComponent(encodedConfig);
|
|
8393
|
-
config = JSON.parse(decodedConfig);
|
|
8394
|
-
}
|
|
8395
|
-
} catch (error) {
|
|
8396
|
-
console.warn("\u26A0\uFE0F Failed to parse plugin config from meta tag:", error);
|
|
8397
|
-
}
|
|
4937
|
+
const config = readWindowConfig();
|
|
8398
4938
|
if (!accountId) {
|
|
8399
4939
|
console.warn("\u26A0\uFE0F Plugin config: Account ID not found in meta tags");
|
|
8400
4940
|
}
|
|
@@ -9065,7 +5605,7 @@ var TagadaTrackerBundle = (() => {
|
|
|
9065
5605
|
if (this.state.debugMode) {
|
|
9066
5606
|
console.log("[TagadaClient ".concat(this.instanceId, "] Initializing session..."), { sessionId: sessionData.sessionId });
|
|
9067
5607
|
}
|
|
9068
|
-
const deviceInfo = collectDeviceInfo();
|
|
5608
|
+
const deviceInfo = await collectDeviceInfo();
|
|
9069
5609
|
const urlParams = getUrlParams();
|
|
9070
5610
|
const browserLocale = getBrowserLocale();
|
|
9071
5611
|
const draft = isDraftMode();
|
|
@@ -9501,193 +6041,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
9501
6041
|
|
|
9502
6042
|
// src/v2/standalone/index.ts
|
|
9503
6043
|
init_funnelClient();
|
|
9504
|
-
|
|
9505
|
-
// src/data/iso3166.ts
|
|
9506
|
-
var GEODATA_CDN_BASE = "https://cvwnizdbugpz6jwk.public.blob.vercel-storage.com/geodata/v1";
|
|
9507
|
-
var countriesCache = /* @__PURE__ */ new Map();
|
|
9508
|
-
var regionsCache = /* @__PURE__ */ new Map();
|
|
9509
|
-
var inflightCountries = /* @__PURE__ */ new Map();
|
|
9510
|
-
var inflightRegions = /* @__PURE__ */ new Map();
|
|
9511
|
-
async function fetchCountriesRaw(language) {
|
|
9512
|
-
const cached = countriesCache.get(language);
|
|
9513
|
-
if (cached) return cached;
|
|
9514
|
-
let inflight = inflightCountries.get(language);
|
|
9515
|
-
if (inflight) return inflight;
|
|
9516
|
-
inflight = (async () => {
|
|
9517
|
-
const url = "".concat(GEODATA_CDN_BASE, "/").concat(language, "/countries.json");
|
|
9518
|
-
const res = await fetch(url);
|
|
9519
|
-
if (!res.ok) throw new Error("Geodata fetch failed: ".concat(url, " (").concat(res.status, ")"));
|
|
9520
|
-
const data = await res.json();
|
|
9521
|
-
countriesCache.set(language, data);
|
|
9522
|
-
inflightCountries.delete(language);
|
|
9523
|
-
return data;
|
|
9524
|
-
})();
|
|
9525
|
-
inflightCountries.set(language, inflight);
|
|
9526
|
-
return inflight;
|
|
9527
|
-
}
|
|
9528
|
-
async function fetchRegionsRaw(language) {
|
|
9529
|
-
const cached = regionsCache.get(language);
|
|
9530
|
-
if (cached) return cached;
|
|
9531
|
-
let inflight = inflightRegions.get(language);
|
|
9532
|
-
if (inflight) return inflight;
|
|
9533
|
-
inflight = (async () => {
|
|
9534
|
-
const url = "".concat(GEODATA_CDN_BASE, "/").concat(language, "/regions.json");
|
|
9535
|
-
const res = await fetch(url);
|
|
9536
|
-
if (!res.ok) throw new Error("Geodata fetch failed: ".concat(url, " (").concat(res.status, ")"));
|
|
9537
|
-
const data = await res.json();
|
|
9538
|
-
regionsCache.set(language, data);
|
|
9539
|
-
inflightRegions.delete(language);
|
|
9540
|
-
return data;
|
|
9541
|
-
})();
|
|
9542
|
-
inflightRegions.set(language, inflight);
|
|
9543
|
-
return inflight;
|
|
9544
|
-
}
|
|
9545
|
-
async function ensureGeoDataLoaded(language = "en") {
|
|
9546
|
-
await Promise.all([fetchCountriesRaw(language), fetchRegionsRaw(language)]);
|
|
9547
|
-
}
|
|
9548
|
-
if (typeof globalThis !== "undefined" && typeof fetch !== "undefined") {
|
|
9549
|
-
ensureGeoDataLoaded("en").catch(() => {
|
|
9550
|
-
});
|
|
9551
|
-
}
|
|
9552
|
-
|
|
9553
|
-
// src/v2/core/googleAutocomplete.ts
|
|
9554
|
-
var GoogleAutocompleteCore = class {
|
|
9555
|
-
/**
|
|
9556
|
-
* Initialize Google Places API
|
|
9557
|
-
*/
|
|
9558
|
-
static initialize(apiKey) {
|
|
9559
|
-
var _a, _b;
|
|
9560
|
-
this.apiKey = apiKey;
|
|
9561
|
-
if (typeof window !== "undefined" && ((_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places)) {
|
|
9562
|
-
this.service = new window.google.maps.places.AutocompleteService();
|
|
9563
|
-
}
|
|
9564
|
-
}
|
|
9565
|
-
/**
|
|
9566
|
-
* Search for places
|
|
9567
|
-
*/
|
|
9568
|
-
static async searchPlaces(input, options = {}) {
|
|
9569
|
-
if (!this.service || !input.trim()) {
|
|
9570
|
-
return [];
|
|
9571
|
-
}
|
|
9572
|
-
return new Promise((resolve, reject) => {
|
|
9573
|
-
this.service.getPlacePredictions(
|
|
9574
|
-
{
|
|
9575
|
-
input,
|
|
9576
|
-
types: options.types || ["address"],
|
|
9577
|
-
componentRestrictions: options.componentRestrictions
|
|
9578
|
-
},
|
|
9579
|
-
(predictions, status) => {
|
|
9580
|
-
var _a, _b, _c;
|
|
9581
|
-
if (status === ((_c = (_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places) == null ? void 0 : _c.PlacesServiceStatus.OK) && predictions) {
|
|
9582
|
-
resolve(predictions);
|
|
9583
|
-
} else {
|
|
9584
|
-
resolve([]);
|
|
9585
|
-
}
|
|
9586
|
-
}
|
|
9587
|
-
);
|
|
9588
|
-
});
|
|
9589
|
-
}
|
|
9590
|
-
/**
|
|
9591
|
-
* Get place details
|
|
9592
|
-
*/
|
|
9593
|
-
static async getPlaceDetails(placeId) {
|
|
9594
|
-
var _a, _b;
|
|
9595
|
-
if (typeof window === "undefined" || !((_b = (_a = window.google) == null ? void 0 : _a.maps) == null ? void 0 : _b.places)) {
|
|
9596
|
-
return null;
|
|
9597
|
-
}
|
|
9598
|
-
return new Promise((resolve, reject) => {
|
|
9599
|
-
const service = new window.google.maps.places.PlacesService(
|
|
9600
|
-
document.createElement("div")
|
|
9601
|
-
);
|
|
9602
|
-
service.getDetails(
|
|
9603
|
-
{
|
|
9604
|
-
placeId,
|
|
9605
|
-
fields: ["place_id", "formatted_address", "address_components", "geometry"]
|
|
9606
|
-
},
|
|
9607
|
-
(place, status) => {
|
|
9608
|
-
var _a2, _b2, _c;
|
|
9609
|
-
if (status === ((_c = (_b2 = (_a2 = window.google) == null ? void 0 : _a2.maps) == null ? void 0 : _b2.places) == null ? void 0 : _c.PlacesServiceStatus.OK) && place) {
|
|
9610
|
-
resolve(place);
|
|
9611
|
-
} else {
|
|
9612
|
-
resolve(null);
|
|
9613
|
-
}
|
|
9614
|
-
}
|
|
9615
|
-
);
|
|
9616
|
-
});
|
|
9617
|
-
}
|
|
9618
|
-
/**
|
|
9619
|
-
* Extract address components from place details
|
|
9620
|
-
*/
|
|
9621
|
-
static extractAddressComponents(placeDetails) {
|
|
9622
|
-
const components = {};
|
|
9623
|
-
for (const component of placeDetails.address_components) {
|
|
9624
|
-
const types = component.types;
|
|
9625
|
-
if (types.includes("street_number")) {
|
|
9626
|
-
components.streetNumber = component.long_name;
|
|
9627
|
-
} else if (types.includes("route")) {
|
|
9628
|
-
components.route = component.long_name;
|
|
9629
|
-
} else if (types.includes("locality")) {
|
|
9630
|
-
components.city = component.long_name;
|
|
9631
|
-
components.locality = component.long_name;
|
|
9632
|
-
} else if (types.includes("administrative_area_level_2")) {
|
|
9633
|
-
components.administrativeAreaLevel2 = component.short_name;
|
|
9634
|
-
components.administrativeAreaLevel2Long = component.long_name;
|
|
9635
|
-
if (!components.city) {
|
|
9636
|
-
components.city = component.long_name;
|
|
9637
|
-
components.locality = component.long_name;
|
|
9638
|
-
}
|
|
9639
|
-
} else if (types.includes("administrative_area_level_1")) {
|
|
9640
|
-
components.state = component.long_name;
|
|
9641
|
-
components.administrativeAreaLevel1 = component.short_name;
|
|
9642
|
-
components.administrativeAreaLevel1Long = component.long_name;
|
|
9643
|
-
} else if (types.includes("postal_code")) {
|
|
9644
|
-
components.postalCode = component.long_name;
|
|
9645
|
-
} else if (types.includes("country")) {
|
|
9646
|
-
components.country = component.long_name;
|
|
9647
|
-
components.countryCode = component.short_name;
|
|
9648
|
-
components.iso = component.short_name;
|
|
9649
|
-
}
|
|
9650
|
-
}
|
|
9651
|
-
if (!components.administrativeAreaLevel1 && components.administrativeAreaLevel2) {
|
|
9652
|
-
components.state = components.administrativeAreaLevel2Long || components.administrativeAreaLevel2;
|
|
9653
|
-
components.administrativeAreaLevel1 = components.administrativeAreaLevel2;
|
|
9654
|
-
components.administrativeAreaLevel1Long = components.administrativeAreaLevel2Long;
|
|
9655
|
-
}
|
|
9656
|
-
return components;
|
|
9657
|
-
}
|
|
9658
|
-
};
|
|
9659
|
-
GoogleAutocompleteCore.apiKey = null;
|
|
9660
|
-
GoogleAutocompleteCore.service = null;
|
|
9661
|
-
|
|
9662
|
-
// src/v2/standalone/index.ts
|
|
9663
|
-
init_funnel();
|
|
9664
|
-
|
|
9665
|
-
// src/v2/core/utils/index.ts
|
|
9666
|
-
init_sessionStorage();
|
|
9667
|
-
|
|
9668
|
-
// src/v2/core/pathRemapping.ts
|
|
9669
|
-
var import_path_to_regexp = __toESM(require_dist());
|
|
9670
|
-
var internalPathCache = void 0;
|
|
9671
|
-
var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
9672
|
-
var originalPushState = isBrowser ? history.pushState.bind(history) : null;
|
|
9673
|
-
var originalReplaceState = isBrowser ? history.replaceState.bind(history) : null;
|
|
9674
|
-
function clearCache() {
|
|
9675
|
-
internalPathCache = void 0;
|
|
9676
|
-
}
|
|
9677
|
-
if (isBrowser) {
|
|
9678
|
-
window.addEventListener("popstate", clearCache);
|
|
9679
|
-
window.addEventListener("hashchange", clearCache);
|
|
9680
|
-
history.pushState = function(...args) {
|
|
9681
|
-
clearCache();
|
|
9682
|
-
return originalPushState.apply(this, args);
|
|
9683
|
-
};
|
|
9684
|
-
history.replaceState = function(...args) {
|
|
9685
|
-
clearCache();
|
|
9686
|
-
return originalReplaceState.apply(this, args);
|
|
9687
|
-
};
|
|
9688
|
-
}
|
|
9689
|
-
|
|
9690
|
-
// src/v2/standalone/index.ts
|
|
9691
6044
|
function parseStepConfigScripts() {
|
|
9692
6045
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
9693
6046
|
return [];
|
|
@@ -10106,29 +6459,6 @@ var TagadaTrackerBundle = (() => {
|
|
|
10106
6459
|
}
|
|
10107
6460
|
return __toCommonJS(external_tracker_exports);
|
|
10108
6461
|
})();
|
|
10109
|
-
/*! Bundled license information:
|
|
10110
|
-
|
|
10111
|
-
detect-europe-js/dist/esm/index.js:
|
|
10112
|
-
(*! detectEurope.js v0.1.2
|
|
10113
|
-
Determine whether a user is from the European Union (EU) area
|
|
10114
|
-
https://github.com/faisalman/detect-europe-js
|
|
10115
|
-
Author: Faisal Salman <f@faisalman.com>
|
|
10116
|
-
MIT License *)
|
|
10117
|
-
|
|
10118
|
-
ua-is-frozen/dist/esm/index.js:
|
|
10119
|
-
(*! isFrozenUA
|
|
10120
|
-
A freeze-test for your user-agent string
|
|
10121
|
-
https://github.com/faisalman/ua-is-frozen
|
|
10122
|
-
Author: Faisal Salman <f@faisalman.com>
|
|
10123
|
-
MIT License *)
|
|
10124
|
-
|
|
10125
|
-
is-standalone-pwa/dist/esm/index.js:
|
|
10126
|
-
(*! isStandalonePWA 0.1.1
|
|
10127
|
-
Detect if PWA is running in standalone mode
|
|
10128
|
-
https://github.com/faisalman/is-standalone-pwa
|
|
10129
|
-
Author: Faisal Salman <f@faisalman.com>
|
|
10130
|
-
MIT License *)
|
|
10131
|
-
*/
|
|
10132
6462
|
// Expose TagadaTracker globally
|
|
10133
6463
|
if (typeof window !== 'undefined' && TagadaTrackerBundle && TagadaTrackerBundle.TagadaTracker) {
|
|
10134
6464
|
window.TagadaTracker = TagadaTrackerBundle.TagadaTracker;
|