devicely 2.2.5 → 2.2.7

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.
Files changed (49) hide show
  1. package/bin/devicely.js +1 -105
  2. package/config/devices.conf +6 -22
  3. package/lib/androidDeviceDetection.js +1 -276
  4. package/lib/appMappings.js +1 -337
  5. package/lib/deviceDetection.js +1 -394
  6. package/lib/devices.js +1 -54
  7. package/lib/doctor.js +1 -94
  8. package/lib/encryption.js +1 -88
  9. package/lib/executor.js +1 -104
  10. package/lib/frontend/asset-manifest.json +3 -3
  11. package/lib/frontend/index.html +1 -1
  12. package/lib/frontend/static/css/main.23bd35c0.css.map +1 -0
  13. package/lib/frontend/static/js/{main.26a24c5c.js → main.81eae090.js} +3 -3
  14. package/lib/frontend/static/js/main.81eae090.js.map +1 -0
  15. package/lib/logger.js +1 -47
  16. package/lib/package-lock.json +1678 -0
  17. package/lib/package.json +30 -0
  18. package/lib/screenshots/screenshot_ios_iPhone17_20260205_225900.png +0 -0
  19. package/lib/screenshots/screenshot_ios_iPhone17_20260205_225942.png +0 -0
  20. package/lib/screenshots/screenshot_ios_iPhone17_20260205_231101.png +0 -0
  21. package/lib/screenshots/screenshot_ios_iPhone17_20260205_232911.png +0 -0
  22. package/lib/screenshots/screenshot_ios_iPhone17_20260208_095103.png +0 -0
  23. package/lib/screenshots/screenshot_ios_iPhone17_20260208_095720.png +0 -0
  24. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115040.png +0 -0
  25. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115047.png +0 -0
  26. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115118.png +0 -0
  27. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115125.png +0 -0
  28. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_115143.png +0 -0
  29. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120107.png +0 -0
  30. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120118.png +0 -0
  31. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120137.png +0 -0
  32. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_120201.png +0 -0
  33. package/lib/screenshots/screenshot_ios_iPhoneXR17x_20260206_134529.png +0 -0
  34. package/lib/scriptLoader.js +1 -13
  35. package/lib/server.js +1 -3546
  36. package/package.json +14 -3
  37. package/scripts/shell/android_device_control.enc +1 -1
  38. package/scripts/shell/connect_android_usb_multi_final.enc +1 -1
  39. package/scripts/shell/connect_android_wireless.enc +1 -1
  40. package/scripts/shell/connect_android_wireless_multi_final.enc +1 -1
  41. package/scripts/shell/connect_ios_usb_multi_final.enc +1 -1
  42. package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -1
  43. package/scripts/shell/ios_device_control.enc +1 -1
  44. package/scripts/compile-shell-scripts.js +0 -208
  45. package/scripts/encrypt-shell-simple.js +0 -58
  46. package/scripts/obfuscate-shell.js +0 -160
  47. package/scripts/shell/apps_presets.conf +0 -271
  48. package/scripts/shell/devices.conf +0 -24
  49. /package/lib/frontend/static/js/{main.26a24c5c.js.LICENSE.txt → main.81eae090.js.LICENSE.txt} +0 -0
package/lib/server.js CHANGED
@@ -1,3546 +1 @@
1
- const path = require('path');
2
-
3
- // Load environment variables from .env file in project root
4
- require('dotenv').config({ path: path.join(__dirname, '../../.env') });
5
-
6
- const express = require('express');
7
- const cors = require('cors');
8
- const { spawn } = require('child_process');
9
- const WebSocket = require('ws');
10
- const fs = require('fs').promises;
11
- const AIProviderManager = require('./aiProviders');
12
- const Logger = require('./logger');
13
-
14
- // Initialize logger
15
- const logger = new Logger('Server');
16
-
17
- // Import scriptLoader for encrypted scripts
18
- let scriptLoader;
19
- try {
20
- scriptLoader = require('./scriptLoader');
21
- } catch (err) {
22
- // Development mode - no encryption
23
- scriptLoader = null;
24
- }
25
-
26
- // Import deviceDetection from appropriate location (dev vs npm package)
27
- let discoverAllDevices;
28
- try {
29
- // Try npm package location first (lib/)
30
- ({ discoverAllDevices } = require('./deviceDetection'));
31
- } catch (err) {
32
- // Fall back to development location
33
- ({ discoverAllDevices } = require('../../deviceDetection'));
34
- }
35
-
36
- const { execSync } = require('child_process');
37
-
38
- const app = express();
39
- const PORT = process.env.PORT || 3001;
40
-
41
- // Middleware
42
- app.use(cors());
43
- app.use(express.json());
44
-
45
- // Serve static frontend files - check both dev and npm package locations
46
- const frontendPath = require('fs').existsSync(path.join(__dirname, '../frontend/build'))
47
- ? path.join(__dirname, '../frontend/build')
48
- : path.join(__dirname, './frontend');
49
-
50
- app.use(express.static(frontendPath));
51
- // Frontend path: ${frontendPath}
52
-
53
- // WebSocket server
54
- const wss = new WebSocket.Server({ noServer: true });
55
-
56
- // AI Provider Manager - supports multiple AI providers
57
- const aiManager = new AIProviderManager();
58
-
59
- // Store connected devices
60
- let connectedDevices = [];
61
- let activeConnections = new Map();
62
- let wdaProcesses = new Map(); // Track WDA processes: Map<deviceName, {xcodebuild: pid, iproxy: pid}>
63
-
64
- // Track UIAutomator2 sessions for Android devices
65
- let androidSessions = new Map(); // Map<udid, {sessionId, port, serverPid}>
66
-
67
- // Helper to find config files in both dev and npm package locations
68
- function findConfigFile(filename) {
69
- // Try development location first
70
- let configPath = path.join(__dirname, '../../', filename);
71
- if (require('fs').existsSync(configPath)) {
72
- return configPath;
73
- }
74
-
75
- // Try npm package location (lib/ -> config/)
76
- configPath = path.join(__dirname, '../config/', filename);
77
- if (require('fs').existsSync(configPath)) {
78
- return configPath;
79
- }
80
-
81
- // Fall back to dev location for creation
82
- return path.join(__dirname, '../../', filename);
83
- }
84
-
85
- function findScriptFile(filename) {
86
- const fsSync = require('fs');
87
- const os = require('os');
88
- const crypto = require('crypto');
89
-
90
- const filenameWithoutExt = filename.replace(/\.sh$/, '');
91
- const encFilename = filenameWithoutExt + '.enc';
92
-
93
- // List of paths to try in order
94
- const pathsToTry = [
95
- // Development location (project root) - .sh file
96
- { path: path.join(__dirname, '../../', filename), encrypted: false },
97
- // NPM package: encrypted .enc file
98
- { path: path.join(__dirname, '../scripts/shell/', encFilename), encrypted: true },
99
- // NPM package: .sh file (fallback if no encryption)
100
- { path: path.join(__dirname, '../scripts/shell/', filename), encrypted: false },
101
- // NPM package: compiled binary (fallback)
102
- { path: path.join(__dirname, '../scripts/shell/', filenameWithoutExt), encrypted: false },
103
- ];
104
-
105
- for (const { path: scriptPath, encrypted } of pathsToTry) {
106
- if (fsSync.existsSync(scriptPath)) {
107
- logger.debug(`✅ Found script: ${filename} at ${scriptPath}${encrypted ? ' (encrypted)' : ''}`);
108
-
109
- // If encrypted, decrypt to temp directory and return temp path
110
- if (encrypted && scriptLoader) {
111
- const tmpDir = path.join(os.tmpdir(), 'devicely_scripts_' + process.pid);
112
- if (!fsSync.existsSync(tmpDir)) {
113
- fsSync.mkdirSync(tmpDir, { recursive: true, mode: 0o700 });
114
- }
115
-
116
- const tmpScript = path.join(tmpDir, filename);
117
-
118
- // Decrypt if not already decrypted
119
- if (!fsSync.existsSync(tmpScript)) {
120
- try {
121
- const content = scriptLoader.decryptScript(scriptPath);
122
- fsSync.writeFileSync(tmpScript, content, { mode: 0o755 });
123
- logger.debug(`🔓 Decrypted ${filename} to temp directory`);
124
- } catch (error) {
125
- console.error(`❌ Failed to decrypt ${filename}: ${error.message}`);
126
- continue;
127
- }
128
- }
129
-
130
- return tmpScript;
131
- }
132
-
133
- return scriptPath;
134
- }
135
- }
136
-
137
- console.error(`❌ Script not found: ${filename}`);
138
- console.error(` Searched in:`);
139
- pathsToTry.forEach(p => console.error(` - ${p.path}`));
140
-
141
- // Return first path as fallback (will fail but with clear error)
142
- return pathsToTry[0].path;
143
- }
144
-
145
- // Device configuration paths
146
- const DEVICE_CONFIG = findConfigFile('devices.conf');
147
- // Use OS temp directory for session file - works for both local and npm package
148
- const SESSION_MAP_FILE = path.join(require('os').tmpdir(), 'devicely_android_sessions.map');
149
- const APPS_CONFIG = findConfigFile('apps_presets.conf');
150
-
151
- // iOS scripts
152
- const WIRELESS_SCRIPT_PATH = findScriptFile('connect_ios_wireless_multi_final.sh');
153
- const USB_SCRIPT_PATH = findScriptFile('connect_ios_usb_multi_final.sh');
154
-
155
- // Android scripts
156
- const ANDROID_WIRELESS_SCRIPT_PATH = findScriptFile('android_device_control.sh');
157
- const ANDROID_USB_SCRIPT_PATH = findScriptFile('android_device_control.sh');
158
-
159
- // Recording storage path
160
- const RECORDINGS_DIR = path.join(__dirname, '../../recordings');
161
-
162
- // Screenshots storage path
163
- const SCREENSHOTS_DIR = path.join(__dirname, './screenshots');
164
-
165
- // Recording state
166
- let currentRecording = null; // { name, devices, commands: [], startTime }
167
- let isRecording = false;
168
-
169
- // Replay state
170
- let isReplaying = false;
171
- let replayAborted = false;
172
-
173
- // ============================================
174
- // UIAutomator2 Session Management Functions
175
- // ============================================
176
-
177
- /**
178
- * Start UIAutomator2 session for Android device
179
- */
180
- async function startUIAutomator2Session(udid, deviceName) {
181
- console.log(`🚀 Starting UIAutomator2 session for ${deviceName} (${udid})...`);
182
-
183
- try {
184
- // Find available port
185
- let port = 8200;
186
- while (true) {
187
- try {
188
- execSync(`lsof -i:${port}`, { stdio: 'ignore' });
189
- port++; // Port is in use, try next
190
- } catch {
191
- break; // Port is available
192
- }
193
- }
194
-
195
- console.log(`📡 Using port ${port} for ${deviceName}`);
196
-
197
- // Start UIAutomator2 server on device
198
- const serverProcess = spawn('adb', ['-s', udid, 'shell', 'am', 'instrument', '-w',
199
- 'io.appium.uiautomator2.server.test/androidx.test.runner.AndroidJUnitRunner'
200
- ], { detached: true, stdio: 'ignore' });
201
-
202
- serverProcess.unref(); // Don't wait for process to exit
203
-
204
- // Wait for server to start
205
- await new Promise(resolve => setTimeout(resolve, 2000));
206
-
207
- // Forward port
208
- execSync(`adb -s ${udid} forward tcp:${port} tcp:6790`);
209
-
210
- // Wait a bit more
211
- await new Promise(resolve => setTimeout(resolve, 2000));
212
-
213
- // Create session via HTTP
214
- const axios = require('axios');
215
- const sessionResponse = await axios.post(`http://localhost:${port}/wd/hub/session`, {
216
- capabilities: {
217
- alwaysMatch: {
218
- platformName: 'Android',
219
- 'appium:automationName': 'UiAutomator2',
220
- 'appium:udid': udid
221
- }
222
- }
223
- });
224
-
225
- const sessionId = sessionResponse.data.value.sessionId || sessionResponse.data.sessionId;
226
-
227
- // Store session info
228
- androidSessions.set(udid, {
229
- sessionId,
230
- port,
231
- serverPid: serverProcess.pid,
232
- deviceName
233
- });
234
-
235
- // Save to session file for scripts to use - remove old entries first
236
- try {
237
- let content = '';
238
- try {
239
- content = await fs.readFile(SESSION_MAP_FILE, 'utf-8');
240
- } catch (err) {
241
- // File doesn't exist yet, that's ok
242
- }
243
- const lines = content.split('\n').filter(line => line && !line.startsWith(`${udid}:`));
244
- lines.push(`${udid}:${sessionId}:${port}`);
245
- await fs.writeFile(SESSION_MAP_FILE, lines.join('\n') + '\n');
246
- console.log(`✅ Session file updated: ${udid}:${sessionId}:${port}`);
247
- } catch (err) {
248
- console.error(`⚠️ Failed to update session file: ${err.message}`);
249
- }
250
-
251
- console.log(`✅ UIAutomator2 session created for ${deviceName}`);
252
- console.log(` Session ID: ${sessionId}`);
253
- console.log(` Port: ${port}`);
254
-
255
- return { success: true, sessionId, port };
256
-
257
- } catch (error) {
258
- console.error(`❌ Failed to start UIAutomator2 for ${deviceName}:`, error.message);
259
- return { success: false, error: error.message };
260
- }
261
- }
262
-
263
- /**
264
- * Stop UIAutomator2 session for Android device
265
- */
266
- async function stopUIAutomator2Session(udid, deviceName) {
267
- console.log(`🛑 Stopping UIAutomator2 session for ${deviceName} (${udid})...`);
268
-
269
- try {
270
- const session = androidSessions.get(udid);
271
-
272
- if (!session) {
273
- console.log(`⚠️ No active session found for ${deviceName}`);
274
- return { success: true, message: 'No active session' };
275
- }
276
-
277
- // Delete session via HTTP
278
- try {
279
- const axios = require('axios');
280
- await axios.delete(`http://localhost:${session.port}/wd/hub/session/${session.sessionId}`);
281
- console.log(`✅ UIAutomator2 session deleted for ${deviceName}`);
282
- } catch (err) {
283
- console.log(`⚠️ Could not delete session via HTTP: ${err.message}`);
284
- }
285
-
286
- // Remove port forwarding
287
- try {
288
- execSync(`adb -s ${udid} forward --remove tcp:${session.port}`);
289
- console.log(`✅ Port forwarding removed for ${deviceName}`);
290
- } catch (err) {
291
- console.log(`⚠️ Could not remove port forwarding: ${err.message}`);
292
- }
293
-
294
- // Kill UIAutomator2 server on device
295
- try {
296
- execSync(`adb -s ${udid} shell am force-stop io.appium.uiautomator2.server`);
297
- execSync(`adb -s ${udid} shell am force-stop io.appium.uiautomator2.server.test`);
298
- console.log(`✅ UIAutomator2 server stopped on ${deviceName}`);
299
- } catch (err) {
300
- console.log(`⚠️ Could not stop UIAutomator2 server: ${err.message}`);
301
- }
302
-
303
- // Remove from memory
304
- androidSessions.delete(udid);
305
-
306
- // Update session file
307
- try {
308
- const content = await fs.readFile(SESSION_MAP_FILE, 'utf-8');
309
- const lines = content.split('\n').filter(line => !line.startsWith(`${udid}:`));
310
- await fs.writeFile(SESSION_MAP_FILE, lines.join('\n'));
311
- console.log(`✅ Session file updated for ${deviceName}`);
312
- } catch (err) {
313
- console.log(`⚠️ Could not update session file: ${err.message}`);
314
- }
315
-
316
- console.log(`✅ UIAutomator2 session stopped for ${deviceName}`);
317
- return { success: true };
318
-
319
- } catch (error) {
320
- console.error(`❌ Error stopping UIAutomator2 for ${deviceName}:`, error.message);
321
- return { success: false, error: error.message };
322
- }
323
- }
324
-
325
- // ============================================
326
-
327
- // Load device configuration
328
- async function loadDeviceConfig() {
329
- try {
330
- const content = await fs.readFile(DEVICE_CONFIG, 'utf-8');
331
- const devices = content
332
- .split('\n')
333
- .filter(line => line.trim() && !line.startsWith('#'))
334
- .map(line => {
335
- const parts = line.split(',').map(s => s.trim());
336
- const [name, udid, ip, platform, type] = parts;
337
-
338
- // Smart platform detection if not specified
339
- let detectedPlatform = platform || 'ios';
340
- if (!platform && udid) {
341
- // Android wireless: IP:PORT format
342
- if (udid.includes(':') && udid.match(/^\d+\.\d+\.\d+\.\d+:\d+$/)) {
343
- detectedPlatform = 'android';
344
- }
345
- // Android USB: Short serial without dashes
346
- else if (udid.length < 20 && !udid.includes('-')) {
347
- detectedPlatform = 'android';
348
- }
349
- // iOS: Long UUID with dashes
350
- else if (udid.includes('-') && udid.length > 30) {
351
- detectedPlatform = 'ios';
352
- }
353
- }
354
-
355
- return {
356
- name,
357
- udid,
358
- ip: ip || '',
359
- platform: detectedPlatform,
360
- type: type || (ip ? 'wireless' : 'usb'),
361
- status: 'unknown'
362
- };
363
- });
364
- return devices;
365
- } catch (error) {
366
- console.error('Error loading device config:', error);
367
- return [];
368
- }
369
- }
370
-
371
- // Discover and check device connectivity (USB + Wireless)
372
- async function discoverDevices() {
373
- // Save current connection states
374
- const previousStates = new Map();
375
- connectedDevices.forEach(device => {
376
- previousStates.set(device.udid, {
377
- status: device.status,
378
- sessionId: device.sessionId
379
- });
380
- });
381
-
382
- connectedDevices = await discoverAllDevices();
383
-
384
- // Restore connection states for devices that were previously connected
385
- connectedDevices.forEach(device => {
386
- const prevState = previousStates.get(device.udid);
387
- if (prevState && prevState.status === 'online') {
388
- // Preserve the online status for previously connected devices
389
- device.status = 'online';
390
- if (prevState.sessionId) {
391
- device.sessionId = prevState.sessionId;
392
- }
393
- }
394
- });
395
-
396
- // Auto-save USB devices to config for wireless use later
397
- await autoSaveUSBDevicesToConfig(connectedDevices);
398
-
399
- return connectedDevices;
400
- }
401
-
402
- // Auto-save USB devices to config
403
- async function autoSaveUSBDevicesToConfig(devices) {
404
- try {
405
- const usbDevices = devices.filter(d => d.connectionType === 'usb');
406
- if (usbDevices.length === 0) return;
407
-
408
- // Load existing config
409
- const existingDevices = await loadDeviceConfig();
410
- const existingUdids = new Set(existingDevices.map(d => d.udid));
411
-
412
- // Add new USB devices
413
- const newDevices = usbDevices.filter(d => !existingUdids.has(d.udid));
414
- if (newDevices.length === 0) return;
415
-
416
- // Append to config with placeholder IP (will be filled when wireless is configured)
417
- const allDevices = [...existingDevices, ...newDevices.map(d => ({
418
- name: d.name,
419
- udid: d.udid,
420
- ip: '' // Empty IP for USB devices, to be filled for wireless
421
- }))];
422
-
423
- // Save to config
424
- let content = '# Device Configuration (Auto-updated)\n';
425
- content += '# Format: device_name,udid,ip_address\n';
426
- content += '# USB devices auto-detected. Add IP for wireless connection.\n\n';
427
-
428
- allDevices.forEach(device => {
429
- const ip = device.ip || '';
430
- content += `${device.name},${device.udid},${ip}\n`;
431
- });
432
-
433
- await fs.writeFile(DEVICE_CONFIG, content);
434
- console.log(`✅ Auto-saved ${newDevices.length} new USB device(s) to config`);
435
- } catch (error) {
436
- console.error('Error auto-saving devices:', error);
437
- }
438
- }
439
-
440
- // Check device connectivity
441
- function checkDeviceConnectivity(device) {
442
- return new Promise((resolve) => {
443
- const curl = spawn('curl', [
444
- '-s',
445
- '--connect-timeout', '2',
446
- '--max-time', '3',
447
- `http://${device.ip}:8100/status`
448
- ]);
449
-
450
- let output = '';
451
- curl.stdout.on('data', (data) => {
452
- output += data.toString();
453
- });
454
-
455
- curl.on('close', (code) => {
456
- resolve(output.includes('"state"'));
457
- });
458
-
459
- setTimeout(() => {
460
- curl.kill();
461
- resolve(false);
462
- }, 3000);
463
- });
464
- }
465
-
466
- // Load app presets from config file
467
- function loadAppPresets() {
468
- try {
469
- if (!require('fs').existsSync(APPS_CONFIG)) {
470
- return {};
471
- }
472
-
473
- const content = require('fs').readFileSync(APPS_CONFIG, 'utf-8');
474
- const presets = {};
475
-
476
- content.split('\n')
477
- .filter(line => line.trim() && !line.startsWith('#'))
478
- .forEach(line => {
479
- const [name, packageId] = line.split(',').map(s => s.trim());
480
- if (name && packageId) {
481
- // Support platform-specific notation: name.ios or name.android
482
- const parts = name.split('.');
483
- if (parts.length === 2) {
484
- const [appName, platform] = parts;
485
- if (!presets[appName]) presets[appName] = {};
486
- presets[appName][platform] = packageId;
487
- } else {
488
- // Generic app (works on both platforms)
489
- if (!presets[name]) presets[name] = {};
490
- presets[name].common = packageId;
491
- }
492
- }
493
- });
494
-
495
- return presets;
496
- } catch (error) {
497
- console.error('Error loading app presets:', error);
498
- return {};
499
- }
500
- }
501
-
502
- // Resolve app preset based on device platform
503
- function resolveAppPreset(command, platform) {
504
- const appPresets = loadAppPresets();
505
-
506
- // Check if command is "launch <appname>"
507
- const launchMatch = command.match(/^launch\s+(\S+)(.*)$/);
508
- if (!launchMatch) return command; // Not a launch command
509
-
510
- const appName = launchMatch[1];
511
- const restOfCommand = launchMatch[2];
512
-
513
- // If it already looks like a bundle ID, don't resolve
514
- if (appName.includes('.')) return command;
515
-
516
- // Look up preset
517
- if (appPresets[appName]) {
518
- const preset = appPresets[appName];
519
- let bundleId;
520
-
521
- // Try platform-specific first, then common
522
- if (preset[platform]) {
523
- bundleId = preset[platform];
524
- } else if (preset.common) {
525
- bundleId = preset.common;
526
- }
527
-
528
- if (bundleId) {
529
- console.log(` 📱 Resolved app preset: "${appName}" → "${bundleId}" (${platform})`);
530
- return `launch ${bundleId}${restOfCommand}`;
531
- }
532
- }
533
-
534
- // No preset found, return original
535
- return command;
536
- }
537
-
538
- // Execute command on device(s)
539
- function executeCommand(deviceNames, command, wsClient) {
540
- return new Promise(async (resolve, reject) => {
541
- // separator removed
542
- logger.debug(`Device names received: [${deviceNames.join(', ')}]`);
543
- console.log(`Command: "${command}"`);
544
- // separator removed
545
-
546
- // Get full device objects from connectedDevices cache
547
- // Match by name, udid, or serial
548
- const devices = connectedDevices.filter(d =>
549
- deviceNames.includes(d.name) ||
550
- deviceNames.includes(d.udid) ||
551
- deviceNames.includes(d.serial)
552
- );
553
-
554
- logger.debug(`Cache contents:`, connectedDevices.map(d => `${d.name}(${d.status})`).join(', '));
555
-
556
- if (devices.length === 0) {
557
- console.error(`❌ No devices found for: [${deviceNames.join(', ')}]`);
558
- return reject({ success: false, error: 'No devices found. Please refresh device list and try again.' });
559
- }
560
-
561
- // Check if devices are online/connected
562
- // Accept both 'online' and 'connected' as valid statuses
563
- const offlineDevices = devices.filter(d => !['online', 'connected'].includes(d.status));
564
- if (offlineDevices.length > 0) {
565
- const offlineNames = offlineDevices.map(d => `${d.name} (status: ${d.status})`).join(', ');
566
- console.error(`❌ Devices not connected: [${offlineNames}]`);
567
-
568
- // Send user-friendly message via WebSocket
569
- if (wsClient) {
570
- wsClient.send(JSON.stringify({
571
- type: 'command_output',
572
- data: `\n⚠️ Error: Devices not connected: ${offlineNames}\n\n💡 Please click the "Connect" button on each device before running commands.\n\n`,
573
- devices: deviceNames
574
- }));
575
- }
576
-
577
- return reject({
578
- success: false,
579
- error: `Devices not connected: ${offlineNames}. Please click "Connect" button on each device first.`
580
- });
581
- }
582
-
583
- console.log(`✅ Found ${devices.length} connected devices`);
584
- console.log('Device details:', devices.map(d => `${d.name}(${d.platform}-${d.connectionType})`).join(', '));
585
-
586
- // Group devices by platform and connection type
587
- const iosUSBDevices = devices.filter(d => d.platform === 'ios' && d.connectionType === 'usb');
588
- const iosWirelessDevices = devices.filter(d => d.platform === 'ios' && d.connectionType === 'wireless');
589
- const androidUSBDevices = devices.filter(d => d.platform === 'android' && d.connectionType === 'usb');
590
- const androidWirelessDevices = devices.filter(d => d.platform === 'android' && d.connectionType === 'wireless');
591
-
592
- const promises = [];
593
-
594
- // Execute for iOS USB devices
595
- if (iosUSBDevices.length > 0) {
596
- const names = iosUSBDevices.map(d => d.name);
597
- const iosCommand = resolveAppPreset(command, 'ios');
598
- logger.debug(`Using iOS USB script for: ${names.join(', ')}`);
599
- promises.push(executeWithScript(USB_SCRIPT_PATH, names, iosCommand, wsClient));
600
- }
601
-
602
- // Execute for iOS wireless devices
603
- if (iosWirelessDevices.length > 0) {
604
- const names = iosWirelessDevices.map(d => d.name);
605
- const iosCommand = resolveAppPreset(command, 'ios');
606
- console.log(`Using iOS wireless script for: ${names.join(', ')}`);
607
- promises.push(executeWithScript(WIRELESS_SCRIPT_PATH, names, iosCommand, wsClient));
608
- }
609
-
610
- // Execute for Android USB devices
611
- if (androidUSBDevices.length > 0) {
612
- const androidCommand = resolveAppPreset(command, 'android');
613
- logger.debug(`Using Android control script for USB devices: ${androidUSBDevices.map(d => d.name).join(', ')}`);
614
- promises.push(executeAndroidDevices(ANDROID_USB_SCRIPT_PATH, androidUSBDevices, androidCommand, wsClient));
615
- }
616
-
617
- // Execute for Android wireless devices
618
- if (androidWirelessDevices.length > 0) {
619
- const androidCommand = resolveAppPreset(command, 'android');
620
- logger.debug(`Using Android control script for wireless devices: ${androidWirelessDevices.map(d => d.name).join(', ')}`);
621
- promises.push(executeAndroidDevices(ANDROID_WIRELESS_SCRIPT_PATH, androidWirelessDevices, androidCommand, wsClient));
622
- }
623
-
624
- if (promises.length === 0) {
625
-
626
- return reject({ success: false, error: 'No executable devices found' });
627
- }
628
-
629
- try {
630
- const results = await Promise.allSettled(promises);
631
- const successCount = results.filter(r => r.status === 'fulfilled').length;
632
- const failCount = results.filter(r => r.status === 'rejected').length;
633
-
634
- logger.debug(`ExecuteCommand summary: ${successCount} succeeded, ${failCount} failed`);
635
-
636
- resolve({
637
- success: true,
638
- results,
639
- summary: `${successCount}/${promises.length} script groups completed`
640
- });
641
- } catch (error) {
642
- console.error('Script execution error:', error);
643
- reject(error);
644
- }
645
- });
646
- }
647
-
648
- function executeWithScript(scriptPath, deviceNames, command, wsClient) {
649
- return new Promise((resolve, reject) => {
650
- logger.debug(`\n${'='.repeat(60)}`);
651
- logger.debug(`Script: ${path.basename(scriptPath)}`);
652
- logger.debug(`Devices: [${deviceNames.join(', ')}]`);
653
- logger.debug(`Command: "${command}"`);
654
- logger.debug(`${'='.repeat(60)}\n`);
655
-
656
- // Execute command on each device in parallel
657
- const devicePromises = deviceNames.map((deviceName, index) => {
658
-
659
- return new Promise((resolveDevice, rejectDevice) => {
660
- // Use -d flag for each device
661
- const args = ['-d', deviceName, command];
662
-
663
- logger.debug(`[${index + 1}/${deviceNames.length}] Executing on: ${deviceName}`);
664
-
665
-
666
- const child = spawn(scriptPath, args, {
667
- cwd: path.dirname(scriptPath)
668
- });
669
-
670
-
671
- let output = '';
672
- let error = '';
673
-
674
- child.stdout.on('data', (data) => {
675
- const text = data.toString();
676
- output += text;
677
- logger.debug(`[${deviceName}] STDOUT: ${text.trim()}`);
678
- if (wsClient) {
679
- wsClient.send(JSON.stringify({
680
- type: 'command_output',
681
- data: `[${deviceName}] ${text}`,
682
- devices: [deviceName]
683
- }));
684
- }
685
- });
686
-
687
- child.stderr.on('data', (data) => {
688
- const text = data.toString();
689
- error += text;
690
- console.error(`[${deviceName}] STDERR: ${text.trim()}`);
691
- });
692
-
693
- child.on('close', (code) => {
694
-
695
- if (code === 0) {
696
- resolveDevice({ success: true, output, device: deviceName });
697
- } else {
698
- rejectDevice({ success: false, error: error || `Script exited with code ${code}`, device: deviceName });
699
- }
700
- });
701
-
702
- child.on('error', (err) => {
703
- console.error(`[${deviceName}] Process error: ${err.message}`);
704
- rejectDevice({ success: false, error: err.message, device: deviceName });
705
- });
706
- });
707
- });
708
-
709
-
710
- // Wait for all devices to complete
711
- Promise.allSettled(devicePromises)
712
- .then(results => {
713
- const successful = results.filter(r => r.status === 'fulfilled').length;
714
- const failed = results.filter(r => r.status === 'rejected').length;
715
-
716
- // separator removed
717
-
718
- // separator removed
719
-
720
- resolve({
721
- success: true,
722
- results,
723
- summary: `${successful}/${deviceNames.length} devices completed successfully`
724
- });
725
- })
726
- .catch(error => {
727
- console.error(`Promise.allSettled error: ${error.message}`);
728
- reject(error);
729
- });
730
- });
731
- }
732
-
733
- // Execute Android commands (uses device UDID instead of name)
734
- function executeAndroidDevices(scriptPath, devices, command, wsClient) {
735
- return new Promise((resolve, reject) => {
736
- logger.debug(`\n${'='.repeat(60)}`);
737
- logger.debug(`Script: ${path.basename(scriptPath)}`);
738
- logger.debug(`Devices: [${devices.map(d => d.name).join(', ')}]`);
739
- logger.debug(`Command: "${command}"`);
740
- logger.debug(`${'='.repeat(60)}\n`);
741
-
742
- // Execute command on each device in parallel
743
- const devicePromises = devices.map((device, index) => {
744
- logger.debug(`[${index + 1}/${devices.length}] Creating execution promise for: ${device.name} (${device.udid}`);
745
-
746
- return new Promise((resolveDevice, rejectDevice) => {
747
- // Android script expects: <device_serial> <command> [args...]
748
- // Use UDID (which is the serial for Android)
749
- const args = [device.udid, ...command.split(' ')];
750
-
751
- const child = spawn(scriptPath, args, {
752
- cwd: path.dirname(scriptPath)
753
- });
754
-
755
-
756
- let output = '';
757
- let error = '';
758
-
759
- child.stdout.on('data', (data) => {
760
- const text = data.toString();
761
- output += text;
762
- logger.debug(`[${device.name}] STDOUT: ${text.trim()}`);
763
- if (wsClient) {
764
- wsClient.send(JSON.stringify({
765
- type: 'output',
766
- device: device.name,
767
- data: text
768
- }));
769
- }
770
- });
771
-
772
- child.stderr.on('data', (data) => {
773
- const text = data.toString();
774
- error += text;
775
- logger.debug(`[${device.name}] STDERR: ${text.trim()}`);
776
- });
777
-
778
- child.on('close', (code) => {
779
-
780
- if (code === 0) {
781
- resolveDevice({ success: true, output, device: device.name });
782
- } else {
783
- resolveDevice({ success: false, error: error || output, device: device.name });
784
- }
785
- });
786
-
787
- child.on('error', (err) => {
788
- console.error(`[${device.name}] Process error:`, err);
789
- resolveDevice({ success: false, error: err.message, device: device.name });
790
- });
791
- });
792
- });
793
-
794
- Promise.allSettled(devicePromises)
795
- .then(results => {
796
- // separator removed
797
-
798
- const successCount = results.filter(r => r.status === 'fulfilled' && r.value.success).length;
799
- const failCount = results.length - successCount;
800
-
801
- // separator removed
802
-
803
- resolve({ success: true, results });
804
- })
805
- .catch(error => {
806
- console.error('Execution error:', error);
807
- reject(error);
808
- });
809
- });
810
- }
811
-
812
- // AI-powered command conversion (supports multiple providers)
813
- async function convertNaturalLanguageToCommand(text, devices, provider = null) {
814
- // Determine platforms from devices
815
- const deviceObjs = connectedDevices.filter(d => devices.includes(d.name));
816
-
817
- if (deviceObjs.length === 0) {
818
- // No devices found, try with null platform
819
- return await aiManager.convertCommand(text, null, provider);
820
- }
821
-
822
- // Group devices by platform
823
- const platforms = [...new Set(deviceObjs.map(d => d.platform))];
824
-
825
- console.log(`AI converting for ${deviceObjs.length} device(s) across ${platforms.length} platform(s): ${platforms.join(', ')}`);
826
-
827
- // For multi-platform, use 'both' to get generic app names
828
- // The executeCommand function will resolve platform-specific package IDs
829
- const platform = platforms.length === 1 ? platforms[0] : 'both';
830
-
831
- console.log(`AI using platform mode: ${platform}`);
832
- return await aiManager.convertCommand(text, platform, provider);
833
- }
834
-
835
- // Execute commands sequentially with WAIT support
836
- async function executeCommandsSequentially(devices, commandsText, wsClient) {
837
- const lines = commandsText.split('\n').map(line => line.trim()).filter(line => line);
838
-
839
- // separator removed
840
-
841
- console.log(`Total commands: ${lines.length}`);
842
- console.log(`Commands:`, lines);
843
- // separator removed
844
-
845
- const results = [];
846
-
847
- for (let i = 0; i < lines.length; i++) {
848
- const line = lines[i];
849
-
850
- // Skip comments
851
- if (line.startsWith('#')) {
852
- continue;
853
- }
854
-
855
- // Check if it's a WAIT command
856
- if (line.startsWith('WAIT ')) {
857
- const waitTime = parseInt(line.replace('WAIT ', ''));
858
- console.log(`⏳ Waiting ${waitTime}ms before next command...`);
859
-
860
- if (wsClient) {
861
- wsClient.send(JSON.stringify({
862
- type: 'command_output',
863
- data: `⏳ Waiting ${waitTime}ms...\n`,
864
- devices: devices
865
- }));
866
- }
867
-
868
- await new Promise(resolve => setTimeout(resolve, waitTime));
869
- results.push({ command: line, success: true, output: `Waited ${waitTime}ms` });
870
- continue;
871
- }
872
-
873
- // Execute the command on ALL devices simultaneously
874
- console.log(`\n▶️ Executing command ${i + 1}/${lines.length}: "${line}"`);
875
-
876
- if (wsClient) {
877
- wsClient.send(JSON.stringify({
878
- type: 'command_output',
879
- data: `▶️ [${i + 1}/${lines.length}] ${line}\n`,
880
- devices: devices
881
- }));
882
- }
883
-
884
- try {
885
- const result = await executeCommand(devices, line, wsClient);
886
- results.push({ command: line, success: true, result });
887
- console.log(`✅ Command ${i + 1} completed successfully`);
888
- } catch (error) {
889
- console.error(`❌ Command ${i + 1} failed:`, error.message);
890
- results.push({ command: line, success: false, error: error.message });
891
-
892
- if (wsClient) {
893
- wsClient.send(JSON.stringify({
894
- type: 'command_output',
895
- data: `❌ Error: ${error.message}\n`,
896
- devices: devices
897
- }));
898
- }
899
- }
900
- }
901
-
902
- // separator removed
903
-
904
- console.log(`Total: ${results.length}, Success: ${results.filter(r => r.success).length}, Failed: ${results.filter(r => !r.success).length}`);
905
- // separator removed
906
-
907
- return {
908
- success: true,
909
- results,
910
- summary: `Executed ${results.length} commands`
911
- };
912
- }
913
-
914
- // Create WDA session for a device
915
- async function createWDASession(host, deviceName) {
916
- return new Promise(async (resolve) => {
917
- const sessionFile = '/tmp/ios_multi_sessions';
918
-
919
- // First, check if session already exists for this device
920
- try {
921
- const existingContent = await fs.readFile(sessionFile, 'utf-8').catch(() => '');
922
- const lines = existingContent.split('\n').filter(line => line.trim());
923
-
924
- for (const line of lines) {
925
- const [name, sessionId] = line.split(':');
926
- if (name === deviceName && sessionId) {
927
- // Session already exists, verify it's still valid
928
- const port = host === 'localhost' ? 8100 : 8100;
929
- const verifyUrl = `http://${host}:${port}/session/${sessionId}`;
930
-
931
- const verifyProcess = spawn('curl', ['-s', '-X', 'GET', verifyUrl]);
932
- let verifyOutput = '';
933
-
934
- verifyProcess.stdout.on('data', (data) => {
935
- verifyOutput += data.toString();
936
- });
937
-
938
- verifyProcess.on('close', (code) => {
939
- if (code === 0 && verifyOutput && !verifyOutput.includes('invalid session id')) {
940
- console.log(`✅ Existing valid session found: ${sessionId}`);
941
- return resolve({ success: true, sessionId, existing: true });
942
- } else {
943
- // Session is invalid, create a new one
944
- createNewSession(host, deviceName, sessionFile, resolve);
945
- }
946
- });
947
-
948
- return;
949
- }
950
- }
951
- } catch (e) {
952
- // File doesn't exist or error reading, create new session
953
- }
954
-
955
- // No existing session, create a new one
956
- createNewSession(host, deviceName, sessionFile, resolve);
957
- });
958
- }
959
-
960
- function createNewSession(host, deviceName, sessionFile, resolve) {
961
- const port = host === 'localhost' ? 8100 : 8100;
962
- const sessionUrl = `http://${host}:${port}/session`;
963
-
964
- const curlProcess = spawn('curl', [
965
- '-s',
966
- '-X', 'POST',
967
- sessionUrl,
968
- '-H', 'Content-Type: application/json',
969
- '-d', '{"capabilities":{"alwaysMatch":{}}}'
970
- ]);
971
-
972
- let output = '';
973
- curlProcess.stdout.on('data', (data) => {
974
- output += data.toString();
975
- });
976
-
977
- curlProcess.on('close', (code) => {
978
- if (code === 0 && output) {
979
- try {
980
- const response = JSON.parse(output);
981
- const sessionId = response.sessionId || response.value?.sessionId;
982
-
983
- if (sessionId) {
984
- // Read existing sessions and update
985
- fs.readFile(sessionFile, 'utf-8')
986
- .catch(() => '')
987
- .then(existingContent => {
988
- // Remove old session for this device if exists
989
- const lines = existingContent.split('\n').filter(line => {
990
- const [name] = line.split(':');
991
- return line.trim() && name !== deviceName;
992
- });
993
-
994
- // Add new session
995
- lines.push(`${deviceName}:${sessionId}`);
996
-
997
- // Write back to file
998
- return fs.writeFile(sessionFile, lines.join('\n') + '\n');
999
- })
1000
- .then(() => {
1001
- console.log(`✅ New session created and saved: ${sessionId}`);
1002
- resolve({ success: true, sessionId });
1003
- })
1004
- .catch((err) => {
1005
- console.error(`❌ Failed to save session for ${deviceName}:`, err);
1006
- resolve({ success: false });
1007
- });
1008
- } else {
1009
- resolve({ success: false });
1010
- }
1011
- } catch (e) {
1012
- console.error('Failed to parse WDA session response:', e);
1013
- resolve({ success: false });
1014
- }
1015
- } else {
1016
- resolve({ success: false });
1017
- }
1018
- });
1019
-
1020
- curlProcess.on('error', (err) => {
1021
- console.error('Error creating WDA session:', err);
1022
- resolve({ success: false });
1023
- });
1024
- }
1025
-
1026
- // Install UIAutomator2 on Android device
1027
- async function installUIAutomator2(deviceUdid, deviceName) {
1028
- return new Promise((resolve) => {
1029
- console.log(`📥 Installing UIAutomator2 on ${deviceName}...`);
1030
-
1031
- const { execSync } = require('child_process');
1032
- const os = require('os');
1033
- const path = require('path');
1034
-
1035
- try {
1036
- // Try multiple locations for APKs
1037
- const possiblePaths = [
1038
- // Appium installed location
1039
- path.join(os.homedir(), '.appium', 'node_modules', 'appium-uiautomator2-driver', 'node_modules', 'appium-uiautomator2-server', 'apks'),
1040
- // Global npm location
1041
- execSync('npm root -g', { encoding: 'utf-8' }).trim() + '/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server/apks',
1042
- // Alternative npm location
1043
- execSync('npm root -g', { encoding: 'utf-8' }).trim() + '/appium/node_modules/appium-uiautomator2-driver/node_modules/appium-uiautomator2-server/apks',
1044
- ];
1045
-
1046
- let serverApk = null;
1047
- let testApk = null;
1048
- let foundPath = null;
1049
-
1050
- // Try each path
1051
- for (const apkPath of possiblePaths) {
1052
- console.log(`📂 Checking: ${apkPath}`);
1053
-
1054
- try {
1055
- const serverCheck = execSync(`ls "${apkPath}"/appium-uiautomator2-server-v*.apk 2>/dev/null || echo ""`, { encoding: 'utf-8' }).trim();
1056
- const testCheck = execSync(`ls "${apkPath}"/appium-uiautomator2-server-debug-androidTest.apk 2>/dev/null || echo ""`, { encoding: 'utf-8' }).trim();
1057
-
1058
- if (serverCheck && testCheck) {
1059
- serverApk = serverCheck;
1060
- testApk = testCheck;
1061
- foundPath = apkPath;
1062
- console.log(`✅ Found APKs in: ${foundPath}`);
1063
- break;
1064
- }
1065
- } catch (e) {
1066
- continue;
1067
- }
1068
- }
1069
-
1070
- if (serverApk && testApk) {
1071
- console.log(`📦 Installing server APK: ${serverApk}`);
1072
- const serverOutput = execSync(`adb -s ${deviceUdid} install -r "${serverApk}" 2>&1`, { encoding: 'utf-8' });
1073
- console.log(serverOutput);
1074
-
1075
- console.log(`📦 Installing test APK: ${testApk}`);
1076
- const testOutput = execSync(`adb -s ${deviceUdid} install -r "${testApk}" 2>&1`, { encoding: 'utf-8' });
1077
- console.log(testOutput);
1078
-
1079
- console.log(`✅ UIAutomator2 installed successfully on ${deviceName}`);
1080
- resolve({
1081
- success: true,
1082
- message: 'UIAutomator2 installed successfully'
1083
- });
1084
- } else {
1085
- console.log(`⚠️ APK files not found in any expected location`);
1086
- console.log(`Tried paths:`, possiblePaths);
1087
-
1088
- // Try using appium to install
1089
- try {
1090
- console.log(`🔄 Trying to install via Appium...`);
1091
- const appiumOutput = execSync(`appium driver install uiautomator2 2>&1`, { encoding: 'utf-8' });
1092
- console.log(appiumOutput);
1093
-
1094
- resolve({
1095
- success: false,
1096
- message: 'APKs not found. Tried to reinstall driver. Please run: appium driver install uiautomator2'
1097
- });
1098
- } catch (appiumError) {
1099
- resolve({
1100
- success: false,
1101
- message: 'UIAutomator2 APKs not found. Please run: appium driver install uiautomator2'
1102
- });
1103
- }
1104
- }
1105
- } catch (error) {
1106
- console.error(`❌ Failed to install UIAutomator2: ${error.message}`);
1107
- resolve({
1108
- success: false,
1109
- message: `Failed to install UIAutomator2: ${error.message}`
1110
- });
1111
- }
1112
- });
1113
- }
1114
-
1115
- // Connect to device - starts WDA if needed
1116
- async function connectToDevice(device) {
1117
- return new Promise(async (resolve, reject) => {
1118
- const { name, udid, type, ip, platform } = device;
1119
-
1120
- console.log(`Connecting to ${name} (${type}, platform: ${platform})...`);
1121
-
1122
- // Handle Android devices differently
1123
- if (platform === 'android') {
1124
- console.log(`📱 Android device detected: ${name}`);
1125
-
1126
- // Check if device is connected via adb
1127
- const checkAdb = spawn('adb', ['devices']);
1128
- let output = '';
1129
-
1130
- checkAdb.stdout.on('data', (data) => {
1131
- output += data.toString();
1132
- });
1133
-
1134
- checkAdb.on('close', async (code) => {
1135
- const deviceConnected = output.includes(udid.replace(':5555', '')) || output.includes(udid);
1136
-
1137
- if (deviceConnected) {
1138
- console.log(`✅ Android device ${name} is connected via ADB`);
1139
-
1140
- // Don't set status to 'online' yet - wait for UIAutomator2 confirmation
1141
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1142
- if (deviceIndex !== -1) {
1143
- connectedDevices[deviceIndex].status = 'connecting';
1144
- }
1145
-
1146
- // Broadcast connecting status
1147
- wss.clients.forEach(client => {
1148
- if (client.readyState === WebSocket.OPEN) {
1149
- client.send(JSON.stringify({
1150
- type: 'devices_updated',
1151
- devices: connectedDevices
1152
- }));
1153
- }
1154
- });
1155
-
1156
- // Always ensure UIAutomator2 is installed and ready
1157
- console.log(`📦 Ensuring UIAutomator2 is installed on ${name}...`);
1158
-
1159
- // Check if already installed
1160
- const checkUiAutomator = spawn('adb', ['-s', udid, 'shell', 'pm', 'list', 'packages', 'io.appium.uiautomator2']);
1161
- let uiautomatorOutput = '';
1162
-
1163
- checkUiAutomator.stdout.on('data', (data) => {
1164
- uiautomatorOutput += data.toString();
1165
- });
1166
-
1167
- checkUiAutomator.on('close', async () => {
1168
- const isInstalled = uiautomatorOutput.includes('io.appium.uiautomator2');
1169
-
1170
- if (!isInstalled) {
1171
- console.log(`📥 UIAutomator2 not found on ${name}, installing...`);
1172
- // Install UIAutomator2
1173
- const installResult = await installUIAutomator2(udid, name);
1174
-
1175
- if (!installResult.success) {
1176
- console.log(`⚠️ UIAutomator2 installation failed on ${name}`);
1177
- resolve({
1178
- success: true,
1179
- message: `Connected to ${name} - ADB Ready ✅`
1180
- });
1181
- return;
1182
- }
1183
- } else {
1184
- console.log(`✅ UIAutomator2 already installed on ${name}`);
1185
- }
1186
-
1187
- // Check if session already exists for this device
1188
- const existingSession = androidSessions.get(udid);
1189
- if (existingSession) {
1190
- console.log(`♻️ Reusing existing UIAutomator2 session on ${name} (port: ${existingSession.port})`);
1191
-
1192
- // Verify session is still valid
1193
- try {
1194
- const axios = require('axios');
1195
- await axios.get(`http://localhost:${existingSession.port}/wd/hub/status`);
1196
- console.log(`✅ Session verified and working on ${name}`);
1197
-
1198
- // Set status to 'online'
1199
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1200
- if (deviceIndex !== -1) {
1201
- connectedDevices[deviceIndex].status = 'online';
1202
-
1203
- // Broadcast updated status
1204
- wss.clients.forEach(client => {
1205
- if (client.readyState === WebSocket.OPEN) {
1206
- client.send(JSON.stringify({
1207
- type: 'devices_updated',
1208
- devices: connectedDevices
1209
- }));
1210
- }
1211
- });
1212
- }
1213
-
1214
- resolve({
1215
- success: true,
1216
- message: `Connected to ${name} - UIAutomator2 Ready ✅`
1217
- });
1218
- return;
1219
- } catch (err) {
1220
- console.log(`⚠️ Existing session invalid, creating new one for ${name}`);
1221
- androidSessions.delete(udid);
1222
- }
1223
- }
1224
-
1225
- // Start new UIAutomator2 session
1226
- console.log(`🚀 Starting new UIAutomator2 session on ${name}...`);
1227
- const sessionResult = await startUIAutomator2Session(udid, name);
1228
-
1229
- if (sessionResult.success) {
1230
- // Set status to 'online' only after UIAutomator2 is ready
1231
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1232
- if (deviceIndex !== -1) {
1233
- connectedDevices[deviceIndex].status = 'online';
1234
-
1235
- // Broadcast updated status
1236
- wss.clients.forEach(client => {
1237
- if (client.readyState === WebSocket.OPEN) {
1238
- client.send(JSON.stringify({
1239
- type: 'devices_updated',
1240
- devices: connectedDevices
1241
- }));
1242
- }
1243
- });
1244
- }
1245
-
1246
- resolve({
1247
- success: true,
1248
- message: `Connected to ${name} - UIAutomator2 Ready ✅`
1249
- });
1250
- } else {
1251
- resolve({
1252
- success: true,
1253
- message: `Connected to ${name} - ADB Ready ✅`
1254
- });
1255
- }
1256
- });
1257
- } else {
1258
- console.log(`❌ Android device ${name} not found in ADB`);
1259
-
1260
- // If wireless, try to connect via adb
1261
- if (type === 'wireless' && ip) {
1262
- console.log(`📡 Attempting to connect to ${name} wirelessly at ${ip}:5555...`);
1263
- const adbConnect = spawn('adb', ['connect', `${ip}:5555`]);
1264
-
1265
- adbConnect.on('close', async (code) => {
1266
- if (code === 0) {
1267
- console.log(`✅ Connected to ${name} wirelessly`);
1268
-
1269
- // Don't set status yet - wait for UIAutomator2
1270
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1271
- if (deviceIndex !== -1) {
1272
- connectedDevices[deviceIndex].status = 'connecting';
1273
- }
1274
-
1275
- // Always ensure UIAutomator2 is installed
1276
- console.log(`📦 Ensuring UIAutomator2 is installed on ${name}...`);
1277
-
1278
- // Check if already installed
1279
- const checkUiAutomator = spawn('adb', ['-s', `${ip}:5555`, 'shell', 'pm', 'list', 'packages', 'io.appium.uiautomator2']);
1280
- let uiautomatorOutput = '';
1281
-
1282
- checkUiAutomator.stdout.on('data', (data) => {
1283
- uiautomatorOutput += data.toString();
1284
- });
1285
-
1286
- checkUiAutomator.on('close', async () => {
1287
- const isInstalled = uiautomatorOutput.includes('io.appium.uiautomator2');
1288
-
1289
- if (!isInstalled) {
1290
- console.log(`📥 UIAutomator2 not found on ${name}, installing...`);
1291
- const installResult = await installUIAutomator2(`${ip}:5555`, name);
1292
- if (!installResult.success) {
1293
- console.log(`⚠️ UIAutomator2 installation failed on ${name}`);
1294
- }
1295
- } else {
1296
- console.log(`✅ UIAutomator2 already installed on ${name}`);
1297
- }
1298
-
1299
- // Check if session already exists for this device
1300
- const existingSession = androidSessions.get(`${ip}:5555`);
1301
- if (existingSession) {
1302
- console.log(`♻️ Reusing existing UIAutomator2 session on ${name} (port: ${existingSession.port})`);
1303
-
1304
- // Verify session is still valid
1305
- try {
1306
- const axios = require('axios');
1307
- await axios.get(`http://localhost:${existingSession.port}/wd/hub/status`);
1308
- console.log(`✅ Session verified and working on ${name}`);
1309
-
1310
- // Set status to 'online'
1311
- if (deviceIndex !== -1) {
1312
- connectedDevices[deviceIndex].status = 'online';
1313
-
1314
- // Broadcast updated status
1315
- wss.clients.forEach(client => {
1316
- if (client.readyState === WebSocket.OPEN) {
1317
- client.send(JSON.stringify({
1318
- type: 'devices_updated',
1319
- devices: connectedDevices
1320
- }));
1321
- }
1322
- });
1323
- }
1324
-
1325
- resolve({
1326
- success: true,
1327
- message: `Connected to ${name} - UIAutomator2 Ready ✅`
1328
- });
1329
- return;
1330
- } catch (err) {
1331
- console.log(`⚠️ Existing session invalid, creating new one for ${name}`);
1332
- androidSessions.delete(`${ip}:5555`);
1333
- }
1334
- }
1335
-
1336
- // Start new UIAutomator2 session
1337
- console.log(`🚀 Starting new UIAutomator2 session on ${name}...`);
1338
- const sessionResult = await startUIAutomator2Session(`${ip}:5555`, name);
1339
-
1340
- let message = '';
1341
- if (sessionResult.success) {
1342
- // Now set status to 'online' after UIAutomator2 is ready
1343
- if (deviceIndex !== -1) {
1344
- connectedDevices[deviceIndex].status = 'online';
1345
-
1346
- // Broadcast updated status
1347
- wss.clients.forEach(client => {
1348
- if (client.readyState === WebSocket.OPEN) {
1349
- client.send(JSON.stringify({
1350
- type: 'devices_updated',
1351
- devices: connectedDevices
1352
- }));
1353
- }
1354
- });
1355
- }
1356
-
1357
- message = `Connected to ${name} - UIAutomator2 Ready ✅`;
1358
- } else {
1359
- message = `Connected to ${name} - ADB Ready ✅`;
1360
- }
1361
-
1362
- resolve({
1363
- success: true,
1364
- message: message
1365
- });
1366
- });
1367
- } else {
1368
- reject({
1369
- success: false,
1370
- message: `Failed to connect to ${name}. Make sure USB debugging is enabled and device is on the same network.`
1371
- });
1372
- }
1373
- });
1374
- } else {
1375
- reject({
1376
- success: false,
1377
- message: `Android device ${name} not connected. Please connect via USB or enable wireless debugging.`
1378
- });
1379
- }
1380
- }
1381
- });
1382
-
1383
- checkAdb.on('error', (err) => {
1384
- console.error(`❌ ADB error: ${err.message}`);
1385
- reject({
1386
- success: false,
1387
- message: `ADB not available. Please install Android SDK Platform-Tools.`
1388
- });
1389
- });
1390
-
1391
- return; // Exit early for Android devices
1392
- }
1393
-
1394
- // iOS device handling continues below
1395
- if (type === 'usb') {
1396
- // For USB devices, check if WDA is already running
1397
- const checkWDA = spawn('curl', [
1398
- '-s',
1399
- '--connect-timeout', '2',
1400
- 'http://localhost:8100/status'
1401
- ]);
1402
-
1403
- let output = '';
1404
- checkWDA.stdout.on('data', (data) => {
1405
- output += data.toString();
1406
- });
1407
-
1408
- checkWDA.on('error', (err) => {
1409
- console.error(`❌ Error checking WDA: ${err.message}`);
1410
- reject({ success: false, message: `Failed to check WDA status: ${err.message}` });
1411
- });
1412
-
1413
- checkWDA.on('close', async (code) => {
1414
- if (output.includes('"state"')) {
1415
- console.log(`✅ WDA already running for ${name}`);
1416
-
1417
- // Create WDA session if not exists
1418
- console.log(`📱 Creating WDA session for ${name}...`);
1419
- const sessionResult = await createWDASession('localhost', name);
1420
-
1421
- if (sessionResult.success) {
1422
- console.log(`✅ Session created: ${sessionResult.sessionId}`);
1423
- } else {
1424
- console.log(`⚠️ Session creation failed, will be created on first command`);
1425
- }
1426
-
1427
- // Update status to online
1428
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1429
- if (deviceIndex !== -1) {
1430
- connectedDevices[deviceIndex].status = 'online';
1431
- }
1432
-
1433
- // Broadcast updated device list
1434
- wss.clients.forEach(client => {
1435
- if (client.readyState === WebSocket.OPEN) {
1436
- client.send(JSON.stringify({
1437
- type: 'devices_updated',
1438
- devices: connectedDevices
1439
- }));
1440
- }
1441
- });
1442
-
1443
- resolve({ success: true, message: `Connected to ${name} - WDA Ready ✅` });
1444
- } else {
1445
- console.log(`🚀 Starting WDA for ${name} (UDID: ${udid})...`);
1446
-
1447
- // Start WDA using xcodebuild
1448
- // First, check if we have WebDriverAgent path
1449
- const wdaPath = process.env.WDA_PATH || path.join(process.env.HOME, 'Downloads/WebDriverAgent-10.2.1');
1450
-
1451
- console.log(`📂 WDA Path: ${wdaPath}`);
1452
- console.log(`📱 Device UDID: ${udid}`);
1453
-
1454
- // Start xcodebuild in background with piped output for debugging
1455
- const wdaProcess = spawn('xcodebuild', [
1456
- 'test',
1457
- '-project', path.join(wdaPath, 'WebDriverAgent.xcodeproj'),
1458
- '-scheme', 'WebDriverAgentRunner',
1459
- '-destination', `id=${udid}`,
1460
- 'IPHONEOS_DEPLOYMENT_TARGET=14.0'
1461
- ], {
1462
- cwd: wdaPath,
1463
- detached: true,
1464
- stdio: ['ignore', 'pipe', 'pipe']
1465
- });
1466
-
1467
- // Log output for debugging
1468
- wdaProcess.stdout.on('data', (data) => {
1469
- const output = data.toString();
1470
- if (output.includes('ServerURLHere') || output.includes('WebDriverAgent')) {
1471
- console.log(`📱 WDA: ${output.trim()}`);
1472
- }
1473
- });
1474
-
1475
- wdaProcess.stderr.on('data', (data) => {
1476
- const error = data.toString();
1477
- if (!error.includes('note:') && !error.includes('warning:')) {
1478
- console.error(`⚠️ WDA Error: ${error.trim()}`);
1479
- }
1480
- });
1481
-
1482
- wdaProcess.on('error', (err) => {
1483
- console.error(`❌ Failed to start xcodebuild: ${err.message}`);
1484
- });
1485
-
1486
- wdaProcess.unref();
1487
-
1488
- // Also start iproxy to forward port
1489
- console.log(`🔌 Starting iproxy for port forwarding...`);
1490
- const iproxyProcess = spawn('iproxy', ['8100', '8100'], {
1491
- detached: true,
1492
- stdio: ['ignore', 'pipe', 'pipe']
1493
- });
1494
-
1495
- iproxyProcess.stdout.on('data', (data) => {
1496
- console.log(`🔌 iproxy: ${data.toString().trim()}`);
1497
- });
1498
-
1499
- iproxyProcess.on('error', (err) => {
1500
- console.error(`❌ Failed to start iproxy: ${err.message}`);
1501
- console.error(` Make sure libimobiledevice is installed: brew install libimobiledevice`);
1502
- });
1503
-
1504
- iproxyProcess.unref();
1505
-
1506
- // Track WDA processes for cleanup on disconnect
1507
- wdaProcesses.set(name, {
1508
- xcodebuild: wdaProcess.pid,
1509
- iproxy: iproxyProcess.pid
1510
- });
1511
-
1512
- console.log(`✅ WDA starting for ${name}. Process ID: ${wdaProcess.pid}`);
1513
-
1514
- // Wait a bit for WDA to start, then verify
1515
- setTimeout(() => {
1516
- const verifyWDA = spawn('curl', [
1517
- '-s',
1518
- '--connect-timeout', '5',
1519
- 'http://localhost:8100/status'
1520
- ]);
1521
-
1522
- let verifyOutput = '';
1523
- verifyWDA.stdout.on('data', (data) => {
1524
- verifyOutput += data.toString();
1525
- });
1526
-
1527
- verifyWDA.on('close', async () => {
1528
- if (verifyOutput.includes('"state"')) {
1529
- console.log(`✅ WDA successfully started for ${name}`);
1530
-
1531
- // Create WDA session for USB device
1532
- console.log(`📱 Creating WDA session for ${name}...`);
1533
- const sessionResult = await createWDASession('localhost', name);
1534
-
1535
- if (sessionResult.success) {
1536
- console.log(`✅ Session created: ${sessionResult.sessionId}`);
1537
- } else {
1538
- console.log(`⚠️ Session creation failed, will be created on first command`);
1539
- }
1540
-
1541
- // Update device status to online in connectedDevices
1542
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1543
- if (deviceIndex !== -1) {
1544
- connectedDevices[deviceIndex].status = 'online';
1545
- }
1546
-
1547
- // Broadcast updated device list and connection status to all WebSocket clients
1548
- wss.clients.forEach(client => {
1549
- if (client.readyState === WebSocket.OPEN) {
1550
- client.send(JSON.stringify({
1551
- type: 'devices_updated',
1552
- devices: connectedDevices
1553
- }));
1554
- // Send connection complete message
1555
- client.send(JSON.stringify({
1556
- type: 'command_output',
1557
- output: `✅ ${name} connected - WDA Ready!\n${'─'.repeat(50)}\n`,
1558
- device: name
1559
- }));
1560
- }
1561
- });
1562
- } else {
1563
- console.log(`⚠️ WDA still starting for ${name}...`);
1564
- }
1565
- });
1566
- }, 8000); // Wait 8 seconds for WDA to start
1567
-
1568
- // Return immediately with starting status
1569
- resolve({
1570
- success: true,
1571
- message: `Connecting to ${name} - Starting WDA...`,
1572
- wdaStarting: true
1573
- });
1574
- }
1575
- });
1576
-
1577
- checkWDA.on('error', () => {
1578
- console.log(`⚠️ Could not check WDA status, attempting to start...`);
1579
- resolve({ success: false, message: `Error checking WDA. Please start manually in Xcode.` });
1580
- });
1581
- } else {
1582
- // For wireless devices, check if WDA is reachable
1583
- const checkWDA = spawn('curl', [
1584
- '-s',
1585
- '--connect-timeout', '3',
1586
- `http://${ip}:8100/status`
1587
- ]);
1588
-
1589
- let output = '';
1590
- checkWDA.stdout.on('data', (data) => {
1591
- output += data.toString();
1592
- });
1593
-
1594
- checkWDA.on('close', async () => {
1595
- if (output.includes('"state"')) {
1596
- console.log(`✅ WDA reachable for ${name}`);
1597
-
1598
- // Create WDA session for wireless device
1599
- console.log(`📱 Creating WDA session for ${name}...`);
1600
- const sessionResult = await createWDASession(ip, name);
1601
-
1602
- if (sessionResult.success) {
1603
- console.log(`✅ Session created: ${sessionResult.sessionId}`);
1604
- } else {
1605
- console.log(`⚠️ Session creation failed, will be created on first command`);
1606
- }
1607
-
1608
- // Update status to online
1609
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1610
- if (deviceIndex !== -1) {
1611
- connectedDevices[deviceIndex].status = 'online';
1612
- }
1613
-
1614
- // Broadcast updated device list
1615
- wss.clients.forEach(client => {
1616
- if (client.readyState === WebSocket.OPEN) {
1617
- client.send(JSON.stringify({
1618
- type: 'devices_updated',
1619
- devices: connectedDevices
1620
- }));
1621
- }
1622
- });
1623
-
1624
- resolve({ success: true, message: `Connected to ${name} - WDA Ready ✅` });
1625
- } else {
1626
- console.log(`❌ WDA not running on ${name}, attempting to start...`);
1627
-
1628
- // Start WDA wirelessly using xcodebuild
1629
- const wdaPath = process.env.WDA_PATH || path.join(process.env.HOME, 'Downloads/WebDriverAgent-10.2.1');
1630
-
1631
- console.log(`📂 WDA Path: ${wdaPath}`);
1632
- console.log(`📱 Device UDID: ${udid}`);
1633
- console.log(`📡 Device IP: ${ip}`);
1634
-
1635
- // Start xcodebuild in background for wireless device
1636
- const wdaProcess = spawn('xcodebuild', [
1637
- 'test',
1638
- '-project', path.join(wdaPath, 'WebDriverAgent.xcodeproj'),
1639
- '-scheme', 'WebDriverAgentRunner',
1640
- '-destination', `id=${udid}`,
1641
- 'IPHONEOS_DEPLOYMENT_TARGET=14.0'
1642
- ], {
1643
- cwd: wdaPath,
1644
- detached: true,
1645
- stdio: ['ignore', 'pipe', 'pipe']
1646
- });
1647
-
1648
- // Log output for debugging
1649
- wdaProcess.stdout.on('data', (data) => {
1650
- const output = data.toString();
1651
- if (output.includes('ServerURLHere') || output.includes('WebDriverAgent')) {
1652
- console.log(`📱 WDA (${name}): ${output.trim()}`);
1653
- }
1654
- });
1655
-
1656
- wdaProcess.stderr.on('data', (data) => {
1657
- const error = data.toString();
1658
- if (!error.includes('note:') && !error.includes('warning:')) {
1659
- console.error(`⚠️ WDA Error (${name}): ${error.trim()}`);
1660
- }
1661
- });
1662
-
1663
- wdaProcess.on('error', (err) => {
1664
- console.error(`❌ Failed to start xcodebuild for ${name}: ${err.message}`);
1665
- });
1666
-
1667
- wdaProcess.unref();
1668
-
1669
- // Track WDA process for cleanup on disconnect
1670
- wdaProcesses.set(name, {
1671
- xcodebuild: wdaProcess.pid
1672
- });
1673
-
1674
- console.log(`✅ WDA starting for ${name} (wireless). Process ID: ${wdaProcess.pid}`);
1675
-
1676
- // Wait for WDA to start, then verify
1677
- setTimeout(() => {
1678
- const verifyWDA = spawn('curl', [
1679
- '-s',
1680
- '--connect-timeout', '5',
1681
- `http://${ip}:8100/status`
1682
- ]);
1683
-
1684
- let verifyOutput = '';
1685
- verifyWDA.stdout.on('data', (data) => {
1686
- verifyOutput += data.toString();
1687
- });
1688
-
1689
- verifyWDA.on('close', async () => {
1690
- if (verifyOutput.includes('"state"')) {
1691
- console.log(`✅ WDA successfully started for ${name}`);
1692
-
1693
- // Create WDA session for wireless device
1694
- console.log(`📱 Creating WDA session for ${name}...`);
1695
- const sessionResult = await createWDASession(ip, name);
1696
-
1697
- if (sessionResult.success) {
1698
- console.log(`✅ Session created: ${sessionResult.sessionId}`);
1699
- } else {
1700
- console.log(`⚠️ Session creation failed, will be created on first command`);
1701
- }
1702
-
1703
- // Update device status to online
1704
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1705
- if (deviceIndex !== -1) {
1706
- connectedDevices[deviceIndex].status = 'online';
1707
- }
1708
-
1709
- // Broadcast updated device list
1710
- wss.clients.forEach(client => {
1711
- if (client.readyState === WebSocket.OPEN) {
1712
- client.send(JSON.stringify({
1713
- type: 'devices_updated',
1714
- devices: connectedDevices
1715
- }));
1716
- }
1717
- });
1718
-
1719
- resolve({
1720
- success: true,
1721
- message: `Connected to ${name} via WiFi - WDA Started!`,
1722
- wdaStarted: true
1723
- });
1724
- } else {
1725
- console.log(`⚠️ WDA starting for ${name}, may take a moment...`);
1726
- resolve({
1727
- success: true,
1728
- message: `WDA is starting for ${name}. Please wait 10-15 seconds...`,
1729
- wdaStarting: true
1730
- });
1731
- }
1732
- });
1733
- }, 10000); // Wait 10 seconds for wireless WDA to start
1734
- }
1735
- });
1736
-
1737
- checkWDA.on('error', () => {
1738
- console.log(`⚠️ Cannot reach ${name} at ${ip}. Check network connection.`);
1739
- reject({ success: false, message: `Cannot reach ${name} at ${ip}. Check network connection.` });
1740
- });
1741
- }
1742
- });
1743
- }
1744
-
1745
- // Disconnect from device
1746
- async function disconnectFromDevice(device) {
1747
- return new Promise((resolve, reject) => {
1748
- const { name, connectionType, udid, platform } = device;
1749
- console.log(`🔌 Disconnecting from ${name} (${connectionType}, platform: ${platform})...`);
1750
-
1751
- // Handle Android devices
1752
- if (platform === 'android') {
1753
- console.log(`📱 Android device disconnect: ${name}`);
1754
-
1755
- // Stop UIAutomator2 session first
1756
- stopUIAutomator2Session(udid, name).catch(err => {
1757
- console.error(`Error stopping UIAutomator2 session: ${err.message}`);
1758
- });
1759
-
1760
- // For wireless Android devices, disconnect adb
1761
- if (connectionType === 'wireless') {
1762
- const adbDisconnect = spawn('adb', ['disconnect', udid]);
1763
-
1764
- adbDisconnect.on('close', (code) => {
1765
- console.log(`✅ Disconnected Android device ${name} from ADB`);
1766
-
1767
- // Update device status
1768
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1769
- if (deviceIndex !== -1) {
1770
- connectedDevices[deviceIndex].status = 'offline';
1771
- }
1772
-
1773
- // Broadcast update
1774
- wss.clients.forEach(client => {
1775
- if (client.readyState === WebSocket.OPEN) {
1776
- client.send(JSON.stringify({
1777
- type: 'devices_updated',
1778
- devices: connectedDevices
1779
- }));
1780
- }
1781
- });
1782
-
1783
- resolve({
1784
- success: true,
1785
- message: `Disconnected from ${name} - ADB disconnected`
1786
- });
1787
- });
1788
- } else {
1789
- // For USB Android devices, just update status
1790
-
1791
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1792
- if (deviceIndex !== -1) {
1793
- connectedDevices[deviceIndex].status = 'offline';
1794
- }
1795
-
1796
- // Broadcast update
1797
- wss.clients.forEach(client => {
1798
- if (client.readyState === WebSocket.OPEN) {
1799
- client.send(JSON.stringify({
1800
- type: 'devices_updated',
1801
- devices: connectedDevices
1802
- }));
1803
- }
1804
- });
1805
-
1806
- resolve({
1807
- success: true,
1808
- message: `Disconnected from ${name}`
1809
- });
1810
- }
1811
-
1812
- return; // Exit early for Android
1813
- }
1814
-
1815
- // iOS device handling - Find the device in connectedDevices to get its port
1816
- const deviceInfo = connectedDevices.find(d => d.name === name);
1817
- const port = deviceInfo?.port;
1818
-
1819
- // Strategy 1: Kill WDA processes tracked in wdaProcesses Map
1820
- if (wdaProcesses.has(name)) {
1821
- const processes = wdaProcesses.get(name);
1822
-
1823
- try {
1824
- if (processes.xcodebuild) {
1825
- try {
1826
- process.kill(processes.xcodebuild, 'SIGTERM');
1827
- console.log(`✅ Killed xcodebuild for ${name} (PID: ${processes.xcodebuild})`);
1828
- } catch (e) {
1829
- console.log(`⚠️ xcodebuild process ${processes.xcodebuild} already stopped`);
1830
- }
1831
- }
1832
-
1833
- if (processes.iproxy) {
1834
- try {
1835
- process.kill(processes.iproxy, 'SIGTERM');
1836
- console.log(`✅ Killed iproxy for ${name} (PID: ${processes.iproxy})`);
1837
- } catch (e) {
1838
- console.log(`⚠️ iproxy process ${processes.iproxy} already stopped`);
1839
- }
1840
- }
1841
-
1842
- wdaProcesses.delete(name);
1843
- } catch (error) {
1844
- console.error(`Error cleaning up tracked processes for ${name}:`, error);
1845
- }
1846
- }
1847
-
1848
- // Strategy 2: Kill processes by port (works for script-started WDA too)
1849
- if (port) {
1850
- console.log(`🔍 Killing processes on port ${port} for ${name}...`);
1851
- const killPort = spawn('sh', ['-c', `lsof -ti:${port} | xargs kill -9 2>/dev/null || true`]);
1852
-
1853
- killPort.on('close', () => {
1854
- console.log(`✅ Cleaned up port ${port} for ${name}`);
1855
- });
1856
- }
1857
-
1858
- // Strategy 3: Kill xcodebuild processes for this specific UDID
1859
- if (udid && connectionType === 'usb') {
1860
- console.log(`🔍 Killing WDA for UDID ${udid}...`);
1861
- const killWDA = spawn('sh', ['-c', `pkill -f "xcodebuild.*${udid}" || true`]);
1862
-
1863
- killWDA.on('close', () => {
1864
- console.log(`✅ Cleaned up WDA processes for ${name}`);
1865
- });
1866
- }
1867
-
1868
- // Strategy 4: For wireless, kill iproxy processes associated with this device's port
1869
- if (connectionType === 'usb' && port) {
1870
- const killIproxy = spawn('sh', ['-c', `pkill -f "iproxy.*${port}" || true`]);
1871
- killIproxy.on('close', () => {
1872
- console.log(`✅ Cleaned up iproxy for ${name}`);
1873
- });
1874
- }
1875
-
1876
- // Wait a moment for all cleanup to complete
1877
- setTimeout(() => {
1878
- // Update device status to offline in connectedDevices
1879
- const deviceIndex = connectedDevices.findIndex(d => d.name === name);
1880
- if (deviceIndex !== -1) {
1881
- connectedDevices[deviceIndex].status = 'offline';
1882
- }
1883
-
1884
- // Broadcast updated device list to all WebSocket clients
1885
- wss.clients.forEach(client => {
1886
- if (client.readyState === WebSocket.OPEN) {
1887
- client.send(JSON.stringify({
1888
- type: 'devices_updated',
1889
- devices: connectedDevices
1890
- }));
1891
- }
1892
- });
1893
-
1894
- console.log(`✅ Successfully disconnected ${name}`);
1895
- resolve({
1896
- success: true,
1897
- message: `Disconnected from ${name} - WDA stopped`
1898
- });
1899
- }, 500);
1900
- });
1901
- }
1902
-
1903
- // ============================================
1904
- // Recording & Replay Functions
1905
- // ============================================
1906
-
1907
- // Ensure recordings directory exists
1908
- async function ensureRecordingsDir() {
1909
- try {
1910
- await fs.access(RECORDINGS_DIR);
1911
- } catch {
1912
- await fs.mkdir(RECORDINGS_DIR, { recursive: true });
1913
- }
1914
- }
1915
-
1916
- // Start recording
1917
- async function startRecording(name, devices) {
1918
- await ensureRecordingsDir();
1919
-
1920
- currentRecording = {
1921
- name: name || `recording_${Date.now()}`,
1922
- devices: devices || [],
1923
- commands: [],
1924
- startTime: new Date().toISOString()
1925
- };
1926
- isRecording = true;
1927
-
1928
- console.log(`🔴 Recording started: ${currentRecording.name}`);
1929
- return { success: true, recording: currentRecording };
1930
- }
1931
-
1932
- // Add command to current recording
1933
- function recordCommand(devices, command, useAI, convertedCommand) {
1934
- if (!isRecording || !currentRecording) {
1935
- return false;
1936
- }
1937
-
1938
- currentRecording.commands.push({
1939
- timestamp: new Date().toISOString(),
1940
- devices,
1941
- originalCommand: command,
1942
- useAI,
1943
- finalCommand: convertedCommand || command
1944
- });
1945
-
1946
- console.log(`📝 Recorded command: ${command} (${currentRecording.commands.length} total)`);
1947
- return true;
1948
- }
1949
-
1950
- // Stop recording and save
1951
- async function stopRecording() {
1952
- if (!isRecording || !currentRecording) {
1953
- return { success: false, error: 'No active recording' };
1954
- }
1955
-
1956
- currentRecording.endTime = new Date().toISOString();
1957
-
1958
- const filename = `${currentRecording.name}.json`;
1959
- const filepath = path.join(RECORDINGS_DIR, filename);
1960
-
1961
- await fs.writeFile(filepath, JSON.stringify(currentRecording, null, 2));
1962
-
1963
- const result = {
1964
- success: true,
1965
- recording: currentRecording,
1966
- filepath: filename
1967
- };
1968
-
1969
- console.log(`⏹️ Recording stopped: ${currentRecording.name} (${currentRecording.commands.length} commands)`);
1970
-
1971
- isRecording = false;
1972
- currentRecording = null;
1973
-
1974
- return result;
1975
- }
1976
-
1977
- // List all recordings
1978
- async function listRecordings() {
1979
- await ensureRecordingsDir();
1980
-
1981
- try {
1982
- const files = await fs.readdir(RECORDINGS_DIR);
1983
- const recordings = [];
1984
-
1985
- for (const file of files) {
1986
- if (file.endsWith('.json')) {
1987
- try {
1988
- const filepath = path.join(RECORDINGS_DIR, file);
1989
- const content = await fs.readFile(filepath, 'utf-8');
1990
- const recording = JSON.parse(content);
1991
-
1992
- // Handle both old format (array of commands) and new format (string)
1993
- let commandCount = 0;
1994
- if (Array.isArray(recording.commands)) {
1995
- commandCount = recording.commands.length;
1996
- } else if (typeof recording.commands === 'string') {
1997
- commandCount = recording.commands.split('\n').filter(cmd => cmd.trim()).length;
1998
- }
1999
-
2000
- recordings.push({
2001
- filename: file,
2002
- name: recording.name || file.replace('.json', ''),
2003
- devices: recording.devices || [],
2004
- commandCount: commandCount,
2005
- startTime: recording.startTime || recording.date,
2006
- endTime: recording.endTime || recording.date,
2007
- type: recording.type || 'manual'
2008
- });
2009
- } catch (e) {
2010
- console.error(`Error reading recording ${file}:`, e);
2011
- }
2012
- }
2013
- }
2014
-
2015
- return recordings;
2016
- } catch (error) {
2017
- console.error('Error listing recordings:', error);
2018
- return [];
2019
- }
2020
- }
2021
-
2022
- // Load a recording
2023
- async function loadRecording(filename) {
2024
- const filepath = path.join(RECORDINGS_DIR, filename);
2025
-
2026
- try {
2027
- const content = await fs.readFile(filepath, 'utf-8');
2028
- return JSON.parse(content);
2029
- } catch (error) {
2030
- console.error(`Error loading recording ${filename}:`, error);
2031
- throw error;
2032
- }
2033
- }
2034
-
2035
- // Delete a recording
2036
- async function deleteRecording(filename) {
2037
- const filepath = path.join(RECORDINGS_DIR, filename);
2038
-
2039
- try {
2040
- await fs.unlink(filepath);
2041
- return { success: true };
2042
- } catch (error) {
2043
- console.error(`Error deleting recording ${filename}:`, error);
2044
- throw error;
2045
- }
2046
- }
2047
-
2048
- // Replay a recording
2049
- async function replayRecording(filename, targetDevices, wsClient) {
2050
- const recording = await loadRecording(filename);
2051
-
2052
- // Normalize commands to array format
2053
- let commands = [];
2054
- if (Array.isArray(recording.commands)) {
2055
- // Old format: array of command objects
2056
- commands = recording.commands.map(cmd => cmd.finalCommand || cmd.originalCommand);
2057
- } else if (typeof recording.commands === 'string') {
2058
- // New format: string with newlines
2059
- commands = recording.commands.split('\n').filter(cmd => cmd.trim());
2060
- }
2061
-
2062
- const devices = recording.devices && recording.devices.length > 0
2063
- ? recording.devices
2064
- : targetDevices;
2065
-
2066
- // separator removed
2067
- console.log(`REPLAYING: ${recording.name}`);
2068
- console.log(`Original devices: ${devices.join(', ')}`);
2069
- console.log(`Target devices: ${targetDevices.join(', ')}`);
2070
- console.log(`Commands to replay: ${commands.length}`);
2071
- // separator removed
2072
-
2073
- // Reset abort flag at start
2074
- replayAborted = false;
2075
- isReplaying = true;
2076
-
2077
- // Send initial summary to terminal
2078
- if (wsClient) {
2079
- wsClient.send(JSON.stringify({
2080
- type: 'command_output',
2081
- data: `📼 Recording: ${recording.name}\n` +
2082
- `📱 Devices: ${targetDevices.join(', ')}\n` +
2083
- `📝 Commands: ${commands.length}\n` +
2084
- `${'━'.repeat(50)}\n\n`,
2085
- devices: targetDevices
2086
- }));
2087
- }
2088
-
2089
- const results = [];
2090
-
2091
- for (let i = 0; i < commands.length; i++) {
2092
- // Check if replay was aborted
2093
- if (replayAborted) {
2094
- console.log('\n⏹️ Replay aborted by user\n');
2095
- if (wsClient) {
2096
- wsClient.send(JSON.stringify({
2097
- type: 'command_output',
2098
- data: '\n⏹️ Replay stopped by user\n',
2099
- devices: targetDevices
2100
- }));
2101
- }
2102
- isReplaying = false;
2103
- throw new Error('Replay aborted by user');
2104
- }
2105
-
2106
- const cmd = commands[i];
2107
-
2108
- console.log(`\n🎬 Replaying command ${i + 1}/${commands.length}`);
2109
- console.log(` Command: ${cmd}`);
2110
-
2111
- if (wsClient) {
2112
- wsClient.send(JSON.stringify({
2113
- type: 'command_output',
2114
- data: `🎬 [${i + 1}/${commands.length}] Executing: ${cmd}\n`,
2115
- devices: targetDevices
2116
- }));
2117
- }
2118
-
2119
- try {
2120
- // Execute the command
2121
- const result = await executeCommand(targetDevices, cmd, null); // null to suppress websocket output from executeCommand
2122
- results.push({ command: cmd, success: true, result });
2123
-
2124
- if (wsClient) {
2125
- wsClient.send(JSON.stringify({
2126
- type: 'command_output',
2127
- data: `✅ Completed successfully\n\n`,
2128
- devices: targetDevices
2129
- }));
2130
- }
2131
-
2132
- // Add a small delay between commands
2133
- if (i < commands.length - 1) {
2134
- await new Promise(resolve => setTimeout(resolve, 1000));
2135
- }
2136
- } catch (error) {
2137
- console.error(`❌ Replay command ${i + 1} failed:`, error.message);
2138
- results.push({ command: cmd, success: false, error: error.message });
2139
-
2140
- if (wsClient) {
2141
- wsClient.send(JSON.stringify({
2142
- type: 'command_output',
2143
- data: `❌ Failed: ${error.message}\n\n`,
2144
- devices: targetDevices
2145
- }));
2146
- }
2147
- }
2148
- }
2149
-
2150
- isReplaying = false;
2151
-
2152
- // separator removed
2153
- console.log(`REPLAY COMPLETE`);
2154
- console.log(`Total: ${results.length}, Success: ${results.filter(r => r.success).length}, Failed: ${results.filter(r => !r.success).length}`);
2155
- // separator removed
2156
-
2157
- return {
2158
- success: true,
2159
- recording: recording.name,
2160
- results
2161
- };
2162
- }
2163
-
2164
- // API Routes
2165
- app.get('/api/devices', async (req, res) => {
2166
- try {
2167
- const devices = await discoverDevices();
2168
- res.json({ success: true, devices });
2169
- } catch (error) {
2170
- res.status(500).json({ success: false, error: error.message });
2171
- }
2172
- });
2173
-
2174
- app.post('/api/devices/refresh', async (req, res) => {
2175
- try {
2176
- const devices = await discoverDevices();
2177
-
2178
- // Broadcast to all WebSocket clients
2179
- wss.clients.forEach(client => {
2180
- if (client.readyState === WebSocket.OPEN) {
2181
- client.send(JSON.stringify({
2182
- type: 'devices_updated',
2183
- devices
2184
- }));
2185
- }
2186
- });
2187
-
2188
- res.json({ success: true, devices });
2189
- } catch (error) {
2190
- res.status(500).json({ success: false, error: error.message });
2191
- }
2192
- });
2193
-
2194
- app.post('/api/execute', async (req, res) => {
2195
- try {
2196
- const { devices, command, useAI, aiProvider } = req.body;
2197
-
2198
- if (!devices || devices.length === 0) {
2199
- return res.status(400).json({ success: false, error: 'No devices specified' });
2200
- }
2201
-
2202
- let finalCommand = command;
2203
- if (useAI) {
2204
- finalCommand = await convertNaturalLanguageToCommand(command, devices, aiProvider);
2205
- }
2206
-
2207
- // Check if command has multiple lines (sequential execution)
2208
- const hasMultipleCommands = finalCommand.includes('\n');
2209
-
2210
- let result;
2211
- if (hasMultipleCommands) {
2212
-
2213
- result = await executeCommandsSequentially(devices, finalCommand, null);
2214
- } else {
2215
- result = await executeCommand(devices, finalCommand, null);
2216
- }
2217
-
2218
- res.json(result);
2219
- } catch (error) {
2220
- res.status(500).json({ success: false, error: error.message });
2221
- }
2222
- });
2223
-
2224
- app.post('/api/convert-command', async (req, res) => {
2225
- try {
2226
- const { text, devices, provider } = req.body;
2227
- const command = await convertNaturalLanguageToCommand(text, devices || [], provider);
2228
- res.json({ success: true, command });
2229
- } catch (error) {
2230
- res.status(500).json({ success: false, error: error.message });
2231
- }
2232
- });
2233
-
2234
- // Connect to device endpoint
2235
- app.post('/api/devices/connect', async (req, res) => {
2236
- try {
2237
- const { device } = req.body;
2238
- console.log(`📡 Connect request received for device:`, device);
2239
-
2240
- if (!device) {
2241
- console.error('❌ No device provided in request');
2242
- return res.status(400).json({ success: false, error: 'No device provided' });
2243
- }
2244
-
2245
- if (!device.name || !device.udid) {
2246
- console.error('❌ Invalid device object:', device);
2247
- return res.status(400).json({ success: false, error: 'Invalid device object' });
2248
- }
2249
-
2250
- const result = await connectToDevice(device);
2251
- console.log(`✅ Connect result:`, result);
2252
- res.json(result);
2253
- } catch (error) {
2254
- console.error(`❌ Connect error:`, error);
2255
- res.status(500).json({ success: false, error: error.message });
2256
- }
2257
- });
2258
-
2259
- // Disconnect from device endpoint
2260
- app.post('/api/devices/disconnect', async (req, res) => {
2261
- try {
2262
- const { device } = req.body;
2263
- const result = await disconnectFromDevice(device);
2264
- res.json(result);
2265
- } catch (error) {
2266
- res.status(500).json({ success: false, error: error.message });
2267
- }
2268
- });
2269
-
2270
- // Disconnect all devices endpoint
2271
- app.post('/api/devices/disconnect-all', async (req, res) => {
2272
- try {
2273
- console.log(`🔌 Disconnecting ALL devices...`);
2274
-
2275
- // Get all connected devices
2276
- const devicesToDisconnect = connectedDevices.filter(d => d.status === 'online');
2277
-
2278
- if (devicesToDisconnect.length === 0) {
2279
- return res.json({
2280
- success: true,
2281
- message: 'No devices to disconnect'
2282
- });
2283
- }
2284
-
2285
- console.log(`📱 Disconnecting ${devicesToDisconnect.length} device(s)...`);
2286
-
2287
- // Disconnect all devices in parallel
2288
- const disconnectPromises = devicesToDisconnect.map(device => disconnectFromDevice(device));
2289
- await Promise.all(disconnectPromises);
2290
-
2291
- console.log(`✅ All devices disconnected`);
2292
-
2293
- res.json({
2294
- success: true,
2295
- message: `Disconnected ${devicesToDisconnect.length} device(s)`,
2296
- count: devicesToDisconnect.length
2297
- });
2298
- } catch (error) {
2299
- console.error(`❌ Error disconnecting all devices:`, error);
2300
- res.status(500).json({ success: false, error: error.message });
2301
- }
2302
- });
2303
-
2304
- // New endpoints for AI provider management
2305
- app.get('/api/ai/providers', (req, res) => {
2306
- try {
2307
- const providers = aiManager.getAvailableProviders();
2308
- const current = aiManager.getCurrentProvider();
2309
- res.json({ success: true, providers, current: current.id });
2310
- } catch (error) {
2311
- res.status(500).json({ success: false, error: error.message });
2312
- }
2313
- });
2314
-
2315
- app.post('/api/ai/provider', (req, res) => {
2316
- try {
2317
- const { provider } = req.body;
2318
- const success = aiManager.setProvider(provider);
2319
- if (success) {
2320
- res.json({ success: true, provider });
2321
- } else {
2322
- res.status(400).json({ success: false, error: 'Invalid or unavailable provider' });
2323
- }
2324
- } catch (error) {
2325
- res.status(500).json({ success: false, error: error.message });
2326
- }
2327
- });
2328
-
2329
- // Settings API - Get API configuration
2330
- app.get('/api/settings/api-config', async (req, res) => {
2331
- try {
2332
- const configPath = path.join(__dirname, '../../.env');
2333
- let config = {
2334
- provider: process.env.AI_PROVIDER || 'gemini',
2335
- model: process.env.AI_MODEL || '',
2336
- openai_api_key: process.env.OPENAI_API_KEY || '',
2337
- gemini_api_key: process.env.GEMINI_API_KEY || '',
2338
- claude_api_key: process.env.CLAUDE_API_KEY || '',
2339
- github_token: process.env.GITHUB_TOKEN || '',
2340
- groq_api_key: process.env.GROQ_API_KEY || '',
2341
- cohere_api_key: process.env.COHERE_API_KEY || '',
2342
- mistral_api_key: process.env.MISTRAL_API_KEY || '',
2343
- };
2344
-
2345
- // Try to read from .env file if exists
2346
- try {
2347
- const envContent = await fs.readFile(configPath, 'utf-8');
2348
- const lines = envContent.split('\n');
2349
- lines.forEach(line => {
2350
- const [key, value] = line.split('=');
2351
- if (key && value) {
2352
- const trimmedKey = key.trim();
2353
- const trimmedValue = value.trim();
2354
- if (trimmedKey === 'AI_PROVIDER') config.provider = trimmedValue;
2355
- if (trimmedKey === 'AI_MODEL') config.model = trimmedValue;
2356
- if (trimmedKey === 'OPENAI_API_KEY') config.openai_api_key = trimmedValue;
2357
- if (trimmedKey === 'GEMINI_API_KEY') config.gemini_api_key = trimmedValue;
2358
- if (trimmedKey === 'CLAUDE_API_KEY') config.claude_api_key = trimmedValue;
2359
- if (trimmedKey === 'GITHUB_TOKEN') config.github_token = trimmedValue;
2360
- if (trimmedKey === 'GROQ_API_KEY') config.groq_api_key = trimmedValue;
2361
- if (trimmedKey === 'COHERE_API_KEY') config.cohere_api_key = trimmedValue;
2362
- if (trimmedKey === 'MISTRAL_API_KEY') config.mistral_api_key = trimmedValue;
2363
- }
2364
- });
2365
- } catch (err) {
2366
- // .env doesn't exist, return defaults
2367
- }
2368
-
2369
- // Mask API keys for security - only show last 4 characters
2370
- const maskKey = (key) => {
2371
- if (!key || key.length < 8) return '';
2372
- return '•'.repeat(key.length - 4) + key.slice(-4);
2373
- };
2374
-
2375
- res.json({
2376
- provider: config.provider,
2377
- model: config.model,
2378
- openai_api_key: maskKey(config.openai_api_key),
2379
- gemini_api_key: maskKey(config.gemini_api_key),
2380
- claude_api_key: maskKey(config.claude_api_key),
2381
- github_token: maskKey(config.github_token),
2382
- groq_api_key: maskKey(config.groq_api_key),
2383
- cohere_api_key: maskKey(config.cohere_api_key),
2384
- mistral_api_key: maskKey(config.mistral_api_key),
2385
- has_openai_key: !!config.openai_api_key,
2386
- has_gemini_key: !!config.gemini_api_key,
2387
- has_claude_key: !!config.claude_api_key,
2388
- has_github_token: !!config.github_token,
2389
- has_groq_key: !!config.groq_api_key,
2390
- has_cohere_key: !!config.cohere_api_key,
2391
- has_mistral_key: !!config.mistral_api_key,
2392
- });
2393
- } catch (error) {
2394
- res.status(500).json({ success: false, error: error.message });
2395
- }
2396
- });
2397
-
2398
- // Settings API - Save API configuration
2399
- app.post('/api/settings/api-config', async (req, res) => {
2400
- try {
2401
- const {
2402
- provider,
2403
- model,
2404
- openai_api_key,
2405
- gemini_api_key,
2406
- claude_api_key,
2407
- github_token,
2408
- groq_api_key,
2409
- cohere_api_key,
2410
- mistral_api_key
2411
- } = req.body;
2412
-
2413
- const configPath = path.join(__dirname, '../../.env');
2414
-
2415
- let envContent = `# AI Provider Configuration\nAI_PROVIDER=${provider}\n`;
2416
- if (model) {
2417
- envContent += `AI_MODEL=${model}\n`;
2418
- }
2419
- if (openai_api_key) {
2420
- envContent += `OPENAI_API_KEY=${openai_api_key}\n`;
2421
- }
2422
- if (gemini_api_key) {
2423
- envContent += `GEMINI_API_KEY=${gemini_api_key}\n`;
2424
- }
2425
- if (claude_api_key) {
2426
- envContent += `CLAUDE_API_KEY=${claude_api_key}\n`;
2427
- }
2428
- if (github_token) {
2429
- envContent += `GITHUB_TOKEN=${github_token}\n`;
2430
- }
2431
- if (groq_api_key) {
2432
- envContent += `GROQ_API_KEY=${groq_api_key}\n`;
2433
- }
2434
- if (cohere_api_key) {
2435
- envContent += `COHERE_API_KEY=${cohere_api_key}\n`;
2436
- }
2437
- if (mistral_api_key) {
2438
- envContent += `MISTRAL_API_KEY=${mistral_api_key}\n`;
2439
- }
2440
-
2441
- // Add WDA path if exists
2442
- if (process.env.WDA_PATH) {
2443
- envContent += `WDA_PATH=${process.env.WDA_PATH}\n`;
2444
- }
2445
-
2446
- await fs.writeFile(configPath, envContent);
2447
-
2448
- // Update environment variables
2449
- process.env.AI_PROVIDER = provider;
2450
- if (model) process.env.AI_MODEL = model;
2451
- if (openai_api_key) process.env.OPENAI_API_KEY = openai_api_key;
2452
- if (gemini_api_key) process.env.GEMINI_API_KEY = gemini_api_key;
2453
- if (claude_api_key) process.env.CLAUDE_API_KEY = claude_api_key;
2454
- if (github_token) process.env.GITHUB_TOKEN = github_token;
2455
- if (groq_api_key) process.env.GROQ_API_KEY = groq_api_key;
2456
- if (cohere_api_key) process.env.COHERE_API_KEY = cohere_api_key;
2457
- if (mistral_api_key) process.env.MISTRAL_API_KEY = mistral_api_key;
2458
-
2459
- // Reinitialize AI manager with new config
2460
- aiManager.provider = provider;
2461
- if (model) aiManager.model = model;
2462
- aiManager.initializeProviders();
2463
-
2464
- res.json({ success: true, message: 'API configuration saved' });
2465
- } catch (error) {
2466
- res.status(500).json({ success: false, error: error.message });
2467
- }
2468
- });
2469
-
2470
- // Settings API - Get available AI providers and their models
2471
- app.get('/api/settings/ai-providers', (req, res) => {
2472
- try {
2473
- const { AI_PROVIDERS_CONFIG } = require('./aiProvidersConfig');
2474
- res.json({ success: true, providers: AI_PROVIDERS_CONFIG });
2475
- } catch (error) {
2476
- res.status(500).json({ success: false, error: error.message });
2477
- }
2478
- });
2479
-
2480
- // Settings API - Get devices configuration
2481
- app.get('/api/settings/devices', async (req, res) => {
2482
- try {
2483
- const devices = await loadDeviceConfig();
2484
- res.json({ success: true, devices });
2485
- } catch (error) {
2486
- res.status(500).json({ success: false, error: error.message });
2487
- }
2488
- });
2489
-
2490
- // Settings API - Save devices configuration
2491
- app.post('/api/settings/devices', async (req, res) => {
2492
- try {
2493
- const { devices } = req.body;
2494
-
2495
- // Format: device_name,udid,ip_address,platform,type
2496
- let content = '# Device Configuration (Auto-updated)\n';
2497
- content += '# Format: device_name,udid,ip_address,platform,type\n';
2498
- content += '# Platform: ios | android\n';
2499
- content += '# Type: usb | wireless\n';
2500
- content += '# \n';
2501
- content += '# 🔌 USB DEVICES: Automatically detected and saved here\n';
2502
- content += '# - No configuration needed for USB connection\n';
2503
- content += '# - Add IP address to enable wireless support later\n';
2504
- content += '#\n';
2505
- content += '# 📡 WIRELESS DEVICES: Manually add with IP address\n';
2506
- content += '# - Format: device_name,udid,ip_address,platform,wireless\n';
2507
- content += '# - iOS: Device must be paired in Xcode, WebDriverAgent running\n';
2508
- content += '# - Android: Enable wireless ADB first\n';
2509
- content += '#\n';
2510
- content += '# Example entries:\n';
2511
- content += '# iPhone17,00008130-001945C63ED3401E,,ios,usb (iOS USB - auto-detected)\n';
2512
- content += '# iPhone16P,00008140-001C24361E41801C,10.173.221.204,ios,wireless (iOS Wireless)\n';
2513
- content += '# Pixel8,1A2B3C4D5E6F,,android,usb (Android USB - auto-detected)\n';
2514
- content += '# GalaxyS23,ABCD1234,192.168.1.150,android,wireless (Android Wireless)\n\n';
2515
-
2516
- devices.forEach(device => {
2517
- const ip = device.ip || '';
2518
- const platform = device.platform || 'ios';
2519
- const type = device.type || device.connectionType || (ip ? 'wireless' : 'usb');
2520
- content += `${device.name},${device.udid},${ip},${platform},${type}\n`;
2521
- });
2522
-
2523
- await fs.writeFile(DEVICE_CONFIG, content);
2524
-
2525
- res.json({ success: true, message: 'Devices configuration saved' });
2526
- } catch (error) {
2527
- res.status(500).json({ success: false, error: error.message });
2528
- }
2529
- });
2530
-
2531
- // Get app presets
2532
- app.get('/api/apps/presets', async (req, res) => {
2533
- try {
2534
- const content = await fs.readFile(APPS_CONFIG, 'utf-8');
2535
- const apps = content
2536
- .split('\n')
2537
- .filter(line => line.trim() && !line.startsWith('#'))
2538
- .map(line => {
2539
- const [name, packageId] = line.split(',');
2540
- return { name: name.trim(), packageId: packageId.trim() };
2541
- });
2542
-
2543
- res.json({ success: true, apps });
2544
- } catch (error) {
2545
- res.status(500).json({ success: false, error: error.message });
2546
- }
2547
- });
2548
-
2549
- // Get locators from device's current screen
2550
- app.post('/api/locators', async (req, res) => {
2551
- try {
2552
- const { deviceName } = req.body;
2553
-
2554
- if (!deviceName) {
2555
- return res.status(400).json({ success: false, error: 'Device name required' });
2556
- }
2557
-
2558
- logger.debug(`Getting locators for device: ${deviceName}`);
2559
-
2560
- // Find the device info
2561
- const device = connectedDevices.find(d => d.name === deviceName);
2562
- if (!device) {
2563
- return res.status(404).json({ success: false, error: 'Device not found' });
2564
- }
2565
-
2566
- // For Android devices, ensure UIAutomator2 session exists
2567
- if (device.platform === 'android') {
2568
- const session = androidSessions.get(device.udid);
2569
- if (!session) {
2570
- // Auto-connect the device
2571
- console.log(`📡 Auto-connecting ${deviceName} for getLocators...`);
2572
- try {
2573
- const connectResult = await connectToDevice(device);
2574
- if (!connectResult.success) {
2575
- return res.status(500).json({
2576
- success: false,
2577
- error: 'Failed to connect device. Please use the Connect button first.'
2578
- });
2579
- }
2580
-
2581
- // Wait a moment for session to stabilize
2582
- await new Promise(resolve => setTimeout(resolve, 2000));
2583
- } catch (err) {
2584
- return res.status(500).json({
2585
- success: false,
2586
- error: `Auto-connection failed: ${err.message}`
2587
- });
2588
- }
2589
- }
2590
- }
2591
-
2592
- // Execute getLocators command - this uses the fast shell script implementation
2593
- const result = await executeCommand([deviceName], 'getLocators', null);
2594
-
2595
- logger.debug(`Result success: ${result.success}`);
2596
- logger.debug(`Results array length: ${result.results?.length || 0}`);
2597
-
2598
- if (result.success && result.results) {
2599
- let output = '';
2600
-
2601
- // executeCommand returns: { success, results: [scriptResults] }
2602
- // scriptResults is from executeAndroidDevices/executeWithScript
2603
- // Structure: { status: 'fulfilled', value: { success, results: [allSettledResults] } }
2604
- // allSettledResults contains: { status: 'fulfilled', value: { success, output, device } }
2605
-
2606
- for (const scriptResult of result.results) {
2607
- logger.debug(`Script result:`, scriptResult);
2608
-
2609
- // Check if scriptResult has value.results (fulfilled promise)
2610
- if (scriptResult.status === 'fulfilled' && scriptResult.value && scriptResult.value.results) {
2611
- // This is the result from executeAndroidDevices/executeWithScript
2612
- for (const r of scriptResult.value.results) {
2613
- logger.debug(`Result status: ${r.status}`);
2614
- if (r.status === 'fulfilled' && r.value) {
2615
- // Check if it's a successful execution
2616
- if (r.value.success && r.value.output) {
2617
- output = r.value.output;
2618
- logger.debug(`Found output: ${output.length} characters`);
2619
- break;
2620
- } else if (r.value.error) {
2621
- // Script executed but returned an error
2622
- console.log(`❌ Script error:`, r.value.error);
2623
- return res.status(500).json({
2624
- success: false,
2625
- error: 'Failed to get UI elements. Please ensure UIAutomator2 is installed for Android devices.'
2626
- });
2627
- }
2628
- }
2629
- }
2630
- }
2631
- if (output) break;
2632
- }
2633
-
2634
- if (!output) {
2635
- console.log('❌ No output found in results');
2636
- console.log('Full result structure:', JSON.stringify(result, null, 2));
2637
- return res.status(500).json({ success: false, error: 'No output received from device' });
2638
- }
2639
-
2640
- // Parse the output into locator objects
2641
- const locators = parseLocatorsOutput(output);
2642
- console.log(`✅ Parsed ${locators.length} locators`);
2643
-
2644
- // Filter out empty/invalid locators
2645
- const validLocators = locators.filter(loc => loc.name || loc.label || loc.text);
2646
- console.log(`✅ Filtered to ${validLocators.length} valid locators`);
2647
-
2648
- res.json({ success: true, locators: validLocators });
2649
- } else {
2650
- console.log('❌ Command execution failed');
2651
- res.status(500).json({ success: false, error: 'Failed to get locators' });
2652
- }
2653
- } catch (error) {
2654
- console.error(`❌ API error:`, error);
2655
- res.status(500).json({ success: false, error: error.message });
2656
- }
2657
- });
2658
-
2659
- // Click on a locator
2660
- app.post('/api/locators/click', async (req, res) => {
2661
- try {
2662
- const { deviceName, locatorName, x, y } = req.body;
2663
-
2664
- if (!deviceName) {
2665
- return res.status(400).json({ success: false, error: 'Device name required' });
2666
- }
2667
-
2668
- let command;
2669
- // If coordinates are provided, use them directly
2670
- if (x !== undefined && y !== undefined) {
2671
- command = `tap ${x},${y}`;
2672
- console.log(`\n🖱️ API: Tapping at coordinates (${x},${y}) on device: ${deviceName}`);
2673
- } else if (locatorName) {
2674
- command = `click "${locatorName}"`;
2675
- console.log(`\n🖱️ API: Clicking locator "${locatorName}" on device: ${deviceName}`);
2676
- } else {
2677
- return res.status(400).json({ success: false, error: 'Locator name or coordinates required' });
2678
- }
2679
-
2680
- // Execute click command
2681
- const result = await executeCommand([deviceName], command, null);
2682
-
2683
- if (result.success) {
2684
- res.json({ success: true, message: 'Tap executed successfully' });
2685
- } else {
2686
- res.status(500).json({ success: false, error: 'Failed to execute tap' });
2687
- }
2688
- } catch (error) {
2689
- console.error('❌ Tap error:', error);
2690
- res.status(500).json({ success: false, error: error.message });
2691
- }
2692
- });
2693
-
2694
- // Helper function to parse locators output
2695
- function parseLocatorsOutput(output) {
2696
- logger.debug('🔍 Parsing locators output...');
2697
- logger.debug('Output length:', output?.length || 0);
2698
-
2699
- if (!output) {
2700
- logger.error('❌ No output to parse');
2701
- return [];
2702
- }
2703
-
2704
- // First try to parse as JSON (new format)
2705
- const lines = output.split('\n');
2706
- for (const line of lines) {
2707
- const trimmed = line.trim();
2708
- if (trimmed.startsWith('[') || trimmed.startsWith('{')) {
2709
- try {
2710
- const jsonData = JSON.parse(trimmed);
2711
- logger.debug('✅ Parsed as JSON, elements:', Array.isArray(jsonData) ? jsonData.length : 'not array');
2712
- return Array.isArray(jsonData) ? jsonData : [];
2713
- } catch (err) {
2714
- logger.debug('⚠️ JSON parse failed:', err.message);
2715
- }
2716
- }
2717
- }
2718
-
2719
- logger.debug('📝 Fallback to text parsing...');
2720
-
2721
- // Fallback to old text parsing
2722
- const locators = [];
2723
- logger.debug('Total lines:', lines.length);
2724
-
2725
- for (const line of lines) {
2726
- // New format: " 1. 📍 ButtonName │ [Button] │ Label:LabelText │ Val:ValueText │ @ (x,y) WxH │ ✓Vis ✓En"
2727
- // Look for lines with numbered locators starting with 📍
2728
- if (line.includes('📍') && /^\s*\d+\./.test(line)) {
2729
- try {
2730
- const locator = {};
2731
-
2732
- // Extract index number
2733
- const indexMatch = line.match(/^\s*(\d+)\./);
2734
- if (indexMatch) locator.index = parseInt(indexMatch[1]);
2735
-
2736
- // Split by pipe separator if present (new format), otherwise use old logic
2737
- if (line.includes('│')) {
2738
- const parts = line.split('│').map(p => p.trim());
2739
-
2740
- // Part 0: "1. 📍 ButtonName"
2741
- const nameMatch = parts[0].match(/📍\s+(.+)/);
2742
- if (nameMatch) {
2743
- locator.name = nameMatch[1].trim();
2744
- locator.text = nameMatch[1].trim();
2745
- }
2746
-
2747
- // Part 1: "[Button]" or "[TextView]"
2748
- const typeMatch = parts[1] ? parts[1].match(/\[([^\]]+)\]/) : null;
2749
- if (typeMatch) locator.type = typeMatch[1].trim();
2750
-
2751
- // Process remaining parts for Label, Val, ID, coordinates, flags
2752
- for (let i = 2; i < parts.length; i++) {
2753
- const part = parts[i];
2754
-
2755
- // Label:...
2756
- if (part.includes('Label:')) {
2757
- const labelMatch = part.match(/Label:([^\s]+)/);
2758
- if (labelMatch) locator.label = labelMatch[1];
2759
- }
2760
-
2761
- // Val:...
2762
- if (part.includes('Val:')) {
2763
- const valueMatch = part.match(/Val:([^\s]+)/);
2764
- if (valueMatch) locator.value = valueMatch[1];
2765
- }
2766
-
2767
- // ID:...
2768
- if (part.includes('ID:')) {
2769
- const idMatch = part.match(/ID:([^\s]+)/);
2770
- if (idMatch) locator.resourceId = idMatch[1];
2771
- }
2772
-
2773
- // @ (x,y) WxH
2774
- if (part.includes('@')) {
2775
- const coordMatch = part.match(/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);
2776
- if (coordMatch) {
2777
- locator.x = parseInt(coordMatch[1]);
2778
- locator.y = parseInt(coordMatch[2]);
2779
- locator.width = parseInt(coordMatch[3]);
2780
- locator.height = parseInt(coordMatch[4]);
2781
- locator.coordinates = `(${locator.x},${locator.y}) ${locator.width}x${locator.height}`;
2782
- }
2783
- }
2784
-
2785
- // Flags
2786
- if (part.includes('✓Vis')) locator.visible = true;
2787
- if (part.includes('✓En')) locator.enabled = true;
2788
- if (part.includes('✓Click')) locator.clickable = true;
2789
- }
2790
- } else {
2791
- // Old format fallback
2792
- const nameMatch = line.match(/📍\s+([^\[]+?)(?:\s*\[|\s*Label)/);
2793
- if (nameMatch) {
2794
- locator.name = nameMatch[1].trim();
2795
- locator.text = nameMatch[1].trim();
2796
- }
2797
-
2798
- const typeMatch = line.match(/\[([^\]]+)\]/);
2799
- if (typeMatch) locator.type = typeMatch[1].trim();
2800
-
2801
- const labelMatch = line.match(/Label:([^\s]+?)(?:\s*Val:|\s*@|\s*✓)/);
2802
- if (labelMatch) locator.label = labelMatch[1].trim();
2803
-
2804
- const valueMatch = line.match(/Val:([^\s]+?)(?:\s*@|\s*✓)/);
2805
- if (valueMatch) locator.value = valueMatch[1].trim();
2806
-
2807
- const coordMatch = line.match(/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);
2808
- if (coordMatch) {
2809
- locator.x = parseInt(coordMatch[1]);
2810
- locator.y = parseInt(coordMatch[2]);
2811
- locator.width = parseInt(coordMatch[3]);
2812
- locator.height = parseInt(coordMatch[4]);
2813
- locator.coordinates = `(${locator.x},${locator.y}) ${locator.width}x${locator.height}`;
2814
- }
2815
-
2816
- const idMatch = line.match(/ID:([^\s]+)/);
2817
- if (idMatch) locator.resourceId = idMatch[1].trim();
2818
-
2819
- locator.visible = line.includes('✓Vis');
2820
- locator.enabled = line.includes('✓En');
2821
- }
2822
-
2823
- // Only add if we have meaningful data
2824
- if (locator.name || locator.label || locator.text) {
2825
- logger.debug('Parsed locator:', locator);
2826
- locators.push(locator);
2827
- }
2828
- } catch (e) {
2829
- // Skip malformed lines
2830
- console.error('Error parsing locator line:', line, e);
2831
- }
2832
- }
2833
- }
2834
-
2835
- console.log(`✅ Total parsed locators: ${locators.length}`);
2836
- return locators;
2837
- }
2838
-
2839
- // WebSocket handling
2840
- wss.on('connection', (ws) => {
2841
- console.log('New WebSocket connection');
2842
-
2843
- ws.on('message', async (message) => {
2844
- try {
2845
- const data = JSON.parse(message);
2846
-
2847
- switch (data.type) {
2848
- case 'execute_command':
2849
- const { devices, command, useAI, aiProvider } = data;
2850
-
2851
- // separator removed
2852
- console.log(`WEBSOCKET: Received execute_command`);
2853
- console.log(`Devices received: [${devices.join(', ')}]`);
2854
- console.log(`Command: "${command}"`);
2855
- console.log(`Use AI: ${useAI}`);
2856
- if (aiProvider) console.log(`AI Provider: ${aiProvider}`);
2857
- // separator removed
2858
-
2859
- let finalCommand = command;
2860
-
2861
- if (useAI) {
2862
- try {
2863
- finalCommand = await convertNaturalLanguageToCommand(command, devices, aiProvider);
2864
- console.log(`✅ AI converted command to:\n${finalCommand}`);
2865
- ws.send(JSON.stringify({
2866
- type: 'command_converted',
2867
- original: command,
2868
- converted: finalCommand,
2869
- provider: aiProvider || aiManager.provider
2870
- }));
2871
- } catch (error) {
2872
- console.error(`❌ AI conversion failed: ${error.message}`);
2873
-
2874
- // Send error to frontend - DO NOT execute command
2875
- ws.send(JSON.stringify({
2876
- type: 'ai_error',
2877
- error: error.message,
2878
- original: command
2879
- }));
2880
-
2881
- // Stop execution - don't run unconverted commands
2882
- return;
2883
- }
2884
- } else {
2885
-
2886
- }
2887
-
2888
- // Check if command has multiple lines (sequential execution)
2889
- const hasMultipleCommands = finalCommand.includes('\n');
2890
-
2891
- if (hasMultipleCommands) {
2892
-
2893
- executeCommandsSequentially(devices, finalCommand, ws)
2894
- .then(result => {
2895
- console.log(`Sequential execution completed`);
2896
- ws.send(JSON.stringify({
2897
- type: 'command_complete',
2898
- result
2899
- }));
2900
- })
2901
- .catch(error => {
2902
- console.error(`Sequential execution failed: ${error.message}`);
2903
- ws.send(JSON.stringify({
2904
- type: 'command_error',
2905
- error: error.message
2906
- }));
2907
- });
2908
- } else {
2909
- executeCommand(devices, finalCommand, ws)
2910
- .then(result => {
2911
-
2912
- // Record command if recording is active
2913
- if (isRecording) {
2914
- recordCommand(devices, command, useAI, finalCommand);
2915
- }
2916
-
2917
- ws.send(JSON.stringify({
2918
- type: 'command_complete',
2919
- result
2920
- }));
2921
- })
2922
- .catch(error => {
2923
- console.error(`executeCommand failed: ${error.message}`);
2924
- ws.send(JSON.stringify({
2925
- type: 'command_error',
2926
- error: error.message
2927
- }));
2928
- });
2929
- }
2930
- break;
2931
-
2932
- case 'start_recording':
2933
- const startResult = await startRecording(data.name, data.devices);
2934
- ws.send(JSON.stringify({
2935
- type: 'recording_started',
2936
- ...startResult
2937
- }));
2938
- break;
2939
-
2940
- case 'stop_recording':
2941
- const stopResult = await stopRecording();
2942
- ws.send(JSON.stringify({
2943
- type: 'recording_stopped',
2944
- ...stopResult
2945
- }));
2946
- break;
2947
-
2948
- case 'replay_recording':
2949
- const { filename, targetDevices } = data;
2950
-
2951
- ws.send(JSON.stringify({
2952
- type: 'command_output',
2953
- data: `\n🎬 Starting replay: ${filename}\n\n`,
2954
- devices: targetDevices
2955
- }));
2956
-
2957
- replayRecording(filename, targetDevices, ws)
2958
- .then(result => {
2959
- ws.send(JSON.stringify({
2960
- type: 'replay_complete',
2961
- ...result
2962
- }));
2963
- })
2964
- .catch(error => {
2965
- ws.send(JSON.stringify({
2966
- type: 'replay_error',
2967
- error: error.message
2968
- }));
2969
- });
2970
- break;
2971
-
2972
- case 'stop_replay':
2973
- if (isReplaying) {
2974
- replayAborted = true;
2975
- ws.send(JSON.stringify({
2976
- type: 'command_output',
2977
- data: '\n⏹️ Stopping replay...\n'
2978
- }));
2979
- }
2980
- break;
2981
-
2982
- case 'refresh_devices':
2983
- const updatedDevices = await discoverDevices();
2984
- ws.send(JSON.stringify({
2985
- type: 'devices_updated',
2986
- devices: updatedDevices
2987
- }));
2988
- break;
2989
-
2990
- case 'get_ai_providers':
2991
- ws.send(JSON.stringify({
2992
- type: 'ai_providers',
2993
- providers: aiManager.getAvailableProviders(),
2994
- current: aiManager.provider
2995
- }));
2996
- break;
2997
-
2998
- case 'set_ai_provider':
2999
- const success = aiManager.setProvider(data.provider);
3000
- ws.send(JSON.stringify({
3001
- type: 'ai_provider_set',
3002
- success,
3003
- provider: data.provider
3004
- }));
3005
- break;
3006
- }
3007
- } catch (error) {
3008
- ws.send(JSON.stringify({
3009
- type: 'error',
3010
- message: error.message
3011
- }));
3012
- }
3013
- });
3014
-
3015
- ws.on('close', () => {
3016
- console.log('WebSocket connection closed');
3017
- });
3018
-
3019
- // Send initial device list
3020
- discoverDevices().then(devices => {
3021
- ws.send(JSON.stringify({
3022
- type: 'devices_updated',
3023
- devices
3024
- }));
3025
- });
3026
- });
3027
-
3028
- // Android UIAutomator2 Installation
3029
- app.post('/api/android/install-uiautomator2', async (req, res) => {
3030
- const { device } = req.body;
3031
-
3032
- if (!device) {
3033
- return res.status(400).json({ success: false, error: 'Device name required' });
3034
- }
3035
-
3036
- try {
3037
- console.log(`📥 Installing UIAutomator2 on ${device}...`);
3038
-
3039
- // Find device UDID
3040
- const deviceObj = connectedDevices.find(d => d.name === device);
3041
- if (!deviceObj) {
3042
- return res.json({
3043
- success: false,
3044
- error: 'Device not found or not connected'
3045
- });
3046
- }
3047
-
3048
- // Use the helper function
3049
- const result = await installUIAutomator2(deviceObj.udid, device);
3050
-
3051
- res.json(result);
3052
-
3053
- } catch (error) {
3054
- console.error('❌ UIAutomator2 installation error:', error.message);
3055
- res.json({
3056
- success: false,
3057
- error: error.message,
3058
- suggestion: 'Please install manually using: npm install -g appium-uiautomator2-driver'
3059
- });
3060
- }
3061
- });
3062
-
3063
- // ============================================
3064
- // Recording & Replay API Endpoints
3065
- // ============================================
3066
-
3067
- // Start recording
3068
- app.post('/api/recording/start', async (req, res) => {
3069
- try {
3070
- const { name, devices } = req.body;
3071
- const result = await startRecording(name, devices);
3072
- res.json(result);
3073
- } catch (error) {
3074
- res.status(500).json({ success: false, error: error.message });
3075
- }
3076
- });
3077
-
3078
- // Stop recording
3079
- app.post('/api/recording/stop', async (req, res) => {
3080
- try {
3081
- const result = await stopRecording();
3082
- res.json(result);
3083
- } catch (error) {
3084
- res.status(500).json({ success: false, error: error.message });
3085
- }
3086
- });
3087
-
3088
- // Get recording status
3089
- app.get('/api/recording/status', (req, res) => {
3090
- res.json({
3091
- isRecording,
3092
- recording: currentRecording
3093
- });
3094
- });
3095
-
3096
- // List all recordings
3097
- app.get('/api/recordings', async (req, res) => {
3098
- try {
3099
- const recordings = await listRecordings();
3100
- res.json({ success: true, recordings });
3101
- } catch (error) {
3102
- res.status(500).json({ success: false, error: error.message });
3103
- }
3104
- });
3105
-
3106
- // Get specific recording
3107
- app.get('/api/recordings/:filename', async (req, res) => {
3108
- try {
3109
- const recording = await loadRecording(req.params.filename);
3110
- res.json({ success: true, recording });
3111
- } catch (error) {
3112
- res.status(404).json({ success: false, error: 'Recording not found' });
3113
- }
3114
- });
3115
-
3116
- // Delete recording
3117
- app.delete('/api/recordings/:filename', async (req, res) => {
3118
- try {
3119
- await deleteRecording(req.params.filename);
3120
- res.json({ success: true });
3121
- } catch (error) {
3122
- res.status(500).json({ success: false, error: error.message });
3123
- }
3124
- });
3125
-
3126
- // Update recording
3127
- app.put('/api/recordings/:filename', async (req, res) => {
3128
- try {
3129
- const { filename } = req.params;
3130
- const updatedRecording = req.body;
3131
-
3132
- const filepath = path.join(RECORDINGS_DIR, filename);
3133
- await fs.writeFile(filepath, JSON.stringify(updatedRecording, null, 2));
3134
-
3135
- res.json({ success: true, recording: updatedRecording });
3136
- } catch (error) {
3137
- res.status(500).json({ success: false, error: error.message });
3138
- }
3139
- });
3140
-
3141
- // Save new recording
3142
- app.post('/api/recordings/save', async (req, res) => {
3143
- try {
3144
- const { name, commands, date, type } = req.body;
3145
-
3146
- if (!name || !commands) {
3147
- return res.status(400).json({ success: false, error: 'Name and commands required' });
3148
- }
3149
-
3150
- // Create filename from name (sanitize)
3151
- const sanitizedName = name.replace(/[^a-z0-9_-]/gi, '_');
3152
- const filename = `${sanitizedName}_${Date.now()}.json`;
3153
- const filepath = path.join(RECORDINGS_DIR, filename);
3154
-
3155
- const recording = {
3156
- name,
3157
- commands,
3158
- date: date || new Date().toISOString(),
3159
- type: type || 'manual'
3160
- };
3161
-
3162
- await fs.writeFile(filepath, JSON.stringify(recording, null, 2));
3163
-
3164
- res.json({ success: true, filename, recording });
3165
- } catch (error) {
3166
- console.error('Error saving recording:', error);
3167
- res.status(500).json({ success: false, error: error.message });
3168
- }
3169
- });
3170
-
3171
- // Replay recording
3172
- app.post('/api/recording/replay', async (req, res) => {
3173
- try {
3174
- const { filename, devices } = req.body;
3175
-
3176
- if (!filename) {
3177
- return res.status(400).json({ success: false, error: 'Filename required' });
3178
- }
3179
-
3180
- if (!devices || devices.length === 0) {
3181
- return res.status(400).json({ success: false, error: 'Target devices required' });
3182
- }
3183
-
3184
- // Start replay in background, send immediate response
3185
- res.json({ success: true, message: 'Replay started' });
3186
-
3187
- // Replay will send updates via WebSocket
3188
- // This is handled by WebSocket message 'replay_recording'
3189
- } catch (error) {
3190
- res.status(500).json({ success: false, error: error.message });
3191
- }
3192
- });
3193
-
3194
- // Screenshots API
3195
- app.get('/api/screenshots', async (req, res) => {
3196
- try {
3197
- // Ensure screenshots directory exists
3198
- await fs.mkdir(SCREENSHOTS_DIR, { recursive: true });
3199
-
3200
- const files = await fs.readdir(SCREENSHOTS_DIR);
3201
- const screenshots = files
3202
- .filter(f => f.endsWith('.png'))
3203
- .map(f => {
3204
- const stat = require('fs').statSync(path.join(SCREENSHOTS_DIR, f));
3205
- return {
3206
- filename: f,
3207
- path: `/api/screenshots/${f}`,
3208
- size: stat.size,
3209
- timestamp: stat.mtime.getTime(),
3210
- created: stat.mtime
3211
- };
3212
- })
3213
- .sort((a, b) => b.timestamp - a.timestamp);
3214
-
3215
- res.json({ success: true, screenshots });
3216
- } catch (error) {
3217
- res.status(500).json({ success: false, error: error.message });
3218
- }
3219
- });
3220
-
3221
- // Serve screenshot files
3222
- app.get('/api/screenshots/:filename', (req, res) => {
3223
- const filepath = path.join(SCREENSHOTS_DIR, req.params.filename);
3224
- res.sendFile(filepath, (err) => {
3225
- if (err) {
3226
- res.status(404).json({ success: false, error: 'Screenshot not found' });
3227
- }
3228
- });
3229
- });
3230
-
3231
- // Delete screenshot
3232
- app.delete('/api/screenshots/:filename', async (req, res) => {
3233
- try {
3234
- const filepath = path.join(SCREENSHOTS_DIR, req.params.filename);
3235
- await fs.unlink(filepath);
3236
- res.json({ success: true });
3237
- } catch (error) {
3238
- res.status(500).json({ success: false, error: error.message });
3239
- }
3240
- });
3241
-
3242
- // List installed apps on device
3243
- app.post('/api/apps/list', async (req, res) => {
3244
- try {
3245
- const { devices } = req.body;
3246
-
3247
- if (!devices || devices.length === 0) {
3248
- return res.status(400).json({ success: false, error: 'Device selection required' });
3249
- }
3250
-
3251
- const deviceObjects = connectedDevices.filter(d =>
3252
- devices.includes(d.name) || devices.includes(d.udid) || devices.includes(d.serial)
3253
- );
3254
-
3255
- if (deviceObjects.length === 0) {
3256
- return res.status(400).json({ success: false, error: 'No connected devices found' });
3257
- }
3258
-
3259
- const results = {};
3260
-
3261
- for (const device of deviceObjects) {
3262
- try {
3263
- let apps = [];
3264
-
3265
- if (device.platform === 'android') {
3266
- // List Android apps
3267
- const { execSync } = require('child_process');
3268
- const serial = device.udid || device.serial;
3269
- const output = execSync(`adb -s ${serial} shell pm list packages -3`, { encoding: 'utf-8' });
3270
- apps = output
3271
- .split('\n')
3272
- .filter(line => line.startsWith('package:'))
3273
- .map(line => line.replace('package:', '').trim())
3274
- .filter(pkg => pkg)
3275
- .sort();
3276
- } else if (device.platform === 'ios') {
3277
- // List iOS apps - requires ideviceinstaller
3278
- const { execSync } = require('child_process');
3279
- const udid = device.udid;
3280
- try {
3281
- // Try new syntax first (ideviceinstaller list)
3282
- let output;
3283
- try {
3284
- output = execSync(`ideviceinstaller -u ${udid} list --user`, { encoding: 'utf-8', timeout: 30000 });
3285
- } catch (e) {
3286
- // Fallback to old syntax
3287
- output = execSync(`ideviceinstaller -u ${udid} -l`, { encoding: 'utf-8', timeout: 30000 });
3288
- }
3289
-
3290
- // Parse output - format is "BundleID - AppName" or CFBundleIdentifier format
3291
- apps = output
3292
- .split('\n')
3293
- .filter(line => {
3294
- const trimmed = line.trim();
3295
- // Skip empty lines, Total: line, and CSV header
3296
- return trimmed &&
3297
- !trimmed.startsWith('Total:') &&
3298
- !trimmed.startsWith('CFBundleIdentifier');
3299
- })
3300
- .map(line => {
3301
- // Try different formats
3302
- if (line.includes(' - ')) {
3303
- const match = line.match(/^(.+?)\s+-\s+(.+?)$/);
3304
- return match ? { id: match[1].trim(), name: match[2].trim() } : null;
3305
- } else if (line.includes(',')) {
3306
- // Format: "BundleID", "Version", "Name"
3307
- const parts = line.split(',').map(p => p.trim().replace(/"/g, ''));
3308
- return parts.length >= 3 ? { id: parts[0], name: parts[2] } : null;
3309
- } else if (line.match(/^[a-zA-Z0-9.-]+$/)) {
3310
- // Just bundle ID
3311
- return { id: line.trim(), name: line.trim() };
3312
- }
3313
- return null;
3314
- })
3315
- .filter(app => app)
3316
- .sort((a, b) => a.name.localeCompare(b.name));
3317
-
3318
- if (apps.length === 0) {
3319
- apps = [{ error: 'No user apps found or unable to parse output' }];
3320
- }
3321
- } catch (error) {
3322
- console.error('iOS apps list error:', error.message);
3323
- apps = [{ error: `Failed to list apps: ${error.message}` }];
3324
- }
3325
- }
3326
-
3327
- results[device.name] = {
3328
- success: true,
3329
- platform: device.platform,
3330
- apps: apps,
3331
- count: Array.isArray(apps) ? apps.length : 0
3332
- };
3333
- } catch (error) {
3334
- results[device.name] = {
3335
- success: false,
3336
- error: error.message
3337
- };
3338
- }
3339
- }
3340
-
3341
- res.json({ success: true, results });
3342
- } catch (error) {
3343
- res.status(500).json({ success: false, error: error.message });
3344
- }
3345
- });
3346
-
3347
- // Get app info
3348
- app.post('/api/apps/info', async (req, res) => {
3349
- try {
3350
- const { device, bundleId } = req.body;
3351
-
3352
- if (!device || !bundleId) {
3353
- return res.status(400).json({ success: false, error: 'Device and bundle ID required' });
3354
- }
3355
-
3356
- const deviceObj = discoveredDevices.find(d => d.name === device);
3357
- if (!deviceObj) {
3358
- return res.status(404).json({ success: false, error: 'Device not found' });
3359
- }
3360
-
3361
- const { execSync } = require('child_process');
3362
- let appInfo = {};
3363
-
3364
- try {
3365
- if (deviceObj.platform === 'android') {
3366
- // Get Android app info
3367
- const serial = deviceObj.udid || deviceObj.serial;
3368
-
3369
- // Get app version
3370
- try {
3371
- const versionOutput = execSync(
3372
- `adb -s ${serial} shell dumpsys package ${bundleId} | grep versionName`,
3373
- { encoding: 'utf-8', timeout: 10000 }
3374
- );
3375
- const versionMatch = versionOutput.match(/versionName=([^\s]+)/);
3376
- if (versionMatch) {
3377
- appInfo.version = versionMatch[1];
3378
- }
3379
- } catch (e) {
3380
- appInfo.version = 'Unknown';
3381
- }
3382
-
3383
- // Get app label/name
3384
- try {
3385
- const labelOutput = execSync(
3386
- `adb -s ${serial} shell dumpsys package ${bundleId} | grep -A 1 "applicationInfo"`,
3387
- { encoding: 'utf-8', timeout: 10000 }
3388
- );
3389
- appInfo.name = bundleId;
3390
- } catch (e) {
3391
- appInfo.name = bundleId;
3392
- }
3393
-
3394
- // Get install location
3395
- try {
3396
- const pathOutput = execSync(
3397
- `adb -s ${serial} shell pm path ${bundleId}`,
3398
- { encoding: 'utf-8', timeout: 10000 }
3399
- );
3400
- appInfo.path = pathOutput.replace('package:', '').trim();
3401
- } catch (e) {
3402
- appInfo.path = 'Unknown';
3403
- }
3404
-
3405
- appInfo.bundleId = bundleId;
3406
- appInfo.platform = 'Android';
3407
-
3408
- } else if (deviceObj.platform === 'ios') {
3409
- // Get iOS app info
3410
- const udid = deviceObj.udid;
3411
-
3412
- try {
3413
- // Try to get app info using ideviceinstaller
3414
- const output = execSync(
3415
- `ideviceinstaller -u ${udid} list --user | grep "${bundleId}"`,
3416
- { encoding: 'utf-8', timeout: 10000 }
3417
- );
3418
-
3419
- // Parse CSV format: BundleID, Version, Name
3420
- const parts = output.split(',').map(p => p.trim().replace(/"/g, ''));
3421
- if (parts.length >= 3) {
3422
- appInfo.bundleId = parts[0];
3423
- appInfo.version = parts[1];
3424
- appInfo.name = parts[2];
3425
- } else {
3426
- appInfo.bundleId = bundleId;
3427
- appInfo.name = bundleId;
3428
- appInfo.version = 'Unknown';
3429
- }
3430
- } catch (e) {
3431
- // Fallback
3432
- appInfo.bundleId = bundleId;
3433
- appInfo.name = bundleId;
3434
- appInfo.version = 'Unknown';
3435
- appInfo.error = 'Could not retrieve detailed info';
3436
- }
3437
-
3438
- appInfo.platform = 'iOS';
3439
- }
3440
-
3441
- res.json({ success: true, appInfo });
3442
-
3443
- } catch (error) {
3444
- res.json({
3445
- success: false,
3446
- error: error.message,
3447
- appInfo: {
3448
- bundleId: bundleId,
3449
- platform: deviceObj.platform,
3450
- error: 'Failed to get app info'
3451
- }
3452
- });
3453
- }
3454
-
3455
- } catch (error) {
3456
- res.status(500).json({ success: false, error: error.message });
3457
- }
3458
- });
3459
-
3460
- // Upgrade HTTP server to WebSocket
3461
- let server;
3462
-
3463
- function startServer(options = {}) {
3464
- const port = options.port || PORT;
3465
- const shouldOpenBrowser = options.browser !== false;
3466
- const frontendUrl = 'https://devicely-ai.vercel.app';
3467
-
3468
- console.log(`Frontend available at: ${frontendUrl}\n`);
3469
-
3470
- return new Promise((resolve, reject) => {
3471
- server = app.listen(port, () => {
3472
- console.log(`✅ Server running on port ${port}`);
3473
- console.log(`✅ WebSocket server ready`);
3474
-
3475
- // Initial device discovery
3476
- discoverDevices().then(devices => {
3477
- console.log(`✅ Discovered ${devices.length} devices`);
3478
-
3479
- // Open browser if not disabled
3480
- if (shouldOpenBrowser) {
3481
- console.log(`\n🌐 Opening browser to ${frontendUrl}...`);
3482
- const open = require('open');
3483
- open(frontendUrl).catch(err => {
3484
- console.log(`\n📱 Please open ${frontendUrl} in your browser`);
3485
- });
3486
- }
3487
-
3488
- resolve();
3489
- }).catch(err => {
3490
- logger.error('Device discovery failed:', err.message);
3491
- resolve();
3492
- });
3493
- });
3494
-
3495
- // Handle WebSocket upgrades
3496
- server.on('upgrade', (request, socket, head) => {
3497
- wss.handleUpgrade(request, socket, head, (ws) => {
3498
- wss.emit('connection', ws, request);
3499
- });
3500
- });
3501
-
3502
- server.on('error', (err) => {
3503
- if (err.code === 'EADDRINUSE') {
3504
- logger.error(`\n❌ Port ${port} is already in use!`);
3505
- logger.error(`\nTry one of these solutions:`);
3506
- logger.error(` 1. Kill the process using port ${port}: lsof -ti:${port} | xargs kill -9`);
3507
- logger.error(` 2. Use a different port: PORT=3002 devicely`);
3508
- logger.error(` 3. Set PORT in .env file\n`);
3509
- }
3510
- reject(err);
3511
- });
3512
- });
3513
- }
3514
-
3515
- function stopServer() {
3516
- return new Promise((resolve) => {
3517
- if (server) {
3518
- server.close(resolve);
3519
- } else {
3520
- resolve();
3521
- }
3522
- });
3523
- }
3524
-
3525
- // Export for CLI usage
3526
- module.exports = {
3527
- startServer,
3528
- stopServer
3529
- };
3530
-
3531
- // Start server if run directly (not imported as module)
3532
- if (require.main === module) {
3533
- startServer().catch(err => {
3534
- if (err.code === 'EADDRINUSE') {
3535
- logger.error(`\n❌ Port 3001 is already in use!`);
3536
- logger.error(`\nTry one of these solutions:`);
3537
- logger.error(` 1. Kill the process using port 3001: lsof -ti:3001 | xargs kill -9`);
3538
- logger.error(` 2. Use a different port: PORT=3002 devicely`);
3539
- logger.error(` Note: Vercel frontend connects to port 3001 by default`);
3540
- logger.error(` 3. Use local frontend at http://localhost:3001\n`);
3541
- } else {
3542
- console.error('Failed to start server:', err.message);
3543
- }
3544
- process.exit(1);
3545
- });
3546
- }
1
+ const _0x28fe54=_0x2d26;(function(_0x44d94a,_0xe8b5bb){const _0x2d5206=_0x2d26,_0x52e029=_0x44d94a();while(!![]){try{const _0x4bf940=parseInt(_0x2d5206(0x4a6))/0x1+-parseInt(_0x2d5206(0x387))/0x2*(-parseInt(_0x2d5206(0x1e1))/0x3)+parseInt(_0x2d5206(0x40a))/0x4+parseInt(_0x2d5206(0x220))/0x5+-parseInt(_0x2d5206(0x3f6))/0x6+-parseInt(_0x2d5206(0x70d))/0x7*(parseInt(_0x2d5206(0x596))/0x8)+-parseInt(_0x2d5206(0x3b3))/0x9*(-parseInt(_0x2d5206(0x703))/0xa);if(_0x4bf940===_0xe8b5bb)break;else _0x52e029['push'](_0x52e029['shift']());}catch(_0x5c7806){_0x52e029['push'](_0x52e029['shift']());}}}(_0x1ec5,0xba418));const path=require('path');require(_0x28fe54(0x6e3))['config']({'path':path['join'](__dirname,_0x28fe54(0x222))});function _0x2d26(_0x1d057a,_0x3c0e7d){_0x1d057a=_0x1d057a-0x166;const _0x1ec536=_0x1ec5();let _0x2d26d9=_0x1ec536[_0x1d057a];if(_0x2d26['sBonKf']===undefined){var _0x2d7e34=function(_0x9e8ee9){const _0x1b2609='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1ec485='',_0x47827c='';for(let _0x301544=0x0,_0x52fe9f,_0x1a09dc,_0x48f783=0x0;_0x1a09dc=_0x9e8ee9['charAt'](_0x48f783++);~_0x1a09dc&&(_0x52fe9f=_0x301544%0x4?_0x52fe9f*0x40+_0x1a09dc:_0x1a09dc,_0x301544++%0x4)?_0x1ec485+=String['fromCharCode'](0xff&_0x52fe9f>>(-0x2*_0x301544&0x6)):0x0){_0x1a09dc=_0x1b2609['indexOf'](_0x1a09dc);}for(let _0x1f0db2=0x0,_0x5a9061=_0x1ec485['length'];_0x1f0db2<_0x5a9061;_0x1f0db2++){_0x47827c+='%'+('00'+_0x1ec485['charCodeAt'](_0x1f0db2)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x47827c);};_0x2d26['bxMbbR']=_0x2d7e34,_0x2d26['rxrHEK']={},_0x2d26['sBonKf']=!![];}const _0xd44c74=_0x1ec536[0x0],_0x17e631=_0x1d057a+_0xd44c74,_0x2d4246=_0x2d26['rxrHEK'][_0x17e631];return!_0x2d4246?(_0x2d26d9=_0x2d26['bxMbbR'](_0x2d26d9),_0x2d26['rxrHEK'][_0x17e631]=_0x2d26d9):_0x2d26d9=_0x2d4246,_0x2d26d9;}const express=require(_0x28fe54(0x7fc)),cors=require(_0x28fe54(0x538)),{spawn}=require('child_process'),WebSocket=require('ws'),fs=require('fs')[_0x28fe54(0x659)],AIProviderManager=require(_0x28fe54(0x7a4)),Logger=require(_0x28fe54(0x22c)),logger=new Logger(_0x28fe54(0x248));let scriptLoader;try{scriptLoader=require(_0x28fe54(0x5e5));}catch(_0x270412){scriptLoader=null;}let discoverAllDevices;try{({discoverAllDevices}=require('./deviceDetection'));}catch(_0x5a606f){({discoverAllDevices}=require('../../deviceDetection'));}const {execSync}=require(_0x28fe54(0x86c)),app=express(),PORT=process.env.PORT||0xbb9;app[_0x28fe54(0x7e5)](cors()),app['use'](express['json']());const frontendPath=require('fs')['existsSync'](path[_0x28fe54(0x184)](__dirname,'../frontend/build'))?path[_0x28fe54(0x184)](__dirname,_0x28fe54(0x6fa)):path[_0x28fe54(0x184)](__dirname,'./frontend');app[_0x28fe54(0x7e5)](express[_0x28fe54(0x577)](frontendPath));const _0x50c256={};_0x50c256['noServer']=!![];const wss=new WebSocket[(_0x28fe54(0x248))](_0x50c256),aiManager=new AIProviderManager();let connectedDevices=[],activeConnections=new Map(),wdaProcesses=new Map(),androidSessions=new Map();function findConfigFile(_0x3be571){const _0x4894db=_0x28fe54,_0x4b4cda={'blmTl':_0x4894db(0x330),'XNZnd':function(_0xa5668a,_0x5b4bdd){return _0xa5668a(_0x5b4bdd);},'tFRLZ':function(_0x27307e,_0xd078c5){return _0x27307e===_0xd078c5;},'xYAZh':'sTMgB','FmDOO':function(_0xdc0626,_0x2161b9){return _0xdc0626(_0x2161b9);}};let _0x4cee50=path[_0x4894db(0x184)](__dirname,_0x4b4cda[_0x4894db(0x5e7)],_0x3be571);if(_0x4b4cda[_0x4894db(0x47f)](require,'fs')[_0x4894db(0x179)](_0x4cee50)){if(_0x4b4cda['tFRLZ'](_0x4b4cda[_0x4894db(0x2cd)],_0x4b4cda[_0x4894db(0x2cd)]))return _0x4cee50;else _0x38db45['log']('⚠️\x20\x20Session\x20creation\x20failed,\x20will\x20be\x20created\x20on\x20first\x20command');}_0x4cee50=path[_0x4894db(0x184)](__dirname,_0x4894db(0x3fb),_0x3be571);if(_0x4b4cda[_0x4894db(0x318)](require,'fs')['existsSync'](_0x4cee50))return _0x4cee50;return path['join'](__dirname,_0x4b4cda[_0x4894db(0x5e7)],_0x3be571);}function findScriptFile(_0x326bc9){const _0x1f3a18=_0x28fe54,_0xd64084={'pkuEv':function(_0x319a9a,_0x10cb0d){return _0x319a9a(_0x10cb0d);},'beFFL':_0x1f3a18(0x852),'GFaAs':_0x1f3a18(0x3ba),'ZRsBU':function(_0x51ceef,_0x1d0b30){return _0x51ceef(_0x1d0b30);},'EpAtA':function(_0x214016,_0x17dadc){return _0x214016(_0x17dadc);},'Kgovv':'crypto','uxdQT':function(_0x493c1c,_0xe45011){return _0x493c1c+_0xe45011;},'MjDgJ':_0x1f3a18(0x689),'aDiFW':function(_0x3a60ce,_0x2bc7d7){return _0x3a60ce!==_0x2bc7d7;},'WAIBf':'OYTLx','wlcLe':'\x20(encrypted)','CyWIw':function(_0x2d4df0,_0x1f2b09){return _0x2d4df0&&_0x1f2b09;},'EjfiM':function(_0x1fd5c3,_0x467109){return _0x1fd5c3+_0x467109;},'HGJbb':_0x1f3a18(0x829),'BGzoi':function(_0xd37f81,_0x14b619){return _0xd37f81!==_0x14b619;},'dLKot':_0x1f3a18(0x56f),'scEHx':_0x1f3a18(0x610),'SRVIQ':'waLYY'},_0x484010=_0xd64084[_0x1f3a18(0x84b)](require,'fs'),_0x4957da=_0xd64084[_0x1f3a18(0x85d)](require,'os'),_0x3b2ef7=_0xd64084[_0x1f3a18(0x673)](require,_0xd64084['Kgovv']),_0x41c88c=_0x326bc9[_0x1f3a18(0x8e7)](/\.sh$/,''),_0x5102d2=_0xd64084[_0x1f3a18(0x38d)](_0x41c88c,'.enc'),_0x193221=[{'path':path['join'](__dirname,_0x1f3a18(0x330),_0x326bc9),'encrypted':![]},{'path':path['join'](__dirname,_0xd64084[_0x1f3a18(0x800)],_0x5102d2),'encrypted':!![]},{'path':path[_0x1f3a18(0x184)](__dirname,_0xd64084[_0x1f3a18(0x800)],_0x326bc9),'encrypted':![]},{'path':path[_0x1f3a18(0x184)](__dirname,_0x1f3a18(0x689),_0x41c88c),'encrypted':![]}];for(const {path:_0x8e9d2b,encrypted:_0x227011}of _0x193221){if(_0x484010['existsSync'](_0x8e9d2b)){if(_0xd64084['aDiFW'](_0xd64084[_0x1f3a18(0x63e)],_0x1f3a18(0x1d2))){const _0x38d804={};_0x38d804[_0x1f3a18(0x6ed)]=![],_0x38d804[_0x1f3a18(0x5d6)]=_0xc268f1[_0x1f3a18(0x5d4)],_0x10ade8[_0x1f3a18(0x890)](0x1f4)[_0x1f3a18(0x8bb)](_0x38d804);}else{logger['debug']('✅\x20Found\x20script:\x20'+_0x326bc9+_0x1f3a18(0x483)+_0x8e9d2b+(_0x227011?_0xd64084['wlcLe']:''));if(_0xd64084['CyWIw'](_0x227011,scriptLoader)){const _0x17d693=path[_0x1f3a18(0x184)](_0x4957da['tmpdir'](),_0xd64084['EjfiM'](_0xd64084['HGJbb'],process['pid']));if(!_0x484010[_0x1f3a18(0x179)](_0x17d693)){if(_0xd64084[_0x1f3a18(0x79f)](_0x1f3a18(0x484),_0x1f3a18(0x484))){const {AI_PROVIDERS_CONFIG:_0x204003}=_0xd64084[_0x1f3a18(0x84b)](_0x5d40d6,_0xd64084[_0x1f3a18(0x7d9)]),_0x138009={};_0x138009['success']=!![],_0x138009[_0x1f3a18(0x5ad)]=_0x204003,_0x2de3e5[_0x1f3a18(0x8bb)](_0x138009);}else{const _0x7844fe={};_0x7844fe[_0x1f3a18(0x307)]=!![],_0x7844fe[_0x1f3a18(0x68e)]=0x1c0,_0x484010[_0x1f3a18(0x4fe)](_0x17d693,_0x7844fe);}}const _0x216480=path[_0x1f3a18(0x184)](_0x17d693,_0x326bc9);if(!_0x484010[_0x1f3a18(0x179)](_0x216480))try{if(_0xd64084[_0x1f3a18(0x79f)](_0xd64084[_0x1f3a18(0x7c1)],'rGZbg')){const _0x1eac8a=scriptLoader[_0x1f3a18(0x48c)](_0x8e9d2b),_0x4af57d={};_0x4af57d[_0x1f3a18(0x68e)]=0x1ed,_0x484010[_0x1f3a18(0x1da)](_0x216480,_0x1eac8a,_0x4af57d),logger[_0x1f3a18(0x43a)]('🔓\x20Decrypted\x20'+_0x326bc9+_0x1f3a18(0x5b6));}else _0x50c515[_0x1f3a18(0x5d6)](_0x1f3a18(0x6c0)+_0x2b831e[_0x1f3a18(0x5d4)]);}catch(_0x453105){if(_0xd64084['aDiFW'](_0xd64084[_0x1f3a18(0x8f4)],_0xd64084[_0x1f3a18(0x66e)])){console['error']('❌\x20Failed\x20to\x20decrypt\x20'+_0x326bc9+':\x20'+_0x453105[_0x1f3a18(0x5d4)]);continue;}else{const _0xf23416={};return _0xf23416[_0x1f3a18(0x6ed)]=![],_0xf23416['error']=_0xd64084[_0x1f3a18(0x8e2)],_0x49e8fe[_0x1f3a18(0x890)](0x190)[_0x1f3a18(0x8bb)](_0xf23416);}}return _0x216480;}return _0x8e9d2b;}}}return console[_0x1f3a18(0x5d6)]('❌\x20Script\x20not\x20found:\x20'+_0x326bc9),console[_0x1f3a18(0x5d6)](_0x1f3a18(0x5bb)),_0x193221['forEach'](_0x5299d0=>console['error'](_0x1f3a18(0x8a8)+_0x5299d0[_0x1f3a18(0x516)])),_0x193221[0x0][_0x1f3a18(0x516)];}const DEVICE_CONFIG=findConfigFile(_0x28fe54(0x518)),SESSION_MAP_FILE=path[_0x28fe54(0x184)](require('os')['tmpdir'](),_0x28fe54(0x454)),APPS_CONFIG=findConfigFile(_0x28fe54(0x668)),WIRELESS_SCRIPT_PATH=findScriptFile(_0x28fe54(0x497)),USB_SCRIPT_PATH=findScriptFile('connect_ios_usb_multi_final.sh'),ANDROID_WIRELESS_SCRIPT_PATH=findScriptFile(_0x28fe54(0x61a)),ANDROID_USB_SCRIPT_PATH=findScriptFile('android_device_control.sh'),RECORDINGS_DIR=path[_0x28fe54(0x184)](__dirname,_0x28fe54(0x2eb)),SCREENSHOTS_DIR=path[_0x28fe54(0x184)](__dirname,_0x28fe54(0x816));let currentRecording=null,isRecording=![],isReplaying=![],replayAborted=![];async function startUIAutomator2Session(_0x3f0e55,_0x34bb16){const _0x3b74e9=_0x28fe54,_0x60f603={'yQllX':_0x3b74e9(0x327),'mgvHK':function(_0x35b9b0,_0x3ec02e,_0x1501fb,_0x2fc077){return _0x35b9b0(_0x3ec02e,_0x1501fb,_0x2fc077);},'SMTpZ':'adb','WXACz':'shell','bDWob':_0x3b74e9(0x70b),'YdNuL':_0x3b74e9(0x2d6),'lbLve':function(_0x3e0fe9,_0x478abb){return _0x3e0fe9(_0x478abb);},'mkuBN':_0x3b74e9(0x346),'tueeO':'Android','GxTZA':_0x3b74e9(0x4dd),'xtxsE':_0x3b74e9(0x6ba)};console[_0x3b74e9(0x44c)](_0x3b74e9(0x16d)+_0x34bb16+'\x20('+_0x3f0e55+_0x3b74e9(0x6a4));try{let _0x782494=0x2008;while(!![]){try{const _0x1bb3d7={};_0x1bb3d7[_0x3b74e9(0x8c4)]=_0x60f603[_0x3b74e9(0x1d1)],execSync(_0x3b74e9(0x7e1)+_0x782494,_0x1bb3d7),_0x782494++;}catch{break;}}console[_0x3b74e9(0x44c)](_0x3b74e9(0x7b7)+_0x782494+_0x3b74e9(0x1a7)+_0x34bb16);const _0x46383e={};_0x46383e[_0x3b74e9(0x430)]=!![],_0x46383e['stdio']=_0x3b74e9(0x327);const _0x1a450b=_0x60f603[_0x3b74e9(0x4a9)](spawn,_0x60f603[_0x3b74e9(0x4b1)],['-s',_0x3f0e55,_0x60f603[_0x3b74e9(0x6f3)],'am',_0x60f603[_0x3b74e9(0x177)],'-w',_0x60f603['YdNuL']],_0x46383e);_0x1a450b['unref'](),await new Promise(_0x47f3d3=>setTimeout(_0x47f3d3,0x7d0)),execSync('adb\x20-s\x20'+_0x3f0e55+_0x3b74e9(0x8ee)+_0x782494+_0x3b74e9(0x308)),await new Promise(_0x3cf494=>setTimeout(_0x3cf494,0x7d0));const _0x5a67ca=_0x60f603[_0x3b74e9(0x25f)](require,_0x60f603['mkuBN']),_0x2dfb7b={};_0x2dfb7b['platformName']=_0x60f603[_0x3b74e9(0x3b4)],_0x2dfb7b[_0x3b74e9(0x1aa)]=_0x60f603[_0x3b74e9(0x5ed)],_0x2dfb7b[_0x3b74e9(0x35c)]=_0x3f0e55;const _0x52097a={};_0x52097a[_0x3b74e9(0x5f8)]=_0x2dfb7b;const _0x379188={};_0x379188[_0x3b74e9(0x8b4)]=_0x52097a;const _0x3f5685=await _0x5a67ca[_0x3b74e9(0x8bf)](_0x3b74e9(0x196)+_0x782494+'/wd/hub/session',_0x379188),_0x8f1c7=_0x3f5685[_0x3b74e9(0x46a)]['value']['sessionId']||_0x3f5685['data'][_0x3b74e9(0x741)],_0x5aa11c={};_0x5aa11c[_0x3b74e9(0x741)]=_0x8f1c7,_0x5aa11c[_0x3b74e9(0x8d0)]=_0x782494,_0x5aa11c['serverPid']=_0x1a450b[_0x3b74e9(0x4d1)],_0x5aa11c[_0x3b74e9(0x2b6)]=_0x34bb16,androidSessions['set'](_0x3f0e55,_0x5aa11c);try{let _0x4a16de='';try{_0x4a16de=await fs[_0x3b74e9(0x599)](SESSION_MAP_FILE,_0x60f603[_0x3b74e9(0x5c5)]);}catch(_0x4a2388){}const _0x1bfd13=_0x4a16de[_0x3b74e9(0x394)]('\x0a')[_0x3b74e9(0x6fc)](_0x1d4192=>_0x1d4192&&!_0x1d4192[_0x3b74e9(0x310)](_0x3f0e55+':'));_0x1bfd13['push'](_0x3f0e55+':'+_0x8f1c7+':'+_0x782494),await fs[_0x3b74e9(0x188)](SESSION_MAP_FILE,_0x1bfd13[_0x3b74e9(0x184)]('\x0a')+'\x0a'),console[_0x3b74e9(0x44c)](_0x3b74e9(0x49e)+_0x3f0e55+':'+_0x8f1c7+':'+_0x782494);}catch(_0x1251a7){console['error']('⚠️\x20\x20Failed\x20to\x20update\x20session\x20file:\x20'+_0x1251a7[_0x3b74e9(0x5d4)]);}console[_0x3b74e9(0x44c)]('✅\x20UIAutomator2\x20session\x20created\x20for\x20'+_0x34bb16),console['log']('\x20\x20\x20Session\x20ID:\x20'+_0x8f1c7),console[_0x3b74e9(0x44c)](_0x3b74e9(0x17e)+_0x782494);const _0x200b8b={};return _0x200b8b[_0x3b74e9(0x6ed)]=!![],_0x200b8b[_0x3b74e9(0x741)]=_0x8f1c7,_0x200b8b[_0x3b74e9(0x8d0)]=_0x782494,_0x200b8b;}catch(_0x50ee33){console['error'](_0x3b74e9(0x414)+_0x34bb16+':',_0x50ee33['message']);const _0x45fc18={};return _0x45fc18['success']=![],_0x45fc18[_0x3b74e9(0x5d6)]=_0x50ee33[_0x3b74e9(0x5d4)],_0x45fc18;}}async function stopUIAutomator2Session(_0x42ef3a,_0x1d4456){const _0x5ee206=_0x28fe54,_0x5f1279={'xjENO':function(_0x22b903,_0x46526d){return _0x22b903(_0x46526d);},'ohvaW':function(_0x1cfcfe,_0x2f6af9){return _0x1cfcfe===_0x2f6af9;},'tOLJT':_0x5ee206(0x22d),'AjbFW':function(_0x271b0c,_0x2acadc){return _0x271b0c===_0x2acadc;},'ItsUf':'OPENAI_API_KEY','MEzVp':_0x5ee206(0x3b7),'NXKMJ':_0x5ee206(0x743),'WTxJx':function(_0x5ee5b4,_0x2de20f){return _0x5ee5b4===_0x2de20f;},'CUzNJ':function(_0x5ea63a,_0x2bcbf1){return _0x5ea63a===_0x2bcbf1;},'DbRXo':'COHERE_API_KEY','urWWk':function(_0x55b300,_0x240a5b){return _0x55b300===_0x240a5b;},'YRabU':_0x5ee206(0x326),'hrXld':function(_0xd515bf,_0x384aaf){return _0xd515bf!==_0x384aaf;},'srAMy':'command_output','guUdB':function(_0x9b66dc,_0x890a2){return _0x9b66dc!==_0x890a2;},'ynXHt':_0x5ee206(0x4c2),'kfXVE':_0x5ee206(0x763),'zTekk':_0x5ee206(0x1ad),'MSalp':_0x5ee206(0x833),'DZJzs':function(_0x3188c2,_0x56f1e3){return _0x3188c2!==_0x56f1e3;},'tXJVL':_0x5ee206(0x2fe),'gmEQj':function(_0x29c6d7,_0x1e81f7){return _0x29c6d7(_0x1e81f7);},'rbqbL':_0x5ee206(0x4a7),'fLIOA':_0x5ee206(0x5e2),'AnioF':_0x5ee206(0x6ba),'aEEtx':_0x5ee206(0x7cd)};console[_0x5ee206(0x44c)]('🛑\x20Stopping\x20UIAutomator2\x20session\x20for\x20'+_0x1d4456+'\x20('+_0x42ef3a+_0x5ee206(0x6a4));try{if(_0x5f1279[_0x5ee206(0x2bc)](_0x5f1279[_0x5ee206(0x7d6)],_0x5f1279[_0x5ee206(0x7d6)]))_0x5f1279[_0x5ee206(0x737)](_0x8a720f,'adb\x20-s\x20'+_0x50c032+'\x20shell\x20am\x20force-stop\x20io.appium.uiautomator2.server'),_0x4ce263(_0x5ee206(0x457)+_0x497468+_0x5ee206(0x8ab)),_0x15bcd8[_0x5ee206(0x44c)](_0x5ee206(0x37b)+_0x2cee8f);else{const _0x4406e9=androidSessions['get'](_0x42ef3a);if(!_0x4406e9){console[_0x5ee206(0x44c)](_0x5ee206(0x403)+_0x1d4456);const _0xbb19fe={};return _0xbb19fe[_0x5ee206(0x6ed)]=!![],_0xbb19fe[_0x5ee206(0x5d4)]=_0x5f1279[_0x5ee206(0x68a)],_0xbb19fe;}try{const _0x3abe10=_0x5f1279['xjENO'](require,_0x5ee206(0x346));await _0x3abe10['delete']('http://localhost:'+_0x4406e9['port']+_0x5ee206(0x2f1)+_0x4406e9[_0x5ee206(0x741)]),console['log'](_0x5ee206(0x789)+_0x1d4456);}catch(_0x2cbe67){if(_0x5f1279[_0x5ee206(0x2bc)](_0x5f1279[_0x5ee206(0x1ae)],_0x5f1279[_0x5ee206(0x7ca)]))console[_0x5ee206(0x44c)](_0x5ee206(0x65d)+_0x2cbe67[_0x5ee206(0x5d4)]);else{const _0x1c002a=_0x3ab50d['trim'](),_0x170182=_0x172f94['trim']();if(_0x5f1279[_0x5ee206(0x1c3)](_0x1c002a,_0x5f1279[_0x5ee206(0x8b1)]))_0x3e363c[_0x5ee206(0x218)]=_0x170182;if(_0x5f1279['AjbFW'](_0x1c002a,_0x5ee206(0x241)))_0x28cc37[_0x5ee206(0x4c5)]=_0x170182;if(_0x5f1279[_0x5ee206(0x1c3)](_0x1c002a,_0x5f1279[_0x5ee206(0x33c)]))_0x627f7c[_0x5ee206(0x723)]=_0x170182;if(_0x1c002a===_0x5f1279['MEzVp'])_0x5765c7['gemini_api_key']=_0x170182;if(_0x5f1279['AjbFW'](_0x1c002a,_0x5f1279[_0x5ee206(0x2a3)]))_0x4e379d['claude_api_key']=_0x170182;if(_0x5f1279[_0x5ee206(0x4e3)](_0x1c002a,'GITHUB_TOKEN'))_0x49080c[_0x5ee206(0x2ab)]=_0x170182;if(_0x1c002a===_0x5ee206(0x7b3))_0x31c925[_0x5ee206(0x558)]=_0x170182;if(_0x5f1279[_0x5ee206(0x647)](_0x1c002a,_0x5f1279['DbRXo']))_0x17b1d6['cohere_api_key']=_0x170182;if(_0x5f1279[_0x5ee206(0x195)](_0x1c002a,_0x5ee206(0x887)))_0x5f0e41[_0x5ee206(0x5af)]=_0x170182;}}try{_0x5f1279[_0x5ee206(0x5bf)](_0x5f1279[_0x5ee206(0x405)],_0x5f1279[_0x5ee206(0x405)])?_0x3a4d5b[_0x5ee206(0x438)](_0x5ee206(0x40d),_0x523f19,_0x24ec1d):(_0x5f1279[_0x5ee206(0x3e4)](execSync,_0x5ee206(0x457)+_0x42ef3a+_0x5ee206(0x3e0)+_0x4406e9[_0x5ee206(0x8d0)]),console[_0x5ee206(0x44c)]('✅\x20Port\x20forwarding\x20removed\x20for\x20'+_0x1d4456));}catch(_0x2b6747){console['log']('⚠️\x20\x20Could\x20not\x20remove\x20port\x20forwarding:\x20'+_0x2b6747[_0x5ee206(0x5d4)]);}try{if('IxOoL'!==_0x5f1279[_0x5ee206(0x63c)])execSync('adb\x20-s\x20'+_0x42ef3a+_0x5ee206(0x314)),_0x5f1279[_0x5ee206(0x737)](execSync,_0x5ee206(0x457)+_0x42ef3a+_0x5ee206(0x8ab)),console[_0x5ee206(0x44c)](_0x5ee206(0x37b)+_0x1d4456);else{const _0x569116=_0x3f1efa[_0x5ee206(0x7e3)](_0x155ce0=>_0x155ce0[_0x5ee206(0x361)]===_0x139175);_0x5f1279[_0x5ee206(0x20d)](_0x569116,-0x1)&&(_0x444a55[_0x569116][_0x5ee206(0x890)]=_0x5ee206(0x23c));_0xf561ee['clients'][_0x5ee206(0x57c)](_0x855aa3=>{const _0x18a2cf=_0x5ee206;if(_0x855aa3[_0x18a2cf(0x45e)]===_0x26a0e6[_0x18a2cf(0x2fc)]){const _0x3405a1={};_0x3405a1['type']=_0x5f1279['YRabU'],_0x3405a1['devices']=_0x2a520f,_0x855aa3[_0x18a2cf(0x550)](_0x3d9774[_0x18a2cf(0x19f)](_0x3405a1));}}),_0x561fee[_0x5ee206(0x44c)]('✅\x20Successfully\x20disconnected\x20'+_0x42524a);const _0x41f60b={};_0x41f60b[_0x5ee206(0x6ed)]=!![],_0x41f60b[_0x5ee206(0x5d4)]=_0x5ee206(0x5dd)+_0x3fb754+_0x5ee206(0x504),_0x5f1279[_0x5ee206(0x737)](_0x43f005,_0x41f60b);}}catch(_0x56282b){console[_0x5ee206(0x44c)]('⚠️\x20\x20Could\x20not\x20stop\x20UIAutomator2\x20server:\x20'+_0x56282b[_0x5ee206(0x5d4)]);}androidSessions[_0x5ee206(0x32c)](_0x42ef3a);try{if(_0x5f1279[_0x5ee206(0x195)](_0x5f1279[_0x5ee206(0x29c)],_0x5ee206(0x27a))){if(_0x5f1279[_0x5ee206(0x1c3)](_0x25d83e[_0x5ee206(0x45e)],_0x56299e['OPEN'])){const _0x54484c={};_0x54484c['type']=_0x5f1279[_0x5ee206(0x2ac)],_0x54484c[_0x5ee206(0x388)]=_0x131e7f,_0x490245[_0x5ee206(0x550)](_0xb61009[_0x5ee206(0x19f)](_0x54484c)),_0x3d8faf['send'](_0x2aaa6f[_0x5ee206(0x19f)]({'type':_0x5f1279[_0x5ee206(0x228)],'output':'✅\x20'+_0x328f44+_0x5ee206(0x2b9)+'─'[_0x5ee206(0x34f)](0x32)+'\x0a','device':_0x582261}));}}else{const _0x558a1f=await fs[_0x5ee206(0x599)](SESSION_MAP_FILE,_0x5f1279[_0x5ee206(0x7a2)]),_0x8527fc=_0x558a1f['split']('\x0a')[_0x5ee206(0x6fc)](_0x31f484=>!_0x31f484[_0x5ee206(0x310)](_0x42ef3a+':'));await fs[_0x5ee206(0x188)](SESSION_MAP_FILE,_0x8527fc[_0x5ee206(0x184)]('\x0a')),console[_0x5ee206(0x44c)](_0x5ee206(0x18b)+_0x1d4456);}}catch(_0x5af7e4){_0x5f1279[_0x5ee206(0x1e9)](_0x5f1279[_0x5ee206(0x88e)],_0x5f1279[_0x5ee206(0x88e)])?console['log']('⚠️\x20\x20Could\x20not\x20update\x20session\x20file:\x20'+_0x5af7e4[_0x5ee206(0x5d4)]):_0x56b03d[_0x5ee206(0x5d6)](_0x5ee206(0x8b9)+_0x54ddfc[_0x5ee206(0x878)]());}console[_0x5ee206(0x44c)](_0x5ee206(0x545)+_0x1d4456);const _0xa71573={};return _0xa71573[_0x5ee206(0x6ed)]=!![],_0xa71573;}}catch(_0x2b5e8d){console[_0x5ee206(0x5d6)](_0x5ee206(0x4b2)+_0x1d4456+':',_0x2b5e8d[_0x5ee206(0x5d4)]);const _0x3273a2={};return _0x3273a2[_0x5ee206(0x6ed)]=![],_0x3273a2[_0x5ee206(0x5d6)]=_0x2b5e8d[_0x5ee206(0x5d4)],_0x3273a2;}}async function loadDeviceConfig(){const _0xebab69=_0x28fe54,_0x480060={};_0x480060[_0xebab69(0x6cb)]=_0xebab69(0x1af),_0x480060[_0xebab69(0x451)]='Unknown',_0x480060[_0xebab69(0x5a4)]=_0xebab69(0x32e),_0x480060[_0xebab69(0x1e4)]=function(_0x210815,_0x2a1698){return _0x210815===_0x2a1698;},_0x480060[_0xebab69(0x54e)]='dqqqe',_0x480060['bVoei']='RrUCx',_0x480060[_0xebab69(0x79a)]=function(_0x2c1e57,_0xcf312b){return _0x2c1e57||_0xcf312b;},_0x480060[_0xebab69(0x4a8)]=function(_0x11c980,_0x35356a){return _0x11c980&&_0x35356a;},_0x480060[_0xebab69(0x8a4)]=function(_0x1878ef,_0x3c019b){return _0x1878ef<_0x3c019b;},_0x480060[_0xebab69(0x751)]=_0xebab69(0x88d),_0x480060[_0xebab69(0x686)]=function(_0x25900a,_0x49fc7a){return _0x25900a>_0x49fc7a;},_0x480060[_0xebab69(0x731)]=_0xebab69(0x683),_0x480060[_0xebab69(0x31b)]=_0xebab69(0x2ae),_0x480060[_0xebab69(0x898)]=_0xebab69(0x3b2),_0x480060['ueSyi']='unknown',_0x480060[_0xebab69(0x469)]=_0xebab69(0x6ba),_0x480060[_0xebab69(0x233)]='Error\x20loading\x20device\x20config:';const _0x277e5d=_0x480060;try{const _0x58cf29=await fs[_0xebab69(0x599)](DEVICE_CONFIG,_0x277e5d[_0xebab69(0x469)]),_0x36fc6e=_0x58cf29[_0xebab69(0x394)]('\x0a')[_0xebab69(0x6fc)](_0x3bcdf3=>_0x3bcdf3[_0xebab69(0x878)]()&&!_0x3bcdf3[_0xebab69(0x310)]('#'))['map'](_0x2487c8=>{const _0x24b22c=_0xebab69,_0x52ec50={};_0x52ec50[_0x24b22c(0x2c1)]=_0x277e5d[_0x24b22c(0x6cb)],_0x52ec50['jxhFB']=_0x277e5d[_0x24b22c(0x451)],_0x52ec50[_0x24b22c(0x8c6)]=_0x277e5d[_0x24b22c(0x5a4)];const _0x1ac47d=_0x52ec50;if(_0x277e5d['ApzXv'](_0x277e5d[_0x24b22c(0x54e)],_0x277e5d[_0x24b22c(0x548)]))_0x108514[_0x188400][_0x24b22c(0x890)]=_0x1ac47d[_0x24b22c(0x2c1)];else{const _0x4ee61a=_0x2487c8['split'](',')[_0x24b22c(0x2d1)](_0x923822=>_0x923822[_0x24b22c(0x878)]()),[_0x186fa5,_0x1a6648,_0x59ba10,_0x571a76,_0x2df8e9]=_0x4ee61a;let _0x42d728=_0x277e5d['zEfSw'](_0x571a76,_0x24b22c(0x3e3));if(_0x277e5d[_0x24b22c(0x4a8)](!_0x571a76,_0x1a6648)){if(_0x1a6648[_0x24b22c(0x1bf)](':')&&_0x1a6648['match'](/^\d+\.\d+\.\d+\.\d+:\d+$/))_0x42d728=_0x24b22c(0x88d);else{if(_0x277e5d[_0x24b22c(0x8a4)](_0x1a6648[_0x24b22c(0x3c8)],0x14)&&!_0x1a6648[_0x24b22c(0x1bf)]('-'))_0x42d728=_0x277e5d[_0x24b22c(0x751)];else _0x1a6648[_0x24b22c(0x1bf)]('-')&&_0x277e5d[_0x24b22c(0x686)](_0x1a6648[_0x24b22c(0x3c8)],0x1e)&&(_0x277e5d[_0x24b22c(0x1e4)](_0x277e5d['oaiRG'],_0x277e5d[_0x24b22c(0x731)])?_0x42d728=_0x24b22c(0x3e3):(_0x2b72d1[_0x24b22c(0x744)]=_0x7cdeaf,_0x7983d[_0x24b22c(0x361)]=_0x3621df,_0x556c29['version']=_0x1ac47d[_0x24b22c(0x7e2)],_0x30cf5f[_0x24b22c(0x5d6)]=_0x1ac47d[_0x24b22c(0x8c6)]));}}return{'name':_0x186fa5,'udid':_0x1a6648,'ip':_0x277e5d['zEfSw'](_0x59ba10,''),'platform':_0x42d728,'type':_0x2df8e9||(_0x59ba10?_0x277e5d[_0x24b22c(0x31b)]:_0x277e5d[_0x24b22c(0x898)]),'status':_0x277e5d[_0x24b22c(0x57a)]};}});return _0x36fc6e;}catch(_0x3cba5e){return console[_0xebab69(0x5d6)](_0x277e5d['fsrDl'],_0x3cba5e),[];}}async function discoverDevices(){const _0x4acf92=_0x28fe54,_0x3c5aea={'YRxCH':function(_0x599114,_0x5dc25a){return _0x599114===_0x5dc25a;},'nQpBt':function(_0x5847dd,_0x517204){return _0x5847dd!==_0x517204;},'tZAOf':'lQlRm','tOnYx':_0x4acf92(0x1af),'JCaCv':function(_0x1e4300,_0x10f94a){return _0x1e4300(_0x10f94a);}},_0x4dc876=new Map();return connectedDevices[_0x4acf92(0x57c)](_0x4efa44=>{const _0x129837=_0x4acf92;_0x4dc876[_0x129837(0x793)](_0x4efa44['udid'],{'status':_0x4efa44[_0x129837(0x890)],'sessionId':_0x4efa44['sessionId']});}),connectedDevices=await discoverAllDevices(),connectedDevices[_0x4acf92(0x57c)](_0x29bb3a=>{const _0x1a4422=_0x4acf92,_0x5bff7a=_0x4dc876[_0x1a4422(0x3a1)](_0x29bb3a[_0x1a4422(0x2a7)]);_0x5bff7a&&_0x3c5aea['YRxCH'](_0x5bff7a[_0x1a4422(0x890)],_0x1a4422(0x1af))&&(_0x3c5aea[_0x1a4422(0x42d)](_0x3c5aea[_0x1a4422(0x82b)],_0x3c5aea[_0x1a4422(0x82b)])?_0x1558af+=_0x1a4422(0x3f5)+_0x83471+'\x0a':(_0x29bb3a[_0x1a4422(0x890)]=_0x3c5aea['tOnYx'],_0x5bff7a[_0x1a4422(0x741)]&&(_0x29bb3a[_0x1a4422(0x741)]=_0x5bff7a['sessionId'])));}),await _0x3c5aea['JCaCv'](autoSaveUSBDevicesToConfig,connectedDevices),connectedDevices;}async function autoSaveUSBDevicesToConfig(_0x345292){const _0x405c40=_0x28fe54,_0x22c35f={};_0x22c35f['JMRGp']=_0x405c40(0x7ab),_0x22c35f[_0x405c40(0x488)]=_0x405c40(0x212),_0x22c35f[_0x405c40(0x45d)]=function(_0x12e254,_0x5d0071){return _0x12e254===_0x5d0071;},_0x22c35f[_0x405c40(0x4f4)]=_0x405c40(0x5c3),_0x22c35f[_0x405c40(0x186)]=_0x405c40(0x68f),_0x22c35f[_0x405c40(0x4ef)]=_0x405c40(0x7ae),_0x22c35f['PHzyy']=_0x405c40(0x2db);const _0x40f657=_0x22c35f;try{if(_0x40f657[_0x405c40(0x488)]!=='RdQcp'){const _0xab7ec=_0x345292['filter'](_0xc2c305=>_0xc2c305[_0x405c40(0x38e)]===_0x405c40(0x3b2));if(_0x40f657[_0x405c40(0x45d)](_0xab7ec[_0x405c40(0x3c8)],0x0))return;const _0x35a197=await loadDeviceConfig(),_0x1a446a=new Set(_0x35a197['map'](_0x289641=>_0x289641[_0x405c40(0x2a7)])),_0x1e87b1=_0xab7ec['filter'](_0x30513a=>!_0x1a446a[_0x405c40(0x4ff)](_0x30513a[_0x405c40(0x2a7)]));if(_0x40f657['MlkIe'](_0x1e87b1['length'],0x0))return;const _0x243966=[..._0x35a197,..._0x1e87b1[_0x405c40(0x2d1)](_0x2c2c82=>({'name':_0x2c2c82['name'],'udid':_0x2c2c82[_0x405c40(0x2a7)],'ip':''}))];let _0x201e92=_0x40f657[_0x405c40(0x4f4)];_0x201e92+='#\x20Format:\x20device_name,udid,ip_address\x0a',_0x201e92+=_0x40f657[_0x405c40(0x186)],_0x243966[_0x405c40(0x57c)](_0x538ece=>{const _0x208e47=_0x405c40,_0x488946=_0x538ece['ip']||'';_0x201e92+=_0x538ece[_0x208e47(0x361)]+','+_0x538ece[_0x208e47(0x2a7)]+','+_0x488946+'\x0a';}),await fs[_0x405c40(0x188)](DEVICE_CONFIG,_0x201e92),console[_0x405c40(0x44c)](_0x405c40(0x1d8)+_0x1e87b1[_0x405c40(0x3c8)]+_0x405c40(0x440));}else{const _0x25ad87=_0x224e34[_0x405c40(0x67c)]();_0x5c419c+=_0x25ad87,_0x1c9677['error']('['+_0x5e1bc1+_0x405c40(0x543)+_0x25ad87[_0x405c40(0x878)]());}}catch(_0x26a8b5){if(_0x405c40(0x8df)===_0x40f657[_0x405c40(0x4ef)]){_0x5345ca[_0x405c40(0x5d6)](_0x405c40(0x61f)+(_0x32df39+0x1)+_0x405c40(0x2c5),_0x16dc8d['message']);const _0x59863c={};_0x59863c[_0x405c40(0x75c)]=_0x27ddf8,_0x59863c[_0x405c40(0x6ed)]=![],_0x59863c[_0x405c40(0x5d6)]=_0x29d36a[_0x405c40(0x5d4)],_0x2c5020[_0x405c40(0x80f)](_0x59863c);if(_0x8d8f6c){const _0x3fbea7={};_0x3fbea7['type']=_0x40f657[_0x405c40(0x62f)],_0x3fbea7['data']='❌\x20Error:\x20'+_0x2cb4dc[_0x405c40(0x5d4)]+'\x0a',_0x3fbea7[_0x405c40(0x388)]=_0x36d839,_0x342a96[_0x405c40(0x550)](_0x4f99ab[_0x405c40(0x19f)](_0x3fbea7));}}else console['error'](_0x40f657['PHzyy'],_0x26a8b5);}}function checkDeviceConnectivity(_0x20cd2b){const _0xd8f744=_0x28fe54,_0x1d74b7={'IuiWA':_0xd8f744(0x326),'rJlQP':function(_0x29fdc1,_0x4889b2){return _0x29fdc1===_0x4889b2;},'ItQLS':_0xd8f744(0x3d4),'TNLDk':function(_0x10bd49,_0x59f213){return _0x10bd49(_0x59f213);},'pYhSH':_0xd8f744(0x180),'uVhzp':function(_0x40e72f,_0x198731){return _0x40e72f!==_0x198731;},'knuuR':_0xd8f744(0x507),'vCuTH':'--max-time','bXzIQ':_0xd8f744(0x46a),'zsnBP':_0xd8f744(0x8cb),'swhyK':function(_0x467ff8,_0x4b6090,_0x45c0f1){return _0x467ff8(_0x4b6090,_0x45c0f1);}};return new Promise(_0x1be1e2=>{const _0x13a6e0=_0xd8f744,_0x5e7ea5={'eFmgL':_0x1d74b7[_0x13a6e0(0x858)],'WZFsW':function(_0x5dc7a4,_0x5ac1c7){return _0x1d74b7['rJlQP'](_0x5dc7a4,_0x5ac1c7);},'WUQQF':_0x1d74b7[_0x13a6e0(0x277)],'pTUVO':function(_0xd9dcc2,_0x370865){return _0x1d74b7['TNLDk'](_0xd9dcc2,_0x370865);},'FreAH':_0x1d74b7['pYhSH']};if(_0x1d74b7[_0x13a6e0(0x84e)](_0x1d74b7['knuuR'],_0x1d74b7[_0x13a6e0(0x853)])){const _0x162917={};_0x162917[_0x13a6e0(0x185)]=_0x5e7ea5[_0x13a6e0(0x780)],_0x162917[_0x13a6e0(0x388)]=_0x3479a6,_0x39180f[_0x13a6e0(0x550)](_0x4cbf29[_0x13a6e0(0x19f)](_0x162917));}else{const _0x28b30c=spawn(_0x13a6e0(0x46f),['-s',_0x13a6e0(0x27c),'2',_0x1d74b7[_0x13a6e0(0x6ee)],'3',_0x13a6e0(0x6e8)+_0x20cd2b['ip']+_0x13a6e0(0x250)]);let _0x4dcf3b='';_0x28b30c['stdout']['on'](_0x1d74b7[_0x13a6e0(0x315)],_0x2b8f4d=>{const _0x3ce868=_0x13a6e0;_0x4dcf3b+=_0x2b8f4d[_0x3ce868(0x67c)]();}),_0x28b30c['on'](_0x1d74b7['zsnBP'],_0x5abd72=>{const _0x370480=_0x13a6e0;if(_0x5e7ea5[_0x370480(0x8ce)](_0x370480(0x3d4),_0x5e7ea5[_0x370480(0x71d)]))_0x5e7ea5[_0x370480(0x2cb)](_0x1be1e2,_0x4dcf3b['includes'](_0x5e7ea5['FreAH']));else return _0xe9b9e8;}),_0x1d74b7[_0x13a6e0(0x47a)](setTimeout,()=>{const _0x4133de=_0x13a6e0;_0x28b30c[_0x4133de(0x584)](),_0x1be1e2(![]);},0xbb8);}});}function loadAppPresets(){const _0x5a187d=_0x28fe54,_0x1f8c19={'RCodg':function(_0x4bf7c8,_0x535966){return _0x4bf7c8===_0x535966;},'nBbjl':_0x5a187d(0x8c1),'JGPsk':function(_0xcd4507,_0x1a18d0){return _0xcd4507&&_0x1a18d0;},'ZknFn':function(_0x4f96cb,_0x3d122f){return _0x4f96cb!==_0x3d122f;},'EYXIa':'tmcFq','wlquY':'IDzOg','TwHPV':_0x5a187d(0x27d),'uYlzl':_0x5a187d(0x326),'HMnKL':_0x5a187d(0x7ab),'FHIOr':function(_0x38b8bb,_0x1da8a1){return _0x38b8bb(_0x1da8a1);},'CBhmK':function(_0x479c3f,_0x2540de){return _0x479c3f(_0x2540de);},'BLnOq':_0x5a187d(0x6ba),'pBCYF':function(_0x42145e,_0x147b86){return _0x42145e===_0x147b86;},'SpGAn':'ARPAf','YXLgU':_0x5a187d(0x23f),'OKXxu':_0x5a187d(0x506)};try{if(!_0x1f8c19['FHIOr'](require,'fs')[_0x5a187d(0x179)](APPS_CONFIG))return{};const _0x649358=_0x1f8c19[_0x5a187d(0x56b)](require,'fs')[_0x5a187d(0x52a)](APPS_CONFIG,_0x1f8c19[_0x5a187d(0x170)]),_0x3b4c71={};return _0x649358[_0x5a187d(0x394)]('\x0a')[_0x5a187d(0x6fc)](_0x595fef=>_0x595fef[_0x5a187d(0x878)]()&&!_0x595fef['startsWith']('#'))['forEach'](_0x93197e=>{const _0xfc2186=_0x5a187d,[_0x44f1cd,_0x3cbe2a]=_0x93197e[_0xfc2186(0x394)](',')[_0xfc2186(0x2d1)](_0x336eed=>_0x336eed[_0xfc2186(0x878)]());if(_0x1f8c19['JGPsk'](_0x44f1cd,_0x3cbe2a)){if(_0x1f8c19[_0xfc2186(0x883)](_0x1f8c19[_0xfc2186(0x7cb)],_0x1f8c19['wlquY'])){const _0x28b488=_0x44f1cd['split']('.');if(_0x28b488['length']===0x2){if(_0x1f8c19['ZknFn'](_0xfc2186(0x860),_0x1f8c19['TwHPV'])){const [_0xdcfadc,_0x3a0222]=_0x28b488;if(!_0x3b4c71[_0xdcfadc])_0x3b4c71[_0xdcfadc]={};_0x3b4c71[_0xdcfadc][_0x3a0222]=_0x3cbe2a;}else{if(_0x1f8c19[_0xfc2186(0x2ca)](_0x924767[_0xfc2186(0x45e)],_0x49d9de['OPEN'])){const _0x497975={};_0x497975[_0xfc2186(0x185)]=_0xfc2186(0x326),_0x497975[_0xfc2186(0x388)]=_0x130b33,_0x5c0dc1['send'](_0x57f81c[_0xfc2186(0x19f)](_0x497975));}}}else{if(!_0x3b4c71[_0x44f1cd])_0x3b4c71[_0x44f1cd]={};_0x3b4c71[_0x44f1cd]['common']=_0x3cbe2a;}}else{const _0x4c83a4={};return _0x4c83a4[_0xfc2186(0x6ed)]=![],_0x4c83a4[_0xfc2186(0x5d6)]=_0x1f8c19[_0xfc2186(0x6e7)],_0x24033c[_0xfc2186(0x890)](0x190)[_0xfc2186(0x8bb)](_0x4c83a4);}}}),_0x3b4c71;}catch(_0x507d05){if(_0x1f8c19['pBCYF'](_0x1f8c19[_0x5a187d(0x1d0)],_0x1f8c19[_0x5a187d(0x1c9)])){const _0x7425df={};_0x7425df[_0x5a187d(0x185)]=_0x1f8c19[_0x5a187d(0x764)],_0x7425df[_0x5a187d(0x388)]=_0x198514,_0x4369e3[_0x5a187d(0x550)](_0x3e0971[_0x5a187d(0x19f)](_0x7425df)),_0x3ecb0f['send'](_0x15b986['stringify']({'type':_0x1f8c19[_0x5a187d(0x784)],'output':'✅\x20'+_0x3397e5+_0x5a187d(0x2b9)+'─'[_0x5a187d(0x34f)](0x32)+'\x0a','device':_0x1ea516}));}else return console['error'](_0x1f8c19[_0x5a187d(0x74f)],_0x507d05),{};}}function resolveAppPreset(_0x5ca212,_0x235b22){const _0x2112c4=_0x28fe54,_0x1ac88a={'VEPGz':function(_0x569bb1,_0x4a49c2){return _0x569bb1(_0x4a49c2);},'LDCcn':function(_0x4cab0e,_0x3d3f2e){return _0x4cab0e(_0x3d3f2e);},'zmezH':function(_0x5a5926,_0x3e45b0){return _0x5a5926(_0x3e45b0);},'Zsqzx':function(_0x551317){return _0x551317();},'ZJkII':_0x2112c4(0x4bb),'joPcm':function(_0x4b6052,_0x23f374){return _0x4b6052===_0x23f374;},'fUhwb':_0x2112c4(0x4a2)},_0x50f964=_0x1ac88a[_0x2112c4(0x826)](loadAppPresets),_0x1a4def=_0x5ca212[_0x2112c4(0x260)](/^launch\s+(\S+)(.*)$/);if(!_0x1a4def)return _0x5ca212;const _0x2dbdab=_0x1a4def[0x1],_0x288df9=_0x1a4def[0x2];if(_0x2dbdab[_0x2112c4(0x1bf)]('.'))return _0x5ca212;if(_0x50f964[_0x2dbdab]){if(_0x1ac88a[_0x2112c4(0x4b6)]===_0x1ac88a[_0x2112c4(0x4b6)]){const _0x358494=_0x50f964[_0x2dbdab];let _0x2e6343;if(_0x358494[_0x235b22])_0x2e6343=_0x358494[_0x235b22];else{if(_0x358494['common']){if(_0x1ac88a[_0x2112c4(0x281)](_0x2112c4(0x243),_0x1ac88a[_0x2112c4(0x181)]))return{};else _0x2e6343=_0x358494[_0x2112c4(0x3ee)];}}if(_0x2e6343){if(_0x2112c4(0x3e1)===_0x2112c4(0x3e1))return console[_0x2112c4(0x44c)](_0x2112c4(0x6aa)+_0x2dbdab+_0x2112c4(0x2fd)+_0x2e6343+_0x2112c4(0x2c2)+_0x235b22+')'),'launch\x20'+_0x2e6343+_0x288df9;else{const _0xe19c09={};_0xe19c09[_0x2112c4(0x890)]=_0x240740[_0x2112c4(0x890)],_0xe19c09[_0x2112c4(0x741)]=_0x3ee059[_0x2112c4(0x741)],_0x52e1b9['set'](_0x4fe486['udid'],_0xe19c09);}}}else _0xdfa9de['x']=_0x1ac88a[_0x2112c4(0x263)](_0x3a66ce,_0x3bcc4f[0x1]),_0x303bb4['y']=_0x1ac88a[_0x2112c4(0x65f)](_0x20774c,_0x52d9e1[0x2]),_0x4a0449[_0x2112c4(0x286)]=_0x55e6c6(_0x49e8b4[0x3]),_0x240c16[_0x2112c4(0x8d8)]=_0x1ac88a[_0x2112c4(0x8a3)](_0x71d3a0,_0x143a3c[0x4]),_0x3345f5[_0x2112c4(0x49d)]='('+_0xa3475['x']+','+_0x23ac18['y']+')\x20'+_0x4d96d8['width']+'x'+_0x2a3eda[_0x2112c4(0x8d8)];}return _0x5ca212;}function executeCommand(_0x14683d,_0x3a3d15,_0x301a54){const _0x466e34=_0x28fe54,_0x2d5588={'HNakj':'replay_error','cIoyv':function(_0x449450,_0x20435d){return _0x449450+_0x20435d;},'bGKIU':function(_0x44b2e3,_0x494019){return _0x44b2e3===_0x494019;},'OzltH':function(_0x4af3a8,_0x23ac70){return _0x4af3a8!==_0x23ac70;},'oWvPs':_0x466e34(0x593),'Nzwac':function(_0x397ed9,_0x2a3d1b){return _0x397ed9(_0x2a3d1b);},'dpuEv':'No\x20devices\x20found.\x20Please\x20refresh\x20device\x20list\x20and\x20try\x20again.','SzWKE':function(_0x1d3150,_0x5399f5){return _0x1d3150>_0x5399f5;},'HDWZE':function(_0x389174,_0x33b778){return _0x389174===_0x33b778;},'YyJxB':_0x466e34(0x287),'LQhOA':function(_0x13be8d,_0x49a118){return _0x13be8d>_0x49a118;},'ZHDDt':function(_0x5a0520,_0xf6a9b7){return _0x5a0520===_0xf6a9b7;},'tpyHn':_0x466e34(0x2f8),'VSPdU':function(_0x53ba3d,_0xfde07b,_0x8e158f){return _0x53ba3d(_0xfde07b,_0x8e158f);},'udnjy':function(_0x3aaea6,_0x2a64e4,_0xfc6a08,_0x2c8e9d,_0x62d2e){return _0x3aaea6(_0x2a64e4,_0xfc6a08,_0x2c8e9d,_0x62d2e);},'EVMkW':function(_0x3dd8ba,_0x4266ca){return _0x3dd8ba>_0x4266ca;},'XYBeZ':'ios','LdlOE':function(_0x5388ab,_0x5186b6){return _0x5388ab>_0x5186b6;},'HorgW':_0x466e34(0x88d),'MEBqK':'luPkA','gnAJA':_0x466e34(0x707),'hhwDG':function(_0x3cb9ef,_0x80914e,_0x23c58a){return _0x3cb9ef(_0x80914e,_0x23c58a);},'BleZi':function(_0x170c57,_0x248409){return _0x170c57===_0x248409;},'VxrOW':function(_0x3f03ed,_0x3f3118){return _0x3f03ed===_0x3f3118;},'yBtPD':'ofRNR','AgyKF':'No\x20executable\x20devices\x20found','skqYK':function(_0x52bf13,_0x42f440){return _0x52bf13===_0x42f440;},'Fbcyz':_0x466e34(0x64e),'TCauU':function(_0x4b745d,_0x32bc7d){return _0x4b745d(_0x32bc7d);}};return new Promise(async(_0x5e2435,_0x35efcb)=>{const _0x1586c7=_0x466e34,_0x1e8be6={'QpWnc':function(_0x3a3f03,_0x24b71f){const _0x347f26=_0x2d26;return _0x2d5588[_0x347f26(0x8ae)](_0x3a3f03,_0x24b71f);}};logger[_0x1586c7(0x43a)]('Device\x20names\x20received:\x20['+_0x14683d[_0x1586c7(0x184)](',\x20')+']'),console[_0x1586c7(0x44c)](_0x1586c7(0x899)+_0x3a3d15+'\x22');const _0x1c77a7=connectedDevices[_0x1586c7(0x6fc)](_0x2cda4d=>_0x14683d[_0x1586c7(0x1bf)](_0x2cda4d[_0x1586c7(0x361)])||_0x14683d[_0x1586c7(0x1bf)](_0x2cda4d[_0x1586c7(0x2a7)])||_0x14683d[_0x1586c7(0x1bf)](_0x2cda4d[_0x1586c7(0x207)]));logger[_0x1586c7(0x43a)](_0x1586c7(0x570),connectedDevices['map'](_0x4090b3=>_0x4090b3[_0x1586c7(0x361)]+'('+_0x4090b3['status']+')')[_0x1586c7(0x184)](',\x20'));if(_0x2d5588[_0x1586c7(0x663)](_0x1c77a7[_0x1586c7(0x3c8)],0x0)){if(_0x2d5588[_0x1586c7(0x843)](_0x2d5588[_0x1586c7(0x467)],_0x2d5588[_0x1586c7(0x467)])){const _0x99d9c5={};_0x99d9c5[_0x1586c7(0x185)]=_0x2d5588[_0x1586c7(0x49c)],_0x99d9c5[_0x1586c7(0x5d6)]=_0x3db184[_0x1586c7(0x5d4)],_0x38e056['send'](_0x400be7[_0x1586c7(0x19f)](_0x99d9c5));}else return console[_0x1586c7(0x5d6)]('❌\x20No\x20devices\x20found\x20for:\x20['+_0x14683d[_0x1586c7(0x184)](',\x20')+']'),_0x2d5588['Nzwac'](_0x35efcb,{'success':![],'error':_0x2d5588[_0x1586c7(0x73f)]});}const _0x1a3545=_0x1c77a7['filter'](_0x247f34=>!['online','connected']['includes'](_0x247f34[_0x1586c7(0x890)]));if(_0x2d5588[_0x1586c7(0x6db)](_0x1a3545['length'],0x0)){if(_0x2d5588[_0x1586c7(0x6cc)]('Cefee',_0x1586c7(0x6bf)))_0x1aebaf['log'](_0x1586c7(0x8e8)+_0x1804e6[_0x1586c7(0x741)]);else{const _0x40017c=_0x1a3545[_0x1586c7(0x2d1)](_0x340c44=>_0x340c44['name']+_0x1586c7(0x33a)+_0x340c44[_0x1586c7(0x890)]+')')[_0x1586c7(0x184)](',\x20');console['error'](_0x1586c7(0x472)+_0x40017c+']');if(_0x301a54){const _0x49db6e={};_0x49db6e[_0x1586c7(0x185)]=_0x1586c7(0x7ab),_0x49db6e['data']=_0x1586c7(0x859)+_0x40017c+'\x0a\x0a💡\x20Please\x20click\x20the\x20\x22Connect\x22\x20button\x20on\x20each\x20device\x20before\x20running\x20commands.\x0a\x0a',_0x49db6e[_0x1586c7(0x388)]=_0x14683d,_0x301a54[_0x1586c7(0x550)](JSON[_0x1586c7(0x19f)](_0x49db6e));}const _0xef4a67={};return _0xef4a67['success']=![],_0xef4a67[_0x1586c7(0x5d6)]=_0x1586c7(0x693)+_0x40017c+_0x1586c7(0x35a),_0x2d5588[_0x1586c7(0x17f)](_0x35efcb,_0xef4a67);}}console[_0x1586c7(0x44c)](_0x1586c7(0x62c)+_0x1c77a7['length']+_0x1586c7(0x356)),console[_0x1586c7(0x44c)](_0x2d5588['YyJxB'],_0x1c77a7[_0x1586c7(0x2d1)](_0x28f6ee=>_0x28f6ee[_0x1586c7(0x361)]+'('+_0x28f6ee['platform']+'-'+_0x28f6ee[_0x1586c7(0x38e)]+')')['join'](',\x20'));const _0x146ad8=_0x1c77a7[_0x1586c7(0x6fc)](_0x3a066f=>_0x3a066f[_0x1586c7(0x2fa)]==='ios'&&_0x3a066f[_0x1586c7(0x38e)]==='usb'),_0x1be321=_0x1c77a7[_0x1586c7(0x6fc)](_0x3c97a6=>_0x3c97a6[_0x1586c7(0x2fa)]==='ios'&&_0x3c97a6[_0x1586c7(0x38e)]===_0x1586c7(0x2ae)),_0x2ddacc=_0x1c77a7[_0x1586c7(0x6fc)](_0x15d3b3=>_0x15d3b3[_0x1586c7(0x2fa)]===_0x1586c7(0x88d)&&_0x15d3b3[_0x1586c7(0x38e)]===_0x1586c7(0x3b2)),_0x40e5f9=_0x1c77a7['filter'](_0x4c99dd=>_0x4c99dd[_0x1586c7(0x2fa)]===_0x1586c7(0x88d)&&_0x4c99dd[_0x1586c7(0x38e)]===_0x1586c7(0x2ae)),_0x5e37b5=[];if(_0x2d5588[_0x1586c7(0x3dc)](_0x146ad8['length'],0x0)){if(_0x2d5588['ZHDDt'](_0x2d5588[_0x1586c7(0x16a)],_0x2d5588['tpyHn'])){const _0x3a0423=_0x146ad8[_0x1586c7(0x2d1)](_0x332c61=>_0x332c61[_0x1586c7(0x361)]),_0x59d684=_0x2d5588[_0x1586c7(0x39a)](resolveAppPreset,_0x3a3d15,_0x1586c7(0x3e3));logger['debug']('Using\x20iOS\x20USB\x20script\x20for:\x20'+_0x3a0423[_0x1586c7(0x184)](',\x20')),_0x5e37b5[_0x1586c7(0x80f)](_0x2d5588['udnjy'](executeWithScript,USB_SCRIPT_PATH,_0x3a0423,_0x59d684,_0x301a54));}else{const _0x413ceb={};_0x413ceb['encoding']=_0x1586c7(0x6ba),_0x413ceb[_0x1586c7(0x283)]=0x2710;const _0x9bd42e=_0x7f91a7('adb\x20-s\x20'+_0x152b24+_0x1586c7(0x2b1)+_0x1b29a8+_0x1586c7(0x47e),_0x413ceb);_0x2f2f5d[_0x1586c7(0x361)]=_0x408231;}}if(_0x2d5588[_0x1586c7(0x46d)](_0x1be321[_0x1586c7(0x3c8)],0x0)){const _0x28b0f2=_0x1be321[_0x1586c7(0x2d1)](_0x30f619=>_0x30f619['name']),_0x25b987=_0x2d5588[_0x1586c7(0x39a)](resolveAppPreset,_0x3a3d15,_0x2d5588[_0x1586c7(0x1b3)]);console[_0x1586c7(0x44c)](_0x1586c7(0x607)+_0x28b0f2['join'](',\x20')),_0x5e37b5[_0x1586c7(0x80f)](_0x2d5588[_0x1586c7(0x368)](executeWithScript,WIRELESS_SCRIPT_PATH,_0x28b0f2,_0x25b987,_0x301a54));}if(_0x2d5588[_0x1586c7(0x473)](_0x2ddacc[_0x1586c7(0x3c8)],0x0)){const _0x4b709f=resolveAppPreset(_0x3a3d15,_0x2d5588[_0x1586c7(0x239)]);logger[_0x1586c7(0x43a)]('Using\x20Android\x20control\x20script\x20for\x20USB\x20devices:\x20'+_0x2ddacc[_0x1586c7(0x2d1)](_0xd3f379=>_0xd3f379['name'])['join'](',\x20')),_0x5e37b5['push'](_0x2d5588['udnjy'](executeAndroidDevices,ANDROID_USB_SCRIPT_PATH,_0x2ddacc,_0x4b709f,_0x301a54));}if(_0x40e5f9['length']>0x0){if(_0x2d5588[_0x1586c7(0x6cc)](_0x2d5588['MEBqK'],_0x2d5588[_0x1586c7(0x534)]))_0x4620c4[_0x1586c7(0x44c)](_0x1586c7(0x471)+_0x52c2fd[_0x1586c7(0x878)]());else{const _0x30e10d=_0x2d5588[_0x1586c7(0x1cc)](resolveAppPreset,_0x3a3d15,_0x1586c7(0x88d));logger[_0x1586c7(0x43a)](_0x1586c7(0x55e)+_0x40e5f9[_0x1586c7(0x2d1)](_0x202053=>_0x202053[_0x1586c7(0x361)])[_0x1586c7(0x184)](',\x20')),_0x5e37b5[_0x1586c7(0x80f)](_0x2d5588[_0x1586c7(0x368)](executeAndroidDevices,ANDROID_WIRELESS_SCRIPT_PATH,_0x40e5f9,_0x30e10d,_0x301a54));}}if(_0x2d5588[_0x1586c7(0x2a4)](_0x5e37b5[_0x1586c7(0x3c8)],0x0)){if(_0x2d5588['VxrOW'](_0x2d5588['yBtPD'],_0x1586c7(0x6fd)))_0x59ef26[_0x1586c7(0x44c)](_0x1586c7(0x80a)+_0x50a025);else return _0x2d5588[_0x1586c7(0x17f)](_0x35efcb,{'success':![],'error':_0x2d5588['AgyKF']});}try{if(_0x2d5588[_0x1586c7(0x690)]('WRxeh',_0x1586c7(0x399))){const _0x1f5726={};_0x1f5726[_0x1586c7(0x873)]=_0x1586c7(0x6ba),_0x1f5726[_0x1586c7(0x283)]=0x2710;const _0x2683ae=_0x155496('adb\x20-s\x20'+_0x113d1c+'\x20shell\x20dumpsys\x20package\x20'+_0x56db26+_0x1586c7(0x6fe),_0x1f5726),_0x40975a=_0x2683ae[_0x1586c7(0x260)](/versionName=([^\s]+)/);_0x40975a&&(_0x2f91c2[_0x1586c7(0x2c8)]=_0x40975a[0x1]);}else{const _0x23bb88=await Promise['allSettled'](_0x5e37b5),_0x2d7385=_0x23bb88[_0x1586c7(0x6fc)](_0x1a3fdf=>_0x1a3fdf['status']===_0x1586c7(0x53c))[_0x1586c7(0x3c8)],_0x4e1383=_0x23bb88[_0x1586c7(0x6fc)](_0x1bb1ac=>_0x1bb1ac[_0x1586c7(0x890)]===_0x1586c7(0x268))[_0x1586c7(0x3c8)];logger[_0x1586c7(0x43a)]('ExecuteCommand\x20summary:\x20'+_0x2d7385+_0x1586c7(0x211)+_0x4e1383+_0x1586c7(0x7dd));const _0x171f64={};_0x171f64[_0x1586c7(0x6ed)]=!![],_0x171f64[_0x1586c7(0x6c7)]=_0x23bb88,_0x171f64[_0x1586c7(0x4e1)]=_0x2d7385+'/'+_0x5e37b5['length']+'\x20script\x20groups\x20completed',_0x2d5588[_0x1586c7(0x17f)](_0x5e2435,_0x171f64);}}catch(_0x351f8b){if(_0x2d5588[_0x1586c7(0x193)](_0x2d5588[_0x1586c7(0x697)],_0x1586c7(0x4ce))){_0x510815[_0x1586c7(0x5d6)](_0x1586c7(0x571)+_0x1e8be6[_0x1586c7(0x7f7)](_0x460300,0x1)+'\x20failed:',_0x4a2533[_0x1586c7(0x5d4)]);const _0x11f520={};_0x11f520[_0x1586c7(0x75c)]=_0x1d64c7,_0x11f520[_0x1586c7(0x6ed)]=![],_0x11f520['error']=_0x290ffe[_0x1586c7(0x5d4)],_0x369ef5['push'](_0x11f520);if(_0x3fb4dd){const _0x445aa7={};_0x445aa7[_0x1586c7(0x185)]='command_output',_0x445aa7[_0x1586c7(0x46a)]=_0x1586c7(0x3d2)+_0x3e1b30[_0x1586c7(0x5d4)]+'\x0a\x0a',_0x445aa7['devices']=_0x2fa244,_0x380a37[_0x1586c7(0x550)](_0x26fbb0['stringify'](_0x445aa7));}}else console['error'](_0x1586c7(0x618),_0x351f8b),_0x2d5588[_0x1586c7(0x240)](_0x35efcb,_0x351f8b);}});}function _0x1ec5(){const _0x668de4=['igfSCMvHzhKGC3rVChbLza','ywvcEfu','nxWWFdr8mNWZFde','zw5JB2rPBMC','uufQqLm','vxnLiefjoIa','lcbPBNn0ywXSAw5NlI4U','cVcFJjaGt3bLBMLUzYbICM93C2vYihrVia','DhjPBq','zLbVqNu','BNbKyKG','Bg9JywXLq29TCgfYzq','v1rXAuy','EM1XwgS','qLjrD28','EhDmv0m','ug9zwuC','D3zSu0S','4PYfienVBxbSzxrLzcbZDwnJzxnZzNvSBhKkcG','wMTUrM4','EKrttNq','uMvWBgf5ihn0yxj0zwq','uMvZDwX0ihn1y2nLC3m6ia','tuLtvfjbtf9bueLFs0vz','DMzoC1G','zgLYBMfTzq','A2PjqLe','xsbqCM9JzxnZigvYCM9YoIa','DvPvrhG','yw5KCM9Pza','yuvfDhG','CwnnBMG','C3rHDhvZ','B1j5uKm','yw5syw8','8j+tPIbfBNn1CMLUzYbvsuf1Dg9TyxrVCJiGAxmGAw5ZDgfSBgvKig9Uia','CMLJrvu','C21StwO','EuX6uM8','BeTTCgW','ExPNs1a','q29TBwfUzdOGiG','DLrzEhe','D2fOwhq','ueTjD3G','su14Avm','DLzStNm','sKj0uvi','q29TBwfUzhm6','ENr0EfO','CvbyC2W','EM1LEKG','uMzQDKS','icaZlIbvC2uGBg9JywWGzNjVBNrLBMqGyxqGAhr0CdOVl2XVy2fSAg9ZDdOZmdaXcG','zenIve8','uMvWBgf5igfIB3j0zwqGyNKGDxnLCG','icaGlsa','Dw5SAw5R','iYbqAxHLBdGSmueYqJndneq1rtzglcXHBMrYB2LKlhvZyIaGicaGicaGicaGicaGicaGicaGicaOqw5KCM9Pzcbvu0iGlsbHDxrVlwrLDgvJDgvKkqO','ihnOzwXSigfTigzVCMnLlxn0B3aGAw8UyxbWAxvTlNvPyxv0B21HDg9YmI5Zzxj2zxiUDgvZDa','z1njuMK','tKXXu3y','y0LVExy','A3zjrMe','yNznvfO','De9msLq','u2nYAxb0ihjLC3vSDdO','uMvZDwX0ihn0yxr1CZOG','y2fWywjPBgL0AwvZ','rgv2AwnLigfUzcbIDw5KBguGsuqGCMvXDwLYzwq','BhLMy1a','zw5KvgLTzq','D3rAD0u','4PQG77IpifDeqsbfCNjVCJOG','CvvNuNK','ANnVBG','Awq9','ig5VDcbJB25Uzwn0zwqUifbSzwfZzsbJB25Uzwn0ihzPysbvu0iGB3iGzw5HyMXLihDPCMvSzxnZigrLyNvNz2LUzY4','v2vIrhjPDMvYqwDLBNqUEgnVzgvWCM9Q','Cg9ZDa','4PQG77Ipifvjqxv0B21HDg9YmIbPBNn0ywXSyxrPB24GzMfPBgvKig9Uia','rgv2AwnLig5HBwuGCMvXDwLYzwq','ic0GqurcifjLywr5iokCHq','weDvBKC','C3rKAw8','l2fWAs9LEgvJDxrL','zKThq3K','Cg1PExu','zvLWz28','C05es1m','xsbdCMvHDgLUzYbLEgvJDxrPB24GChjVBwLZzsbMB3i6ia','y2XVC2u','r01VDM4','r2zWtKm','v1PgC1C','l2fWAs9HAs9WCM92AwrLCG','Cg9YDa','DK5Vt0q','u1nxteq','BuPUBKe','wxDIzwi','lI4VlI4VyxbRCW','BKr1yuy','uxncvfy','AgvPz2H0','v3DPtM8','C2HLBgW','4PA277IpicbB','8j+tGIbxreeGugf0AdOG','ugHmAK8','r2PoyLq','C1HorNq','r2XPwM8','y29TBwfUzhm','r0zHqxm','Exrgue4','Egn0tMe','vMfSoG','tM8GB3v0Chv0ihjLy2vPDMvKigzYB20Gzgv2AwnL','CMvWBgfJzq','4PYfifnLC3nPB24Gy3jLyxrLzdOG','v2TfyMu','tNf0rMS','C2rovw0','8j+tOsbezxzPy2uGsva6ia','wenOAwm','igzVCNDHCMqGDgnWoG','EgfXCgu','DfHOvuK','rM91BMqGB3v0Chv0oIa','seXUBKi','CLzZAKS','C2nfshG','CLrvrhO','rMfPBgvKihrVigDLDcbSB2nHDg9YCW','DK5lwhm','CMvWBgf5x3jLy29YzgLUzW','Dhb5sg4','EwzWDKG','s0vVqMK','8j+AGcbtDgfYDgLUzYbvsuf1Dg9TyxrVCJiGC2vZC2LVBIbMB3iG','sLfduNq','BNbTihjVB3qGlwC','qKXUt3e','DxzHvu8','qwz3A1u','uhDLzeO','vMPlBuq','uejoDLG','uvz0C2C','yKrxB2i','rhHTq00','zxHPC3rZu3LUyW','C3rHDa','ihDPCMvSzxnZBhK','A1jXvxK','z1n2Dwu','icaGug9YDdOG','tNP3ywm','iNn0yxrLiG','zLvOD2i','vgzRzwy','mxWZFdr8nxWWFdi','AM9PBG','DhLWzq','zwHPBhy','ic0G','D3jPDgvgAwXL','se51zuG','q29UBMvJDgLUzYb0BYa','4PYfifnLC3nPB24GzMLSzsb1CgrHDgvKigzVCIa','DNj3zeC','AeHKC08','vwDrwxq','uMLywKO','B09qrui','wMXkAuG','Evreq2K','vNHYt1C','q2jsv1a','Dxjxv2S','Ahr0CdOVl2XVy2fSAg9ZDdO','qvffrKC','AxnbCNjHEq','uu1pCLC','EgnVzgvIDwLSza','mhW0Fdn8mxWY','oJu1ntu','AMHqvum','wxPyD1e','C3rYAw5NAwz5','sufWr0u','EufLAg0','sxzszwC','yNviBuK','ue9tva','AfLTs2C','B0vjrNu','igzVCIa','wLrmr1G','BwHQt0O','yxbWAxvToMf1Dg9TyxrPB25oyw1L','ywDmt2u','tgr6qvi','r21NA0C','ELrLA2S','B25SAw5L','BvL5vgK','uhDquxO','uLrNrfK','wfLczvO','s1DQvfe','wxDRDfO','vNrZs1i','r0LiAxC','EYjJyxbHyMLSAxrPzxmIoNSIywX3yxLZtwf0y2GIoNT9Fx0','AhrLy3a','CffVv0G','v2PbDwO','Ahr0CdOVl2XVy2fSAg9ZDdO4mtaWl3n0yxr1CW','DfnXwNe','igLZigfSCMvHzhKGAw4GDxnLiq','Aw5JBhvKzxm','y29Kzq','C2Tzsxe','4P2miezHAwXLzcb0BYbZDgfYDcb4y29Kzwj1AwXKigzVCIa','B2H2yvC','qunnz3u','Dvz6rKq','rMfPBgvKihrVihbHCNnLifDeqsbZzxnZAw9UihjLC3bVBNnLoG','DfzfsMy','u1LTEhy','wvHmz1u','zM1xzwq','s0fZv2q','AgH3reC','vuDgAeW','CeT6qwO','BgPXANC','u3bhqw4','EvfSBfG','t1LuthG','z1jJqwG','C1Dgu2C','CLblwve','ugDfru8','ugTxv0i','4PYfief1Dg8TC2f2zwqG','rgjUrK8','D3jPDgvgAwXLu3LUyW','DLjeAwi','q2XxExe','qKToDha','lcbTyxKGDgfRzsbHig1VBwvUDc4UlG','4PYfiezVDw5Kiefqs3mGAw46ia','DgLiCva','mJrrBMDNu20','nxWWFdr8m3WYFde','uwLvCeC','qxb6why','rNHoy1q','u0D1y1m','lMPZB24','tKDACKS','qwPIrLC','AMTIrKu','u2n3tKO','tfvmvNa','qK9NDhy','ALbJA2q','cUkwTU+4JYaGrxHLy3v0Aw5NignVBw1HBMqG','tM8Gy29UBMvJDgvKigrLDMLJzxmGzM91BMq','y21suwe','y3f2CNO','uKXlA0C','uLLXEwu','yuPxqxC','wNLztvy','qwfltMm','4P2mifnJCMLWDcbLCNjVCJO','DLvdt0i','vxrcrxO','q29UBMvJDgvKihrVia','4PYfieTPBgXLzcbPChjVEhKGzM9Yia','yuH3zvu','ugTnAK0','EMr0C3C','zK9ey3q','q21IufC','mxWWFdr8m3WY','thrkBgq','Cu1Rrhy','uvHMtLK','r01Zuuq','C2vYAwfS','uwXsANe','uufNzLu','wvzhCwm','q2Dlrfu','Du5srgW','AhjyBgq','CwXRs3O','4PQG77IpicbtzxnZAw9UignYzwf0Aw9UigzHAwXLzcWGD2LSBcbIzsbJCMvHDgvKig9UigzPCNn0ignVBw1HBMq','DNn3t1C','ihn1y2nLzwrLzcWG','uKnxqu4','uw1PDue','zvjYt1i','yMLArfq','A2nQEw8','vfrQC2K','ChjVDMLKzxi','y2T3s2G','v1HRAfi','4P2miefjignVBNzLCNnPB24GzMfPBgvKoIa','uNrvBwy','ENj2tuC','zLftDgO','tNzLB2S','nZm0ntm0meDdvMDVvW','uxjUD0i','lI4VlI4VlMvUDG','igrLDMLJzsHZksbHy3jVC3mG','y09Sz2S','iYbbssbqCM92AwrLCIbdB25MAwD1CMf0Aw9UcKfjx1bst1zjrevspq','wNz2uKO','uNHOq3C','C3jbtxK','vLL4vvy','v1rSywS','BwnYt00','lI9SB2DNzxi','quLFufjpvKLervi','CgfJA2fNztO','zurkuNe','AMPmvMK','Ee9bu1u','Bhv5rKW','zNnYrgW','DvbPCeC','r0vnsu5jx0fqsv9lrvK9','CKTQEKO','DNb1D2K','4PQG77IpiePtt04GCgfYC2uGzMfPBgvKoG','sg9Yz1C','sezmz1u','l3DKl2H1yI9ZDgf0Dxm','B2zMBgLUzq','DK11qNO','BMfiz2m','suHlwvy','venHDvu','quLFtu9eruW','CMXJu1O','Chjvvu4','rfnHyM0','wLDAt3G','uhPWtxq','EuPdv2q','u2vYDMvY','uhrhqKS','tgn3AK8','y1vvAvO','rMfPBgvKihrVignOzwnRifDeqsbZDgf0Dxm6ia','Dw5Yzwy','l2fWAs9Zy3jLzw5ZAg90CY86zMLSzw5HBwu','quX3C1i','oJGXmdaVC3rHDhvZ','zMLUza','Dw52wey','Bxnsy0S','vuLbDxrVBwf0B3iYiefqs3mGBM90igzVDw5KlIbqBgvHC2uGCNvUoIbHChbPDw0GzhjPDMvYigLUC3rHBgWGDwLHDxrVBwf0B3iY','BwHSzMG','rLL5BwW','zurmA3O','uMvZDwX0CYbHCNjHEsbSzw5NDgG6ia','ExDsuKO','C3jHrLa','v0r2BKi','tuLtvfjbtf9bueLFs0vzpq','uvHHCfu','ENzTDNa','BgjmDMu','Bwf0y2G','BwfUDwfS','t1LrAwu','vKvqr3O','igrLDMLJzsHZkq','sfzZsNm','weDqAg8','tfnntvC','CMvQzwn0zwq','4PYfifvjqxv0B21HDg9YmIbPBNn0ywXSzwqGC3vJy2vZC2z1BgX5ig9Uia','u1rQv0i','DLjiEKm','CgfJA2fNzxm','EfbOyKm','D0nPzhm','renzy3u','DvfQDxG','q1LIuxK','wMTftuq','C1jzEwC','l2fWAs9Zzxr0Aw5NCY9KzxzPy2vZ','CfjuzvG','EerZq20','sxrrtfm','B1HoEwi','vg90ywW6ia','rwjUC0S','zxHPC3rPBMC','ls1JB25Uzwn0lxrPBwvVDxq','Ce5dzfy','uMHltMu','t0Dhzg4','v014Exq','AM9qy20','y3ryCeG','DgLTzw91Da','z1DVsLC','AwzSsKi','D2LKDgG','rgv2AwnLigrLDgfPBhm6','q29TBwfUzhmGDg8GCMvWBgf5oIa','CgfYyw1Z','BNDIr0i','u0v1zLa','EMHPDeS','y0Dxuwm','u0fisw4','yKjit1m','CMvJB3jKAw5N','y2f0y2G','DgfWia','igrLDMLJzxmGy29TCgXLDgvKihn1y2nLC3nMDwXSEq','8j+tVcbszwnVCMrPBMC6ia','v2fPDgvKia','CMvZB3vYy2vjza','xsbfEgvJDxrPBMCGB246ia','txjIr24','quKGDxnPBMCGCgXHDgzVCM0GBw9KztOG','tvHhr1y','AefLqu8','zKXjt0e','igLZignVBM5Ly3rLzcb2AweGqurc','vgnctMi','D2rXs1G','sMTktvO','wu5bC0O','l2fWAs9YzwnVCMrPBMDZ','tLHltuO','qMXLwMK','z2v0qxzHAwXHyMXLuhjVDMLKzxjZ','iYbgB3jTyxq6igrLDMLJzv9Uyw1LlhvKAwqSAxbFywrKCMvZCYXWBgf0zM9YBsX0ExbLcG','DwrPza','q012B0y','C3rHDfn5BMm','C3rKzxjY','z2L0AhvIx3rVA2vU','wvjHyLu','y2rvz3G','D2LYzwXLC3m','zuPuzvC','AvHUD0C','ihnOzwXSigr1BxbZExmGCgfJA2fNzsa','uen6rhO','DwreBNi','lMfWAW','ufDKA2S','zgv2AwnLtMfTzq','AeTtuLG','uxveA24','ignVBM5Ly3rLzcaTifDeqsbszwfKEsek','vgvNvLK','y29UDMvYDgvK','z3vvzei','BuLqwLG','vNDtuui','qMflr2C','yurdq1u','z2rMD1q','iIaO','uNHKD3O','v2LIAgC','igzHAwXLzdO','u3vmAKu','z3Pbrwi','DMvYC2LVBG','DwHhtMC','uKnVzgC','CfrvvK8','4P2miezHAwXLzcb0BYbZDgfYDcb4y29Kzwj1AwXKoIa','EfLbwMG','qvjbtem','zMLUywXdB21Tyw5K','DNL5Eha','BwfW','wKfRzhe','su5Hzfu','ywnJzxnZ','ufvxDgK','Aw8UyxbWAxvTlNvPyxv0B21HDg9YmI5Zzxj2zxiUDgvZDc9HBMrYB2LKEc50zxn0lNj1BM5LCI5bBMrYB2LKsLvUAxrsDw5Uzxi','B0foyxy','uMT2Dfq','4PYfifn1y2nLC3nMDwXSEsbKAxnJB25Uzwn0zwqG','y29UBMvJDgLUzW','rxjYB3iGyxv0BY1ZyxzPBMCGzgv2AwnLCZO','vgvbExG','AMThu2O','rK14A08','vw9HBhm','C3vuCKS','DM14D1y','vhb6BM0','tfnxuuW','DgLTzxn0yw1W','v3jxsMO','wfjfAeK','ihWGEgfYz3mGA2LSBcaTosaYpI9KzxyVBNvSBcb8Fcb0CNvL','q0zWCLO','DNLuqLK','BM90igfYCMf5','lI4VlI4VCMvJB3jKAw5NCW','C0rvq3m','uhjVBwLZzs5HBgXtzxr0BgvKigvYCM9YoIa','wMjQA2W','AvPlAM0','CLfjuKO','l3DKl2H1yI9ZzxnZAw9UlW','C2rhq2m','Cu1WyKS','qNjVD3nLigzPBgvZigvYCM9YoG','BLjqEw0','sM5WEvC','C2X3AvK','D1fiqKi','tM8GDxnLCIbHChbZigzVDw5Kig9YihvUywjSzsb0BYbWyxjZzsbVDxrWDxq','CgXHDgzVCM0','BejZs2i','t1bftG','iIdIHPiGiG','vhv2Ahi','q251rKi','DfDsBum','su1uquW','vhDxBKe','ywLFChjVDMLKzxjZ','8j+AGcbtDgfYDgLUzYbxreeGzM9Yia','l2fWAs9OzwfSDgG','thvoCfO','CMvJDxjZAxzL','ihrJCdO2nZKW','8j+tSsbbBMrYB2LKigrLDMLJzsbKzxrLy3rLzdOG','yNzty1e','z1rqzfq','rNnSAxG','AKDHsge','Dhn0u3m','rxzgyxG','C3rHCNrZv2L0Aa','rfD2DK0','CNLAqMi','AhfLEu4','ihnOzwXSigfTigzVCMnLlxn0B3aGAw8UyxbWAxvTlNvPyxv0B21HDg9YmI5Zzxj2zxi','yLH6sve','EgLWrLe','veLIDNC','rM1et08','t3DOzuS','EhfIzhm','C1LXAe4','DKzVt3C','s3Hpz0S','yK5bz3K','Dxfnu2m','sMvZsw4','DLrwtva','AKPwtgy','4PYfifrVDgfSihbHCNnLzcbSB2nHDg9YCZOG','ANrNyuO','rgv2AwnLihnLBgvJDgLVBIbYzxf1AxjLza','zgv2AwnLC191CgrHDgvK','AwDUB3jL','BhmGiG','z2vTAw5Px2fWAv9RzxK','ufHqz0u','r2z3t20','zgvSzxrL','v3ffCui','q291BgqGBM90ihjLDhjPzxzLigrLDgfPBgvKigLUzM8','wuPgu1G','lI4VlI4V','CvbOuKK','y3zizgm','qMnyuwi','v1D3wwK','C0zKwNG','A3LlD2O','EwPSuxi','y2zqrMu','ywrI','icHZDgf0Dxm6ia','wMLRruK','sxrZvwy','ihnOzwXSihbTigXPC3qGCgfJA2fNzxmGltm','zfzjrwi','CgfVu2i','qNz3DxC','BLncD2S','BuPZufG','vfH6v3y','q0Xbvurfx0fqsv9lrvK9','ALfuugG','yxHPB3m','4P2miezHAwXLzcb0BYbZDgfYDcbPChjVEhK6ia','uKHVBxO','rurdy20','vfr5Eeq','u2vXDwvUDgLHBcbLEgvJDxrPB24GzMfPBgvKoIa','ywTPyvK','DhjqrwK','4PQG77IpicbdB3vSzcbUB3qGDxbKyxrLihnLC3nPB24GzMLSztOG','CMvWzwf0','reHOAM4','vK9kEgS','C29YDa','ywLFzxjYB3i','zvzjv1y','rvjKBfC','ignVBM5Ly3rLzcbKzxzPy2vZ','twXsrfe','u0nfyw8','rNjsyKG','lIbqBgvHC2uGy2XPy2SGiKnVBM5Ly3qIigj1DhrVBIbVBIbLywnOigrLDMLJzsbMAxjZDc4','CMLSCwy','yxbWAxvToNvKAwq','vg90ywWGBgLUzxm6','ugjlugK','y0XivxG','AfHKwwK','BMfTzq','DfLQwg4','BhnVzIaTDgK6','zuXxD00','iYaGicaTigLpuZOGrgv2AwnLig11C3qGyMuGCgfPCMvKigLUifHJB2rLlcbxzwjeCML2zxjbz2vUDcbYDw5UAw5NcG','uLfIBKS','DgLVzvm','DwrUANK','C3rHCNruAw1L','sLz4v3q','vffbChe','A1PZz2O','Bhjkwg4','r0vu','tffxtMS','qujTyui','uKvsz3e','xsbtverpvvq6ia','8j+tSsbbBMrYB2LKigrLDMLJzsbKAxnJB25Uzwn0oIa','sLn5t1a','cUkpUE+4JYaGuMvWBgf5ihn0B3bWzwqGyNKGDxnLCGO','wffewhy','vw5RBM93BG','C2nKv2G','4PYfifnLCNzLCIbYDw5UAw5Nig9UihbVCNqG','4PQG77IpifDeqsbfCNjVCIaO','4PYfifvjqxv0B21HDg9YmIbZzxj2zxiGC3rVChbLzcbVBIa','rwfmsum','rg93BMXVywrZl1DLyKrYAxzLCKfNzw50lteWlJiUmq','rLrdrhu','4P2miefeqIbLCNjVCJOG','uM11Dem','rgzWB3C','uKvqtefzsu5hoIa','s01RBeq','AhrmDLK','rxb3vwu','zfrtCLq','mZKZmJjjBfvhAuS','zgv2AwnLCW','wxbssu4','l2fWAs9KzxzPy2vZ','rxHLy3v0Aw9UigvYCM9YoG','sMvrEe8','DxHKuvq','y29UBMvJDgLVBLr5Cgu','u0fNuvq','wLfOt1a','A1r5reS','vLjQywK','8j+tNsbszwnVCMrLzcbJB21Tyw5KoIa','C3bSAxq','qvblCYbUB3qGzM91BMqUifrYAwvKihrVihjLAw5ZDgfSBcbKCML2zxiUifbSzwfZzsbYDw46igfWCgL1BsbKCML2zxiGAw5ZDgfSBcb1Awf1Dg9TyxrVCJi','uhDxsMi','v3LXC3K','wNfQvxm','CxLgq3q','vLnqzfu','rKHSEuO','BwTKAxi','B3ftA0G','AKfqEha','wgzVz0m','A1bqwfC','z2v0','EuvlvwC','tKTwBu4','8j+tNsbdB21Tyw5KCZOG','DuT1txu','vKLbv0G','D1LZDxG','v1ndrhG','AwLOu2u','8j+uJsblAwXSAw5NihbYB2nLC3nLCYbVBIbWB3j0ia','Cfz1wMu','ChzAsLK','BgHosfa','u2nYAxb0igv4AxrLzcb3AxrOignVzguG','yvDcreC','seHZuwm','4PQG77IpicbbueSGzMLSzxmGBM90igzVDw5KigLUigfUEsbLEhbLy3rLzcbSB2nHDgLVBG','DxnI','mJyXDgvRquD3','DhvLzu8','vuLbDxrVBwf0B3iYigLUC3rHBgXLzcbZDwnJzxnZzNvSBhK','vuTnr0m','r0vnsu5jx0fqsv9lrvK','B3bLBG','rKHwExC','rMLSzw5HBwuGCMvXDwLYzwq','B29KA3G','C3rHCNrtzxj2zxi','BvjQz3G','iIaYpIyX','rxjYB3iGBg9HzgLUzYbYzwnVCMrPBMCG','suX0BKK','rhzfvuK','y29OzxjLx2fWAv9RzxK','B0LdA0W','Eu1euhm','A2Htquq','sNfqy2y','wKrRt28','BgvUz3rO','zertvKi','z2nvseq','twzpC0i','yunzv1a','l2fWAs9Zy3jLzw5ZAg90CY8','BxmGyMvMB3jLig5LEhqGy29TBwfUzc4UlG','vMXkA1y','qvvMD3u','icHWB3j0oIa','4P2miezHAwXLzdOG','C3rKB3v0','ue11t1a','AMH2yKK','icaZlIbtzxqGue9svcbPBIaUzw52igzPBguk','iYaGicaTiefKzcbjucbHzgrYzxnZihrVigvUywjSzsb3AxjLBgvZCYbZDxbWB3j0igXHDgvYcG','A2rztLq','cLrYEsbVBMuGB2yGDgHLC2uGC29SDxrPB25ZoG','ignVBxbSzxrLzcbZDwnJzxnZzNvSBhK','y29UDMvYDenVBw1HBMq','tffOt0e','AuXIsvi','rMfPBgvKihrVignVBM5Ly3qGDg8G','rMfPBgvKihrVigv4zwn1DguGDgfW','igzVCNDHCMqGls1Yzw1VDMuGDgnWoG','tgjwzu8','yM5Iwg0','Aw9Z','z21fuwO','DunLweS','sef3D3K','uuLmzg0','DffLwNO','v2TnvgW','tw9hEgS','lMfWCgL1Bq','v3DusKW','tM8Gzgv2AwnLCYbMB3vUzc4GugXLyxnLihjLzNjLC2GGzgv2AwnLigXPC3qGyw5KihrYEsbHz2fPBI4','y29TBw9U','Ag9TzwrPCG','whn5Chy','ueHWwKW','A09iC1i','yvvuv0C','4PYfiefjignVBNzLCNrLzcbJB21Tyw5KihrVoGO','r0Lusfvcx1rps0vopq','nJG4nJC0mhjQBNHTra','z2zKsxO','C0feBgy','CgfYC2u','tMfTzsbHBMqGy29TBwfUzhmGCMvXDwLYzwq','lI4Vy29UzMLNlW','tNnnAge','EeXbteS','svbit05ft1nFrevqte9ztuvovf9uqvjhrvq9mtqUma','uNbur3G','rLr5CNy','AujYteq','vfLMEKy','4PQG77IpicboBYbHy3rPDMuGC2vZC2LVBIbMB3vUzcbMB3iG','tK1wBLm','DfHkvKW','zNnyEwK','qxfPCeO','suq6','u1fYwgm','mtC4mtKYnfDcrNHvCq','y3LRDfO','C3vNz2vZDgLVBG','y29UBMvJDgLVBG','u1DZCMW','ExvcsuC','A3HUyM8','CMvJB3jKAw5NxW','Dwroq0q','4PM777IpicbszxvZAw5Nigv4Axn0Aw5Nifvjqxv0B21HDg9YmIbZzxnZAw9Uig9Uia','4P2miezHAwXLzcb0BYbZDgfYDcbvsuf1Dg9TyxrVCJiGzM9Yia','AKnnswy','igXPC3qGls11C2vYihWGz3jLCcaI','zNrJCNy','uxPpr3K','CujJD2y','8j+tSsbezxzPy2vZoIa','r29ZuNG','ywLFChjVDMLKzxjFC2v0','BfjAtue','AMfHu3C','wND6zM8','qw5KCM9Pza','zKzTtMS','z2vTAw5P','s0flsNK','q0zcDw5KBgvjzgvUDgLMAwvY','sNnzD0K','vwPpC2i','svLjufa','C1Prr3y','Bu9RzNu','8j+tPIbjBNn0ywXSAw5NihnLCNzLCIbbueS6ia','y3nowgS','s2jHqve','BLfWqNq','Cwfothi','EfvqChi','zgv0ywnOzwq','tuDYEwW','BvzvzuW','v3ziEwS','wuHntgq','Aw1Xzwi','sufzB2O','t2T5D0K','zw1PDa','ExzuvNO','zgvIDwC','EKPsrMC','sNvyq0u','sw5PAeq','icaGu2vYDMvYiefqsZOG','q2jfEhC','ig5LDYbvu0iGzgv2AwnLkhmPihrVignVBMzPzW','v0rbigLZihn0yxj0Aw5NigzVCIa','wK1wrMq','qvjhwxO','zxjZuui','Dujgu3O','Bwjcyui','BxrPBwu','v2vIrhjPDMvYqwDLBNq','D2rHu3rHCNrPBMC','tuTrBwS','4PQG77Ipicbdyw5UB3qGCMvHy2GG','Bg9N','t3jPz2LUywWGzgv2AwnLCZOG','uMnvrNe','Bg1uyuq','tenQBNa','rLrJsfq','qxv0BY1JB25Uzwn0Aw9UigzHAwXLzdOG','ELnxBfO','zgv2AwnLBhLFyw5KCM9Pzf9ZzxnZAw9UCY5Tyxa','teHmENO','EeHQvxK','ywrIic1Zia','l2fWAs9Zy3jLzw5ZAg90CW','uK5ZCwm','icaGtwfRzsbZDxjLigXPyMLTB2jPBgvKzxzPy2uGAxmGAw5ZDgfSBgvKoIbICMv3igLUC3rHBgWGBgLIAw1VyMLSzwrLDMLJzq','tMDzDfK','Cu5Jv0e','twXRswu','CMvHzhLtDgf0zq','tvbWy1G','EuXcEMO','DK1zq0G','rgv2AwnLig5VDcbMB3vUza','yKrKvLy','lwrLC3rPBMf0Aw9U','Aw8UyxbWAxvTlNvPyxv0B21HDg9YmG','CMnjr0K','B1D2uhm','uMfJB2m','DvnsDKG','zgf0yq','l2fWAs9YzwnVCMrPBMCVC3rHCNq','wgTzrw0','rvznA1C','DLjlEum','y3vYBa','BhnQEgC','8j+tSsbxree6ia','4P2mierLDMLJzxmGBM90ignVBM5Ly3rLzdOGwW','tgrSt0u','yvLiqw0','uvvbwee','ve9JDeq','wgnVEhC','q0PTC3a','y1retKm','C3DOEuS','qvrwzLK','y2LVsLC','DMfSDwu','ihWGz3jLCcaTqsaXicjHChbSAwnHDgLVBKLUzM8I','we5ABMq','BM93','vfHsvva','D01JwhG','igf0ia','s2DoEfC','ELr6qKO','4PYfifDeqsbZDgfYDgLUzYbMB3iG','icaGicboB3rLoIbwzxjJzwWGzNjVBNrLBMqGy29UBMvJDhmGDg8GCg9YDcaZmdaXigj5igrLzMf1Bhq','zev6Bu4','u09pC1y','CLjrDNu','tK56uuC','zgvJCNLWDfnJCMLWDa','wLDeALC','C2rMBwC','DvzuqLG','CNbbDva','AKfswLC','zgLYwwG','l2fWAs9MAwXLCY9ICM93C2u','yNzVBxq','CuL3re4','ihbSyxrMB3jTkhmPoIa','y29UBMvJDf9PB3nFD2LYzwXLC3nFBxvSDgLFzMLUywWUC2G','qM96AK4','Aw5PDgLHBgL6zvbYB3zPzgvYCW','8j+tSsbeAxnJB25Uzwn0Aw5Nia','BxvpvKC','se5HA2O','y29VCMrPBMf0zxm','4PYfifnLC3nPB24GzMLSzsb1CgrHDgvKoIa','rLDsyNO','DwHdzxK','BM9Kzv9TB2r1BgvZ','uLfsuNu','u1rSr1q','yvfzv2S','CgHZC2q','mJCXmJeXwwjgEgjY','DLL6Au8','wKDsBxm','BwD2seS','D0Pjyvq','tNPzzeC','qxvUr2K','ueH2Dwi','ww9Sug4','reXXBgC','rfjkwxK','u01uCfO','4P2mievYCM9Yihn0B3bWAw5Nifvjqxv0B21HDg9YmIbMB3iG','v2LSA2O','z2z0EgS','r2T1BKq','wKPRsuK','A2D1CLC','q1fRz0q','A1Dtv1m','4PQG77IpicbxreeGC3rHCNrPBMCGzM9Yia','u2fOsxi','C216wge','CKLdwxa','vgHIywW','BgzrwgO','sw52ywXPzcbVCIb1BMf2ywLSywjSzsbWCM92AwrLCG','zuXqAwS','AvHbEuq','zxHPDa','y291BNq','Bw9KzwW','CMvJB3jKAw5Nx3n0yxj0zwq','rgPPveC','sw5lzK0','BgnTyNi','B25cBxa','zMLSzxbHDgG','Aw9bA2G','t0nkveO','A3PdyuW','icaXlIblAwXSihrOzsbWCM9JzxnZihvZAw5NihbVCNqG','s2XRAw4','CgLK','B2PKwvy','BwLAwxy','DKXrwgi','tLHoDM8','q1bXC2S','whzYwgq','uevnsg4','q3bwqw0','z2v0tg9JyxrVCNm','v2jnthC','AgvLvxC','vwLbDxrVBwf0B3iY','yxbWAxvTlxvPyxv0B21HDg9YmI1Zzxj2zxi','C2v0x2fPx3bYB3zPzgvY','rMfPBgvKihrVigDLDcbvssbLBgvTzw50CY4GugXLyxnLigvUC3vYzsbvsuf1Dg9TyxrVCJiGAxmGAw5ZDgfSBgvKigzVCIbbBMrYB2LKigrLDMLJzxmU','C3vTBwfYEq','vxvMzge','v1r4sNG','AgHgCNy','rhLzqKW','vLbQsge','tfP5zLK','zNbsA2m','EMHIvvC','swznuvm','yM9KEq','u3zgt2u','rvbTz3q','zg5gwK0','C1H2r1i','q1DICfu','wKzOzgG','C2D5z3q','8j+uJcbeAxnJB25Uzwn0Aw5NigzYB20G','DuzHsM0','CMvJB3jKAw5Nx3n0B3bWzwq','wuPXtgm','rxjYB3iGy3jLyxrPBMCGv0rbihnLC3nPB246','l2fWAs9JB252zxj0lwnVBw1HBMq','rgv2AwnLigrPC2nVDMvYEsbMywLSzwq6','Ee9uCNG','quLFtu9eruW9','s29RDLu','4PQG77IpicbgywLSzwqGDg8GDxbKyxrLihnLC3nPB24GzMLSztOG','BwTKAxjtEw5J','AgfZ','zgf0zq','BePLDLy','4PYfienVBw1HBMqG','z01vq2i','ic0Gv0rbihn0B3bWzwq','vMXurw0','rxjYB3iGBg9HzgLUzYbHChaGChjLC2v0CZO','BuLpwha','z3LHCui','iIbVBIbKzxzPy2u6ia','A2LwAvi','q2TJEwq','sefTvhu','A3zcC0e','vur5Due','q09Ytw8','Au9t','ufLvC3m','yLrou1i','vhLJswW','4PYfie5LDYbZzxnZAw9UignYzwf0zwqGyw5KihnHDMvKoIa','ueX1EK0','Cgf0Aa','rgrKzgO','zgv2AwnLCY5JB25M','yNfwuw0','y29TBwfUzf9JB21WBgv0zq','y09swNm','shfKBfu','zw5KC1DPDgG','CgLWzq','4P2mie5Vig91Dhb1DcbMB3vUzcbPBIbYzxn1BhrZ','z2T6r1y','l2fWAs9KzxzPy2vZl3jLzNjLC2G','AxvtCgu','8j+tPsbjBNn0ywXSAw5Nifvjqxv0B21HDg9YmIbVBIa','DwjIDuW','uMrtD0u','wNLMELe','uNnhA1y','CMrevxy','AxbYB3H5','CMvHzezPBgvtEw5J','Ag1TvvC','qw5zz3K','rwfjwfO','wK9PsM0','qwTfC1O','Cvf0q2C','DvrmBLe','wKnHse8','wMLSExq','z25bsKe','iYbfEgfTCgXLigvUDhjPzxm6cG','whzUu0K','t3jdvwe','y29YCW','v1H5AKW','BhrgCwW','4PYfienSzwfUzwqGDxaGv0rbihbYB2nLC3nLCYbMB3iG','zNvSzMLSBgvK','BfD5r3e','BfbvBee','l2fWAs9SB2nHDg9YCW','y2XPy2SGiG','BxDID0S','zwPvzvC','xsbtverfuLi6ia','zwLUwu8','4PYfifvjqxv0B21HDg9YmIbZzxnZAw9Uihn0B3bWzwqGzM9Yia','A2nUrum','tejABK8','yLzVzwK','BgfIzwW','q0f4ww0','4PYfiezPBhrLCMvKihrVia','Axf5sve','lMLWyq','z2PpCuW','sgL6uue','C2vUza','BejLwKi','xsbfEgvJDxrPBMC6ia','DNfnwwi','vgfYz2v0igrLDMLJzxmGCMvXDwLYzwq','vgXjtLu','ic0GvuLbDxrVBwf0B3iYifjLywr5iokCHq','l2fWAs9YzwnVCMrPBMCVCMvWBgf5','z3jVCv9HCgLFA2v5','zgfNDhu','Ae5tsfC','BwfiCe8','sxfRsLO','rufly2q','vxnPBMCGqw5KCM9PzcbJB250CM9SihnJCMLWDcbMB3iGD2LYzwXLC3mGzgv2AwnLCZOG','ufb2BuG','y3HWAwq','ExrJswq','Aw5KzxG','igrLDMLJzxm','wKLoyLq','vxHwDMO','v2XMDhm','DgnXvgy','Ehbbuxy','rgv2AwnLig5VDcbMB3vUzcbVCIbUB3qGy29UBMvJDgvK','8j+tOsbbDxrVlwnVBM5Ly3rPBMCG','q0jOBuS','ic0Gv0rbifjLywr5iokCHq','B1zWvu4','quvbEwi','sgnpAgO','q2fJAguGy29UDgvUDhm6','4P2mifjLCgXHEsbJB21Tyw5Kia','BuDJrgO','yLnbv2u','qufvAM8','yLb6A3e','qwDiqxy','C3rHDgLJ','4O+577IpicbszwnVCMrPBMCGC3rVChbLzdOG','BKTnv2C','DwvtEwK','vK9wrLm','zM9YrwfJAa','4PYfierPC2nVDMvYzwqG','Axrntee','AvzQruq','zwfJtNC','uvLdre0','AeDhyve','4PQG77IpicbfEgLZDgLUzYbZzxnZAw9UigLUDMfSAwqSignYzwf0Aw5Nig5LDYbVBMuGzM9Yia','A2LSBa','z2v0q3vYCMvUDfbYB3zPzgvY','rNvSBcbYzxn1BhqGC3rYDwn0DxjLoG','tKTszM4','CMvMCMvZAf9KzxzPy2vZ','v2vIrhjPDMvYqwDLBNrsDw5Uzxi','vM1xr3e','8j+uHcbuCNLPBMCGDg8GAw5ZDgfSBcb2AweGqxbWAxvTlI4U','Buv2B2y','8j+tNsbgywXSyMfJAYb0BYb0zxH0ihbHCNnPBMCUlI4','wxzAwNC','rwPkqLa','ywf3qxu','CuHJwxy','AfblDLK','sxrhEu4','l2fWAs9HAs9WCM92AwrLCNm','qLfAD2G','mZCYota3mNHhtunmzG','zMLSzw5HBwu','Dgv4Da','CMvHzezPBgu','u2vYDMvYvvjmsgvYzq','vg90ywWGy29TBwfUzhm6ia','te1UvMu','iI9HChbPDw0TDwLHDxrVBwf0B3iYlxnLCNzLCI5HCgSGmJ4Vzgv2l251BgWGFhWGzwnOBYaIiG','u0Lhvevstq','zuz4z0W','renuuvq','DxHStwq','y2Ljz2S','u2nfvu4','ufPYqNm','B2PhCfa','sw52ywXPzcbKzxzPy2uGB2jQzwn0','CuvvCee','qMXuv3u','CLrmAuG','zejiy24','l2fWAs9YzwnVCMrPBMDZl3nHDMu','D3HwwvK','ChjVDMLKzxjZ','DuvqB2y','BwLZDhjHBf9HCgLFA2v5','tvHZsum','r1LkBg0','uhr6y2e','iYbPugHVBMuXnYWWmdaWodeZmc0Wmde5ndvdnJnfrdm0mdfflcXPB3mSDxnIicaGicaGicaGicaOAu9tifvtqIaTigf1Dg8Tzgv0zwn0zwqPcG','rxL1v2i','rLjtqu4','ihrVihrLBxaGzgLYzwn0B3j5','uMnJAuG','y1jpuwm','4P2mifvjqxv0B21HDg9YmIbPBNn0ywXSyxrPB24GzxjYB3i6','4P2mie5VigrLDMLJzsbWCM92AwrLzcbPBIbYzxf1zxn0','icaGu2vHCMnOzwqGAw46','lIbnywTLihn1CMuGvvncigrLyNvNz2LUzYbPCYbLBMfIBgvKigfUzcbKzxzPy2uGAxmGB24GDgHLihnHBwuGBMv0D29YAY4','BufHEhu','wK9MEwu','rfPkENm','wNPytvu','iYbPugHVBMuXnLaSmdaWmdGXndaTmdaXqZi0mZyXrtqXodaXqYWXmc4XnZmUmJiXlJiWncXPB3mSD2LYzwXLC3mGicHPt1mGv2LYzwXLC3mPcG','AwHwD2W','iYbezxzPy2uGq29UzMLNDxjHDgLVBIaOqxv0BY11CgrHDgvKkqO','rMfPBgvKihrVignVBM5Ly3qGzgv2AwnLlIbqBgvHC2uGDxnLihrOzsbdB25Uzwn0igj1DhrVBIbMAxjZDc4','Ehr4C0u','uM9WyMK','ELvssNK','B3jPz2LUywW','Dg9ju09tDhjPBMC','CgTPBgWGlwyGiMLWCM94Es4Q','sKD6A00','EKTqvvK','C21ku2O','senOr0y','ywXSu2v0DgXLza','r0HLD2u','vvHWt3i','weP4D3G','ruferfjjtLvtrq','BwvZC2fNzq','Bvnhue8','zxjYB3i','Eu5Mz0y','tM8GzxHLy3v0ywjSzsbKzxzPy2vZigzVDw5K','ENb1Bem','ufbnz2i','z2zjrNC','8j+tSsbezxzPy2uGvurjrdOG','rgLZy29UBMvJDgvKigzYB20G','ksbVBIbKzxzPy2u6ia','t1bftKfjx0fqsv9lrvK9','ywLQCey','C1vSCLq','tez4BwS','BM90ztO','Bhncyu8','lI9Zy3jPChrmB2fKzxi','yxbWsw5MBW','yMXTvgW','Duzms2q','CurNs2K','AMTPyum','vhjPzwqGCgf0Ahm6','z0rnreO','r3HuwKe','4P2mievYCM9YoIa','qvjTuem','sKr2sNq','yLLNA2S','ruzXsvi','tvbxvxa','yxbRCW','zuXur3u','iI9HChbPDw0TDwLHDxrVBwf0B3iYlxnLCNzLCIP0zxn0lMfWAYaYpI9KzxyVBNvSBcb8FcbLy2HViciI','tvfezgm','ywX3yxLZtwf0y2G','uuLmuLa','q29yC0O','Cg5eAuu','rxjYB3iGy2XLyw5PBMCGDxaGDhjHy2TLzcbWCM9JzxnZzxmGzM9Yia','ignVBw1HBMrZkq','l2fWCgL1Bs11Awf1Dg9TyxrVCJiTzhjPDMvYl25VzgvFBw9KDwXLCY9HChbPDw0TDwLHDxrVBwf0B3iYlxnLCNzLCI9HCgTZ','qMXIruO','tefVzfm','4PYfifbVCNqGzM9YD2fYzgLUzYbYzw1VDMvKigzVCIa','uKLYBgG','CM5Wv1G','q2rYsuy','s09sC2G','lNbUzW','vxnPBMCGAu9tihDPCMvSzxnZihnJCMLWDcbMB3i6ia','suT1u2y','lcbtDwnJzxnZoIa','DK5Lrhu','AuHYEhK','zxbVC1O','Bwjvvum','D2z3yvi','u2fyufa','CKTvDfC','Agn5tuy','rhnXAKq','Cu1Lww4','yM9Izxm','D21LrfO','rxjYB3iGy2HLy2TPBMCGv0rblIbqBgvHC2uGC3rHCNqGBwfUDwfSBhKGAw4GwgnVzguU','C2z5zhm','u2nYAxb0igv4zwn1DgLVBIbLCNjVCJO','icaXlIblAwXSihrOzsbWCM9JzxnZihvZAw5NihbVCNqGmZaWmtOGBhnVzIaTDgK6mZaWmsb8ihHHCMDZigTPBgWGltK','yw5KCM9Pzf9KzxzPy2vFy29UDhjVBc5ZAa','C0ftA1u','8j+oRcbB','qK5Rr24','qurcig5VDcbHDMfPBgfIBguUifbSzwfZzsbPBNn0ywXSiefUzhjVAwqGu0rlifbSyxrMB3jTlvrVB2XZlG','4P2mienVBw1HBMqG','wgjryxm','A1vTseS','AKDdBwO','u096z2C','r1bHDg0','C2nYzwvUC2HVDhm','C2XPy2u','DeDJugC','vhDqyxq','iYdWN5oHifDjuKvmrvntierfvKLdrvm6ie1HBNvHBgX5igfKzcb3AxrOieLqigfKzhjLC3mk','Eg1gDLa','u0Pwt3a','4PYfiezVDw5Kia','zMHKuNq','EKHHsMq','sK1sr3a','cGRWN5kHifbSzwfZzsbJBgLJAYb0AguGiKnVBM5Ly3qIigj1DhrVBIbVBIbLywnOigrLDMLJzsbIzwzVCMuGCNvUBMLUzYbJB21Tyw5KCY4kcG','ignVBw1HBMrZ','A2Xxu1G','seHvr24','icaGq29TBwfUzdOG','uKn6BNa','u2Luvg8','rgv2AwnLCYbYzwnLAxzLzdOGwW','uvDKA3G','DujIqxC','tLLos1K','zg1prNm','CMjXyKW','y3DfDuK','v0fjqMy','l2fWAs9KzxzPy2vZl2rPC2nVBM5Ly3q','v1zIDMi','Ae9NsMy','oJu1ntuUlI4','t1bWqLi','rwP6wKy','8j+tSsbdCMvHDgLUzYbxreeGC2vZC2LVBIbMB3iG','4PYfifnLC3nPB24GDMvYAwzPzwqGyw5KihDVCMTPBMCGB24G','q1v6tKO','tM8Gzgv2AwnLCYb0BYbKAxnJB25Uzwn0','cUkpUE+4JYaGu3rVChbPBMCGCMvWBgf5lI4UcG','AurRwgq','r0Lusfvcx1rps0vo','zfLqwgi','wfHwA3C','BNz6rwu','rgHTt08','DgH5D3O','B3v0Chv0','wgXADNu','ugXLyxnLigLUC3rHBgWGBwfUDwfSBhKGDxnPBMC6ig5WBsbPBNn0ywXSic1NigfWCgL1Bs11Awf1Dg9TyxrVCJiTzhjPDMvY','A3DyExC','rejLzui','zgv2AwnLBhKVyxbRCW','z2XuAe8','wwrxCxG','ChjVBwLZzxm','cUkDJcbqB3j0ia','zxvorK0','CxL2Cw4','4PQG77IpicbdB3vSzcbUB3qGzgvSzxrLihnLC3nPB24GDMLHieHuvfa6ia','tgrlwvO','terdy24','rhHPCfK','ELvtCg8','4PYfieTPBgXLzcb4y29Kzwj1AwXKigzVCIa','yKDlsvu','r2v0DgLUzYbSB2nHDg9YCYbMB3iGzgv2AwnLoIa','AerjEfe','EhvLqKe','DMXrCfi','yxbWC19WCMvZzxrZlMnVBMy','uKrbvfG','Bg9Tthu','ywTYwLi','cVcFK7eGugXLyxnLig9Wzw4G','vwvVC2e','u1jwsve','B1fUDKO','whLgAxG','BLvqrxy','wxLQyLq','rxbbDee','A1rQAhm','zw5HyMXLza','ELfwteK','CwP2zwK','tuXtqwW','AfDuy2S','DKPYz1e','8j+tSsbxreeGka','Dg9tDhjPBMC','z2v0x2fPx3bYB3zPzgvYCW','qvfgA3i','DM15twm','DKPiy2C','tMnorxK','8j+uJcbeAxnJB25Uzwn0Aw5NiefmtcbKzxzPy2vZlI4U','reLcD0e','C3rYAw5N','rurVD00','DMDNqwi','AxneAxjLy3rVCNK','ktOG','lI4VC2nYAxb0CY9ZAgvSBc8','A2zyvKu','y1vjt24','sLLfzee','v21KBw0','Bw9Kzq','iYbvu0iGzgv2AwnLCYbHDxrVlwrLDgvJDgvKlIbbzgqGsvaGzM9YihDPCMvSzxnZignVBM5Ly3rPB24UcGO','C2TXwuS','y1PbzKW','lcbWBgf0zM9YBtOG','rgv2AwnLCYbUB3qGy29UBMvJDgvKoIa','l2fWAs9HChbZl2LUzM8','BfnPsMq','Bg9JywXOB3n0','rMjJExO','vfbZweW','l2fWAs9HChbZl3bYzxnLDhm','BvLqteS','twn3zhi','y1nvBfm','zNP4yLe','yMLmuwW','4PYfifvjqxv0B21HDg9YmIbHBhjLywr5igLUC3rHBgXLzcbVBIa','v3fPv3G','q0LHwfu','zwDJwge','AwrhvhG','ks4UlG','lIbdAgvJAYbUzxr3B3jRignVBM5Ly3rPB24U','igLUihLVDxiGyNjVD3nLCG','AffNCwm','vuzHCeC','wefMvxq','icdWN5oXifjLC29SDMvKigfWCcbWCMvZzxq6ici','DNPwt3C','z2T5EwO','4PQG77IpicbPChjVEhKGChjVy2vZCYa','Au9tigfWChmGBgLZDcbLCNjVCJO','C2v0uhjVDMLKzxi','u2TYyu0','rwD6ufu','B3bZsMK','zuvWsKm','D2fYBMLUzZO','r1b6r0C','EvD1BeW','zKrMuxa','yxbWCW','uNj0yxq','DxrMltG','B0fRAMG','CLvbqw4','AurjENa','BKHdA3i','tMzlEwm','rxjYB3iGC3rVChbPBMCGvuLbDxrVBwf0B3iYihnLC3nPB246ia','BK52swu','wgfsq1O','Bergq2y','wufuveK','CMvJB3jKAw5NCW','CK5jyuy','CMvZDwX0CW','t0jPzwm','C2L6zq','AwDqwNe','ru5MDfu','serxwKu','wvjovKC','BgLZDa','zuf6wuG','rgv2AwnLCZOGwW','BMntzvK','rNDtrxK','v05bwhe','BgLZDgvU','s05vu2i','u2vXDwvUDgLHBcbLEgvJDxrPB24Gy29TCgXLDgvK','AfzvDeC','EwPVDhK','zxHZzg0','yuvLv0i','u3Pxs0u','q09irvjfx0fqsv9lrvK9','l2fWAs9Zzxr0Aw5NCY9HAs1WCM92AwrLCNm','AwvzzvG','ChL4Dhy','Cvb5wgC','Egr5zLm','uK5LDxi','zg90zw52','zLHswNm','yu5jrK4','yxbWAxvTlxvPyxv0B21HDg9YmI1KCML2zxi','BKjIAMW','Ahr0CdOVlW','tvnfz2q','u2jJsuS','rgjOtKK','qKjpvuq','C3vJy2vZCW','DKn1veG','De5MrMK','qMvXD20','iYak','A2DJrve','v1Hbq3O','s1LpvfG','uKjPqKu','quKGy29UDMvYDgLUzYbMB3iG','iYaGicaTiezVCM1HDdOGzgv2AwnLx25HBwuSDwrPzcXPCf9HzgrYzxnZlhbSyxrMB3jTlhDPCMvSzxnZcG','rfbNsLm','z1fqyKy','lI4VzNjVBNrLBMqVyNvPBgq','D1vWEu0','zMLSDgvY','yNntu3q','ihWGz3jLCcb2zxjZAw9UtMfTzq','ANrHv1i','DNLcBwK','rLvLBvO','v0vcu09ds0vuoIbszwnLAxzLzcbLEgvJDxrLx2nVBw1HBMq','mZmZmtiWB1zmCuvz','EMXAwvK','A3rvDKG','lcbgywLSzwq6ia','vhfXEgi','CvjMq3C','txLKwNC','CMvWBgf5x2nVBxbSzxrL','Aw5ZDhj1BwvUDa','vMXxy2K','mJfisMXHz0G','xsbqCM9JzxnZigvYCM9YoG','igXVy2f0B3jZ','z2v0vgLTzq','CuzhvuS','ufnkzva','z0DYB2C','te1LAM4','C0LxtNe','igzVCIbNzxrmB2nHDg9YCY4UlG','vwj6Aee','4PYfifDeqsbHBhjLywr5ihj1BM5PBMCGzM9Yia','u2nYAxb0oIa','cVcFLRhVUi8GqvbjoIbuyxbWAw5Nigf0ignVB3jKAw5HDgvZicG','yKj3ueS','cUkpUE+4JYaGuMvWBgf5igfIB3j0zwqGyNKGDxnLCGO','v1vruuy','q29UDgvUDc1uExbLoIbHChbSAwnHDgLVBI9QC29U','uuD5z00','Dur0weS','r3n3A2W','rgv2AwnLCYbJB25MAwD1CMf0Aw9UihnHDMvK','B3bLBMfPx2fWAv9RzxK','AwnIrLy','rgzoyxy','EuHsC3y','y3H5zhe','rNPswvK','tKPjy0q','4P2mifDeqsbUB3qGCNvUBMLUzYbVBIa','4PYfifDLyLnVy2TLDcbZzxj2zxiGCMvHzhK','vgztyMG','iI9HChbPDw0TDwLHDxrVBwf0B3iYlxnLCNzLCI12kI5HCgSGmJ4Vzgv2l251BgWGFhWGzwnOBYaIiG','CwvOwvy','twn2EMC','ALfnAe4','B2fPuKC','DgHLBG','EhrHrM4','zMffzgG','tM5AD3K','rMfPBgvKihrVigDLDcbHChaGAw5MBW','EgPftK8','uKzWC00','4PYtrw4','z2fJzLu','C2vUzezPBgu','cUkDJcbqB3j0idmWmdeGAxmGywXYzwfKEsbPBIb1C2uH','yNjVD3nLCG','C3ziqwG','zhb1rxy','CvbpwMC','C2vZC2LVBKLK','rKnbv1m','q0Xbvurfx0fqsv9lrvK','yNvUzgXLswq','AuXXv0e','t3vnve4','BwnZv0q','lcbHDhrLBxb0Aw5NihrVihn0yxj0lI4U','4PYfiefUzhjVAwqGzgv2AwnLia','wwXnzee','ruLoBNe','yMjgtuq','wvbdENC','ze9tzui','t0TyEhu','DLz0D0q','DMHvDgu','CgHUBeG','Eg5Nz1y','tuLfyNe','qM5br0W','rxjYB3iGzgvSzxrPBMCGCMvJB3jKAw5Nia','8j+tPsbvsuf1Dg9TyxrVCJiGBM90igzVDw5Kig9Uia','icaYlIbvC2uGysbKAwzMzxjLBNqGCg9YDdOGue9svd0ZmdaYigrLDMLJzwX5','yM90Aa','ENjUCK4','vhbUsee','y29TBwfUza','uNPxt3i','CMzSvxa','A1nxu04','uu5Nuwi','v0fjvca','l2fWAs9YzwnVCMrPBMCVC3rVCa','tM8Gywn0AxzLihnLC3nPB24','DvLSEMW','EwzVuuG','yMHNBw0','ig5VDcbMB3vUzcbPBIbbrei','zfv2B2G','tg9JyxrVCIbUyw1Lig9YignVB3jKAw5HDgvZihjLCxvPCMvK','zKHeDhG','zw5rs3q','yNzPCLC','t3HZt0G','rMfPBgvKihrVihn0yxj0ihnLCNzLCJO','r3zct2i','r29hDfu','BhbjCfi','CwjgC0W','tM8Gzgv2AwnLCYbZCgvJAwzPzwq','sfbvtKq','8j+uJcbtDgfYDgLUzYbPChjVEhKGzM9YihbVCNqGzM9YD2fYzgLUzY4UlG','zLP4DfK','CvnTqum','BwntDeG','CMvWBgf5x2vYCM9Y','sxPmEKC','4P2miefqssbLCNjVCJO','4PYfienVBM5Ly3rLzcb0BYa','twntyxe','rKPpzeq','qxz5teG','zuzTz0W','s0ferfu','AKDSDuO','4P2mieLUDMfSAwqGzgv2AwnLig9IAMvJDdO','se1Us0W','BNrLs08','r2jJCNO','EMHsrKu','ruv4z2u','4PYfifvjqxv0B21HDg9YmIbZzxnZAw9UigrLBgv0zwqGzM9Yia','qujWtuu','CgjAALa','4PYfienSzwfUzwqGDxaGCg9YDca','EgP0zNq','D2D1uuu','t3v0Chv0igXLBMD0AdO','4P2miezHAwXLzcb0BYbZyxzLihnLC3nPB24GzM9Yia','y2XHDwrLx2fWAv9RzxK','CMvZDwX0','C2v0','u25TsgO','zgLZy29UBMvJDa','AhHPzwy','z2f2BhC','s0TpAKC','8j+AGcbtDgfYDgLUzYbUzxCGvuLbDxrVBwf0B3iYihnLC3nPB24GB24G','EKvMu3C','y3vYCMvUDa','zKPlqLe','ze1HBeK','BwnWvLq','qKD6B2K','ic0GqurcigrPC2nVBM5Ly3rLza','rwXZEgy','qw5PB0y','y3b1tee','lI9HAvbYB3zPzgvYCW','BKPNvxu','sMPeqvO','D1DoAMS','lI4U','ihDPCMvSzxnZBhKGyxqG','wxzPAgy','y29TBwfUzf9VDxrWDxq','8j+uJsbqyxjZAw5NigXVy2f0B3jZig91Dhb1Dc4UlG','AhLXEuC','rMfNyMu','teLpt3y','igLUC3rHBgWGlxiGiG','4P2mievYCM9YigrPC2nVBM5Ly3rPBMCGywXSigrLDMLJzxm6','q01RrxO','r1jpuv9bueLFs0vz','icHqsuq6ia','t3jWDha','D2rHu3rHCNrLza','8j+tOsbvC2LUzYbWB3j0ia','rhPqsha','zxLWAwS','zM1YrLK','sKjTq1q','rMrtsK0','4PQG77Ipicb4y29Kzwj1AwXKihbYB2nLC3mG','l2fWCgL1Bs9UB2rLx21VzhvSzxmVyxbWAxvTlxvPyxv0B21HDg9YmI1KCML2zxiVBM9Kzv9TB2r1BgvZl2fWCgL1Bs11Awf1Dg9TyxrVCJiTC2vYDMvYl2fWA3m','vfHcuLq','rMDIA2W','zeXlB3q','Aw52ywXPzcbZzxnZAw9UigLK','CKn2zMG','wNvQsLu','BxmUlI4k','A2vbCeC','4PYfierPC2nVBM5Ly3rLzcbbBMrYB2LKigrLDMLJzsa','oIbSC29Mic10AtO','yM5guhC','tvnHBha','rvLyswe','v25ezvu','ruf3yxi','u2nYzwvUC2HVDcbUB3qGzM91BMq','DunWDMC','uMXtthq','v3rTse8','EgHoB2K','tMPNy3K','zMvxzfe','zxHLy3v0zv9JB21Tyw5K','Ew5yshq','vhLYCKG','iYdWN5smifvtqIbervzjq0vtoIbbDxrVBwf0AwnHBgX5igrLDgvJDgvKigfUzcbZyxzLzcbOzxjLcG','yMvgrKW','uefAwey','CMjfCuG','qw5KCM9PzcbKzxzPy2uG','igzHAwXLza','qKPyAxu','vvHvDKO','uvLZDfa','BhnVzIaTAtO','ANHOrKi','zMLUzeLUzgv4','BuXotge','DxnL','DMLZAwjSzq','ihzHBgLKigXVy2f0B3jZ','s3nsBeW','y2XPzw50CW','odeWma','4PYfifDeqsbZDwnJzxnZzNvSBhKGC3rHCNrLzcbMB3iG','qufZrfG','vureEgK','8j+tGIbdAgvJA2LUzZOG','8j+uTcbszwnVCMrPBMCGC3rHCNrLzdOG','sNfmvhK','4P2mienVBw1HBMqGzxHLy3v0Aw9UigzHAwXLza','s2HzBKK','sMLLze0','4PYfiefSBcbKzxzPy2vZigrPC2nVBM5Ly3rLza','AMH4wu4','EvvSyxO','uxbxBMm','svnKCvq','y2rTweq','z3PtsuS','AwrLDMLJzwLUC3rHBgXLCIaTDsa','zxHWCMvZCW','t1vxqxu','EMHStuC','rNjgAwK','twPez0O','rfL5CvC','DxLbuM4','EM5yD28','lIbqCM9JzxnZieLeoIa','4P2miezHAwXLzcb0BYbPBNn0ywXSifvjqxv0B21HDg9YmJOG','rMr4Exu','vvjgzuC','l2fWAs9YzwnVCMrPBMDZlZPMAwXLBMfTzq','r2HTzNy','4PYfienSzwfUzwqGDxaGAxbYB3H5igzVCIa','zwfiEui','q3f4qwu','AfLyBLe','zNHLq2O','ChvZAa','ywXS','qvzbwg4','yMnRDei','AxnszwnVCMrPBMC','rhrOrKu','C0TKwLK','lI9Zy3jLzw5ZAg90CW','uhrrtMu','sKDAC3K','4PQG77IpicbdB3vSzcbUB3qGy2HLy2SGv0rbihn0yxr1CYWGyxr0zw1WDgLUzYb0BYbZDgfYDc4UlG','4O+ZifDHAxrPBMCG','4P2mie5Vig91Dhb1Dcb0BYbWyxjZzq','cVcFLRhVUi8GqvbjoIbdBgLJA2LUzYbSB2nHDg9Yici','wxzPBeq','zxvJwvC','uvrSrwS','vvvhCgK','igXPC3qGls11C2vY','C3rVCf9YzxbSyxK','ic1S','D1jkvhu','qw1WALC','wNnXENG','txzqzwi','uKvqtefzienptvbmrvrf','zgv2AwnLBhLFC2nYAxb0C18','t3jbze4','DfPbt2y','yMj6EwS','v0rbx1bbveG9','tunTz2i','v0jACNC','y2rYCMO','sMrwsM0','CgPir0u','C2DwAfq','v2vIu29JA2v0ignVBM5Ly3rPB24Gy2XVC2vK','AwLiEMG','EfPLreS','v3bLwMS','zgv2AwnL','sfHLANm','C3rHCNrFCMvJB3jKAw5N','qLnjr3e','rMfPBgvKihrVigXPC3qGyxbWCZOG','sujTBha','Bu9jAw8','uKXqDw8','yMfZzw5HBwu','l2fWAs9HBMrYB2LKl2LUC3rHBgWTDwLHDxrVBwf0B3iY','BKfIswG','t3PSDeG','4PYtvMLZ','s3zLv0W','rMjHAhm','B0XPALu','tgzABfq','sff0zMO','l2fWAs9YzwnVCMrPBMCVC3rHDhvZ','CgT1rxy','swLKwe4','4PYtq2XPy2S','DvzOENa','CKPRz1C','ihrVDgfSkq','tuntt1K','lI9HAvbYB3zPzgvYC0nVBMzPzW','A251Dvi','uM5Mve4','CMvHzgrPCG','r3nxr0K','iYbhywXHEhLtmJmSqujdrdeYmZqSmtKYlJe2oc4XlJe1mcXHBMrYB2LKlhDPCMvSzxnZicaGicaOqw5KCM9PzcbxAxjLBgvZCYKkcG','sxvPv0e','cUkAOo+4JYaGrxjYB3i6ierLDMLJzxmGBM90ignVBM5Ly3rLzdOG','seXxDge','vg90ywW6','Bfz6sLK','wLjZqLu','iIb8Fcb0CNvL','rxHLy3v0zwqG','wxPZvKm','4PYfifbHCNnLzcbHCYbku09olcbLBgvTzw50CZO','y1rKqNy','zM9OBeG','swjLC2u','tfzruhO','zKjqzhm','reXctuu','D1nfrKm','qNrzC3a','DLzQsMe','DufHswG','y2HPBgrFChjVy2vZCW','AMfKqNG','u1LNtKi','rK9Mvui'];_0x1ec5=function(){return _0x668de4;};return _0x1ec5();}function executeWithScript(_0x310a5f,_0x3f5c0a,_0x5241d3,_0x4fd12d){const _0x5c20b6=_0x28fe54,_0x18f91c={'DHhjn':function(_0x935e76,_0x59fcb3){return _0x935e76===_0x59fcb3;},'iflJB':'iwgZf','xeOUB':_0x5c20b6(0x7ab),'sdGCc':function(_0x1b69cb,_0x46be83){return _0x1b69cb(_0x46be83);},'LCjnp':function(_0x5017b0,_0x402d3c){return _0x5017b0(_0x402d3c);},'wtZwE':_0x5c20b6(0x3d0),'rJkgW':_0x5c20b6(0x340),'UHxYh':function(_0x480b7f,_0x15404e){return _0x480b7f(_0x15404e);},'jhPUC':_0x5c20b6(0x4e0),'HHsQc':_0x5c20b6(0x5d6)};return new Promise((_0x51588d,_0x1368a4)=>{const _0x4972b6=_0x5c20b6,_0x1dd669={'gDMDJ':function(_0x3898ad,_0x8bbc02){return _0x3898ad!==_0x8bbc02;},'fpRkc':_0x18f91c[_0x4972b6(0x8b8)],'NutHA':function(_0x31db18,_0x2bb429){return _0x18f91c['DHhjn'](_0x31db18,_0x2bb429);},'CgKDU':_0x18f91c[_0x4972b6(0x84f)],'jdEKs':function(_0x2173f7,_0x409663){return _0x18f91c['UHxYh'](_0x2173f7,_0x409663);},'InihD':_0x18f91c[_0x4972b6(0x19d)],'mSGPO':'jjLVi','dmOFs':function(_0x29bbd1,_0x1a1bbc){return _0x29bbd1+_0x1a1bbc;},'htLvY':_0x4972b6(0x8cb),'GPatm':_0x18f91c[_0x4972b6(0x3b0)]};logger[_0x4972b6(0x43a)]('\x0a'+'='[_0x4972b6(0x34f)](0x3c)),logger[_0x4972b6(0x43a)](_0x4972b6(0x719)+path[_0x4972b6(0x840)](_0x310a5f)),logger[_0x4972b6(0x43a)](_0x4972b6(0x6d0)+_0x3f5c0a[_0x4972b6(0x184)](',\x20')+']'),logger[_0x4972b6(0x43a)](_0x4972b6(0x899)+_0x5241d3+'\x22'),logger[_0x4972b6(0x43a)]('='[_0x4972b6(0x34f)](0x3c)+'\x0a');const _0x41884a=_0x3f5c0a[_0x4972b6(0x2d1)]((_0x1597b5,_0x3118a9)=>{const _0x3ad49f=_0x4972b6,_0x45bdba={'XvnSI':function(_0x15577f,_0xea5825){const _0x301c88=_0x2d26;return _0x18f91c[_0x301c88(0x350)](_0x15577f,_0xea5825);},'yugsR':_0x18f91c[_0x3ad49f(0x285)],'rKjzJ':_0x18f91c['xeOUB']};return new Promise((_0x2e8e4d,_0x3a95ec)=>{const _0x188ed2=_0x3ad49f,_0x2fb32b={'OGGdn':function(_0x56ac5c,_0x3c25cc){const _0xced8c9=_0x2d26;return _0x1dd669[_0xced8c9(0x5ec)](_0x56ac5c,_0x3c25cc);},'ipeEL':_0x1dd669[_0x188ed2(0x4e8)],'mLNLa':function(_0xc86fcb,_0x591aae){return _0x1dd669['NutHA'](_0xc86fcb,_0x591aae);},'zvmvp':_0x1dd669[_0x188ed2(0x20b)],'klWSX':function(_0x2c6cd1,_0x4e4aff){return _0x1dd669['jdEKs'](_0x2c6cd1,_0x4e4aff);},'xgAQg':function(_0x53f9d1,_0x3916dd){return _0x53f9d1(_0x3916dd);},'Zwzfo':_0x1dd669[_0x188ed2(0x43d)]};if(_0x188ed2(0x230)===_0x1dd669[_0x188ed2(0x5d5)]){const _0x3f0c37=['-d',_0x1597b5,_0x5241d3];logger[_0x188ed2(0x43a)]('['+_0x1dd669[_0x188ed2(0x63b)](_0x3118a9,0x1)+'/'+_0x3f5c0a[_0x188ed2(0x3c8)]+_0x188ed2(0x297)+_0x1597b5);const _0x294fd4=spawn(_0x310a5f,_0x3f0c37,{'cwd':path[_0x188ed2(0x889)](_0x310a5f)});let _0x48f55e='',_0x1d94f1='';_0x294fd4[_0x188ed2(0x3d3)]['on']('data',_0x5cee68=>{const _0xbf2e5e=_0x188ed2,_0x33d38d=_0x5cee68[_0xbf2e5e(0x67c)]();_0x48f55e+=_0x33d38d,logger[_0xbf2e5e(0x43a)]('['+_0x1597b5+_0xbf2e5e(0x372)+_0x33d38d['trim']());if(_0x4fd12d){if(_0x45bdba[_0xbf2e5e(0x536)](_0xbf2e5e(0x2b0),_0x45bdba['yugsR'])){const _0x5867fb=_0x587ac4['match'](/ID:([^\s]+)/);if(_0x5867fb)_0x24961a[_0xbf2e5e(0x296)]=_0x5867fb[0x1];}else{const _0x3b35df={};_0x3b35df['type']=_0x45bdba[_0xbf2e5e(0x236)],_0x3b35df['data']='['+_0x1597b5+']\x20'+_0x33d38d,_0x3b35df[_0xbf2e5e(0x388)]=[_0x1597b5],_0x4fd12d[_0xbf2e5e(0x550)](JSON[_0xbf2e5e(0x19f)](_0x3b35df));}}}),_0x294fd4[_0x188ed2(0x2aa)]['on'](_0x188ed2(0x46a),_0x5f05d9=>{const _0x3981da=_0x188ed2,_0x2151ef=_0x5f05d9[_0x3981da(0x67c)]();_0x1d94f1+=_0x2151ef,console[_0x3981da(0x5d6)]('['+_0x1597b5+']\x20STDERR:\x20'+_0x2151ef[_0x3981da(0x878)]());}),_0x294fd4['on'](_0x1dd669[_0x188ed2(0x384)],_0x296489=>{const _0x317856=_0x188ed2,_0x2b64ac={};_0x2b64ac[_0x317856(0x6b5)]=function(_0x6ab0ba,_0x58d145){return _0x6ab0ba!==_0x58d145;};const _0x35978e=_0x2b64ac;if(_0x2fb32b[_0x317856(0x27f)](_0x2fb32b['ipeEL'],_0x317856(0x21e))){if(_0x2fb32b[_0x317856(0x7e4)](_0x296489,0x0)){const _0x15a5c6={};_0x15a5c6[_0x317856(0x6ed)]=!![],_0x15a5c6['output']=_0x48f55e,_0x15a5c6[_0x317856(0x838)]=_0x1597b5,_0x2e8e4d(_0x15a5c6);}else{if(_0x2fb32b[_0x317856(0x25e)]===_0x2fb32b['zvmvp']){const _0x6189ae={};_0x6189ae['success']=![],_0x6189ae[_0x317856(0x5d6)]=_0x1d94f1||_0x317856(0x3ae)+_0x296489,_0x6189ae['device']=_0x1597b5,_0x2fb32b[_0x317856(0x632)](_0x3a95ec,_0x6189ae);}else{const [_0x5a636c]=_0x1e8912[_0x317856(0x394)](':');return _0x3d1df3['trim']()&&_0x35978e['GPzGG'](_0x5a636c,_0x1f6f93);}}}else _0x5804b4[_0x317856(0x44c)](_0x317856(0x20f));}),_0x294fd4['on'](_0x1dd669[_0x188ed2(0x624)],_0x376c15=>{const _0x4bdf0a=_0x188ed2;console[_0x4bdf0a(0x5d6)]('['+_0x1597b5+_0x4bdf0a(0x88b)+_0x376c15[_0x4bdf0a(0x5d4)]);const _0x29c801={};_0x29c801[_0x4bdf0a(0x6ed)]=![],_0x29c801[_0x4bdf0a(0x5d6)]=_0x376c15['message'],_0x29c801['device']=_0x1597b5,_0x2fb32b['xgAQg'](_0x3a95ec,_0x29c801);});}else{_0x38425f[_0x188ed2(0x44c)](_0x188ed2(0x1f8),_0x58ee98[_0x188ed2(0x47d)][_0x188ed2(0x5d6)]);const _0x555b18={};return _0x555b18[_0x188ed2(0x6ed)]=![],_0x555b18[_0x188ed2(0x5d6)]=_0x2fb32b[_0x188ed2(0x41f)],_0x439409['status'](0x1f4)['json'](_0x555b18);}});});Promise[_0x4972b6(0x5cf)](_0x41884a)['then'](_0x4a4f26=>{const _0x5ba638=_0x4972b6,_0xc6247f=_0x4a4f26[_0x5ba638(0x6fc)](_0x7f1249=>_0x7f1249[_0x5ba638(0x890)]===_0x5ba638(0x53c))['length'],_0xf837d0=_0x4a4f26[_0x5ba638(0x6fc)](_0x29daa0=>_0x29daa0[_0x5ba638(0x890)]===_0x5ba638(0x268))[_0x5ba638(0x3c8)],_0x510426={};_0x510426[_0x5ba638(0x6ed)]=!![],_0x510426[_0x5ba638(0x6c7)]=_0x4a4f26,_0x510426[_0x5ba638(0x4e1)]=_0xc6247f+'/'+_0x3f5c0a['length']+'\x20devices\x20completed\x20successfully',_0x18f91c[_0x5ba638(0x2f2)](_0x51588d,_0x510426);})[_0x4972b6(0x291)](_0x3f6c5c=>{const _0x5016d0=_0x4972b6;console[_0x5016d0(0x5d6)](_0x5016d0(0x2ed)+_0x3f6c5c[_0x5016d0(0x5d4)]),_0x18f91c[_0x5016d0(0x450)](_0x1368a4,_0x3f6c5c);});});}function executeAndroidDevices(_0x436a80,_0x4f88fc,_0x5a0a43,_0x273426){const _0x4bfa1a=_0x28fe54,_0xd31160={'JBmCT':'MlDDp','mbUUC':function(_0x528653,_0x2adaea){return _0x528653===_0x2adaea;},'pHwVj':'DbERU','xKfOH':'output','rcIGI':function(_0x229b6e){return _0x229b6e();},'McSaq':'VavcP','VlWci':function(_0x3524ac,_0x5c98a5){return _0x3524ac(_0x5c98a5);},'jGluJ':'EINnq','OYQie':function(_0x3527fe,_0x5799bf){return _0x3527fe||_0x5799bf;},'mAxni':function(_0x9b9625,_0x10b927,_0x22f0bc,_0x41ec20){return _0x9b9625(_0x10b927,_0x22f0bc,_0x41ec20);},'zURJy':_0x4bfa1a(0x46a),'xJeRD':function(_0x19b03a,_0x3efd87){return _0x19b03a-_0x3efd87;},'InKfM':function(_0x319a7b,_0x26a52c){return _0x319a7b(_0x26a52c);},'Uufda':_0x4bfa1a(0x38b)};return new Promise((_0x394548,_0x3e3d63)=>{const _0x173533=_0x4bfa1a,_0x5ecb79={'kWSWS':_0xd31160[_0x173533(0x4e2)],'rCvfh':function(_0x2d8bd8,_0x32f12a){return _0x2d8bd8(_0x32f12a);}};logger[_0x173533(0x43a)]('\x0a'+'='[_0x173533(0x34f)](0x3c)),logger[_0x173533(0x43a)](_0x173533(0x719)+path[_0x173533(0x840)](_0x436a80)),logger[_0x173533(0x43a)](_0x173533(0x6d0)+_0x4f88fc[_0x173533(0x2d1)](_0x2c20cd=>_0x2c20cd[_0x173533(0x361)])[_0x173533(0x184)](',\x20')+']'),logger[_0x173533(0x43a)](_0x173533(0x899)+_0x5a0a43+'\x22'),logger[_0x173533(0x43a)]('='['repeat'](0x3c)+'\x0a');const _0x54ea82=_0x4f88fc[_0x173533(0x2d1)]((_0x49a236,_0x25f1ba)=>{const _0x4c3e08=_0x173533,_0x3544b9={'WtmHO':function(_0x5407c5,_0x3be5ad){return _0x5407c5!==_0x3be5ad;},'xPhbC':_0xd31160[_0x4c3e08(0x7bb)],'DNhXF':function(_0x334346,_0x5edf02){const _0x316df4=_0x4c3e08;return _0xd31160[_0x316df4(0x60d)](_0x334346,_0x5edf02);},'EFqIR':_0xd31160['pHwVj'],'kImUU':_0xd31160['xKfOH'],'uXAgn':function(_0x18d769){const _0x562098=_0x4c3e08;return _0xd31160[_0x562098(0x466)](_0x18d769);},'mhlfh':_0xd31160[_0x4c3e08(0x77d)],'MXsIC':function(_0x2c7d72,_0x203f3c){const _0x3f3f1f=_0x4c3e08;return _0xd31160[_0x3f3f1f(0x70c)](_0x2c7d72,_0x203f3c);},'QXapU':_0xd31160[_0x4c3e08(0x782)],'DBeeB':function(_0x2d9891,_0x2b0afd){const _0x555ae3=_0x4c3e08;return _0xd31160[_0x555ae3(0x262)](_0x2d9891,_0x2b0afd);},'pfnGW':_0x4c3e08(0x4b3),'aXqos':_0x4c3e08(0x3f8),'skYIq':function(_0x40b901,_0x155f1a,_0x497ce0,_0x2a4bc6){return _0xd31160['mAxni'](_0x40b901,_0x155f1a,_0x497ce0,_0x2a4bc6);},'LMnVe':_0xd31160[_0x4c3e08(0x5c7)],'ktUvH':_0x4c3e08(0x8cb)};return logger[_0x4c3e08(0x43a)]('['+(_0x25f1ba+0x1)+'/'+_0x4f88fc[_0x4c3e08(0x3c8)]+_0x4c3e08(0x8ca)+_0x49a236['name']+'\x20('+_0x49a236[_0x4c3e08(0x2a7)]),new Promise((_0x1c5d4a,_0x2d32cb)=>{const _0x59c4f0=_0x4c3e08,_0x353ca7={'MCSOY':function(_0x54a5c3,_0x3a9b68){const _0x5d73e4=_0x2d26;return _0x3544b9[_0x5d73e4(0x5b0)](_0x54a5c3,_0x3a9b68);},'dqOFA':_0x3544b9[_0x59c4f0(0x25d)],'bxajh':function(_0x28b129,_0x5cb2e){return _0x3544b9['WtmHO'](_0x28b129,_0x5cb2e);},'IqkJZ':_0x59c4f0(0x72f),'ARGYz':function(_0x348f5f,_0x5bb083){const _0x557d9f=_0x59c4f0;return _0x3544b9[_0x557d9f(0x5b0)](_0x348f5f,_0x5bb083);},'DdOBv':function(_0x57685b,_0x3096f0){const _0x3e21dc=_0x59c4f0;return _0x3544b9[_0x3e21dc(0x655)](_0x57685b,_0x3096f0);}};if(_0x3544b9[_0x59c4f0(0x7d1)](_0x3544b9['pfnGW'],_0x3544b9['aXqos'])){const _0x39ee8e=[_0x49a236[_0x59c4f0(0x2a7)],..._0x5a0a43[_0x59c4f0(0x394)]('\x20')],_0x42bdc1=_0x3544b9[_0x59c4f0(0x1c1)](spawn,_0x436a80,_0x39ee8e,{'cwd':path['dirname'](_0x436a80)});let _0x413313='',_0x3f7dda='';_0x42bdc1['stdout']['on'](_0x3544b9['LMnVe'],_0x56ada1=>{const _0x569d9b=_0x59c4f0;if(_0x3544b9[_0x569d9b(0x7d1)](_0x3544b9[_0x569d9b(0x26d)],_0x3544b9[_0x569d9b(0x26d)])){const _0x5e8c80={};return _0x5e8c80[_0x569d9b(0x6ed)]=![],_0x5e8c80[_0x569d9b(0x5d6)]=_0x569d9b(0x554),_0x2d95fd[_0x569d9b(0x890)](0x190)[_0x569d9b(0x8bb)](_0x5e8c80);}else{const _0x3f2afd=_0x56ada1[_0x569d9b(0x67c)]();_0x413313+=_0x3f2afd,logger[_0x569d9b(0x43a)]('['+_0x49a236[_0x569d9b(0x361)]+_0x569d9b(0x372)+_0x3f2afd[_0x569d9b(0x878)]());if(_0x273426){if(_0x3544b9['DNhXF'](_0x3544b9[_0x569d9b(0x5f2)],_0x3544b9[_0x569d9b(0x5f2)])){const _0x5f5608={};_0x5f5608['type']=_0x3544b9['kImUU'],_0x5f5608[_0x569d9b(0x838)]=_0x49a236[_0x569d9b(0x361)],_0x5f5608[_0x569d9b(0x46a)]=_0x3f2afd,_0x273426[_0x569d9b(0x550)](JSON['stringify'](_0x5f5608));}else _0x32fc0e+=_0x1dcb4c[_0x569d9b(0x67c)]();}}}),_0x42bdc1['stderr']['on'](_0x3544b9[_0x59c4f0(0x59c)],_0x20fb09=>{const _0x279b8f=_0x59c4f0,_0x27a34d={'icPav':function(_0x494186){return _0x3544b9['uXAgn'](_0x494186);}};if(_0x3544b9[_0x279b8f(0x7d1)](_0x279b8f(0x8d4),_0x3544b9[_0x279b8f(0x255)])){const _0x1ac91e=_0x20fb09[_0x279b8f(0x67c)]();_0x3f7dda+=_0x1ac91e,logger[_0x279b8f(0x43a)]('['+_0x49a236[_0x279b8f(0x361)]+_0x279b8f(0x543)+_0x1ac91e[_0x279b8f(0x878)]());}else _0x27a34d['icPav'](_0x511130);}),_0x42bdc1['on'](_0x3544b9[_0x59c4f0(0x705)],_0x2c9fca=>{const _0x1187a4=_0x59c4f0,_0x18a8cf={};_0x18a8cf[_0x1187a4(0x5ef)]='devices_updated';const _0x4c90fb=_0x18a8cf;if(_0x1187a4(0x74b)===_0x353ca7['dqOFA']){if(_0x2c9fca===0x0){if(_0x353ca7['bxajh'](_0x1187a4(0x72f),_0x353ca7[_0x1187a4(0x55c)])){_0x26ba72[_0x1187a4(0x5d6)]('❌\x20Error\x20checking\x20WDA:\x20'+_0x4a74d4[_0x1187a4(0x5d4)]);const _0x5e97c8={};_0x5e97c8['success']=![],_0x5e97c8[_0x1187a4(0x5d4)]=_0x1187a4(0x24c)+_0x1d6df9[_0x1187a4(0x5d4)],_0x353ca7[_0x1187a4(0x851)](_0x4d6f4f,_0x5e97c8);}else{const _0x37b6bf={};_0x37b6bf['success']=!![],_0x37b6bf[_0x1187a4(0x651)]=_0x413313,_0x37b6bf[_0x1187a4(0x838)]=_0x49a236[_0x1187a4(0x361)],_0x353ca7['ARGYz'](_0x1c5d4a,_0x37b6bf);}}else _0x353ca7[_0x1187a4(0x443)](_0x1c5d4a,{'success':![],'error':_0x353ca7['DdOBv'](_0x3f7dda,_0x413313),'device':_0x49a236['name']});}else{const _0x4185ae={};_0x4185ae[_0x1187a4(0x185)]=_0x4c90fb[_0x1187a4(0x5ef)],_0x4185ae[_0x1187a4(0x388)]=_0x1d29db,_0x16ee03[_0x1187a4(0x550)](_0x48449e[_0x1187a4(0x19f)](_0x4185ae));}}),_0x42bdc1['on'](_0x59c4f0(0x5d6),_0x42ff8b=>{const _0x3b62e1=_0x59c4f0;console[_0x3b62e1(0x5d6)]('['+_0x49a236[_0x3b62e1(0x361)]+']\x20Process\x20error:',_0x42ff8b);const _0x139c24={};_0x139c24[_0x3b62e1(0x6ed)]=![],_0x139c24['error']=_0x42ff8b[_0x3b62e1(0x5d4)],_0x139c24[_0x3b62e1(0x838)]=_0x49a236[_0x3b62e1(0x361)],_0x1c5d4a(_0x139c24);});}else{_0x24024f[_0x59c4f0(0x44c)](_0x59c4f0(0x819));const _0x37aa13={};_0x37aa13['success']=![],_0x37aa13['message']=_0x59c4f0(0x616),_0x353ca7[_0x59c4f0(0x851)](_0x442b2f,_0x37aa13);}});});Promise[_0x173533(0x5cf)](_0x54ea82)[_0x173533(0x732)](_0x1ff029=>{const _0x30348f=_0x173533,_0x453ef2=_0x1ff029[_0x30348f(0x6fc)](_0x5aef83=>_0x5aef83[_0x30348f(0x890)]===_0x30348f(0x53c)&&_0x5aef83[_0x30348f(0x47d)]['success'])[_0x30348f(0x3c8)],_0x45f12e=_0xd31160['xJeRD'](_0x1ff029[_0x30348f(0x3c8)],_0x453ef2),_0x176e69={};_0x176e69[_0x30348f(0x6ed)]=!![],_0x176e69[_0x30348f(0x6c7)]=_0x1ff029,_0xd31160[_0x30348f(0x4c8)](_0x394548,_0x176e69);})['catch'](_0x205e65=>{const _0x2435bd=_0x173533;console[_0x2435bd(0x5d6)](_0x5ecb79[_0x2435bd(0x4b9)],_0x205e65),_0x5ecb79[_0x2435bd(0x7c3)](_0x3e3d63,_0x205e65);});});}async function convertNaturalLanguageToCommand(_0x18e857,_0x4399b3,_0x461f6b=null){const _0x3ca4ec=_0x28fe54,_0x3d3c77={};_0x3d3c77[_0x3ca4ec(0x3c3)]=function(_0x27b1ad,_0x2f3e7d){return _0x27b1ad===_0x2f3e7d;},_0x3d3c77[_0x3ca4ec(0x4ab)]=_0x3ca4ec(0x418),_0x3d3c77[_0x3ca4ec(0x5db)]=function(_0x5efd54,_0x4f6790){return _0x5efd54===_0x4f6790;};const _0x28f26a=_0x3d3c77,_0x194c5e=connectedDevices[_0x3ca4ec(0x6fc)](_0x1a5d74=>_0x4399b3[_0x3ca4ec(0x1bf)](_0x1a5d74[_0x3ca4ec(0x361)]));if(_0x194c5e['length']===0x0){if(_0x28f26a['oICkL'](_0x28f26a[_0x3ca4ec(0x4ab)],'ZvZSL')){const _0x379f5e=_0x31f6d4[_0x3ca4ec(0x2a5)](),_0xa9ee28=_0xf51b1a[_0x3ca4ec(0x585)](),_0x35fd28={};_0x35fd28[_0x3ca4ec(0x6ed)]=!![],_0x35fd28[_0x3ca4ec(0x5ad)]=_0x379f5e,_0x35fd28[_0x3ca4ec(0x79b)]=_0xa9ee28['id'],_0x3b7e8a[_0x3ca4ec(0x8bb)](_0x35fd28);}else return await aiManager[_0x3ca4ec(0x3db)](_0x18e857,null,_0x461f6b);}const _0x428f90=[...new Set(_0x194c5e['map'](_0x355516=>_0x355516[_0x3ca4ec(0x2fa)]))];console[_0x3ca4ec(0x44c)](_0x3ca4ec(0x6f6)+_0x194c5e[_0x3ca4ec(0x3c8)]+_0x3ca4ec(0x223)+_0x428f90[_0x3ca4ec(0x3c8)]+_0x3ca4ec(0x496)+_0x428f90[_0x3ca4ec(0x184)](',\x20'));const _0x4b689c=_0x28f26a[_0x3ca4ec(0x5db)](_0x428f90[_0x3ca4ec(0x3c8)],0x1)?_0x428f90[0x0]:_0x3ca4ec(0x759);return console[_0x3ca4ec(0x44c)](_0x3ca4ec(0x299)+_0x4b689c),await aiManager[_0x3ca4ec(0x3db)](_0x18e857,_0x4b689c,_0x461f6b);}async function executeCommandsSequentially(_0x4b835c,_0x37192c,_0x5872b2){const _0xb78375=_0x28fe54,_0x3c6603={'GkunD':function(_0x502f4e,_0x36ef79){return _0x502f4e||_0x36ef79;},'ysTlQ':function(_0x32aa5d,_0x4568fa,_0x2eee7f,_0xe234b1,_0x116d43){return _0x32aa5d(_0x4568fa,_0x2eee7f,_0xe234b1,_0x116d43);},'ZSHEm':function(_0x2666ae,_0xa3b168){return _0x2666ae<_0xa3b168;},'mcsWD':function(_0x3c355e,_0x379208){return _0x3c355e!==_0x379208;},'iuSpe':_0xb78375(0x73e),'AmpjW':function(_0x13ad62,_0xc69d7){return _0x13ad62===_0xc69d7;},'pjrjI':_0xb78375(0x88f),'RQbnK':_0xb78375(0x676),'ZINbT':_0xb78375(0x761),'wWNjk':function(_0x3efb5d,_0x284d1b){return _0x3efb5d!==_0x284d1b;},'nteKO':'sWutT','ceoal':_0xb78375(0x608),'RHomz':_0xb78375(0x7ab),'SKZnv':function(_0x23738f,_0x9537b2){return _0x23738f+_0x9537b2;},'rKhOn':function(_0x568307,_0x1c245e,_0x3236a6,_0x42e3ce){return _0x568307(_0x1c245e,_0x3236a6,_0x42e3ce);},'bNAgy':_0xb78375(0x774)},_0x52c0f9=_0x37192c['split']('\x0a')[_0xb78375(0x2d1)](_0x5e445e=>_0x5e445e['trim']())['filter'](_0x213a71=>_0x213a71);console['log'](_0xb78375(0x59b)+_0x52c0f9['length']),console[_0xb78375(0x44c)](_0xb78375(0x8a0),_0x52c0f9);const _0x5eaa24=[];for(let _0x448c6f=0x0;_0x3c6603['ZSHEm'](_0x448c6f,_0x52c0f9['length']);_0x448c6f++){if(_0x3c6603[_0xb78375(0x747)](_0x3c6603[_0xb78375(0x522)],'kVXuN')){const _0x2c723c=_0x52c0f9[_0x448c6f];if(_0x2c723c[_0xb78375(0x310)]('#')){if(_0x3c6603[_0xb78375(0x825)](_0x3c6603['pjrjI'],_0x3c6603[_0xb78375(0x366)]))_0xbfc7c3['error'](_0xb78375(0x37a)+_0x136cb8+_0xb78375(0x688)+_0x5d58e0[_0xb78375(0x878)]());else continue;}if(_0x2c723c[_0xb78375(0x310)](_0x3c6603[_0xb78375(0x564)])){const _0x941369=parseInt(_0x2c723c[_0xb78375(0x8e7)](_0x3c6603[_0xb78375(0x564)],''));console[_0xb78375(0x44c)](_0xb78375(0x81a)+_0x941369+_0xb78375(0x3ce));if(_0x5872b2){if(_0x3c6603[_0xb78375(0x7a7)](_0x3c6603[_0xb78375(0x785)],_0x3c6603['ceoal'])){const _0x49c4b6={};_0x49c4b6[_0xb78375(0x185)]=_0x3c6603[_0xb78375(0x348)],_0x49c4b6[_0xb78375(0x46a)]=_0xb78375(0x81a)+_0x941369+'ms...\x0a',_0x49c4b6[_0xb78375(0x388)]=_0x4b835c,_0x5872b2[_0xb78375(0x550)](JSON[_0xb78375(0x19f)](_0x49c4b6));}else{const _0x5ed228={};_0x5ed228[_0xb78375(0x6ed)]=![],_0x5ed228['error']=_0x29389e[_0xb78375(0x5d4)],_0x4dff71[_0x16330e[_0xb78375(0x361)]]=_0x5ed228;}}await new Promise(_0x31ac7c=>setTimeout(_0x31ac7c,_0x941369));const _0x514c4c={};_0x514c4c[_0xb78375(0x75c)]=_0x2c723c,_0x514c4c[_0xb78375(0x6ed)]=!![],_0x514c4c['output']=_0xb78375(0x295)+_0x941369+'ms',_0x5eaa24[_0xb78375(0x80f)](_0x514c4c);continue;}console[_0xb78375(0x44c)](_0xb78375(0x1ef)+_0x3c6603['SKZnv'](_0x448c6f,0x1)+'/'+_0x52c0f9[_0xb78375(0x3c8)]+':\x20\x22'+_0x2c723c+'\x22');if(_0x5872b2){const _0x7e14d2={};_0x7e14d2[_0xb78375(0x185)]=_0x3c6603[_0xb78375(0x348)],_0x7e14d2['data']=_0xb78375(0x8db)+(_0x448c6f+0x1)+'/'+_0x52c0f9[_0xb78375(0x3c8)]+']\x20'+_0x2c723c+'\x0a',_0x7e14d2[_0xb78375(0x388)]=_0x4b835c,_0x5872b2['send'](JSON[_0xb78375(0x19f)](_0x7e14d2));}try{const _0x2b5808=await _0x3c6603['rKhOn'](executeCommand,_0x4b835c,_0x2c723c,_0x5872b2),_0x333523={};_0x333523[_0xb78375(0x75c)]=_0x2c723c,_0x333523[_0xb78375(0x6ed)]=!![],_0x333523[_0xb78375(0x792)]=_0x2b5808,_0x5eaa24['push'](_0x333523),console[_0xb78375(0x44c)](_0xb78375(0x502)+(_0x448c6f+0x1)+_0xb78375(0x3da));}catch(_0x34d162){console['error']('❌\x20Command\x20'+(_0x448c6f+0x1)+_0xb78375(0x2c5),_0x34d162[_0xb78375(0x5d4)]);const _0x426d6e={};_0x426d6e[_0xb78375(0x75c)]=_0x2c723c,_0x426d6e[_0xb78375(0x6ed)]=![],_0x426d6e[_0xb78375(0x5d6)]=_0x34d162[_0xb78375(0x5d4)],_0x5eaa24[_0xb78375(0x80f)](_0x426d6e);if(_0x5872b2){if(_0x3c6603['AmpjW'](_0x3c6603[_0xb78375(0x31e)],'HPUND')){const _0x2184ee={};_0x2184ee[_0xb78375(0x185)]=_0x3c6603[_0xb78375(0x348)],_0x2184ee[_0xb78375(0x46a)]=_0xb78375(0x5ee)+_0x34d162[_0xb78375(0x5d4)]+'\x0a',_0x2184ee['devices']=_0x4b835c,_0x5872b2['send'](JSON[_0xb78375(0x19f)](_0x2184ee));}else{if(_0x3c6603[_0xb78375(0x4b5)](!_0x8b413c,!_0x3710c0))return![];return _0x549e67[_0xb78375(0x8e1)]['push']({'timestamp':new _0x393c74()[_0xb78375(0x5c9)](),'devices':_0x70a23c,'originalCommand':_0x40b676,'useAI':_0x4343b4,'finalCommand':_0x3c6603[_0xb78375(0x4b5)](_0x2c59d0,_0x23fa2c)}),_0x2960a1[_0xb78375(0x44c)](_0xb78375(0x393)+_0x450ce5+'\x20('+_0x47642f[_0xb78375(0x8e1)][_0xb78375(0x3c8)]+_0xb78375(0x850)),!![];}}}}else _0x3c6603['ysTlQ'](_0x2b0ea6,_0x130e73,_0x4f78dc,_0x51bb84,_0x5b6394);}console[_0xb78375(0x44c)](_0xb78375(0x279)+_0x5eaa24[_0xb78375(0x3c8)]+',\x20Success:\x20'+_0x5eaa24['filter'](_0x1f9149=>_0x1f9149[_0xb78375(0x6ed)])[_0xb78375(0x3c8)]+_0xb78375(0x706)+_0x5eaa24[_0xb78375(0x6fc)](_0xa827cb=>!_0xa827cb['success'])[_0xb78375(0x3c8)]);const _0xdd06e8={};return _0xdd06e8[_0xb78375(0x6ed)]=!![],_0xdd06e8[_0xb78375(0x6c7)]=_0x5eaa24,_0xdd06e8[_0xb78375(0x4e1)]=_0xb78375(0x85f)+_0x5eaa24['length']+_0xb78375(0x631),_0xdd06e8;}async function createWDASession(_0x7a9a16,_0x3195ca){const _0x39634d=_0x28fe54,_0x1b4fd2={'OrCUa':'command_error','PPMgb':function(_0x10afa7,_0x42c647,_0x2069dd,_0x158efe){return _0x10afa7(_0x42c647,_0x2069dd,_0x158efe);},'OFrhY':function(_0xc16ccf,_0x331621){return _0xc16ccf!==_0x331621;},'CFprZ':_0x39634d(0x539),'oLijU':function(_0xed2996,_0x2b947a,_0x2fb89e){return _0xed2996(_0x2b947a,_0x2fb89e);},'SvFOe':_0x39634d(0x6ba),'ZqUxh':_0x39634d(0x22e),'CMvoF':function(_0x272d63,_0x40780d){return _0x272d63===_0x40780d;},'egcXa':_0x39634d(0x7c2),'IzLzG':_0x39634d(0x32f),'oVpUN':function(_0x195f18,_0x3ad5a3){return _0x195f18(_0x3ad5a3);},'deKFC':function(_0x6b39dc,_0x3c2869,_0x3fb8d1,_0x1d5445,_0x1dbe5a){return _0x6b39dc(_0x3c2869,_0x3fb8d1,_0x1d5445,_0x1dbe5a);},'TTyxD':_0x39634d(0x88d),'bbzyk':'/tmp/ios_multi_sessions','PSJeP':_0x39634d(0x389),'kdYNT':function(_0x286861,_0x51de4a){return _0x286861===_0x51de4a;},'fmrFY':_0x39634d(0x696),'gavlw':_0x39634d(0x46f),'GfwOm':_0x39634d(0x36e),'EDCcm':_0x39634d(0x46a),'qRfCw':_0x39634d(0x8cb)};return new Promise(async _0x3958e1=>{const _0x5048eb=_0x39634d,_0x447a8e={'QuDkn':function(_0x2bbeb0,_0xfd73f4,_0x56036f){const _0x402e52=_0x2d26;return _0x1b4fd2[_0x402e52(0x847)](_0x2bbeb0,_0xfd73f4,_0x56036f);},'cUIOn':_0x1b4fd2[_0x5048eb(0x4ec)],'UcHIP':_0x1b4fd2['ZqUxh'],'ejUeW':function(_0x1c34fc,_0x2820c7){return _0x1b4fd2['CMvoF'](_0x1c34fc,_0x2820c7);},'JiedM':_0x1b4fd2[_0x5048eb(0x6a2)],'JQCRt':_0x1b4fd2[_0x5048eb(0x77a)],'jaaSw':function(_0x39f7a1,_0x569436){const _0x135881=_0x5048eb;return _0x1b4fd2[_0x135881(0x56d)](_0x39f7a1,_0x569436);},'einYO':function(_0x33c8c1,_0x3db2d6,_0x3e3ff6,_0x38f7f2,_0x31466a){return _0x1b4fd2['deKFC'](_0x33c8c1,_0x3db2d6,_0x3e3ff6,_0x38f7f2,_0x31466a);},'WqEqB':_0x1b4fd2[_0x5048eb(0x34a)]},_0x2af22d=_0x1b4fd2[_0x5048eb(0x82c)];try{const _0x1b64df=await fs['readFile'](_0x2af22d,_0x1b4fd2['SvFOe'])[_0x5048eb(0x291)](()=>''),_0x31cc78=_0x1b64df[_0x5048eb(0x394)]('\x0a')[_0x5048eb(0x6fc)](_0x562c51=>_0x562c51['trim']());for(const _0x276e80 of _0x31cc78){if(_0x1b4fd2[_0x5048eb(0x2a8)](_0x1b4fd2[_0x5048eb(0x712)],_0x1b4fd2[_0x5048eb(0x712)])){const [_0x398c20,_0x184333]=_0x276e80[_0x5048eb(0x394)](':');if(_0x398c20===_0x3195ca&&_0x184333){const _0x401c00=_0x1b4fd2[_0x5048eb(0x3d8)](_0x7a9a16,_0x1b4fd2[_0x5048eb(0x7ba)])?0x1fa4:0x1fa4,_0x2b5f5b='http://'+_0x7a9a16+':'+_0x401c00+'/session/'+_0x184333,_0x262a89=_0x1b4fd2[_0x5048eb(0x847)](spawn,_0x1b4fd2[_0x5048eb(0x797)],['-s','-X',_0x1b4fd2[_0x5048eb(0x32b)],_0x2b5f5b]);let _0x534682='';_0x262a89[_0x5048eb(0x3d3)]['on'](_0x1b4fd2[_0x5048eb(0x349)],_0x1a9d44=>{const _0x10b922=_0x5048eb,_0x32f8e5={'vJHcg':_0x1b4fd2[_0x10b922(0x537)],'hyqyG':function(_0x245d28,_0x390580,_0x44f1b4,_0x49ffa8){const _0x54ddd0=_0x10b922;return _0x1b4fd2[_0x54ddd0(0x5da)](_0x245d28,_0x390580,_0x44f1b4,_0x49ffa8);}};if(_0x1b4fd2['OFrhY'](_0x1b4fd2[_0x10b922(0x2e8)],_0x10b922(0x237)))_0x534682+=_0x1a9d44[_0x10b922(0x67c)]();else{const _0x26a3fc={};_0x26a3fc[_0x10b922(0x6b0)]=_0x10b922(0x51a);const _0x377e7f=_0x26a3fc;_0x32f8e5[_0x10b922(0x7ad)](_0x5b1583,_0x551f2f,_0x4f1542,_0x368555)['then'](_0x40c6b5=>{const _0x129d23=_0x10b922;_0x29ccbb[_0x129d23(0x44c)](_0x129d23(0x6d6));const _0x55502c={};_0x55502c[_0x129d23(0x185)]=_0x377e7f[_0x129d23(0x6b0)],_0x55502c[_0x129d23(0x792)]=_0x40c6b5,_0x424584['send'](_0x5d08e1[_0x129d23(0x19f)](_0x55502c));})[_0x10b922(0x291)](_0x3fd8c1=>{const _0x2837f6=_0x10b922;_0x324345[_0x2837f6(0x5d6)](_0x2837f6(0x34b)+_0x3fd8c1['message']);const _0x7e7b1={};_0x7e7b1['type']=_0x32f8e5[_0x2837f6(0x680)],_0x7e7b1[_0x2837f6(0x5d6)]=_0x3fd8c1[_0x2837f6(0x5d4)],_0x52d1d1['send'](_0x4549fa['stringify'](_0x7e7b1));});}}),_0x262a89['on'](_0x1b4fd2[_0x5048eb(0x708)],_0x35b8ce=>{const _0x14e756=_0x5048eb,_0x54b899={'znXwo':function(_0x507b34,_0x5c0123,_0x3cabde){const _0x547cd9=_0x2d26;return _0x447a8e[_0x547cd9(0x2b8)](_0x507b34,_0x5c0123,_0x3cabde);},'vfNsX':_0x447a8e[_0x14e756(0x68b)],'BBOUD':_0x447a8e['UcHIP']};if(_0x447a8e[_0x14e756(0x542)](_0x35b8ce,0x0)&&_0x534682&&!_0x534682[_0x14e756(0x1bf)](_0x447a8e[_0x14e756(0x7f3)])){if(_0x447a8e[_0x14e756(0x16e)]!==_0x14e756(0x5f7)){console[_0x14e756(0x44c)]('✅\x20Existing\x20valid\x20session\x20found:\x20'+_0x184333);const _0x3d7307={};return _0x3d7307['success']=!![],_0x3d7307['sessionId']=_0x184333,_0x3d7307[_0x14e756(0x27b)]=!![],_0x447a8e[_0x14e756(0x41e)](_0x3958e1,_0x3d7307);}else{const _0x4a6130=_0x54b899[_0x14e756(0x803)](_0x4c76b5,_0x14e756(0x457)+_0x27270d+'\x20shell\x20pm\x20path\x20'+_0x2d111c,{'encoding':_0x54b899[_0x14e756(0x888)],'timeout':0x2710});_0x19be63[_0x14e756(0x516)]=_0x4a6130['replace'](_0x54b899[_0x14e756(0x6ec)],'')[_0x14e756(0x878)]();}}else _0x447a8e[_0x14e756(0x544)](createNewSession,_0x7a9a16,_0x3195ca,_0x2af22d,_0x3958e1);});return;}}else _0x3f7a13=eLvQni[_0x5048eb(0x32d)];}}catch(_0x808665){}_0x1b4fd2['deKFC'](createNewSession,_0x7a9a16,_0x3195ca,_0x2af22d,_0x3958e1);});}function createNewSession(_0x14ab8e,_0x364147,_0x39b7f3,_0x143974){const _0x26f027=_0x28fe54,_0x19fee9={'mcStH':function(_0x57335b,_0x5ea1df){return _0x57335b===_0x5ea1df;},'RNsqc':_0x26f027(0x326),'Rxdwz':_0x26f027(0x42c),'paoSb':_0x26f027(0x68c),'enQKt':_0x26f027(0x503),'TeAyx':_0x26f027(0x6b2),'htecp':function(_0x23eb53,_0x3d43b8){return _0x23eb53(_0x3d43b8);},'FzRYY':function(_0x34824d,_0x201301){return _0x34824d!==_0x201301;},'biLQl':_0x26f027(0x5c4),'yMDPs':_0x26f027(0x5d3),'TXPUN':function(_0x5dff14){return _0x5dff14();},'KWjTQ':_0x26f027(0x48f),'vMuBz':function(_0x4e7d85,_0x22d159){return _0x4e7d85===_0x22d159;},'DjiTG':'TBCfS','WjAuj':'Zfknx','bhgmm':_0x26f027(0x6ba),'RhKNe':function(_0x47eb9c,_0x4852c4){return _0x47eb9c===_0x4852c4;},'WwiNo':_0x26f027(0x213),'wguQE':function(_0x5434df,_0x186951){return _0x5434df!==_0x186951;},'itMLA':_0x26f027(0x89e),'Orptp':_0x26f027(0x1c6),'FwSEy':_0x26f027(0x3e3),'iCBoT':_0x26f027(0x2ae),'nHCkr':'bdgrV','xmFvP':function(_0x2c5893,_0x3efaf0){return _0x2c5893(_0x3efaf0);},'jadBx':_0x26f027(0x696),'BcXQb':function(_0xed2b76,_0x4440c8,_0x468914){return _0xed2b76(_0x4440c8,_0x468914);},'dVlkE':_0x26f027(0x1a4),'LKRhr':_0x26f027(0x71e),'fzxbQ':'data','kJcVg':_0x26f027(0x5d6)},_0x45275c=_0x14ab8e===_0x19fee9[_0x26f027(0x86d)]?0x1fa4:0x1fa4,_0xf7cc25=_0x26f027(0x6e8)+_0x14ab8e+':'+_0x45275c+'/session',_0x6bd3f6=_0x19fee9[_0x26f027(0x333)](spawn,_0x26f027(0x46f),['-s','-X',_0x19fee9['dVlkE'],_0xf7cc25,'-H',_0x19fee9['LKRhr'],'-d',_0x26f027(0x1b8)]);let _0xa611fe='';_0x6bd3f6[_0x26f027(0x3d3)]['on'](_0x19fee9[_0x26f027(0x69d)],_0x2fe57c=>{const _0x97a533=_0x26f027;if(_0x19fee9[_0x97a533(0x2c3)]!==_0x19fee9[_0x97a533(0x33f)])_0xa611fe+=_0x2fe57c[_0x97a533(0x67c)]();else{if(_0x19fee9[_0x97a533(0x778)](_0x11c60d[_0x97a533(0x45e)],_0x4ae80f[_0x97a533(0x2fc)])){const _0x3389de={};_0x3389de[_0x97a533(0x185)]=_0x19fee9[_0x97a533(0x459)],_0x3389de[_0x97a533(0x388)]=_0x530942,_0xc7e0c3[_0x97a533(0x550)](_0x6c4c21[_0x97a533(0x19f)](_0x3389de));}}}),_0x6bd3f6['on'](_0x26f027(0x8cb),_0x455a5a=>{const _0x8882ad=_0x26f027,_0x1c222b={'hAeAO':function(_0x11deea,_0x2b23d7){const _0x562e69=_0x2d26;return _0x19fee9[_0x562e69(0x728)](_0x11deea,_0x2b23d7);},'SYmxv':function(_0x9e4a4d,_0x551a56){return _0x9e4a4d+_0x551a56;},'dagtu':_0x19fee9[_0x8882ad(0x69e)],'Tpznm':function(_0x516f5a,_0xb77a98){const _0x1dd7c2=_0x8882ad;return _0x19fee9[_0x1dd7c2(0x778)](_0x516f5a,_0xb77a98);},'MJQqB':_0x19fee9[_0x8882ad(0x3c4)],'sdfmg':'Failed\x20to\x20start\x20server:','xTWAd':function(_0x555f8e){return _0x19fee9['TXPUN'](_0x555f8e);},'fXRZs':'devices_updated'};if('uVTBX'===_0x19fee9[_0x8882ad(0x1b4)]){if(_0x19fee9[_0x8882ad(0x23d)](_0x455a5a,0x0)&&_0xa611fe)try{const _0x4b7cbb=JSON[_0x8882ad(0x3f9)](_0xa611fe),_0x22d83f=_0x4b7cbb['sessionId']||_0x4b7cbb[_0x8882ad(0x47d)]?.['sessionId'];if(_0x22d83f){if(_0x19fee9[_0x8882ad(0x4c7)]===_0x19fee9[_0x8882ad(0x1bb)]){const _0x32f17a={};_0x32f17a[_0x8882ad(0x6ed)]=![],_0x32f17a[_0x8882ad(0x5d6)]=_0x69a7ac[_0x8882ad(0x5d4)],_0xaadc49['status'](0x1f4)[_0x8882ad(0x8bb)](_0x32f17a);}else fs[_0x8882ad(0x599)](_0x39b7f3,_0x19fee9[_0x8882ad(0x766)])[_0x8882ad(0x291)](()=>'')[_0x8882ad(0x732)](_0x34c103=>{const _0x21f7a6=_0x8882ad,_0x3b3194={'wRJTu':function(_0xca3d85,_0x292662){const _0x3b4ffc=_0x2d26;return _0x1c222b[_0x3b4ffc(0x29b)](_0xca3d85,_0x292662);}},_0x44d5bd=_0x34c103[_0x21f7a6(0x394)]('\x0a')['filter'](_0x527f5b=>{const _0x2a7a7b=_0x21f7a6,[_0x4c8443]=_0x527f5b['split'](':');return _0x527f5b[_0x2a7a7b(0x878)]()&&_0x3b3194[_0x2a7a7b(0x824)](_0x4c8443,_0x364147);});return _0x44d5bd[_0x21f7a6(0x80f)](_0x364147+':'+_0x22d83f),fs[_0x21f7a6(0x188)](_0x39b7f3,_0x1c222b[_0x21f7a6(0x1c8)](_0x44d5bd[_0x21f7a6(0x184)]('\x0a'),'\x0a'));})['then'](()=>{const _0x327647=_0x8882ad;if(_0x19fee9['mcStH'](_0x19fee9[_0x327647(0x76b)],_0x19fee9[_0x327647(0x2dc)])){const _0x55af74={};return _0x55af74[_0x327647(0x6ed)]=![],_0x55af74['error']=_0x1c222b[_0x327647(0x559)],_0x435147[_0x327647(0x890)](0x1f4)[_0x327647(0x8bb)](_0x55af74);}else{console[_0x327647(0x44c)]('✅\x20New\x20session\x20created\x20and\x20saved:\x20'+_0x22d83f);const _0x522ff9={};_0x522ff9[_0x327647(0x6ed)]=!![],_0x522ff9[_0x327647(0x741)]=_0x22d83f,_0x19fee9[_0x327647(0x1b9)](_0x143974,_0x522ff9);}})[_0x8882ad(0x291)](_0x1c3060=>{const _0x23a371=_0x8882ad;console[_0x23a371(0x5d6)](_0x23a371(0x790)+_0x364147+':',_0x1c3060);const _0x6f8760={};_0x6f8760[_0x23a371(0x6ed)]=![],_0x19fee9[_0x23a371(0x1b9)](_0x143974,_0x6f8760);});}else{if(_0x19fee9[_0x8882ad(0x27e)](_0x19fee9[_0x8882ad(0x8d9)],_0x8882ad(0x370))){const _0x40c167={'LfZlT':function(_0xce1a64,_0x1c14bc){const _0x389b5e=_0x8882ad;return _0x1c222b[_0x389b5e(0x2e2)](_0xce1a64,_0x1c14bc);},'nUPEv':_0x1c222b['MJQqB'],'qikmw':_0x1c222b[_0x8882ad(0x48e)]};_0x1c222b['xTWAd'](_0x118aef)[_0x8882ad(0x291)](_0x1a6668=>{const _0xd2fcf6=_0x8882ad;if(_0x40c167[_0xd2fcf6(0x848)](_0x1a6668[_0xd2fcf6(0x1c0)],_0x40c167[_0xd2fcf6(0x671)])){const _0x102821=_0xd2fcf6(0x872)['split']('|');let _0x523f29=0x0;while(!![]){switch(_0x102821[_0x523f29++]){case'0':_0x3a8b76[_0xd2fcf6(0x5d6)]('\x0aTry\x20one\x20of\x20these\x20solutions:');continue;case'1':_0x4a454c['error'](_0xd2fcf6(0x8a5));continue;case'2':_0x4edb1f[_0xd2fcf6(0x5d6)](_0xd2fcf6(0x758));continue;case'3':_0x407b85[_0xd2fcf6(0x5d6)](_0xd2fcf6(0x487));continue;case'4':_0x12d389[_0xd2fcf6(0x5d6)]('\x20\x201.\x20Kill\x20the\x20process\x20using\x20port\x203001:\x20lsof\x20-ti:3001\x20|\x20xargs\x20kill\x20-9');continue;case'5':_0x3c96e9['error'](_0xd2fcf6(0x73c));continue;}break;}}else _0x11e75b['error'](_0x40c167['qikmw'],_0x1a6668[_0xd2fcf6(0x5d4)]);_0x123110[_0xd2fcf6(0x4c3)](0x1);});}else{const _0x46de16={};_0x46de16[_0x8882ad(0x6ed)]=![],_0x143974(_0x46de16);}}}catch(_0x8ad413){if(_0x19fee9[_0x8882ad(0x78e)](_0x19fee9[_0x8882ad(0x57e)],'vVlNs'))_0x3f00ac['send'](_0x494bd3['stringify']({'type':_0x8882ad(0x7ab),'data':_0x8882ad(0x8db)+kIeyGJ[_0x8882ad(0x1c8)](_0x2b3fa7,0x1)+'/'+_0x256601[_0x8882ad(0x3c8)]+']\x20'+_0x58fd50+'\x0a','devices':_0x393cde}));else{console[_0x8882ad(0x5d6)](_0x19fee9[_0x8882ad(0x7b5)],_0x8ad413);const _0x30d452={};_0x30d452[_0x8882ad(0x6ed)]=![],_0x19fee9[_0x8882ad(0x1b9)](_0x143974,_0x30d452);}}else{const _0x451a6f={};_0x451a6f[_0x8882ad(0x6ed)]=![],_0x143974(_0x451a6f);}}else{if(_0x1c222b['Tpznm'](_0x175015[_0x8882ad(0x45e)],_0x44150d[_0x8882ad(0x2fc)])){const _0x15c42b={};_0x15c42b[_0x8882ad(0x185)]=_0x1c222b[_0x8882ad(0x6e4)],_0x15c42b[_0x8882ad(0x388)]=_0x1d20e7,_0x3dd0d5[_0x8882ad(0x550)](_0x263df7[_0x8882ad(0x19f)](_0x15c42b));}}}),_0x6bd3f6['on'](_0x19fee9['kJcVg'],_0x117d6c=>{const _0x437d2c=_0x26f027,_0x5371fc={};_0x5371fc[_0x437d2c(0x41d)]=_0x19fee9[_0x437d2c(0x6d2)],_0x5371fc[_0x437d2c(0x17d)]=_0x19fee9['iCBoT'];const _0x9d87dc=_0x5371fc;if(_0x19fee9[_0x437d2c(0x728)](_0x19fee9['nHCkr'],_0x19fee9[_0x437d2c(0x6be)])){const _0x1a2137=_0x2b5683['ip']||'',_0x404f98=_0x1eecf4[_0x437d2c(0x2fa)]||_0x9d87dc[_0x437d2c(0x41d)],_0x3fa909=_0x2dc850[_0x437d2c(0x185)]||_0x494e9f[_0x437d2c(0x38e)]||(_0x1a2137?_0x9d87dc['gSvue']:'usb');_0x3e49fe+=_0x1fc0b5[_0x437d2c(0x361)]+','+_0x481695[_0x437d2c(0x2a7)]+','+_0x1a2137+','+_0x404f98+','+_0x3fa909+'\x0a';}else{console[_0x437d2c(0x5d6)](_0x437d2c(0x4f7),_0x117d6c);const _0x3a4282={};_0x3a4282[_0x437d2c(0x6ed)]=![],_0x19fee9[_0x437d2c(0x62a)](_0x143974,_0x3a4282);}});}async function installUIAutomator2(_0x57a37b,_0x23c777){const _0x4282bf=_0x28fe54,_0x6949e8={'PCzDz':function(_0x16014b,_0x4b44a5){return _0x16014b(_0x4b44a5);},'cSUlS':_0x4282bf(0x3ed),'bMKEZ':_0x4282bf(0x59e),'jGCmj':function(_0x5d0e49,_0x278440){return _0x5d0e49===_0x278440;},'RxhCw':function(_0x1e7c63,_0x418438){return _0x1e7c63===_0x418438;},'dTSrT':'zevGm','agLOe':function(_0x5e0b15,_0x13944e){return _0x5e0b15(_0x13944e);},'SAgQT':_0x4282bf(0x516),'FTCDu':_0x4282bf(0x461),'cekot':'../apks','LZyfY':function(_0x381f40,_0x473946,_0x39d438){return _0x381f40(_0x473946,_0x39d438);},'QYstP':_0x4282bf(0x16f),'keApG':'utf-8','dAogm':_0x4282bf(0x656),'iDIzp':_0x4282bf(0x4a1),'QiUpG':_0x4282bf(0x6e6),'eaHyB':_0x4282bf(0x4de),'bYgkk':_0x4282bf(0x5f4),'yuBIG':function(_0x17e30d,_0x5de5e4){return _0x17e30d+_0x5de5e4;},'HysZT':_0x4282bf(0x5fe),'qRgYo':function(_0x300759,_0x313455,_0xaedfd9){return _0x300759(_0x313455,_0xaedfd9);},'gQPbF':_0x4282bf(0x7be),'ZyfzQ':function(_0x51568b,_0x395d4e,_0x275ff5){return _0x51568b(_0x395d4e,_0x275ff5);},'hKSRX':function(_0x50f05a,_0x595fb4,_0x58736b){return _0x50f05a(_0x595fb4,_0x58736b);},'Rrtat':function(_0x2121f1,_0x489f2b){return _0x2121f1&&_0x489f2b;},'fBPds':_0x4282bf(0x6e0),'eDJRq':_0x4282bf(0x75e),'WnDeU':_0x4282bf(0x208),'BWPTN':_0x4282bf(0x4a3),'jgHaC':function(_0x418a35,_0x3031d2,_0x5adc7f){return _0x418a35(_0x3031d2,_0x5adc7f);},'hXdYi':function(_0x33fcb3,_0x376ca0,_0x18cb7b){return _0x33fcb3(_0x376ca0,_0x18cb7b);},'CfGsT':_0x4282bf(0x3b5),'VIAWH':function(_0x2b53ef,_0x31d3a3){return _0x2b53ef!==_0x31d3a3;},'udDnr':function(_0x12c859,_0x41fdc3){return _0x12c859!==_0x41fdc3;},'GoGtU':_0x4282bf(0x8e0),'SNARn':_0x4282bf(0x7a5),'Racoc':function(_0x30007e,_0x2259dd){return _0x30007e(_0x2259dd);},'rTLiH':_0x4282bf(0x254),'LMejn':_0x4282bf(0x189)};return new Promise(_0x10d218=>{const _0x8b99d2=_0x4282bf,_0x43c2db={'MKQmk':function(_0x2dd78c,_0x51613c){return _0x6949e8['jGCmj'](_0x2dd78c,_0x51613c);},'EExge':_0x8b99d2(0x1af),'nKMWg':function(_0x1041bf,_0x4af9e1){return _0x1041bf===_0x4af9e1;},'JesIn':function(_0x29d568,_0x3c9c88){const _0x552363=_0x8b99d2;return _0x6949e8[_0x552363(0x2b2)](_0x29d568,_0x3c9c88);}};if(_0x6949e8[_0x8b99d2(0x227)](_0x8b99d2(0x1b1),_0x6949e8[_0x8b99d2(0x386)])){const _0x2c0139=_0x198a60[_0x8b99d2(0x3a1)](_0x3e238a[_0x8b99d2(0x2a7)]);_0x2c0139&&dGnZxE[_0x8b99d2(0x44a)](_0x2c0139[_0x8b99d2(0x890)],dGnZxE[_0x8b99d2(0x788)])&&(_0x1b25f5[_0x8b99d2(0x890)]=dGnZxE[_0x8b99d2(0x788)],_0x2c0139[_0x8b99d2(0x741)]&&(_0x325880[_0x8b99d2(0x741)]=_0x2c0139[_0x8b99d2(0x741)]));}else{console[_0x8b99d2(0x44c)]('📥\x20Installing\x20UIAutomator2\x20on\x20'+_0x23c777+'...');const {execSync:_0x505701}=require('child_process'),_0x895705=_0x6949e8[_0x8b99d2(0x1ab)](require,'os'),_0x450da6=_0x6949e8['PCzDz'](require,_0x6949e8[_0x8b99d2(0x38f)]);try{if(_0x6949e8[_0x8b99d2(0x622)](_0x6949e8[_0x8b99d2(0x37e)],_0x8b99d2(0x461))){const _0x5250b7=[_0x450da6[_0x8b99d2(0x184)](__dirname,_0x6949e8['cekot']),_0x450da6[_0x8b99d2(0x184)](__dirname,_0x8b99d2(0x8d5)),_0x450da6[_0x8b99d2(0x184)](__dirname,'../../../apks'),_0x450da6[_0x8b99d2(0x184)](_0x6949e8[_0x8b99d2(0x4e7)](_0x505701,_0x6949e8[_0x8b99d2(0x7e0)],{'encoding':_0x6949e8[_0x8b99d2(0x7c6)]})[_0x8b99d2(0x878)](),_0x6949e8['dAogm']),_0x450da6[_0x8b99d2(0x184)](_0x895705['homedir'](),_0x8b99d2(0x3eb),_0x6949e8[_0x8b99d2(0x6bd)],_0x6949e8[_0x8b99d2(0x1e3)],_0x6949e8['iDIzp'],_0x6949e8[_0x8b99d2(0x80b)],_0x6949e8[_0x8b99d2(0x5f1)]),_0x6949e8[_0x8b99d2(0x40f)](_0x505701(_0x6949e8['QYstP'],{'encoding':_0x6949e8[_0x8b99d2(0x7c6)]})[_0x8b99d2(0x878)](),_0x6949e8['HysZT']),_0x6949e8['qRgYo'](_0x505701,_0x6949e8[_0x8b99d2(0x7e0)],{'encoding':_0x6949e8[_0x8b99d2(0x7c6)]})[_0x8b99d2(0x878)]()+_0x6949e8[_0x8b99d2(0x6f9)]];let _0x3bd4a7=null,_0x5ec767=null,_0x21c83c=null;for(const _0x5e8c8b of _0x5250b7){console['log'](_0x8b99d2(0x7ee)+_0x5e8c8b);try{let _0x43bb33=_0x6949e8[_0x8b99d2(0x4e7)](_0x505701,_0x8b99d2(0x328)+_0x5e8c8b+_0x8b99d2(0x72d),{'encoding':_0x6949e8['keApG']})[_0x8b99d2(0x878)]();if(!_0x43bb33){const _0x3478cb={};_0x3478cb[_0x8b99d2(0x873)]=_0x8b99d2(0x6ba),_0x43bb33=_0x6949e8[_0x8b99d2(0x526)](_0x505701,_0x8b99d2(0x328)+_0x5e8c8b+'\x22/appium-uiautomator2-server.apk\x202>/dev/null\x20||\x20echo\x20\x22\x22',_0x3478cb)['trim']();}const _0x6a186f={};_0x6a186f[_0x8b99d2(0x873)]=_0x8b99d2(0x6ba);const _0x1ec2ed=_0x6949e8[_0x8b99d2(0x2b7)](_0x505701,_0x8b99d2(0x328)+_0x5e8c8b+_0x8b99d2(0x5f6),_0x6a186f)[_0x8b99d2(0x878)]();if(_0x6949e8[_0x8b99d2(0x6b9)](_0x43bb33,_0x1ec2ed)){if(_0x6949e8[_0x8b99d2(0x866)]===_0x6949e8[_0x8b99d2(0x866)]){_0x3bd4a7=_0x43bb33,_0x5ec767=_0x1ec2ed,_0x21c83c=_0x5e8c8b,console['log'](_0x8b99d2(0x1df)+_0x21c83c),console[_0x8b99d2(0x44c)](_0x8b99d2(0x43e)+_0x450da6[_0x8b99d2(0x840)](_0x3bd4a7)),console[_0x8b99d2(0x44c)]('\x20\x20\x20Test\x20APK:\x20'+_0x450da6[_0x8b99d2(0x840)](_0x5ec767));break;}else return _0x351923[_0x8b99d2(0x5d6)]('❌\x20No\x20devices\x20found\x20for:\x20['+_0x44d927[_0x8b99d2(0x184)](',\x20')+']'),mURgLT[_0x8b99d2(0x2b2)](_0x45baad,{'success':![],'error':mURgLT[_0x8b99d2(0x69c)]});}}catch(_0x1fcb87){if(_0x6949e8[_0x8b99d2(0x22f)]!==_0x8b99d2(0x839))continue;else{_0x1ffb6a['error'](_0x8b99d2(0x7b1),_0x5d7d04);const _0x512a48={};_0x512a48[_0x8b99d2(0x6ed)]=![],_0x512a48[_0x8b99d2(0x5d6)]=_0x1980ee[_0x8b99d2(0x5d4)],_0x2bfced[_0x8b99d2(0x890)](0x1f4)[_0x8b99d2(0x8bb)](_0x512a48);}}}if(_0x3bd4a7&&_0x5ec767){if(_0x6949e8[_0x8b99d2(0x227)](_0x6949e8[_0x8b99d2(0x7cc)],_0x6949e8['BWPTN'])){const _0x3ecae0=_0x5cedb0['split']('.');if(dGnZxE[_0x8b99d2(0x579)](_0x3ecae0[_0x8b99d2(0x3c8)],0x2)){const [_0x52f58c,_0x4bcbb7]=_0x3ecae0;if(!_0x4066a7[_0x52f58c])_0x5dcda3[_0x52f58c]={};_0x5f0bf9[_0x52f58c][_0x4bcbb7]=_0x236cfe;}else{if(!_0x3cc581[_0x2c4dc7])_0x3cc2ed[_0x127a43]={};_0x4a0714[_0xc02d52][_0x8b99d2(0x3ee)]=_0x1ffa8f;}}else{console[_0x8b99d2(0x44c)](_0x8b99d2(0x42a)+_0x3bd4a7);const _0x1631da=_0x6949e8['jgHaC'](_0x505701,'adb\x20-s\x20'+_0x57a37b+'\x20install\x20-r\x20\x22'+_0x3bd4a7+'\x22\x202>&1',{'encoding':_0x6949e8[_0x8b99d2(0x7c6)]});console[_0x8b99d2(0x44c)](_0x1631da),console['log']('📦\x20Installing\x20test\x20APK:\x20'+_0x5ec767);const _0x2510b9={};_0x2510b9[_0x8b99d2(0x873)]='utf-8';const _0x3407c=_0x6949e8[_0x8b99d2(0x360)](_0x505701,_0x8b99d2(0x457)+_0x57a37b+_0x8b99d2(0x7b0)+_0x5ec767+_0x8b99d2(0x3be),_0x2510b9);console['log'](_0x3407c),console[_0x8b99d2(0x44c)](_0x8b99d2(0x269)+_0x23c777),_0x6949e8[_0x8b99d2(0x1ab)](_0x10d218,{'success':!![],'message':_0x6949e8['CfGsT']});}}else{if(_0x6949e8[_0x8b99d2(0x3a6)]('MXGGV',_0x8b99d2(0x29a)))_0x473001[_0x8b99d2(0x890)]=dGnZxE['EExge'],_0x1b7538['sessionId']&&(_0x381563[_0x8b99d2(0x741)]=_0x57545b[_0x8b99d2(0x741)]);else{console[_0x8b99d2(0x44c)](_0x8b99d2(0x3b1)),console[_0x8b99d2(0x44c)](_0x8b99d2(0x5eb),_0x5250b7);try{console[_0x8b99d2(0x44c)](_0x8b99d2(0x58b));const _0x26d8bf={};_0x26d8bf['encoding']=_0x6949e8['keApG'];const _0x18695a=_0x505701('appium\x20driver\x20install\x20uiautomator2\x202>&1',_0x26d8bf);console['log'](_0x18695a);const _0x4df92c={};_0x4df92c['success']=![],_0x4df92c[_0x8b99d2(0x5d4)]=_0x8b99d2(0x395),_0x6949e8[_0x8b99d2(0x1ab)](_0x10d218,_0x4df92c);}catch(_0x1cbc53){_0x6949e8[_0x8b99d2(0x2b3)](_0x6949e8[_0x8b99d2(0x770)],_0x6949e8['SNARn'])?_0x6949e8[_0x8b99d2(0x468)](_0x10d218,{'success':![],'message':_0x6949e8[_0x8b99d2(0x5a9)]}):(dGnZxE[_0x8b99d2(0x320)](_0x2a14c2,_0x8b99d2(0x457)+_0x32261d+_0x8b99d2(0x3e0)+_0x16ab3a[_0x8b99d2(0x8d0)]),_0x1dbb93[_0x8b99d2(0x44c)](_0x8b99d2(0x601)+_0x76c822));}}}}else _0x16b906[_0x8b99d2(0x584)](_0x147542[_0x8b99d2(0x19a)],_0x6949e8['bMKEZ']),_0x3fa2a4[_0x8b99d2(0x44c)](_0x8b99d2(0x662)+_0x16249b+_0x8b99d2(0x7b4)+_0x5f2d2b[_0x8b99d2(0x19a)]+')');}catch(_0x2135d3){if(_0x6949e8[_0x8b99d2(0x3a6)](_0x6949e8['LMejn'],_0x6949e8[_0x8b99d2(0x714)])){const _0x5ade23=_0x4f48f8[_0x8b99d2(0x260)](/^(.+?)\s+-\s+(.+?)$/);return _0x5ade23?{'id':_0x5ade23[0x1]['trim'](),'name':_0x5ade23[0x2][_0x8b99d2(0x878)]()}:null;}else{console[_0x8b99d2(0x5d6)](_0x8b99d2(0x805)+_0x2135d3[_0x8b99d2(0x5d4)]);const _0x79ad9b={};_0x79ad9b[_0x8b99d2(0x6ed)]=![],_0x79ad9b[_0x8b99d2(0x5d4)]='Failed\x20to\x20install\x20UIAutomator2:\x20'+_0x2135d3[_0x8b99d2(0x5d4)],_0x6949e8[_0x8b99d2(0x1ab)](_0x10d218,_0x79ad9b);}}}});}async function connectToDevice(_0x3c1670){const _0xabbdb1=_0x28fe54,_0x3b1be9={'tSqZq':function(_0x248807,_0x4f050d){return _0x248807===_0x4f050d;},'aHweU':'htovr','iZKjm':function(_0x39afde,_0x23b16b){return _0x39afde+_0x23b16b;},'AfwkU':'oxTsF','kFhws':'\x0a⏹️\x20\x20Replay\x20aborted\x20by\x20user\x0a','SAHIn':_0xabbdb1(0x7ab),'XbQas':_0xabbdb1(0x375),'MbDmM':'devices_updated','XGPho':_0xabbdb1(0x187),'BozjN':'VciZC','PBNvX':function(_0x43b59a,_0x27ac0a,_0x3a6d08,_0xa41460,_0x3917ca){return _0x43b59a(_0x27ac0a,_0x3a6d08,_0xa41460,_0x3917ca);},'nTSzz':_0xabbdb1(0x51a),'RsGkV':_0xabbdb1(0x48a),'lcmbr':function(_0x1883f1,_0x19c908){return _0x1883f1!==_0x19c908;},'WMxyt':_0xabbdb1(0x530),'MLSAl':_0xabbdb1(0x465),'TQApq':'LPnQM','JeQxO':_0xabbdb1(0x831),'JsYwI':function(_0x4858d0,_0x47d89a){return _0x4858d0(_0x47d89a);},'TlINU':'axios','rNIaF':function(_0x4d64fc,_0x3945ff,_0x2f2897){return _0x4d64fc(_0x3945ff,_0x2f2897);},'gGrog':_0xabbdb1(0x75b),'QILdm':_0xabbdb1(0x724),'sgygt':_0xabbdb1(0x1af),'hmmUW':_0xabbdb1(0x476),'VKfnY':_0xabbdb1(0x410),'ZMVFd':_0xabbdb1(0x81e),'pjHGE':_0xabbdb1(0x846),'hklTt':_0xabbdb1(0x380),'kvIFa':function(_0x5b33f6,_0x9edfdb){return _0x5b33f6!==_0x9edfdb;},'qyvqn':_0xabbdb1(0x2da),'DJWhw':'list','FHlyJ':_0xabbdb1(0x46a),'XJxwx':'close','LtJld':function(_0x582d0c,_0x1e364f){return _0x582d0c===_0x1e364f;},'hxief':_0xabbdb1(0x1f2),'ZTLGX':_0xabbdb1(0x7ff),'kcnEC':_0xabbdb1(0x19c),'RBiBE':function(_0x557cfe,_0x26c105){return _0x557cfe===_0x26c105;},'yEKUg':_0xabbdb1(0x674),'VmWGq':'shell','gacfU':_0xabbdb1(0x6ab),'oQnvJ':_0xabbdb1(0x2ae),'LWCDc':function(_0x25d290,_0x4d6ad3){return _0x25d290!==_0x4d6ad3;},'DsqjD':_0xabbdb1(0x3f2),'yLBzj':'adb','NsMha':'connect','DLqlg':function(_0x30e6c3,_0x20c93a){return _0x30e6c3(_0x20c93a);},'yAehm':function(_0x1f4a64,_0x128488){return _0x1f4a64(_0x128488);},'ISdqT':function(_0x2d07ed,_0x40ba32){return _0x2d07ed===_0x40ba32;},'RnfTN':'\x22state\x22','WTqiF':function(_0x4ebbb2,_0x4dedcb,_0x46db97){return _0x4ebbb2(_0x4dedcb,_0x46db97);},'dBHcn':'Ybjxa','gRcAh':function(_0x14d1ac,_0xdd7be4){return _0x14d1ac===_0xdd7be4;},'cZAfL':_0xabbdb1(0x6a1),'jkiaC':_0xabbdb1(0x28a),'eDLkz':_0xabbdb1(0x33b),'cUUiZ':_0xabbdb1(0x4d7),'uHUVA':'Downloads/WebDriverAgent-10.2.1','cvHdc':_0xabbdb1(0x19a),'dMalI':'test','vVtwD':'-project','lJevV':_0xabbdb1(0x8be),'ScEUN':'-scheme','pyxtv':_0xabbdb1(0x589),'XhfZC':_0xabbdb1(0x464),'TegVY':_0xabbdb1(0x3fe),'yWulL':_0xabbdb1(0x51e),'xtaFn':_0xabbdb1(0x5d6),'iNfGY':_0xabbdb1(0x3df),'IMxiS':_0xabbdb1(0x3ba),'Fdxyu':function(_0x430130,_0xaca5f9){return _0x430130===_0xaca5f9;},'AgHAv':_0xabbdb1(0x554),'RdSwE':'Replay\x20started','xjtft':_0xabbdb1(0x5b9),'KveWL':_0xabbdb1(0x653),'pOmrh':function(_0x57fa67,_0x2100b4){return _0x57fa67!==_0x2100b4;},'uNysI':_0xabbdb1(0x4bf),'QYCDM':_0xabbdb1(0x1ed),'bbFMD':_0xabbdb1(0x4ae),'UDyuA':function(_0x140ec9){return _0x140ec9();},'YYGaP':_0xabbdb1(0x8b5),'DyYBL':function(_0x32a71f,_0x3c7b21,_0x227f04){return _0x32a71f(_0x3c7b21,_0x227f04);},'ckwKh':_0xabbdb1(0x46f),'VYxUV':_0xabbdb1(0x27c),'ciIgk':_0xabbdb1(0x183),'tfZGA':_0xabbdb1(0x76e),'dDSVB':function(_0x407a9a,_0x37c86f){return _0x407a9a===_0x37c86f;},'BaKGg':_0xabbdb1(0x59a),'KORsh':_0xabbdb1(0x448),'NgYtY':_0xabbdb1(0x6c4),'TfSbh':_0xabbdb1(0x5e3),'DWvvM':_0xabbdb1(0x649),'EjzZF':_0xabbdb1(0x28c),'wMcXx':'YWpZd','pVuZe':_0xabbdb1(0x1ce),'tWHld':'XnmUr','WwTJL':_0xabbdb1(0x6d8),'vTYxq':function(_0x38d608,_0x13f7c5,_0x166412,_0x15a0bd){return _0x38d608(_0x13f7c5,_0x166412,_0x15a0bd);},'RlSLt':_0xabbdb1(0x7ea),'cROQc':function(_0x4b3f00,_0x30f640){return _0x4b3f00(_0x30f640);},'XREhI':function(_0x39396a,_0xb1f3c2){return _0x39396a(_0xb1f3c2);},'uVzFD':function(_0x10e266,_0x2e8283){return _0x10e266!==_0x2e8283;},'wCids':_0xabbdb1(0x809),'EaIXZ':_0xabbdb1(0x695),'lPUlA':_0xabbdb1(0x6ba),'CpVAm':function(_0x1bbc32,_0x105c17){return _0x1bbc32>=_0x105c17;},'WqiWx':_0xabbdb1(0x377),'OZWph':_0xabbdb1(0x57f),'NGZrK':_0xabbdb1(0x23c),'LaChN':function(_0x2ef8e9,_0x414d32){return _0x2ef8e9===_0x414d32;},'pmiyu':_0xabbdb1(0x88d),'msRcK':_0xabbdb1(0x75f),'aJWAw':function(_0x54fdec,_0xb6ff89,_0x12e70b){return _0x54fdec(_0xb6ff89,_0x12e70b);},'mYPLK':_0xabbdb1(0x388),'cxpid':_0xabbdb1(0x3b2),'WlHPP':function(_0x439db6,_0x4c45d2){return _0x439db6!==_0x4c45d2;},'lVzJY':_0xabbdb1(0x64d),'aeBxU':_0xabbdb1(0x1bc),'oEIFu':_0xabbdb1(0x8c3)};return new Promise(async(_0x2e158c,_0x234820)=>{const _0x25a06b=_0xabbdb1,_0x639cf9={'oANav':function(_0x53e491,_0x2338d5){return _0x3b1be9['ISdqT'](_0x53e491,_0x2338d5);},'RLKkG':_0x3b1be9['MbDmM'],'sraFP':_0x3b1be9['iNfGY'],'OrAdN':_0x3b1be9[_0x25a06b(0x89d)],'tVEJf':function(_0x15b572,_0x240ed1){return _0x3b1be9['Fdxyu'](_0x15b572,_0x240ed1);},'ihVwl':_0x3b1be9[_0x25a06b(0x576)],'mVUeL':_0x3b1be9[_0x25a06b(0x525)],'oRyRC':_0x3b1be9[_0x25a06b(0x78d)],'oJxSa':_0x3b1be9[_0x25a06b(0x845)],'BQZwh':function(_0x4434d8,_0x38f104){return _0x3b1be9['pOmrh'](_0x4434d8,_0x38f104);},'YlMdA':_0x3b1be9['uNysI'],'FTyrv':_0x3b1be9[_0x25a06b(0x581)],'QTlEk':_0x3b1be9[_0x25a06b(0x74c)],'kyviv':function(_0x4d478e){const _0xb0fe3=_0x25a06b;return _0x3b1be9[_0xb0fe3(0x50e)](_0x4d478e);},'uTLnQ':_0x3b1be9['YYGaP'],'PbKPi':function(_0x1fb6c0,_0x595802,_0x559e3d){const _0x298da0=_0x25a06b;return _0x3b1be9[_0x298da0(0x4e5)](_0x1fb6c0,_0x595802,_0x559e3d);},'jAPxp':_0x3b1be9['ckwKh'],'xOTrx':_0x3b1be9[_0x25a06b(0x229)],'qMkDv':_0x25a06b(0x8cb),'SYgNB':_0x3b1be9[_0x25a06b(0x5a2)],'qGGMl':_0x3b1be9['tfZGA'],'qNcWA':_0x3b1be9[_0x25a06b(0x65c)],'ACMgu':function(_0x55a9cf,_0x43a81e){const _0xbb2a9b=_0x25a06b;return _0x3b1be9[_0xbb2a9b(0x3c9)](_0x55a9cf,_0x43a81e);},'faEdh':_0x3b1be9[_0x25a06b(0x2bf)],'qlkKz':_0x3b1be9[_0x25a06b(0x605)],'uCeXK':_0x3b1be9[_0x25a06b(0x45b)],'PHpZL':_0x3b1be9[_0x25a06b(0x72c)],'SaXPP':'warning:','uBFSz':_0x3b1be9[_0x25a06b(0x311)],'BNkGn':function(_0x397c58,_0x3d2c1b,_0x476255){return _0x397c58(_0x3d2c1b,_0x476255);},'TTjsi':_0x3b1be9[_0x25a06b(0x854)],'FRSAN':_0x3b1be9[_0x25a06b(0x644)],'UXUvJ':_0x25a06b(0x26a),'ZGGWY':_0x3b1be9[_0x25a06b(0x482)],'lWyGq':function(_0x50d644,_0x6f042c){return _0x50d644!==_0x6f042c;},'oeCjW':_0x3b1be9[_0x25a06b(0x3ab)],'qNkpP':_0x25a06b(0x409),'jPckd':_0x3b1be9['sgygt'],'xpAQv':_0x3b1be9['tWHld'],'RLPuo':function(_0x397357,_0x101bda,_0x874208){return _0x397357(_0x101bda,_0x874208);},'RkvtT':_0x3b1be9[_0x25a06b(0x3ec)],'IMaCE':function(_0x4c4a5e,_0xd1e159){return _0x3b1be9['yAehm'](_0x4c4a5e,_0xd1e159);},'TwPat':_0x25a06b(0x37d),'uBbAw':function(_0x5c43e3,_0x536a96,_0x2ddecc,_0x37dece){const _0x11a8f5=_0x25a06b;return _0x3b1be9[_0x11a8f5(0x89a)](_0x5c43e3,_0x536a96,_0x2ddecc,_0x37dece);},'LULVp':_0x3b1be9[_0x25a06b(0x332)],'SEufP':_0x3b1be9[_0x25a06b(0x79d)],'Xcoxw':'WebDriverAgent.xcodeproj','lBQze':_0x3b1be9['ScEUN'],'IfMQS':_0x25a06b(0x464),'QsBTV':_0x3b1be9[_0x25a06b(0x2ba)],'NLqSv':'ignore','xdyfS':_0x25a06b(0x51e),'mcrOM':_0x25a06b(0x46a),'VPjHa':_0x3b1be9[_0x25a06b(0x733)],'Elsxf':function(_0x5abe53,_0x36e114,_0x160a1f,_0x335d98){return _0x5abe53(_0x36e114,_0x160a1f,_0x335d98);},'qDgKi':_0x3b1be9[_0x25a06b(0x7d0)],'eVIWV':function(_0x366cff,_0xda355e){const _0x214350=_0x25a06b;return _0x3b1be9[_0x214350(0x5b8)](_0x366cff,_0xda355e);},'XlZvu':function(_0x405c19,_0x5723cc){return _0x405c19(_0x5723cc);},'loymp':function(_0x2525f7,_0x54534a){const _0x2923f5=_0x25a06b;return _0x3b1be9[_0x2923f5(0x2e6)](_0x2525f7,_0x54534a);},'TIbvw':function(_0x2dc20d,_0x1ed02f){const _0x290664=_0x25a06b;return _0x3b1be9[_0x290664(0x1c5)](_0x2dc20d,_0x1ed02f);},'nLqjF':_0x3b1be9[_0x25a06b(0x26e)],'kvBsA':_0x3b1be9[_0x25a06b(0x52d)],'BpvKU':'command_output','ZolFC':_0x3b1be9[_0x25a06b(0x53e)],'MrbGn':function(_0x2cf65c,_0x476227){const _0x3a24dd=_0x25a06b;return _0x3b1be9[_0x3a24dd(0x4d9)](_0x2cf65c,_0x476227);},'LHLzz':_0x3b1be9[_0x25a06b(0x6a0)],'xeQWY':function(_0x289537,_0x5c9b1a){return _0x289537===_0x5c9b1a;},'wSEFC':function(_0xcf9890,_0x2560b2){const _0x3c0a96=_0x25a06b;return _0x3b1be9[_0x3c0a96(0x5b8)](_0xcf9890,_0x2560b2);},'UFapG':_0x3b1be9['OZWph'],'GIHiw':function(_0x51ade4,_0x17a6bb){const _0x3ed30a=_0x25a06b;return _0x3b1be9[_0x3ed30a(0x4af)](_0x51ade4,_0x17a6bb);},'zHaJd':_0x3b1be9[_0x25a06b(0x1e8)]};if(_0x3b1be9['pOmrh'](_0x25a06b(0x205),_0x25a06b(0x252))){const {name:_0x38cf3f,udid:_0x3ca792,type:_0xef05bf,ip:_0x5bf1f2,platform:_0x39e635}=_0x3c1670;console[_0x25a06b(0x44c)]('Connecting\x20to\x20'+_0x38cf3f+'\x20('+_0xef05bf+_0x25a06b(0x692)+_0x39e635+_0x25a06b(0x6a4));if(_0x3b1be9['LaChN'](_0x39e635,_0x3b1be9[_0x25a06b(0x8c7)])){if(_0x3b1be9[_0x25a06b(0x806)](_0x3b1be9[_0x25a06b(0x253)],_0x3b1be9[_0x25a06b(0x253)])){console['log'](_0x25a06b(0x309)+_0x38cf3f);const _0x4ca87e=_0x3b1be9[_0x25a06b(0x1f5)](spawn,_0x3b1be9[_0x25a06b(0x460)],[_0x3b1be9[_0x25a06b(0x69a)]]);let _0x22eee9='';_0x4ca87e[_0x25a06b(0x3d3)]['on'](_0x3b1be9[_0x25a06b(0x39b)],_0x3b3098=>{const _0x374906=_0x25a06b;if(_0x3b1be9[_0x374906(0x1bd)](_0x3b1be9[_0x374906(0x1fd)],_0x3b1be9[_0x374906(0x1fd)]))_0x22eee9+=_0x3b3098[_0x374906(0x67c)]();else{const _0x4f0a51={};return _0x4f0a51[_0x374906(0x6ed)]=![],_0x4f0a51[_0x374906(0x5d6)]='Auto-connection\x20failed:\x20'+_0x2341a6[_0x374906(0x5d4)],_0x47a912['status'](0x1f4)[_0x374906(0x8bb)](_0x4f0a51);}}),_0x4ca87e['on'](_0x3b1be9[_0x25a06b(0x5d2)],async _0x3cd239=>{const _0x1b727c=_0x25a06b,_0x2e8947={'iqceu':function(_0x176191,_0x50c624){const _0x3ba101=_0x2d26;return _0x3b1be9[_0x3ba101(0x2ef)](_0x176191,_0x50c624);},'RcciH':function(_0x48ba9a,_0x29645a){const _0x26b95d=_0x2d26;return _0x3b1be9[_0x26b95d(0x1bd)](_0x48ba9a,_0x29645a);},'phnlH':_0x3b1be9[_0x1b727c(0x172)],'RDATX':_0x3b1be9['kFhws'],'HziHI':_0x3b1be9[_0x1b727c(0x28e)],'yfoQH':_0x3b1be9[_0x1b727c(0x620)],'sUlrT':_0x3b1be9['MbDmM'],'eLTGu':_0x3b1be9[_0x1b727c(0x266)],'CAxYm':_0x3b1be9[_0x1b727c(0x498)],'Wmdmm':function(_0x3d0354,_0x399e25){return _0x3d0354===_0x399e25;},'qRIOG':function(_0x648d0,_0x378f67,_0x3a4401,_0xdca7b,_0x1df330){const _0x393a38=_0x1b727c;return _0x3b1be9[_0x393a38(0x175)](_0x648d0,_0x378f67,_0x3a4401,_0xdca7b,_0x1df330);},'XkWal':_0x3b1be9['nTSzz'],'Gqaxj':_0x3b1be9[_0x1b727c(0x527)],'TYfzF':function(_0x59e818,_0x4e87e7){return _0x3b1be9['lcmbr'](_0x59e818,_0x4e87e7);},'hPKvY':_0x3b1be9[_0x1b727c(0x280)],'tGcPg':_0x3b1be9[_0x1b727c(0x678)],'yvTVz':'VTuSt','slwiY':_0x3b1be9[_0x1b727c(0x36b)],'VlTEm':'UFEcI','zDSNt':_0x3b1be9[_0x1b727c(0x38c)],'csNXk':function(_0x32def1,_0x309350){const _0x38ebfb=_0x1b727c;return _0x3b1be9[_0x38ebfb(0x425)](_0x32def1,_0x309350);},'bJRmh':_0x3b1be9[_0x1b727c(0x555)],'tXhUI':function(_0x4120ae,_0x230670,_0x39063b){const _0x12f9e9=_0x1b727c;return _0x3b1be9[_0x12f9e9(0x6c6)](_0x4120ae,_0x230670,_0x39063b);},'aNIFN':_0x3b1be9[_0x1b727c(0x713)],'Ohsbj':_0x3b1be9[_0x1b727c(0x3e7)],'VRjai':_0x3b1be9[_0x1b727c(0x4f2)],'tQeZz':_0x3b1be9[_0x1b727c(0x52b)],'yTDCi':_0x1b727c(0x32a),'qHcYv':function(_0x3f40eb,_0x2bddab){return _0x3f40eb(_0x2bddab);},'lsjxg':_0x3b1be9['VKfnY'],'fhdRt':_0x3b1be9[_0x1b727c(0x442)],'NYNKY':function(_0x4f87aa,_0xc77323){return _0x4f87aa===_0xc77323;},'cTDNC':_0x3b1be9[_0x1b727c(0x832)],'VjKmD':_0x3b1be9['hklTt'],'wJIaT':function(_0x2e6861,_0x4c9465){return _0x3b1be9['kvIFa'](_0x2e6861,_0x4c9465);},'AQFkr':_0x3b1be9[_0x1b727c(0x65c)],'oqSkH':_0x1b727c(0x339),'EPmgt':_0x3b1be9['DJWhw'],'KYOTX':_0x1b727c(0x26c),'QrnwB':_0x3b1be9[_0x1b727c(0x39b)],'GiApX':_0x3b1be9[_0x1b727c(0x5d2)],'BunQq':function(_0x623727,_0x4c2dee){const _0x22c3ce=_0x1b727c;return _0x3b1be9[_0x22c3ce(0x203)](_0x623727,_0x4c2dee);},'FYyml':_0x3b1be9[_0x1b727c(0x796)],'cpuLA':_0x1b727c(0x302)};if(_0x3b1be9[_0x1b727c(0x8af)](_0x1b727c(0x7ff),_0x3b1be9[_0x1b727c(0x1a8)])){const _0x4a9374={};_0x4a9374[_0x1b727c(0x670)]=function(_0x4b0cbb,_0x33f963){return _0x4b0cbb!==_0x33f963;};const _0x55894c=_0x4a9374,_0x5d9cbc=_0x30ff7a[_0x1b727c(0x394)]('\x0a')[_0x1b727c(0x6fc)](_0x4071a3=>{const _0xdd9240=_0x1b727c,[_0x344cf3]=_0x4071a3[_0xdd9240(0x394)](':');return _0x4071a3[_0xdd9240(0x878)]()&&_0x55894c[_0xdd9240(0x670)](_0x344cf3,_0x3e8052);});return _0x5d9cbc[_0x1b727c(0x80f)](_0x47735a+':'+_0x4835cc),_0x455dc6[_0x1b727c(0x188)](_0x32e4fe,BgXpCr['iqceu'](_0x5d9cbc[_0x1b727c(0x184)]('\x0a'),'\x0a'));}else{const _0x597e6d=_0x22eee9[_0x1b727c(0x1bf)](_0x3ca792[_0x1b727c(0x8e7)](_0x3b1be9[_0x1b727c(0x546)],''))||_0x22eee9[_0x1b727c(0x1bf)](_0x3ca792);if(_0x597e6d){if(_0x3b1be9[_0x1b727c(0x6f5)](_0x1b727c(0x674),_0x3b1be9[_0x1b727c(0x3a2)])){console[_0x1b727c(0x44c)](_0x1b727c(0x749)+_0x38cf3f+_0x1b727c(0x29d));const _0x5b6416=connectedDevices[_0x1b727c(0x7e3)](_0x1b32b4=>_0x1b32b4[_0x1b727c(0x361)]===_0x38cf3f);_0x3b1be9[_0x1b727c(0x4c9)](_0x5b6416,-0x1)&&(connectedDevices[_0x5b6416][_0x1b727c(0x890)]=_0x3b1be9[_0x1b727c(0x65c)]);wss[_0x1b727c(0x7e9)]['forEach'](_0x2c4955=>{const _0xf15301=_0x1b727c;if(_0x639cf9[_0xf15301(0x2d7)](_0x2c4955[_0xf15301(0x45e)],WebSocket['OPEN'])){const _0xef1e62={};_0xef1e62['type']=_0x639cf9[_0xf15301(0x1f3)],_0xef1e62[_0xf15301(0x388)]=connectedDevices,_0x2c4955[_0xf15301(0x550)](JSON[_0xf15301(0x19f)](_0xef1e62));}}),console[_0x1b727c(0x44c)](_0x1b727c(0x893)+_0x38cf3f+'...');const _0x46558f=_0x3b1be9[_0x1b727c(0x6c6)](spawn,_0x1b727c(0x339),['-s',_0x3ca792,_0x3b1be9[_0x1b727c(0x58a)],'pm',_0x1b727c(0x6ce),_0x1b727c(0x26c),_0x3b1be9[_0x1b727c(0x678)]]);let _0x440da5='';_0x46558f[_0x1b727c(0x3d3)]['on'](_0x1b727c(0x46a),_0x3eb72a=>{const _0x189871=_0x1b727c;if(_0x2e8947[_0x189871(0x5b7)](_0x2e8947[_0x189871(0x752)],'oxTsF'))_0x440da5+=_0x3eb72a[_0x189871(0x67c)]();else{if(!_0x1ded7d[_0x52f3f2])_0x1266d4[_0x48595a]={};_0x288a09[_0x5274fe][_0x189871(0x3ee)]=_0x258227;}}),_0x46558f['on'](_0x3b1be9['XJxwx'],async()=>{const _0x291644=_0x1b727c,_0xb18e80={};_0xb18e80[_0x291644(0x835)]=_0x291644(0x2da),_0xb18e80[_0x291644(0x75d)]=_0x2e8947['Gqaxj'],_0xb18e80[_0x291644(0x4bc)]='devices_updated';const _0x11d747=_0xb18e80;if(_0x2e8947['TYfzF'](_0x2e8947[_0x291644(0x592)],_0x2e8947[_0x291644(0x592)])){_0x27bccb['log'](_0x2e8947[_0x291644(0x669)]);if(_0x7cd415){const _0x1746ce={};_0x1746ce[_0x291644(0x185)]=_0x2e8947['HziHI'],_0x1746ce[_0x291644(0x46a)]=_0x2e8947[_0x291644(0x765)],_0x1746ce[_0x291644(0x388)]=_0x511d45,_0x4193cc['send'](_0x505bca[_0x291644(0x19f)](_0x1746ce));}_0x20986c=![];throw new _0x31dd7b(_0x291644(0x8a7));}else{const _0x289acc=_0x440da5['includes'](_0x2e8947[_0x291644(0x627)]);if(!_0x289acc){if(_0x2e8947[_0x291644(0x68d)](_0x2e8947[_0x291644(0x439)],_0x2e8947[_0x291644(0x2f7)]))_0xc4642f['log'](_0x291644(0x8e8)+_0x114714[_0x291644(0x741)]);else{console[_0x291644(0x44c)]('📥\x20UIAutomator2\x20not\x20found\x20on\x20'+_0x38cf3f+_0x291644(0x876));const _0xeb61e7=await installUIAutomator2(_0x3ca792,_0x38cf3f);if(!_0xeb61e7[_0x291644(0x6ed)]){console['log'](_0x291644(0x8c0)+_0x38cf3f);const _0x31971a={};_0x31971a['success']=!![],_0x31971a[_0x291644(0x5d4)]='Connected\x20to\x20'+_0x38cf3f+'\x20-\x20ADB\x20Ready\x20✅',_0x2e158c(_0x31971a);return;}}}else{if(_0x2e8947['RcciH'](_0x2e8947[_0x291644(0x505)],_0x2e8947[_0x291644(0x884)])){const _0x1e0ec8={};_0x1e0ec8['type']=_0x2e8947[_0x291644(0x5e1)],_0x1e0ec8[_0x291644(0x388)]=_0x24be58,_0x35313e[_0x291644(0x550)](_0x59f28f[_0x291644(0x19f)](_0x1e0ec8));}else console[_0x291644(0x44c)]('✅\x20UIAutomator2\x20already\x20installed\x20on\x20'+_0x38cf3f);}const _0x49083d=androidSessions[_0x291644(0x3a1)](_0x3ca792);if(_0x49083d){console[_0x291644(0x44c)](_0x291644(0x413)+_0x38cf3f+_0x291644(0x3d1)+_0x49083d['port']+')');try{const _0x5556ac=_0x2e8947[_0x291644(0x42b)](require,_0x2e8947['bJRmh']);await _0x5556ac['get'](_0x291644(0x196)+_0x49083d[_0x291644(0x8d0)]+_0x291644(0x23b)),console[_0x291644(0x44c)](_0x291644(0x646)+_0x38cf3f);const _0x5afa3c=connectedDevices['findIndex'](_0x4df971=>_0x4df971[_0x291644(0x361)]===_0x38cf3f);_0x2e8947['TYfzF'](_0x5afa3c,-0x1)&&(connectedDevices[_0x5afa3c][_0x291644(0x890)]='online',wss[_0x291644(0x7e9)][_0x291644(0x57c)](_0x3dd141=>{const _0x4a389c=_0x291644,_0x56ee1e={};_0x56ee1e[_0x4a389c(0x1f4)]=_0x2e8947[_0x4a389c(0x5f5)],_0x56ee1e[_0x4a389c(0x2fb)]=function(_0xf9202f,_0x59dc7d){return _0xf9202f>=_0x59dc7d;};const _0x45e541=_0x56ee1e;if(_0x2e8947[_0x4a389c(0x54a)]!==_0x4a389c(0x727)){if(_0x2e8947['Wmdmm'](_0x3dd141[_0x4a389c(0x45e)],WebSocket[_0x4a389c(0x2fc)])){const _0xa04126={};_0xa04126['type']=_0x4a389c(0x326),_0xa04126[_0x4a389c(0x388)]=connectedDevices,_0x3dd141[_0x4a389c(0x550)](JSON[_0x4a389c(0x19f)](_0xa04126));}}else{if(_0x4fc658[_0x4a389c(0x1bf)](_0x45e541[_0x4a389c(0x1f4)])){const _0x20870b=_0x222ea5[_0x4a389c(0x260)](/^(.+?)\s+-\s+(.+?)$/);return _0x20870b?{'id':_0x20870b[0x1][_0x4a389c(0x878)](),'name':_0x20870b[0x2][_0x4a389c(0x878)]()}:null;}else{if(_0x3625fd[_0x4a389c(0x1bf)](',')){const _0x1e6c63=_0x3cbdbe[_0x4a389c(0x394)](',')[_0x4a389c(0x2d1)](_0xd649ff=>_0xd649ff[_0x4a389c(0x878)]()['replace'](/"/g,''));return _0x45e541['lBsKb'](_0x1e6c63[_0x4a389c(0x3c8)],0x3)?{'id':_0x1e6c63[0x0],'name':_0x1e6c63[0x2]}:null;}else{if(_0x4c5ba8[_0x4a389c(0x260)](/^[a-zA-Z0-9.-]+$/))return{'id':_0x25f350['trim'](),'name':_0x212a71[_0x4a389c(0x878)]()};}}return null;}}));const _0x2ff865={};_0x2ff865[_0x291644(0x6ed)]=!![],_0x2ff865[_0x291644(0x5d4)]=_0x291644(0x1fb)+_0x38cf3f+_0x291644(0x556),_0x2e158c(_0x2ff865);return;}catch(_0x559f28){console['log'](_0x291644(0x583)+_0x38cf3f),androidSessions[_0x291644(0x32c)](_0x3ca792);}}console['log'](_0x291644(0x799)+_0x38cf3f+_0x291644(0x7a8));const _0x99db86=await _0x2e8947['tXhUI'](startUIAutomator2Session,_0x3ca792,_0x38cf3f);if(_0x99db86['success']){const _0x30adaa=connectedDevices[_0x291644(0x7e3)](_0x40f31e=>_0x40f31e[_0x291644(0x361)]===_0x38cf3f);if(_0x30adaa!==-0x1){if(_0x2e8947[_0x291644(0x5b7)](_0x2e8947[_0x291644(0x6e5)],_0x2e8947['Ohsbj'])){_0x206349&&_0x2e8947['qRIOG'](_0xf1c629,_0x2e4ccc,_0x27f0b7,_0x2789de,_0x56ee50);const _0x401ba3={};_0x401ba3['type']=_0x2e8947['XkWal'],_0x401ba3[_0x291644(0x792)]=_0x774b98,_0x1a1174[_0x291644(0x550)](_0x2a685b[_0x291644(0x19f)](_0x401ba3));}else connectedDevices[_0x30adaa]['status']=_0x2e8947[_0x291644(0x392)],wss[_0x291644(0x7e9)]['forEach'](_0x2d320d=>{const _0x117429=_0x291644;if(_0x11d747['RzWOr']!==_0x11d747[_0x117429(0x75d)])_0x1f3543[_0x36a1c9][_0x117429(0x890)]=GtWRDA['iiHzh'];else{if(_0x2d320d['readyState']===WebSocket[_0x117429(0x2fc)]){const _0x32e4fc={};_0x32e4fc[_0x117429(0x185)]=_0x11d747[_0x117429(0x4bc)],_0x32e4fc[_0x117429(0x388)]=connectedDevices,_0x2d320d[_0x117429(0x550)](JSON[_0x117429(0x19f)](_0x32e4fc));}}});}const _0x1d2112={};_0x1d2112['success']=!![],_0x1d2112[_0x291644(0x5d4)]=_0x291644(0x1fb)+_0x38cf3f+'\x20-\x20UIAutomator2\x20Ready\x20✅',_0x2e158c(_0x1d2112);}else{const _0x572c91={};_0x572c91[_0x291644(0x6ed)]=!![],_0x572c91[_0x291644(0x5d4)]=_0x291644(0x1fb)+_0x38cf3f+_0x291644(0x8c2),_0x2e8947[_0x291644(0x42b)](_0x2e158c,_0x572c91);}}});}else{const _0x18f103={};_0x18f103[_0x1b727c(0x6ed)]=![],_0x18f103['error']=_0x639cf9[_0x1b727c(0x25a)],_0x2b5a29['status'](0x1f4)[_0x1b727c(0x8bb)](_0x18f103);}}else{if(_0x3b1be9['lcmbr'](_0x3b1be9[_0x1b727c(0x73a)],_0x3b1be9['gacfU'])){const _0x324714={'ScwNJ':function(_0x576d4a){return _0x576d4a();}};return new _0x4d5c75(_0x53706f=>{const _0x587ec3=_0x1b727c;_0x1a2d7a?_0x296c77[_0x587ec3(0x8cb)](_0x53706f):_0x324714[_0x587ec3(0x1eb)](_0x53706f);});}else{console[_0x1b727c(0x44c)]('❌\x20Android\x20device\x20'+_0x38cf3f+_0x1b727c(0x767));if(_0x3b1be9[_0x1b727c(0x203)](_0xef05bf,_0x3b1be9[_0x1b727c(0x66f)])&&_0x5bf1f2){if(_0x3b1be9['LWCDc'](_0x3b1be9[_0x1b727c(0x612)],_0x1b727c(0x3f2))){const _0x5dd893={};_0x5dd893[_0x1b727c(0x6ed)]=![],_0x8ac2de(_0x5dd893);}else{console[_0x1b727c(0x44c)]('📡\x20Attempting\x20to\x20connect\x20to\x20'+_0x38cf3f+_0x1b727c(0x7a9)+_0x5bf1f2+_0x1b727c(0x642));const _0x43a561=spawn(_0x3b1be9[_0x1b727c(0x460)],[_0x3b1be9[_0x1b727c(0x3fc)],_0x5bf1f2+_0x1b727c(0x19c)]);_0x43a561['on'](_0x3b1be9[_0x1b727c(0x5d2)],async _0x201f92=>{const _0x327e2d=_0x1b727c,_0x5f3d2d={'SCEao':function(_0x21462f,_0x27808c){const _0x5aae28=_0x2d26;return _0x2e8947[_0x5aae28(0x5b7)](_0x21462f,_0x27808c);},'ZujJU':_0x2e8947[_0x327e2d(0x3e8)],'SnmHj':function(_0x44fb2e,_0x276d55){const _0x4dbab3=_0x327e2d;return _0x2e8947[_0x4dbab3(0x68d)](_0x44fb2e,_0x276d55);},'Thbal':_0x327e2d(0x326),'FOfUB':'Invalid\x20or\x20unavailable\x20provider','MfOae':'io.appium.uiautomator2','IaivE':_0x2e8947[_0x327e2d(0x192)],'ZUBqz':function(_0x11506b,_0x2813c4,_0x165776){return _0x11506b(_0x2813c4,_0x165776);},'FrRbH':'QJZgh','TnhRf':function(_0x343acb,_0x4f0c3a){const _0x5758a9=_0x327e2d;return _0x2e8947[_0x5758a9(0x42b)](_0x343acb,_0x4f0c3a);},'jtgaJ':function(_0x28443c,_0x5701de){const _0x4335d5=_0x327e2d;return _0x2e8947[_0x4335d5(0x402)](_0x28443c,_0x5701de);},'ojGpP':_0x2e8947[_0x327e2d(0x392)],'SbcIK':function(_0x4c9e56,_0x15bc73){const _0x80dd2f=_0x327e2d;return _0x2e8947[_0x80dd2f(0x591)](_0x4c9e56,_0x15bc73);},'CJmsp':function(_0x33e742,_0x403969){return _0x33e742===_0x403969;},'TXBRT':_0x2e8947[_0x327e2d(0x470)],'CMkEz':_0x2e8947[_0x327e2d(0x62d)],'pbZjP':function(_0x38bffd,_0x4b7303){return _0x38bffd(_0x4b7303);}};if(_0x2e8947[_0x327e2d(0x63a)](_0x327e2d(0x1cb),_0x2e8947[_0x327e2d(0x479)])){const _0x1bb200={};_0x1bb200[_0x327e2d(0x6ed)]=![],_0x1bb200['error']=_0x743548[_0x327e2d(0x5d4)],_0x14a188['status'](0x1f4)[_0x327e2d(0x8bb)](_0x1bb200);}else{if(_0x2e8947[_0x327e2d(0x63a)](_0x201f92,0x0)){if(_0x2e8947['TYfzF'](_0x327e2d(0x380),_0x2e8947[_0x327e2d(0x174)])){const _0x2a2bf6={};_0x2a2bf6[_0x327e2d(0x6ed)]=![],_0x2a2bf6[_0x327e2d(0x5d6)]=_0x5c33a1['message'],_0x3148f4[_0x327e2d(0x890)](0x1f4)[_0x327e2d(0x8bb)](_0x2a2bf6);}else{console[_0x327e2d(0x44c)](_0x327e2d(0x77c)+_0x38cf3f+_0x327e2d(0x17b));const _0x3f7cc3=connectedDevices[_0x327e2d(0x7e3)](_0x1fd4d1=>_0x1fd4d1['name']===_0x38cf3f);_0x2e8947[_0x327e2d(0x4aa)](_0x3f7cc3,-0x1)&&(connectedDevices[_0x3f7cc3][_0x327e2d(0x890)]=_0x2e8947[_0x327e2d(0x67e)]);console[_0x327e2d(0x44c)]('📦\x20Ensuring\x20UIAutomator2\x20is\x20installed\x20on\x20'+_0x38cf3f+_0x327e2d(0x7a8));const _0x1efcce=_0x2e8947[_0x327e2d(0x8f0)](spawn,_0x2e8947[_0x327e2d(0x39d)],['-s',_0x5bf1f2+':5555',_0x327e2d(0x8da),'pm',_0x2e8947[_0x327e2d(0x4ed)],_0x2e8947[_0x327e2d(0x6f4)],'io.appium.uiautomator2']);let _0x12e294='';_0x1efcce[_0x327e2d(0x3d3)]['on'](_0x2e8947[_0x327e2d(0x221)],_0x41542f=>{const _0x1ea1fc=_0x327e2d;_0x12e294+=_0x41542f[_0x1ea1fc(0x67c)]();}),_0x1efcce['on'](_0x2e8947['GiApX'],async()=>{const _0x4b73d6=_0x327e2d,_0x3103a9={'LSWQL':_0x5f3d2d[_0x4b73d6(0x86f)],'qPXsl':function(_0x171241,_0x1071fc){return _0x5f3d2d['SnmHj'](_0x171241,_0x1071fc);},'CZoBr':_0x5f3d2d['Thbal']},_0x3d747d=_0x12e294[_0x4b73d6(0x1bf)](_0x5f3d2d['MfOae']);if(!_0x3d747d){if(_0x5f3d2d[_0x4b73d6(0x358)](_0x5f3d2d['IaivE'],_0x4b73d6(0x32a))){console[_0x4b73d6(0x44c)](_0x4b73d6(0x757)+_0x38cf3f+_0x4b73d6(0x876));const _0x11b72b=await _0x5f3d2d['ZUBqz'](installUIAutomator2,_0x5bf1f2+':5555',_0x38cf3f);!_0x11b72b['success']&&console[_0x4b73d6(0x44c)]('⚠️\x20UIAutomator2\x20installation\x20failed\x20on\x20'+_0x38cf3f);}else _0x59b54d[_0x4b73d6(0x44c)](_0x4b73d6(0x583)+_0x25aa2b),_0x2f908f[_0x4b73d6(0x32c)](_0x317cad+_0x4b73d6(0x19c));}else console['log'](_0x4b73d6(0x69f)+_0x38cf3f);const _0x3750f5=androidSessions[_0x4b73d6(0x3a1)](_0x5bf1f2+_0x4b73d6(0x19c));if(_0x3750f5){if(_0x5f3d2d[_0x4b73d6(0x359)]!==_0x4b73d6(0x16c)){console['log'](_0x4b73d6(0x413)+_0x38cf3f+_0x4b73d6(0x3d1)+_0x3750f5[_0x4b73d6(0x8d0)]+')');try{const _0x31d932=_0x5f3d2d['TnhRf'](require,_0x4b73d6(0x346));await _0x31d932[_0x4b73d6(0x3a1)](_0x4b73d6(0x196)+_0x3750f5['port']+'/wd/hub/status'),console[_0x4b73d6(0x44c)](_0x4b73d6(0x646)+_0x38cf3f);_0x5f3d2d[_0x4b73d6(0x324)](_0x3f7cc3,-0x1)&&(connectedDevices[_0x3f7cc3][_0x4b73d6(0x890)]=_0x5f3d2d['ojGpP'],wss[_0x4b73d6(0x7e9)][_0x4b73d6(0x57c)](_0x415ddd=>{const _0xed5971=_0x4b73d6;if(_0x5f3d2d[_0xed5971(0x358)](_0x5f3d2d[_0xed5971(0x7c4)],_0x5f3d2d[_0xed5971(0x7c4)])){if(_0x5f3d2d[_0xed5971(0x794)](_0x415ddd[_0xed5971(0x45e)],WebSocket['OPEN'])){const _0x656033={};_0x656033[_0xed5971(0x185)]=_0x5f3d2d[_0xed5971(0x4be)],_0x656033[_0xed5971(0x388)]=connectedDevices,_0x415ddd[_0xed5971(0x550)](JSON[_0xed5971(0x19f)](_0x656033));}}else{const {provider:_0x5dcfe1}=_0x6ab272[_0xed5971(0x4eb)],_0x4817ba=_0x4254b6[_0xed5971(0x6af)](_0x5dcfe1);if(_0x4817ba){const _0x2f4fae={};_0x2f4fae[_0xed5971(0x6ed)]=!![],_0x2f4fae[_0xed5971(0x218)]=_0x5dcfe1,_0x2bde6d[_0xed5971(0x8bb)](_0x2f4fae);}else{const _0x51fe18={};_0x51fe18['success']=![],_0x51fe18[_0xed5971(0x5d6)]=_0x3103a9[_0xed5971(0x2e3)],_0x534321[_0xed5971(0x890)](0x190)[_0xed5971(0x8bb)](_0x51fe18);}}}));const _0x5986ce={};_0x5986ce['success']=!![],_0x5986ce[_0x4b73d6(0x5d4)]='Connected\x20to\x20'+_0x38cf3f+_0x4b73d6(0x556),_0x5f3d2d[_0x4b73d6(0x6ea)](_0x2e158c,_0x5986ce);return;}catch(_0x3817d8){_0x5f3d2d[_0x4b73d6(0x478)](_0x4b73d6(0x3a0),_0x5f3d2d[_0x4b73d6(0x7bf)])?_0x390048[_0x4b73d6(0x44c)](_0x4b73d6(0x66c)+_0x19f82c+_0x4b73d6(0x6a6)):(console['log']('⚠️\x20\x20Existing\x20session\x20invalid,\x20creating\x20new\x20one\x20for\x20'+_0x38cf3f),androidSessions[_0x4b73d6(0x32c)](_0x5bf1f2+_0x4b73d6(0x19c)));}}else{const _0x11dbe5={};_0x11dbe5[_0x4b73d6(0x185)]=_0x4b73d6(0x326),_0x11dbe5['devices']=_0x496197,_0x47abfe[_0x4b73d6(0x550)](_0x12d3c1[_0x4b73d6(0x19f)](_0x11dbe5));}}console[_0x4b73d6(0x44c)](_0x4b73d6(0x799)+_0x38cf3f+_0x4b73d6(0x7a8));const _0x1b1f94=await startUIAutomator2Session(_0x5bf1f2+_0x4b73d6(0x19c),_0x38cf3f);let _0x306882='';if(_0x1b1f94['success']){if(_0x5f3d2d[_0x4b73d6(0x794)](_0x4b73d6(0x81e),_0x5f3d2d[_0x4b73d6(0x7b2)]))_0x3f7cc3!==-0x1&&(connectedDevices[_0x3f7cc3][_0x4b73d6(0x890)]=_0x5f3d2d[_0x4b73d6(0x5a5)],wss[_0x4b73d6(0x7e9)][_0x4b73d6(0x57c)](_0x414b3f=>{const _0x2a79d2=_0x4b73d6;if(_0x3103a9[_0x2a79d2(0x8a2)](_0x414b3f[_0x2a79d2(0x45e)],WebSocket['OPEN'])){const _0x477153={};_0x477153[_0x2a79d2(0x185)]=_0x3103a9['CZoBr'],_0x477153[_0x2a79d2(0x388)]=connectedDevices,_0x414b3f['send'](JSON['stringify'](_0x477153));}})),_0x306882='Connected\x20to\x20'+_0x38cf3f+'\x20-\x20UIAutomator2\x20Ready\x20✅';else{const _0x5da2c1={};_0x5da2c1['type']=_0x5f3d2d['Thbal'],_0x5da2c1[_0x4b73d6(0x388)]=_0x159a01,_0x4cb645['send'](_0x49bd8b['stringify'](_0x5da2c1));}}else _0x306882='Connected\x20to\x20'+_0x38cf3f+_0x4b73d6(0x8c2);const _0x1c3b88={};_0x1c3b88[_0x4b73d6(0x6ed)]=!![],_0x1c3b88[_0x4b73d6(0x5d4)]=_0x306882,_0x5f3d2d[_0x4b73d6(0x78b)](_0x2e158c,_0x1c3b88);});}}else{if(_0x2e8947['BunQq'](_0x2e8947[_0x327e2d(0x256)],_0x2e8947[_0x327e2d(0x7a3)]))_0x60ea38['log']('✅\x20Session\x20created:\x20'+_0x1ff720['sessionId']);else{const _0x5900a0={};_0x5900a0[_0x327e2d(0x6ed)]=![],_0x5900a0[_0x327e2d(0x5d4)]=_0x327e2d(0x3de)+_0x38cf3f+_0x327e2d(0x5bc),_0x2e8947[_0x327e2d(0x591)](_0x234820,_0x5900a0);}}}});}}else{const _0x44c8a1={};_0x44c8a1['success']=![],_0x44c8a1[_0x1b727c(0x5d4)]=_0x1b727c(0x7dc)+_0x38cf3f+_0x1b727c(0x8bd),_0x3b1be9[_0x1b727c(0x4af)](_0x234820,_0x44c8a1);}}}}}),_0x4ca87e['on'](_0x3b1be9[_0x25a06b(0x733)],_0x2f4e11=>{const _0x12ac51=_0x25a06b;console[_0x12ac51(0x5d6)](_0x12ac51(0x37f)+_0x2f4e11['message']);const _0x4dbf5f={};_0x4dbf5f['success']=![],_0x4dbf5f[_0x12ac51(0x5d4)]='ADB\x20not\x20available.\x20Please\x20install\x20Android\x20SDK\x20Platform-Tools.',_0x3b1be9[_0x12ac51(0x4af)](_0x234820,_0x4dbf5f);});return;}else{const {filename:_0x92b5e1,devices:_0x9446f8}=_0x555ab7[_0x25a06b(0x4eb)];if(!_0x92b5e1){const _0x286260={};return _0x286260[_0x25a06b(0x6ed)]=![],_0x286260[_0x25a06b(0x5d6)]=_0x639cf9[_0x25a06b(0x82a)],_0x4b0db1[_0x25a06b(0x890)](0x190)['json'](_0x286260);}if(!_0x9446f8||_0x639cf9[_0x25a06b(0x1c7)](_0x9446f8[_0x25a06b(0x3c8)],0x0)){const _0x682398={};return _0x682398[_0x25a06b(0x6ed)]=![],_0x682398[_0x25a06b(0x5d6)]=_0x639cf9[_0x25a06b(0x5c2)],_0x2b6366[_0x25a06b(0x890)](0x190)[_0x25a06b(0x8bb)](_0x682398);}const _0x42eb98={};_0x42eb98['success']=!![],_0x42eb98[_0x25a06b(0x5d4)]=_0x639cf9[_0x25a06b(0x432)],_0x401d73[_0x25a06b(0x8bb)](_0x42eb98);}}if(_0x3b1be9['LtJld'](_0xef05bf,_0x3b1be9[_0x25a06b(0x560)])){if(_0x3b1be9['WlHPP'](_0x3b1be9['lVzJY'],_0x3b1be9[_0x25a06b(0x85c)]))_0xd43d90=_0x592720[_0xab2643];else{const _0x5f3f7c=spawn(_0x3b1be9[_0x25a06b(0x219)],['-s',_0x25a06b(0x27c),'2',_0x3b1be9[_0x25a06b(0x871)]]);let _0x31b204='';_0x5f3f7c[_0x25a06b(0x3d3)]['on'](_0x3b1be9[_0x25a06b(0x39b)],_0x2034d2=>{_0x31b204+=_0x2034d2['toString']();}),_0x5f3f7c['on'](_0x25a06b(0x5d6),_0x1487a5=>{const _0x32f10c=_0x25a06b;console[_0x32f10c(0x5d6)]('❌\x20Error\x20checking\x20WDA:\x20'+_0x1487a5[_0x32f10c(0x5d4)]);const _0x406252={};_0x406252[_0x32f10c(0x6ed)]=![],_0x406252['message']=_0x32f10c(0x24c)+_0x1487a5[_0x32f10c(0x5d4)],_0x3b1be9[_0x32f10c(0x1a1)](_0x234820,_0x406252);}),_0x5f3f7c['on'](_0x3b1be9[_0x25a06b(0x5d2)],async _0x656e8d=>{const _0x16ce73=_0x25a06b,_0x4e915d={'WkEbe':function(_0x426241,_0x540f7c){return _0x639cf9['tVEJf'](_0x426241,_0x540f7c);},'fPoBu':_0x16ce73(0x5d3),'sNDKS':_0x639cf9[_0x16ce73(0x86e)],'rnpWX':_0x639cf9['qGGMl'],'dUvoh':_0x639cf9[_0x16ce73(0x45c)],'NKRfn':function(_0x464447,_0x5699d8){const _0x254828=_0x16ce73;return _0x639cf9[_0x254828(0x1c4)](_0x464447,_0x5699d8);},'WBZrw':_0x639cf9[_0x16ce73(0x734)],'vyBmi':_0x639cf9[_0x16ce73(0x20e)],'JqPcf':_0x639cf9[_0x16ce73(0x3e5)],'zttxZ':_0x639cf9[_0x16ce73(0x3f1)],'PkMjM':_0x639cf9[_0x16ce73(0x60f)],'hYXnQ':'command_output','kiViR':_0x639cf9[_0x16ce73(0x445)],'uCpvg':function(_0x4f998d,_0x4c2a39){return _0x639cf9['BQZwh'](_0x4f998d,_0x4c2a39);},'xOASU':function(_0x56e4c6,_0x4e4875){return _0x56e4c6(_0x4e4875);},'iBrLD':function(_0x218593,_0x34be39,_0x37fed3){const _0x2b408a=_0x16ce73;return _0x639cf9[_0x2b408a(0x61d)](_0x218593,_0x34be39,_0x37fed3);},'uFLKd':_0x16ce73(0x6ba),'ZkEMD':_0x639cf9[_0x16ce73(0x1f3)],'nNvIe':_0x16ce73(0x28f),'ZCaHO':_0x639cf9[_0x16ce73(0x217)],'YAPzb':_0x639cf9[_0x16ce73(0x5b5)],'RcUFq':_0x639cf9[_0x16ce73(0x7df)],'Gbcrz':_0x16ce73(0x696),'sfyds':function(_0x31bfae,_0x3e5995){const _0x5c2eda=_0x16ce73;return _0x639cf9[_0x5c2eda(0x2d7)](_0x31bfae,_0x3e5995);},'OPpBR':_0x639cf9['ZGGWY'],'RTgDY':function(_0x40f187,_0x245d7f){const _0x5b2fd8=_0x16ce73;return _0x639cf9[_0x5b2fd8(0x53d)](_0x40f187,_0x245d7f);},'TXzWv':_0x639cf9['oeCjW'],'maHpO':_0x639cf9['qNkpP'],'MSEgd':_0x639cf9[_0x16ce73(0x1ee)],'tcqTf':_0x639cf9[_0x16ce73(0x568)],'kyKwj':'rBAyb'};if(_0x31b204[_0x16ce73(0x1bf)](_0x16ce73(0x180))){console['log'](_0x16ce73(0x718)+_0x38cf3f),console[_0x16ce73(0x44c)](_0x16ce73(0x645)+_0x38cf3f+_0x16ce73(0x7a8));const _0x589c16=await _0x639cf9[_0x16ce73(0x83f)](createWDASession,_0x16ce73(0x696),_0x38cf3f);if(_0x589c16[_0x16ce73(0x6ed)]){if(_0x639cf9[_0x16ce73(0x1c7)](_0x639cf9[_0x16ce73(0x2d8)],_0x639cf9[_0x16ce73(0x2d8)]))console[_0x16ce73(0x44c)](_0x16ce73(0x8e8)+_0x589c16[_0x16ce73(0x741)]);else{const _0x17861f={};_0x17861f[_0x16ce73(0x6ed)]=![],_0x17861f[_0x16ce73(0x5d6)]=_0x2c9ea1[_0x16ce73(0x5d4)],_0x119c2d[_0x16ce73(0x890)](0x1f4)['json'](_0x17861f);}}else console[_0x16ce73(0x44c)]('⚠️\x20\x20Session\x20creation\x20failed,\x20will\x20be\x20created\x20on\x20first\x20command');const _0x2968c4=connectedDevices['findIndex'](_0x2f01a6=>_0x2f01a6[_0x16ce73(0x361)]===_0x38cf3f);_0x2968c4!==-0x1&&(connectedDevices[_0x2968c4][_0x16ce73(0x890)]=_0x639cf9[_0x16ce73(0x1ee)]);wss[_0x16ce73(0x7e9)][_0x16ce73(0x57c)](_0x5cef10=>{const _0x97c6a5=_0x16ce73,_0x34267b={};_0x34267b[_0x97c6a5(0x391)]=_0x639cf9[_0x97c6a5(0x891)],_0x34267b[_0x97c6a5(0x869)]=_0x639cf9['oJxSa'];const _0x12d9db=_0x34267b;if(_0x639cf9[_0x97c6a5(0x595)](_0x639cf9[_0x97c6a5(0x74a)],_0x97c6a5(0x4bf))){_0x1f3817[_0x97c6a5(0x5d6)](_0x12d9db[_0x97c6a5(0x391)],_0x2635ec[_0x97c6a5(0x5d4)]);const _0x363a19={};_0x363a19[_0x97c6a5(0x6ed)]=![],_0x363a19[_0x97c6a5(0x5d6)]=_0x44747f[_0x97c6a5(0x5d4)],_0x363a19['suggestion']=_0x12d9db[_0x97c6a5(0x869)],_0x25368d['json'](_0x363a19);}else{if(_0x5cef10['readyState']===WebSocket['OPEN']){const _0x268a16={};_0x268a16[_0x97c6a5(0x185)]='devices_updated',_0x268a16[_0x97c6a5(0x388)]=connectedDevices,_0x5cef10['send'](JSON[_0x97c6a5(0x19f)](_0x268a16));}}});const _0x30f83b={};_0x30f83b[_0x16ce73(0x6ed)]=!![],_0x30f83b[_0x16ce73(0x5d4)]=_0x16ce73(0x1fb)+_0x38cf3f+'\x20-\x20WDA\x20Ready\x20✅',_0x639cf9['IMaCE'](_0x2e158c,_0x30f83b);}else{console['log'](_0x16ce73(0x304)+_0x38cf3f+'\x20(UDID:\x20'+_0x3ca792+')...');const _0xd6de66=process.env.WDA_PATH||path[_0x16ce73(0x184)](process.env.HOME,_0x639cf9[_0x16ce73(0x628)]);console['log'](_0x16ce73(0x8dc)+_0xd6de66),console[_0x16ce73(0x44c)](_0x16ce73(0x5dc)+_0x3ca792);const _0x268cea=_0x639cf9[_0x16ce73(0x639)](spawn,_0x639cf9[_0x16ce73(0x1ec)],[_0x639cf9[_0x16ce73(0x28b)],'-project',path['join'](_0xd6de66,_0x639cf9[_0x16ce73(0x477)]),_0x639cf9['lBQze'],'WebDriverAgentRunner',_0x639cf9[_0x16ce73(0x4ea)],_0x16ce73(0x8bc)+_0x3ca792,_0x639cf9[_0x16ce73(0x8d7)]],{'cwd':_0xd6de66,'detached':!![],'stdio':[_0x639cf9[_0x16ce73(0x8ad)],_0x639cf9[_0x16ce73(0x6e1)],_0x639cf9[_0x16ce73(0x6e1)]]});_0x268cea[_0x16ce73(0x3d3)]['on'](_0x639cf9['mcrOM'],_0x6757b3=>{const _0x3847e9=_0x16ce73;if(_0x4e915d[_0x3847e9(0x587)](_0x3847e9(0x730),_0x3847e9(0x43f))){if(_0x4e915d[_0x3847e9(0x8e9)](_0x409703['code'],_0x4e915d[_0x3847e9(0x879)])){const _0x1cd861=_0x4e915d[_0x3847e9(0x8c9)]['split']('|');let _0x52fddb=0x0;while(!![]){switch(_0x1cd861[_0x52fddb++]){case'0':_0xf70f1d[_0x3847e9(0x5d6)]('\x20\x20\x20\x20\x20Note:\x20Vercel\x20frontend\x20connects\x20to\x20port\x203001\x20by\x20default');continue;case'1':_0x5d0d47[_0x3847e9(0x5d6)]('\x0a❌\x20Port\x203001\x20is\x20already\x20in\x20use!');continue;case'2':_0x57595b[_0x3847e9(0x5d6)](_0x3847e9(0x8a5));continue;case'3':_0x4be689[_0x3847e9(0x5d6)]('\x0aTry\x20one\x20of\x20these\x20solutions:');continue;case'4':_0x48e7a4['error']('\x20\x201.\x20Kill\x20the\x20process\x20using\x20port\x203001:\x20lsof\x20-ti:3001\x20|\x20xargs\x20kill\x20-9');continue;case'5':_0x23642c[_0x3847e9(0x5d6)](_0x3847e9(0x758));continue;}break;}}else _0x3edd0e[_0x3847e9(0x5d6)](_0x4e915d[_0x3847e9(0x603)],_0x2148c9[_0x3847e9(0x5d4)]);_0x5881cb[_0x3847e9(0x4c3)](0x1);}else{const _0xe08766=_0x6757b3[_0x3847e9(0x67c)]();(_0xe08766[_0x3847e9(0x1bf)](_0x4e915d[_0x3847e9(0x82f)])||_0xe08766['includes'](_0x4e915d[_0x3847e9(0x700)]))&&(_0x4e915d[_0x3847e9(0x8e9)](_0x4e915d[_0x3847e9(0x3c6)],_0x4e915d[_0x3847e9(0x3c6)])?console[_0x3847e9(0x44c)](_0x3847e9(0x471)+_0xe08766[_0x3847e9(0x878)]()):_0x285cd1[_0x3efd9d][_0x3847e9(0x890)]=wwWRLI[_0x3847e9(0x768)]);}}),_0x268cea[_0x16ce73(0x2aa)]['on'](_0x639cf9[_0x16ce73(0x22b)],_0x366a0e=>{const _0x3d5ead=_0x16ce73,_0x407638=_0x366a0e[_0x3d5ead(0x67c)]();!_0x407638[_0x3d5ead(0x1bf)](_0x4e915d[_0x3d5ead(0x8a1)])&&!_0x407638[_0x3d5ead(0x1bf)](_0x4e915d[_0x3d5ead(0x1fe)])&&console['error']('⚠️\x20WDA\x20Error:\x20'+_0x407638[_0x3d5ead(0x878)]());}),_0x268cea['on'](_0x639cf9['VPjHa'],_0x10f5be=>{const _0x7608e6=_0x16ce73;console['error'](_0x7608e6(0x2cc)+_0x10f5be[_0x7608e6(0x5d4)]);}),_0x268cea[_0x16ce73(0x24d)](),console['log'](_0x16ce73(0x775));const _0x2e6b5f=_0x639cf9[_0x16ce73(0x7a1)](spawn,'iproxy',[_0x639cf9[_0x16ce73(0x5e9)],_0x639cf9[_0x16ce73(0x5e9)]],{'detached':!![],'stdio':[_0x16ce73(0x327),_0x639cf9['xdyfS'],_0x639cf9['xdyfS']]});_0x2e6b5f[_0x16ce73(0x3d3)]['on'](_0x16ce73(0x46a),_0x34843f=>{const _0x5b5a3e=_0x16ce73;if(_0x639cf9[_0x5b5a3e(0x2d7)](_0x639cf9[_0x5b5a3e(0x400)],_0x639cf9[_0x5b5a3e(0x81f)])){const _0x345840={};_0x345840[_0x5b5a3e(0x813)]=_0xa86478,_0x345840[_0x5b5a3e(0x290)]=_0x2d8d91,_0x339886[_0x5b5a3e(0x8bb)](_0x345840);}else console[_0x5b5a3e(0x44c)]('🔌\x20iproxy:\x20'+_0x34843f[_0x5b5a3e(0x67c)]()[_0x5b5a3e(0x878)]());}),_0x2e6b5f['on'](_0x639cf9[_0x16ce73(0x4e6)],_0x53e831=>{const _0x1d4f86=_0x16ce73,_0x3659df={};_0x3659df['KKOjG']=_0x4e915d[_0x1d4f86(0x80d)],_0x3659df[_0x1d4f86(0x6ef)]=_0x4e915d[_0x1d4f86(0x50a)];const _0x19d49d=_0x3659df;if(_0x4e915d[_0x1d4f86(0x7cf)](_0x1d4f86(0x837),_0x1d4f86(0x30d)))console[_0x1d4f86(0x5d6)](_0x1d4f86(0x347)+_0x53e831[_0x1d4f86(0x5d4)]),console[_0x1d4f86(0x5d6)](_0x1d4f86(0x45a));else{_0x502ab9=!![];const _0x2b8289={};_0x2b8289[_0x1d4f86(0x185)]=_0x19d49d[_0x1d4f86(0x798)],_0x2b8289[_0x1d4f86(0x46a)]=_0x19d49d[_0x1d4f86(0x6ef)],_0x4ce732['send'](_0x14cf18[_0x1d4f86(0x19f)](_0x2b8289));}}),_0x2e6b5f['unref']();const _0x1a33d5={};_0x1a33d5[_0x16ce73(0x19a)]=_0x268cea['pid'],_0x1a33d5[_0x16ce73(0x529)]=_0x2e6b5f[_0x16ce73(0x4d1)],wdaProcesses[_0x16ce73(0x793)](_0x38cf3f,_0x1a33d5),console['log'](_0x16ce73(0x486)+_0x38cf3f+_0x16ce73(0x804)+_0x268cea[_0x16ce73(0x4d1)]),setTimeout(()=>{const _0x39eafd=_0x16ce73,_0x80abd0={'HAmTu':function(_0x17f8b2){return _0x639cf9['kyviv'](_0x17f8b2);},'bqVQm':_0x639cf9[_0x39eafd(0x531)]},_0x260fa8=_0x639cf9[_0x39eafd(0x35e)](spawn,_0x639cf9[_0x39eafd(0x39e)],['-s',_0x639cf9[_0x39eafd(0x4fa)],'5','http://localhost:8100/status']);let _0x4de8c6='';_0x260fa8['stdout']['on']('data',_0x60c580=>{const _0xb25d18=_0x39eafd;_0x4de8c6+=_0x60c580[_0xb25d18(0x67c)]();}),_0x260fa8['on'](_0x639cf9[_0x39eafd(0x204)],async()=>{const _0x3d2ddd=_0x39eafd,_0x4d876f={'hcyMF':function(_0x5a7f17,_0x3b00e8){const _0x2cb72f=_0x2d26;return _0x4e915d[_0x2cb72f(0x231)](_0x5a7f17,_0x3b00e8);},'mJnnA':_0x3d2ddd(0x86c),'BFrQj':function(_0x54ac95,_0x13f955,_0x48a366){const _0x3079c9=_0x3d2ddd;return _0x4e915d[_0x3079c9(0x401)](_0x54ac95,_0x13f955,_0x48a366);},'MmiaB':_0x4e915d[_0x3d2ddd(0x5e8)],'rbEqH':_0x4e915d[_0x3d2ddd(0x272)]};if(_0x4e915d['nNvIe']!==_0x4e915d[_0x3d2ddd(0x6c1)])_0x320b39?_0x2cba55[_0x3d2ddd(0x8cb)](_0x154e6f):_0x80abd0[_0x3d2ddd(0x50c)](_0x707078);else{if(_0x4de8c6[_0x3d2ddd(0x1bf)](_0x4e915d[_0x3d2ddd(0x532)])){if(_0x4e915d[_0x3d2ddd(0x7cf)](_0x4e915d['YAPzb'],_0x4e915d[_0x3d2ddd(0x44e)])){console[_0x3d2ddd(0x44c)](_0x3d2ddd(0x7eb)+_0x38cf3f),console[_0x3d2ddd(0x44c)](_0x3d2ddd(0x645)+_0x38cf3f+_0x3d2ddd(0x7a8));const _0x3a10b0=await _0x4e915d[_0x3d2ddd(0x401)](createWDASession,_0x4e915d[_0x3d2ddd(0x786)],_0x38cf3f);if(_0x3a10b0[_0x3d2ddd(0x6ed)]){if(_0x4e915d[_0x3d2ddd(0x617)](_0x4e915d[_0x3d2ddd(0x643)],_0x4e915d['OPpBR']))console[_0x3d2ddd(0x44c)]('✅\x20Session\x20created:\x20'+_0x3a10b0[_0x3d2ddd(0x741)]);else{const {execSync:_0x3fcfbd}=_0x4d876f[_0x3d2ddd(0x611)](_0x512787,_0x4d876f[_0x3d2ddd(0x8d3)]),_0x5a3554=_0x1ae83f[_0x3d2ddd(0x2a7)]||_0x5edfd7['serial'],_0x5fd2aa=_0x4d876f['BFrQj'](_0x3fcfbd,_0x3d2ddd(0x457)+_0x5a3554+'\x20shell\x20pm\x20list\x20packages\x20-3',{'encoding':_0x4d876f['MmiaB']});_0x40a2db=_0x5fd2aa[_0x3d2ddd(0x394)]('\x0a')[_0x3d2ddd(0x6fc)](_0x311682=>_0x311682[_0x3d2ddd(0x310)](_0x3d2ddd(0x22e)))[_0x3d2ddd(0x2d1)](_0x2f2c2d=>_0x2f2c2d[_0x3d2ddd(0x8e7)](_0x3d2ddd(0x22e),'')[_0x3d2ddd(0x878)]())['filter'](_0x54f7ed=>_0x54f7ed)[_0x3d2ddd(0x352)]();}}else console['log'](_0x3d2ddd(0x20f));const _0x88790a=connectedDevices[_0x3d2ddd(0x7e3)](_0x4fbc27=>_0x4fbc27[_0x3d2ddd(0x361)]===_0x38cf3f);_0x4e915d[_0x3d2ddd(0x1b2)](_0x88790a,-0x1)&&(_0x4e915d[_0x3d2ddd(0x343)]===_0x4e915d[_0x3d2ddd(0x55b)]?_0x575331+=_0x3c4448['toString']():connectedDevices[_0x88790a][_0x3d2ddd(0x890)]=_0x4e915d[_0x3d2ddd(0x6e9)]),wss['clients'][_0x3d2ddd(0x57c)](_0xdf9a6=>{const _0x3f8995=_0x3d2ddd;if(_0xdf9a6[_0x3f8995(0x45e)]===WebSocket['OPEN']){const _0xd05b20={};_0xd05b20[_0x3f8995(0x185)]=_0x4d876f[_0x3f8995(0x7db)],_0xd05b20['devices']=connectedDevices,_0xdf9a6[_0x3f8995(0x550)](JSON['stringify'](_0xd05b20)),_0xdf9a6['send'](JSON[_0x3f8995(0x19f)]({'type':_0x3f8995(0x7ab),'output':'✅\x20'+_0x38cf3f+_0x3f8995(0x2b9)+'─'['repeat'](0x32)+'\x0a','device':_0x38cf3f}));}});}else{const _0x44f7cb={};return _0x44f7cb[_0x3d2ddd(0x6ed)]=![],_0x44f7cb[_0x3d2ddd(0x5d6)]=_0x3d2ddd(0x462),_0x3ebf3a[_0x3d2ddd(0x890)](0x194)['json'](_0x44f7cb);}}else{if(_0x4e915d[_0x3d2ddd(0x8e9)](_0x4e915d[_0x3d2ddd(0x567)],_0x4e915d[_0x3d2ddd(0x336)])){const _0x5bc9c6={};return _0x5bc9c6[_0x3d2ddd(0x6ed)]=![],_0x5bc9c6['error']=_0x80abd0[_0x3d2ddd(0x519)],_0x58da8d[_0x3d2ddd(0x890)](0x190)[_0x3d2ddd(0x8bb)](_0x5bc9c6);}else console[_0x3d2ddd(0x44c)]('⚠️\x20\x20WDA\x20still\x20starting\x20for\x20'+_0x38cf3f+'...');}}});},0x1f40);const _0x4abdf9={};_0x4abdf9[_0x16ce73(0x6ed)]=!![],_0x4abdf9[_0x16ce73(0x5d4)]=_0x16ce73(0x18a)+_0x38cf3f+'\x20-\x20Starting\x20WDA...',_0x4abdf9['wdaStarting']=!![],_0x639cf9[_0x16ce73(0x354)](_0x2e158c,_0x4abdf9);}}),_0x5f3f7c['on'](_0x3b1be9[_0x25a06b(0x733)],()=>{const _0x1407de=_0x25a06b;console[_0x1407de(0x44c)](_0x1407de(0x819));const _0x2ddf9={};_0x2ddf9[_0x1407de(0x6ed)]=![],_0x2ddf9['message']=_0x1407de(0x616),_0x639cf9[_0x1407de(0x652)](_0x2e158c,_0x2ddf9);});}}else{if(_0x3b1be9[_0x25a06b(0x1a6)]===_0x3b1be9[_0x25a06b(0x1a6)]){const _0x659711=spawn(_0x25a06b(0x46f),['-s',_0x25a06b(0x27c),'3',_0x25a06b(0x6e8)+_0x5bf1f2+_0x25a06b(0x250)]);let _0x474c62='';_0x659711[_0x25a06b(0x3d3)]['on'](_0x25a06b(0x46a),_0x17ba87=>{const _0x36b92b=_0x25a06b;if(_0x639cf9[_0x36b92b(0x317)](_0x639cf9['nLqjF'],_0x639cf9[_0x36b92b(0x50d)]))_0x474c62+=_0x17ba87['toString']();else{const _0x3d42fb={};_0x3d42fb[_0x36b92b(0x6ed)]=![],kdWBGD['loymp'](_0x49dd0a,_0x3d42fb);}}),_0x659711['on'](_0x3b1be9['XJxwx'],async()=>{const _0x567dd0=_0x25a06b,_0x2bc98c={'ojdYV':function(_0x1b7ae3,_0x42de4e){const _0x21832a=_0x2d26;return _0x3b1be9[_0x21832a(0x7f8)](_0x1b7ae3,_0x42de4e);},'DbnFO':_0x567dd0(0x326),'HChGF':function(_0x5167c8,_0x55572b){return _0x3b1be9['tSqZq'](_0x5167c8,_0x55572b);},'MlRDQ':_0x3b1be9[_0x567dd0(0x854)],'nAbIh':function(_0x8e20e4,_0x403cff,_0x506b66){const _0x939932=_0x567dd0;return _0x3b1be9[_0x939932(0x87c)](_0x8e20e4,_0x403cff,_0x506b66);},'BKNtp':function(_0x4daf01,_0x417d1f){const _0x2e990f=_0x567dd0;return _0x3b1be9[_0x2e990f(0x8af)](_0x4daf01,_0x417d1f);},'LdzAR':_0x567dd0(0x3e6),'mIPZX':_0x567dd0(0x20c),'WNAXq':_0x3b1be9[_0x567dd0(0x5aa)],'XkYEm':_0x3b1be9[_0x567dd0(0x4f2)],'Njgcy':function(_0x29d71c,_0x3bc78d){const _0x14ce56=_0x567dd0;return _0x3b1be9[_0x14ce56(0x4af)](_0x29d71c,_0x3bc78d);}};if(_0x474c62[_0x567dd0(0x1bf)](_0x3b1be9[_0x567dd0(0x854)])){if(_0x3b1be9[_0x567dd0(0x1d3)](_0x3b1be9[_0x567dd0(0x691)],_0x3b1be9[_0x567dd0(0x691)])){console[_0x567dd0(0x44c)]('✅\x20WDA\x20reachable\x20for\x20'+_0x38cf3f),console['log'](_0x567dd0(0x645)+_0x38cf3f+_0x567dd0(0x7a8));const _0x4d523b=await _0x3b1be9[_0x567dd0(0x6c6)](createWDASession,_0x5bf1f2,_0x38cf3f);if(_0x4d523b[_0x567dd0(0x6ed)]){if(_0x3b1be9[_0x567dd0(0x5ea)]!==_0x3b1be9[_0x567dd0(0x257)])console[_0x567dd0(0x44c)](_0x567dd0(0x8e8)+_0x4d523b[_0x567dd0(0x741)]);else{const _0x3b4019={};_0x3b4019[_0x567dd0(0x185)]=_0x639cf9['BpvKU'],_0x3b4019[_0x567dd0(0x46a)]='✅\x20Completed\x20successfully\x0a\x0a',_0x3b4019[_0x567dd0(0x388)]=_0x2a1338,_0x3e39fc[_0x567dd0(0x550)](_0x3d29d3[_0x567dd0(0x19f)](_0x3b4019));}}else{if(_0x3b1be9['cUUiZ']===_0x3b1be9[_0x567dd0(0x24b)])console['log'](_0x567dd0(0x20f));else{const _0x40c5f0=_0x639cf9['RLPuo'](_0x3c7095,_0x567dd0(0x7fb)+_0x48645b+_0x567dd0(0x416)+_0x3a50f5+'\x22',{'encoding':_0x639cf9['ZolFC'],'timeout':0x2710}),_0x48e89b=_0x40c5f0[_0x567dd0(0x394)](',')[_0x567dd0(0x2d1)](_0x41912e=>_0x41912e[_0x567dd0(0x878)]()['replace'](/"/g,''));_0x639cf9[_0x567dd0(0x298)](_0x48e89b['length'],0x3)?(_0x3e5f4c[_0x567dd0(0x744)]=_0x48e89b[0x0],_0x4abea6['version']=_0x48e89b[0x1],_0x24c4df['name']=_0x48e89b[0x2]):(_0x1e6f03['bundleId']=_0x52e634,_0x4b34c0[_0x567dd0(0x361)]=_0xb493be,_0x4e1739['version']=_0x639cf9[_0x567dd0(0x455)]);}}const _0x5e6cd1=connectedDevices[_0x567dd0(0x7e3)](_0x35d105=>_0x35d105[_0x567dd0(0x361)]===_0x38cf3f);_0x5e6cd1!==-0x1&&(connectedDevices[_0x5e6cd1][_0x567dd0(0x890)]=_0x3b1be9[_0x567dd0(0x4f2)]);wss[_0x567dd0(0x7e9)]['forEach'](_0x166760=>{const _0x5adf51=_0x567dd0;if(_0x2bc98c[_0x5adf51(0x4d2)](_0x166760[_0x5adf51(0x45e)],WebSocket[_0x5adf51(0x2fc)])){const _0x170762={};_0x170762[_0x5adf51(0x185)]=_0x2bc98c[_0x5adf51(0x1d9)],_0x170762[_0x5adf51(0x388)]=connectedDevices,_0x166760['send'](JSON[_0x5adf51(0x19f)](_0x170762));}});const _0x397f89={};_0x397f89[_0x567dd0(0x6ed)]=!![],_0x397f89[_0x567dd0(0x5d4)]='Connected\x20to\x20'+_0x38cf3f+_0x567dd0(0x56c),_0x2e158c(_0x397f89);}else{if(OTeUWR['HChGF'](_0x57c511['readyState'],_0xa1ab5a[_0x567dd0(0x2fc)])){const _0x13f7be={};_0x13f7be[_0x567dd0(0x185)]=OTeUWR['DbnFO'],_0x13f7be[_0x567dd0(0x388)]=_0x676ff,_0x4dd203[_0x567dd0(0x550)](_0x1af4bf[_0x567dd0(0x19f)](_0x13f7be));}}}else{console[_0x567dd0(0x44c)](_0x567dd0(0x72a)+_0x38cf3f+_0x567dd0(0x748));const _0x3dbda5=process.env.WDA_PATH||path[_0x567dd0(0x184)](process.env.HOME,_0x3b1be9['uHUVA']);console[_0x567dd0(0x44c)]('📂\x20WDA\x20Path:\x20'+_0x3dbda5),console[_0x567dd0(0x44c)]('📱\x20Device\x20UDID:\x20'+_0x3ca792),console['log'](_0x567dd0(0x8ec)+_0x5bf1f2);const _0x4f6f13=spawn(_0x3b1be9['cvHdc'],[_0x3b1be9[_0x567dd0(0x79d)],_0x3b1be9[_0x567dd0(0x750)],path[_0x567dd0(0x184)](_0x3dbda5,_0x3b1be9[_0x567dd0(0x501)]),_0x3b1be9[_0x567dd0(0x5a3)],_0x3b1be9[_0x567dd0(0x6df)],_0x3b1be9['XhfZC'],_0x567dd0(0x8bc)+_0x3ca792,_0x3b1be9[_0x567dd0(0x2ba)]],{'cwd':_0x3dbda5,'detached':!![],'stdio':['ignore',_0x3b1be9[_0x567dd0(0x6b6)],_0x3b1be9['yWulL']]});_0x4f6f13[_0x567dd0(0x3d3)]['on'](_0x567dd0(0x46a),_0x40fb7d=>{const _0x137746=_0x567dd0,_0x3ed975=_0x40fb7d[_0x137746(0x67c)]();(_0x3ed975[_0x137746(0x1bf)](_0x639cf9[_0x137746(0x734)])||_0x3ed975[_0x137746(0x1bf)](_0x639cf9[_0x137746(0x20e)]))&&console[_0x137746(0x44c)](_0x137746(0x67b)+_0x38cf3f+_0x137746(0x688)+_0x3ed975[_0x137746(0x878)]());}),_0x4f6f13[_0x567dd0(0x2aa)]['on'](_0x3b1be9['FHlyJ'],_0x3092b5=>{const _0x4823e5=_0x567dd0;if(_0x639cf9['xeQWY'](_0x4823e5(0x658),'YvKhj'))_0x5239c0=_0x36f01c[_0x4823e5(0x8e1)][_0x4823e5(0x394)]('\x0a')[_0x4823e5(0x6fc)](_0x25e81f=>_0x25e81f[_0x4823e5(0x878)]());else{const _0x2e2f6a=_0x3092b5['toString']();!_0x2e2f6a[_0x4823e5(0x1bf)](_0x639cf9[_0x4823e5(0x3f1)])&&!_0x2e2f6a['includes']('warning:')&&console['error']('⚠️\x20WDA\x20Error\x20('+_0x38cf3f+_0x4823e5(0x688)+_0x2e2f6a[_0x4823e5(0x878)]());}}),_0x4f6f13['on'](_0x3b1be9[_0x567dd0(0x733)],_0x558bbc=>{const _0xe88a9f=_0x567dd0,_0x4d9d46={'TNkMJ':function(_0x2bdcde,_0x16227e){const _0x8d4e45=_0x2d26;return _0x639cf9[_0x8d4e45(0x868)](_0x2bdcde,_0x16227e);}};if(_0x639cf9[_0xe88a9f(0x1c4)](_0x639cf9[_0xe88a9f(0x6a8)],_0x639cf9['UFapG']))console[_0xe88a9f(0x5d6)]('❌\x20Failed\x20to\x20start\x20xcodebuild\x20for\x20'+_0x38cf3f+':\x20'+_0x558bbc['message']);else{_0x5b8197[_0xe88a9f(0x5d6)](_0xe88a9f(0x790)+_0x3bb572+':',_0x489f3c);const _0x57996e={};_0x57996e[_0xe88a9f(0x6ed)]=![],MhxGbX['TNkMJ'](_0x485cbb,_0x57996e);}}),_0x4f6f13[_0x567dd0(0x24d)]();const _0x20babb={};_0x20babb['xcodebuild']=_0x4f6f13[_0x567dd0(0x4d1)],wdaProcesses[_0x567dd0(0x793)](_0x38cf3f,_0x20babb),console[_0x567dd0(0x44c)](_0x567dd0(0x486)+_0x38cf3f+'\x20(wireless).\x20Process\x20ID:\x20'+_0x4f6f13[_0x567dd0(0x4d1)]),_0x3b1be9[_0x567dd0(0x6c6)](setTimeout,()=>{const _0x4cab7b=_0x567dd0,_0xd84c40={};_0xd84c40[_0x4cab7b(0x67a)]=_0x639cf9[_0x4cab7b(0x1ee)];const _0xf93778=_0xd84c40,_0x488b6f=spawn(_0x639cf9[_0x4cab7b(0x39e)],['-s',_0x639cf9['xOTrx'],'5',_0x4cab7b(0x6e8)+_0x5bf1f2+':8100/status']);let _0x20684e='';_0x488b6f[_0x4cab7b(0x3d3)]['on'](_0x639cf9['mcrOM'],_0x52e349=>{_0x20684e+=_0x52e349['toString']();}),_0x488b6f['on'](_0x4cab7b(0x8cb),async()=>{const _0x4502a6=_0x4cab7b,_0x4f8a8e={'DxmCM':function(_0x87eabb,_0x7ecc17){const _0x5ef272=_0x2d26;return _0x2bc98c[_0x5ef272(0x5ce)](_0x87eabb,_0x7ecc17);},'HizQA':_0x2bc98c['DbnFO']};if(_0x20684e[_0x4502a6(0x1bf)](_0x2bc98c[_0x4502a6(0x357)])){console[_0x4502a6(0x44c)](_0x4502a6(0x7eb)+_0x38cf3f),console['log'](_0x4502a6(0x645)+_0x38cf3f+_0x4502a6(0x7a8));const _0x19f967=await _0x2bc98c[_0x4502a6(0x842)](createWDASession,_0x5bf1f2,_0x38cf3f);_0x19f967[_0x4502a6(0x6ed)]?console[_0x4502a6(0x44c)](_0x4502a6(0x8e8)+_0x19f967['sessionId']):_0x2bc98c[_0x4502a6(0x1dd)](_0x2bc98c[_0x4502a6(0x1ac)],_0x2bc98c[_0x4502a6(0x1ac)])?(_0x16baca[_0x48624a][_0x4502a6(0x890)]=rhtzjV[_0x4502a6(0x67a)],_0x483f4f[_0x4502a6(0x7e9)][_0x4502a6(0x57c)](_0x24d96b=>{const _0x1f1b2b=_0x4502a6;if(ZSQFom[_0x1f1b2b(0x178)](_0x24d96b[_0x1f1b2b(0x45e)],_0x50551f['OPEN'])){const _0x5c570a={};_0x5c570a[_0x1f1b2b(0x185)]=ZSQFom[_0x1f1b2b(0x54f)],_0x5c570a[_0x1f1b2b(0x388)]=_0x2c5392,_0x24d96b[_0x1f1b2b(0x550)](_0x5cf5fe[_0x1f1b2b(0x19f)](_0x5c570a));}})):console['log'](_0x4502a6(0x20f));const _0x1f7dd0=connectedDevices[_0x4502a6(0x7e3)](_0x4ea1cc=>_0x4ea1cc[_0x4502a6(0x361)]===_0x38cf3f);if(_0x1f7dd0!==-0x1){if(_0x2bc98c['ojdYV'](_0x2bc98c[_0x4502a6(0x2bd)],_0x2bc98c[_0x4502a6(0x6d3)])){_0x58aab3['error']('❌\x20Failed\x20to\x20start\x20UIAutomator2\x20for\x20'+_0xf36389+':',_0x459dc2['message']);const _0x5780fa={};return _0x5780fa[_0x4502a6(0x6ed)]=![],_0x5780fa['error']=_0x5f47cf[_0x4502a6(0x5d4)],_0x5780fa;}else connectedDevices[_0x1f7dd0][_0x4502a6(0x890)]=_0x2bc98c[_0x4502a6(0x46c)];}wss[_0x4502a6(0x7e9)][_0x4502a6(0x57c)](_0x50c1f5=>{const _0x34d995=_0x4502a6;if(_0x50c1f5['readyState']===WebSocket[_0x34d995(0x2fc)]){const _0x56c2d8={};_0x56c2d8[_0x34d995(0x185)]=_0x34d995(0x326),_0x56c2d8['devices']=connectedDevices,_0x50c1f5[_0x34d995(0x550)](JSON[_0x34d995(0x19f)](_0x56c2d8));}});const _0x4a8800={};_0x4a8800[_0x4502a6(0x6ed)]=!![],_0x4a8800[_0x4502a6(0x5d4)]=_0x4502a6(0x1fb)+_0x38cf3f+'\x20via\x20WiFi\x20-\x20WDA\x20Started!',_0x4a8800[_0x4502a6(0x7b6)]=!![],_0x2bc98c[_0x4502a6(0x7d3)](_0x2e158c,_0x4a8800);}else{console[_0x4502a6(0x44c)](_0x4502a6(0x4ba)+_0x38cf3f+_0x4502a6(0x1de));const _0x3f5710={};_0x3f5710[_0x4502a6(0x6ed)]=!![],_0x3f5710['message']=_0x4502a6(0x441)+_0x38cf3f+'.\x20Please\x20wait\x2010-15\x20seconds...',_0x3f5710[_0x4502a6(0x449)]=!![],_0x2bc98c['Njgcy'](_0x2e158c,_0x3f5710);}});},0x2710);}}),_0x659711['on'](_0x3b1be9[_0x25a06b(0x733)],()=>{const _0x58a92a=_0x25a06b;console[_0x58a92a(0x44c)]('⚠️\x20\x20Cannot\x20reach\x20'+_0x38cf3f+_0x58a92a(0x483)+_0x5bf1f2+_0x58a92a(0x6a5));const _0x297b12={};_0x297b12['success']=![],_0x297b12['message']='Cannot\x20reach\x20'+_0x38cf3f+_0x58a92a(0x483)+_0x5bf1f2+'.\x20Check\x20network\x20connection.',_0x639cf9[_0x58a92a(0x1b7)](_0x234820,_0x297b12);});}else{const _0x1955e3={};_0x1955e3[_0x25a06b(0x6ed)]=![],_0x1955e3['error']=_0x42f3b9[_0x25a06b(0x5d4)],_0x442ead[_0x25a06b(0x890)](0x1f4)[_0x25a06b(0x8bb)](_0x1955e3);}}}else _0xcae28d[_0x276a7d]['status']=_0x639cf9[_0x25a06b(0x62e)];});}async function disconnectFromDevice(_0x41d8ce){const _0x30916b=_0x28fe54,_0x6e8529={'sIWNq':'✅\x20Parsed\x20as\x20JSON,\x20elements:','ftcrv':_0x30916b(0x238),'KAKJy':'Error\x20listing\x20recordings:','atqEi':_0x30916b(0x7f1),'TcBNb':'Failed\x20to\x20get\x20locators','igPZq':'devices_updated','ATVfY':function(_0x3f72d7,_0x249ca1){return _0x3f72d7===_0x249ca1;},'DxipY':'tLSWy','eacNw':'android','PWdkk':function(_0xdc9705,_0x822459){return _0xdc9705<_0x822459;},'whFwm':function(_0x44cfa7,_0x5ca542){return _0x44cfa7>_0x5ca542;},'uBnDz':_0x30916b(0x3e3),'AaKNc':function(_0x4ea7f8,_0x3a9193){return _0x4ea7f8===_0x3a9193;},'yLzRo':'uRPVO','idGTx':_0x30916b(0x4d5),'VFkNB':_0x30916b(0x45f),'sASkU':function(_0x534fee,_0x319440){return _0x534fee===_0x319440;},'gzAEb':function(_0x2ea7f9,_0x5ad09a){return _0x2ea7f9===_0x5ad09a;},'aWBDG':_0x30916b(0x331),'vRKyC':_0x30916b(0x1c6),'eposZ':function(_0x34443a,_0x52f082){return _0x34443a!==_0x52f082;},'lrJXn':_0x30916b(0x37c),'qFGUK':function(_0x4e5e97,_0x11348a){return _0x4e5e97!==_0x11348a;},'bTNSR':_0x30916b(0x23c),'AQEFG':function(_0x247c60,_0x4ee889){return _0x247c60(_0x4ee889);},'UKMGC':_0x30916b(0x736),'nWefN':'bvlMe','wfwaR':'Screenshot\x20not\x20found','MuEHP':function(_0x29a657,_0x8119fe){return _0x29a657(_0x8119fe);},'GosRx':function(_0x3b3b56,_0x3948fb){return _0x3b3b56!==_0x3948fb;},'QFMci':_0x30916b(0x265),'mbBaB':function(_0x14be00,_0x254489,_0x4aea1c){return _0x14be00(_0x254489,_0x4aea1c);},'iihSe':_0x30916b(0x1cf),'wHgKc':_0x30916b(0x339),'HlkIt':_0x30916b(0x795),'FUemZ':_0x30916b(0x8cb),'ZlVnF':'IFkIr','vmyMc':_0x30916b(0x4f0),'vVjJa':_0x30916b(0x1f9),'akrZR':'cPxkr','MALll':_0x30916b(0x511),'vBpZX':_0x30916b(0x59e),'PwedJ':function(_0x5d893b,_0x572226){return _0x5d893b===_0x572226;},'iqyIQ':_0x30916b(0x6c8),'VOVFS':function(_0x583a6c,_0x4358f8){return _0x583a6c===_0x4358f8;},'RpTGx':_0x30916b(0x5d1),'AkEsZ':_0x30916b(0x864),'CQkgD':'KjkHs','vNeDu':'usb','ltFql':'WfTQv','bBwPK':function(_0x4e1d0c,_0x2ffdc2,_0x40e032){return _0x4e1d0c(_0x2ffdc2,_0x40e032);}};return new Promise((_0x2cfcab,_0x1444d5)=>{const _0x15c8a4=_0x30916b,_0x1a8b2b={'lsBaO':function(_0x3944e4,_0x5051e9){return _0x6e8529['ATVfY'](_0x3944e4,_0x5051e9);},'PtGBK':_0x6e8529['VFkNB'],'zhRFE':function(_0x1f955d,_0x22fff5){const _0x214ed0=_0x2d26;return _0x6e8529[_0x214ed0(0x61b)](_0x1f955d,_0x22fff5);},'Knxvr':function(_0x3a369c,_0x45484f){const _0x45ebaf=_0x2d26;return _0x6e8529[_0x45ebaf(0x2c7)](_0x3a369c,_0x45484f);},'ctXpH':_0x6e8529[_0x15c8a4(0x3af)],'CPqsk':_0x6e8529[_0x15c8a4(0x6ca)],'ZbsNL':_0x6e8529[_0x15c8a4(0x46e)],'JEYSD':function(_0x3db0ca,_0x329318){return _0x3db0ca(_0x329318);},'ryZBb':function(_0x541373,_0x23c691){const _0x2cf400=_0x15c8a4;return _0x6e8529[_0x2cf400(0x60c)](_0x541373,_0x23c691);},'rUAAn':_0x15c8a4(0x78a),'xHesr':_0x6e8529[_0x15c8a4(0x36d)],'uAaIh':function(_0x398d81,_0x33990c){return _0x6e8529['qFGUK'](_0x398d81,_0x33990c);},'YHMLd':_0x6e8529[_0x15c8a4(0x512)],'rdmrj':function(_0x21b12b,_0x943692){const _0x5a311d=_0x15c8a4;return _0x6e8529[_0x5a311d(0x197)](_0x21b12b,_0x943692);},'ZvvRJ':_0x6e8529[_0x15c8a4(0x3b6)],'PkWWB':'sIDsU','UDDxi':_0x6e8529['nWefN'],'rlcSZ':_0x6e8529[_0x15c8a4(0x60e)],'NKVmN':'mOkfu','uhCey':function(_0x4cb9e3,_0x29c554){return _0x6e8529['MuEHP'](_0x4cb9e3,_0x29c554);}},{name:_0x1afbc6,connectionType:_0x16b94f,udid:_0x4c2a8e,platform:_0x3c6756}=_0x41d8ce;console[_0x15c8a4(0x44c)](_0x15c8a4(0x4f3)+_0x1afbc6+'\x20('+_0x16b94f+_0x15c8a4(0x692)+_0x3c6756+')...');if(_0x6e8529[_0x15c8a4(0x2c7)](_0x3c6756,_0x6e8529[_0x15c8a4(0x580)])){if(_0x6e8529[_0x15c8a4(0x41b)](_0x6e8529['QFMci'],_0x6e8529['QFMci'])){const _0x28cda7=_0x5950d8[_0x15c8a4(0x260)](/Val:([^\s]+)/);if(_0x28cda7)_0x3064bb[_0x15c8a4(0x47d)]=_0x28cda7[0x1];}else{console[_0x15c8a4(0x44c)](_0x15c8a4(0x373)+_0x1afbc6),_0x6e8529['mbBaB'](stopUIAutomator2Session,_0x4c2a8e,_0x1afbc6)[_0x15c8a4(0x291)](_0x24c87c=>{const _0xce0af=_0x15c8a4;console[_0xce0af(0x5d6)](_0xce0af(0x6c0)+_0x24c87c[_0xce0af(0x5d4)]);});if(_0x6e8529[_0x15c8a4(0x61b)](_0x16b94f,_0x15c8a4(0x2ae))){if(_0x6e8529[_0x15c8a4(0x47b)]('wnbGE',_0x6e8529[_0x15c8a4(0x3a9)]))_0x43dee7+=_0x3d1b45['toString']();else{const _0x5df609=_0x6e8529[_0x15c8a4(0x446)](spawn,_0x6e8529['wHgKc'],[_0x6e8529['HlkIt'],_0x4c2a8e]);_0x5df609['on'](_0x6e8529[_0x15c8a4(0x701)],_0x47480e=>{const _0x3407f6=_0x15c8a4;if(_0x1a8b2b[_0x3407f6(0x312)](_0x1a8b2b[_0x3407f6(0x6bc)],_0x1a8b2b['xHesr'])){console[_0x3407f6(0x44c)](_0x3407f6(0x7c7)+_0x1afbc6+'\x20from\x20ADB');const _0x1c7e59=connectedDevices[_0x3407f6(0x7e3)](_0x4fdd94=>_0x4fdd94[_0x3407f6(0x361)]===_0x1afbc6);_0x1a8b2b[_0x3407f6(0x86b)](_0x1c7e59,-0x1)&&(connectedDevices[_0x1c7e59]['status']=_0x1a8b2b[_0x3407f6(0x434)]);wss['clients'][_0x3407f6(0x57c)](_0x4b5359=>{const _0x46000=_0x3407f6;if(_0x1a8b2b[_0x46000(0x5e4)](_0x1a8b2b[_0x46000(0x249)],_0x1a8b2b[_0x46000(0x249)])){if(_0x1a8b2b[_0x46000(0x787)](_0x4b5359[_0x46000(0x45e)],WebSocket[_0x46000(0x2fc)])){if(_0x1a8b2b['Knxvr'](_0x46000(0x621),_0x1a8b2b[_0x46000(0x282)]))_0x18891a+=_0x571f12[_0x46000(0x67c)]();else{const _0x4f0b0f={};_0x4f0b0f[_0x46000(0x185)]=_0x1a8b2b[_0x46000(0x4d6)],_0x4f0b0f[_0x46000(0x388)]=connectedDevices,_0x4b5359[_0x46000(0x550)](JSON['stringify'](_0x4f0b0f));}}}else _0x4373ce+='COHERE_API_KEY='+_0x480ed6+'\x0a';});const _0x5154da={};_0x5154da[_0x3407f6(0x6ed)]=!![],_0x5154da['message']=_0x3407f6(0x5dd)+_0x1afbc6+_0x3407f6(0x7a0),_0x1a8b2b['rdmrj'](_0x2cfcab,_0x5154da);}else{_0x330c65[_0x3407f6(0x5d6)](ppXeSp['ZbsNL'],_0x3ffddf);const _0x27ec9d={};_0x27ec9d[_0x3407f6(0x6ed)]=![],ppXeSp['JEYSD'](_0x240e87,_0x27ec9d);}});}}else{if(_0x6e8529[_0x15c8a4(0x41b)]('SYAWb',_0x6e8529['ZlVnF'])){const _0x20ffb0=connectedDevices[_0x15c8a4(0x7e3)](_0xa018db=>_0xa018db[_0x15c8a4(0x361)]===_0x1afbc6);_0x6e8529[_0x15c8a4(0x711)](_0x20ffb0,-0x1)&&(connectedDevices[_0x20ffb0]['status']='offline');wss[_0x15c8a4(0x7e9)][_0x15c8a4(0x57c)](_0x25ec1c=>{const _0x2ef36a=_0x15c8a4;if(_0x1a8b2b[_0x2ef36a(0x312)](_0x1a8b2b[_0x2ef36a(0x1d7)],_0x1a8b2b[_0x2ef36a(0x7ed)])){if(_0x1a8b2b[_0x2ef36a(0x5e4)](_0x25ec1c[_0x2ef36a(0x45e)],WebSocket[_0x2ef36a(0x2fc)])){const _0x27f99f={};_0x27f99f['type']=_0x1a8b2b[_0x2ef36a(0x4d6)],_0x27f99f[_0x2ef36a(0x388)]=connectedDevices,_0x25ec1c['send'](JSON[_0x2ef36a(0x19f)](_0x27f99f));}}else{const _0x4ac377={};_0x4ac377[_0x2ef36a(0x744)]=_0x4f8f26,_0x4ac377[_0x2ef36a(0x2fa)]=_0x257d79[_0x2ef36a(0x2fa)],_0x4ac377[_0x2ef36a(0x5d6)]=_0x1a8b2b[_0x2ef36a(0x226)];const _0x2ea287={};_0x2ea287[_0x2ef36a(0x6ed)]=![],_0x2ea287[_0x2ef36a(0x5d6)]=_0x2750fe[_0x2ef36a(0x5d4)],_0x2ea287['appInfo']=_0x4ac377,_0x38fad6[_0x2ef36a(0x8bb)](_0x2ea287);}});const _0x2ac04f={};_0x2ac04f['success']=!![],_0x2ac04f[_0x15c8a4(0x5d4)]=_0x15c8a4(0x5dd)+_0x1afbc6,_0x6e8529['AQEFG'](_0x2cfcab,_0x2ac04f);}else{const _0x23d8d8=_0x28caa6[_0x15c8a4(0x878)]();if(_0x23d8d8['startsWith']('[')||_0x23d8d8[_0x15c8a4(0x310)]('{'))try{const _0x257d1e=_0x26f8f1['parse'](_0x23d8d8);return _0x439f58[_0x15c8a4(0x43a)](_0x6e8529[_0x15c8a4(0x715)],_0x59b021[_0x15c8a4(0x198)](_0x257d1e)?_0x257d1e['length']:_0x15c8a4(0x2ea)),_0x3b5b4b[_0x15c8a4(0x198)](_0x257d1e)?_0x257d1e:[];}catch(_0x6931a2){_0xe1f3a3[_0x15c8a4(0x43a)](_0x6e8529[_0x15c8a4(0x417)],_0x6931a2[_0x15c8a4(0x5d4)]);}}}return;}}const _0x1c857c=connectedDevices['find'](_0x764f44=>_0x764f44['name']===_0x1afbc6),_0x31df1d=_0x1c857c?.['port'];if(wdaProcesses['has'](_0x1afbc6)){if(_0x15c8a4(0x4f0)!==_0x6e8529[_0x15c8a4(0x67f)]){const _0x80de38={};_0x80de38[_0x15c8a4(0x185)]=ppXeSp[_0x15c8a4(0x4d6)],_0x80de38[_0x15c8a4(0x388)]=_0x512d3b,_0x1e4564['send'](_0x40e693[_0x15c8a4(0x19f)](_0x80de38));}else{const _0x49f723=wdaProcesses[_0x15c8a4(0x3a1)](_0x1afbc6);try{if(_0x49f723[_0x15c8a4(0x19a)]){if(_0x6e8529[_0x15c8a4(0x47b)](_0x6e8529[_0x15c8a4(0x86a)],_0x6e8529[_0x15c8a4(0x66b)])){_0x4c9874[_0x15c8a4(0x44c)](_0x15c8a4(0x514)+_0x128e43);const _0x52650e={};_0x52650e[_0x15c8a4(0x6ed)]=!![],_0x52650e[_0x15c8a4(0x741)]=_0x4e0e4f,_0x423f92(_0x52650e);}else try{if(_0x6e8529['MALll']==='kibVX')return _0x4e32f7[_0x15c8a4(0x5d6)](_0x6e8529[_0x15c8a4(0x423)],_0x47166b),[];else process[_0x15c8a4(0x584)](_0x49f723[_0x15c8a4(0x19a)],_0x6e8529['vBpZX']),console[_0x15c8a4(0x44c)](_0x15c8a4(0x662)+_0x1afbc6+_0x15c8a4(0x7b4)+_0x49f723[_0x15c8a4(0x19a)]+')');}catch(_0xc4fea4){console[_0x15c8a4(0x44c)](_0x15c8a4(0x7bd)+_0x49f723[_0x15c8a4(0x19a)]+_0x15c8a4(0x870));}}if(_0x49f723[_0x15c8a4(0x529)])try{if(_0x6e8529[_0x15c8a4(0x173)]('OBiec',_0x6e8529[_0x15c8a4(0x54c)]))process[_0x15c8a4(0x584)](_0x49f723[_0x15c8a4(0x529)],_0x6e8529['vBpZX']),console[_0x15c8a4(0x44c)](_0x15c8a4(0x1fc)+_0x1afbc6+_0x15c8a4(0x7b4)+_0x49f723[_0x15c8a4(0x529)]+')');else{_0x4caad0[_0x15c8a4(0x44c)](_0x6e8529['atqEi']);const _0x45f468={};_0x45f468['success']=![],_0x45f468[_0x15c8a4(0x5d6)]=_0x6e8529[_0x15c8a4(0x29e)],_0x526489['status'](0x1f4)['json'](_0x45f468);}}catch(_0x22304f){if(_0x6e8529[_0x15c8a4(0x57b)](_0x6e8529[_0x15c8a4(0x3ff)],_0x6e8529['RpTGx']))console[_0x15c8a4(0x44c)](_0x15c8a4(0x6ad)+_0x49f723[_0x15c8a4(0x529)]+'\x20already\x20stopped');else{const _0xeef86b={};_0xeef86b[_0x15c8a4(0x185)]=ZbDvrp[_0x15c8a4(0x6ca)],_0xeef86b['devices']=_0x317736,_0x5c276f[_0x15c8a4(0x550)](_0x4e906c[_0x15c8a4(0x19f)](_0xeef86b));}}wdaProcesses[_0x15c8a4(0x32c)](_0x1afbc6);}catch(_0x3af601){if(_0x6e8529[_0x15c8a4(0x47b)](_0x6e8529[_0x15c8a4(0x52f)],_0x6e8529[_0x15c8a4(0x4b8)])){if(ZbDvrp[_0x15c8a4(0x47b)](_0xd7fbec[_0x15c8a4(0x45e)],_0x11e7ac[_0x15c8a4(0x2fc)])){const _0x47f09e={};_0x47f09e[_0x15c8a4(0x185)]=_0x15c8a4(0x326),_0x47f09e[_0x15c8a4(0x388)]=_0x9fe7ff,_0x9bfa8a[_0x15c8a4(0x550)](_0x1d6f3a[_0x15c8a4(0x19f)](_0x47f09e));}}else console[_0x15c8a4(0x5d6)](_0x15c8a4(0x5fc)+_0x1afbc6+':',_0x3af601);}}}if(_0x31df1d){console['log']('🔍\x20Killing\x20processes\x20on\x20port\x20'+_0x31df1d+_0x15c8a4(0x1a7)+_0x1afbc6+_0x15c8a4(0x7a8));const _0x278aac=_0x6e8529['mbBaB'](spawn,'sh',['-c',_0x15c8a4(0x363)+_0x31df1d+_0x15c8a4(0x2e7)]);_0x278aac['on'](_0x6e8529[_0x15c8a4(0x701)],()=>{const _0x2811de=_0x15c8a4,_0x48fb05={};_0x48fb05[_0x2811de(0x7f6)]=_0x1a8b2b[_0x2811de(0x242)];const _0x43d3fc=_0x48fb05;if(_0x1a8b2b[_0x2811de(0x86b)](_0x1a8b2b[_0x2811de(0x3a3)],_0x2811de(0x429))){if(_0x47cd95){const _0x1c3abb={};_0x1c3abb[_0x2811de(0x6ed)]=![],_0x1c3abb[_0x2811de(0x5d6)]=_0x43d3fc[_0x2811de(0x7f6)],_0x3b2f80[_0x2811de(0x890)](0x194)[_0x2811de(0x8bb)](_0x1c3abb);}}else console['log'](_0x2811de(0x78c)+_0x31df1d+'\x20for\x20'+_0x1afbc6);});}if(_0x4c2a8e&&_0x16b94f===_0x15c8a4(0x3b2)){console[_0x15c8a4(0x44c)]('🔍\x20Killing\x20WDA\x20for\x20UDID\x20'+_0x4c2a8e+_0x15c8a4(0x7a8));const _0x1f1d56=_0x6e8529[_0x15c8a4(0x446)](spawn,'sh',['-c','pkill\x20-f\x20\x22xcodebuild.*'+_0x4c2a8e+_0x15c8a4(0x85e)]);_0x1f1d56['on'](_0x6e8529['FUemZ'],()=>{const _0x471a9e=_0x15c8a4;_0x6e8529['ATVfY'](_0x471a9e(0x22a),_0x6e8529[_0x471a9e(0x660)])?(_0x5988f1=_0x471a9e(0x292)+_0x1bef54+','+_0x2ba499,_0x2faea1[_0x471a9e(0x44c)]('\x0a🖱️\x20API:\x20Tapping\x20at\x20coordinates\x20('+_0x7e6cfa+','+_0x55375e+_0x471a9e(0x5de)+_0x2a9995)):console[_0x471a9e(0x44c)](_0x471a9e(0x53b)+_0x1afbc6);});}if(_0x6e8529[_0x15c8a4(0x47b)](_0x16b94f,_0x6e8529[_0x15c8a4(0x60a)])&&_0x31df1d){if(_0x6e8529[_0x15c8a4(0x53a)]===_0x6e8529[_0x15c8a4(0x53a)]){const _0xd5b2ad=spawn('sh',['-c',_0x15c8a4(0x5ca)+_0x31df1d+_0x15c8a4(0x85e)]);_0xd5b2ad['on']('close',()=>{const _0x2774f9=_0x15c8a4,_0x5a66ad={'LcwjO':_0x6e8529[_0x2774f9(0x580)],'gftxk':function(_0x168066,_0x344342){const _0x507be3=_0x2774f9;return _0x6e8529[_0x507be3(0x2b5)](_0x168066,_0x344342);},'mOIio':function(_0x34f9dc,_0x5138c0){return _0x6e8529['whFwm'](_0x34f9dc,_0x5138c0);},'ARALC':_0x6e8529['uBnDz']};if(_0x6e8529[_0x2774f9(0x1f7)](_0x6e8529[_0x2774f9(0x896)],_0x6e8529[_0x2774f9(0x6a3)])){if(_0x391b0c[_0x2774f9(0x1bf)](':')&&_0x5c9f28[_0x2774f9(0x260)](/^\d+\.\d+\.\d+\.\d+:\d+$/))_0x7f7ad6=LGrjiC[_0x2774f9(0x24a)];else{if(LGrjiC[_0x2774f9(0x4b4)](_0x234f52[_0x2774f9(0x3c8)],0x14)&&!_0x59eb41[_0x2774f9(0x1bf)]('-'))_0x4ea1ae=LGrjiC[_0x2774f9(0x24a)];else _0x1ad770[_0x2774f9(0x1bf)]('-')&&LGrjiC[_0x2774f9(0x83e)](_0x37b47e[_0x2774f9(0x3c8)],0x1e)&&(_0x3b2d17=LGrjiC[_0x2774f9(0x2ce)]);}}else console['log'](_0x2774f9(0x80a)+_0x1afbc6);});}else{_0x4324f9[_0x15c8a4(0x5d6)]('['+_0x11f793+_0x15c8a4(0x88b)+_0x978ae5['message']);const _0x31b8ac={};_0x31b8ac[_0x15c8a4(0x6ed)]=![],_0x31b8ac[_0x15c8a4(0x5d6)]=_0xb129a7[_0x15c8a4(0x5d4)],_0x31b8ac['device']=_0xca128f,ppXeSp['JEYSD'](_0x356447,_0x31b8ac);}}_0x6e8529[_0x15c8a4(0x71b)](setTimeout,()=>{const _0x3a632e=_0x15c8a4,_0x2a146a=connectedDevices[_0x3a632e(0x7e3)](_0x34bd6c=>_0x34bd6c[_0x3a632e(0x361)]===_0x1afbc6);_0x2a146a!==-0x1&&(connectedDevices[_0x2a146a][_0x3a632e(0x890)]=_0x3a632e(0x23c));wss[_0x3a632e(0x7e9)][_0x3a632e(0x57c)](_0x1d0fcb=>{const _0x122633=_0x3a632e;if(_0x1d0fcb['readyState']===WebSocket[_0x122633(0x2fc)]){const _0x2dc318={};_0x2dc318[_0x122633(0x185)]=_0x122633(0x326),_0x2dc318['devices']=connectedDevices,_0x1d0fcb[_0x122633(0x550)](JSON[_0x122633(0x19f)](_0x2dc318));}}),console[_0x3a632e(0x44c)](_0x3a632e(0x2d9)+_0x1afbc6);const _0x1ae630={};_0x1ae630[_0x3a632e(0x6ed)]=!![],_0x1ae630[_0x3a632e(0x5d4)]=_0x3a632e(0x5dd)+_0x1afbc6+_0x3a632e(0x504),_0x1a8b2b[_0x3a632e(0x4a0)](_0x2cfcab,_0x1ae630);},0x1f4);});}async function ensureRecordingsDir(){const _0x2f5414=_0x28fe54;try{await fs[_0x2f5414(0x2d4)](RECORDINGS_DIR);}catch{const _0x31b16d={};_0x31b16d[_0x2f5414(0x307)]=!![],await fs[_0x2f5414(0x39c)](RECORDINGS_DIR,_0x31b16d);}}async function startRecording(_0x4143de,_0x2a174e){const _0x26c791=_0x28fe54,_0x328bdc={'xwLWC':_0x26c791(0x202),'Wibhg':function(_0x47df04){return _0x47df04();}},_0x244a8f=_0x328bdc[_0x26c791(0x87f)][_0x26c791(0x394)]('|');let _0x3e9c06=0x0;while(!![]){switch(_0x244a8f[_0x3e9c06++]){case'0':currentRecording={'name':_0x4143de||_0x26c791(0x411)+Date[_0x26c791(0x480)](),'devices':_0x2a174e||[],'commands':[],'startTime':new Date()[_0x26c791(0x5c9)]()};continue;case'1':await _0x328bdc[_0x26c791(0x2c4)](ensureRecordingsDir);continue;case'2':const _0x144427={};_0x144427[_0x26c791(0x6ed)]=!![],_0x144427[_0x26c791(0x290)]=currentRecording;return _0x144427;case'3':console['log'](_0x26c791(0x7ef)+currentRecording[_0x26c791(0x361)]);continue;case'4':isRecording=!![];continue;}break;}}function recordCommand(_0x5de68e,_0x4d4677,_0x356a7f,_0x21ce9b){const _0x3859f3=_0x28fe54,_0x21688e={};_0x21688e[_0x3859f3(0x31f)]=function(_0xac939d,_0x1e61f1){return _0xac939d||_0x1e61f1;};const _0x3721c7=_0x21688e;if(_0x3721c7[_0x3859f3(0x31f)](!isRecording,!currentRecording))return![];return currentRecording[_0x3859f3(0x8e1)][_0x3859f3(0x80f)]({'timestamp':new Date()[_0x3859f3(0x5c9)](),'devices':_0x5de68e,'originalCommand':_0x4d4677,'useAI':_0x356a7f,'finalCommand':_0x21ce9b||_0x4d4677}),console[_0x3859f3(0x44c)](_0x3859f3(0x393)+_0x4d4677+'\x20('+currentRecording[_0x3859f3(0x8e1)]['length']+'\x20total)'),!![];}async function stopRecording(){const _0x22496a=_0x28fe54,_0x418f98={};_0x418f98[_0x22496a(0x42e)]=function(_0x14a6c1,_0x3ab555){return _0x14a6c1||_0x3ab555;},_0x418f98[_0x22496a(0x88a)]='No\x20active\x20recording';const _0x1a6f80=_0x418f98;if(_0x1a6f80['qaNLr'](!isRecording,!currentRecording)){const _0x20e6a2={};return _0x20e6a2[_0x22496a(0x6ed)]=![],_0x20e6a2['error']=_0x1a6f80['kjIBQ'],_0x20e6a2;}currentRecording[_0x22496a(0x8b7)]=new Date()[_0x22496a(0x5c9)]();const _0x4e602a=currentRecording[_0x22496a(0x361)]+_0x22496a(0x1e7),_0xe36759=path[_0x22496a(0x184)](RECORDINGS_DIR,_0x4e602a);await fs['writeFile'](_0xe36759,JSON[_0x22496a(0x19f)](currentRecording,null,0x2));const _0x5833cf={};_0x5833cf[_0x22496a(0x6ed)]=!![],_0x5833cf[_0x22496a(0x290)]=currentRecording,_0x5833cf[_0x22496a(0x4cb)]=_0x4e602a;const _0xdbdff8=_0x5833cf;return console[_0x22496a(0x44c)](_0x22496a(0x578)+currentRecording[_0x22496a(0x361)]+'\x20('+currentRecording[_0x22496a(0x8e1)]['length']+_0x22496a(0x5fd)),isRecording=![],currentRecording=null,_0xdbdff8;}async function listRecordings(){const _0x1f32f7=_0x28fe54,_0x1ede0b={'cTdBv':function(_0x165edd){return _0x165edd();},'YvilD':'.json','MCmgb':function(_0x1459b5,_0x3bbb67){return _0x1459b5!==_0x3bbb67;},'fZxtY':_0x1f32f7(0x679),'vrwdG':'NynzL','kRqUy':function(_0x2bcc99,_0x2e1594){return _0x2bcc99===_0x2e1594;},'OkywI':_0x1f32f7(0x684),'rpAuP':'drnwc','EjJBP':'CfYwR','DthFE':_0x1f32f7(0x261),'DzPHp':'Error\x20listing\x20recordings:'};await _0x1ede0b[_0x1f32f7(0x862)](ensureRecordingsDir);try{const _0x4d4b87=await fs[_0x1f32f7(0x855)](RECORDINGS_DIR),_0x233b73=[];for(const _0x348066 of _0x4d4b87){if(_0x348066[_0x1f32f7(0x51d)](_0x1ede0b[_0x1f32f7(0x81d)]))try{if(_0x1ede0b['MCmgb'](_0x1f32f7(0x679),_0x1ede0b[_0x1f32f7(0x776)])){const _0x486e76={};return _0x486e76[_0x1f32f7(0x6ed)]=![],_0x486e76[_0x1f32f7(0x5d6)]=_0x1f32f7(0x8c1),_0x16a8f0[_0x1f32f7(0x890)](0x190)[_0x1f32f7(0x8bb)](_0x486e76);}else{const _0x216aba=path['join'](RECORDINGS_DIR,_0x348066),_0x2d9550=await fs[_0x1f32f7(0x599)](_0x216aba,_0x1f32f7(0x6ba)),_0x427103=JSON['parse'](_0x2d9550);let _0x5c6ca0=0x0;if(Array[_0x1f32f7(0x198)](_0x427103[_0x1f32f7(0x8e1)]))_0x1ede0b[_0x1f32f7(0x18c)]===_0x1f32f7(0x87d)?_0xe68178['push']({'name':_0x5154cf,'path':_0x4e1442,'isDirectory':_0x53247a[_0x1f32f7(0x687)](),'size':_0x192117[_0x1f32f7(0x6c9)],'modified':_0x1ef141[_0x1f32f7(0x447)]}):_0x5c6ca0=_0x427103[_0x1f32f7(0x8e1)][_0x1f32f7(0x3c8)];else _0x1ede0b[_0x1f32f7(0x17c)](typeof _0x427103[_0x1f32f7(0x8e1)],_0x1ede0b[_0x1f32f7(0x437)])&&(_0x1ede0b[_0x1f32f7(0x82e)](_0x1ede0b[_0x1f32f7(0x490)],_0x1ede0b[_0x1f32f7(0x58f)])?_0x5c6ca0=_0x427103[_0x1f32f7(0x8e1)]['split']('\x0a')[_0x1f32f7(0x6fc)](_0x37627b=>_0x37627b['trim']())[_0x1f32f7(0x3c8)]:_0x5c5df4['error'](_0x1f32f7(0x5fc)+_0x1fc5ae+':',_0x35210c));_0x233b73[_0x1f32f7(0x80f)]({'filename':_0x348066,'name':_0x427103[_0x1f32f7(0x361)]||_0x348066[_0x1f32f7(0x8e7)](_0x1ede0b[_0x1f32f7(0x81d)],''),'devices':_0x427103[_0x1f32f7(0x388)]||[],'commandCount':_0x5c6ca0,'startTime':_0x427103[_0x1f32f7(0x369)]||_0x427103[_0x1f32f7(0x500)],'endTime':_0x427103[_0x1f32f7(0x8b7)]||_0x427103[_0x1f32f7(0x500)],'type':_0x427103['type']||_0x1ede0b[_0x1f32f7(0x814)]});}}catch(_0x60c4b2){console['error']('Error\x20reading\x20recording\x20'+_0x348066+':',_0x60c4b2);}}return _0x233b73;}catch(_0x374af8){return console[_0x1f32f7(0x5d6)](_0x1ede0b[_0x1f32f7(0x7b8)],_0x374af8),[];}}async function loadRecording(_0x2e623b){const _0x35814a=_0x28fe54,_0x1c4a43={};_0x1c4a43[_0x35814a(0x463)]=_0x35814a(0x6ba);const _0x1341bc=_0x1c4a43,_0x1c6988=path[_0x35814a(0x184)](RECORDINGS_DIR,_0x2e623b);try{const _0x1d8ba6=await fs['readFile'](_0x1c6988,_0x1341bc[_0x35814a(0x463)]);return JSON[_0x35814a(0x3f9)](_0x1d8ba6);}catch(_0x50c540){console[_0x35814a(0x5d6)](_0x35814a(0x3bf)+_0x2e623b+':',_0x50c540);throw _0x50c540;}}async function deleteRecording(_0x1eb214){const _0x1bce39=_0x28fe54,_0x5a3179={};_0x5a3179[_0x1bce39(0x89b)]=function(_0x28d548,_0x1e7629){return _0x28d548===_0x1e7629;},_0x5a3179['wFePS']=_0x1bce39(0x650);const _0x546b21=_0x5a3179,_0x264152=path[_0x1bce39(0x184)](RECORDINGS_DIR,_0x1eb214);try{if(_0x546b21[_0x1bce39(0x89b)](_0x546b21['wFePS'],'thywz')){await fs[_0x1bce39(0x8a9)](_0x264152);const _0x54c3e7={};return _0x54c3e7[_0x1bce39(0x6ed)]=!![],_0x54c3e7;}else{_0x5e950f[_0x1bce39(0x5d6)](_0x1bce39(0x21b)+_0x236507[_0x1bce39(0x5d4)]);const _0x1f2ebd={};_0x1f2ebd[_0x1bce39(0x185)]=_0x1bce39(0x353),_0x1f2ebd['error']=_0x4e3529['message'],_0x1f2ebd[_0x1bce39(0x5c8)]=_0x5e3f9f,_0x5d1939['send'](_0x1f7adc['stringify'](_0x1f2ebd));return;}}catch(_0x46d3cd){console[_0x1bce39(0x5d6)]('Error\x20deleting\x20recording\x20'+_0x1eb214+':',_0x46d3cd);throw _0x46d3cd;}}async function replayRecording(_0x5ca963,_0x2a797a,_0x1a11ec){const _0x284dc4=_0x28fe54,_0x1b6b05={'aEeWB':function(_0x3a15fe,_0xad900e){return _0x3a15fe(_0xad900e);},'wYECx':_0x284dc4(0x23c),'SWsrl':_0x284dc4(0x327),'Ropbi':function(_0xc5659a,_0x3f8086){return _0xc5659a(_0x3f8086);},'pQoWH':_0x284dc4(0x844),'zTzBJ':_0x284dc4(0x7ab),'FxNcT':function(_0x1d1584,_0x4f3e7f){return _0x1d1584(_0x4f3e7f);},'rVsjK':_0x284dc4(0x428),'hDIxQ':function(_0x2e9a89,_0x34357e){return _0x2e9a89===_0x34357e;},'gEtop':'string','dACym':function(_0x26190a,_0x22736f){return _0x26190a===_0x22736f;},'jJVLf':_0x284dc4(0x87a),'CYbQy':_0x284dc4(0x541),'fohlH':function(_0x57b276,_0x282b12){return _0x57b276>_0x282b12;},'qSmAC':function(_0x2bf45f,_0x52ba44){return _0x2bf45f!==_0x52ba44;},'mmZKn':_0x284dc4(0x426),'muGyX':'BkIrc','uEPof':function(_0x70f4f,_0x42dd14){return _0x70f4f+_0x42dd14;},'IMTAL':function(_0x163c7a,_0x552634){return _0x163c7a<_0x552634;},'ZlJiH':function(_0x1ce0af,_0x2ea330){return _0x1ce0af!==_0x2ea330;},'YcQNQ':'slHSa','Zilyt':_0x284dc4(0x71c),'vmxwV':_0x284dc4(0x375),'HQtfj':'Replay\x20aborted\x20by\x20user','YNUiS':function(_0x17189a,_0x4207ab){return _0x17189a===_0x4207ab;},'Nveok':_0x284dc4(0x582),'PhLjO':'JIcfO','keqvJ':'vefux','tWSMS':function(_0x58a8ad,_0x4029e2,_0x4274c7,_0x14087a){return _0x58a8ad(_0x4029e2,_0x4274c7,_0x14087a);},'lomLu':function(_0x57a48b,_0x4323e3){return _0x57a48b!==_0x4323e3;},'wYsux':_0x284dc4(0x371),'WWwYi':_0x284dc4(0x284),'fHDtx':function(_0x3c3c35,_0x4b39c6){return _0x3c3c35-_0x4b39c6;}},_0x2912a1=await _0x1b6b05[_0x284dc4(0x1e5)](loadRecording,_0x5ca963);let _0x150dfe=[];if(Array[_0x284dc4(0x198)](_0x2912a1[_0x284dc4(0x8e1)]))_0x1b6b05[_0x284dc4(0x8f3)]===_0x1b6b05[_0x284dc4(0x8f3)]?_0x150dfe=_0x2912a1[_0x284dc4(0x8e1)][_0x284dc4(0x2d1)](_0x545dfb=>_0x545dfb[_0x284dc4(0x2cf)]||_0x545dfb['originalCommand']):_0x17f366=_0x12d305[_0x284dc4(0x3ee)];else{if(_0x1b6b05[_0x284dc4(0x665)](typeof _0x2912a1[_0x284dc4(0x8e1)],_0x1b6b05['gEtop'])){if(_0x1b6b05['dACym'](_0x1b6b05[_0x284dc4(0x322)],_0x1b6b05[_0x284dc4(0x271)])){const _0x2389de=_0x28242a['filter'](_0x34a7dc=>_0x34a7dc[_0x284dc4(0x890)]===_0x284dc4(0x53c))[_0x284dc4(0x3c8)],_0x370469=_0x36fd10[_0x284dc4(0x6fc)](_0xde0f62=>_0xde0f62[_0x284dc4(0x890)]===_0x284dc4(0x268))[_0x284dc4(0x3c8)],_0x1bb29e={};_0x1bb29e['success']=!![],_0x1bb29e[_0x284dc4(0x6c7)]=_0x566bfe,_0x1bb29e[_0x284dc4(0x4e1)]=_0x2389de+'/'+_0x140a4d[_0x284dc4(0x3c8)]+_0x284dc4(0x293),BPaQED[_0x284dc4(0x6da)](_0x2945af,_0x1bb29e);}else _0x150dfe=_0x2912a1[_0x284dc4(0x8e1)][_0x284dc4(0x394)]('\x0a')[_0x284dc4(0x6fc)](_0xc24d95=>_0xc24d95[_0x284dc4(0x878)]());}}const _0x84c400=_0x2912a1[_0x284dc4(0x388)]&&_0x1b6b05[_0x284dc4(0x863)](_0x2912a1[_0x284dc4(0x388)][_0x284dc4(0x3c8)],0x0)?_0x2912a1[_0x284dc4(0x388)]:_0x2a797a;console[_0x284dc4(0x44c)](_0x284dc4(0x382)+_0x2912a1[_0x284dc4(0x361)]),console[_0x284dc4(0x44c)](_0x284dc4(0x44d)+_0x84c400[_0x284dc4(0x184)](',\x20')),console[_0x284dc4(0x44c)]('Target\x20devices:\x20'+_0x2a797a[_0x284dc4(0x184)](',\x20')),console[_0x284dc4(0x44c)](_0x284dc4(0x288)+_0x150dfe[_0x284dc4(0x3c8)]),replayAborted=![],isReplaying=!![];_0x1a11ec&&(_0x1b6b05[_0x284dc4(0x777)](_0x1b6b05['mmZKn'],_0x1b6b05['muGyX'])?_0x1a11ec[_0x284dc4(0x550)](JSON['stringify']({'type':_0x1b6b05[_0x284dc4(0x485)],'data':_0x1b6b05[_0x284dc4(0x5ae)](_0x1b6b05[_0x284dc4(0x5ae)](_0x284dc4(0x294)+_0x2912a1[_0x284dc4(0x361)]+'\x0a'+(_0x284dc4(0x41a)+_0x2a797a[_0x284dc4(0x184)](',\x20')+'\x0a'),_0x284dc4(0x3a4)+_0x150dfe['length']+'\x0a'),'━'[_0x284dc4(0x34f)](0x32)+'\x0a\x0a'),'devices':_0x2a797a})):_0x5add1b+=_0x20634a[_0x284dc4(0x67c)]());const _0x34b244=[];for(let _0x3d45c3=0x0;_0x1b6b05[_0x284dc4(0x301)](_0x3d45c3,_0x150dfe[_0x284dc4(0x3c8)]);_0x3d45c3++){if(_0x1b6b05[_0x284dc4(0x191)]('slHSa',_0x1b6b05['YcQNQ']))_0x547e8a[_0x258da3][_0x284dc4(0x890)]=BPaQED['wYECx'];else{if(replayAborted){console[_0x284dc4(0x44c)](_0x1b6b05[_0x284dc4(0x533)]);if(_0x1a11ec){const _0x47a67a={};_0x47a67a[_0x284dc4(0x185)]=_0x1b6b05[_0x284dc4(0x485)],_0x47a67a['data']=_0x1b6b05[_0x284dc4(0x2e1)],_0x47a67a[_0x284dc4(0x388)]=_0x2a797a,_0x1a11ec[_0x284dc4(0x550)](JSON[_0x284dc4(0x19f)](_0x47a67a));}isReplaying=![];throw new Error(_0x1b6b05[_0x284dc4(0x849)]);}const _0x4e0177=_0x150dfe[_0x3d45c3];console[_0x284dc4(0x44c)]('\x0a🎬\x20Replaying\x20command\x20'+(_0x3d45c3+0x1)+'/'+_0x150dfe[_0x284dc4(0x3c8)]),console['log'](_0x284dc4(0x634)+_0x4e0177);if(_0x1a11ec){if(_0x1b6b05['YNUiS'](_0x1b6b05[_0x284dc4(0x21f)],_0x1b6b05[_0x284dc4(0x8dd)])){const _0xeef3b9={};_0xeef3b9['stdio']=BPaQED[_0x284dc4(0x40e)],_0x23aba7(_0x284dc4(0x7e1)+_0x586db5,_0xeef3b9),_0x20074a++;}else _0x1a11ec['send'](JSON[_0x284dc4(0x19f)]({'type':_0x1b6b05[_0x284dc4(0x485)],'data':_0x284dc4(0x61c)+_0x1b6b05[_0x284dc4(0x5ae)](_0x3d45c3,0x1)+'/'+_0x150dfe[_0x284dc4(0x3c8)]+_0x284dc4(0x552)+_0x4e0177+'\x0a','devices':_0x2a797a}));}try{if(_0x1b6b05['keqvJ']!==_0x284dc4(0x2af)){const _0x252f83=await _0x1b6b05['tWSMS'](executeCommand,_0x2a797a,_0x4e0177,null),_0x2c0ca4={};_0x2c0ca4[_0x284dc4(0x75c)]=_0x4e0177,_0x2c0ca4[_0x284dc4(0x6ed)]=!![],_0x2c0ca4[_0x284dc4(0x792)]=_0x252f83,_0x34b244[_0x284dc4(0x80f)](_0x2c0ca4);if(_0x1a11ec){if(_0x1b6b05[_0x284dc4(0x66a)](_0x1b6b05[_0x284dc4(0x3a7)],_0x1b6b05[_0x284dc4(0x334)])){const _0x52d6a7={};_0x52d6a7['type']=_0x1b6b05['zTzBJ'],_0x52d6a7[_0x284dc4(0x46a)]=_0x284dc4(0x882),_0x52d6a7[_0x284dc4(0x388)]=_0x2a797a,_0x1a11ec[_0x284dc4(0x550)](JSON[_0x284dc4(0x19f)](_0x52d6a7));}else{const _0x589b7f=_0x3f65f4['match'](/📍\s+([^\[]+?)(?:\s*\[|\s*Label)/);_0x589b7f&&(_0xeb8e2a[_0x284dc4(0x361)]=_0x589b7f[0x1][_0x284dc4(0x878)](),_0x28af1d[_0x284dc4(0x598)]=_0x589b7f[0x1][_0x284dc4(0x878)]());const _0x50d1b0=_0x39e683[_0x284dc4(0x260)](/\[([^\]]+)\]/);if(_0x50d1b0)_0x5990bc[_0x284dc4(0x185)]=_0x50d1b0[0x1][_0x284dc4(0x878)]();const _0x3ec358=_0x47ff2e['match'](/Label:([^\s]+?)(?:\s*Val:|\s*@|\s*✓)/);if(_0x3ec358)_0x318bf4[_0x284dc4(0x549)]=_0x3ec358[0x1][_0x284dc4(0x878)]();const _0x4fecbd=_0x300294[_0x284dc4(0x260)](/Val:([^\s]+?)(?:\s*@|\s*✓)/);if(_0x4fecbd)_0x4f5887[_0x284dc4(0x47d)]=_0x4fecbd[0x1]['trim']();const _0x2b3a0d=_0x230d9a[_0x284dc4(0x260)](/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);_0x2b3a0d&&(_0x11a995['x']=_0x47d78a(_0x2b3a0d[0x1]),_0x3be5f6['y']=_0x1b6b05['aEeWB'](_0x4fae4e,_0x2b3a0d[0x2]),_0x11bf11[_0x284dc4(0x286)]=_0x1b6b05[_0x284dc4(0x5c6)](_0x2b6574,_0x2b3a0d[0x3]),_0x58a785[_0x284dc4(0x8d8)]=_0x472539(_0x2b3a0d[0x4]),_0x51cbab[_0x284dc4(0x49d)]='('+_0x3c3aa4['x']+','+_0x44ad37['y']+')\x20'+_0x4b0a35[_0x284dc4(0x286)]+'x'+_0x120c89[_0x284dc4(0x8d8)]);const _0x3db8b5=_0x59f6a9[_0x284dc4(0x260)](/ID:([^\s]+)/);if(_0x3db8b5)_0x304496['resourceId']=_0x3db8b5[0x1]['trim']();_0x4c2ecd[_0x284dc4(0x7e6)]=_0x2ba061['includes'](_0x1b6b05[_0x284dc4(0x1ba)]),_0x417dce[_0x284dc4(0x675)]=_0x44e276['includes'](_0x284dc4(0x739));}}_0x3d45c3<_0x1b6b05[_0x284dc4(0x76a)](_0x150dfe[_0x284dc4(0x3c8)],0x1)&&await new Promise(_0x59c4d6=>setTimeout(_0x59c4d6,0x3e8));}else{const _0x2b3531={};_0x2b3531[_0x284dc4(0x185)]=BPaQED[_0x284dc4(0x485)],_0x2b3531['data']='['+_0x14e8eb+']\x20'+_0x79038e,_0x2b3531[_0x284dc4(0x388)]=[_0x4410ab],_0x51e601['send'](_0x4cdf16['stringify'](_0x2b3531));}}catch(_0x405d6b){console[_0x284dc4(0x5d6)](_0x284dc4(0x571)+_0x1b6b05[_0x284dc4(0x5ae)](_0x3d45c3,0x1)+'\x20failed:',_0x405d6b[_0x284dc4(0x5d4)]);const _0x1f6d19={};_0x1f6d19[_0x284dc4(0x75c)]=_0x4e0177,_0x1f6d19[_0x284dc4(0x6ed)]=![],_0x1f6d19[_0x284dc4(0x5d6)]=_0x405d6b[_0x284dc4(0x5d4)],_0x34b244[_0x284dc4(0x80f)](_0x1f6d19);if(_0x1a11ec){const _0x5a232b={};_0x5a232b[_0x284dc4(0x185)]=_0x1b6b05[_0x284dc4(0x485)],_0x5a232b[_0x284dc4(0x46a)]=_0x284dc4(0x3d2)+_0x405d6b[_0x284dc4(0x5d4)]+'\x0a\x0a',_0x5a232b[_0x284dc4(0x388)]=_0x2a797a,_0x1a11ec[_0x284dc4(0x550)](JSON[_0x284dc4(0x19f)](_0x5a232b));}}}}isReplaying=![],console[_0x284dc4(0x44c)](_0x284dc4(0x828)),console[_0x284dc4(0x44c)]('Total:\x20'+_0x34b244[_0x284dc4(0x3c8)]+_0x284dc4(0x609)+_0x34b244[_0x284dc4(0x6fc)](_0x26cf31=>_0x26cf31[_0x284dc4(0x6ed)])[_0x284dc4(0x3c8)]+_0x284dc4(0x706)+_0x34b244[_0x284dc4(0x6fc)](_0x12bd99=>!_0x12bd99[_0x284dc4(0x6ed)])[_0x284dc4(0x3c8)]);const _0x4dde3e={};return _0x4dde3e[_0x284dc4(0x6ed)]=!![],_0x4dde3e[_0x284dc4(0x290)]=_0x2912a1[_0x284dc4(0x361)],_0x4dde3e[_0x284dc4(0x6c7)]=_0x34b244,_0x4dde3e;}app[_0x28fe54(0x3a1)](_0x28fe54(0x305),(_0x1fe76b,_0x1f3b39)=>{const _0x2b63bf=_0x28fe54;_0x1f3b39[_0x2b63bf(0x8bb)]({'status':'ok','timestamp':Date['now']()});}),app[_0x28fe54(0x3a1)](_0x28fe54(0x38a),async(_0x87451d,_0x50cb24)=>{const _0x485c9a=_0x28fe54,_0x1ac2e={'TycIl':_0x485c9a(0x7ab),'ILtnI':function(_0x40e89d,_0x390ffc){return _0x40e89d!==_0x390ffc;},'aYHAm':'oBHOa','ZOfye':function(_0x2fa9f2){return _0x2fa9f2();},'ebPqb':_0x485c9a(0x4d0),'ADfYY':'ecIIR'};try{if(_0x1ac2e[_0x485c9a(0x3c0)](_0x1ac2e[_0x485c9a(0x474)],'oBHOa')){const _0x5eb8b1=_0x1d463f[_0x485c9a(0x67c)]();_0x3d1508+=_0x5eb8b1,_0x1cb4ef[_0x485c9a(0x43a)]('['+_0x226b1d[_0x485c9a(0x361)]+_0x485c9a(0x543)+_0x5eb8b1[_0x485c9a(0x878)]());}else{const _0x5c24da=await _0x1ac2e[_0x485c9a(0x5be)](discoverDevices),_0x584dfa={};_0x584dfa['success']=!![],_0x584dfa[_0x485c9a(0x388)]=_0x5c24da,_0x50cb24['json'](_0x584dfa);}}catch(_0x17e293){if(_0x1ac2e['ILtnI'](_0x1ac2e['ebPqb'],_0x1ac2e['ADfYY'])){const _0x33ab28={};_0x33ab28['success']=![],_0x33ab28[_0x485c9a(0x5d6)]=_0x17e293[_0x485c9a(0x5d4)],_0x50cb24[_0x485c9a(0x890)](0x1f4)[_0x485c9a(0x8bb)](_0x33ab28);}else{const _0x551b43={};_0x551b43[_0x485c9a(0x185)]=NIzPkp[_0x485c9a(0x513)],_0x551b43['data']=_0x485c9a(0x61c)+(_0x231ada+0x1)+'/'+_0xf955bd[_0x485c9a(0x3c8)]+']\x20Executing:\x20'+_0x4e4d87+'\x0a',_0x551b43['devices']=_0x5647d8,_0x140ce8['send'](_0x47e945['stringify'](_0x551b43));}}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x521),async(_0x189246,_0x4e3f56)=>{const _0x537c65=_0x28fe54,_0x4c0b1d={'iKNfZ':function(_0x406d25,_0x5a0455){return _0x406d25===_0x5a0455;},'jhvbI':_0x537c65(0x326),'kwXyw':function(_0x34fe0b,_0x3facfd){return _0x34fe0b(_0x3facfd);},'ieYeX':_0x537c65(0x180),'IYaNl':function(_0xbd1011){return _0xbd1011();},'aawAu':function(_0x13cd14,_0x568a7a){return _0x13cd14!==_0x568a7a;}};try{const _0x11740d=await _0x4c0b1d['IYaNl'](discoverDevices);wss[_0x537c65(0x7e9)][_0x537c65(0x57c)](_0x4e1fe4=>{const _0x144286=_0x537c65;if(_0x4c0b1d['iKNfZ'](_0x4e1fe4[_0x144286(0x45e)],WebSocket[_0x144286(0x2fc)])){const _0x2a9892={};_0x2a9892[_0x144286(0x185)]=_0x4c0b1d[_0x144286(0x3d5)],_0x2a9892['devices']=_0x11740d,_0x4e1fe4[_0x144286(0x550)](JSON['stringify'](_0x2a9892));}});const _0x52fb21={};_0x52fb21[_0x537c65(0x6ed)]=!![],_0x52fb21[_0x537c65(0x388)]=_0x11740d,_0x4e3f56['json'](_0x52fb21);}catch(_0x52aeea){if(_0x4c0b1d[_0x537c65(0x590)](_0x537c65(0x234),_0x537c65(0x234)))QaIbPU[_0x537c65(0x654)](_0x1c074c,_0x2eed04[_0x537c65(0x1bf)](QaIbPU[_0x537c65(0x6de)]));else{const _0x5d9188={};_0x5d9188[_0x537c65(0x6ed)]=![],_0x5d9188[_0x537c65(0x5d6)]=_0x52aeea[_0x537c65(0x5d4)],_0x4e3f56['status'](0x1f4)[_0x537c65(0x8bb)](_0x5d9188);}}}),app['post'](_0x28fe54(0x8c5),async(_0x303672,_0x3bf177)=>{const _0x185f7c=_0x28fe54,_0x3271a9={'BlTWu':_0x185f7c(0x81b),'gcUHD':_0x185f7c(0x7ab),'VakQA':_0x185f7c(0x852),'eYpgo':function(_0xfdc3d2,_0x11c1f0){return _0xfdc3d2===_0x11c1f0;},'PPvmH':_0x185f7c(0x773),'JSyOP':'vOMWw','HLnnB':function(_0x1f4b82,_0x4cb29c,_0x1422a9,_0x5bf825){return _0x1f4b82(_0x4cb29c,_0x1422a9,_0x5bf825);},'vxndw':function(_0xdc55c4,_0x4cc5f4){return _0xdc55c4!==_0x4cc5f4;},'IApGE':_0x185f7c(0x396),'PUWti':function(_0x4a35c8,_0x2dedad,_0x322b76,_0x799fc1){return _0x4a35c8(_0x2dedad,_0x322b76,_0x799fc1);},'AvyLH':function(_0x3da6e8,_0x43b8f7){return _0x3da6e8!==_0x43b8f7;},'PoYYG':_0x185f7c(0x47c)};try{const {devices:_0x561dc5,command:_0x175ebb,useAI:_0x38aee6,aiProvider:_0x49aff5}=_0x303672[_0x185f7c(0x4eb)];if(!_0x561dc5||_0x3271a9['eYpgo'](_0x561dc5[_0x185f7c(0x3c8)],0x0)){const _0x249683={};return _0x249683[_0x185f7c(0x6ed)]=![],_0x249683[_0x185f7c(0x5d6)]=_0x3271a9[_0x185f7c(0x55f)],_0x3bf177['status'](0x190)['json'](_0x249683);}let _0x28f26c=_0x175ebb;if(_0x38aee6){if(_0x3271a9[_0x185f7c(0x8c8)](_0x3271a9[_0x185f7c(0x374)],_0x3271a9['JSyOP']))_0x28f26c=await _0x3271a9[_0x185f7c(0x8f2)](convertNaturalLanguageToCommand,_0x175ebb,_0x561dc5,_0x49aff5);else return _0x1b81c8[_0x185f7c(0x5d6)](_0x3271a9[_0x185f7c(0x5a8)]),[];}const _0x4966cc=_0x28f26c[_0x185f7c(0x1bf)]('\x0a');let _0x5ec9d6;if(_0x4966cc){if(_0x3271a9['vxndw'](_0x3271a9[_0x185f7c(0x1a0)],_0x3271a9[_0x185f7c(0x1a0)])){const _0x2897e7={};_0x2897e7[_0x185f7c(0x185)]=UPWDVe[_0x185f7c(0x3ca)],_0x2897e7[_0x185f7c(0x46a)]=_0x185f7c(0x5ee)+_0x498b63[_0x185f7c(0x5d4)]+'\x0a',_0x2897e7[_0x185f7c(0x388)]=_0x4d9a2b,_0x33eedc[_0x185f7c(0x550)](_0x523080[_0x185f7c(0x19f)](_0x2897e7));}else _0x5ec9d6=await _0x3271a9[_0x185f7c(0x8f2)](executeCommandsSequentially,_0x561dc5,_0x28f26c,null);}else _0x5ec9d6=await _0x3271a9[_0x185f7c(0x2d5)](executeCommand,_0x561dc5,_0x28f26c,null);_0x3bf177[_0x185f7c(0x8bb)](_0x5ec9d6);}catch(_0x1bf7ae){if(_0x3271a9[_0x185f7c(0x77f)]('WQbxH',_0x3271a9[_0x185f7c(0x880)])){const _0x3ca351={};_0x3ca351[_0x185f7c(0x6ed)]=![],_0x3ca351[_0x185f7c(0x5d6)]=_0x1bf7ae['message'],_0x3bf177['status'](0x1f4)[_0x185f7c(0x8bb)](_0x3ca351);}else try{const {AI_PROVIDERS_CONFIG:_0x963516}=_0x40f4bd(_0x3271a9['VakQA']),_0x3c58b6={};_0x3c58b6['success']=!![],_0x3c58b6['providers']=_0x963516,_0x41c66e[_0x185f7c(0x8bb)](_0x3c58b6);}catch(_0x4c3388){const _0x5ddfbc={};_0x5ddfbc['success']=![],_0x5ddfbc[_0x185f7c(0x5d6)]=_0x4c3388['message'],_0x25c797[_0x185f7c(0x890)](0x1f4)[_0x185f7c(0x8bb)](_0x5ddfbc);}}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x4f8),async(_0x222c55,_0x2b39d1)=>{const _0x3a842c=_0x28fe54;try{const {text:_0x4e2c8b,devices:_0x3c1247,provider:_0x11eff9}=_0x222c55[_0x3a842c(0x4eb)],_0x746b62=await convertNaturalLanguageToCommand(_0x4e2c8b,_0x3c1247||[],_0x11eff9),_0x49ab7a={};_0x49ab7a[_0x3a842c(0x6ed)]=!![],_0x49ab7a[_0x3a842c(0x75c)]=_0x746b62,_0x2b39d1['json'](_0x49ab7a);}catch(_0x5af326){const _0x4bb7dd={};_0x4bb7dd['success']=![],_0x4bb7dd[_0x3a842c(0x5d6)]=_0x5af326[_0x3a842c(0x5d4)],_0x2b39d1['status'](0x1f4)['json'](_0x4bb7dd);}}),app[_0x28fe54(0x8bf)]('/api/devices/connect',async(_0x2fa1dd,_0x4ca6c7)=>{const _0x2be73e=_0x28fe54,_0x56e256={'eLsHs':_0x2be73e(0x6b4),'VtsKR':function(_0x53d318,_0x3895a2){return _0x53d318(_0x3895a2);},'KsRlL':function(_0x1f8ee9,_0x16ec26){return _0x1f8ee9!==_0x16ec26;},'PAZXF':_0x2be73e(0x6cd),'KhYnI':_0x2be73e(0x5ba),'TlBKT':_0x2be73e(0x5a6),'MPWUp':_0x2be73e(0x3bd)};try{const {device:_0x496dc8}=_0x2fa1dd[_0x2be73e(0x4eb)];console[_0x2be73e(0x44c)]('📡\x20Connect\x20request\x20received\x20for\x20device:',_0x496dc8);if(!_0x496dc8){if(_0x56e256[_0x2be73e(0x7e8)](_0x56e256[_0x2be73e(0x7da)],_0x56e256[_0x2be73e(0x7da)])){const _0x5d3eb4=_0xfd0afc[_0x2be73e(0x67c)]();!_0x5d3eb4[_0x2be73e(0x1bf)]('note:')&&!_0x5d3eb4['includes'](KxNbiq['eLsHs'])&&_0x5c2817[_0x2be73e(0x5d6)](_0x2be73e(0x8b9)+_0x5d3eb4[_0x2be73e(0x878)]());}else{console['error'](_0x56e256[_0x2be73e(0x7f2)]);const _0x2766f4={};return _0x2766f4[_0x2be73e(0x6ed)]=![],_0x2766f4[_0x2be73e(0x5d6)]='No\x20device\x20provided',_0x4ca6c7[_0x2be73e(0x890)](0x190)[_0x2be73e(0x8bb)](_0x2766f4);}}if(!_0x496dc8[_0x2be73e(0x361)]||!_0x496dc8[_0x2be73e(0x2a7)]){console['error'](_0x2be73e(0x783),_0x496dc8);const _0x43e2a9={};return _0x43e2a9['success']=![],_0x43e2a9['error']=_0x56e256['TlBKT'],_0x4ca6c7[_0x2be73e(0x890)](0x190)[_0x2be73e(0x8bb)](_0x43e2a9);}const _0x2528c0=await _0x56e256[_0x2be73e(0x1b6)](connectToDevice,_0x496dc8);console[_0x2be73e(0x44c)]('✅\x20Connect\x20result:',_0x2528c0),_0x4ca6c7[_0x2be73e(0x8bb)](_0x2528c0);}catch(_0x5767a4){if(_0x56e256[_0x2be73e(0x7e8)](_0x56e256[_0x2be73e(0x5f3)],'mRjgx')){_0x5dd64e[_0x2be73e(0x5d6)]('['+_0xfb79b0['name']+_0x2be73e(0x70e),_0x13e614);const _0x483753={};_0x483753[_0x2be73e(0x6ed)]=![],_0x483753[_0x2be73e(0x5d6)]=_0x2f0563[_0x2be73e(0x5d4)],_0x483753['device']=_0x418baf['name'],KxNbiq[_0x2be73e(0x1b6)](_0x17e461,_0x483753);}else{console[_0x2be73e(0x5d6)]('❌\x20Connect\x20error:',_0x5767a4);const _0x5c9871={};_0x5c9871['success']=![],_0x5c9871['error']=_0x5767a4[_0x2be73e(0x5d4)],_0x4ca6c7[_0x2be73e(0x890)](0x1f4)['json'](_0x5c9871);}}}),app['post'](_0x28fe54(0x63f),async(_0x410d24,_0xbebacf)=>{const _0x582368=_0x28fe54,_0x2c27fe={'LQWNk':function(_0x406223,_0x5c97f5){return _0x406223(_0x5c97f5);}};try{const {device:_0x59eec3}=_0x410d24['body'],_0x7e35bf=await _0x2c27fe[_0x582368(0x36f)](disconnectFromDevice,_0x59eec3);_0xbebacf['json'](_0x7e35bf);}catch(_0x3192ba){const _0x1223bc={};_0x1223bc[_0x582368(0x6ed)]=![],_0x1223bc[_0x582368(0x5d6)]=_0x3192ba[_0x582368(0x5d4)],_0xbebacf[_0x582368(0x890)](0x1f4)['json'](_0x1223bc);}}),app[_0x28fe54(0x8bf)]('/api/devices/disconnect-all',async(_0xa3c23e,_0x4fd87f)=>{const _0x2bc3ee=_0x28fe54,_0x2dab60={'qMeYn':function(_0x4ab941,_0x3b5e31,_0xc8abe0){return _0x4ab941(_0x3b5e31,_0xc8abe0);},'xnggV':_0x2bc3ee(0x8cb),'WlRJr':function(_0x598eda,_0xb6a176){return _0x598eda!==_0xb6a176;},'XAfUt':_0x2bc3ee(0x565),'Mcwdr':'tioeS'};try{if(_0x2dab60['WlRJr'](_0x2dab60['XAfUt'],_0x2dab60[_0x2bc3ee(0x6a9)])){_0x11df40[_0x2bc3ee(0x5d6)]('Error\x20loading\x20recording\x20'+_0x127a7f+':',_0x431f12);throw _0x3ca8a8;}else{console[_0x2bc3ee(0x44c)](_0x2bc3ee(0x682));const _0x1a5d1b=connectedDevices[_0x2bc3ee(0x6fc)](_0x242477=>_0x242477[_0x2bc3ee(0x890)]===_0x2bc3ee(0x1af));if(_0x1a5d1b[_0x2bc3ee(0x3c8)]===0x0){const _0xa8c589={};return _0xa8c589[_0x2bc3ee(0x6ed)]=!![],_0xa8c589[_0x2bc3ee(0x5d4)]='No\x20devices\x20to\x20disconnect',_0x4fd87f[_0x2bc3ee(0x8bb)](_0xa8c589);}console[_0x2bc3ee(0x44c)](_0x2bc3ee(0x49a)+_0x1a5d1b[_0x2bc3ee(0x3c8)]+'\x20device(s)...');const _0x916486=_0x1a5d1b[_0x2bc3ee(0x2d1)](_0x45ee00=>disconnectFromDevice(_0x45ee00));await Promise[_0x2bc3ee(0x810)](_0x916486),console[_0x2bc3ee(0x44c)](_0x2bc3ee(0x7f4));const _0x3ed597={};_0x3ed597[_0x2bc3ee(0x6ed)]=!![],_0x3ed597['message']='Disconnected\x20'+_0x1a5d1b[_0x2bc3ee(0x3c8)]+_0x2bc3ee(0x264),_0x3ed597[_0x2bc3ee(0x4c4)]=_0x1a5d1b[_0x2bc3ee(0x3c8)],_0x4fd87f[_0x2bc3ee(0x8bb)](_0x3ed597);}}catch(_0x1ebd5a){if(_0x2dab60[_0x2bc3ee(0x69b)]!==_0x2bc3ee(0x367)){_0x2731a2[_0x2bc3ee(0x44c)](_0x2bc3ee(0x3aa)+_0x22b938+_0x2bc3ee(0x1a7)+_0x46d100+_0x2bc3ee(0x7a8));const _0x2e602b=TmRnIV[_0x2bc3ee(0x613)](_0x5ac937,'sh',['-c',_0x2bc3ee(0x363)+_0x4712be+_0x2bc3ee(0x2e7)]);_0x2e602b['on'](TmRnIV[_0x2bc3ee(0x753)],()=>{const _0x1a9848=_0x2bc3ee;_0x3cb66d[_0x1a9848(0x44c)](_0x1a9848(0x78c)+_0x2254f3+_0x1a9848(0x1a7)+_0x130bd5);});}else{console['error'](_0x2bc3ee(0x7b1),_0x1ebd5a);const _0x22320b={};_0x22320b[_0x2bc3ee(0x6ed)]=![],_0x22320b[_0x2bc3ee(0x5d6)]=_0x1ebd5a['message'],_0x4fd87f[_0x2bc3ee(0x890)](0x1f4)[_0x2bc3ee(0x8bb)](_0x22320b);}}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x594),(_0x25585a,_0x3e1141)=>{const _0x3ba15c=_0x28fe54,_0x447b16={};_0x447b16[_0x3ba15c(0x28d)]=_0x3ba15c(0x1f0),_0x447b16[_0x3ba15c(0x3dd)]=function(_0x3ee461,_0x5a266e){return _0x3ee461===_0x5a266e;},_0x447b16['Beqwm']=_0x3ba15c(0x63d);const _0x351811=_0x447b16;try{if(_0x351811['iLbIR'](_0x351811[_0x3ba15c(0x6f0)],_0x351811['Beqwm'])){const _0x30f156=aiManager[_0x3ba15c(0x2a5)](),_0x5ece76=aiManager[_0x3ba15c(0x585)](),_0x520119={};_0x520119[_0x3ba15c(0x6ed)]=!![],_0x520119[_0x3ba15c(0x5ad)]=_0x30f156,_0x520119[_0x3ba15c(0x79b)]=_0x5ece76['id'],_0x3e1141['json'](_0x520119);}else{const _0x411e59={};return _0x411e59[_0x3ba15c(0x6ed)]=![],_0x411e59[_0x3ba15c(0x5d6)]=_0x351811[_0x3ba15c(0x28d)],_0x1b5b68[_0x3ba15c(0x890)](0x190)[_0x3ba15c(0x8bb)](_0x411e59);}}catch(_0x486023){const _0x1dbbb4={};_0x1dbbb4[_0x3ba15c(0x6ed)]=![],_0x1dbbb4[_0x3ba15c(0x5d6)]=_0x486023[_0x3ba15c(0x5d4)],_0x3e1141[_0x3ba15c(0x890)](0x1f4)[_0x3ba15c(0x8bb)](_0x1dbbb4);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x8cf),(_0x5e3db7,_0x90d303)=>{const _0x3f81c5=_0x28fe54,_0x4226bc={'CdrIF':function(_0x32befc,_0x9ca9fe,_0x2bd72e){return _0x32befc(_0x9ca9fe,_0x2bd72e);},'ClWyq':_0x3f81c5(0x3e3),'imqeb':function(_0x5cf6f2,_0x40aeda){return _0x5cf6f2!==_0x40aeda;},'ZWZOx':_0x3f81c5(0x4c0),'WDvnB':function(_0x9029d6,_0x4c6a18){return _0x9029d6===_0x4c6a18;},'eLWwM':'tjYiF'};try{const {provider:_0x108e65}=_0x5e3db7['body'],_0x111317=aiManager['setProvider'](_0x108e65);if(_0x111317){if(_0x4226bc[_0x3f81c5(0x435)](_0x3f81c5(0x390),_0x3f81c5(0x602))){const _0xd56133={};_0xd56133[_0x3f81c5(0x6ed)]=!![],_0xd56133[_0x3f81c5(0x218)]=_0x108e65,_0x90d303[_0x3f81c5(0x8bb)](_0xd56133);}else{const _0x151983=_0x197ac2['map'](_0x5a7a9b=>_0x5a7a9b[_0x3f81c5(0x361)]),_0x5cd22c=SiPPnE[_0x3f81c5(0x604)](_0x35286d,_0x23ee50,SiPPnE[_0x3f81c5(0x1dc)]);_0x2bfe29['log'](_0x3f81c5(0x607)+_0x151983[_0x3f81c5(0x184)](',\x20')),_0x501bef[_0x3f81c5(0x80f)](_0xf125be(_0x179fcd,_0x151983,_0x5cd22c,_0x43f85e));}}else{const _0x1a54d9={};_0x1a54d9['success']=![],_0x1a54d9['error']=_0x4226bc[_0x3f81c5(0x245)],_0x90d303[_0x3f81c5(0x890)](0x190)[_0x3f81c5(0x8bb)](_0x1a54d9);}}catch(_0x6b83fd){if(_0x4226bc[_0x3f81c5(0x25b)](_0x4226bc[_0x3f81c5(0x364)],_0x3f81c5(0x383))){const _0x23e6cb={};_0x23e6cb[_0x3f81c5(0x185)]='devices_updated',_0x23e6cb['devices']=_0x4f2536,_0x264e0d[_0x3f81c5(0x550)](_0xe98637[_0x3f81c5(0x19f)](_0x23e6cb));}else{const _0xc905cf={};_0xc905cf[_0x3f81c5(0x6ed)]=![],_0xc905cf[_0x3f81c5(0x5d6)]=_0x6b83fd[_0x3f81c5(0x5d4)],_0x90d303[_0x3f81c5(0x890)](0x1f4)[_0x3f81c5(0x8bb)](_0xc905cf);}}}),app[_0x28fe54(0x3a1)]('/api/settings/api-config',async(_0x4f9060,_0x5c3371)=>{const _0x1f71e5=_0x28fe54,_0x4aa1b3={'IqUmK':function(_0x59249a,_0x2a70b3){return _0x59249a&&_0x2a70b3;},'HHUGn':function(_0x1036c9,_0x38ea76){return _0x1036c9===_0x38ea76;},'QNgQb':_0x1f71e5(0x22d),'oodkx':function(_0x53a252,_0x5d3a27){return _0x53a252===_0x5d3a27;},'JGzkM':_0x1f71e5(0x241),'aKMjM':'OPENAI_API_KEY','tiHqP':_0x1f71e5(0x743),'bvomt':function(_0x201998,_0x173489){return _0x201998===_0x173489;},'onBmp':function(_0xdde35,_0x2e8155){return _0xdde35===_0x2e8155;},'mUFFG':_0x1f71e5(0x887),'AAUjo':_0x1f71e5(0x6ae),'SJVOp':function(_0x2ae754,_0x4a487f){return _0x2ae754!==_0x4a487f;},'Uoals':_0x1f71e5(0x398),'aUTWG':function(_0x20cbc6,_0x3e9623){return _0x20cbc6<_0x3e9623;},'GjNbT':function(_0x1f4a0c,_0xd1c125){return _0x1f4a0c-_0xd1c125;},'eqrGY':_0x1f71e5(0x222),'scdWh':_0x1f71e5(0x422),'DvEUI':function(_0x19ad88,_0x383bf5){return _0x19ad88!==_0x383bf5;},'IcycU':'lBEne','Fslix':function(_0x4a5c27,_0x4ed569){return _0x4a5c27(_0x4ed569);},'GsWGI':function(_0x5f1ae5,_0x3c2576){return _0x5f1ae5(_0x3c2576);},'JeQdf':function(_0x119b0f,_0x39eda6){return _0x119b0f(_0x39eda6);},'lyfcP':function(_0x3c9ba2,_0x4360c5){return _0x3c9ba2(_0x4360c5);}};try{const _0x11ac25=path[_0x1f71e5(0x184)](__dirname,_0x4aa1b3['eqrGY']),_0x4aed1e={};_0x4aed1e[_0x1f71e5(0x218)]=process.env.AI_PROVIDER||_0x4aa1b3[_0x1f71e5(0x378)],_0x4aed1e[_0x1f71e5(0x4c5)]=process.env.AI_MODEL||'',_0x4aed1e[_0x1f71e5(0x723)]=process.env.OPENAI_API_KEY||'',_0x4aed1e[_0x1f71e5(0x329)]=process.env.GEMINI_API_KEY||'',_0x4aed1e[_0x1f71e5(0x791)]=process.env.CLAUDE_API_KEY||'',_0x4aed1e[_0x1f71e5(0x2ab)]=process.env.GITHUB_TOKEN||'',_0x4aed1e['groq_api_key']=process.env.GROQ_API_KEY||'',_0x4aed1e['cohere_api_key']=process.env.COHERE_API_KEY||'',_0x4aed1e[_0x1f71e5(0x5af)]=process.env.MISTRAL_API_KEY||'';let _0x4243b7=_0x4aed1e;try{if(_0x4aa1b3[_0x1f71e5(0x3c1)](_0x4aa1b3['IcycU'],_0x1f71e5(0x31d))){const _0x2497a6=await fs['readFile'](_0x11ac25,_0x1f71e5(0x6ba)),_0x5a1fed=_0x2497a6['split']('\x0a');_0x5a1fed[_0x1f71e5(0x57c)](_0xd5b3cf=>{const _0x45c723=_0x1f71e5,[_0x28b072,_0x328ac1]=_0xd5b3cf[_0x45c723(0x394)]('=');if(_0x4aa1b3['IqUmK'](_0x28b072,_0x328ac1)){const _0x3ee454=_0x28b072['trim'](),_0x2da0d2=_0x328ac1['trim']();if(_0x4aa1b3[_0x45c723(0x633)](_0x3ee454,_0x4aa1b3[_0x45c723(0x760)]))_0x4243b7[_0x45c723(0x218)]=_0x2da0d2;if(_0x4aa1b3[_0x45c723(0x3bb)](_0x3ee454,_0x4aa1b3[_0x45c723(0x5cb)]))_0x4243b7['model']=_0x2da0d2;if(_0x3ee454===_0x4aa1b3['aKMjM'])_0x4243b7[_0x45c723(0x723)]=_0x2da0d2;if(_0x4aa1b3['HHUGn'](_0x3ee454,_0x45c723(0x3b7)))_0x4243b7[_0x45c723(0x329)]=_0x2da0d2;if(_0x4aa1b3['HHUGn'](_0x3ee454,_0x4aa1b3[_0x45c723(0x1e0)]))_0x4243b7[_0x45c723(0x791)]=_0x2da0d2;if(_0x4aa1b3[_0x45c723(0x494)](_0x3ee454,_0x45c723(0x64b)))_0x4243b7[_0x45c723(0x2ab)]=_0x2da0d2;if(_0x4aa1b3['HHUGn'](_0x3ee454,_0x45c723(0x7b3)))_0x4243b7['groq_api_key']=_0x2da0d2;if(_0x4aa1b3[_0x45c723(0x4ca)](_0x3ee454,'COHERE_API_KEY'))_0x4243b7[_0x45c723(0x3c2)]=_0x2da0d2;if(_0x3ee454===_0x4aa1b3['mUFFG'])_0x4243b7['mistral_api_key']=_0x2da0d2;}});}else{_0x569d87[_0x1f71e5(0x5d6)](_0x4aa1b3[_0x1f71e5(0x574)],_0xc23a8b['message']);const _0x4b18c8={};_0x4b18c8[_0x1f71e5(0x5d6)]=_0x1f71e5(0x83c)+_0x5a2e36[_0x1f71e5(0x5d4)],_0x15c77b=[_0x4b18c8];}}catch(_0x5d9d69){}const _0x2ac579=_0x203b0e=>{const _0x4e1669=_0x1f71e5;if(_0x4aa1b3[_0x4e1669(0x62b)](_0x4aa1b3[_0x4e1669(0x2df)],_0x4aa1b3[_0x4e1669(0x2df)])){_0x4a2cc6[_0x4e1669(0x5d6)]('❌\x20Tap\x20error:',_0x44f655);const _0x48acb7={};_0x48acb7['success']=![],_0x48acb7['error']=_0x3c486c[_0x4e1669(0x5d4)],_0x3111e1['status'](0x1f4)[_0x4e1669(0x8bb)](_0x48acb7);}else{if(!_0x203b0e||_0x4aa1b3[_0x4e1669(0x3f3)](_0x203b0e[_0x4e1669(0x3c8)],0x8))return'';return'•'[_0x4e1669(0x34f)](_0x4aa1b3[_0x4e1669(0x8de)](_0x203b0e['length'],0x4))+_0x203b0e[_0x4e1669(0x626)](-0x4);}};_0x5c3371[_0x1f71e5(0x8bb)]({'provider':_0x4243b7[_0x1f71e5(0x218)],'model':_0x4243b7['model'],'openai_api_key':_0x4aa1b3[_0x1f71e5(0x30c)](_0x2ac579,_0x4243b7['openai_api_key']),'gemini_api_key':_0x4aa1b3[_0x1f71e5(0x856)](_0x2ac579,_0x4243b7[_0x1f71e5(0x329)]),'claude_api_key':_0x2ac579(_0x4243b7[_0x1f71e5(0x791)]),'github_token':_0x2ac579(_0x4243b7[_0x1f71e5(0x2ab)]),'groq_api_key':_0x4aa1b3['JeQdf'](_0x2ac579,_0x4243b7[_0x1f71e5(0x558)]),'cohere_api_key':_0x2ac579(_0x4243b7['cohere_api_key']),'mistral_api_key':_0x4aa1b3[_0x1f71e5(0x8b6)](_0x2ac579,_0x4243b7['mistral_api_key']),'has_openai_key':!!_0x4243b7[_0x1f71e5(0x723)],'has_gemini_key':!!_0x4243b7[_0x1f71e5(0x329)],'has_claude_key':!!_0x4243b7[_0x1f71e5(0x791)],'has_github_token':!!_0x4243b7[_0x1f71e5(0x2ab)],'has_groq_key':!!_0x4243b7[_0x1f71e5(0x558)],'has_cohere_key':!!_0x4243b7[_0x1f71e5(0x3c2)],'has_mistral_key':!!_0x4243b7['mistral_api_key']});}catch(_0x107aa6){const _0x5046b4={};_0x5046b4[_0x1f71e5(0x6ed)]=![],_0x5046b4[_0x1f71e5(0x5d6)]=_0x107aa6[_0x1f71e5(0x5d4)],_0x5c3371[_0x1f71e5(0x890)](0x1f4)[_0x1f71e5(0x8bb)](_0x5046b4);}}),app[_0x28fe54(0x8bf)]('/api/settings/api-config',async(_0x5e016a,_0x189647)=>{const _0x5e9b29=_0x28fe54,_0xdc0bf9={'qehYV':function(_0x1cfaf0,_0x5930af){return _0x1cfaf0(_0x5930af);},'kMUAQ':'open','qUgRy':function(_0x994f4c,_0x21fde6){return _0x994f4c(_0x21fde6);},'wUpyM':function(_0x5c5ba8,_0x13111d){return _0x5c5ba8===_0x13111d;},'HLWta':function(_0x2990a1,_0x1f4e32){return _0x2990a1(_0x1f4e32);},'Ptzca':_0x5e9b29(0x651),'YwktZ':'command_complete','aijpF':'command_error','TXRUP':function(_0x494af6,_0x635713,_0x1f849f,_0x15f5ac){return _0x494af6(_0x635713,_0x1f849f,_0x15f5ac);},'XChic':_0x5e9b29(0x216),'YVGqc':'zScxF','wdqKX':'../../.env','YzXwQ':function(_0x32e286,_0x3d77ca){return _0x32e286===_0x3d77ca;},'iHrxy':'Ebeby','xUPpr':function(_0x99ca31,_0x16af50){return _0x99ca31!==_0x16af50;},'uovDo':'gngWb','UUGpi':function(_0x50d55e,_0x2a6b52){return _0x50d55e===_0x2a6b52;},'MoGxk':_0x5e9b29(0x3e2),'uvaUO':'cHbYU','NJIcD':_0x5e9b29(0x8b0)};try{if(_0xdc0bf9[_0x5e9b29(0x6fb)](_0xdc0bf9[_0x5e9b29(0x8ed)],_0xdc0bf9[_0x5e9b29(0x20a)]))_0x24801e=_0x5e9b29(0x1fb)+_0x2a583c+_0x5e9b29(0x8c2);else{const {provider:_0x4f6668,model:_0x29d476,openai_api_key:_0x10a66e,gemini_api_key:_0x1f25c6,claude_api_key:_0xe71d15,github_token:_0x3ab94b,groq_api_key:_0x5ac120,cohere_api_key:_0x1f9c55,mistral_api_key:_0x135c9e}=_0x5e016a['body'],_0x1666a3=path[_0x5e9b29(0x184)](__dirname,_0xdc0bf9[_0x5e9b29(0x29f)]);let _0x86fcdf=_0x5e9b29(0x225)+_0x4f6668+'\x0a';if(_0x29d476){if(_0xdc0bf9['YzXwQ']('Ebeby',_0xdc0bf9[_0x5e9b29(0x60b)]))_0x86fcdf+=_0x5e9b29(0x4fb)+_0x29d476+'\x0a';else{_0x5254f6[_0x5e9b29(0x44c)]('\x0a🌐\x20Opening\x20browser\x20to\x20'+_0xcb16dc+_0x5e9b29(0x7a8));const _0x1f73e2=_0xdc0bf9[_0x5e9b29(0x72e)](_0x101d5c,_0xdc0bf9['kMUAQ']);_0xdc0bf9[_0x5e9b29(0x8ba)](_0x1f73e2,_0x423483)[_0x5e9b29(0x291)](_0x4e0ddf=>{const _0x282cca=_0x5e9b29;_0x19eb0e[_0x282cca(0x44c)](_0x282cca(0x66c)+_0x10a149+_0x282cca(0x6a6));});}}if(_0x10a66e){if(_0xdc0bf9[_0x5e9b29(0x42f)](_0xdc0bf9['uovDo'],_0xdc0bf9['uovDo'])){if(NoSYXv[_0x5e9b29(0x6fb)](_0x13bfa9[_0x5e9b29(0x45e)],_0x3d5e21['OPEN'])){const _0x22864d={};_0x22864d[_0x5e9b29(0x185)]=_0x5e9b29(0x326),_0x22864d[_0x5e9b29(0x388)]=_0x4724e7,_0x39801b[_0x5e9b29(0x550)](_0x5f3ba3[_0x5e9b29(0x19f)](_0x22864d));}}else _0x86fcdf+=_0x5e9b29(0x5df)+_0x10a66e+'\x0a';}if(_0x1f25c6){if(_0xdc0bf9[_0x5e9b29(0x820)](_0x5e9b29(0x6ff),_0x5e9b29(0x397))){_0x3e5a16[_0x5e9b29(0x44c)](_0x5e9b29(0x44b)+_0x1a2c40+'\x20at\x20'+_0x3f672e+_0x5e9b29(0x6a5));const _0x3fe793={};_0x3fe793['success']=![],_0x3fe793['message']='Cannot\x20reach\x20'+_0x5f4729+_0x5e9b29(0x483)+_0x3b89f9+_0x5e9b29(0x6a5),NoSYXv[_0x5e9b29(0x85a)](_0x598d8e,_0x3fe793);}else _0x86fcdf+=_0x5e9b29(0x235)+_0x1f25c6+'\x0a';}if(_0xe71d15){if(_0xdc0bf9[_0x5e9b29(0x19e)](_0xdc0bf9[_0x5e9b29(0x3ea)],_0x5e9b29(0x3e2)))_0x86fcdf+=_0x5e9b29(0x344)+_0xe71d15+'\x0a';else{const _0xa87162=_0x2257ad[_0x5e9b29(0x67c)]();_0x337dcf+=_0xa87162,_0x470ac4['debug']('['+_0x121bb1['name']+_0x5e9b29(0x372)+_0xa87162[_0x5e9b29(0x878)]());if(_0xa40d23){const _0x3cbd79={};_0x3cbd79['type']=NoSYXv[_0x5e9b29(0x5b2)],_0x3cbd79[_0x5e9b29(0x838)]=_0x36c52c[_0x5e9b29(0x361)],_0x3cbd79[_0x5e9b29(0x46a)]=_0xa87162,_0x1fa75c[_0x5e9b29(0x550)](_0x1fd90b[_0x5e9b29(0x19f)](_0x3cbd79));}}}_0x3ab94b&&(_0x86fcdf+=_0x5e9b29(0x3f5)+_0x3ab94b+'\x0a');if(_0x5ac120){if(_0xdc0bf9[_0x5e9b29(0x171)]!==_0xdc0bf9[_0x5e9b29(0x171)]){const _0x557336={};_0x557336[_0x5e9b29(0x1d4)]=_0xdc0bf9[_0x5e9b29(0x5e0)];const _0x57e325=_0x557336;_0xdc0bf9[_0x5e9b29(0x481)](_0x16915e,_0x500e88,_0x29a0d6,_0x2ecb60)[_0x5e9b29(0x732)](_0x2d855a=>{const _0x1381e9=_0x5e9b29;_0x2c0041&&_0x37bd4d(_0x302363,_0xcdf396,_0x286bb4,_0x266007);const _0x4c8553={};_0x4c8553[_0x1381e9(0x185)]=_0xdc0bf9[_0x1381e9(0x1b5)],_0x4c8553[_0x1381e9(0x792)]=_0x2d855a,_0x50bb9e[_0x1381e9(0x550)](_0x5212ab['stringify'](_0x4c8553));})[_0x5e9b29(0x291)](_0x27271d=>{const _0x421300=_0x5e9b29;_0x24566a['error']('executeCommand\x20failed:\x20'+_0x27271d[_0x421300(0x5d4)]);const _0x556b34={};_0x556b34['type']=_0x57e325[_0x421300(0x1d4)],_0x556b34[_0x421300(0x5d6)]=_0x27271d[_0x421300(0x5d4)],_0x24662c[_0x421300(0x550)](_0x4c655d[_0x421300(0x19f)](_0x556b34));});}else _0x86fcdf+='GROQ_API_KEY='+_0x5ac120+'\x0a';}_0x1f9c55&&(_0x86fcdf+=_0x5e9b29(0x6dc)+_0x1f9c55+'\x0a');_0x135c9e&&(_0x86fcdf+=_0x5e9b29(0x25c)+_0x135c9e+'\x0a');if(process.env.WDA_PATH){if(_0xdc0bf9[_0x5e9b29(0x19e)](_0xdc0bf9[_0x5e9b29(0x729)],_0x5e9b29(0x456))){const _0x3e087f={};_0x3e087f[_0x5e9b29(0x6ed)]=![],_0x3e087f[_0x5e9b29(0x5d6)]=_0x81aa20[_0x5e9b29(0x5d4)],_0x2f932c[_0x5e9b29(0x890)](0x1f4)[_0x5e9b29(0x8bb)](_0x3e087f);}else _0x86fcdf+=_0x5e9b29(0x82d)+process.env.WDA_PATH+'\x0a';}await fs['writeFile'](_0x1666a3,_0x86fcdf),process.env.AI_PROVIDER=_0x4f6668;if(_0x29d476)process.env.AI_MODEL=_0x29d476;if(_0x10a66e)process.env.OPENAI_API_KEY=_0x10a66e;if(_0x1f25c6)process.env.GEMINI_API_KEY=_0x1f25c6;if(_0xe71d15)process.env.CLAUDE_API_KEY=_0xe71d15;if(_0x3ab94b)process.env.GITHUB_TOKEN=_0x3ab94b;if(_0x5ac120)process.env.GROQ_API_KEY=_0x5ac120;if(_0x1f9c55)process.env.COHERE_API_KEY=_0x1f9c55;if(_0x135c9e)process.env.MISTRAL_API_KEY=_0x135c9e;aiManager['provider']=_0x4f6668;if(_0x29d476)aiManager['model']=_0x29d476;aiManager[_0x5e9b29(0x499)]();const _0x1525b6={};_0x1525b6[_0x5e9b29(0x6ed)]=!![],_0x1525b6[_0x5e9b29(0x5d4)]='API\x20configuration\x20saved',_0x189647[_0x5e9b29(0x8bb)](_0x1525b6);}}catch(_0x46f560){const _0x4b6a96={};_0x4b6a96['success']=![],_0x4b6a96['error']=_0x46f560['message'],_0x189647[_0x5e9b29(0x890)](0x1f4)['json'](_0x4b6a96);}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x6dd),(_0x1be780,_0x685419)=>{const _0x4f52f1=_0x28fe54,_0x194b1c={'INadU':function(_0x165bbc,_0x3de566){return _0x165bbc!==_0x3de566;},'qbFsL':'HOwVR','OooOK':_0x4f52f1(0x3b9),'JqLTy':function(_0x36eb2b,_0x24fe1c){return _0x36eb2b(_0x24fe1c);},'vLQXb':_0x4f52f1(0x852)};try{if(_0x194b1c[_0x4f52f1(0x2d3)](_0x194b1c[_0x4f52f1(0x772)],_0x194b1c['OooOK'])){const {AI_PROVIDERS_CONFIG:_0x114ed3}=_0x194b1c[_0x4f52f1(0x7f0)](require,_0x194b1c[_0x4f52f1(0x4d4)]),_0x356b7c={};_0x356b7c['success']=!![],_0x356b7c['providers']=_0x114ed3,_0x685419[_0x4f52f1(0x8bb)](_0x356b7c);}else{const _0x2a1f8f={};_0x2a1f8f[_0x4f52f1(0x6ed)]=![],_0x2a1f8f['error']=_0x37abdb[_0x4f52f1(0x5d4)],_0x21ffce[_0x4f52f1(0x890)](0x1f4)[_0x4f52f1(0x8bb)](_0x2a1f8f);}}catch(_0x4ff09e){const _0x5998c4={};_0x5998c4[_0x4f52f1(0x6ed)]=![],_0x5998c4[_0x4f52f1(0x5d6)]=_0x4ff09e['message'],_0x685419[_0x4f52f1(0x890)](0x1f4)[_0x4f52f1(0x8bb)](_0x5998c4);}}),app[_0x28fe54(0x3a1)]('/api/settings/devices',async(_0x1202ec,_0x244e50)=>{const _0x3080ba=_0x28fe54,_0x3de77b={'OuMTN':function(_0x355086){return _0x355086();}};try{const _0x247b18=await _0x3de77b[_0x3080ba(0x746)](loadDeviceConfig),_0x26834d={};_0x26834d[_0x3080ba(0x6ed)]=!![],_0x26834d[_0x3080ba(0x388)]=_0x247b18,_0x244e50[_0x3080ba(0x8bb)](_0x26834d);}catch(_0x3a8bbf){const _0x2c3f50={};_0x2c3f50[_0x3080ba(0x6ed)]=![],_0x2c3f50[_0x3080ba(0x5d6)]=_0x3a8bbf[_0x3080ba(0x5d4)],_0x244e50[_0x3080ba(0x890)](0x1f4)[_0x3080ba(0x8bb)](_0x2c3f50);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x274),async(_0x5591dc,_0x4427dd)=>{const _0x4e5d65=_0x28fe54,_0x4549f6={'WXkhR':_0x4e5d65(0x3e3),'zSWlZ':'wireless','zlZYY':'usb','dnFZM':function(_0x3f84c4,_0x35f770){return _0x3f84c4(_0x35f770);},'sDUCs':_0x4e5d65(0x5c3),'ZOiJm':_0x4e5d65(0x2a6),'iDkXd':'#\x20Platform:\x20ios\x20|\x20android\x0a','eEpJC':'#\x20Type:\x20usb\x20|\x20wireless\x0a','XDpOc':_0x4e5d65(0x6f1),'KwdiZ':_0x4e5d65(0x7d8),'nSBwk':'#\x20\x20\x20\x20-\x20No\x20configuration\x20needed\x20for\x20USB\x20connection\x0a','hQgqc':_0x4e5d65(0x6f7),'DbFCn':_0x4e5d65(0x365),'dYPXb':'#\x20\x20\x20\x20-\x20Android:\x20Enable\x20wireless\x20ADB\x20first\x0a','JDvJt':_0x4e5d65(0x535),'ZWDjW':_0x4e5d65(0x5c1),'GMovn':_0x4e5d65(0x857),'ricEU':_0x4e5d65(0x722),'ytcId':function(_0x2d216c,_0x55c1f7){return _0x2d216c===_0x55c1f7;},'QGygM':'dGQKP'};try{const {devices:_0x229c06}=_0x5591dc['body'];let _0x1f03c6=_0x4549f6[_0x4e5d65(0x2ec)];_0x1f03c6+=_0x4549f6[_0x4e5d65(0x52e)],_0x1f03c6+=_0x4549f6[_0x4e5d65(0x64a)],_0x1f03c6+=_0x4549f6[_0x4e5d65(0x6b3)],_0x1f03c6+=_0x4549f6['XDpOc'],_0x1f03c6+=_0x4549f6['KwdiZ'],_0x1f03c6+=_0x4549f6[_0x4e5d65(0x341)],_0x1f03c6+=_0x4e5d65(0x3d7),_0x1f03c6+='#\x0a',_0x1f03c6+=_0x4e5d65(0x629),_0x1f03c6+=_0x4549f6[_0x4e5d65(0x6a7)],_0x1f03c6+=_0x4549f6['DbFCn'],_0x1f03c6+=_0x4549f6[_0x4e5d65(0x64c)],_0x1f03c6+='#\x0a',_0x1f03c6+=_0x4549f6[_0x4e5d65(0x5f0)],_0x1f03c6+=_0x4e5d65(0x5b3),_0x1f03c6+=_0x4549f6[_0x4e5d65(0x48d)],_0x1f03c6+=_0x4e5d65(0x8aa),_0x1f03c6+=_0x4549f6[_0x4e5d65(0x8cc)],_0x229c06['forEach'](_0x2aa9e2=>{const _0x6aa87d=_0x4e5d65,_0x332c12=_0x2aa9e2['ip']||'',_0x214fdf=_0x2aa9e2[_0x6aa87d(0x2fa)]||_0x4549f6[_0x6aa87d(0x21a)],_0x2e2304=_0x2aa9e2[_0x6aa87d(0x185)]||_0x2aa9e2['connectionType']||(_0x332c12?_0x4549f6[_0x6aa87d(0x453)]:_0x4549f6[_0x6aa87d(0x704)]);_0x1f03c6+=_0x2aa9e2[_0x6aa87d(0x361)]+','+_0x2aa9e2['udid']+','+_0x332c12+','+_0x214fdf+','+_0x2e2304+'\x0a';}),await fs[_0x4e5d65(0x188)](DEVICE_CONFIG,_0x1f03c6);const _0x222785={};_0x222785[_0x4e5d65(0x6ed)]=!![],_0x222785[_0x4e5d65(0x5d4)]=_0x4549f6[_0x4e5d65(0x894)],_0x4427dd['json'](_0x222785);}catch(_0x311ab3){if(_0x4549f6[_0x4e5d65(0x561)](_0x4549f6[_0x4e5d65(0x71f)],_0x4549f6['QGygM'])){const _0x594ce3={};_0x594ce3[_0x4e5d65(0x6ed)]=![],_0x594ce3[_0x4e5d65(0x5d6)]=_0x311ab3['message'],_0x4427dd[_0x4e5d65(0x890)](0x1f4)['json'](_0x594ce3);}else{const _0x2457c0={};_0x2457c0[_0x4e5d65(0x6ed)]=![],_0x2457c0[_0x4e5d65(0x5d4)]=_0x4e5d65(0x3de)+_0x1f7359+_0x4e5d65(0x5bc),xntfGG[_0x4e5d65(0x4ee)](_0x28462b,_0x2457c0);}}}),app['get'](_0x28fe54(0x699),async(_0x13edb7,_0x322d63)=>{const _0x2bf3c6=_0x28fe54,_0x51c63b={};_0x51c63b[_0x2bf3c6(0x24f)]=_0x2bf3c6(0x6ba);const _0x4719c7=_0x51c63b;try{const _0x5f2621=await fs[_0x2bf3c6(0x599)](APPS_CONFIG,_0x4719c7[_0x2bf3c6(0x24f)]),_0x1300e5=_0x5f2621[_0x2bf3c6(0x394)]('\x0a')[_0x2bf3c6(0x6fc)](_0xa528cc=>_0xa528cc['trim']()&&!_0xa528cc[_0x2bf3c6(0x310)]('#'))[_0x2bf3c6(0x2d1)](_0x364dd7=>{const _0x46396b=_0x2bf3c6,[_0x3bd02e,_0x106f64]=_0x364dd7[_0x46396b(0x394)](',');return{'name':_0x3bd02e[_0x46396b(0x878)](),'packageId':_0x106f64[_0x46396b(0x878)]()};}),_0x503f03={};_0x503f03[_0x2bf3c6(0x6ed)]=!![],_0x503f03[_0x2bf3c6(0x6b8)]=_0x1300e5,_0x322d63[_0x2bf3c6(0x8bb)](_0x503f03);}catch(_0x37f7b9){const _0x4ff74e={};_0x4ff74e[_0x2bf3c6(0x6ed)]=![],_0x4ff74e[_0x2bf3c6(0x5d6)]=_0x37f7b9[_0x2bf3c6(0x5d4)],_0x322d63['status'](0x1f4)['json'](_0x4ff74e);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x53f),async(_0x57157f,_0x2b87d1)=>{const _0x177e9b=_0x28fe54,_0x28ecd5={'MIEbq':_0x177e9b(0x7ce),'URFeG':function(_0x398267,_0x4b63e6){return _0x398267(_0x4b63e6);},'vFoOw':function(_0x42cbf2,_0xbeb1a8){return _0x42cbf2(_0xbeb1a8);},'XfogC':function(_0x23daa2,_0x21e001){return _0x23daa2(_0x21e001);},'YPCzw':'UIAutomator2\x20APKs\x20not\x20found.\x20Please\x20run:\x20appium\x20driver\x20install\x20uiautomator2','UyJrC':_0x177e9b(0x8c1),'qjvei':function(_0x4f1c2e,_0x858848){return _0x4f1c2e===_0x858848;},'nRPym':_0x177e9b(0x88d),'UgQYt':_0x177e9b(0x5fb),'VwSQB':_0x177e9b(0x316),'heeUw':_0x177e9b(0x270),'kZsgj':function(_0x1feba3,_0x11ca73){return _0x1feba3(_0x11ca73);},'PEMHn':function(_0x179d17,_0x149f5b){return _0x179d17===_0x149f5b;},'jkbFE':function(_0x2df4fa,_0x50845a,_0x23ba5f,_0x4096dc){return _0x2df4fa(_0x50845a,_0x23ba5f,_0x4096dc);},'Xsypv':_0x177e9b(0x4da),'rICYp':function(_0x481eac,_0x14aaa3){return _0x481eac!==_0x14aaa3;},'lDFCf':_0x177e9b(0x1a2),'HehzE':function(_0xc58c69,_0x41eda5){return _0xc58c69===_0x41eda5;},'wGwBt':'fulfilled','phssd':function(_0x3b6572,_0x5d243d){return _0x3b6572===_0x5d243d;},'MGryl':_0x177e9b(0x897),'CXtFG':_0x177e9b(0x52c),'TLiZK':_0x177e9b(0x1d6),'CoXsJ':'Failed\x20to\x20get\x20UI\x20elements.\x20Please\x20ensure\x20UIAutomator2\x20is\x20installed\x20for\x20Android\x20devices.','aQYWk':_0x177e9b(0x3ad),'JGZsy':_0x177e9b(0x51f),'iwaBC':_0x177e9b(0x586),'cLHUx':'No\x20output\x20received\x20from\x20device','WrWJj':function(_0x10a394,_0x3c8c69){return _0x10a394(_0x3c8c69);},'nxCzj':'❌\x20Command\x20execution\x20failed','ersQB':_0x177e9b(0x167),'NMVnS':_0x177e9b(0x66d),'PzpMt':_0x177e9b(0x415)};try{const {deviceName:_0xefb242}=_0x57157f[_0x177e9b(0x4eb)];if(!_0xefb242){const _0x58a6a4={};return _0x58a6a4[_0x177e9b(0x6ed)]=![],_0x58a6a4['error']=_0x28ecd5['UyJrC'],_0x2b87d1['status'](0x190)[_0x177e9b(0x8bb)](_0x58a6a4);}logger['debug'](_0x177e9b(0x664)+_0xefb242);const _0x172846=connectedDevices[_0x177e9b(0x251)](_0x40746c=>_0x40746c[_0x177e9b(0x361)]===_0xefb242);if(!_0x172846){const _0xc02bbb={};return _0xc02bbb[_0x177e9b(0x6ed)]=![],_0xc02bbb['error']=_0x177e9b(0x462),_0x2b87d1[_0x177e9b(0x890)](0x194)[_0x177e9b(0x8bb)](_0xc02bbb);}if(_0x28ecd5[_0x177e9b(0x677)](_0x172846['platform'],_0x28ecd5[_0x177e9b(0x2f5)])){const _0x39c71b=androidSessions['get'](_0x172846['udid']);if(!_0x39c71b){if(_0x28ecd5[_0x177e9b(0x18e)]===_0x28ecd5[_0x177e9b(0x2be)]){const _0x41f18f={};_0x41f18f['gXcRc']=_0x28ecd5[_0x177e9b(0x754)];const _0x2405c8=_0x41f18f,_0x58bf42=_0x3d3227['join'](_0x4a882b,_0x226c07['params'][_0x177e9b(0x597)]);_0x19be34[_0x177e9b(0x73b)](_0x58bf42,_0x1cd93f=>{const _0x502384=_0x177e9b;if(_0x1cd93f){const _0x4e35ec={};_0x4e35ec[_0x502384(0x6ed)]=![],_0x4e35ec['error']=_0x2405c8['gXcRc'],_0x4e233e[_0x502384(0x890)](0x194)[_0x502384(0x8bb)](_0x4e35ec);}});}else{console[_0x177e9b(0x44c)](_0x177e9b(0x56a)+_0xefb242+_0x177e9b(0x716));try{if(_0x28ecd5[_0x177e9b(0x4dc)]===_0x28ecd5['heeUw']){const _0x255633=await _0x28ecd5[_0x177e9b(0x36c)](connectToDevice,_0x172846);if(!_0x255633[_0x177e9b(0x6ed)]){if(_0x28ecd5[_0x177e9b(0x4d8)](_0x177e9b(0x76d),_0x177e9b(0x76d))){const _0x8b320e={};return _0x8b320e[_0x177e9b(0x6ed)]=![],_0x8b320e[_0x177e9b(0x5d6)]=_0x177e9b(0x5c4),_0x2b87d1[_0x177e9b(0x890)](0x1f4)['json'](_0x8b320e);}else{_0x10b957[_0x177e9b(0x44c)](_0x177e9b(0x8c0)+_0x1c45f2);const _0x5c755f={};_0x5c755f[_0x177e9b(0x6ed)]=!![],_0x5c755f[_0x177e9b(0x5d4)]=_0x177e9b(0x1fb)+_0x1de7d9+'\x20-\x20ADB\x20Ready\x20✅',upXtoF[_0x177e9b(0x807)](_0x46b5c1,_0x5c755f);return;}}await new Promise(_0x309819=>setTimeout(_0x309819,0x7d0));}else{const _0x46501a={};_0x46501a[_0x177e9b(0x6ed)]=!![],_0x46501a[_0x177e9b(0x218)]=_0x54598b,_0x605b9['json'](_0x46501a);}}catch(_0x576016){const _0x266061={};return _0x266061[_0x177e9b(0x6ed)]=![],_0x266061['error']=_0x177e9b(0x452)+_0x576016['message'],_0x2b87d1['status'](0x1f4)[_0x177e9b(0x8bb)](_0x266061);}}}}const _0x56dd4a=await _0x28ecd5[_0x177e9b(0x1ea)](executeCommand,[_0xefb242],_0x28ecd5[_0x177e9b(0x3f0)],null);logger[_0x177e9b(0x43a)](_0x177e9b(0x886)+_0x56dd4a[_0x177e9b(0x6ed)]),logger['debug'](_0x177e9b(0x258)+(_0x56dd4a[_0x177e9b(0x6c7)]?.[_0x177e9b(0x3c8)]||0x0));if(_0x56dd4a['success']&&_0x56dd4a[_0x177e9b(0x6c7)]){let _0x53244e='';for(const _0x28b3f2 of _0x56dd4a['results']){if(_0x28ecd5['rICYp'](_0x28ecd5['lDFCf'],_0x28ecd5[_0x177e9b(0x6c3)])){const _0x4fd16c=_0x46c0b4[_0x177e9b(0x2d1)](_0x36c51a=>_0x36c51a[_0x177e9b(0x361)]+_0x177e9b(0x33a)+_0x36c51a[_0x177e9b(0x890)]+')')['join'](',\x20');_0x5c192d[_0x177e9b(0x5d6)](_0x177e9b(0x472)+_0x4fd16c+']');if(_0x11060d){const _0x45012e={};_0x45012e[_0x177e9b(0x185)]=_0x177e9b(0x7ab),_0x45012e['data']='\x0a⚠️\x20\x20Error:\x20Devices\x20not\x20connected:\x20'+_0x4fd16c+_0x177e9b(0x630),_0x45012e[_0x177e9b(0x388)]=_0x2eb8bf,_0x810a06[_0x177e9b(0x550)](_0x4bf5ff[_0x177e9b(0x19f)](_0x45012e));}const _0x5cb118={};return _0x5cb118['success']=![],_0x5cb118['error']=_0x177e9b(0x693)+_0x4fd16c+'.\x20Please\x20click\x20\x22Connect\x22\x20button\x20on\x20each\x20device\x20first.',upXtoF[_0x177e9b(0x31c)](_0x1c0256,_0x5cb118);}else{logger[_0x177e9b(0x43a)](_0x177e9b(0x8b2),_0x28b3f2);if(_0x28ecd5['HehzE'](_0x28b3f2[_0x177e9b(0x890)],_0x28ecd5['wGwBt'])&&_0x28b3f2[_0x177e9b(0x47d)]&&_0x28b3f2['value'][_0x177e9b(0x6c7)])for(const _0x3fabf7 of _0x28b3f2[_0x177e9b(0x47d)]['results']){if(_0x28ecd5[_0x177e9b(0x4a5)](_0x28ecd5[_0x177e9b(0x431)],_0x28ecd5[_0x177e9b(0x431)])){logger[_0x177e9b(0x43a)](_0x177e9b(0x8b3)+_0x3fabf7[_0x177e9b(0x890)]);if(_0x3fabf7[_0x177e9b(0x890)]===_0x28ecd5['wGwBt']&&_0x3fabf7[_0x177e9b(0x47d)]){if(_0x28ecd5[_0x177e9b(0x4bd)](_0x28ecd5['CXtFG'],_0x28ecd5['TLiZK'])){if(_0x3fabf7[_0x177e9b(0x47d)]['success']&&_0x3fabf7['value'][_0x177e9b(0x651)]){_0x53244e=_0x3fabf7[_0x177e9b(0x47d)]['output'],logger[_0x177e9b(0x43a)](_0x177e9b(0x8f1)+_0x53244e[_0x177e9b(0x3c8)]+'\x20characters');break;}else{if(_0x3fabf7[_0x177e9b(0x47d)][_0x177e9b(0x5d6)]){console[_0x177e9b(0x44c)]('❌\x20Script\x20error:',_0x3fabf7[_0x177e9b(0x47d)][_0x177e9b(0x5d6)]);const _0x4ee457={};return _0x4ee457[_0x177e9b(0x6ed)]=![],_0x4ee457[_0x177e9b(0x5d6)]=_0x28ecd5[_0x177e9b(0x5fa)],_0x2b87d1[_0x177e9b(0x890)](0x1f4)[_0x177e9b(0x8bb)](_0x4ee457);}}}else _0x1471b6[_0x177e9b(0x361)]=_0x306b22;}}else{const _0xfec59f={};return _0xfec59f[_0x177e9b(0x6ed)]=!![],_0xfec59f['message']=_0x177e9b(0x648),_0x35098f['json'](_0xfec59f);}}if(_0x53244e)break;}}if(!_0x53244e){if(_0x28ecd5['PEMHn'](_0x28ecd5[_0x177e9b(0x4a4)],_0x177e9b(0x7a6)))_0x5d29a3+=_0xa808b6['toString']();else{console[_0x177e9b(0x44c)](_0x28ecd5[_0x177e9b(0x818)]),console['log'](_0x28ecd5['iwaBC'],JSON['stringify'](_0x56dd4a,null,0x2));const _0x1d7ea8={};return _0x1d7ea8[_0x177e9b(0x6ed)]=![],_0x1d7ea8[_0x177e9b(0x5d6)]=_0x28ecd5[_0x177e9b(0x35f)],_0x2b87d1[_0x177e9b(0x890)](0x1f4)[_0x177e9b(0x8bb)](_0x1d7ea8);}}const _0x27b9d0=_0x28ecd5[_0x177e9b(0x2e5)](parseLocatorsOutput,_0x53244e);console[_0x177e9b(0x44c)]('✅\x20Parsed\x20'+_0x27b9d0[_0x177e9b(0x3c8)]+_0x177e9b(0x70f));const _0x3274dc=_0x27b9d0[_0x177e9b(0x6fc)](_0x136041=>_0x136041[_0x177e9b(0x361)]||_0x136041[_0x177e9b(0x549)]||_0x136041[_0x177e9b(0x598)]);console[_0x177e9b(0x44c)](_0x177e9b(0x54b)+_0x3274dc[_0x177e9b(0x3c8)]+_0x177e9b(0x7e7));const _0x34307a={};_0x34307a[_0x177e9b(0x6ed)]=!![],_0x34307a['locators']=_0x3274dc,_0x2b87d1[_0x177e9b(0x8bb)](_0x34307a);}else{console['log'](_0x28ecd5['nxCzj']);const _0xdd1019={};_0xdd1019[_0x177e9b(0x6ed)]=![],_0xdd1019[_0x177e9b(0x5d6)]=_0x28ecd5[_0x177e9b(0x444)],_0x2b87d1['status'](0x1f4)['json'](_0xdd1019);}}catch(_0x5dfce9){if(_0x28ecd5[_0x177e9b(0x404)]!==_0x28ecd5[_0x177e9b(0x246)]){console[_0x177e9b(0x5d6)](_0x177e9b(0x77b),_0x5dfce9);const _0x41118d={};_0x41118d[_0x177e9b(0x6ed)]=![],_0x41118d[_0x177e9b(0x5d6)]=_0x5dfce9[_0x177e9b(0x5d4)],_0x2b87d1[_0x177e9b(0x890)](0x1f4)[_0x177e9b(0x8bb)](_0x41118d);}else upXtoF[_0x177e9b(0x39f)](_0x567cb6,{'success':![],'message':upXtoF[_0x177e9b(0x74d)]});}}),app['post']('/api/locators/click',async(_0x1d2292,_0x5d5be0)=>{const _0x1450c5=_0x28fe54,_0x4a109b={'JuXCE':function(_0x2d3d43,_0x13dc6a){return _0x2d3d43&&_0x13dc6a;},'krOdo':function(_0x5d6fab,_0x2e3ccc){return _0x5d6fab===_0x2e3ccc;},'qMpbK':_0x1450c5(0x763),'Nthwy':_0x1450c5(0x8c1),'PKIwx':function(_0x51c89b,_0x503e55){return _0x51c89b!==_0x503e55;},'QRuns':_0x1450c5(0x433),'zjaEq':_0x1450c5(0x40b),'gkzGV':function(_0x5df062,_0x49ce76,_0xd98b41,_0x178949){return _0x5df062(_0x49ce76,_0xd98b41,_0x178949);},'YfEVj':_0x1450c5(0x8cd),'MydZw':'Tap\x20executed\x20successfully','Fgbkl':_0x1450c5(0x667),'EgzPU':'rOwLY','VnuIB':_0x1450c5(0x3df),'NLpQd':_0x1450c5(0x881),'GMsQD':_0x1450c5(0x2ff)};try{const {deviceName:_0x529b6a,locatorName:_0x3a72fd,x:_0x4044fa,y:_0x1c032f}=_0x1d2292[_0x1450c5(0x4eb)];if(!_0x529b6a){const _0x134bd9={};return _0x134bd9[_0x1450c5(0x6ed)]=![],_0x134bd9[_0x1450c5(0x5d6)]=_0x4a109b['Nthwy'],_0x5d5be0[_0x1450c5(0x890)](0x190)[_0x1450c5(0x8bb)](_0x134bd9);}let _0x194aa9;if(_0x4a109b[_0x1450c5(0x89c)](_0x4044fa,undefined)&&_0x4a109b[_0x1450c5(0x89c)](_0x1c032f,undefined)){if(_0x4a109b['krOdo'](_0x4a109b['QRuns'],_0x1450c5(0x433)))_0x194aa9=_0x1450c5(0x292)+_0x4044fa+','+_0x1c032f,console[_0x1450c5(0x44c)](_0x1450c5(0x71a)+_0x4044fa+','+_0x1c032f+_0x1450c5(0x5de)+_0x529b6a);else{const _0x564a2c={};_0x564a2c[_0x1450c5(0x6ed)]=![],_0x564a2c[_0x1450c5(0x5d6)]=_0x4d242c||_0x4318b9,_0x564a2c['device']=_0x3db064['name'],_0x59e0f1(_0x564a2c);}}else{if(_0x3a72fd){if(_0x4a109b['krOdo'](_0x4a109b['zjaEq'],_0x1450c5(0x827))){const [_0x58e882,_0x10e09f]=_0x8a20de[_0x1450c5(0x394)](',')[_0x1450c5(0x2d1)](_0x3a5362=>_0x3a5362[_0x1450c5(0x878)]());if(Wgkvsj[_0x1450c5(0x43c)](_0x58e882,_0x10e09f)){const _0x1bc1a9=_0x58e882['split']('.');if(Wgkvsj['krOdo'](_0x1bc1a9[_0x1450c5(0x3c8)],0x2)){const [_0x740a58,_0x72699f]=_0x1bc1a9;if(!_0x15c569[_0x740a58])_0x162199[_0x740a58]={};_0x3f26d7[_0x740a58][_0x72699f]=_0x10e09f;}else{if(!_0x3cfb11[_0x58e882])_0x2d2c53[_0x58e882]={};_0x501489[_0x58e882][_0x1450c5(0x3ee)]=_0x10e09f;}}}else _0x194aa9=_0x1450c5(0x540)+_0x3a72fd+'\x22',console['log'](_0x1450c5(0x81c)+_0x3a72fd+_0x1450c5(0x509)+_0x529b6a);}else{const _0xd57fd4={};return _0xd57fd4['success']=![],_0xd57fd4['error']=_0x1450c5(0x769),_0x5d5be0[_0x1450c5(0x890)](0x190)[_0x1450c5(0x8bb)](_0xd57fd4);}}const _0x33e99e=await _0x4a109b[_0x1450c5(0x520)](executeCommand,[_0x529b6a],_0x194aa9,null);if(_0x33e99e['success']){if(_0x4a109b['YfEVj']!==_0x1450c5(0x489)){const _0x1014cd={};_0x1014cd['success']=!![],_0x1014cd[_0x1450c5(0x5d4)]=_0x4a109b[_0x1450c5(0x709)],_0x5d5be0[_0x1450c5(0x8bb)](_0x1014cd);}else{const _0x5dec2b={};_0x5dec2b[_0x1450c5(0x307)]=!![],_0x5dec2b[_0x1450c5(0x68e)]=0x1c0,_0x446995[_0x1450c5(0x4fe)](_0xda2ea8,_0x5dec2b);}}else{if(_0x4a109b[_0x1450c5(0x89c)](_0x4a109b[_0x1450c5(0x7c0)],_0x4a109b[_0x1450c5(0x6b1)])){const _0xc887d0={};_0xc887d0[_0x1450c5(0x6ed)]=![],_0xc887d0[_0x1450c5(0x5d6)]=_0x4a109b['VnuIB'],_0x5d5be0[_0x1450c5(0x890)](0x1f4)[_0x1450c5(0x8bb)](_0xc887d0);}else _0x3bb2b3['name']=_0xac2da4[0x1][_0x1450c5(0x878)](),_0x32e882[_0x1450c5(0x598)]=_0x23db33[0x1]['trim']();}}catch(_0x58b345){if(_0x4a109b['NLpQd']!==_0x4a109b[_0x1450c5(0x206)]){console[_0x1450c5(0x5d6)]('❌\x20Tap\x20error:',_0x58b345);const _0x1ccaaf={};_0x1ccaaf[_0x1450c5(0x6ed)]=![],_0x1ccaaf[_0x1450c5(0x5d6)]=_0x58b345[_0x1450c5(0x5d4)],_0x5d5be0[_0x1450c5(0x890)](0x1f4)[_0x1450c5(0x8bb)](_0x1ccaaf);}else{_0x5bd8c5[_0x1450c5(0x44c)](_0x1450c5(0x403)+_0x26eb2c);const _0x10d9d2={};return _0x10d9d2[_0x1450c5(0x6ed)]=!![],_0x10d9d2[_0x1450c5(0x5d4)]=Wgkvsj[_0x1450c5(0x2f3)],_0x10d9d2;}}});function parseLocatorsOutput(_0x3f2bc1){const _0x1d4ecb=_0x28fe54,_0x3a00dd={'yfpvH':function(_0x2f60ad,_0x393ec6){return _0x2f60ad(_0x393ec6);},'AEAyb':_0x1d4ecb(0x326),'lJjbX':_0x1d4ecb(0x7ab),'vVeAc':_0x1d4ecb(0x375),'FCAWS':_0x1d4ecb(0x1af),'lpIpR':_0x1d4ecb(0x5d8),'pIkkV':_0x1d4ecb(0x7ac),'rhCYj':_0x1d4ecb(0x78f),'BnAGL':function(_0x2c7ece,_0x33181e){return _0x2c7ece!==_0x33181e;},'luyFL':'❌\x20No\x20output\x20to\x20parse','GvBOb':_0x1d4ecb(0x861),'ZFhdh':_0x1d4ecb(0x2ea),'xLALK':_0x1d4ecb(0x58d),'Wlfts':_0x1d4ecb(0x35d),'wXBSc':_0x1d4ecb(0x720),'miZYv':function(_0x38708e,_0x259300){return _0x38708e<_0x259300;},'cOlgk':_0x1d4ecb(0x475),'GHewe':'Label:','IDCbp':_0x1d4ecb(0x8e5),'UtBEz':'gHibc','HCcbG':function(_0x25789a,_0x1dc0d1){return _0x25789a===_0x1dc0d1;},'uxlMd':'CbCAd','uZUDx':_0x1d4ecb(0x553),'akiaY':_0x1d4ecb(0x19b),'oXNyb':function(_0x26f1fe,_0xbe62b5){return _0x26f1fe(_0xbe62b5);},'DYyqW':function(_0x59ef6a,_0x1c373d){return _0x59ef6a(_0x1c373d);},'IYIPP':function(_0x1376d5,_0x2d4966){return _0x1376d5(_0x2d4966);},'JVxWt':'✓En','QVtsg':function(_0x3d127d,_0x15245c){return _0x3d127d===_0x15245c;},'CqxAe':_0x1d4ecb(0x2de),'uyARn':_0x1d4ecb(0x844),'biZDT':_0x1d4ecb(0x50b),'gyaqB':_0x1d4ecb(0x273),'vRDib':'Parsed\x20locator:'};logger[_0x1d4ecb(0x43a)](_0x3a00dd['pIkkV']),logger['debug'](_0x3a00dd['rhCYj'],_0x3f2bc1?.[_0x1d4ecb(0x3c8)]||0x0);if(!_0x3f2bc1){if(_0x3a00dd[_0x1d4ecb(0x755)](_0x1d4ecb(0x49f),_0x1d4ecb(0x49f))){const _0x1c9f56={};_0x1c9f56['success']=!![],_0x1c9f56[_0x1d4ecb(0x5d4)]=_0x1d4ecb(0x1fb)+_0xeb5d84+_0x1d4ecb(0x8c2),fUqQap[_0x1d4ecb(0x16b)](_0x4d89e8,_0x1c9f56);}else return logger['error'](_0x3a00dd[_0x1d4ecb(0x232)]),[];}const _0x4d6793=_0x3f2bc1[_0x1d4ecb(0x394)]('\x0a');for(const _0x355485 of _0x4d6793){const _0x227958=_0x355485[_0x1d4ecb(0x878)]();if(_0x227958[_0x1d4ecb(0x310)]('[')||_0x227958[_0x1d4ecb(0x310)]('{'))try{const _0x19ce15=JSON[_0x1d4ecb(0x3f9)](_0x227958);return logger['debug'](_0x3a00dd[_0x1d4ecb(0x76f)],Array[_0x1d4ecb(0x198)](_0x19ce15)?_0x19ce15[_0x1d4ecb(0x3c8)]:_0x3a00dd[_0x1d4ecb(0x4f1)]),Array[_0x1d4ecb(0x198)](_0x19ce15)?_0x19ce15:[];}catch(_0x434d69){logger[_0x1d4ecb(0x43a)]('⚠️\x20JSON\x20parse\x20failed:',_0x434d69[_0x1d4ecb(0x5d4)]);}}logger[_0x1d4ecb(0x43a)](_0x3a00dd[_0x1d4ecb(0x3fd)]);const _0x12028a=[];logger['debug'](_0x3a00dd[_0x1d4ecb(0x566)],_0x4d6793['length']);for(const _0x3f09ee of _0x4d6793){if(_0x3f09ee[_0x1d4ecb(0x1bf)]('📍')&&/^\s*\d+\./['test'](_0x3f09ee))try{const _0x4ed605={},_0x281fa1=_0x3f09ee[_0x1d4ecb(0x260)](/^\s*(\d+)\./);if(_0x281fa1)_0x4ed605[_0x1d4ecb(0x562)]=parseInt(_0x281fa1[0x1]);if(_0x3f09ee[_0x1d4ecb(0x1bf)]('│')){const _0x1953b0=_0x3f09ee[_0x1d4ecb(0x394)]('│')[_0x1d4ecb(0x2d1)](_0x53b562=>_0x53b562[_0x1d4ecb(0x878)]()),_0x357bb6=_0x1953b0[0x0][_0x1d4ecb(0x260)](/📍\s+(.+)/);if(_0x357bb6){if(_0x3a00dd['wXBSc']==='uDtXK')_0x4ed605[_0x1d4ecb(0x361)]=_0x357bb6[0x1][_0x1d4ecb(0x878)](),_0x4ed605[_0x1d4ecb(0x598)]=_0x357bb6[0x1][_0x1d4ecb(0x878)]();else{_0x52d92c[_0x1d4ecb(0x44c)]('Sequential\x20execution\x20completed');const _0x26cb58={};_0x26cb58[_0x1d4ecb(0x185)]=_0x1d4ecb(0x51a),_0x26cb58[_0x1d4ecb(0x792)]=_0xfd254b,_0x4aac48['send'](_0x57d215[_0x1d4ecb(0x19f)](_0x26cb58));}}const _0x2c9342=_0x1953b0[0x1]?_0x1953b0[0x1]['match'](/\[([^\]]+)\]/):null;if(_0x2c9342)_0x4ed605[_0x1d4ecb(0x185)]=_0x2c9342[0x1]['trim']();for(let _0x55bf9c=0x2;_0x3a00dd[_0x1d4ecb(0x4d3)](_0x55bf9c,_0x1953b0[_0x1d4ecb(0x3c8)]);_0x55bf9c++){if('QUAXA'!==_0x3a00dd[_0x1d4ecb(0x224)]){const _0x3a0226={};_0x3a0226[_0x1d4ecb(0x185)]=fUqQap['AEAyb'],_0x3a0226[_0x1d4ecb(0x388)]=_0x1acf43,_0xfa0457['send'](_0x5b97c7[_0x1d4ecb(0x19f)](_0x3a0226));}else{const _0x37f279=_0x1953b0[_0x55bf9c];if(_0x37f279['includes'](_0x3a00dd[_0x1d4ecb(0x5d0)])){const _0x2b3dd3=_0x37f279[_0x1d4ecb(0x260)](/Label:([^\s]+)/);if(_0x2b3dd3)_0x4ed605[_0x1d4ecb(0x549)]=_0x2b3dd3[0x1];}if(_0x37f279['includes'](_0x3a00dd['IDCbp'])){if(_0x3a00dd[_0x1d4ecb(0x1fa)]===_0x3a00dd[_0x1d4ecb(0x1fa)]){const _0x1e673d=_0x37f279['match'](/Val:([^\s]+)/);if(_0x1e673d)_0x4ed605[_0x1d4ecb(0x47d)]=_0x1e673d[0x1];}else{const _0x2ff50c={};_0x2ff50c['type']=fUqQap['lJjbX'],_0x2ff50c[_0x1d4ecb(0x46a)]=fUqQap['vVeAc'],_0x2ff50c[_0x1d4ecb(0x388)]=_0x5766c2,_0x54a7ac[_0x1d4ecb(0x550)](_0x23ad5a[_0x1d4ecb(0x19f)](_0x2ff50c));}}if(_0x37f279['includes'](_0x1d4ecb(0x408))){if(_0x3a00dd['HCcbG'](_0x3a00dd[_0x1d4ecb(0x5a1)],_0x3a00dd[_0x1d4ecb(0x88c)]))_0x1dfb28[_0x322c18][_0x1d4ecb(0x890)]=fUqQap[_0x1d4ecb(0x742)];else{const _0x205360=_0x37f279[_0x1d4ecb(0x260)](/ID:([^\s]+)/);if(_0x205360)_0x4ed605[_0x1d4ecb(0x296)]=_0x205360[0x1];}}if(_0x37f279[_0x1d4ecb(0x1bf)]('@')){const _0x2bc135=_0x37f279['match'](/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);if(_0x2bc135){const _0x582509=_0x3a00dd['akiaY'][_0x1d4ecb(0x394)]('|');let _0x20b5d6=0x0;while(!![]){switch(_0x582509[_0x20b5d6++]){case'0':_0x4ed605['x']=_0x3a00dd[_0x1d4ecb(0x278)](parseInt,_0x2bc135[0x1]);continue;case'1':_0x4ed605['height']=_0x3a00dd[_0x1d4ecb(0x801)](parseInt,_0x2bc135[0x4]);continue;case'2':_0x4ed605[_0x1d4ecb(0x49d)]='('+_0x4ed605['x']+','+_0x4ed605['y']+')\x20'+_0x4ed605[_0x1d4ecb(0x286)]+'x'+_0x4ed605[_0x1d4ecb(0x8d8)];continue;case'3':_0x4ed605[_0x1d4ecb(0x286)]=_0x3a00dd['IYIPP'](parseInt,_0x2bc135[0x3]);continue;case'4':_0x4ed605['y']=_0x3a00dd[_0x1d4ecb(0x427)](parseInt,_0x2bc135[0x2]);continue;}break;}}}if(_0x37f279['includes'](_0x1d4ecb(0x844)))_0x4ed605[_0x1d4ecb(0x7e6)]=!![];if(_0x37f279[_0x1d4ecb(0x1bf)](_0x3a00dd['JVxWt']))_0x4ed605['enabled']=!![];if(_0x37f279[_0x1d4ecb(0x1bf)](_0x1d4ecb(0x84d)))_0x4ed605['clickable']=!![];}}}else{const _0x318931=_0x3f09ee['match'](/📍\s+([^\[]+?)(?:\s*\[|\s*Label)/);if(_0x318931){if(_0x3a00dd[_0x1d4ecb(0x176)](_0x1d4ecb(0x895),_0x3a00dd[_0x1d4ecb(0x80c)])){if(_0x5820a0[_0x1d4ecb(0x45e)]===_0x2d385e['OPEN']){const _0xf9ab9f={};_0xf9ab9f[_0x1d4ecb(0x185)]=fUqQap[_0x1d4ecb(0x56e)],_0xf9ab9f['devices']=_0x1efb38,_0x38919d[_0x1d4ecb(0x550)](_0x26fc37[_0x1d4ecb(0x19f)](_0xf9ab9f));}}else _0x4ed605['name']=_0x318931[0x1][_0x1d4ecb(0x878)](),_0x4ed605[_0x1d4ecb(0x598)]=_0x318931[0x1][_0x1d4ecb(0x878)]();}const _0x5c1ad8=_0x3f09ee[_0x1d4ecb(0x260)](/\[([^\]]+)\]/);if(_0x5c1ad8)_0x4ed605[_0x1d4ecb(0x185)]=_0x5c1ad8[0x1][_0x1d4ecb(0x878)]();const _0x13826a=_0x3f09ee[_0x1d4ecb(0x260)](/Label:([^\s]+?)(?:\s*Val:|\s*@|\s*✓)/);if(_0x13826a)_0x4ed605['label']=_0x13826a[0x1]['trim']();const _0x41b7e6=_0x3f09ee[_0x1d4ecb(0x260)](/Val:([^\s]+?)(?:\s*@|\s*✓)/);if(_0x41b7e6)_0x4ed605[_0x1d4ecb(0x47d)]=_0x41b7e6[0x1]['trim']();const _0x4931a8=_0x3f09ee[_0x1d4ecb(0x260)](/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);if(_0x4931a8){const _0x59b363=_0x3a00dd[_0x1d4ecb(0x34c)][_0x1d4ecb(0x394)]('|');let _0xfdfc7d=0x0;while(!![]){switch(_0x59b363[_0xfdfc7d++]){case'0':_0x4ed605['x']=_0x3a00dd['IYIPP'](parseInt,_0x4931a8[0x1]);continue;case'1':_0x4ed605[_0x1d4ecb(0x8d8)]=_0x3a00dd[_0x1d4ecb(0x16b)](parseInt,_0x4931a8[0x4]);continue;case'2':_0x4ed605[_0x1d4ecb(0x49d)]='('+_0x4ed605['x']+','+_0x4ed605['y']+')\x20'+_0x4ed605[_0x1d4ecb(0x286)]+'x'+_0x4ed605[_0x1d4ecb(0x8d8)];continue;case'3':_0x4ed605[_0x1d4ecb(0x286)]=_0x3a00dd[_0x1d4ecb(0x16b)](parseInt,_0x4931a8[0x3]);continue;case'4':_0x4ed605['y']=parseInt(_0x4931a8[0x2]);continue;}break;}}const _0x2f52b1=_0x3f09ee['match'](/ID:([^\s]+)/);if(_0x2f52b1)_0x4ed605[_0x1d4ecb(0x296)]=_0x2f52b1[0x1]['trim']();_0x4ed605['visible']=_0x3f09ee['includes'](_0x3a00dd[_0x1d4ecb(0x802)]),_0x4ed605['enabled']=_0x3f09ee[_0x1d4ecb(0x1bf)](_0x3a00dd[_0x1d4ecb(0x36a)]);}if(_0x4ed605[_0x1d4ecb(0x361)]||_0x4ed605['label']||_0x4ed605['text']){if(_0x3a00dd[_0x1d4ecb(0x215)]!==_0x3a00dd[_0x1d4ecb(0x508)])logger[_0x1d4ecb(0x43a)](_0x3a00dd[_0x1d4ecb(0x1db)],_0x4ed605),_0x12028a[_0x1d4ecb(0x80f)](_0x4ed605);else{const _0x4bb8f6={};return _0x4bb8f6[_0x1d4ecb(0x6ed)]=![],_0x4bb8f6[_0x1d4ecb(0x5d6)]=fUqQap[_0x1d4ecb(0x771)],_0x325983(_0x4bb8f6);}}}catch(_0x6c8df9){console['error']('Error\x20parsing\x20locator\x20line:',_0x3f09ee,_0x6c8df9);}}return console['log'](_0x1d4ecb(0x323)+_0x12028a[_0x1d4ecb(0x3c8)]),_0x12028a;}wss['on'](_0x28fe54(0x40d),_0xdf87fd=>{const _0x384a98=_0x28fe54,_0x200404={'Yvihf':'command_error','WbMLw':_0x384a98(0x326),'zhlMG':function(_0x1b6c0d,_0x151859){return _0x1b6c0d!==_0x151859;},'bcktB':_0x384a98(0x51a),'SuLjE':_0x384a98(0x6cf),'eRrOR':function(_0x33df91,_0x58f8,_0x2a7ed1,_0x2471d7,_0x453e66){return _0x33df91(_0x58f8,_0x2a7ed1,_0x2471d7,_0x453e66);},'GjFgK':_0x384a98(0x70a),'rilqf':_0x384a98(0x779),'HFLgU':'SweGx','qEUpA':_0x384a98(0x640),'UGFhL':function(_0x329620,_0x1ddca8){return _0x329620!==_0x1ddca8;},'NvuaX':'JguUQ','jkGSj':'command_converted','dgCha':function(_0x212655,_0x84f4ea){return _0x212655===_0x84f4ea;},'NqtFk':_0x384a98(0x381),'EwEvo':_0x384a98(0x5b1),'buHmI':_0x384a98(0x353),'cORZs':function(_0x362559,_0x25c519,_0x42e156,_0x1fcad3){return _0x362559(_0x25c519,_0x42e156,_0x1fcad3);},'RtUmf':function(_0x55ce89,_0x478e1f,_0x4f9d34,_0x2d46c2){return _0x55ce89(_0x478e1f,_0x4f9d34,_0x2d46c2);},'cxxoF':function(_0x1a739e,_0x32dea8,_0x7279e0){return _0x1a739e(_0x32dea8,_0x7279e0);},'exsdm':_0x384a98(0x4c6),'Kmnpq':'stop_recording','LSMMW':_0x384a98(0x4f5),'wmeDZ':_0x384a98(0x169),'YNAsJ':'command_output','hbtig':_0x384a98(0x822),'OxyTg':_0x384a98(0x649),'RCznp':_0x384a98(0x588),'RFpsM':function(_0x526d34){return _0x526d34();},'mhjOJ':_0x384a98(0x67d),'muOVG':_0x384a98(0x303),'BSIGq':_0x384a98(0x41c),'dlBWv':_0x384a98(0x2c9),'CbRWP':_0x384a98(0x74e),'pRTeX':'New\x20WebSocket\x20connection','euNFM':_0x384a98(0x5d4),'udNCD':'close','dCbTO':function(_0x8ee28c){return _0x8ee28c();}};console[_0x384a98(0x44c)](_0x200404[_0x384a98(0x275)]),_0xdf87fd['on'](_0x200404[_0x384a98(0x65b)],async _0x5f1dae=>{const _0x4a5220=_0x384a98,_0x138c01={'ubbuL':_0x200404[_0x4a5220(0x4db)],'uKuMu':function(_0x1cd463,_0x2e12d4){return _0x200404['zhlMG'](_0x1cd463,_0x2e12d4);},'bgRMX':_0x4a5220(0x23c),'DCTQT':_0x200404[_0x4a5220(0x812)],'YvZZw':_0x200404[_0x4a5220(0x7aa)],'vTVMP':function(_0x593bf3,_0x2810ae){return _0x593bf3!==_0x2810ae;},'gkyyj':_0x200404[_0x4a5220(0x2c6)],'naHgc':function(_0x17d360,_0x55fae5,_0x4cf99c,_0x3b80f8,_0x5bcba2){const _0x1663b6=_0x4a5220;return _0x200404[_0x1663b6(0x214)](_0x17d360,_0x55fae5,_0x4cf99c,_0x3b80f8,_0x5bcba2);},'IAYoj':_0x200404['GjFgK'],'vNoOD':_0x200404[_0x4a5220(0x35b)]};if(_0x200404[_0x4a5220(0x7fe)](_0x200404[_0x4a5220(0x23a)],_0x200404[_0x4a5220(0x5a7)]))try{const _0x500c37=JSON[_0x4a5220(0x3f9)](_0x5f1dae);switch(_0x500c37[_0x4a5220(0x185)]){case _0x4a5220(0x7d5):const {devices:_0x362178,command:_0x1a267e,useAI:_0x331dbb,aiProvider:_0x5d2ff4}=_0x500c37;console['log'](_0x4a5220(0x702)),console[_0x4a5220(0x44c)](_0x4a5220(0x637)+_0x362178[_0x4a5220(0x184)](',\x20')+']'),console[_0x4a5220(0x44c)](_0x4a5220(0x899)+_0x1a267e+'\x22'),console[_0x4a5220(0x44c)](_0x4a5220(0x875)+_0x331dbb);if(_0x5d2ff4)console[_0x4a5220(0x44c)]('AI\x20Provider:\x20'+_0x5d2ff4);let _0x584bc3=_0x1a267e;if(_0x331dbb)try{if(_0x200404[_0x4a5220(0x1cd)](_0x200404['NvuaX'],'yCyau')){_0x584bc3=await convertNaturalLanguageToCommand(_0x1a267e,_0x362178,_0x5d2ff4),console[_0x4a5220(0x44c)](_0x4a5220(0x3f4)+_0x584bc3);const _0x4ee9ba={};_0x4ee9ba['type']=_0x200404[_0x4a5220(0x2dd)],_0x4ee9ba[_0x4a5220(0x5c8)]=_0x1a267e,_0x4ee9ba[_0x4a5220(0x2bb)]=_0x584bc3,_0x4ee9ba[_0x4a5220(0x218)]=_0x5d2ff4||aiManager[_0x4a5220(0x218)],_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x4ee9ba));}else _0x4aa809[_0x4a5220(0x744)]=_0x418a52,_0x475ba2[_0x4a5220(0x361)]=_0x4e713a,_0xbf8449[_0x4a5220(0x2c8)]='Unknown';}catch(_0x4d764f){if(_0x200404['dgCha'](_0x200404[_0x4a5220(0x8ea)],_0x200404['EwEvo'])){const _0xeb1616={};_0xeb1616[_0x4a5220(0x79e)]=wiPXrz[_0x4a5220(0x524)];const _0x4ea8b2=_0xeb1616,_0x5057e8=_0xcb8748[_0x4a5220(0x7e3)](_0x3801e7=>_0x3801e7['name']===_0x2b371f);wiPXrz[_0x4a5220(0x3a5)](_0x5057e8,-0x1)&&(_0xb786bb[_0x5057e8][_0x4a5220(0x890)]=wiPXrz['bgRMX']);_0x2b77da['clients'][_0x4a5220(0x57c)](_0x2d54a5=>{const _0x5342ea=_0x4a5220;if(_0x2d54a5[_0x5342ea(0x45e)]===_0xd40557[_0x5342ea(0x2fc)]){const _0x375676={};_0x375676[_0x5342ea(0x185)]=_0x4ea8b2[_0x5342ea(0x79e)],_0x375676[_0x5342ea(0x388)]=_0x303121,_0x2d54a5[_0x5342ea(0x550)](_0xd6c16b[_0x5342ea(0x19f)](_0x375676));}});const _0x452187={};_0x452187[_0x4a5220(0x6ed)]=!![],_0x452187[_0x4a5220(0x5d4)]=_0x4a5220(0x5dd)+_0x26fbdb,_0x49822c(_0x452187);}else{console['error'](_0x4a5220(0x21b)+_0x4d764f[_0x4a5220(0x5d4)]);const _0x113264={};_0x113264[_0x4a5220(0x185)]=_0x200404[_0x4a5220(0x1a3)],_0x113264[_0x4a5220(0x5d6)]=_0x4d764f['message'],_0x113264[_0x4a5220(0x5c8)]=_0x1a267e,_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x113264));return;}}else{}const _0x3e10db=_0x584bc3[_0x4a5220(0x1bf)]('\x0a');_0x3e10db?_0x200404[_0x4a5220(0x51b)](executeCommandsSequentially,_0x362178,_0x584bc3,_0xdf87fd)[_0x4a5220(0x732)](_0x1bbd3e=>{const _0x1654a1=_0x4a5220;console[_0x1654a1(0x44c)](_0x1654a1(0x6d6));const _0x5d3a29={};_0x5d3a29[_0x1654a1(0x185)]=_0x138c01[_0x1654a1(0x5a0)],_0x5d3a29[_0x1654a1(0x792)]=_0x1bbd3e,_0xdf87fd[_0x1654a1(0x550)](JSON[_0x1654a1(0x19f)](_0x5d3a29));})[_0x4a5220(0x291)](_0x1fe230=>{const _0x560fd0=_0x4a5220;console[_0x560fd0(0x5d6)](_0x560fd0(0x34b)+_0x1fe230[_0x560fd0(0x5d4)]);const _0x3bc98e={};_0x3bc98e['type']=_0x138c01[_0x560fd0(0x58e)],_0x3bc98e[_0x560fd0(0x5d6)]=_0x1fe230[_0x560fd0(0x5d4)],_0xdf87fd['send'](JSON[_0x560fd0(0x19f)](_0x3bc98e));}):_0x200404[_0x4a5220(0x21c)](executeCommand,_0x362178,_0x584bc3,_0xdf87fd)[_0x4a5220(0x732)](_0x235ff1=>{const _0x273ef3=_0x4a5220;isRecording&&(_0x138c01[_0x273ef3(0x321)](_0x138c01[_0x273ef3(0x6ac)],_0x138c01[_0x273ef3(0x6ac)])?_0x48f783=null:_0x138c01[_0x273ef3(0x23e)](recordCommand,_0x362178,_0x1a267e,_0x331dbb,_0x584bc3));const _0x41cf26={};_0x41cf26[_0x273ef3(0x185)]=_0x138c01[_0x273ef3(0x5a0)],_0x41cf26[_0x273ef3(0x792)]=_0x235ff1,_0xdf87fd['send'](JSON[_0x273ef3(0x19f)](_0x41cf26));})[_0x4a5220(0x291)](_0x3389b8=>{const _0x1b6ab4=_0x4a5220;console[_0x1b6ab4(0x5d6)]('executeCommand\x20failed:\x20'+_0x3389b8[_0x1b6ab4(0x5d4)]);const _0x276096={};_0x276096['type']=_0x200404[_0x1b6ab4(0x7aa)],_0x276096[_0x1b6ab4(0x5d6)]=_0x3389b8[_0x1b6ab4(0x5d4)],_0xdf87fd[_0x1b6ab4(0x550)](JSON[_0x1b6ab4(0x19f)](_0x276096));});break;case _0x4a5220(0x83a):const _0x21f8bb=await _0x200404['cxxoF'](startRecording,_0x500c37[_0x4a5220(0x361)],_0x500c37[_0x4a5220(0x388)]),_0x211840={'type':_0x200404[_0x4a5220(0x6d9)],..._0x21f8bb};_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x211840));break;case _0x200404['Kmnpq']:const _0x4252fb=await stopRecording(),_0x172240={'type':_0x200404[_0x4a5220(0x267)],..._0x4252fb};_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x172240));break;case _0x200404[_0x4a5220(0x615)]:const {filename:_0xf816ff,targetDevices:_0x2f736d}=_0x500c37,_0x4b5390={};_0x4b5390[_0x4a5220(0x185)]=_0x200404[_0x4a5220(0x2a1)],_0x4b5390[_0x4a5220(0x46a)]='\x0a🎬\x20Starting\x20replay:\x20'+_0xf816ff+'\x0a\x0a',_0x4b5390['devices']=_0x2f736d,_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x4b5390)),replayRecording(_0xf816ff,_0x2f736d,_0xdf87fd)[_0x4a5220(0x732)](_0xac66e0=>{const _0x123aa3=_0x4a5220,_0xbfa94c={'type':_0x138c01[_0x123aa3(0x436)],..._0xac66e0};_0xdf87fd[_0x123aa3(0x550)](JSON['stringify'](_0xbfa94c));})[_0x4a5220(0x291)](_0x462c56=>{const _0x2fce1c=_0x4a5220,_0x1b16ac={};_0x1b16ac[_0x2fce1c(0x185)]=_0x138c01[_0x2fce1c(0x8d1)],_0x1b16ac['error']=_0x462c56[_0x2fce1c(0x5d4)],_0xdf87fd[_0x2fce1c(0x550)](JSON[_0x2fce1c(0x19f)](_0x1b16ac));});break;case _0x200404['hbtig']:if(isReplaying){replayAborted=!![];const _0x9fc61b={};_0x9fc61b[_0x4a5220(0x185)]=_0x200404[_0x4a5220(0x2a1)],_0x9fc61b[_0x4a5220(0x46a)]=_0x200404['OxyTg'],_0xdf87fd[_0x4a5220(0x550)](JSON['stringify'](_0x9fc61b));}break;case _0x200404[_0x4a5220(0x635)]:const _0x35715c=await _0x200404[_0x4a5220(0x738)](discoverDevices),_0x2011aa={};_0x2011aa[_0x4a5220(0x185)]=_0x200404[_0x4a5220(0x4db)],_0x2011aa[_0x4a5220(0x388)]=_0x35715c,_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x2011aa));break;case _0x200404[_0x4a5220(0x1a9)]:_0xdf87fd[_0x4a5220(0x550)](JSON['stringify']({'type':_0x200404[_0x4a5220(0x49b)],'providers':aiManager[_0x4a5220(0x2a5)](),'current':aiManager[_0x4a5220(0x218)]}));break;case _0x4a5220(0x4df):const _0x39e13d=aiManager[_0x4a5220(0x6af)](_0x500c37[_0x4a5220(0x218)]),_0x2550db={};_0x2550db['type']=_0x200404[_0x4a5220(0x83b)],_0x2550db[_0x4a5220(0x6ed)]=_0x39e13d,_0x2550db['provider']=_0x500c37['provider'],_0xdf87fd[_0x4a5220(0x550)](JSON[_0x4a5220(0x19f)](_0x2550db));break;}}catch(_0x58647f){const _0x5b9c42={};_0x5b9c42[_0x4a5220(0x185)]='error',_0x5b9c42[_0x4a5220(0x5d4)]=_0x58647f[_0x4a5220(0x5d4)],_0xdf87fd['send'](JSON[_0x4a5220(0x19f)](_0x5b9c42));}else _0x282083['log'](_0x4a5220(0x53b)+_0x49d92b);}),_0xdf87fd['on'](_0x200404[_0x384a98(0x412)],()=>{const _0x2a4dfa=_0x384a98;console[_0x2a4dfa(0x44c)]('WebSocket\x20connection\x20closed');}),_0x200404[_0x384a98(0x8a6)](discoverDevices)['then'](_0x4189b4=>{const _0xe1ad27=_0x384a98;if(_0x200404['dlBWv']!==_0x200404[_0xe1ad27(0x194)]){const _0x494f28={};_0x494f28[_0xe1ad27(0x185)]=_0x200404[_0xe1ad27(0x4db)],_0x494f28['devices']=_0x4189b4,_0xdf87fd[_0xe1ad27(0x550)](JSON[_0xe1ad27(0x19f)](_0x494f28));}else _0x5bfdc0[_0xe1ad27(0x44c)](_0xe1ad27(0x34e)+_0x44b174[_0xe1ad27(0x5d4)]);});}),app[_0x28fe54(0x8bf)](_0x28fe54(0x841),async(_0x320ae1,_0x3e8710)=>{const _0x4e0f05=_0x28fe54,_0x32ecac={'cdUgx':'devices_updated','vyyxp':function(_0x2964c2,_0x12b1a2){return _0x2964c2(_0x12b1a2);},'cdLpT':function(_0x25a1bd,_0x2c5624){return _0x25a1bd!==_0x2c5624;},'bnFPw':_0x4e0f05(0x492),'suTrK':_0x4e0f05(0x7f5),'pIZCh':function(_0x1465ac,_0x3ba5ac){return _0x1465ac!==_0x3ba5ac;},'QAjBS':_0x4e0f05(0x30f),'FdSJM':_0x4e0f05(0x569),'TyrrH':function(_0x1bac94,_0x5df791,_0x5ac79b){return _0x1bac94(_0x5df791,_0x5ac79b);},'DLBME':_0x4e0f05(0x6e2),'SGucS':_0x4e0f05(0x6d7)},{device:_0x39d817}=_0x320ae1['body'];if(!_0x39d817){if(_0x32ecac['cdLpT'](_0x32ecac[_0x4e0f05(0x7c9)],_0x32ecac[_0x4e0f05(0x2e0)])){const _0x35ecd8={};return _0x35ecd8[_0x4e0f05(0x6ed)]=![],_0x35ecd8['error']='Device\x20name\x20required',_0x3e8710[_0x4e0f05(0x890)](0x190)[_0x4e0f05(0x8bb)](_0x35ecd8);}else{const _0x20cd00={};_0x20cd00[_0x4e0f05(0x185)]=ZeMmnu[_0x4e0f05(0x2ad)],_0x20cd00[_0x4e0f05(0x388)]=_0x2a6b08,_0x248757[_0x4e0f05(0x550)](_0x36f964[_0x4e0f05(0x19f)](_0x20cd00));}}try{console[_0x4e0f05(0x44c)](_0x4e0f05(0x523)+_0x39d817+_0x4e0f05(0x7a8));const _0x364bbb=connectedDevices[_0x4e0f05(0x251)](_0x5ad382=>_0x5ad382[_0x4e0f05(0x361)]===_0x39d817);if(!_0x364bbb){if(_0x32ecac['pIZCh'](_0x32ecac[_0x4e0f05(0x874)],_0x32ecac[_0x4e0f05(0x874)])){_0x5961ae[_0x4e0f05(0x5d6)](_0x4e0f05(0x37f)+_0x4b1a1c[_0x4e0f05(0x5d4)]);const _0x3a3883={};_0x3a3883[_0x4e0f05(0x6ed)]=![],_0x3a3883[_0x4e0f05(0x5d4)]=_0x4e0f05(0x61e),ZeMmnu[_0x4e0f05(0x2d0)](_0x554a2e,_0x3a3883);}else{const _0x1af463={};return _0x1af463['success']=![],_0x1af463['error']=_0x32ecac[_0x4e0f05(0x7bc)],_0x3e8710[_0x4e0f05(0x8bb)](_0x1af463);}}const _0x185a8d=await _0x32ecac[_0x4e0f05(0x7d7)](installUIAutomator2,_0x364bbb[_0x4e0f05(0x2a7)],_0x39d817);_0x3e8710[_0x4e0f05(0x8bb)](_0x185a8d);}catch(_0x1de6e7){if(_0x32ecac[_0x4e0f05(0x867)]!==_0x32ecac[_0x4e0f05(0x1e6)]){console[_0x4e0f05(0x5d6)](_0x4e0f05(0x5b9),_0x1de6e7[_0x4e0f05(0x5d4)]);const _0x209613={};_0x209613[_0x4e0f05(0x6ed)]=![],_0x209613[_0x4e0f05(0x5d6)]=_0x1de6e7[_0x4e0f05(0x5d4)],_0x209613[_0x4e0f05(0x40c)]=_0x4e0f05(0x653),_0x3e8710['json'](_0x209613);}else{_0x5c774e[_0x4e0f05(0x5d6)](_0x4e0f05(0x756)+_0x59d6be+':',_0x532430);throw _0x34e0c3;}}}),app['post'](_0x28fe54(0x46b),async(_0x3e897b,_0x2136e6)=>{const _0x3436e4=_0x28fe54,_0x35a65a={'dRVUD':function(_0x3ece9f,_0x6482){return _0x3ece9f(_0x6482);},'vJFBb':_0x3436e4(0x3b8),'hqeyN':function(_0x39ab84){return _0x39ab84();},'Ddddj':function(_0xeabcfc,_0x4a3f65){return _0xeabcfc===_0x4a3f65;},'Wxgiy':_0x3436e4(0x319),'rdDUv':function(_0x46a23c,_0x4800db,_0x4850da){return _0x46a23c(_0x4800db,_0x4850da);}};try{if(_0x35a65a[_0x3436e4(0x517)](_0x35a65a['Wxgiy'],_0x3436e4(0x168))){_0x3b2681[_0x3436e4(0x44c)](_0x3436e4(0x57d)+_0x10cb68['length']+_0x3436e4(0x563));if(_0x4a1776){_0x28c76c[_0x3436e4(0x44c)](_0x3436e4(0x877)+_0x498350+_0x3436e4(0x7a8));const _0x34a4ed=_0x35a65a['dRVUD'](_0x1b5f86,_0x35a65a['vJFBb']);_0x34a4ed(_0x4d036f)[_0x3436e4(0x291)](_0x67c37c=>{const _0x440a33=_0x3436e4;_0x4afa68[_0x440a33(0x44c)](_0x440a33(0x66c)+_0x236096+_0x440a33(0x6a6));});}_0x35a65a[_0x3436e4(0x313)](_0x556787);}else{const {name:_0x4352b1,devices:_0xfa754b}=_0x3e897b[_0x3436e4(0x4eb)],_0x16bc4e=await _0x35a65a[_0x3436e4(0x528)](startRecording,_0x4352b1,_0xfa754b);_0x2136e6[_0x3436e4(0x8bb)](_0x16bc4e);}}catch(_0x497729){const _0x1f34d7={};_0x1f34d7['success']=![],_0x1f34d7[_0x3436e4(0x5d6)]=_0x497729[_0x3436e4(0x5d4)],_0x2136e6[_0x3436e4(0x890)](0x1f4)[_0x3436e4(0x8bb)](_0x1f34d7);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x762),async(_0x4e4256,_0x1c54c2)=>{const _0xdd09fc=_0x28fe54,_0x567d13={};_0x567d13[_0xdd09fc(0x815)]=_0xdd09fc(0x182),_0x567d13[_0xdd09fc(0x26b)]=_0xdd09fc(0x515);const _0x383d14=_0x567d13;try{if(_0x383d14[_0xdd09fc(0x815)]!==_0x383d14['vRHzC']){const _0x43416e=await stopRecording();_0x1c54c2['json'](_0x43416e);}else{const _0x2c1b91={};_0x2c1b91[_0xdd09fc(0x6ed)]=![],_0x2c1b91[_0xdd09fc(0x5d6)]=_0x5efe12[_0xdd09fc(0x5d4)],_0x3b9d30[_0xdd09fc(0x890)](0x1f4)[_0xdd09fc(0x8bb)](_0x2c1b91);}}catch(_0x318704){const _0x328796={};_0x328796[_0xdd09fc(0x6ed)]=![],_0x328796[_0xdd09fc(0x5d6)]=_0x318704[_0xdd09fc(0x5d4)],_0x1c54c2['status'](0x1f4)[_0xdd09fc(0x8bb)](_0x328796);}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x84a),(_0x2fc12f,_0x4e2814)=>{const _0x754b2d=_0x28fe54,_0x7fb703={};_0x7fb703['isRecording']=isRecording,_0x7fb703[_0x754b2d(0x290)]=currentRecording,_0x4e2814[_0x754b2d(0x8bb)](_0x7fb703);}),app[_0x28fe54(0x3a1)](_0x28fe54(0x2a2),async(_0x4f8610,_0x217f8f)=>{const _0x388d65=_0x28fe54,_0x2d7fbe={'IBmlp':function(_0x463e21){return _0x463e21();}};try{const _0x10ecf7=await _0x2d7fbe[_0x388d65(0x83d)](listRecordings),_0x2d9c29={};_0x2d9c29[_0x388d65(0x6ed)]=!![],_0x2d9c29[_0x388d65(0x6c5)]=_0x10ecf7,_0x217f8f['json'](_0x2d9c29);}catch(_0x2dcec9){const _0x53df8d={};_0x53df8d[_0x388d65(0x6ed)]=![],_0x53df8d['error']=_0x2dcec9[_0x388d65(0x5d4)],_0x217f8f[_0x388d65(0x890)](0x1f4)[_0x388d65(0x8bb)](_0x53df8d);}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x808),async(_0x49cf68,_0x5e4f2c)=>{const _0x1861f4=_0x28fe54,_0x526e4a={'gfdIz':function(_0x3d2bd4,_0x4d2427){return _0x3d2bd4===_0x4d2427;},'JBtQR':_0x1861f4(0x745),'vZpFt':function(_0x501983,_0x544a33){return _0x501983(_0x544a33);},'qPOZg':'Recording\x20not\x20found'};try{if(_0x526e4a[_0x1861f4(0x3f7)](_0x1861f4(0x836),_0x526e4a[_0x1861f4(0x89f)]))_0x310cdc=_0x1861f4(0x540)+_0x3013c9+'\x22',_0x599bb7['log'](_0x1861f4(0x81c)+_0x338a16+_0x1861f4(0x509)+_0x46f39f);else{const _0x5e16bf=await _0x526e4a['vZpFt'](loadRecording,_0x49cf68['params'][_0x1861f4(0x597)]),_0x4819b9={};_0x4819b9[_0x1861f4(0x6ed)]=!![],_0x4819b9['recording']=_0x5e16bf,_0x5e4f2c[_0x1861f4(0x8bb)](_0x4819b9);}}catch(_0x5e4bf6){const _0x1fb4f1={};_0x1fb4f1['success']=![],_0x1fb4f1[_0x1861f4(0x5d6)]=_0x526e4a[_0x1861f4(0x740)],_0x5e4f2c[_0x1861f4(0x890)](0x194)[_0x1861f4(0x8bb)](_0x1fb4f1);}}),app[_0x28fe54(0x32c)](_0x28fe54(0x808),async(_0x46dfad,_0x1e5194)=>{const _0x37546d=_0x28fe54,_0x27380d={'dRXBh':function(_0x2ce50e,_0x34ce73){return _0x2ce50e(_0x34ce73);},'MfOsB':function(_0x55b7f8,_0xed47fb){return _0x55b7f8!==_0xed47fb;},'yNfgF':_0x37546d(0x5cc),'ARcDn':'rwxMo'};try{await _0x27380d['dRXBh'](deleteRecording,_0x46dfad[_0x37546d(0x289)]['filename']);const _0x1c382c={};_0x1c382c[_0x37546d(0x6ed)]=!![],_0x1e5194['json'](_0x1c382c);}catch(_0x2d9131){if(_0x27380d[_0x37546d(0x3cb)](_0x27380d[_0x37546d(0x5d7)],_0x27380d['ARcDn'])){const _0x4095eb={};_0x4095eb['success']=![],_0x4095eb[_0x37546d(0x5d6)]=_0x2d9131[_0x37546d(0x5d4)],_0x1e5194[_0x37546d(0x890)](0x1f4)[_0x37546d(0x8bb)](_0x4095eb);}else{if(_0x1b1cca[_0x37546d(0x687)]&&!_0x4b256c['isDirectory'])return-0x1;if(!_0x29da08[_0x37546d(0x687)]&&_0x205767['isDirectory'])return 0x1;return _0x20774d[_0x37546d(0x361)]['localeCompare'](_0x11f7f4[_0x37546d(0x361)]);}}}),app['put'](_0x28fe54(0x808),async(_0x5315ae,_0x277a9e)=>{const _0x7759ff=_0x28fe54,_0x1fd4cb={};_0x1fd4cb[_0x7759ff(0x8eb)]=function(_0x1c4d7e,_0x14a33a){return _0x1c4d7e!==_0x14a33a;};const _0xb8d6f2=_0x1fd4cb;try{if(_0xb8d6f2['sdNUm'](_0x7759ff(0x657),'aNFNQ')){const {filename:_0x1345b0}=_0x5315ae[_0x7759ff(0x289)],_0x203ec4=_0x5315ae[_0x7759ff(0x4eb)],_0x6d433e=path[_0x7759ff(0x184)](RECORDINGS_DIR,_0x1345b0);await fs[_0x7759ff(0x188)](_0x6d433e,JSON[_0x7759ff(0x19f)](_0x203ec4,null,0x2));const _0x442cba={};_0x442cba[_0x7759ff(0x6ed)]=!![],_0x442cba[_0x7759ff(0x290)]=_0x203ec4,_0x277a9e[_0x7759ff(0x8bb)](_0x442cba);}else _0x4ef100[_0x7759ff(0x44c)]('✅\x20Cleaned\x20up\x20port\x20'+_0x56a566+'\x20for\x20'+_0x20b2e9);}catch(_0x369aff){const _0x114c24={};_0x114c24['success']=![],_0x114c24['error']=_0x369aff[_0x7759ff(0x5d4)],_0x277a9e['status'](0x1f4)['json'](_0x114c24);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x5ab),async(_0x1988cf,_0x2aeaf6)=>{const _0xc0fbcc=_0x28fe54,_0x2dc7a6={'YSKfZ':function(_0x2acdd9,_0x472254){return _0x2acdd9(_0x472254);},'rxUKc':function(_0x475416,_0x3aef4b){return _0x475416===_0x3aef4b;},'BlbEJ':'qvdZb','eLPik':function(_0x26f502,_0x337589){return _0x26f502||_0x337589;},'cmRQa':function(_0x21dbbe,_0xbcbf22){return _0x21dbbe||_0xbcbf22;},'Nbtho':_0xc0fbcc(0x261),'IidXN':'Error\x20saving\x20recording:'};try{if(_0x2dc7a6['rxUKc']('qvdZb',_0x2dc7a6[_0xc0fbcc(0x5ff)])){const {name:_0x1fb1bd,commands:_0x59e278,date:_0x45e093,type:_0x164e27}=_0x1988cf[_0xc0fbcc(0x4eb)];if(_0x2dc7a6[_0xc0fbcc(0x4c1)](!_0x1fb1bd,!_0x59e278)){const _0x293e04={};return _0x293e04[_0xc0fbcc(0x6ed)]=![],_0x293e04['error']=_0xc0fbcc(0x3fa),_0x2aeaf6[_0xc0fbcc(0x890)](0x190)['json'](_0x293e04);}const _0x10868e=_0x1fb1bd[_0xc0fbcc(0x8e7)](/[^a-z0-9_-]/gi,'_'),_0x15d239=_0x10868e+'_'+Date[_0xc0fbcc(0x480)]()+_0xc0fbcc(0x1e7),_0x4c81b4=path[_0xc0fbcc(0x184)](RECORDINGS_DIR,_0x15d239),_0x379822={'name':_0x1fb1bd,'commands':_0x59e278,'date':_0x45e093||new Date()['toISOString'](),'type':_0x2dc7a6[_0xc0fbcc(0x1f1)](_0x164e27,_0x2dc7a6['Nbtho'])};await fs[_0xc0fbcc(0x188)](_0x4c81b4,JSON[_0xc0fbcc(0x19f)](_0x379822,null,0x2));const _0x36eb82={};_0x36eb82['success']=!![],_0x36eb82[_0xc0fbcc(0x597)]=_0x15d239,_0x36eb82[_0xc0fbcc(0x290)]=_0x379822,_0x2aeaf6[_0xc0fbcc(0x8bb)](_0x36eb82);}else{const _0x9a697={};_0x9a697['success']=!![],_0x9a697['output']=_0x11a69f,_0x9a697['device']=_0x36d46a[_0xc0fbcc(0x361)],YbXZQI['YSKfZ'](_0x3fc909,_0x9a697);}}catch(_0x584c00){console[_0xc0fbcc(0x5d6)](_0x2dc7a6[_0xc0fbcc(0x84c)],_0x584c00);const _0x21b51f={};_0x21b51f[_0xc0fbcc(0x6ed)]=![],_0x21b51f[_0xc0fbcc(0x5d6)]=_0x584c00[_0xc0fbcc(0x5d4)],_0x2aeaf6[_0xc0fbcc(0x890)](0x1f4)[_0xc0fbcc(0x8bb)](_0x21b51f);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x557),async(_0xecab90,_0x3a830e)=>{const _0x131042=_0x28fe54,_0xe21f21={};_0xe21f21['xDsCm']=function(_0x49429e,_0x46fa8c){return _0x49429e===_0x46fa8c;},_0xe21f21[_0x131042(0x4b0)]='devices_updated',_0xe21f21[_0x131042(0x7b9)]=_0x131042(0x51f),_0xe21f21['XQDXv']=_0x131042(0x586),_0xe21f21[_0x131042(0x698)]=_0x131042(0x8e6),_0xe21f21[_0x131042(0x8d2)]=function(_0x10fb65,_0x38a83c){return _0x10fb65!==_0x38a83c;},_0xe21f21[_0x131042(0x4ad)]=_0x131042(0x672),_0xe21f21['hHdsO']=_0x131042(0x6d5),_0xe21f21[_0x131042(0x300)]=_0x131042(0x3ba),_0xe21f21[_0x131042(0x355)]=_0x131042(0x75a),_0xe21f21['ZAkdq']=_0x131042(0x554),_0xe21f21[_0x131042(0x50f)]=_0x131042(0x885);const _0x546df6=_0xe21f21;try{const {filename:_0x29a63b,devices:_0x9c973d}=_0xecab90[_0x131042(0x4eb)];if(!_0x29a63b){if(_0x546df6[_0x131042(0x8d2)](_0x546df6['PHvub'],_0x546df6[_0x131042(0x18d)])){const _0x5cf0e0={};return _0x5cf0e0[_0x131042(0x6ed)]=![],_0x5cf0e0[_0x131042(0x5d6)]=_0x546df6['tWRmC'],_0x3a830e[_0x131042(0x890)](0x190)[_0x131042(0x8bb)](_0x5cf0e0);}else{const _0x1d57d2={'trIMZ':function(_0x509beb,_0x6d86b4){const _0x53fa67=_0x131042;return dGjbdJ[_0x53fa67(0x276)](_0x509beb,_0x6d86b4);},'DPgJS':dGjbdJ[_0x131042(0x4b0)]};_0x21fb40[_0x4e533c][_0x131042(0x890)]=_0x131042(0x1af),_0x4dd5a3['clients']['forEach'](_0x1906c4=>{const _0x546761=_0x131042;if(_0x1d57d2['trIMZ'](_0x1906c4[_0x546761(0x45e)],_0x2648db[_0x546761(0x2fc)])){const _0xf86cf6={};_0xf86cf6[_0x546761(0x185)]=_0x1d57d2[_0x546761(0x6f8)],_0xf86cf6[_0x546761(0x388)]=_0x2e1dca,_0x1906c4['send'](_0x13387e['stringify'](_0xf86cf6));}});}}if(!_0x9c973d||_0x546df6[_0x131042(0x276)](_0x9c973d['length'],0x0)){if(_0x131042(0x75a)===_0x546df6[_0x131042(0x355)]){const _0x52ff17={};return _0x52ff17[_0x131042(0x6ed)]=![],_0x52ff17[_0x131042(0x5d6)]=_0x546df6[_0x131042(0x2d2)],_0x3a830e[_0x131042(0x890)](0x190)['json'](_0x52ff17);}else{_0x4c28eb[_0x131042(0x44c)](dGjbdJ['eypik']),_0x417431[_0x131042(0x44c)](dGjbdJ[_0x131042(0x376)],_0x2d2ce5[_0x131042(0x19f)](_0x32cc3d,null,0x2));const _0x247f0c={};return _0x247f0c[_0x131042(0x6ed)]=![],_0x247f0c[_0x131042(0x5d6)]=dGjbdJ[_0x131042(0x698)],_0x510020[_0x131042(0x890)](0x1f4)[_0x131042(0x8bb)](_0x247f0c);}}const _0x350a40={};_0x350a40[_0x131042(0x6ed)]=!![],_0x350a40[_0x131042(0x5d4)]=_0x546df6[_0x131042(0x50f)],_0x3a830e[_0x131042(0x8bb)](_0x350a40);}catch(_0x5e9a27){const _0x4b5491={};_0x4b5491[_0x131042(0x6ed)]=![],_0x4b5491[_0x131042(0x5d6)]=_0x5e9a27[_0x131042(0x5d4)],_0x3a830e[_0x131042(0x890)](0x1f4)['json'](_0x4b5491);}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x458),async(_0xcad202,_0xdcbf33)=>{const _0x55f0b3=_0x28fe54,_0x2930f2={'hNSHW':function(_0x5a3078,_0x1dffdc){return _0x5a3078(_0x1dffdc);}};try{const _0x587348={};_0x587348[_0x55f0b3(0x307)]=!![],await fs[_0x55f0b3(0x39c)](SCREENSHOTS_DIR,_0x587348);const _0xfd1bb3=await fs['readdir'](SCREENSHOTS_DIR),_0x82f994=_0xfd1bb3[_0x55f0b3(0x6fc)](_0xc0787d=>_0xc0787d[_0x55f0b3(0x51d)](_0x55f0b3(0x606)))[_0x55f0b3(0x2d1)](_0x225157=>{const _0x10779a=_0x55f0b3,_0x596523=_0x2930f2[_0x10779a(0x55a)](require,'fs')[_0x10779a(0x2a9)](path['join'](SCREENSHOTS_DIR,_0x225157));return{'filename':_0x225157,'path':_0x10779a(0x3cd)+_0x225157,'size':_0x596523[_0x10779a(0x6c9)],'timestamp':_0x596523[_0x10779a(0x447)][_0x10779a(0x710)](),'created':_0x596523['mtime']};})[_0x55f0b3(0x352)]((_0x24d2b9,_0x5724a0)=>_0x5724a0[_0x55f0b3(0x2e4)]-_0x24d2b9['timestamp']),_0x2ed091={};_0x2ed091[_0x55f0b3(0x6ed)]=!![],_0x2ed091[_0x55f0b3(0x625)]=_0x82f994,_0xdcbf33[_0x55f0b3(0x8bb)](_0x2ed091);}catch(_0x260e1d){const _0x1707e3={};_0x1707e3['success']=![],_0x1707e3['error']=_0x260e1d[_0x55f0b3(0x5d4)],_0xdcbf33[_0x55f0b3(0x890)](0x1f4)[_0x55f0b3(0x8bb)](_0x1707e3);}}),app[_0x28fe54(0x3a1)](_0x28fe54(0x24e),(_0x1c9013,_0x4f968c)=>{const _0x57793a=_0x28fe54,_0xaa87ca={};_0xaa87ca[_0x57793a(0x4f6)]=_0x57793a(0x7ce);const _0x85f3fc=_0xaa87ca,_0xf73299=path[_0x57793a(0x184)](SCREENSHOTS_DIR,_0x1c9013[_0x57793a(0x289)]['filename']);_0x4f968c[_0x57793a(0x73b)](_0xf73299,_0x362487=>{const _0x4be861=_0x57793a;if(_0x362487){const _0x56e4a7={};_0x56e4a7[_0x4be861(0x6ed)]=![],_0x56e4a7[_0x4be861(0x5d6)]=_0x85f3fc['YJqLc'],_0x4f968c[_0x4be861(0x890)](0x194)['json'](_0x56e4a7);}});}),app[_0x28fe54(0x32c)](_0x28fe54(0x24e),async(_0x1bc870,_0x4675d6)=>{const _0xdb82b5=_0x28fe54;try{const _0xecf924=path[_0xdb82b5(0x184)](SCREENSHOTS_DIR,_0x1bc870[_0xdb82b5(0x289)][_0xdb82b5(0x597)]);await fs[_0xdb82b5(0x8a9)](_0xecf924);const _0x75a6cb={};_0x75a6cb['success']=!![],_0x4675d6['json'](_0x75a6cb);}catch(_0x30f2f9){const _0x4391a6={};_0x4391a6['success']=![],_0x4391a6[_0xdb82b5(0x5d6)]=_0x30f2f9[_0xdb82b5(0x5d4)],_0x4675d6[_0xdb82b5(0x890)](0x1f4)[_0xdb82b5(0x8bb)](_0x4391a6);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x493),async(_0x214ba4,_0x6b3176)=>{const _0x55e2f7=_0x28fe54,_0x53db58={'EeJul':'command_output','pvZJY':function(_0x3e25fe,_0x3ca47d){return _0x3e25fe===_0x3ca47d;},'LBZnO':function(_0x48b67e,_0x46b52b){return _0x48b67e(_0x46b52b);},'dXBWQ':function(_0x25e3be,_0x4016d0){return _0x25e3be(_0x4016d0);},'zOFnZ':function(_0xd6d1ba,_0x4ec90c,_0x3eb5d7){return _0xd6d1ba(_0x4ec90c,_0x3eb5d7);},'fxeCj':'Script\x20execution\x20error:','Zbjkl':_0x55e2f7(0x87e),'palzJ':function(_0x2c21ce,_0x453938,_0x21f5a7){return _0x2c21ce(_0x453938,_0x21f5a7);},'rwaPB':_0x55e2f7(0x6ba),'UdEFA':function(_0x112a76,_0x2e4878){return _0x112a76(_0x2e4878);},'rQIRJ':_0x55e2f7(0x407),'kgurW':function(_0x177eff,_0x1e69ef){return _0x177eff!==_0x1e69ef;},'lmTaD':_0x55e2f7(0x575),'xueBA':'ZRpLN','hOgJf':_0x55e2f7(0x2b4),'HqdlU':_0x55e2f7(0x3e9),'QILRP':_0x55e2f7(0x681),'SiTTo':_0x55e2f7(0x345),'ZyYMV':function(_0x3c0f48,_0x56e55f){return _0x3c0f48!==_0x56e55f;},'VlJkV':'jQaQM','EAKcd':_0x55e2f7(0x2f4)};try{const {directory:directory=_0x53db58['UdEFA'](require,'os')[_0x55e2f7(0x3ef)]()}=_0x214ba4['body'],_0x453ad4=await fs[_0x55e2f7(0x855)](directory),_0x308163=[];for(const _0x37ae83 of _0x453ad4){if(_0x53db58[_0x55e2f7(0x2f0)]===_0x53db58[_0x55e2f7(0x2f0)])try{if(_0x53db58[_0x55e2f7(0x4b7)](_0x53db58[_0x55e2f7(0x44f)],_0x53db58[_0x55e2f7(0x666)])){const _0x1b9454=path['join'](directory,_0x37ae83),_0x16e74b=await fs[_0x55e2f7(0x17a)](_0x1b9454);if(_0x16e74b[_0x55e2f7(0x687)]()||_0x37ae83[_0x55e2f7(0x51d)](_0x55e2f7(0x54d))||_0x37ae83['endsWith'](_0x53db58[_0x55e2f7(0x641)])){if(_0x53db58[_0x55e2f7(0x51c)]===_0x53db58[_0x55e2f7(0x5f9)]){const _0x532362={};_0x532362['type']=GuzRmJ['EeJul'],_0x532362[_0x55e2f7(0x46a)]='\x0a⚠️\x20\x20Error:\x20Devices\x20not\x20connected:\x20'+_0x188d96+_0x55e2f7(0x630),_0x532362[_0x55e2f7(0x388)]=_0x431f65,_0x52f328[_0x55e2f7(0x550)](_0x6ec8aa[_0x55e2f7(0x19f)](_0x532362));}else _0x308163['push']({'name':_0x37ae83,'path':_0x1b9454,'isDirectory':_0x16e74b['isDirectory'](),'size':_0x16e74b[_0x55e2f7(0x6c9)],'modified':_0x16e74b['mtime']});}}else{if(GuzRmJ['pvZJY'](_0x20d9fd,0x0)){const _0x5a056a={};_0x5a056a['success']=!![],_0x5a056a['output']=_0x1283c4,_0x5a056a['device']=_0x59dc8e[_0x55e2f7(0x361)],_0x3447b7(_0x5a056a);}else{const _0x5efe30={};_0x5efe30['success']=![],_0x5efe30[_0x55e2f7(0x5d6)]=_0x224a44||_0x367ec2,_0x5efe30[_0x55e2f7(0x838)]=_0x2bebe7[_0x55e2f7(0x361)],GuzRmJ[_0x55e2f7(0x547)](_0x395243,_0x5efe30);}}}catch(_0x33be3f){if(_0x53db58[_0x55e2f7(0x3ac)]('jQTPh',_0x53db58[_0x55e2f7(0x636)]))continue;else{const _0x50eea4=GuzRmJ['dXBWQ'](_0x52b10e,'fs')[_0x55e2f7(0x2a9)](_0x2eadd5[_0x55e2f7(0x184)](_0x58f4a8,_0x1502b9));return{'filename':_0x3fa106,'path':_0x55e2f7(0x3cd)+_0xbdd0e1,'size':_0x50eea4['size'],'timestamp':_0x50eea4[_0x55e2f7(0x447)][_0x55e2f7(0x710)](),'created':_0x50eea4[_0x55e2f7(0x447)]};}}else{const _0x17c187={};_0x17c187[_0x55e2f7(0x873)]='utf-8',_0x17c187['timeout']=0x7530,_0x14e96f=_0x53db58['zOFnZ'](_0x164de7,_0x55e2f7(0x7fb)+_0x1659da+_0x55e2f7(0x823),_0x17c187);}}_0x308163[_0x55e2f7(0x352)]((_0x92be14,_0x5688aa)=>{const _0x516921=_0x55e2f7;if(_0x516921(0x87e)!==_0x53db58[_0x516921(0x2ee)])_0x2d21a5[_0x516921(0x5d6)](GuzRmJ[_0x516921(0x80e)],_0x3a1b5d),GuzRmJ[_0x516921(0x547)](_0x498254,_0x49430b);else{if(_0x92be14[_0x516921(0x687)]&&!_0x5688aa['isDirectory'])return-0x1;if(!_0x92be14[_0x516921(0x687)]&&_0x5688aa[_0x516921(0x687)])return 0x1;return _0x92be14[_0x516921(0x361)][_0x516921(0x87b)](_0x5688aa[_0x516921(0x361)]);}}),_0x6b3176[_0x55e2f7(0x8bb)]({'success':!![],'directory':directory,'files':_0x308163,'parent':path[_0x55e2f7(0x889)](directory)});}catch(_0x15d86b){if(_0x53db58[_0x55e2f7(0x1f6)](_0x53db58[_0x55e2f7(0x3cf)],_0x53db58[_0x55e2f7(0x3cf)]))_0x1dee3b=GuzRmJ['palzJ'](_0x4ceeba,_0x55e2f7(0x328)+_0x41d995+_0x55e2f7(0x59d),{'encoding':GuzRmJ['rwaPB']})[_0x55e2f7(0x878)]();else{logger[_0x55e2f7(0x5d6)](_0x53db58[_0x55e2f7(0x55d)],_0x15d86b);const _0x3a76b4={};_0x3a76b4[_0x55e2f7(0x6ed)]=![],_0x3a76b4[_0x55e2f7(0x5d6)]=_0x15d86b[_0x55e2f7(0x5d4)],_0x6b3176[_0x55e2f7(0x890)](0x1f4)[_0x55e2f7(0x8bb)](_0x3a76b4);}}}),app[_0x28fe54(0x8bf)]('/api/apps/list',async(_0x308c93,_0x431ce3)=>{const _0x2e6421=_0x28fe54,_0x153e6e={'vyTBY':_0x2e6421(0x1af),'anRao':function(_0x27fc90,_0x20f6fd){return _0x27fc90!==_0x20f6fd;},'rTUDz':'PLOns','EWjxV':_0x2e6421(0x424),'yHRsv':_0x2e6421(0x76e),'XwMPT':_0x2e6421(0x7ab),'aDCCU':_0x2e6421(0x187),'feWdQ':_0x2e6421(0x190),'RiXZJ':_0x2e6421(0x351),'NnZwy':function(_0x11f1a8,_0x113377){return _0x11f1a8>=_0x113377;},'bvirW':_0x2e6421(0x721),'JioPo':_0x2e6421(0x834),'KokvU':_0x2e6421(0x325),'qBcwf':'No\x20connected\x20devices\x20found','cdmXD':function(_0x57744f,_0x4c770a){return _0x57744f(_0x4c770a);},'nDuaF':'child_process','XaRCZ':_0x2e6421(0x6ba),'bSAWe':_0x2e6421(0x3e3),'mYyTi':function(_0x57dbf,_0x592670){return _0x57dbf(_0x592670);},'qfnUe':function(_0x3bfeac,_0xa9f05b){return _0x3bfeac!==_0xa9f05b;},'hhFrv':_0x2e6421(0x1ca),'EyuWb':function(_0x4e0a68,_0x4545a2,_0x529a7b){return _0x4e0a68(_0x4545a2,_0x529a7b);},'trPEi':function(_0x84c80,_0x72cb19){return _0x84c80===_0x72cb19;},'JLhhi':_0x2e6421(0x2f9),'fDfQp':function(_0x2db912,_0x4371d3){return _0x2db912===_0x4371d3;},'CmbPW':'XaZMw','sGhPt':_0x2e6421(0x406),'tstSs':_0x2e6421(0x6ae),'QncvM':function(_0x2ea4b4,_0x559034){return _0x2ea4b4===_0x559034;},'JnpyW':_0x2e6421(0x79c),'ZzXMU':_0x2e6421(0x6d1)};try{const {devices:_0x1ad1b1}=_0x308c93[_0x2e6421(0x4eb)];if(!_0x1ad1b1||_0x1ad1b1[_0x2e6421(0x3c8)]===0x0){const _0x32afdb={};return _0x32afdb[_0x2e6421(0x6ed)]=![],_0x32afdb[_0x2e6421(0x5d6)]=_0x153e6e[_0x2e6421(0x4fc)],_0x431ce3['status'](0x190)[_0x2e6421(0x8bb)](_0x32afdb);}const _0x327012=connectedDevices[_0x2e6421(0x6fc)](_0x5befb1=>_0x1ad1b1[_0x2e6421(0x1bf)](_0x5befb1['name'])||_0x1ad1b1['includes'](_0x5befb1['udid'])||_0x1ad1b1[_0x2e6421(0x1bf)](_0x5befb1[_0x2e6421(0x207)]));if(_0x327012['length']===0x0){const _0x724da5={};return _0x724da5['success']=![],_0x724da5[_0x2e6421(0x5d6)]=_0x153e6e[_0x2e6421(0x419)],_0x431ce3['status'](0x190)[_0x2e6421(0x8bb)](_0x724da5);}const _0x538ce0={};for(const _0x97d563 of _0x327012){try{let _0x17b0de=[];if(_0x97d563[_0x2e6421(0x2fa)]===_0x2e6421(0x88d)){const {execSync:_0x1cce99}=_0x153e6e[_0x2e6421(0x7f9)](require,_0x153e6e[_0x2e6421(0x8d6)]),_0x449f87=_0x97d563[_0x2e6421(0x2a7)]||_0x97d563[_0x2e6421(0x207)],_0x262c6a={};_0x262c6a[_0x2e6421(0x873)]=_0x153e6e[_0x2e6421(0x6c2)];const _0x5da7dd=_0x1cce99('adb\x20-s\x20'+_0x449f87+_0x2e6421(0x33d),_0x262c6a);_0x17b0de=_0x5da7dd[_0x2e6421(0x394)]('\x0a')['filter'](_0x52e50e=>_0x52e50e['startsWith'](_0x2e6421(0x22e)))[_0x2e6421(0x2d1)](_0x5ad4a6=>_0x5ad4a6[_0x2e6421(0x8e7)]('package:','')[_0x2e6421(0x878)]())[_0x2e6421(0x6fc)](_0x5c270a=>_0x5c270a)[_0x2e6421(0x352)]();}else{if(_0x97d563[_0x2e6421(0x2fa)]===_0x153e6e[_0x2e6421(0x573)]){const {execSync:_0x3d484f}=_0x153e6e[_0x2e6421(0x1b0)](require,_0x153e6e[_0x2e6421(0x8d6)]),_0x449785=_0x97d563[_0x2e6421(0x2a7)];try{let _0x19e4a3;try{const _0x4a487e={};_0x4a487e[_0x2e6421(0x873)]=_0x153e6e[_0x2e6421(0x6c2)],_0x4a487e['timeout']=0x7530,_0x19e4a3=_0x3d484f(_0x2e6421(0x7fb)+_0x449785+_0x2e6421(0x821),_0x4a487e);}catch(_0x5a164f){_0x153e6e['qfnUe'](_0x2e6421(0x59f),_0x153e6e[_0x2e6421(0x4e4)])?_0x19e4a3=_0x153e6e[_0x2e6421(0x5b4)](_0x3d484f,_0x2e6421(0x7fb)+_0x449785+_0x2e6421(0x823),{'encoding':_0x153e6e[_0x2e6421(0x6c2)],'timeout':0x7530}):_0x18a556[_0x40e971][_0x2e6421(0x890)]=etNOEO[_0x2e6421(0x2e9)];}_0x17b0de=_0x19e4a3[_0x2e6421(0x394)]('\x0a')['filter'](_0x48f881=>{const _0x9b22d3=_0x2e6421;if(_0x153e6e[_0x9b22d3(0x892)](_0x153e6e[_0x9b22d3(0x166)],_0x153e6e[_0x9b22d3(0x166)]))_0x1027c7[_0x9b22d3(0x44c)](_0x9b22d3(0x65d)+_0x529840[_0x9b22d3(0x5d4)]);else{const _0x17b0e1=_0x48f881['trim']();return _0x17b0e1&&!_0x17b0e1[_0x9b22d3(0x310)](_0x9b22d3(0x85b))&&!_0x17b0e1[_0x9b22d3(0x310)](_0x153e6e['EWjxV']);}})[_0x2e6421(0x2d1)](_0x14113f=>{const _0x5569e5=_0x2e6421,_0x1f7f21={};_0x1f7f21[_0x5569e5(0x7d2)]=_0x153e6e[_0x5569e5(0x726)],_0x1f7f21[_0x5569e5(0x306)]=_0x153e6e['XwMPT'];const _0x2a62b7=_0x1f7f21;if(_0x14113f['includes'](_0x153e6e[_0x5569e5(0x2c0)])){if(_0x153e6e[_0x5569e5(0x7d4)]===_0x153e6e[_0x5569e5(0x18f)])_0x3498c1[_0x5569e5(0x5d6)](_0x2a62b7[_0x5569e5(0x7d2)],_0x2c8543['message']);else{const _0x908ee8=_0x14113f['match'](/^(.+?)\s+-\s+(.+?)$/);return _0x908ee8?{'id':_0x908ee8[0x1][_0x5569e5(0x878)](),'name':_0x908ee8[0x2][_0x5569e5(0x878)]()}:null;}}else{if(_0x14113f[_0x5569e5(0x1bf)](',')){const _0x125423=_0x14113f[_0x5569e5(0x394)](',')[_0x5569e5(0x2d1)](_0x38838f=>_0x38838f[_0x5569e5(0x878)]()[_0x5569e5(0x8e7)](/"/g,''));return _0x153e6e[_0x5569e5(0x735)](_0x125423['length'],0x3)?{'id':_0x125423[0x0],'name':_0x125423[0x2]}:null;}else{if(_0x14113f[_0x5569e5(0x260)](/^[a-zA-Z0-9.-]+$/)){if(_0x153e6e[_0x5569e5(0x892)](_0x153e6e[_0x5569e5(0x76c)],_0x5569e5(0x721))){const _0x4d2e3c={};_0x4d2e3c['type']=jyXMwG['LuNpZ'],_0x4d2e3c[_0x5569e5(0x46a)]=_0x5569e5(0x81a)+_0x1aabd4+_0x5569e5(0x7c5),_0x4d2e3c['devices']=_0x4c1c7e,_0x3d86ae[_0x5569e5(0x550)](_0x1f06ae[_0x5569e5(0x19f)](_0x4d2e3c));}else return{'id':_0x14113f['trim'](),'name':_0x14113f['trim']()};}}}return null;})[_0x2e6421(0x6fc)](_0x3afd38=>_0x3afd38)[_0x2e6421(0x352)]((_0x886751,_0x517398)=>_0x886751[_0x2e6421(0x361)][_0x2e6421(0x87b)](_0x517398[_0x2e6421(0x361)]));if(_0x153e6e[_0x2e6421(0x34d)](_0x17b0de['length'],0x0)){const _0x4cc33b={};_0x4cc33b[_0x2e6421(0x5d6)]=_0x153e6e['JLhhi'],_0x17b0de=[_0x4cc33b];}}catch(_0x479050){if(_0x153e6e[_0x2e6421(0x6b7)](_0x153e6e[_0x2e6421(0x201)],_0x153e6e['sGhPt'])){const _0x1c12ec=_0x44a0e9['ip']||'';_0x2a7ba6+=_0x2f21e0['name']+','+_0x5e1f37[_0x2e6421(0x2a7)]+','+_0x1c12ec+'\x0a';}else{console[_0x2e6421(0x5d6)](_0x153e6e[_0x2e6421(0x30e)],_0x479050['message']);const _0x2e11a2={};_0x2e11a2[_0x2e6421(0x5d6)]='Failed\x20to\x20list\x20apps:\x20'+_0x479050[_0x2e6421(0x5d4)],_0x17b0de=[_0x2e11a2];}}}}_0x538ce0[_0x97d563[_0x2e6421(0x361)]]={'success':!![],'platform':_0x97d563[_0x2e6421(0x2fa)],'apps':_0x17b0de,'count':Array[_0x2e6421(0x198)](_0x17b0de)?_0x17b0de[_0x2e6421(0x3c8)]:0x0};}catch(_0x5a0623){if(_0x153e6e['QncvM'](_0x153e6e[_0x2e6421(0x2f6)],_0x153e6e[_0x2e6421(0x5c0)]))_0xad6507['log'](etNOEO['JioPo']);else{const _0x5d2250={};_0x5d2250['success']=![],_0x5d2250['error']=_0x5a0623[_0x2e6421(0x5d4)],_0x538ce0[_0x97d563['name']]=_0x5d2250;}}}const _0x95a778={};_0x95a778[_0x2e6421(0x6ed)]=!![],_0x95a778['results']=_0x538ce0,_0x431ce3[_0x2e6421(0x8bb)](_0x95a778);}catch(_0x4cbaf4){const _0x38defb={};_0x38defb['success']=![],_0x38defb[_0x2e6421(0x5d6)]=_0x4cbaf4[_0x2e6421(0x5d4)],_0x431ce3[_0x2e6421(0x890)](0x1f4)[_0x2e6421(0x8bb)](_0x38defb);}}),app[_0x28fe54(0x8bf)](_0x28fe54(0x694),async(_0x3fe078,_0x333847)=>{const _0x8ae01=_0x28fe54,_0x318e69={'LIOOv':function(_0x1cc9bd,_0x5d4108){return _0x1cc9bd(_0x5d4108);},'zdtsw':_0x8ae01(0x3fa),'WsQUB':function(_0x5b7946,_0x380285){return _0x5b7946||_0x380285;},'xZOXy':'Device\x20and\x20bundle\x20ID\x20required','Ljfqk':function(_0xc613a5,_0x4ac8f4){return _0xc613a5===_0x4ac8f4;},'NNzQG':_0x8ae01(0x88d),'bobes':function(_0x465b22,_0x438aec){return _0x465b22===_0x438aec;},'gSIRi':_0x8ae01(0x781),'kgcEQ':function(_0x236995,_0x447e82,_0x1c91c2){return _0x236995(_0x447e82,_0x1c91c2);},'AunGi':_0x8ae01(0x6ba),'zpulC':function(_0x67f30b,_0x4d7656){return _0x67f30b===_0x4d7656;},'jARZW':_0x8ae01(0x8e3),'GqbCQ':'package:','gTPdT':function(_0x45d851,_0x53ef31){return _0x45d851!==_0x53ef31;},'UbzhA':_0x8ae01(0x3c5),'oAkjh':function(_0x405146,_0x5cc24a,_0x25837e){return _0x405146(_0x5cc24a,_0x25837e);},'AVAXn':function(_0xf43ac2,_0x4d384a){return _0xf43ac2>=_0x4d384a;},'yjlQr':function(_0x5e8187,_0x3807dc){return _0x5e8187!==_0x3807dc;},'udupR':_0x8ae01(0x247),'LAodS':_0x8ae01(0x421),'mJsPX':'ALiCW','xqbds':_0x8ae01(0x572),'rPKYQ':_0x8ae01(0x377),'LVQPz':_0x8ae01(0x259),'aCYWP':_0x8ae01(0x199),'cdrrj':_0x8ae01(0x510),'OCJTJ':'Failed\x20to\x20get\x20app\x20info','zUSpo':_0x8ae01(0x4e9)};try{const {device:_0x58558c,bundleId:_0x30f7f4}=_0x3fe078[_0x8ae01(0x4eb)];if(_0x318e69['WsQUB'](!_0x58558c,!_0x30f7f4)){const _0x1aad26={};return _0x1aad26[_0x8ae01(0x6ed)]=![],_0x1aad26[_0x8ae01(0x5d6)]=_0x318e69['xZOXy'],_0x333847['status'](0x190)[_0x8ae01(0x8bb)](_0x1aad26);}const _0x6fee84=discoveredDevices['find'](_0x244677=>_0x244677[_0x8ae01(0x361)]===_0x58558c);if(!_0x6fee84){const _0x3d3a6a={};return _0x3d3a6a[_0x8ae01(0x6ed)]=![],_0x3d3a6a[_0x8ae01(0x5d6)]=_0x8ae01(0x462),_0x333847['status'](0x194)[_0x8ae01(0x8bb)](_0x3d3a6a);}const {execSync:_0x4389d9}=require('child_process');let _0x2b16b9={};try{if(_0x318e69['Ljfqk'](_0x6fee84[_0x8ae01(0x2fa)],_0x318e69[_0x8ae01(0x48b)])){const _0x4bec12=_0x6fee84[_0x8ae01(0x2a7)]||_0x6fee84[_0x8ae01(0x207)];try{if(_0x318e69[_0x8ae01(0x614)](_0x318e69[_0x8ae01(0x8ac)],_0x318e69['gSIRi'])){const _0x457bee=_0x318e69[_0x8ae01(0x6f2)](_0x4389d9,'adb\x20-s\x20'+_0x4bec12+_0x8ae01(0x2b1)+_0x30f7f4+_0x8ae01(0x6fe),{'encoding':_0x318e69[_0x8ae01(0x4ac)],'timeout':0x2710}),_0x23f625=_0x457bee[_0x8ae01(0x260)](/versionName=([^\s]+)/);_0x23f625&&(_0x2b16b9[_0x8ae01(0x2c8)]=_0x23f625[0x1]);}else{const _0x31d28d=_0x74161f[_0x8ae01(0x260)](/@\s*\((\d+),(\d+)\)\s*(\d+)x(\d+)/);_0x31d28d&&(_0x2f653e['x']=_0x3e2f04(_0x31d28d[0x1]),_0x7d1665['y']=_0x10f673(_0x31d28d[0x2]),_0x4fd046[_0x8ae01(0x286)]=ooLjhQ[_0x8ae01(0x7af)](_0x36b46c,_0x31d28d[0x3]),_0x23fec5[_0x8ae01(0x8d8)]=ooLjhQ['LIOOv'](_0x4123d4,_0x31d28d[0x4]),_0x52ee79[_0x8ae01(0x49d)]='('+_0x480c29['x']+','+_0x490afe['y']+')\x20'+_0x230e59[_0x8ae01(0x286)]+'x'+_0x162fd8[_0x8ae01(0x8d8)]);}}catch(_0x290c57){_0x2b16b9[_0x8ae01(0x2c8)]=_0x8ae01(0x377);}try{const _0xe2bdac=_0x318e69['kgcEQ'](_0x4389d9,_0x8ae01(0x457)+_0x4bec12+_0x8ae01(0x2b1)+_0x30f7f4+_0x8ae01(0x47e),{'encoding':_0x318e69[_0x8ae01(0x4ac)],'timeout':0x2710});_0x2b16b9['name']=_0x30f7f4;}catch(_0x25aa16){_0x2b16b9['name']=_0x30f7f4;}try{if(_0x318e69[_0x8ae01(0x5d9)]('vfQqW',_0x318e69[_0x8ae01(0x491)]))_0x2e4d6e[_0x8ae01(0x5d6)](_0x8ae01(0x4fd)+_0x5d898f[_0x8ae01(0x5d4)]);else{const _0x231fa7={};_0x231fa7[_0x8ae01(0x873)]=_0x318e69['AunGi'],_0x231fa7['timeout']=0x2710;const _0x5942c9=_0x4389d9(_0x8ae01(0x457)+_0x4bec12+'\x20shell\x20pm\x20path\x20'+_0x30f7f4,_0x231fa7);_0x2b16b9[_0x8ae01(0x516)]=_0x5942c9['replace'](_0x318e69['GqbCQ'],'')[_0x8ae01(0x878)]();}}catch(_0x350b2e){_0x318e69[_0x8ae01(0x30b)](_0x318e69['UbzhA'],_0x318e69[_0x8ae01(0x717)])?_0x1a60d3+=_0x8ae01(0x235)+_0x4d5efe+'\x0a':_0x2b16b9['path']='Unknown';}_0x2b16b9['bundleId']=_0x30f7f4,_0x2b16b9[_0x8ae01(0x2fa)]=_0x8ae01(0x420);}else{if(_0x6fee84[_0x8ae01(0x2fa)]===_0x8ae01(0x3e3)){const _0x598733=_0x6fee84[_0x8ae01(0x2a7)];try{const _0x3fb83b=_0x318e69[_0x8ae01(0x6bb)](_0x4389d9,_0x8ae01(0x7fb)+_0x598733+'\x20list\x20--user\x20|\x20grep\x20\x22'+_0x30f7f4+'\x22',{'encoding':_0x318e69[_0x8ae01(0x4ac)],'timeout':0x2710}),_0x15097f=_0x3fb83b[_0x8ae01(0x394)](',')[_0x8ae01(0x2d1)](_0x154571=>_0x154571[_0x8ae01(0x878)]()[_0x8ae01(0x8e7)](/"/g,''));if(_0x318e69[_0x8ae01(0x811)](_0x15097f[_0x8ae01(0x3c8)],0x3))_0x318e69[_0x8ae01(0x337)](_0x318e69['udupR'],_0x318e69[_0x8ae01(0x600)])?(_0x2b16b9['bundleId']=_0x15097f[0x0],_0x2b16b9[_0x8ae01(0x2c8)]=_0x15097f[0x1],_0x2b16b9[_0x8ae01(0x361)]=_0x15097f[0x2]):_0x575bb8=_0x21e23d[_0x8ae01(0x8e1)]['split']('\x0a')['filter'](_0x12c0ef=>_0x12c0ef['trim']())[_0x8ae01(0x3c8)];else{if(_0x318e69[_0x8ae01(0x342)]!==_0x318e69[_0x8ae01(0x31a)])_0x2b16b9[_0x8ae01(0x744)]=_0x30f7f4,_0x2b16b9['name']=_0x30f7f4,_0x2b16b9[_0x8ae01(0x2c8)]=_0x318e69[_0x8ae01(0x1d5)];else{const _0x547002={};return _0x547002[_0x8ae01(0x6ed)]=![],_0x547002[_0x8ae01(0x5d6)]=ooLjhQ[_0x8ae01(0x1ff)],_0x1e73f3[_0x8ae01(0x890)](0x190)['json'](_0x547002);}}}catch(_0x4fff18){if(_0x318e69[_0x8ae01(0x5d9)](_0x318e69[_0x8ae01(0x865)],_0x318e69[_0x8ae01(0x3cc)])){const _0x2fb2d3={};_0x2fb2d3[_0x8ae01(0x6ed)]=![],_0x2fb2d3[_0x8ae01(0x5d6)]=_0x1d394b['message'],_0x230f92[_0x8ae01(0x890)](0x1f4)[_0x8ae01(0x8bb)](_0x2fb2d3);}else _0x2b16b9[_0x8ae01(0x744)]=_0x30f7f4,_0x2b16b9[_0x8ae01(0x361)]=_0x30f7f4,_0x2b16b9['version']=_0x318e69[_0x8ae01(0x1d5)],_0x2b16b9['error']='Could\x20not\x20retrieve\x20detailed\x20info';}_0x2b16b9[_0x8ae01(0x2fa)]=_0x318e69[_0x8ae01(0x830)];}}const _0x198b7f={};_0x198b7f['success']=!![],_0x198b7f[_0x8ae01(0x5e6)]=_0x2b16b9,_0x333847[_0x8ae01(0x8bb)](_0x198b7f);}catch(_0x561f72){const _0x1a0c29={};_0x1a0c29[_0x8ae01(0x744)]=_0x30f7f4,_0x1a0c29['platform']=_0x6fee84[_0x8ae01(0x2fa)],_0x1a0c29['error']=_0x318e69[_0x8ae01(0x4cd)];const _0x27577a={};_0x27577a[_0x8ae01(0x6ed)]=![],_0x27577a['error']=_0x561f72[_0x8ae01(0x5d4)],_0x27577a[_0x8ae01(0x5e6)]=_0x1a0c29,_0x333847[_0x8ae01(0x8bb)](_0x27577a);}}catch(_0x34cc61){if(_0x8ae01(0x4e9)!==_0x318e69[_0x8ae01(0x661)])_0x5ce22d=_0x8ae01(0x3e3);else{const _0x4112ab={};_0x4112ab[_0x8ae01(0x6ed)]=![],_0x4112ab['error']=_0x34cc61['message'],_0x333847['status'](0x1f4)[_0x8ae01(0x8bb)](_0x4112ab);}}});let server;function startServer(_0x177cff={}){const _0x56bac0=_0x28fe54,_0x45d33a={'PtQNe':function(_0x5ebf07,_0x2c843b){return _0x5ebf07(_0x2c843b);},'QAgfU':function(_0x30d05b,_0x717769){return _0x30d05b===_0x717769;},'qIwDN':_0x56bac0(0x244),'WSCDx':'BXSPc','QWdkx':_0x56bac0(0x4f9),'DfNav':function(_0x22f325){return _0x22f325();},'OUWAu':_0x56bac0(0x58c),'tYjXn':function(_0x1cd55a,_0x10aab3){return _0x1cd55a===_0x10aab3;},'yOxvN':'ioAkh','EDowM':function(_0x3a1679,_0x15ce39){return _0x3a1679===_0x15ce39;},'TUiCU':_0x56bac0(0x6eb),'rmkYS':_0x56bac0(0x7ec),'aRQvN':'upgrade','dVIEb':_0x56bac0(0x5d6),'smJSj':function(_0x42cc36,_0x4d729f){return _0x42cc36!==_0x4d729f;}},_0x4be5f0=_0x177cff[_0x56bac0(0x8d0)]||PORT,_0x46a08b=_0x45d33a[_0x56bac0(0x5cd)](_0x177cff[_0x56bac0(0x73d)],![]),_0x35c9f5='https://devicely-ai.vercel.app';return console[_0x56bac0(0x44c)]('Frontend\x20available\x20at:\x20'+_0x35c9f5+'\x0a'),new Promise((_0x7e2af2,_0x113e4c)=>{const _0x3a91a7=_0x56bac0,_0xf641ad={'JkJMZ':function(_0xe304db,_0x13103b){const _0xd322f0=_0x2d26;return _0x45d33a[_0xd322f0(0x209)](_0xe304db,_0x13103b);},'bvScQ':_0x45d33a[_0x3a91a7(0x495)],'BJXiu':function(_0x33b3d5,_0xc921c5){const _0x21b4ac=_0x3a91a7;return _0x45d33a[_0x21b4ac(0x817)](_0x33b3d5,_0xc921c5);},'xctNa':function(_0x3ca9ef,_0x4a00d7){return _0x3ca9ef(_0x4a00d7);},'zJRFg':function(_0x4f2562,_0x2c602b){return _0x4f2562!==_0x2c602b;},'cfPFe':_0x45d33a[_0x3a91a7(0x3a8)],'FJOdD':_0x45d33a[_0x3a91a7(0x638)],'iLsEM':function(_0x1fb6ee){const _0x55cfaa=_0x3a91a7;return _0x45d33a[_0x55cfaa(0x725)](_0x1fb6ee);},'gzSIK':_0x45d33a[_0x3a91a7(0x7fd)],'bPISX':function(_0x47b77c,_0x480258){return _0x45d33a['tYjXn'](_0x47b77c,_0x480258);},'zrvMG':_0x45d33a['yOxvN'],'wxVYY':function(_0x3cebd0,_0x3378e6){const _0x164820=_0x3a91a7;return _0x45d33a[_0x164820(0x362)](_0x3cebd0,_0x3378e6);}};_0x45d33a[_0x3a91a7(0x685)](_0x45d33a['TUiCU'],_0x45d33a['rmkYS'])?(_0x5563dc['error'](_0x3a91a7(0x2ed)+_0x1b8e9d[_0x3a91a7(0x5d4)]),DLSRlk[_0x3a91a7(0x817)](_0x346369,_0xbfa590)):(server=app[_0x3a91a7(0x6d4)](_0x4be5f0,()=>{const _0x69a16d=_0x3a91a7,_0x1452ef={'EpwUe':function(_0x343a01,_0x1c4b99){const _0x1a7893=_0x2d26;return _0xf641ad[_0x1a7893(0x43b)](_0x343a01,_0x1c4b99);},'sfGUI':_0x69a16d(0x1a5),'SOzgg':_0xf641ad[_0x69a16d(0x338)],'DhmOO':_0xf641ad[_0x69a16d(0x77e)],'mAaxu':function(_0x4965a5){return _0xf641ad['iLsEM'](_0x4965a5);}};console[_0x69a16d(0x44c)](_0x69a16d(0x379)+_0x4be5f0),console[_0x69a16d(0x44c)](_0x69a16d(0x72b)),discoverDevices()[_0x69a16d(0x732)](_0x531327=>{const _0x17eec7=_0x69a16d;console[_0x17eec7(0x44c)](_0x17eec7(0x57d)+_0x531327[_0x17eec7(0x3c8)]+_0x17eec7(0x563));if(_0x46a08b){if(_0xf641ad[_0x17eec7(0x2a0)](_0xf641ad['bvScQ'],_0xf641ad[_0x17eec7(0x30a)])){console[_0x17eec7(0x44c)](_0x17eec7(0x877)+_0x35c9f5+_0x17eec7(0x7a8));const _0x7ec327=_0xf641ad['BJXiu'](require,_0x17eec7(0x3b8));_0xf641ad[_0x17eec7(0x8e4)](_0x7ec327,_0x35c9f5)[_0x17eec7(0x291)](_0x307bb=>{const _0x105b60=_0x17eec7;console[_0x105b60(0x44c)]('\x0a📱\x20Please\x20open\x20'+_0x35c9f5+_0x105b60(0x6a6));});}else{const _0x156ffe={};_0x156ffe[_0x17eec7(0x6ed)]=![],_0x156ffe['error']=_0x1924b3[_0x17eec7(0x5d4)],_0x4ab0f9[_0x17eec7(0x890)](0x1f4)[_0x17eec7(0x8bb)](_0x156ffe);}}_0x7e2af2();})[_0x69a16d(0x291)](_0x4395ee=>{const _0x59898a=_0x69a16d;_0x1452ef[_0x59898a(0x385)](_0x1452ef['sfGUI'],_0x1452ef[_0x59898a(0x623)])?(logger[_0x59898a(0x5d6)](_0x1452ef[_0x59898a(0x64f)],_0x4395ee[_0x59898a(0x5d4)]),_0x1452ef[_0x59898a(0x5bd)](_0x7e2af2)):_0xd7be4c+=_0x40dc28[_0x59898a(0x67c)]();});}),server['on'](_0x45d33a['aRQvN'],(_0x243f8b,_0x11a36e,_0x1017b2)=>{const _0x22b37a=_0x3a91a7,_0x5bc168={'sFdZx':function(_0x1c4142,_0x443930){const _0x4a3bfd=_0x2d26;return _0xf641ad[_0x4a3bfd(0x2a0)](_0x1c4142,_0x443930);},'LdKYZ':_0xf641ad[_0x22b37a(0x7fa)],'lBeZB':_0x22b37a(0x40d)};_0xf641ad['bPISX'](_0x22b37a(0x4cc),_0xf641ad[_0x22b37a(0x21d)])?wss['handleUpgrade'](_0x243f8b,_0x11a36e,_0x1017b2,_0x52f4fb=>{const _0x2dd5f4=_0x22b37a;_0x5bc168[_0x2dd5f4(0x335)]('mEvof',_0x5bc168[_0x2dd5f4(0x65e)])?wss['emit'](_0x5bc168[_0x2dd5f4(0x551)],_0x52f4fb,_0x243f8b):_0x17141d[_0x2dd5f4(0x44c)](_0x2dd5f4(0x67b)+_0x82e14d+_0x2dd5f4(0x688)+_0x4d927a[_0x2dd5f4(0x878)]());}):_0x1e8bf3['error'](_0x22b37a(0x1c2)+_0x32cb5d+':\x20'+_0x5aae67[_0x22b37a(0x5d4)]);}),server['on'](_0x45d33a[_0x3a91a7(0x33e)],_0x5a5df3=>{const _0x4a1c4f=_0x3a91a7;_0xf641ad[_0x4a1c4f(0x5ac)](_0x5a5df3[_0x4a1c4f(0x1c0)],_0x4a1c4f(0x5d3))&&(logger['error'](_0x4a1c4f(0x65a)+_0x4be5f0+_0x4a1c4f(0x1be)),logger['error']('\x0aTry\x20one\x20of\x20these\x20solutions:'),logger[_0x4a1c4f(0x5d6)](_0x4a1c4f(0x4cf)+_0x4be5f0+_0x4a1c4f(0x7c8)+_0x4be5f0+'\x20|\x20xargs\x20kill\x20-9'),logger['error'](_0x4a1c4f(0x758)),logger['error'](_0x4a1c4f(0x3d6))),_0xf641ad[_0x4a1c4f(0x7de)](_0x113e4c,_0x5a5df3);}));});}function stopServer(){const _0x18744c=_0x28fe54,_0x4b16f6={};_0x4b16f6[_0x18744c(0x8ef)]=function(_0x6043d6,_0x424b96){return _0x6043d6!==_0x424b96;},_0x4b16f6['dOklv']=_0x18744c(0x3c7);const _0x4aa014=_0x4b16f6;return new Promise(_0x55306f=>{const _0x344d21=_0x18744c;if(server){if(_0x4aa014[_0x344d21(0x8ef)]('ZDkOo',_0x4aa014['dOklv'])){const [_0x373ac5,_0x5b07d8]=_0x93190;if(!_0x262853[_0x373ac5])_0x1d3b23[_0x373ac5]={};_0x44eb2c[_0x373ac5][_0x5b07d8]=_0xeee472;}else server[_0x344d21(0x8cb)](_0x55306f);}else _0x55306f();});}const _0x461733={};_0x461733[_0x28fe54(0x3bc)]=startServer,_0x461733['stopServer']=stopServer,module['exports']=_0x461733;require['main']===module&&startServer()[_0x28fe54(0x291)](_0x474d00=>{const _0x42e3ed=_0x28fe54,_0x274ac6={};_0x274ac6[_0x42e3ed(0x26f)]=_0x42e3ed(0x5d3),_0x274ac6[_0x42e3ed(0x200)]=_0x42e3ed(0x1e2),_0x274ac6[_0x42e3ed(0x210)]=_0x42e3ed(0x76e);const _0x2b93db=_0x274ac6;if(_0x474d00[_0x42e3ed(0x1c0)]===_0x2b93db[_0x42e3ed(0x26f)]){const _0xc9d1e7=_0x2b93db[_0x42e3ed(0x200)][_0x42e3ed(0x394)]('|');let _0x2aed73=0x0;while(!![]){switch(_0xc9d1e7[_0x2aed73++]){case'0':logger['error'](_0x42e3ed(0x3d9));continue;case'1':logger[_0x42e3ed(0x5d6)](_0x42e3ed(0x8a5));continue;case'2':logger[_0x42e3ed(0x5d6)]('\x20\x20\x20\x20\x20Note:\x20Vercel\x20frontend\x20connects\x20to\x20port\x203001\x20by\x20default');continue;case'3':logger['error']('\x20\x202.\x20Use\x20a\x20different\x20port:\x20PORT=3002\x20devicely');continue;case'4':logger['error'](_0x42e3ed(0x619));continue;case'5':logger[_0x42e3ed(0x5d6)](_0x42e3ed(0x73c));continue;}break;}}else console['error'](_0x2b93db[_0x42e3ed(0x210)],_0x474d00['message']);process[_0x42e3ed(0x4c3)](0x1);});