devicely 1.0.5
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/LICENSE +7 -0
- package/README.md +243 -0
- package/bin/devicely.js +3 -0
- package/config/apps_presets.conf +271 -0
- package/config/devices.conf +20 -0
- package/lib/aiProviders.js +518 -0
- package/lib/aiProviders.js.backup +301 -0
- package/lib/aiProvidersConfig.js +176 -0
- package/lib/aiProviders_new.js +70 -0
- package/lib/androidDeviceDetection.js +2 -0
- package/lib/appMappings.js +1 -0
- package/lib/deviceDetection.js +2 -0
- package/lib/devices.conf +20 -0
- package/lib/devices.js +1 -0
- package/lib/doctor.js +1 -0
- package/lib/executor.js +1 -0
- package/lib/fix_logs.sh +18 -0
- package/lib/frontend/asset-manifest.json +13 -0
- package/lib/frontend/index.html +1 -0
- package/lib/frontend/static/css/main.23bd35c0.css +2 -0
- package/lib/frontend/static/css/main.23bd35c0.css.map +1 -0
- package/lib/frontend/static/js/main.3f13aeaf.js +1 -0
- package/lib/frontend/static/js/main.3f13aeaf.js.LICENSE.txt +48 -0
- package/lib/frontend/static/js/main.3f13aeaf.js.map +1 -0
- package/lib/frontend/voice-test.html +156 -0
- package/lib/index.js +1 -0
- package/lib/package-lock.json +1678 -0
- package/lib/package.json +30 -0
- package/lib/server.js +1 -0
- package/lib/server.js.bak +3380 -0
- package/package.json +78 -0
- package/scripts/postinstall.js +110 -0
- package/scripts/shell/android_device_control +0 -0
- package/scripts/shell/connect_android_usb +0 -0
- package/scripts/shell/connect_android_usb_multi_final +0 -0
- package/scripts/shell/connect_android_wireless +0 -0
- package/scripts/shell/connect_android_wireless_multi_final +0 -0
- package/scripts/shell/connect_ios_usb +0 -0
- package/scripts/shell/connect_ios_usb_multi_final +0 -0
- package/scripts/shell/connect_ios_wireless_multi_final +0 -0
- package/scripts/shell/find_element_coordinates +0 -0
- package/scripts/shell/find_wda +0 -0
- package/scripts/shell/install_uiautomator2 +0 -0
- package/scripts/shell/ios_device_control +0 -0
- package/scripts/shell/setup +0 -0
- package/scripts/shell/setup_android +0 -0
- package/scripts/shell/start +0 -0
- package/scripts/shell/test_android_locators +0 -0
- package/scripts/shell/test_connect +0 -0
- package/scripts/shell/test_device_detection +0 -0
- package/scripts/shell/test_fixes +0 -0
- package/scripts/shell/test_getlocators_fix +0 -0
- package/scripts/shell/test_recording_feature +0 -0
- package/scripts/shell/verify_distribution +0 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
// AI Provider Abstraction Layer
|
|
2
|
+
// Supports: Google Gemini, GitHub Copilot
|
|
3
|
+
|
|
4
|
+
const { OpenAI } = require('openai');
|
|
5
|
+
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
6
|
+
const { getPackageId, APP_MAPPINGS } = require('./appMappings');
|
|
7
|
+
|
|
8
|
+
class AIProviderManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.provider = process.env.AI_PROVIDER || 'gemini'; // gemini, copilot
|
|
11
|
+
this.initializeProviders();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
initializeProviders() {
|
|
15
|
+
// Google Gemini
|
|
16
|
+
if (process.env.GEMINI_API_KEY) {
|
|
17
|
+
this.gemini = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// GitHub Copilot
|
|
21
|
+
if (process.env.GITHUB_TOKEN) {
|
|
22
|
+
this.copilot = new OpenAI({
|
|
23
|
+
apiKey: process.env.GITHUB_TOKEN,
|
|
24
|
+
baseURL: 'https://api.githubcopilot.com',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
getSystemPrompt(platform = null) {
|
|
30
|
+
// Generate app list based on platform
|
|
31
|
+
let appListSection = '';
|
|
32
|
+
|
|
33
|
+
if (platform === 'both') {
|
|
34
|
+
// Multi-platform mode - use generic app names
|
|
35
|
+
const commonApps = Object.keys(APP_MAPPINGS)
|
|
36
|
+
.filter(app => APP_MAPPINGS[app].ios && APP_MAPPINGS[app].android)
|
|
37
|
+
.slice(0, 30);
|
|
38
|
+
|
|
39
|
+
appListSection = `\n\nMULTI-PLATFORM MODE (iOS + Android devices)
|
|
40
|
+
Available apps: ${commonApps.join(', ')}
|
|
41
|
+
|
|
42
|
+
IMPORTANT: Use generic app names (e.g., "launch settings", "launch chrome")
|
|
43
|
+
The system will automatically convert to platform-specific package IDs:
|
|
44
|
+
${commonApps.slice(0, 15).map(app => `- ${app} → iOS: ${APP_MAPPINGS[app].ios} / Android: ${APP_MAPPINGS[app].android}`).join('\n')}
|
|
45
|
+
|
|
46
|
+
Commands will execute SIMULTANEOUSLY on all devices with correct package IDs.
|
|
47
|
+
`;
|
|
48
|
+
} else if (platform) {
|
|
49
|
+
const availableApps = Object.keys(APP_MAPPINGS)
|
|
50
|
+
.filter(app => APP_MAPPINGS[app][platform])
|
|
51
|
+
.slice(0, 50);
|
|
52
|
+
|
|
53
|
+
appListSection = `\n\nPLATFORM: ${platform.toUpperCase()}
|
|
54
|
+
Available apps for ${platform}: ${availableApps.join(', ')}
|
|
55
|
+
|
|
56
|
+
APP PACKAGE MAPPINGS:
|
|
57
|
+
When user says "launch chrome", "open chrome", etc., use the correct package ID:
|
|
58
|
+
${availableApps.slice(0, 20).map(app => `- ${app} → launch ${APP_MAPPINGS[app][platform]}`).join('\n')}
|
|
59
|
+
`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return `You are a mobile device automation command converter. Convert natural language requests into executable commands for iOS and Android devices.
|
|
63
|
+
|
|
64
|
+
Available commands (work on both iOS & Android):
|
|
65
|
+
- launch <app_name>: Launch an app using generic name (e.g., "launch settings", "launch chrome")
|
|
66
|
+
- kill <app_name>: Close/force stop an app
|
|
67
|
+
- home: Go to home screen (press home button)
|
|
68
|
+
- back: Navigate back (Android/iOS)
|
|
69
|
+
- url <url>: Open URL in browser
|
|
70
|
+
- click <text>: Click on a button or element by visible text
|
|
71
|
+
- click <x,y>: Click at specific coordinates (e.g., click 500,1000)
|
|
72
|
+
- tap <text/coords>: Same as click
|
|
73
|
+
- longpress <text/coords>: Long press on element or coordinates
|
|
74
|
+
- swipe <direction>: Swipe up/down/left/right (use for scrolling)
|
|
75
|
+
- type <text>: Type text into focused field (just the text, no "type" prefix)
|
|
76
|
+
- screenshot: Take screenshot
|
|
77
|
+
- restart: Restart device
|
|
78
|
+
- rotate <left/right/portrait/landscape>: Rotate screen
|
|
79
|
+
|
|
80
|
+
iOS-specific commands:
|
|
81
|
+
- darkmode/lightmode: Change appearance
|
|
82
|
+
- airplane <on/off>: Toggle airplane mode
|
|
83
|
+
- wifi <on/off>: Toggle WiFi
|
|
84
|
+
- volume <up/down/mute>: Control volume
|
|
85
|
+
|
|
86
|
+
Android-specific commands:
|
|
87
|
+
- getLocators: Get all interactive elements on current screen
|
|
88
|
+
- recent: Open recent apps
|
|
89
|
+
- notifications: Open notification panel
|
|
90
|
+
- quicksettings: Open quick settings
|
|
91
|
+
${appListSection}
|
|
92
|
+
|
|
93
|
+
COMMON PHRASE MAPPINGS:
|
|
94
|
+
- "scroll up" OR "scroll down" → swipe up OR swipe down
|
|
95
|
+
- "go to <url>" OR "open <url>" OR "visit <url>" → url https://<url>
|
|
96
|
+
- "press home" OR "go home" OR "home button" → home
|
|
97
|
+
- "open settings" OR "launch settings" → launch settings
|
|
98
|
+
- "open camera" OR "launch camera" → launch camera
|
|
99
|
+
|
|
100
|
+
Examples:
|
|
101
|
+
- "open chrome" → launch chrome
|
|
102
|
+
- "launch settings" → launch settings
|
|
103
|
+
- "open camera" → launch camera
|
|
104
|
+
- "scroll up" → swipe up
|
|
105
|
+
- "scroll down" → swipe down
|
|
106
|
+
- "click on the login button" → click Login
|
|
107
|
+
- "tap at center of screen" → click 540,1000
|
|
108
|
+
- "swipe down" → swipe down
|
|
109
|
+
- "type hello world" → hello world
|
|
110
|
+
- "take a screenshot" → screenshot
|
|
111
|
+
- "go back" → back
|
|
112
|
+
- "press home" → home
|
|
113
|
+
- "go to google.com" → url https://www.google.com
|
|
114
|
+
- "visit youtube.com" → url https://www.youtube.com
|
|
115
|
+
- "launch Chrome and search google.com" → launch chrome
|
|
116
|
+
WAIT 3000
|
|
117
|
+
url https://www.google.com
|
|
118
|
+
- "launch settings scroll up launch camera go to google.com press home" →
|
|
119
|
+
launch settings
|
|
120
|
+
WAIT 3000
|
|
121
|
+
swipe up
|
|
122
|
+
WAIT 1000
|
|
123
|
+
home
|
|
124
|
+
WAIT 500
|
|
125
|
+
launch camera
|
|
126
|
+
WAIT 3000
|
|
127
|
+
home
|
|
128
|
+
WAIT 500
|
|
129
|
+
url https://www.google.com
|
|
130
|
+
WAIT 2000
|
|
131
|
+
home
|
|
132
|
+
|
|
133
|
+
Convert this request to commands: "{INPUT}"
|
|
134
|
+
|
|
135
|
+
CRITICAL RULES - YOU MUST FOLLOW THESE EXACTLY:
|
|
136
|
+
1. Output ONLY executable commands, one per line
|
|
137
|
+
2. NO explanations, NO markdown code blocks, NO comments, NO extra text
|
|
138
|
+
3. For multi-step actions, insert WAIT <milliseconds> between commands
|
|
139
|
+
4. Use GENERIC app names (e.g., "launch settings", "launch chrome", "launch camera")
|
|
140
|
+
5. Do NOT use platform-specific package IDs - use simple app names
|
|
141
|
+
6. The system will automatically convert to correct package IDs for each platform
|
|
142
|
+
5. For URLs, always use: url https://example.com
|
|
143
|
+
6. For scrolling, use: swipe up OR swipe down (never "scroll")
|
|
144
|
+
7. For text input, output ONLY the text (never include "type" prefix)
|
|
145
|
+
8. For home button, output: home (never "press home" or "go home")
|
|
146
|
+
9. WAIT timings: apps=3000ms, pages=2000ms, UI=1000ms, quick=500ms
|
|
147
|
+
10. Parse compound requests into individual steps with WAIT between each
|
|
148
|
+
|
|
149
|
+
OUTPUT FORMAT EXAMPLE:
|
|
150
|
+
launch com.apple.Preferences
|
|
151
|
+
WAIT 3000
|
|
152
|
+
swipe up
|
|
153
|
+
WAIT 1000
|
|
154
|
+
home
|
|
155
|
+
|
|
156
|
+
DO NOT include any other text. Start your response with the first command.`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async convertCommand(text, platform = null, providerOverride = null) {
|
|
160
|
+
const provider = providerOverride || this.provider;
|
|
161
|
+
|
|
162
|
+
try {
|
|
163
|
+
switch (provider) {
|
|
164
|
+
case 'gemini':
|
|
165
|
+
return await this.convertWithGemini(text, platform);
|
|
166
|
+
case 'copilot':
|
|
167
|
+
return await this.convertWithCopilot(text, platform);
|
|
168
|
+
default:
|
|
169
|
+
throw new Error(`Unknown AI provider: ${provider}`);
|
|
170
|
+
}
|
|
171
|
+
} catch (error) {
|
|
172
|
+
console.error(`Error with ${provider}:`, error.message);
|
|
173
|
+
// Re-throw the error instead of silently falling back
|
|
174
|
+
// This ensures the user is aware of AI failures
|
|
175
|
+
throw new Error(`AI conversion failed (${provider}): ${error.message}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async convertWithGemini(text, platform = null) {
|
|
180
|
+
if (!this.gemini) {
|
|
181
|
+
throw new Error('Gemini not configured');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Use Gemini 2.5 Flash (current stable model)
|
|
185
|
+
const model = this.gemini.getGenerativeModel({
|
|
186
|
+
model: process.env.GEMINI_MODEL || 'gemini-2.5-flash'
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const prompt = this.getSystemPrompt(platform).replace('{INPUT}', text);
|
|
190
|
+
const result = await model.generateContent(prompt);
|
|
191
|
+
const response = await result.response;
|
|
192
|
+
let convertedText = response.text().trim();
|
|
193
|
+
|
|
194
|
+
// Clean up AI response - remove markdown, explanations, etc.
|
|
195
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
196
|
+
|
|
197
|
+
return convertedText;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async convertWithCopilot(text, platform = null) {
|
|
201
|
+
if (!this.copilot) {
|
|
202
|
+
throw new Error('GitHub Copilot not configured');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const prompt = this.getSystemPrompt(platform).replace('{INPUT}', text);
|
|
206
|
+
|
|
207
|
+
const response = await this.copilot.chat.completions.create({
|
|
208
|
+
model: 'gpt-4o',
|
|
209
|
+
messages: [{ role: 'user', content: prompt }],
|
|
210
|
+
temperature: 0.3,
|
|
211
|
+
max_tokens: 500,
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
let convertedText = response.choices[0].message.content.trim();
|
|
215
|
+
|
|
216
|
+
// Clean up AI response
|
|
217
|
+
convertedText = this.cleanAIResponse(convertedText);
|
|
218
|
+
|
|
219
|
+
return convertedText;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Clean up AI responses - remove markdown, explanations, etc.
|
|
223
|
+
cleanAIResponse(text) {
|
|
224
|
+
// Remove markdown code blocks
|
|
225
|
+
text = text.replace(/```[\s\S]*?```/g, '').trim();
|
|
226
|
+
text = text.replace(/```/g, '').trim();
|
|
227
|
+
|
|
228
|
+
// Remove any lines that look like explanations (starting with explanatory text)
|
|
229
|
+
const lines = text.split('\n');
|
|
230
|
+
const cleanedLines = lines.filter(line => {
|
|
231
|
+
const trimmed = line.trim();
|
|
232
|
+
if (!trimmed) return false;
|
|
233
|
+
|
|
234
|
+
// Keep lines that are commands or WAIT
|
|
235
|
+
if (trimmed.startsWith('launch ')) return true;
|
|
236
|
+
if (trimmed.startsWith('kill ')) return true;
|
|
237
|
+
if (trimmed === 'home') return true;
|
|
238
|
+
if (trimmed === 'back') return true;
|
|
239
|
+
if (trimmed.startsWith('url ')) return true;
|
|
240
|
+
if (trimmed.startsWith('click ')) return true;
|
|
241
|
+
if (trimmed.startsWith('tap ')) return true;
|
|
242
|
+
if (trimmed.startsWith('longpress ')) return true;
|
|
243
|
+
if (trimmed.startsWith('swipe ')) return true;
|
|
244
|
+
if (trimmed.startsWith('WAIT ')) return true;
|
|
245
|
+
if (trimmed.startsWith('screenshot')) return true;
|
|
246
|
+
if (trimmed.startsWith('restart')) return true;
|
|
247
|
+
if (trimmed.startsWith('rotate ')) return true;
|
|
248
|
+
if (trimmed.startsWith('darkmode')) return true;
|
|
249
|
+
if (trimmed.startsWith('lightmode')) return true;
|
|
250
|
+
if (trimmed.startsWith('airplane ')) return true;
|
|
251
|
+
if (trimmed.startsWith('wifi ')) return true;
|
|
252
|
+
if (trimmed.startsWith('volume ')) return true;
|
|
253
|
+
if (trimmed === 'getLocators') return true;
|
|
254
|
+
if (trimmed === 'recent') return true;
|
|
255
|
+
if (trimmed === 'notifications') return true;
|
|
256
|
+
if (trimmed === 'quicksettings') return true;
|
|
257
|
+
|
|
258
|
+
// If it doesn't start with a known command, it might be text to type
|
|
259
|
+
// Check if previous line was a command that expects text input
|
|
260
|
+
return true; // For now, include it (could be text to type)
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
return cleanedLines.join('\n').trim();
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
getAvailableProviders() {
|
|
267
|
+
const available = [];
|
|
268
|
+
|
|
269
|
+
if (this.gemini) available.push({ id: 'gemini', name: 'Google Gemini', icon: '✨' });
|
|
270
|
+
if (this.copilot) available.push({ id: 'copilot', name: 'GitHub Copilot', icon: '🤖' });
|
|
271
|
+
|
|
272
|
+
return available;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
setProvider(provider) {
|
|
276
|
+
const available = this.getAvailableProviders().map(p => p.id);
|
|
277
|
+
if (available.includes(provider)) {
|
|
278
|
+
this.provider = provider;
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
getCurrentProvider() {
|
|
285
|
+
return {
|
|
286
|
+
id: this.provider,
|
|
287
|
+
name: this.getProviderName(this.provider),
|
|
288
|
+
available: this.getAvailableProviders(),
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
getProviderName(providerId) {
|
|
293
|
+
const names = {
|
|
294
|
+
gemini: 'Google Gemini',
|
|
295
|
+
copilot: 'GitHub Copilot',
|
|
296
|
+
};
|
|
297
|
+
return names[providerId] || 'Unknown';
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
module.exports = AIProviderManager;
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// AI Providers Configuration
|
|
2
|
+
// Centralized configuration for all supported AI providers
|
|
3
|
+
|
|
4
|
+
const AI_PROVIDERS_CONFIG = {
|
|
5
|
+
openai: {
|
|
6
|
+
id: 'openai',
|
|
7
|
+
name: 'OpenAI',
|
|
8
|
+
icon: '🤖',
|
|
9
|
+
description: 'GPT-4o and GPT-4 Turbo models',
|
|
10
|
+
models: [
|
|
11
|
+
{ id: 'gpt-4o', name: 'GPT-4o', description: 'Fastest GPT-4 level, multimodal', default: true },
|
|
12
|
+
{ id: 'gpt-4o-mini', name: 'GPT-4o Mini', description: 'Affordable and fast' },
|
|
13
|
+
{ id: 'gpt-4-turbo', name: 'GPT-4 Turbo', description: 'Most capable GPT-4' },
|
|
14
|
+
{ id: 'gpt-4', name: 'GPT-4', description: 'High capability' },
|
|
15
|
+
{ id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', description: 'Fast and cost-effective' },
|
|
16
|
+
],
|
|
17
|
+
apiKeyLabel: 'OpenAI API Key',
|
|
18
|
+
apiKeyPlaceholder: 'sk-proj-...',
|
|
19
|
+
apiKeyPattern: /^sk-(proj-)?[A-Za-z0-9]{32,}$/,
|
|
20
|
+
docsUrl: 'https://platform.openai.com/api-keys',
|
|
21
|
+
docsLabel: 'OpenAI Platform',
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
gemini: {
|
|
25
|
+
id: 'gemini',
|
|
26
|
+
name: 'Google Gemini',
|
|
27
|
+
icon: '✨',
|
|
28
|
+
description: 'Gemini 3, 2.5, and 2.0 models',
|
|
29
|
+
models: [
|
|
30
|
+
{ id: 'gemini-3-flash-preview', name: 'Gemini 3 Flash Preview', description: 'Latest Gemini 3 - Fast', default: true },
|
|
31
|
+
{ id: 'gemini-3-pro-preview', name: 'Gemini 3 Pro Preview', description: 'Latest Gemini 3 - Most capable' },
|
|
32
|
+
{ id: 'gemini-2.5-flash', name: 'Gemini 2.5 Flash', description: 'Stable 2.5 Flash, 1M tokens' },
|
|
33
|
+
{ id: 'gemini-2.5-pro', name: 'Gemini 2.5 Pro', description: 'Stable 2.5 Pro, best reasoning' },
|
|
34
|
+
{ id: 'gemini-2.0-flash', name: 'Gemini 2.0 Flash', description: 'Fast and versatile' },
|
|
35
|
+
{ id: 'gemini-2.0-flash-001', name: 'Gemini 2.0 Flash 001', description: 'Stable 2.0 Flash (Jan 2025)' },
|
|
36
|
+
{ id: 'gemini-flash-latest', name: 'Gemini Flash Latest', description: 'Auto-updated to latest Flash' },
|
|
37
|
+
{ id: 'gemini-pro-latest', name: 'Gemini Pro Latest', description: 'Auto-updated to latest Pro' },
|
|
38
|
+
],
|
|
39
|
+
apiKeyLabel: 'Gemini API Key',
|
|
40
|
+
apiKeyPlaceholder: 'AIza...',
|
|
41
|
+
apiKeyPattern: /^AIza[A-Za-z0-9_-]{35}$/,
|
|
42
|
+
docsUrl: 'https://aistudio.google.com/apikey',
|
|
43
|
+
docsLabel: 'Google AI Studio',
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
claude: {
|
|
47
|
+
id: 'claude',
|
|
48
|
+
name: 'Anthropic Claude',
|
|
49
|
+
icon: '🧠',
|
|
50
|
+
description: 'Claude 3.5 Sonnet and Claude 3 models',
|
|
51
|
+
models: [
|
|
52
|
+
{ id: 'claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet (Latest)', description: 'Best overall, Oct 2024', default: true },
|
|
53
|
+
{ id: 'claude-3-5-sonnet-20240620', name: 'Claude 3.5 Sonnet', description: 'Previous version' },
|
|
54
|
+
{ id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku', description: 'Fastest 3.5 version' },
|
|
55
|
+
{ id: 'claude-3-opus-20240229', name: 'Claude 3 Opus', description: 'Most powerful' },
|
|
56
|
+
{ id: 'claude-3-sonnet-20240229', name: 'Claude 3 Sonnet', description: 'Balanced performance' },
|
|
57
|
+
{ id: 'claude-3-haiku-20240307', name: 'Claude 3 Haiku', description: 'Fastest, most compact' },
|
|
58
|
+
],
|
|
59
|
+
apiKeyLabel: 'Anthropic API Key',
|
|
60
|
+
apiKeyPlaceholder: 'sk-ant-...',
|
|
61
|
+
apiKeyPattern: /^sk-ant-[A-Za-z0-9_-]{95,}$/,
|
|
62
|
+
docsUrl: 'https://console.anthropic.com/account/keys',
|
|
63
|
+
docsLabel: 'Anthropic Console',
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
copilot: {
|
|
67
|
+
id: 'copilot',
|
|
68
|
+
name: 'GitHub Copilot',
|
|
69
|
+
icon: '🐙',
|
|
70
|
+
description: 'GitHub Copilot AI models',
|
|
71
|
+
models: [
|
|
72
|
+
{ id: 'gpt-4o', name: 'GPT-4o', description: 'Latest multimodal', default: true },
|
|
73
|
+
{ id: 'gpt-4', name: 'GPT-4', description: 'High capability' },
|
|
74
|
+
{ id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo', description: 'Fast responses' },
|
|
75
|
+
],
|
|
76
|
+
apiKeyLabel: 'GitHub Token',
|
|
77
|
+
apiKeyPlaceholder: 'ghp_...',
|
|
78
|
+
apiKeyPattern: /^(ghp_|gho_|ghu_|ghs_|ghr_)[A-Za-z0-9]{36,}$/,
|
|
79
|
+
docsUrl: 'https://github.com/settings/tokens',
|
|
80
|
+
docsLabel: 'GitHub Tokens',
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
groq: {
|
|
84
|
+
id: 'groq',
|
|
85
|
+
name: 'Groq',
|
|
86
|
+
icon: '⚡',
|
|
87
|
+
description: 'Ultra-fast LLM inference',
|
|
88
|
+
models: [
|
|
89
|
+
{ id: 'llama-3.3-70b-versatile', name: 'Llama 3.3 70B', description: 'Latest Llama, best quality', default: true },
|
|
90
|
+
{ id: 'llama-3.1-8b-instant', name: 'Llama 3.1 8B Instant', description: 'Fastest responses' },
|
|
91
|
+
{ id: 'mixtral-8x7b-32768', name: 'Mixtral 8x7B', description: '32K context' },
|
|
92
|
+
{ id: 'gemma2-9b-it', name: 'Gemma 2 9B', description: 'Google model' },
|
|
93
|
+
],
|
|
94
|
+
apiKeyLabel: 'Groq API Key',
|
|
95
|
+
apiKeyPlaceholder: 'gsk_...',
|
|
96
|
+
apiKeyPattern: /^gsk_[A-Za-z0-9]{52}$/,
|
|
97
|
+
docsUrl: 'https://console.groq.com/keys',
|
|
98
|
+
docsLabel: 'Groq Console',
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
cohere: {
|
|
102
|
+
id: 'cohere',
|
|
103
|
+
name: 'Cohere',
|
|
104
|
+
icon: '🌊',
|
|
105
|
+
description: 'Enterprise-grade AI',
|
|
106
|
+
models: [
|
|
107
|
+
{ id: 'command-r-plus', name: 'Command R+', description: 'Most capable', default: true },
|
|
108
|
+
{ id: 'command-r', name: 'Command R', description: 'Balanced' },
|
|
109
|
+
{ id: 'command', name: 'Command', description: 'Fast' },
|
|
110
|
+
],
|
|
111
|
+
apiKeyLabel: 'Cohere API Key',
|
|
112
|
+
apiKeyPlaceholder: 'Co...',
|
|
113
|
+
apiKeyPattern: /^[A-Za-z0-9]{40}$/,
|
|
114
|
+
docsUrl: 'https://dashboard.cohere.com/api-keys',
|
|
115
|
+
docsLabel: 'Cohere Dashboard',
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
mistral: {
|
|
119
|
+
id: 'mistral',
|
|
120
|
+
name: 'Mistral AI',
|
|
121
|
+
icon: '🌬️',
|
|
122
|
+
description: 'European AI excellence',
|
|
123
|
+
models: [
|
|
124
|
+
{ id: 'mistral-large-latest', name: 'Mistral Large Latest', description: 'Top-tier flagship model', default: true },
|
|
125
|
+
{ id: 'mistral-small-latest', name: 'Mistral Small Latest', description: 'Cost-effective and fast' },
|
|
126
|
+
{ id: 'codestral-latest', name: 'Codestral Latest', description: 'Specialized for code' },
|
|
127
|
+
{ id: 'mistral-embed', name: 'Mistral Embed', description: 'Embeddings model' },
|
|
128
|
+
],
|
|
129
|
+
apiKeyLabel: 'Mistral API Key',
|
|
130
|
+
apiKeyPlaceholder: 'Enter API key',
|
|
131
|
+
apiKeyPattern: /^[A-Za-z0-9]{32,}$/,
|
|
132
|
+
docsUrl: 'https://console.mistral.ai/api-keys',
|
|
133
|
+
docsLabel: 'Mistral Console',
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Get default model for a provider
|
|
138
|
+
function getDefaultModel(providerId) {
|
|
139
|
+
const provider = AI_PROVIDERS_CONFIG[providerId];
|
|
140
|
+
if (!provider) return null;
|
|
141
|
+
|
|
142
|
+
const defaultModel = provider.models.find(m => m.default);
|
|
143
|
+
return defaultModel ? defaultModel.id : provider.models[0].id;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Validate API key format
|
|
147
|
+
function validateApiKey(providerId, apiKey) {
|
|
148
|
+
const provider = AI_PROVIDERS_CONFIG[providerId];
|
|
149
|
+
if (!provider || !apiKey) return false;
|
|
150
|
+
|
|
151
|
+
return provider.apiKeyPattern.test(apiKey);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Get provider list for frontend
|
|
155
|
+
function getProvidersList() {
|
|
156
|
+
return Object.values(AI_PROVIDERS_CONFIG).map(provider => ({
|
|
157
|
+
id: provider.id,
|
|
158
|
+
name: provider.name,
|
|
159
|
+
icon: provider.icon,
|
|
160
|
+
description: provider.description,
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Get models for a specific provider
|
|
165
|
+
function getProviderModels(providerId) {
|
|
166
|
+
const provider = AI_PROVIDERS_CONFIG[providerId];
|
|
167
|
+
return provider ? provider.models : [];
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
module.exports = {
|
|
171
|
+
AI_PROVIDERS_CONFIG,
|
|
172
|
+
getDefaultModel,
|
|
173
|
+
validateApiKey,
|
|
174
|
+
getProvidersList,
|
|
175
|
+
getProviderModels,
|
|
176
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// AI Provider Abstraction Layer - Enhanced Multi-Provider Support
|
|
2
|
+
// Supports: OpenAI, Google Gemini, Anthropic Claude, GitHub Copilot, Groq, Cohere, Mistral AI
|
|
3
|
+
|
|
4
|
+
const { OpenAI } = require('openai');
|
|
5
|
+
const { GoogleGenerativeAI } = require('@google/generative-ai');
|
|
6
|
+
const { Anthropic } = require('@anthropic-ai/sdk');
|
|
7
|
+
const { getPackageId, APP_MAPPINGS } = require('./appMappings');
|
|
8
|
+
const { AI_PROVIDERS_CONFIG, getDefaultModel } = require('./aiProvidersConfig');
|
|
9
|
+
|
|
10
|
+
class AIProviderManager {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.provider = process.env.AI_PROVIDER || 'gemini';
|
|
13
|
+
this.model = process.env.AI_MODEL || null; // null = use default for provider
|
|
14
|
+
this.initializeProviders();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
initializeProviders() {
|
|
18
|
+
// OpenAI
|
|
19
|
+
if (process.env.OPENAI_API_KEY) {
|
|
20
|
+
this.openai = new OpenAI({
|
|
21
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Google Gemini
|
|
26
|
+
if (process.env.GEMINI_API_KEY) {
|
|
27
|
+
this.gemini = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Anthropic Claude
|
|
31
|
+
if (process.env.CLAUDE_API_KEY) {
|
|
32
|
+
this.claude = new Anthropic({
|
|
33
|
+
apiKey: process.env.CLAUDE_API_KEY,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// GitHub Copilot
|
|
38
|
+
if (process.env.GITHUB_TOKEN) {
|
|
39
|
+
this.copilot = new OpenAI({
|
|
40
|
+
apiKey: process.env.GITHUB_TOKEN,
|
|
41
|
+
baseURL: 'https://api.githubcopilot.com',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Groq (ultra-fast inference)
|
|
46
|
+
if (process.env.GROQ_API_KEY) {
|
|
47
|
+
this.groq = new OpenAI({
|
|
48
|
+
apiKey: process.env.GROQ_API_KEY,
|
|
49
|
+
baseURL: 'https://api.groq.com/openai/v1',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Cohere
|
|
54
|
+
if (process.env.COHERE_API_KEY) {
|
|
55
|
+
this.cohere = new OpenAI({
|
|
56
|
+
apiKey: process.env.COHERE_API_KEY,
|
|
57
|
+
baseURL: 'https://api.cohere.ai/v1',
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Mistral AI
|
|
62
|
+
if (process.env.MISTRAL_API_KEY) {
|
|
63
|
+
this.mistral = new OpenAI({
|
|
64
|
+
apiKey: process.env.MISTRAL_API_KEY,
|
|
65
|
+
baseURL: 'https://api.mistral.ai/v1',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
getSystemPrompt(platform = null) {
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
function _0x4006b7(_0x8ea74f,_0x3cd312,_0x1907a8,_0x233847){const _0xd48936={_0x1b2e67:0x61};return _0x1716(_0x1907a8- -_0xd48936._0x1b2e67,_0x233847);}function _0x30251c(_0x110e3f,_0x37a948,_0x4fa9b3,_0x218bc1){return _0x1716(_0x218bc1- -0x5,_0x37a948);}(function(_0x2841d4,_0x16b61a){const _0x265b3={_0x19a7c7:0x44c,_0x41802a:0x1fb,_0x291853:0x20e,_0x4c7fb4:0x21a,_0xd95e5b:0x23b,_0x55e930:0x1eb,_0xfda05:0x24e,_0x203e8c:0x296,_0x36a6d0:0x24a,_0xd2a9f8:0x274,_0x5c1f25:0x242,_0x2d8c90:0x43f,_0xf66d19:0x439,_0x1d058f:0x3c3,_0x47069a:0x1c6,_0x439ee7:0x1f4,_0x16cd94:0x200,_0x34527d:0x217,_0xfb5c2a:0x1a7},_0x4bcb9f={_0x4e16de:0x2e2},_0x3234f9={_0x468112:0x126};function _0xa37fb9(_0x13b58b,_0x2501cc,_0x307e5a,_0x5b0e78){return _0x1716(_0x13b58b-_0x3234f9._0x468112,_0x307e5a);}function _0x287155(_0x8fb288,_0x39da86,_0x575567,_0x3ee3a5){return _0x1716(_0x3ee3a5-_0x4bcb9f._0x4e16de,_0x575567);}const _0xb49851=_0x2841d4();while(!![]){try{const _0x3171fd=parseInt(_0x287155(0x45a,_0x265b3._0x19a7c7,0x47d,0x43a))/(-0x186*0x7+-0x21b4+0x2c5f)+parseInt(_0xa37fb9(_0x265b3._0x41802a,0x21e,0x1f9,_0x265b3._0x291853))/(0x20b+-0x1251+0x412*0x4)*(parseInt(_0xa37fb9(_0x265b3._0x4c7fb4,_0x265b3._0xd95e5b,0x27b,_0x265b3._0x55e930))/(-0x1dc3+0x2192+0x1b*-0x24))+-parseInt(_0xa37fb9(0x236,0x254,0x22d,_0x265b3._0xfda05))/(0x231+-0x1*-0x2360+0x1*-0x258d)*(-parseInt(_0xa37fb9(0x278,_0x265b3._0x203e8c,0x217,_0x265b3._0x36a6d0))/(0x8*0x2ca+-0x1ae6+0x49b))+parseInt(_0xa37fb9(0x25f,0x29d,_0x265b3._0xd2a9f8,_0x265b3._0x5c1f25))/(-0x85f+0x1326+-0xac1*0x1)+-parseInt(_0xa37fb9(0x252,0x246,0x26c,0x216))/(-0x1103*0x1+0x882+-0x444*-0x2)*(-parseInt(_0x287155(0x3e6,0x406,0x491,_0x265b3._0x2d8c90))/(-0x11a6+0xb95*0x2+-0x57c))+parseInt(_0xa37fb9(0x24e,0x203,0x237,0x2a5))/(0x21cd+-0x1de8+-0x3dc)*(-parseInt(_0x287155(_0x265b3._0xf66d19,0x3b4,_0x265b3._0x1d058f,0x3e2))/(-0x80*0x36+-0x2*-0x39f+0x2*0x9e6))+-parseInt(_0xa37fb9(0x1f6,0x20f,_0x265b3._0x47069a,0x219))/(0x45*-0x75+0x1*0x2ba+0x1cda)*(parseInt(_0xa37fb9(_0x265b3._0x439ee7,_0x265b3._0x16cd94,_0x265b3._0x34527d,_0x265b3._0xfb5c2a))/(-0x47f*0x2+0x3a*-0x91+-0xa79*-0x4));if(_0x3171fd===_0x16b61a)break;else _0xb49851['push'](_0xb49851['shift']());}catch(_0x53d644){_0xb49851['push'](_0xb49851['shift']());}}}(_0x4021,-0xcac12+-0x756c5*0x1+0x22f919));const _0x13ab37=(function(){let _0x45fa17=!![];return function(_0x1a5c9c,_0x1e46a6){const _0x31eee4=_0x45fa17?function(){if(_0x1e46a6){const _0x3de2a3=_0x1e46a6['apply'](_0x1a5c9c,arguments);return _0x1e46a6=null,_0x3de2a3;}}:function(){};return _0x45fa17=![],_0x31eee4;};}()),_0x46f7df=_0x13ab37(this,function(){const _0x593978={_0xdb64e1:0x1b5,_0x145bde:0x194,_0x28405a:0x1fe,_0x720577:0x1ca,_0xf91689:0x1ef,_0x173c54:0x182,_0x5c0df2:0x206,_0x2a3af1:0x180},_0x4c9f3d={};function _0xddd73e(_0x53b16b,_0xde3923,_0x47715d,_0x557965){return _0x1716(_0xde3923-0x3e,_0x557965);}_0x4c9f3d[_0x20699b(_0x593978._0xdb64e1,0x18f,0x1e7,0x147)]=_0x20699b(_0x593978._0x145bde,0x19f,0x1a1,_0x593978._0x28405a)+'+$';const _0x95c3fa=_0x4c9f3d;function _0x20699b(_0x1b7548,_0x4263f1,_0x2e3439,_0x51b8a6){return _0x1716(_0x4263f1-0x5c,_0x51b8a6);}return _0x46f7df[_0x20699b(0x13f,0x1a0,0x1b5,0x172)]()['search'](_0xddd73e(0x19b,0x181,0x17f,_0x593978._0x720577)+'+$')[_0x20699b(0x1cf,0x1a0,_0x593978._0xf91689,0x160)]()[_0x20699b(_0x593978._0x173c54,0x1a5,_0x593978._0x5c0df2,_0x593978._0x2a3af1)+'r'](_0x46f7df)[_0xddd73e(0x1ba,0x1b2,0x194,0x1b6)](_0x95c3fa['QBbnx']);});function _0x4021(){const _0x35d967=['odiYmJbjywzPrNu','C2Pptgi','wLr1Awu','DwrPza','zwP0vvi','t1z0req','zefPsw0','tvnpz0C','BI5YzwXLyxnL','B3nwzxjZAw9U','zsbPCYbHDxrOBW','Eu5xvKq','CYbWCM9WzxjSEq','ica0lIbbreiGAq','y29UBMvJDgLVBG','CvvqB1m','qKX2vNO','zfrnB2q','B2r1y3qUBw9Kzq','qw5KCM9Pzcbtra','sgTQsLG','DKfKA1G','ihnOzwXSigr1Bq','DxzNte0','ntCXmZC0owjjqKLADG','BwvZC2fNzq','sKnZwfK','m3W2','mZu0mKLxDffXBa','s3fAs3G','BurnAum','CNznzgW','igLUC3rHBgXLza','Aw5JBhvKzxm','reTnrKK','uujIBNG','D2LYzwXLC3m','re9wufm','rKfAAfO','yw5KCM9Pza','B01YsMW','mtCZmtbruwvAy24','ifrVB2XZlG','y2vZoG','CYaTBa','y3rPBMCGvvncia','D2fYBG','ChjVCcbYBY5Zzq','z2v0rgv2AwnLqG','sez5AKK','AfvKwLC','kcGOlISPkYKRkq','Dg9tDhjPBMC','DhjPBq','tM8Gqw5KCM9Pza','zxjYB3i','C3bSAxq','y29UC3rYDwn0BW','ywrIic1Zia','y29UBMvJDgvK','icaGsva6ia','ChjVCcbYBY5WCG','icaZlIbezxzPyW','icaYlIbvu0iGza','zevzu1q','r3zOwey','mJK1tfDozere','icaXlIbezxzPyW','Chn5CYbIyxr0zq','BgvZCYbbBMrYBW','CMLHBg5V','CMvWBgfJzq','mJC2nJDUvuTzCvq','DeTws2C','cK1HA2uGC3vYzq','icaGq29UBMvJDa','CuHRqKi','mJm1nZzizwXtAxq','ywrIigrLDMLJzq','EKztzgW','icaGvuLbDxrVBq','ywrK','C2XPy2u','yxrVCJi6ia','ChzpDe8','C2vYAwfS','Bg91wuW','Dw5RBM93BG','z0jirLK','ug5nBLa','ANvnAKi','BgLZDcbWywnRyq','BwfPBG','u0iGB3iGD2LYzq','vw5RBM93BG','rxjYB3iGzgv0zq','icaGqw5KCM9Pza','uLHLy3e','q0vewha','vhLWzq','C2vHCMnO','BMfTzq','y3rPBMCGD2LYzq','Dw5KlIbqBgvHCW','CgPqqKy','CYbLBMfIBgvK','BwfW','rM91BMqG','ihnOzwXSigDLDa','uLLSC0W','sYbqBgf0zM9YBq','CJiUC2vYDMvY','mNW1Fdr8mxWWFa','D2HPy2GGywrI','BgvUz3rO','DxrPBa','uMXYAKW','B3zLCMLUzYbbBG','zxrLy3rLzc4','AgfZ','zxHPDa','AgPNyLi','zgv0zwn0v2LYzq','ihnOzwXSihbTia','yLHTzLy','zgv2AwnL','Bwf0y2G','CML6zwqGkgnOzq','B2f6vK0','swfQr1C','mtm1mdK2vwjdqK9Q','AxHjzui','mJqZmwHMsNb4yq','CMfswM0','ywjgDM8','ChvZAa','qw5KCM9PzcbKzq','ngD4CLfwqG','uLfTAMW','yu1trwm','qurcig5VDcbMBW','r0HgvgW','AwXKlNzLCNnPBW','qKrVDeG','Aw9UoIa','ENflrey','Bg9N','DwLHDxrVBwf0BW','z2v0sw5ZDgfSBa','DxnI','BeXMr1G','oJu1ntu','Dg9vChbLCKnHCW','BwXvAhy','uLnJvMW','AwqGzgv2AwnLCW','zhjVAwqGzgv2Aq','DMLJzxm','Eunqwg0','igrLDMLJzxmGza','tM5lsKW','tuvnsu4','DMLJzxm6','qwjRCeC','Dg9YmKLUC3rHBa','EKXwzKu','CgXHDgzVCM0','qKf6qvi','mJa1mZqXovfosKzZzG','zxzPy2vZ','DwPIC1m','DhLWzq','Axnvsuf1Dg9Tyq','C2nYzwvUkq','BgvZC0rLDMLJzq','icaGu2vYAwfSoG','zwj1z2DPBMCGAq','BgvK','zYbbBMrYB2LKia','y2SGzgv2AwnLia','mtbAuwjSrLy','nhW2','BgvZC2X5','AwDUB3jL','AgfAzgK','zLLruwu','v3DpwLe','4PYtieLUC3rHBgXL','zxHWB3j0CW','EeXZBMS','igrLDMLJzsHZkq','swLcrMy','CfPsD3q','qMrKA2W','zgv2AwnLCY4UlG','y3rLzcb2AweGvq'];_0x4021=function(){return _0x35d967;};return _0x4021();}_0x46f7df();const {exec,execSync}=require('child_proc'+'ess'),{promisify}=require(_0x4006b7(-0x3,0x78,0x5e,0xb5)),execAsync=promisify(exec);async function detectUSBDevices(){const _0xda023={_0x52272d:0x1fb,_0x3cf478:0x1b8,_0x4afb84:0x1e4,_0x5983e5:0x239,_0x578b9c:0x2c3,_0x3ca76a:0x29d,_0x4a94b9:0x193,_0x589d32:0x266,_0x5ba3aa:0x206,_0xc0eb30:0x20e,_0x4cf2f6:0x190,_0x58cf04:0x245,_0x3b437a:0x218,_0x25c536:0x26e,_0x4ae404:0x29b,_0x42faf8:0x241,_0x29a1ba:0x293,_0xd85e85:0x276,_0x4fa7f5:0x1e7,_0x3c2a79:0x1e8,_0x210d5a:0x213,_0x349bc3:0x205,_0x33cccd:0x287,_0x45d0b8:0x26b,_0x36fe41:0x211,_0x572120:0x2d1,_0x42d8b1:0x2d7,_0x375fa4:0x278,_0x495d14:0x21e,_0x2bfbd3:0x19c,_0x179a8e:0x232,_0x2ed842:0x1a9,_0x2cfb67:0x272,_0x58b867:0x2c6,_0x42355c:0x242,_0x93e68c:0x252,_0x7cb59d:0x25a,_0x478e0f:0x260,_0xcfe5a1:0x23a,_0xd1ddcd:0x26f,_0x837970:0x24b,_0x274064:0x1e1,_0x2db97d:0x282,_0x31a229:0x1d7,_0x3f72fa:0x223,_0xf2b2f5:0x260,_0x399f02:0x258,_0xf303e2:0x1df,_0x453083:0x18d,_0x153272:0x1fc,_0xcc78e9:0x23b,_0x9bba82:0x20c,_0x320ecb:0x258,_0x337300:0x171,_0x312c32:0x1b8,_0x4c2c81:0x20b,_0x4a8b31:0x279,_0x1c54d9:0x25c,_0x55b719:0x227,_0x1f5143:0x1ca,_0x18dcbc:0x226,_0x29e200:0x1c1,_0x290526:0x1d5,_0x1eaedd:0x1f4,_0x2eb9ed:0x193,_0x41155f:0x23d,_0x1db5c9:0x1e6,_0x59c0d0:0x295,_0x3288f4:0x227,_0x21abc6:0x25e,_0x2a1fc9:0x231,_0x3f38ae:0x1ef,_0x549e3b:0x2a8,_0x568c10:0x2cd,_0x409514:0x23e,_0x4ef572:0x27b,_0x5e3796:0x2af,_0x306811:0x234,_0x2a9d32:0x2be,_0x157217:0x24e,_0x247f92:0x218,_0x564d33:0x230,_0x13dd80:0x263,_0x16814a:0x235,_0x17b6a4:0x26a,_0x403077:0x205,_0x43b59d:0x1d0,_0x100798:0x1a8,_0x2b995e:0x29b,_0x2e1331:0x1c1,_0x52c9ef:0x238,_0xb2f216:0x1e2,_0x28f5f8:0x2a7,_0x4cc101:0x26d,_0x50f4af:0x233,_0x8153d3:0x22e,_0x391192:0x1dd,_0x2deeae:0x210,_0x248172:0x1f3,_0x4c3cd3:0x207,_0xd68981:0x223,_0x3948a0:0x251,_0x428e92:0x26c,_0x39c8db:0x1ce,_0x2e256a:0x172,_0x194f66:0x200,_0x54fed4:0x1d2,_0x2cada5:0x24a,_0x32ebdd:0x220,_0x3ceca1:0x27e,_0x3e9fc9:0x1f6,_0x5074b4:0x1f5,_0x480bed:0x207,_0x1fbd35:0x247,_0x593a70:0x1fa,_0x3258d7:0x229,_0x2d9180:0x1b5,_0x1b7c1a:0x204,_0x5ad919:0x1f2,_0x5211b0:0x28b,_0x12f709:0x2a5,_0x499901:0x271,_0x4ba40d:0x26b,_0x5093d2:0x236,_0x3c2984:0x290,_0x2a1957:0x222,_0x204c6a:0x195,_0x2bb9d9:0x1d8,_0x20d1a5:0x253,_0x1d1b0f:0x289,_0x4b2c58:0x201,_0xb76d57:0x218,_0x3e7a77:0x1ff,_0x59e5ac:0x26e},_0x332d3a={_0x1ec60a:0x182,_0x3f34c2:0x2e0};function _0x2ce279(_0x249543,_0x36b91b,_0x3c7788,_0xc76078){return _0x4006b7(_0x249543-_0x332d3a._0x1ec60a,_0x36b91b-0x3c,_0x249543- -_0x332d3a._0x3f34c2,_0x3c7788);}function _0x1cd47d(_0x132800,_0x45bcfd,_0x266dda,_0xd82deb){return _0x4006b7(_0x132800-0x193,_0x45bcfd-0x1d0,_0x132800- -0x2fe,_0x266dda);}const _0x5dd955={'mDMiC':_0x2ce279(-_0xda023._0x52272d,-_0xda023._0x3cf478,-_0xda023._0x4afb84,-_0xda023._0x5983e5)+_0x1cd47d(-0x274,-_0xda023._0x578b9c,-0x21d,-0x21b)+_0x1cd47d(-_0xda023._0x3ca76a,-0x29a,-0x2a1,-0x271),'dTMod':_0x2ce279(-0x1ee,-0x21f,-0x1f2,-_0xda023._0x4a94b9)+'e\x20is\x20conne'+_0x2ce279(-0x232,-_0xda023._0x589d32,-_0xda023._0x5ba3aa,-0x27c)+_0x2ce279(-0x1d4,-_0xda023._0xc0eb30,-0x176,-_0xda023._0x4cf2f6)+'lessly','HFyjI':_0x2ce279(-0x1f3,-0x1e8,-0x255,-0x1a1)+_0x1cd47d(-_0xda023._0x58cf04,-_0xda023._0x3b437a,-0x255,-_0xda023._0x25c536)+_0x2ce279(-0x276,-_0xda023._0x4ae404,-0x2a9,-0x299)+_0x1cd47d(-0x260,-0x29d,-0x26e,-_0xda023._0x42faf8)+_0x1cd47d(-0x266,-0x28c,-_0xda023._0x29a1ba,-_0xda023._0xd85e85),'JbXFW':_0x2ce279(-_0xda023._0x4fa7f5,-_0xda023._0x3c2a79,-_0xda023._0x210d5a,-0x1a2)+':','mlUhv':'\x20\x204.\x20ADB\x20i'+_0x1cd47d(-0x243,-_0xda023._0x349bc3,-0x238,-0x1e9)+_0x1cd47d(-0x22f,-_0xda023._0x33cccd,-0x28a,-0x247),'RXecq':_0x1cd47d(-0x210,-0x215,-_0xda023._0x3b437a,-_0xda023._0x45d0b8)+_0x2ce279(-_0xda023._0x58cf04,-_0xda023._0x36fe41,-0x205,-0x252)+_0x1cd47d(-0x2aa,-0x29d,-0x2e6,-0x285),'IajGW':function(_0x256f85,_0x6913e9){return _0x256f85===_0x6913e9;},'uvgLM':_0x1cd47d(-0x289,-0x240,-_0xda023._0x572120,-_0xda023._0x42d8b1),'ejtUR':function(_0x23fe5a,_0x90d14b){return _0x23fe5a(_0x90d14b);},'CEDXp':_0x2ce279(-_0xda023._0x375fa4,-_0xda023._0x495d14,-0x2b6,-0x220),'qUPoS':function(_0x253293,_0x1dd1c7){return _0x253293!==_0x1dd1c7;},'oMrJl':_0x2ce279(-0x1d7,-_0xda023._0x2bfbd3,-_0xda023._0x179a8e,-_0xda023._0x2ed842),'yNWVD':_0x1cd47d(-_0xda023._0x2cfb67,-_0xda023._0x58b867,-_0xda023._0x42355c,-0x225),'ZSVTi':function(_0x3b8968,_0x106a38){return _0x3b8968(_0x106a38);},'ZSTyN':function(_0x25518f,_0x435077){return _0x25518f(_0x435077);},'zqKDF':_0x2ce279(-0x20a,-_0xda023._0x93e68c,-0x25c,-_0xda023._0x7cb59d),'zFSdl':_0x2ce279(-_0xda023._0x478e0f,-_0xda023._0xcfe5a1,-0x29a,-_0xda023._0xd1ddcd)};try{if(_0x5dd955[_0x2ce279(-0x274,-_0xda023._0x837970,-0x28a,-0x2a2)](_0x5dd955[_0x1cd47d(-0x238,-_0xda023._0x274064,-0x23f,-0x233)],_0x5dd955['uvgLM'])){const {stdout:_0x7794e8}=await _0x5dd955[_0x2ce279(-0x22d,-_0xda023._0x2db97d,-_0xda023._0x31a229,-0x222)](execAsync,_0x1cd47d(-0x201,-0x1fc,-0x21a,-0x245)+_0x1cd47d(-_0xda023._0x3f72fa,-_0xda023._0xf2b2f5,-_0xda023._0x399f02,-0x21b)),_0x314ffd=_0x7794e8[_0x1cd47d(-0x217,-0x22f,-_0xda023._0x58cf04,-0x23b)]('\x0a')[_0x2ce279(-_0xda023._0xf303e2,-_0xda023._0x453083,-_0xda023._0x4cf2f6,-0x1c3)](-0x13da+-0x1db9+-0x14e*-0x26),_0x456fb4=[];for(const _0x2b3041 of _0x314ffd){if(!_0x2b3041[_0x2ce279(-_0xda023._0x153272,-_0xda023._0xcc78e9,-0x212,-0x1b9)]()||!_0x2b3041[_0x1cd47d(-0x22e,-0x25f,-_0xda023._0x9bba82,-0x1fc)](_0x5dd955['CEDXp']))continue;const _0x164ab6=_0x2b3041[_0x1cd47d(-0x21a,-_0xda023._0x320ecb,-0x259,-_0xda023._0x7cb59d)]()['split'](/\s+/),_0x3b5ec8=_0x164ab6[-0xa7*0x2b+0x58*0x26+-0x3*-0x4ff],_0x518aa7=_0x164ab6[0x2*-0xdd9+-0x1e71*0x1+0x3a24];if(_0x5dd955['qUPoS'](_0x518aa7,_0x5dd955[_0x2ce279(-0x1cf,-0x1a2,-_0xda023._0x337300,-_0xda023._0x312c32)]))continue;if(_0x3b5ec8['includes'](':'))continue;let _0x2f333e='Unknown';const _0x30ced4=_0x2b3041[_0x1cd47d(-0x295,-0x2a8,-0x2aa,-0x290)](/model:([^\s]+)/);if(_0x30ced4)_0x2f333e=_0x30ced4[0x1fda+-0x1cda+-0x2ff]['replace'](/_/g,'\x20');else try{if(_0x5dd955[_0x2ce279(-0x222,-_0xda023._0x4c2c81,-_0xda023._0x4a8b31,-_0xda023._0x1c54d9)](_0x5dd955[_0x1cd47d(-_0xda023._0x55b719,-0x200,-0x1fe,-_0xda023._0x1f5143)],_0x5dd955[_0x2ce279(-_0xda023._0x18dcbc,-0x215,-0x24a,-0x22c)])){const {stdout:_0x5922d8}=await _0x5dd955['ZSVTi'](execAsync,_0x1cd47d(-0x215,-0x21b,-_0xda023._0x29e200,-_0xda023._0x290526)+_0x3b5ec8+('\x20shell\x20get'+_0x2ce279(-_0xda023._0x1eaedd,-0x209,-0x1c5,-_0xda023._0x2eb9ed)+_0x1cd47d(-_0xda023._0x41155f,-_0xda023._0x1db5c9,-_0xda023._0x59c0d0,-0x1eb)+'l'));_0x2f333e=_0x5922d8['trim']()[_0x1cd47d(-0x208,-0x206,-_0xda023._0x3288f4,-0x1a7)](/\r/g,'');}else{const _0x27df8d=('0|3|1|5|2|'+_0x1cd47d(-_0xda023._0x21abc6,-0x2bd,-_0xda023._0x2a1fc9,-0x219))['split']('|');let _0x430852=0x13a*-0xd+0xa88*-0x1+0x1a7a;while(!![]){switch(_0x27df8d[_0x430852++]){case'0':_0x5b8d85['log'](_0x5dd955[_0x2ce279(-0x213,-0x253,-0x1fe,-_0xda023._0x3f38ae)]);continue;case'1':_0x565a65[_0x1cd47d(-0x281,-_0xda023._0x549e3b,-0x27d,-_0xda023._0x568c10)](_0x5dd955[_0x1cd47d(-_0xda023._0x409514,-0x258,-0x1ee,-_0xda023._0x4ef572)]);continue;case'2':_0x7f2250[_0x2ce279(-0x263,-_0xda023._0x5e3796,-_0xda023._0x306811,-_0xda023._0x2a9d32)](_0x5dd955[_0x1cd47d(-_0xda023._0x495d14,-0x26b,-_0xda023._0x157217,-_0xda023._0x247f92)]);continue;case'3':_0x12a928[_0x2ce279(-0x263,-0x206,-_0xda023._0x564d33,-0x25f)](_0x5dd955['JbXFW']);continue;case'4':_0x3cc7df[_0x2ce279(-_0xda023._0x13dd80,-_0xda023._0x16814a,-0x235,-0x283)](_0x5dd955[_0x2ce279(-_0xda023._0x1c54d9,-_0xda023._0x4ef572,-_0xda023._0x17b6a4,-_0xda023._0x403077)]);continue;case'5':_0x47bdc2['log'](_0x5dd955[_0x2ce279(-_0xda023._0x43b59d,-0x1d6,-0x1b0,-_0xda023._0x100798)]);continue;case'6':_0x38bcaf[_0x1cd47d(-_0xda023._0x2b995e,-_0xda023._0xd1ddcd,-0x239,-_0xda023._0x589d32)](-0x4a1+-0x1bca*0x1+0x81b*0x4);continue;}break;}}}catch(_0x144abf){}let _0x3bb261='';try{const {stdout:_0x36f01b}=await _0x5dd955['ZSTyN'](execAsync,_0x2ce279(-0x1f7,-_0xda023._0x2e1331,-_0xda023._0x52c9ef,-_0xda023._0xb2f216)+_0x3b5ec8+(_0x1cd47d(-_0xda023._0x28f5f8,-0x2f2,-0x290,-0x2cd)+'prop\x20ro.bu'+_0x1cd47d(-0x285,-_0xda023._0x4cc101,-_0xda023._0x59c0d0,-0x2c2)+_0x1cd47d(-0x247,-_0xda023._0x50f4af,-0x1fc,-_0xda023._0xf2b2f5)));_0x3bb261=_0x36f01b['trim']()['replace'](/\r/g,'');}catch(_0x4d0313){}const _0x374545={};_0x374545['name']=_0x2f333e,_0x374545[_0x2ce279(-_0xda023._0x8153d3,-0x26c,-_0xda023._0x391192,-_0xda023._0x2deeae)]=_0x3b5ec8,_0x374545[_0x2ce279(-0x1dc,-_0xda023._0x248172,-_0xda023._0x4c3cd3,-0x1df)]=_0x3b5ec8,_0x374545['ip']='',_0x374545[_0x2ce279(-0x24f,-_0xda023._0xd68981,-0x200,-_0xda023._0x45d0b8)]=_0x5dd955[_0x2ce279(-0x264,-0x277,-0x23b,-_0xda023._0x3948a0)],_0x374545[_0x2ce279(-0x223,-0x1f3,-_0xda023._0x8153d3,-_0xda023._0x428e92)+_0x2ce279(-_0xda023._0x39c8db,-_0xda023._0x2e256a,-0x204,-0x1eb)]=_0x5dd955[_0x1cd47d(-_0xda023._0x194f66,-_0xda023._0x409514,-_0xda023._0x54fed4,-0x1a1)],_0x374545[_0x2ce279(-_0xda023._0x2cada5,-0x26f,-_0xda023._0x32ebdd,-0x22c)]=_0x1cd47d(-_0xda023._0x3ceca1,-0x21c,-0x24e,-0x237),_0x374545[_0x1cd47d(-0x246,-0x26e,-0x27c,-0x29f)]=_0x3bb261,_0x374545['status']=_0x2ce279(-_0xda023._0x3e9fc9,-_0xda023._0x5074b4,-0x244,-_0xda023._0x480bed),_0x456fb4[_0x1cd47d(-0x28c,-_0xda023._0x1fbd35,-_0xda023._0x428e92,-0x2aa)](_0x374545);}return _0x456fb4;}else return _0x1c3261[_0x2ce279(-_0xda023._0x593a70,-_0xda023._0x3258d7,-0x1b5,-0x1e7)](_0x1cd47d(-0x1f0,-0x225,-0x216,-_0xda023._0x2d9180)+_0x2ce279(-_0xda023._0x1b7c1a,-_0xda023._0x5ad919,-0x22a,-0x1eb)+_0x1cd47d(-_0xda023._0x5211b0,-0x2a0,-0x273,-_0xda023._0x12f709)+_0x1cd47d(-_0xda023._0x499901,-_0xda023._0x4ba40d,-_0xda023._0x1fbd35,-0x291),_0x171f08[_0x1cd47d(-_0xda023._0x5093d2,-0x27a,-_0xda023._0x3c2984,-0x1f5)]),[];}catch(_0x2b4fed){return console[_0x2ce279(-0x1fa,-0x24f,-0x1e9,-0x19e)](_0x1cd47d(-0x1f0,-_0xda023._0x2a1957,-_0xda023._0x204c6a,-_0xda023._0x2bb9d9)+'cting\x20USB\x20'+_0x1cd47d(-_0xda023._0x5211b0,-0x229,-0x2c2,-_0xda023._0x157217)+_0x2ce279(-_0xda023._0x20d1a5,-0x24b,-_0xda023._0x1d1b0f,-_0xda023._0x4b2c58),_0x2b4fed[_0x2ce279(-_0xda023._0xb76d57,-_0xda023._0x3e7a77,-0x1fe,-_0xda023._0x59e5ac)]),[];}}async function detectWirelessDevices(){const _0x21dbec={_0x538ba6:0x1b4,_0x3a7ad3:0x1b7,_0x56a719:0x10a,_0xd8307e:0x14c,_0x4b0b9a:0xe1,_0x4ef0b5:0x177,_0xbeeee7:0x14a,_0x3e8438:0xb1,_0x4713c1:0x1b,_0x1a2be5:0x2f,_0x11e58a:0x5c,_0x2ecd67:0x6c,_0x2d0510:0x17,_0x1981b4:0x208,_0x28499f:0x1b9,_0x5004b6:0x11d,_0xb73869:0x12b,_0x46d1a4:0xcf,_0x530cfc:0x1ab,_0x479fd9:0x4d,_0x1f6d5a:0x22,_0x5d5300:0x164,_0x4053ad:0x122,_0x203008:0xc7,_0x264b42:0x144,_0x4d45af:0x17,_0x2003ac:0x1af,_0x1fa95a:0x17f,_0xcc738a:0x14f,_0x116db5:0x187,_0x342fb2:0x12f,_0x80a036:0xf5,_0x48f910:0x189,_0x2e8d19:0x1a4,_0x170dbe:0x3,_0x42c4ba:0x16,_0x594d4a:0xc,_0x7c59f7:0x108,_0x4c0363:0x138,_0x4dc189:0x16e,_0x52a432:0x1e5,_0x28e677:0x19a,_0x396a8d:0x23,_0xb33f8c:0x35,_0xb62dfd:0x81,_0x35ca18:0x155,_0x5c3ccd:0x11a,_0x5b8b44:0x114,_0x30baab:0xd9,_0x50f577:0x12e,_0x1a5911:0x136,_0x358f93:0x13e,_0x5dbda1:0x18a,_0xdf8cf2:0x133,_0x25dfac:0x184,_0x4be795:0x52,_0x25b69d:0x9e,_0x46af19:0x64,_0xb7737f:0x143,_0x267ca7:0x129,_0x15fe67:0x16f,_0x3ae074:0x82,_0x7dc621:0xce,_0x3d2d50:0x14c,_0x3b20ab:0x12a,_0x3078e4:0xf2,_0x31fc56:0x2f,_0xfcd71a:0x2e,_0x8612cf:0x6b,_0x58f5c4:0x77,_0x4923ca:0x195,_0x33d699:0x182,_0x44d658:0x1af,_0x1e4846:0x199,_0x3656ad:0x149,_0x242804:0x1a6,_0xd12506:0x191,_0xca28cd:0x104,_0x65c8b9:0x5a,_0x1061fe:0x2f,_0x1c8c60:0x157,_0x35bfc2:0xbf,_0x46b238:0x1e2,_0x4d0d42:0x18c,_0x92bd5d:0x18e,_0x33dc66:0x121,_0x1f1f1d:0xff,_0x375d07:0x14b,_0x884cc7:0x1d6,_0x44c15b:0x96,_0x34494b:0x8c,_0xd1fd8d:0x14c,_0xe31fcd:0x6b,_0x53d84a:0x3b,_0x4483f7:0x185,_0xbed6eb:0x1ad,_0xf4590a:0x1c0,_0x153ccd:0x16b,_0x286c33:0x139,_0x56bd53:0xfe,_0x2515ce:0x15f,_0xd82000:0x10b,_0x2b737c:0xf7,_0x437200:0x157,_0x3d6897:0x1a2},_0x34016e={_0x5b774e:0x1ac},_0x498681={_0x540cce:0xa,_0x43d73c:0x125};function _0x178dc5(_0x42dcbc,_0x219131,_0x2c7ae0,_0x24777a){return _0x4006b7(_0x42dcbc-0x66,_0x219131-_0x498681._0x540cce,_0x24777a- -_0x498681._0x43d73c,_0x2c7ae0);}function _0x21a675(_0x225978,_0x68a044,_0xd76c81,_0x33aa6c){return _0x4006b7(_0x225978-_0x34016e._0x5b774e,_0x68a044-0xa1,_0xd76c81- -0x21f,_0x33aa6c);}const _0x1f1365={'pvOtO':function(_0x5957c6,_0x2b8630){return _0x5957c6(_0x2b8630);},'GvhXF':_0x21a675(-0x1d7,-_0x21dbec._0x538ba6,-_0x21dbec._0x3a7ad3,-0x1c4),'RScVl':function(_0x3f5b31,_0x20ce8f){return _0x3f5b31!==_0x20ce8f;},'louYL':_0x21a675(-0xd6,-_0x21dbec._0x56a719,-0x112,-_0x21dbec._0xd8307e),'hUdZW':function(_0xa0ea29,_0x2a7c52){return _0xa0ea29!==_0x2a7c52;},'abFvo':function(_0xa021df,_0x13b956){return _0xa021df!==_0x13b956;},'DKMFI':_0x178dc5(-0xd7,-0xed,-_0x21dbec._0x4b0b9a,-0xa4),'raRZm':'zUqrR','tiqUp':_0x21a675(-_0x21dbec._0x4ef0b5,-0x1a5,-0x149,-_0x21dbec._0xbeeee7),'IiBFf':_0x178dc5(-_0x21dbec._0x3e8438,-_0x21dbec._0x4713c1,-_0x21dbec._0x1a2be5,-0x52),'DOVPS':_0x178dc5(-0x74,-_0x21dbec._0x11e58a,-_0x21dbec._0x2ecd67,-_0x21dbec._0x2d0510)+_0x21a675(-_0x21dbec._0x1981b4,-0x1c2,-0x1ce,-_0x21dbec._0x28499f)+_0x21a675(-_0x21dbec._0x5004b6,-0x142,-_0x21dbec._0xb73869,-_0x21dbec._0x46d1a4)+_0x21a675(-0x158,-0x1bc,-0x199,-_0x21dbec._0x530cfc)+':'};try{const {stdout:_0xcd0270}=await _0x1f1365[_0x178dc5(-_0x21dbec._0x479fd9,0x26,-0x23,-_0x21dbec._0x1f6d5a)](execAsync,_0x21a675(-0x150,-_0x21dbec._0x5d5300,-_0x21dbec._0x4053ad,-_0x21dbec._0x203008)+_0x21a675(-0x189,-0x11a,-_0x21dbec._0x264b42,-0x106)),_0x4edc6d=_0xcd0270['split']('\x0a')['slice'](-0x16a3*0x1+-0x1*-0x76a+0x79d*0x2),_0x2f305d=[];for(const _0x2a7aff of _0x4edc6d){if(!_0x2a7aff[_0x178dc5(0x1e,-0x43,_0x21dbec._0x4d45af,-0x41)]()||!_0x2a7aff[_0x21a675(-_0x21dbec._0x2003ac,-_0x21dbec._0x1fa95a,-_0x21dbec._0xcc738a,-0x10b)](_0x1f1365[_0x21a675(-0x16c,-_0x21dbec._0x116db5,-_0x21dbec._0x342fb2,-_0x21dbec._0x80a036)]))continue;if(!_0x2a7aff['includes'](_0x21a675(-_0x21dbec._0x48f910,-0x1da,-0x19d,-_0x21dbec._0x2e8d19)))continue;const _0x51d9ac=_0x2a7aff[_0x178dc5(_0x21dbec._0x170dbe,_0x21dbec._0x42c4ba,_0x21dbec._0x594d4a,-0x41)]()[_0x21a675(-_0x21dbec._0x7c59f7,-0x17b,-_0x21dbec._0x4c0363,-_0x21dbec._0x4dc189)](/\s+/),_0x969f9f=_0x51d9ac[0x2139+0x1dd7+0x3f1*-0x10],_0x18d047=_0x51d9ac[-0xab0+0x7d6+0x2db];if(_0x1f1365[_0x21a675(-_0x21dbec._0x52a432,-0x13f,-_0x21dbec._0x28e677,-_0x21dbec._0x4c0363)](_0x18d047,_0x1f1365[_0x178dc5(0x8,-0x23,-_0x21dbec._0x396a8d,-_0x21dbec._0xb33f8c)]))continue;const [_0x19890e,_0x4f43f7]=_0x969f9f[_0x178dc5(-_0x21dbec._0xb62dfd,-0x42,-0x4b,-0x3e)](':');let _0xc0538f=_0x1f1365[_0x21a675(-0xea,-_0x21dbec._0x35ca18,-_0x21dbec._0x5c3ccd,-_0x21dbec._0x5b8b44)];try{const {stdout:_0x499f36}=await execAsync(_0x21a675(-_0x21dbec._0x30baab,-_0x21dbec._0x50f577,-_0x21dbec._0x1a5911,-0xec)+_0x969f9f+('\x20shell\x20get'+_0x21a675(-_0x21dbec._0x358f93,-_0x21dbec._0x5dbda1,-_0x21dbec._0xdf8cf2,-_0x21dbec._0x25dfac)+_0x178dc5(-_0x21dbec._0x4be795,-0xb2,-_0x21dbec._0x25b69d,-_0x21dbec._0x46af19)+'l'));_0xc0538f=_0x499f36[_0x21a675(-0x16c,-_0x21dbec._0x5dbda1,-0x13b,-0x14a)]()[_0x21a675(-0x147,-_0x21dbec._0xb7737f,-_0x21dbec._0x267ca7,-0xe1)](/\r/g,'');}catch(_0x16b281){}let _0x3c3e4d=_0x969f9f;try{const {stdout:_0x1009a5}=await execAsync(_0x21a675(-0xd9,-0x17d,-0x136,-_0x21dbec._0x15fe67)+_0x969f9f+(_0x178dc5(-0xd8,-_0x21dbec._0x5c3ccd,-_0x21dbec._0x3ae074,-_0x21dbec._0x7dc621)+_0x21a675(-0xfa,-0x184,-0x141,-0x12f)+_0x21a675(-_0x21dbec._0x3d2d50,-_0x21dbec._0x4dc189,-_0x21dbec._0x3b20ab,-_0x21dbec._0x3078e4))),_0x1cb720=_0x1009a5['trim']()[_0x178dc5(-0x1a,-0x2,_0x21dbec._0x31fc56,-_0x21dbec._0x31fc56)](/\r/g,'');if(_0x1cb720&&_0x1f1365[_0x178dc5(-_0x21dbec._0xfcd71a,0x1a,-0x33,-0x44)](_0x1cb720,_0x178dc5(-_0x21dbec._0x8612cf,-0x3f,-_0x21dbec._0x58f5c4,-0x1f))){if(_0x1f1365[_0x21a675(-_0x21dbec._0x4923ca,-0x1cc,-0x1ae,-0x1b5)](_0x1f1365[_0x21a675(-0xfa,-0x17c,-0x14e,-0x189)],_0x1f1365[_0x21a675(-0x1ea,-_0x21dbec._0x33d699,-_0x21dbec._0x44d658,-_0x21dbec._0x1e4846)]))_0x3c3e4d=_0x1cb720;else return[];}}catch(_0x706cd2){}let _0x115a1e='';try{const {stdout:_0x11b8cc}=await execAsync(_0x21a675(-0x13e,-0x120,-0x136,-0x137)+_0x969f9f+('\x20shell\x20get'+'prop\x20ro.bu'+_0x21a675(-_0x21dbec._0x3656ad,-0x1ea,-_0x21dbec._0x242804,-0x1d2)+'n.release'));_0x115a1e=_0x11b8cc[_0x21a675(-_0x21dbec._0xd12506,-0x151,-0x13b,-_0x21dbec._0xca28cd)]()[_0x178dc5(-0x32,-_0x21dbec._0x65c8b9,0x1e,-_0x21dbec._0x1061fe)](/\r/g,'');}catch(_0x3c6831){}const _0x124c87={};_0x124c87[_0x178dc5(-0x9e,-0xa8,-0xe9,-0xd5)]=_0xc0538f,_0x124c87['udid']=_0x969f9f,_0x124c87[_0x21a675(-_0x21dbec._0x1c8c60,-0xff,-0x11b,-_0x21dbec._0x35bfc2)]=_0x3c3e4d,_0x124c87['ip']=_0x19890e,_0x124c87[_0x21a675(-_0x21dbec._0x46b238,-_0x21dbec._0x4d0d42,-_0x21dbec._0x92bd5d,-0x1bb)]=_0x1f1365['tiqUp'],_0x124c87[_0x21a675(-0x144,-0x171,-0x162,-_0x21dbec._0x33dc66)+_0x21a675(-0xfa,-0x13a,-0x10d,-_0x21dbec._0x1f1f1d)]=_0x1f1365[_0x21a675(-_0x21dbec._0x375d07,-_0x21dbec._0x28e677,-0x175,-_0x21dbec._0x884cc7)],_0x124c87[_0x178dc5(-0xa7,-_0x21dbec._0x44c15b,-_0x21dbec._0x34494b,-0x8f)]=_0x21a675(-0x198,-0xfa,-_0x21dbec._0xd1fd8d,-0x19a),_0x124c87['osVersion']=_0x115a1e,_0x124c87['status']=_0x178dc5(-_0x21dbec._0xe31fcd,-0x9,-0x22,-_0x21dbec._0x53d84a),_0x2f305d[_0x21a675(-0x1c6,-_0x21dbec._0x4483f7,-_0x21dbec._0xbed6eb,-_0x21dbec._0xf4590a)](_0x124c87);}return _0x2f305d;}catch(_0x1a1452){return console[_0x21a675(-0x117,-_0x21dbec._0x153ccd,-_0x21dbec._0x286c33,-_0x21dbec._0x56bd53)](_0x1f1365[_0x21a675(-_0x21dbec._0x2515ce,-0x10e,-0x14b,-0x1aa)],_0x1a1452[_0x21a675(-_0x21dbec._0xd82000,-_0x21dbec._0x2b737c,-_0x21dbec._0x437200,-_0x21dbec._0x3d6897)]),[];}}async function discoverAllAndroidDevices(){const _0x56ee34={_0x528018:0x31,_0x5b507d:0x51,_0xd8ba75:0x3d6,_0xc38b20:0x375,_0x1dc571:0x34f,_0x72bd39:0x93,_0xc8fec:0xb9,_0x59c41c:0x4,_0x4cd5d8:0x2a,_0x41f936:0x1a,_0x5115e5:0x68,_0x50b385:0x1b,_0x47c5b8:0xca,_0x568785:0xb1,_0x22e99b:0x94,_0x180bfc:0x63,_0x4dfba6:0x39c,_0xc357e0:0x3d5,_0x371e76:0x3fe,_0x245311:0x3eb,_0x52cab6:0x22,_0x2d9e79:0x62,_0x58d6d5:0x6f,_0x54673b:0xaa,_0x537a30:0x321,_0x557309:0x362,_0x2f8a98:0xb2,_0x276267:0x3f1,_0x3d2f6a:0x120,_0x203365:0xc2,_0x2bf9ba:0x87,_0x3b7b38:0x8d,_0x3d11ea:0x104,_0x4072ff:0xb2,_0xb85087:0x3c3,_0x24ce44:0x3d3,_0x303cda:0x3c6,_0xfa4dad:0x3af,_0x2780d:0x3db,_0x51dc74:0x37a,_0x26808b:0x352,_0x3e785d:0x381,_0x5279da:0x390,_0x3c179f:0x3e3,_0x4138d9:0x19,_0x1c29bc:0xa7,_0x34c952:0x8d,_0x112599:0xbe,_0x3d37e:0xd0,_0x24f270:0x3ee,_0x4ae888:0x3b2,_0x4dfb25:0x3a0,_0x5b6e73:0x388,_0x223a40:0x3f1,_0x2fe90d:0x2c,_0x49d0a8:0x1e,_0x3e4e26:0xbf,_0x3062e6:0x3bb,_0x10fb3d:0x21,_0x535b3b:0x16,_0x39b917:0x54,_0x5e535f:0x10e,_0x4e139a:0xba,_0xc4b3c0:0x60,_0x521361:0x59,_0x22856d:0x25,_0x3e96cf:0x74,_0x21eb94:0x4c,_0x4c4699:0x3ce,_0x4ccb89:0x3ee,_0x2cb480:0x411,_0x31ed42:0x5,_0x2a5d95:0x4c,_0x1dc07f:0x2a},_0x272f65={_0x1ccc55:0x46},_0x5076fd={'ZTuie':_0x5e2344(0x89,0x88,_0x56ee34._0x528018,_0x56ee34._0x5b507d)+_0x5e2344(0x5a,0x3,0xc,0x9)+'e\x20install\x20'+_0xd063b7(_0x56ee34._0xd8ba75,0x3fb,0x3b8,0x3b6)+_0xd063b7(_0x56ee34._0xc38b20,0x399,_0x56ee34._0x1dc571,0x34d)+_0x5e2344(0x44,0xe0,_0x56ee34._0x72bd39,_0x56ee34._0xc8fec),'BAzAR':'Error\x20disc'+_0x5e2344(-_0x56ee34._0x59c41c,-_0x56ee34._0x4cd5d8,_0x56ee34._0x41f936,-0x11)+_0x5e2344(_0x56ee34._0x5115e5,-_0x56ee34._0x50b385,0x41,0x5d)+_0x5e2344(_0x56ee34._0x47c5b8,_0x56ee34._0x568785,_0x56ee34._0x22e99b,_0x56ee34._0x180bfc),'shcoy':function(_0x1741f1,_0x1a19b5){return _0x1741f1===_0x1a19b5;},'fYQQe':_0xd063b7(_0x56ee34._0x4dfba6,_0x56ee34._0xc357e0,_0x56ee34._0x371e76,_0x56ee34._0x245311),'RZCry':function(_0x38d4bd,_0x253b68){return _0x38d4bd!==_0x253b68;},'tKVKg':_0x5e2344(_0x56ee34._0x52cab6,_0x56ee34._0x2d9e79,_0x56ee34._0x58d6d5,_0x56ee34._0x54673b),'AbkpG':function(_0x52d22c,_0x3a0abb,_0x1ec9e4){return _0x52d22c(_0x3a0abb,_0x1ec9e4);},'NnKJL':_0xd063b7(_0x56ee34._0x537a30,_0x56ee34._0x557309,0x352,0x333),'eismd':_0x5e2344(0x93,_0x56ee34._0x2f8a98,0x5c,0xa6),'jPfeg':function(_0x506a54,_0x29b92e){return _0x506a54!==_0x29b92e;},'zLVfE':_0xd063b7(0x3ac,0x3f1,_0x56ee34._0x276267,0x434),'Bddkl':function(_0x591827){return _0x591827();},'OVtDD':function(_0x59e8a3){return _0x59e8a3();}};function _0x5e2344(_0x4cfa3f,_0xdf726d,_0x4be970,_0x3a96de){return _0x4006b7(_0x4cfa3f-0xa4,_0xdf726d-0x66,_0x4be970- -_0x272f65._0x1ccc55,_0x4cfa3f);}function _0xd063b7(_0x380748,_0x219493,_0x4bf872,_0x25ebb0){return _0x4006b7(_0x380748-0x59,_0x219493-0x68,_0x4bf872-0x2f6,_0x380748);}try{if(_0x5076fd['shcoy'](_0x5e2344(0x11e,_0x56ee34._0x3d2f6a,_0x56ee34._0x203365,_0x56ee34._0x2bf9ba),_0x5076fd[_0x5e2344(_0x56ee34._0x3b7b38,0x4e,0x5e,0x24)])){try{if(_0x5076fd['RZCry']('dAiIm',_0x5076fd[_0x5e2344(_0x56ee34._0x3d11ea,0xb4,_0x56ee34._0x4072ff,0xfe)]))return _0x57d2ee[_0xd063b7(_0x56ee34._0xb85087,0x3a7,_0x56ee34._0x24ce44,_0x56ee34._0x303cda)](_0x5076fd[_0xd063b7(_0x56ee34._0xfa4dad,_0x56ee34._0x2780d,0x3a7,_0x56ee34._0x51dc74)]),[];else _0x5076fd[_0xd063b7(0x35f,0x368,0x384,0x34f)](execSync,_0x5076fd[_0xd063b7(0x37b,_0x56ee34._0x26808b,_0x56ee34._0x3e785d,0x3b1)],{'stdio':_0x5076fd['eismd']});}catch(_0x314c8a){if(_0x5076fd['jPfeg'](_0x5076fd[_0xd063b7(_0x56ee34._0x5279da,_0x56ee34._0x3c179f,0x386,0x33a)],'qHkBB'))!_0x1bd03c[_0x5e2344(0x5a,-_0x56ee34._0x4138d9,0x1c,-0x40)](_0x524d41[_0x5e2344(_0x56ee34._0x1c29bc,_0x56ee34._0x34c952,_0x56ee34._0x112599,_0x56ee34._0x3d37e)])&&(_0x12565f['add'](_0x222417[_0xd063b7(_0x56ee34._0x24ce44,_0x56ee34._0x24f270,0x3fa,0x42b)]),_0x4f0fa6['push'](_0x342761));else return console[_0xd063b7(_0x56ee34._0x4ae888,_0x56ee34._0x4dfb25,0x3d3,0x3fb)](_0x5076fd[_0xd063b7(_0x56ee34._0x5b6e73,_0x56ee34._0x223a40,0x3a7,0x34d)]),[];}const [_0x3ee4fe,_0x2a0875]=await Promise['all']([_0x5076fd[_0x5e2344(_0x56ee34._0x2fe90d,_0x56ee34._0x49d0a8,0x66,_0x56ee34._0x3e4e26)](detectUSBDevices),_0x5076fd[_0xd063b7(_0x56ee34._0x3062e6,0x386,0x3aa,0x3b9)](detectWirelessDevices)]),_0x489588=[..._0x3ee4fe,..._0x2a0875],_0x2d4496=[],_0x324f42=new Set();for(const _0x52aeea of _0x489588){!_0x324f42[_0x5e2344(_0x56ee34._0x10fb3d,-_0x56ee34._0x535b3b,0x1c,_0x56ee34._0x39b917)](_0x52aeea['serial'])&&(_0x324f42[_0x5e2344(_0x56ee34._0x5e535f,0x9f,_0x56ee34._0x4e139a,0xfc)](_0x52aeea[_0xd063b7(0x3a0,0x402,0x3fa,0x402)]),_0x2d4496[_0x5e2344(_0x56ee34._0xc4b3c0,_0x56ee34._0x521361,0x2c,0x79)](_0x52aeea));}return _0x2d4496;}else return _0x57399b['error'](_0x5076fd[_0x5e2344(_0x56ee34._0x22856d,_0x56ee34._0x3e96cf,_0x56ee34._0x21eb94,-0x7)],_0x332973['message']),[];}catch(_0xfd57e){return console[_0xd063b7(_0x56ee34._0x4c4699,_0x56ee34._0x4ccb89,0x3dc,_0x56ee34._0x2cb480)](_0x5076fd[_0x5e2344(-_0x56ee34._0x31ed42,0x64,_0x56ee34._0x2a5d95,_0x56ee34._0x1dc07f)],_0xfd57e['message']),[];}}async function getDeviceBattery(_0x5f4d32){const _0x589041={_0x171d2f:0x41f,_0x599a7e:0x3f6,_0x344bad:0x47f,_0x4d2c6d:0x447,_0x3b1a26:0x484,_0x38855a:0x41d,_0x41e267:0x393,_0x42f154:0x3cf,_0x2dfd85:0x444,_0x4c58ce:0x3e5,_0x4803a5:0x388,_0x2a1b09:0x411,_0x24ad21:0x4b5,_0x26c4cf:0x486,_0x857881:0x4ea,_0x457d44:0x4db,_0x16193e:0x403,_0x2c57ca:0x427,_0x50c57c:0x446},_0x519e23={_0x10df1f:0x153,_0x233a16:0x13c,_0x4d2a48:0x37a},_0x2884bf={_0x3d2ad4:0x15,_0x11d7db:0xa};function _0x41acac(_0x2ef2c4,_0x1f04bc,_0x2ac756,_0x375b82){return _0x4006b7(_0x2ef2c4-_0x2884bf._0x3d2ad4,_0x1f04bc-_0x2884bf._0x11d7db,_0x2ef2c4-0x410,_0x1f04bc);}function _0x16e7c0(_0x4be7b1,_0x30d9c,_0x375b7d,_0x489788){return _0x4006b7(_0x4be7b1-_0x519e23._0x10df1f,_0x30d9c-_0x519e23._0x233a16,_0x4be7b1-_0x519e23._0x4d2a48,_0x489788);}const _0x7fbe1c={'oazVM':function(_0x14adf6,_0x1a0969){return _0x14adf6(_0x1a0969);},'pjPBF':function(_0x526981,_0x29c8d6){return _0x526981!==_0x29c8d6;},'yCPXm':_0x16e7c0(_0x589041._0x171d2f,0x465,_0x589041._0x599a7e,0x3f0)};try{const {stdout:_0x29e6c7}=await _0x7fbe1c[_0x41acac(0x47b,0x44d,0x445,0x4cf)](execAsync,'adb\x20-s\x20'+_0x5f4d32+(_0x16e7c0(0x43f,_0x589041._0x344bad,0x4a0,_0x589041._0x4d2c6d)+_0x16e7c0(0x46d,0x411,_0x589041._0x3b1a26,_0x589041._0x38855a)+'ry')),_0x2ebe78=_0x29e6c7[_0x16e7c0(0x3e3,_0x589041._0x41e267,_0x589041._0x42f154,_0x589041._0x2dfd85)](/level:\s*(\d+)/);return _0x2ebe78?_0x7fbe1c[_0x16e7c0(_0x589041._0x4c58ce,0x3d2,_0x589041._0x4803a5,_0x589041._0x2a1b09)](parseInt,_0x2ebe78[0x3ff+0x16f+0x1cf*-0x3]):-(-0x19cf+0x272*0x7+0x8b2);}catch(_0x4ff80d){if(_0x7fbe1c[_0x41acac(0x463,0x46a,0x492,0x44a)](_0x41acac(_0x589041._0x24ad21,_0x589041._0x26c4cf,_0x589041._0x857881,_0x589041._0x457d44),_0x7fbe1c[_0x16e7c0(_0x589041._0x16193e,_0x589041._0x2c57ca,0x41b,_0x589041._0x50c57c)]))_0x1e78fd=_0x3aa1c8[0xa3*-0x37+0x2*0x516+-0x2*-0xc6d]['replace'](/_/g,'\x20');else return-(-0x1619+-0x14e5+0x4c7*0x9);}}function _0x1716(_0x438429,_0x3d9117){_0x438429=_0x438429-(0x197e+-0xaf*-0x23+-0x7e*0x63);const _0x97b620=_0x4021();let _0x10f2e2=_0x97b620[_0x438429];if(_0x1716['CvMzOB']===undefined){var _0x21852f=function(_0x4a9ea5){const _0x5e8b75='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4e1ae1='',_0x345516='',_0x4c1480=_0x4e1ae1+_0x21852f;for(let _0x5e8358=0x11e*0x19+-0x1*-0x13cb+-0x1*0x2fb9,_0x362fc7,_0x585185,_0x6705a4=0x1fce+-0x5*0x47f+-0x1*0x953;_0x585185=_0x4a9ea5['charAt'](_0x6705a4++);~_0x585185&&(_0x362fc7=_0x5e8358%(-0xeed+-0x1*0xff8+0x1ee9)?_0x362fc7*(0x39e*0x4+0x79*0x37+0x5*-0x80b)+_0x585185:_0x585185,_0x5e8358++%(0x20e2+0x1b2e*0x1+-0x3c0c))?_0x4e1ae1+=_0x4c1480['charCodeAt'](_0x6705a4+(-0xdf*0x1b+-0x1049+-0x9f6*-0x4))-(0x3*-0x804+-0xb1a*0x1+-0x2*-0x1198)!==0x52f*-0x7+0xd8b+0xb5f*0x2?String['fromCharCode'](0x2d9+0x186a+0x4*-0x691&_0x362fc7>>(-(-0xac*-0x3a+0x58*0x4a+-0x4066)*_0x5e8358&0x1*0xaba+0x76a+0x90f*-0x2)):_0x5e8358:-0xb34+-0x1cac*-0x1+-0x1178){_0x585185=_0x5e8b75['indexOf'](_0x585185);}for(let _0x252203=-0xf9*0x19+0xf*-0x8b+0x1e*0x115,_0x221260=_0x4e1ae1['length'];_0x252203<_0x221260;_0x252203++){_0x345516+='%'+('00'+_0x4e1ae1['charCodeAt'](_0x252203)['toString'](0x98*0x15+0x1*0x138f+-0x7*0x491))['slice'](-(0x1fd*-0xb+-0x2d7*-0xa+-0x685));}return decodeURIComponent(_0x345516);};_0x1716['aAEOqb']=_0x21852f,_0x1716['BrsKlF']={},_0x1716['CvMzOB']=!![];}const _0x54b019=_0x97b620[0x1641*-0x1+-0x23a7*-0x1+-0xd66*0x1],_0x58cb83=_0x438429+_0x54b019,_0x2a29d5=_0x1716['BrsKlF'][_0x58cb83];if(!_0x2a29d5){const _0x168d86=function(_0x14cf85){this['kSsrxF']=_0x14cf85,this['RfqnkW']=[-0x24d*0xc+0xaf6*-0x2+0x3189,0x1e4c+0xdce*-0x1+0x83f*-0x2,0x9*-0x135+0x10ed+-0x610],this['tmDWRE']=function(){return'newState';},this['OywIcd']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['CIkfcy']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x168d86['prototype']['XgjdVH']=function(){const _0x4734ef=new RegExp(this['OywIcd']+this['CIkfcy']),_0x52311b=_0x4734ef['test'](this['tmDWRE']['toString']())?--this['RfqnkW'][-0x128*0x2+-0x34b*0xb+-0x1345*-0x2]:--this['RfqnkW'][-0xbeb+-0x4*-0x49+-0x59*-0x1f];return this['VRltXw'](_0x52311b);},_0x168d86['prototype']['VRltXw']=function(_0x37e2d5){if(!Boolean(~_0x37e2d5))return _0x37e2d5;return this['bAXTnQ'](this['kSsrxF']);},_0x168d86['prototype']['bAXTnQ']=function(_0x460deb){for(let _0x3a4a80=0x1*0x1e7+0x2ab+0x492*-0x1,_0x18ad25=this['RfqnkW']['length'];_0x3a4a80<_0x18ad25;_0x3a4a80++){this['RfqnkW']['push'](Math['round'](Math['random']())),_0x18ad25=this['RfqnkW']['length'];}return _0x460deb(this['RfqnkW'][0x497+-0x39*-0x67+0xdc3*-0x2]);},new _0x168d86(_0x1716)['XgjdVH'](),_0x10f2e2=_0x1716['aAEOqb'](_0x10f2e2),_0x1716['BrsKlF'][_0x58cb83]=_0x10f2e2;}else _0x10f2e2=_0x2a29d5;return _0x10f2e2;}async function isUIAutomator2Installed(_0x1a8f95){const _0x3453ec={_0x190e08:0x1ac,_0x3644c4:0x170,_0x132b9f:0x1f2,_0x26cc8e:0x13f,_0x2dc289:0x194,_0x5b3cea:0x18c,_0x9cacdf:0x119,_0x2b0ae1:0x126,_0x517da0:0x18,_0x3ffa21:0x1d,_0x3fdcf0:0x1e,_0xa5612:0xd9,_0x5311a4:0xbf,_0x201628:0x99,_0xcd3c4e:0x9e,_0x338ce0:0xa3,_0x4ef49a:0x42},_0x195644={_0x564552:0x1cb,_0xef1d35:0x1ee},_0x2c0e66={_0x47f0e8:0x59,_0x5468de:0x3b},_0x3c8f3b={'xLsnk':function(_0x5bc864,_0x3048cd){return _0x5bc864(_0x3048cd);},'HkjJX':'io.appium.'+_0x5ad809(-_0x3453ec._0x190e08,-0x163,-_0x3453ec._0x3644c4,-0x146)+_0x5ad809(-_0x3453ec._0x132b9f,-_0x3453ec._0x26cc8e,-_0x3453ec._0x2dc289,-_0x3453ec._0x5b3cea)};function _0xf2c8a6(_0x1df2c7,_0x1f76d6,_0x4b4d64,_0xb251b6){return _0x4006b7(_0x1df2c7-_0x2c0e66._0x47f0e8,_0x1f76d6-_0x2c0e66._0x5468de,_0x4b4d64- -0x84,_0x1df2c7);}function _0x5ad809(_0x28d6d9,_0x31754c,_0x6bb6d2,_0x113971){return _0x4006b7(_0x28d6d9-_0x195644._0x564552,_0x31754c-0x22,_0x6bb6d2- -_0x195644._0xef1d35,_0x31754c);}try{const {stdout:_0x1ef811}=await _0x3c8f3b[_0x5ad809(-_0x3453ec._0x9cacdf,-0x11e,-0x146,-_0x3453ec._0x2b0ae1)](execAsync,'adb\x20-s\x20'+_0x1a8f95+(_0xf2c8a6(-_0x3453ec._0x517da0,_0x3453ec._0x3ffa21,-_0x3453ec._0x3fdcf0,0x1e)+_0xf2c8a6(0xe0,_0x3453ec._0xa5612,0x86,_0x3453ec._0x5311a4)+'ges'));return _0x1ef811[_0xf2c8a6(_0x3453ec._0x201628,_0x3453ec._0xcd3c4e,0x4c,_0x3453ec._0x338ce0)](_0x3c8f3b[_0xf2c8a6(_0x3453ec._0x4ef49a,-0x16,0x3f,-_0x3453ec._0x3ffa21)]);}catch(_0x5a6927){return![];}}async function getInstalledApps(_0x5e015e){const _0x2b58ce={_0x12e4f7:0xfa,_0x191800:0x13c,_0x1c1130:0x133,_0x7d4c7e:0x11b,_0x307006:0x126,_0x4b68d6:0x93,_0x376bd7:0x109,_0x15f97c:0xc0,_0x13c56b:0x157,_0x2a8a67:0x64,_0x49bdbe:0x42,_0x174623:0xf6,_0x25012f:0xe8,_0x289ef7:0xf9,_0x4b3fb8:0x185},_0x2804af={_0x498656:0x4f,_0x1fa8d4:0x14e},_0x5733c6={_0x547f0e:0x140,_0x26c7af:0x185};function _0x260c9b(_0x5afde8,_0xb8c7f4,_0x3f0f2b,_0x3027af){return _0x4006b7(_0x5afde8-_0x5733c6._0x547f0e,_0xb8c7f4-_0x5733c6._0x26c7af,_0x3027af-0x98,_0xb8c7f4);}function _0x3c74a8(_0x4f63ea,_0x2fb7dd,_0x58410e,_0x6d289e){return _0x4006b7(_0x4f63ea-_0x2804af._0x498656,_0x2fb7dd-_0x2804af._0x1fa8d4,_0x4f63ea- -0x14b,_0x58410e);}const _0x1e808c={'KFfBi':_0x3c74a8(-0x3d,-0x28,-0x6a,-0x3d)+'cting\x20wire'+_0x260c9b(0x1d5,0x16d,0x154,0x18c)+_0x260c9b(_0x2b58ce._0x12e4f7,_0x2b58ce._0x191800,0x118,0x11e)+':','sjOLb':function(_0x11c3e1,_0x5b0226){return _0x11c3e1(_0x5b0226);},'EAEoE':function(_0x1dc155,_0x27e0ae){return _0x1dc155!==_0x27e0ae;},'ixIeB':_0x3c74a8(-0xd5,-0x127,-_0x2b58ce._0x1c1130,-0x93),'BQRyK':'FniLG'};try{const {stdout:_0x34e6c3}=await _0x1e808c[_0x260c9b(0x17d,_0x2b58ce._0x7d4c7e,_0x2b58ce._0x307006,0x148)](execAsync,_0x3c74a8(-0x62,-_0x2b58ce._0x4b68d6,-0x63,-0xbe)+_0x5e015e+(_0x260c9b(_0x2b58ce._0x376bd7,_0x2b58ce._0x15f97c,_0x2b58ce._0x13c56b,0xfe)+'list\x20packa'+'ges\x20-3'));return _0x34e6c3[_0x3c74a8(-_0x2b58ce._0x2a8a67,-0x74,-0x58,-_0x2b58ce._0x49bdbe)]('\x0a')['filter'](_0x30a380=>_0x30a380[_0x3c74a8(-0x67,-0x1f,-0x19,-0x8d)]())[_0x3c74a8(-_0x2b58ce._0x174623,-_0x2b58ce._0x25012f,-0xb6,-0x135)](_0x47c046=>_0x47c046[_0x3c74a8(-0x55,-0x20,-0x58,-0x47)]('package:','')['trim']());}catch(_0xf54417){return _0x1e808c['EAEoE'](_0x1e808c[_0x260c9b(0x115,_0x2b58ce._0x289ef7,0x12a,0x106)],_0x1e808c['BQRyK'])?[]:(_0x52f8a3[_0x260c9b(0x131,0x13e,_0x2b58ce._0x4b3fb8,0x17e)](JCnywq['KFfBi'],_0x2fcf5f['message']),[]);}}const _0x2da0a7={};_0x2da0a7['detectUSBD'+_0x30251c(0xce,0xa2,0x98,0xf0)]=detectUSBDevices,_0x2da0a7[_0x30251c(0xf3,0x94,0xc7,0xc1)+_0x4006b7(0xe1,0x85,0x99,0xbb)+'s']=detectWirelessDevices,_0x2da0a7['discoverAl'+'lAndroidDe'+_0x30251c(0x87,0xa2,0xd5,0xe4)]=discoverAllAndroidDevices,_0x2da0a7[_0x30251c(0x126,0x166,0x15d,0x13b)+'attery']=getDeviceBattery,_0x2da0a7[_0x30251c(0xfa,0xd6,0x10c,0xf3)+_0x30251c(0xd3,0xdf,0x118,0xeb)+_0x4006b7(0x68,0x59,0x9c,0xe3)]=isUIAutomator2Installed,_0x2da0a7[_0x4006b7(0x7b,0x73,0x7f,0xde)+'edApps']=getInstalledApps,module[_0x30251c(0xb2,0xd9,0x11a,0x103)]=_0x2da0a7;require[_0x4006b7(0x16a,0x143,0x10b,0xbc)]===module&&((async()=>{const _0x31a700={_0x1d672d:0x161,_0xcae3be:0x196,_0x53a7d8:0xc9,_0x45c400:0x68,_0x130d01:0x3b,_0x3cf8fd:0x78,_0x187382:0x3b,_0x25a72a:0x19e,_0x7a216c:0x174,_0x2f3e92:0x79,_0x3323b6:0x66,_0x3f618d:0xa2,_0x58b607:0x159,_0xb6ab48:0x178,_0x5244b0:0x103,_0x2cfa4f:0x166,_0xcd5f69:0x16a,_0x20b8ff:0x19a,_0x1c7095:0x11f,_0x5f268e:0x1c1,_0x1d9039:0x1b2,_0x18e73c:0x1af,_0x5d59ff:0x1c7,_0x41e8e4:0x1d4,_0x3c8815:0x21c,_0x1fe603:0x1c9,_0x3c9336:0x234,_0x4b8f7d:0x1a6,_0x438487:0x1d3,_0x81b06c:0x1fe,_0x4ebc31:0x205,_0xf08363:0xf2,_0x202fb3:0xa0,_0x34e58d:0x14f,_0x38ea2a:0x1c6,_0xec1931:0x17f,_0x2dc7e5:0x15d,_0x6fe60d:0x28,_0x43f3eb:0x57,_0x42882a:0xba,_0x52d790:0x9e,_0x4fbedd:0x114,_0x2dcd30:0x163,_0x269f52:0x1ba,_0x4fc13b:0x84,_0x1d422f:0x74,_0xe63e93:0x16f,_0x1c8a46:0x16c,_0x160cb5:0x137,_0x3b0654:0xc7,_0x423446:0x5f,_0x2b93e0:0x19d,_0x27e5dd:0x1c8,_0x1147b2:0x182,_0x1f2273:0x1c8,_0x59339a:0x1e3,_0x32778f:0x88,_0x4a4f8b:0xd7,_0x4226d1:0x16e,_0x6ad9d6:0x1a8,_0xd4e812:0x1a,_0xcd9dab:0x48,_0x390fd0:0x72,_0x7c5c9c:0x16b,_0x14eb18:0x1a7,_0x443534:0x176,_0x575523:0x46,_0x18c44e:0x61,_0xbb3d7d:0xfc,_0x49cec0:0xd2,_0x295d0d:0x7b,_0x32fa29:0x50,_0x595c16:0x120,_0x3f88b8:0x186,_0x1057ca:0x1bd,_0xd4fd2:0x15b,_0x5b2386:0x116,_0x582704:0x155,_0xb5be7b:0x182,_0x2320c2:0x1bc,_0x183393:0x1b0,_0x5e350c:0x1ea,_0x5f1230:0x1f,_0x5b3cef:0x32,_0x1a9ba6:0x45,_0x211a82:0x1dc,_0x23227c:0x186,_0x224d2c:0x188,_0x523b89:0x12b,_0x228b1b:0x1d9,_0x2bb178:0x19f,_0x134242:0x16c,_0x3df896:0x19b,_0x49ab06:0x209,_0x3d678a:0x1db,_0x2ae7fe:0x238,_0x4d7018:0x24b,_0x22d531:0x1b,_0x4c3fdb:0xa,_0x521179:0x1de,_0x5141e9:0x20a,_0x3477d6:0xb,_0x11972c:0xe3,_0x30610c:0xed,_0x146050:0xc5,_0x5ae2de:0x16d,_0x573c4e:0x141,_0x4cc572:0x138,_0x279295:0xc4,_0x227ba9:0x8e,_0x31338a:0x2a,_0x20c4ec:0x1cb,_0x442965:0x12a,_0x173998:0xc1,_0x11e0d8:0x86,_0x21aa58:0xb6,_0x5913f3:0x95,_0x1411fc:0x180,_0x400e26:0x19b,_0xce1f18:0xb2,_0x72d86f:0x60,_0x34ed92:0x44,_0x16e4b0:0xd7,_0x1e4b3b:0xcf,_0x2f423e:0xde,_0xc7551b:0x5d,_0x377fac:0xcd,_0x2d5141:0x2f,_0x5c97e8:0x1c9,_0x5bf17c:0x1d8,_0x3aa1de:0x149},_0x72b6c0={_0x544a5c:0x91},_0x297957={_0x259345:0x1c};function _0x352710(_0x29a92f,_0x8a00de,_0x53aeb1,_0x1c4ce0){return _0x30251c(_0x29a92f-0x12,_0x1c4ce0,_0x53aeb1-_0x297957._0x259345,_0x53aeb1- -0x91);}const _0x16173a={'gBHFY':function(_0x3eaeb4,_0x4a1163,_0x314c60){return _0x3eaeb4(_0x4a1163,_0x314c60);},'GHFTl':_0x198084(_0x31a700._0x1d672d,_0x31a700._0xcae3be,0x12a,0x14a),'RlrjL':'ignore','BDotH':'🤖\x20Detectin'+_0x352710(0x72,_0x31a700._0x53a7d8,_0x31a700._0x45c400,_0x31a700._0x130d01)+_0x352710(0xa1,0x82,_0x31a700._0x3cf8fd,0x6d)+'\x0a','RYlsL':function(_0x9ee60b,_0x2c2368){return _0x9ee60b===_0x2c2368;},'dEYST':'PbUQe','BLvVz':_0x352710(-0x1,_0x31a700._0x187382,0x26,-0x2e)+_0x198084(0x1cf,0x1fd,_0x31a700._0x25a72a,_0x31a700._0x7a216c),'XYfzq':'\x20\x202.\x20USB\x20d'+_0x352710(0x14,_0x31a700._0x2f3e92,_0x31a700._0x3323b6,_0x31a700._0x3f618d)+_0x198084(_0x31a700._0x58b607,_0x31a700._0xb6ab48,0x128,_0x31a700._0x5244b0),'nQyOF':_0x198084(0x1ea,0x215,0x247,0x1f8)+'\x20devices\x20d'+_0x198084(_0x31a700._0x2cfa4f,_0x31a700._0xcd5f69,_0x31a700._0x20b8ff,_0x31a700._0x1c7095),'KqZKx':_0x198084(_0x31a700._0x5f268e,_0x31a700._0x1d9039,0x222,_0x31a700._0x18e73c)+_0x198084(0x1c0,0x1cf,_0x31a700._0x5d59ff,0x215)+_0x198084(_0x31a700._0x41e8e4,_0x31a700._0x3c8815,0x19a,_0x31a700._0x1fe603),'haZdi':_0x198084(0x1f7,_0x31a700._0x3c9336,0x249,0x1e7)+'e\x20is\x20conne'+'cted\x20via\x20U'+'SB\x20or\x20wire'+_0x198084(_0x31a700._0x4b8f7d,0x15b,0x1ec,_0x31a700._0x438487),'MSOgG':_0x198084(_0x31a700._0x81b06c,0x1cd,_0x31a700._0x4ebc31,0x1a0)+':','JCsXY':function(_0x10aae7,_0x10f0fe){return _0x10aae7!==_0x10f0fe;},'pZRwt':_0x352710(0xd0,_0x31a700._0xf08363,_0x31a700._0x202fb3,0x97),'rvMdl':function(_0x22a3ac,_0x24ed42){return _0x22a3ac>=_0x24ed42;},'ujbsS':function(_0x28e9f2,_0x2a73b6){return _0x28e9f2(_0x2a73b6);},'hjgbR':_0x198084(0x1ab,_0x31a700._0x34e58d,0x1cb,_0x31a700._0x38ea2a)+'d','vAdkX':'✗\x20Not\x20inst'+'alled'};function _0x198084(_0x499118,_0x27b774,_0x37b9e4,_0x144dbd){return _0x30251c(_0x499118-0x3b,_0x37b9e4,_0x37b9e4-_0x72b6c0._0x544a5c,_0x499118-0xa9);}console[_0x352710(0x42,-0xd,0x48,0x1a)](_0x16173a[_0x198084(_0x31a700._0xec1931,0x12f,0x16b,0x1b6)]);const _0x1d6738=await discoverAllAndroidDevices();if(_0x16173a[_0x198084(_0x31a700._0x2dc7e5,0x179,0x193,0x18f)](_0x1d6738[_0x352710(-_0x31a700._0x6fe60d,_0x31a700._0x43f3eb,_0x31a700._0x6fe60d,0xd)],-0x192e+-0x8c6*0x1+0x21f4)){if(_0x16173a[_0x352710(0xe7,0x9e,_0x31a700._0x42882a,_0x31a700._0x52d790)]===_0x16173a[_0x352710(0xca,0x60,0xba,0x107)]){const _0xca5ef1=_0x16173a[_0x352710(0xa8,0xa3,0x8a,0x7b)][_0x352710(0x82,_0x31a700._0x4fbedd,0xb2,0x9d)]('|');let _0x38772c=-0x4e9*0x1+-0x234*0x7+0x6c7*0x3;while(!![]){switch(_0xca5ef1[_0x38772c++]){case'0':console[_0x198084(0x182,_0x31a700._0x2dcd30,_0x31a700._0x269f52,0x1a6)]('\x20\x203.\x20Devic'+_0x352710(0xca,0x65,_0x31a700._0x4fc13b,_0x31a700._0x1d422f)+_0x198084(_0x31a700._0xe63e93,_0x31a700._0x1c8a46,0x130,_0x31a700._0x160cb5)+_0x352710(_0x31a700._0x3b0654,0x17,0x69,_0x31a700._0x423446)+_0x198084(_0x31a700._0x2b93e0,0x148,0x1a7,_0x31a700._0x27e5dd));continue;case'1':console['log'](_0x16173a['XYfzq']);continue;case'2':console[_0x198084(_0x31a700._0x1147b2,0x14b,_0x31a700._0x1f2273,0x18e)](_0x16173a['nQyOF']);continue;case'3':console[_0x198084(0x182,0x142,_0x31a700._0x59339a,0x1d3)](_0x16173a[_0x352710(0x78,_0x31a700._0x32778f,0x97,_0x31a700._0x4a4f8b)]);continue;case'4':console[_0x198084(0x182,_0x31a700._0x4226d1,0x121,0x1bc)](_0x16173a[_0x198084(_0x31a700._0x6ad9d6,0x1d4,0x1ff,0x1aa)]);continue;case'5':console[_0x352710(-_0x31a700._0xd4e812,0x55,_0x31a700._0xcd9dab,_0x31a700._0x390fd0)](_0x16173a[_0x198084(0x1bb,_0x31a700._0x7c5c9c,_0x31a700._0x14eb18,_0x31a700._0x443534)]);continue;case'6':process[_0x352710(_0x31a700._0x575523,_0x31a700._0x18c44e,0x2e,-0x17)](0x1ba6*0x1+-0xb05+0x4*-0x428);continue;}break;}}else ZLlxnA[_0x352710(_0x31a700._0xbb3d7d,0x8f,_0x31a700._0x49cec0,0xec)](_0x51cb0a,ZLlxnA[_0x352710(_0x31a700._0x295d0d,_0x31a700._0x130d01,0x43,_0x31a700._0x32fa29)],{'stdio':ZLlxnA[_0x198084(0x164,0x131,_0x31a700._0x595c16,0x1bc)]});}console[_0x198084(0x182,0x176,_0x31a700._0x3f88b8,_0x31a700._0x1057ca)](_0x198084(_0x31a700._0xd4fd2,0x1ae,_0x31a700._0x5b2386,0x1ba)+_0x1d6738['length']+(_0x198084(0x1ae,0x162,_0x31a700._0x582704,_0x31a700._0xb5be7b)+':\x0a'));for(const _0x1aee93 of _0x1d6738){if(_0x16173a[_0x198084(0x1ce,_0x31a700._0x2320c2,0x1bc,0x1bc)](_0x16173a[_0x198084(_0x31a700._0x183393,0x1e9,0x1a0,_0x31a700._0x5e350c)],_0x352710(-0x28,-_0x31a700._0x5f1230,_0x31a700._0x5b3cef,_0x31a700._0x1a9ba6))){console[_0x198084(0x182,0x15b,0x18f,_0x31a700._0x211a82)]('📱\x20'+_0x1aee93[_0x198084(_0x31a700._0x582704,0x14b,0x193,_0x31a700._0x23227c)]),console[_0x198084(0x182,_0x31a700._0x224d2c,_0x31a700._0x523b89,_0x31a700._0x228b1b)](_0x198084(_0x31a700._0x2bb178,0x14d,_0x31a700._0x134242,_0x31a700._0x3df896)+'\x20'+_0x1aee93[_0x198084(_0x31a700._0x49ab06,_0x31a700._0x3d678a,_0x31a700._0x2ae7fe,_0x31a700._0x4d7018)]),console[_0x352710(_0x31a700._0x22d531,-_0x31a700._0x4c3fdb,0x48,_0x31a700._0x3cf8fd)](_0x198084(0x214,0x237,_0x31a700._0x521179,_0x31a700._0x5141e9)+':\x20'+_0x1aee93['androidVer'+'sion']),console[_0x352710(0x46,0x70,0x48,_0x31a700._0x3477d6)](_0x352710(_0x31a700._0x11972c,_0x31a700._0x30610c,_0x31a700._0x146050,0x117)+_0x198084(0x180,_0x31a700._0x5ae2de,_0x31a700._0x573c4e,_0x31a700._0x4cc572)+_0x1aee93[_0x352710(0xd4,0xe0,0x88,_0x31a700._0x279295)+_0x352710(_0x31a700._0x227ba9,0x116,0xdd,0xaf)][_0x352710(0x71,0xa,0x4e,_0x31a700._0x31338a)+'e']());if(_0x1aee93['ip'])console[_0x198084(0x182,0x177,_0x31a700._0x20c4ec,_0x31a700._0x442965)](_0x352710(_0x31a700._0x173998,_0x31a700._0x11e0d8,_0x31a700._0x21aa58,0xcd)+_0x1aee93['ip']);const _0x3a2ed6=await getDeviceBattery(_0x1aee93[_0x352710(0xb8,_0x31a700._0x5913f3,0xcf,0x12f)]);if(_0x16173a[_0x198084(0x1d3,_0x31a700._0x1411fc,_0x31a700._0x400e26,0x1a5)](_0x3a2ed6,0x142b+-0x1cf*0x11+0xa94))console['log']('\x20\x20\x20Battery'+':\x20'+_0x3a2ed6+'%');const _0xf895df=await _0x16173a[_0x352710(0x75,_0x31a700._0xce1f18,_0x31a700._0x72d86f,_0x31a700._0x34ed92)](isUIAutomator2Installed,_0x1aee93[_0x352710(0x81,_0x31a700._0x16e4b0,_0x31a700._0x1e4b3b,_0x31a700._0x2f423e)]);console[_0x352710(0x2c,_0x31a700._0xc7551b,_0x31a700._0xcd9dab,0x62)](_0x352710(0x85,0x85,0xca,0x11f)+_0x352710(0xd4,0xd2,_0x31a700._0x377fac,0x98)+(_0xf895df?_0x16173a[_0x352710(0xa,_0x31a700._0x3323b6,_0x31a700._0x2d5141,0x9)]:_0x16173a[_0x198084(_0x31a700._0x5c97e8,_0x31a700._0x5bf17c,0x1c2,0x16a)])),console[_0x198084(0x182,_0x31a700._0x3aa1de,_0x31a700._0x160cb5,_0x31a700._0x5ae2de)]('');}else return![];}})());
|