devicely 2.0.12 → 2.1.0

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 (40) hide show
  1. package/bin/devicely.js +1 -1
  2. package/lib/.env.example +20 -0
  3. package/lib/androidDeviceDetection.js +1 -1
  4. package/lib/appMappings.js +1 -1
  5. package/lib/deviceDetection.js +1 -1
  6. package/lib/devices.js +1 -1
  7. package/lib/doctor.js +1 -1
  8. package/lib/executor.js +1 -1
  9. package/lib/frontend/static/js/main.96600727.js +3 -1
  10. package/lib/logger.js +1 -1
  11. package/lib/server.js +1 -1
  12. package/package.json +7 -2
  13. package/scripts/shell/android_device_control.enc +1 -0
  14. package/scripts/shell/connect_android_usb_multi_final.enc +1 -0
  15. package/scripts/shell/connect_android_wireless.enc +1 -0
  16. package/scripts/shell/connect_android_wireless_multi_final.enc +1 -0
  17. package/scripts/shell/connect_ios_usb_multi_final.enc +1 -0
  18. package/scripts/shell/connect_ios_wireless_multi_final.enc +1 -0
  19. package/scripts/shell/ios_device_control.enc +1 -0
  20. package/config/apps_presets.conf +0 -271
  21. package/config/devices.conf +0 -24
  22. package/scripts/shell/android_device_control.sh +0 -67
  23. package/scripts/shell/connect_android_usb_multi_final.sh +0 -67
  24. package/scripts/shell/connect_android_wireless.sh +0 -67
  25. package/scripts/shell/connect_android_wireless_multi_final.sh +0 -67
  26. package/scripts/shell/connect_ios_usb_multi_final.sh +0 -67
  27. package/scripts/shell/connect_ios_wireless_multi_final.sh +0 -67
  28. package/scripts/shell/create_production_scripts.sh +0 -67
  29. package/scripts/shell/install_uiautomator2.sh +0 -67
  30. package/scripts/shell/ios_device_control.sh +0 -67
  31. package/scripts/shell/organize_project.sh +0 -67
  32. package/scripts/shell/pre-publish-check.sh +0 -67
  33. package/scripts/shell/publish-to-npm.sh +0 -67
  34. package/scripts/shell/publish.sh +0 -67
  35. package/scripts/shell/setup.sh +0 -67
  36. package/scripts/shell/start.sh +0 -67
  37. package/scripts/shell/sync-to-npm-package-final.sh +0 -67
  38. package/scripts/shell/sync-to-npm-package.sh +0 -67
  39. package/scripts/shell/test-local-package.sh +0 -67
  40. package/scripts/shell/verify-shell-protection.sh +0 -67
@@ -1,67 +0,0 @@
1
- #!/bin/bash
2
- # Protected Shell Script - Devicely
3
- # This script is encrypted for code protection
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- NODE_BIN="node"
7
-
8
- # Check if node is available
9
- if ! command -v node &> /dev/null; then
10
- echo "Error: Node.js is required to run Devicely"
11
- exit 1
12
- fi
13
-
14
- # Decrypt and execute
15
- $NODE_BIN -e "
16
- const crypto = require('crypto');
17
- const pkg = require('$SCRIPT_DIR/../../package.json');
18
-
19
- function generateKey() {
20
- return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
21
- }
22
-
23
- function decrypt(iv, content) {
24
- const key = generateKey();
25
- const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
26
- let decrypted = decipher.update(content, 'hex', 'utf8');
27
- decrypted += decipher.final('utf8');
28
- return decrypted;
29
- }
30
-
31
- const encrypted = {
32
- iv: 'fd2dd73e88349e4855d959cd56f6736d',
33
- content: 'af4c6931102efa313fe505d660a0c3c07d3fddc9aff2d1901536418cc62b0dac433d376f9face7d248ca647246a432259cea25b062ac21637f253d0b66df8290d63460210f2da8e9d1c374bf9b1dc65ea39c0cfe9fdbcbec8859fe23562aa1de876bc9ed0e37b10f30d263ee0e4319fa791a0e53abe994870dd24b5f9e3d692e891ed7c009c0c6c3b0149d76eb688126c7489ffe2b4c49b61eb6edf7d63f07f972acb23feb4dc715baa110a19c451502909d31d913aea4addb6e2b896c8d1a32ea968de08ebf6b2ec38d9f5e9b565bc4bdfd6f2105f3a5cbaa2e9e58cfd2770a44855cc2a410d7dc19005fa5d47399b56d08b3cc900ff23167e38fcc0253f404bb5f3e15dac6534e6aef0eb18cec580d9ca5da4fa0156739cb686fa35cf8540517117ca5905e3c324e593104ab3e4a70e43914ebaae3da8adc7edf60ea25956b1af0c1a4dd4c66480436aba26838b5dd5afe1640d9c80d2cbb52ad3ab6e23c66e47c149e7abe077c46ba25e4a42caaa746a997b5b6dc2eb61d0b045e6afc89cfb98ea4de8abfec31bdc28059faa7b586b867b7a31698ce7c12181ffdde0d0392b03b4b94438e042855fa2d5a7e0ecc37c99eed1d5cfa6cf892264f9a5a43efe05e5b1920f31b9d51159c155699cdb015d72295fc33676e8ba460987a3105e0dae724d7cdfca314766a3295ee194dea92104b7c20fc7f04268cb7573e45abc2024b81c33c99413040e7f14e9c3340028b9698b0db768622646c666b493a7b43e3d851bc02a735bc2ebdbc2e31018b22c39c5c02e2d1511896b324957baac013ff11de960d4f115c3e14ead2a2641acd41094dddb72c8c3dffbcfa712f868e664525d10668153b8b07dc8d7e5b409e29493855e4dc711f7bfc710e8367f6be0d37d393d9e5ba362aab3cb0c491f8d30b0f8dcf8e771aad5b96af8a69946a008bc91feba85dc57284672410c279616f50a70b2a3e88675edc58024fd31959d5a044e654513c9bd333a121c5992ba3a7bdba6d0d51ff2b9c56f1e7a07245a5563d3ef336aaaaa06fc233f203e2c66a58fe073fa3e32c29fffd82b63721ba35adb6df6d1931d2a4f8ab7dd67a1e8da3b9ef9a2447824d815e5ee901203ded849565c5299a9a7a15316cd41f162761247b383f8059f338fc30fe5a2f652f5427c749d6b0c8453ce0631154ef4f87fe272bc98f6960618c75c02d09e871dea447fe257d7eefffcc716b3db89ede645addb2d0eb95c0f94f829e0df8d74672634878901d6b40acd942bf07e9b5d484835f70fa12714343b2d35806d6ae0faad80dec743491de3ff382d7d2ecb0aa3395456f942bbe3d435f2f449531eb57961935252c047404c6751c1470f4fe886a7ca6191433226e887bd178f8f7df1daec56c3af8cafe745b9666393cf7770f8099fcc97b7c0f41d74fb7c364527e13117dc9e26d45016455cb5a933a3c823f50f80b610d925d0f5d599f0032c27ec8b2057080ba04e3ef197092285a51d29466cd7a304fc53144f21e6870a44f5301e3caed0554f6346d089672503513246d090a6aa2b31e682f1a3c5a9fd77bea27274efe4346975286e7fd288535c9cc1123fabef8b4b361860bec35c728e647e6294dad6094bb238924880682779c7b452f364ae271f4455f84864a70a1e0cbf79ac2197e6ebb263450958fc923aa0a654b39102d70e226dc8882e77b65362d93955e67f1442ca84ce89a6cba323ed9db203b5a5ab94bb1b0a4e0a5e5efa2a014395a7bd3cbd894fb2f9c8b670f4037c9ce377d2c80bbeb90ab3511739ea9070c409cb424db8738d5030db81334726de234952cdd3fccd71c0406f88ad1b9cdd93490aa81d488d99db1de8aa1515f8673cd0cd95220deb26a1cbbab5ac1b6441594540b4b87177de48c7a3bc980ab18ce6f7478e92a5d2084b79190c145dd5561b9ecfe72b0318da3dea5a4f5ff67d7c0436346044c4b97f51a2d5cc14baa6cc147b36c65d600ab7a513b160e82bf64010e2f207fa9c42ed4cdcd9dd4a740eb168a2fa5c33da0e23ef9778bc2d615f0ff633d2e3e47fafe68c92f92958c9485d2fcc3bbced68e8837621f9f22e34af19f78c8a84ca13d45d6d4c7726f1e3807fb211d29ddb0b5e58cfb3e0b7f7a7d915234f48a9a7ec0b9e14d84dd6bd866d4856da966582fcb'
34
- };
35
-
36
- const script = decrypt(encrypted.iv, encrypted.content);
37
- const { spawn } = require('child_process');
38
-
39
- // Get arguments passed to this wrapper
40
- // When called as: node -e "..." -- arg1 arg2
41
- // process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
42
- // So we need slice(1) not slice(2)
43
- const args = process.argv.slice(1);
44
-
45
- // Create a temporary file for the decrypted script
46
- const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
47
- require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
48
-
49
- // Execute the decrypted script with arguments using spawn
50
- const child = spawn(tmpScript, args, {
51
- stdio: 'inherit',
52
- env: process.env
53
- });
54
-
55
- child.on('exit', (code) => {
56
- // Clean up temp file
57
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
58
- process.exit(code || 0);
59
- });
60
-
61
- child.on('error', (error) => {
62
- // Clean up temp file on error
63
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
64
- console.error('Error executing script:', error);
65
- process.exit(1);
66
- });
67
- "
@@ -1,67 +0,0 @@
1
- #!/bin/bash
2
- # Protected Shell Script - Devicely
3
- # This script is encrypted for code protection
4
-
5
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
- NODE_BIN="node"
7
-
8
- # Check if node is available
9
- if ! command -v node &> /dev/null; then
10
- echo "Error: Node.js is required to run Devicely"
11
- exit 1
12
- fi
13
-
14
- # Decrypt and execute
15
- $NODE_BIN -e "
16
- const crypto = require('crypto');
17
- const pkg = require('$SCRIPT_DIR/../../package.json');
18
-
19
- function generateKey() {
20
- return crypto.createHash('sha256').update(pkg.name + pkg.version).digest();
21
- }
22
-
23
- function decrypt(iv, content) {
24
- const key = generateKey();
25
- const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'hex'));
26
- let decrypted = decipher.update(content, 'hex', 'utf8');
27
- decrypted += decipher.final('utf8');
28
- return decrypted;
29
- }
30
-
31
- const encrypted = {
32
- iv: 'f6735ea5ac23b94056ab77427f0152bb',
33
- content: '9893360a3bbfceb469c57184631c4123389320105c9f38e9cf3c9a48ff388a7292163b1654357e760d61bbdc7ddc5a5143ef215e33c3b79ff58c67fdf21c60a49893f3690a6aa44e089d954c14a04f8bde16a58c019a69704da41d904fc985cfabc4c8e3ae285a722961b4f01f31ac407261941dbb47808327f4cc0212a598fcab83fa13f462f2707ab17df371b0a9f988fdb5b0e4efa361e8f79bc7152d79951bd31918b1f200b311dfd9408c3d8b2989811a1739a1f44912799eabecf5c4f7cabc7395871e615a3d7277ae00e1a5269c9aecc2b80a8b5deb3f1bf2088eb4b6afa831702e86e3ef0d9e505a3f870bc144c043d8fec683482edf93d0ad7dac0d6c73046a4bf74534c9b590f67bac5f855344fbd5f951ac9ca6a0bc3b4d22d1af4fe8c3be2b43676d148f132f8b431c6196ef67a5cb64d32e44129e73359cfa2735aba12c109bf264c2d02a1dc9c23ef0d1e55fcbc39413fe24023f2fec8ac4fe313c1cfeafaabbdfebffb92cc45c341137a63af979db3161c8c52192ecd377192785616ed54ef53d3aa19cda440acc03e2fb2d77f6b4fbc746cdea273398a6dbd2061a11201ba551d6aec5ebb461f8cc26ec93de3b34cea7135cba70452c2e6c38d6f9947fa27b5f0546c7ea776b17c0da8d24e896070fccbf7bdf692f749a20e7d1fd13797c4b584d293297bd0df0e7f219277e720b4fe2355f3134312f480d65f84184b79027be7e506aa92402475bbed0785a3d29f0e4db8cdee17b83e7937f3589728651c76949c1cc4ab05d49d06d7317560380a349265d0c8d96e2639bbd74de6d01e21e79da932f34cf8d2d3f5cbd14ae43136f719521bacdd11c08fc1b6a0b5a14ec39bba8bd06a98b5f6b54b08e69d010cf987c03bda205088cf83021bb1be8caddd992e00182862341d29e8ecdd8b24217ef0fe30c9212f3abdbb911a20a4fb5739aaef3872036d02884526aeb66e98a9f23dfab5d9d7a0e1a40d6dec65cb01244b194afff773b71b49f744e0c170608ff08961c648674d63fc4aabf168d2779d795971be082a5337cd13542668a922335a46f70305a97cccddc7732db3588d3c74722e2b1cb3fe151089b8b8eded492673464f2c81d2d8df88a539aa070afd1edc10cb34003157d98b216096bc5021e6ae242c799977f7efcb4e01c78727f34553834fea66eb270ec6d26b3d1d309831892ba8642769c33e5408643bcdbc6140d6e6fae46058cdbc333c3e60be149e26050655ffc6f611499bbb15a882966b2e29e257be0d41ef490dc2f9e0bd17c97f4da93eaedc3adbf4203a9502a15300da1bd4cfac24ada244596048848d28a4c720a1e92856cecfe1143096a19241181f9baaa5cef8c04305d0b8117112f6c5705bf28c298e07fc3dc6d9ea765f1736db9f8de8e9adf4e9fb537ded895e6e567aaa1f34487770ab7c1c16b30fc30d56a71593b03c314ce511ca6d5d603a9506e62ca859ff944edd3670bdee4e40cc85e27dd94807dc3d7ad0c5b070da9bf875b914c5147d9000d6a6ff72ff24ce2e1bd3db9d055067caacb847319b4187dfed47b4825ee119147a55c47341f9ba5fada4d1f4117a8d61a59da66090aca9abf24f6e2be6d913c4c7bc2ff989f797b8d612b98708c18bbaeb26402df0123709d22acb626212a2e78e4af5423974700dcd952315d085a0a839775d50b038682bf2360f44449309c9bd395cd742e616b2d8ddb86cb88a18b047f23e0a28395e9218c79e3e7e49a0985753a3f105ec55ac5ff73310e63a362c520a75ad2dccf9cf9522706c68979151112a35713121f6dff7850a47f16f18f8eca6c12923a2fd11040aa12b5cda51931a4072f529c4e700d59b6785505406ddd758b717bd4ca26f1016a75b14f1147095987e00317bb4b6713b1cde3bea1a439310148f4bd4ddeff1d9c802619b2104d92b66bf9a0d14c158bcb2057d327898d5b1546572a2546f240a42c73c56972eebbaae0db9aae27e97d667c5f9929db0d4a15c2bb79c3d36275ad65043b1d5196953db2cf0467ea494d79c13440f873c65ca4e65d8aa3366dee26f7216f81b43f12d1783fef4a9a07862ef51e809314ecb1433d2e943f10bce0c791a11126a241f050eeb8224c2f28eb49406776f8ac6f33fb5fc774d89f0bced1db798715f336827392f8125a3785b4c9a837fbd05b8721975750a3178f934bd1ed1d44220bfdfc0813d2e20fa682b09516a904e9830f48454cc87b73a2dfdbaa335c07e267eee3f9f9acc2300c4d585109896932631cf8eeaaad905dd4ac95c4258e7b20b61e26dbbc621d3a06e21cf1e8dd9364fdd7d218d609c68efcdfe70cb8678e60ebd4ed054f35b7fa9ff4256728ed5041e265109adfd7a235b53b0777982a292876d60783c1336d0ab5ac1b5b454018cbce36ffeb78dd51cd46a8154847dd3238ebd50b5cbc684db8e39be33105379f910e693cb123e4faf7875c631f6e1b0ddac49e13674d9bd41d86b06d465d6c0a12f577955a44efd7458cde761d22e1584769058272f17847e6169318f2b5eb4f6c344ba37954b777427acca7e9e98597777f8658f066a10663486a59b1b22dd6658a8638827a690c93f8dd1bcf7e11c6b7ce71be85fc2087ea35d02b13b1bf8607b76b8a11167dcded119688e991748eacef28d7854b473b3aef98c365ffe86475e3992bc1c0ca2e4e2f3443a47466f7a90eca438e086098452ce55ac7f20bfc146de6c2396e4209bb2bfc1e8c8d3c9f77cd5d08380460dab84660abca64c23251f2d45014a7a3bb27c740d3fea08ec4a605b170aa22cb9f55fadfd45d06f72031e485d75f2da376ac50c9806f14ab5bfc77a53920c6f4b0828932a0081fa1fd9e219baee940e660c1e0fb1e2be822e68b79d07dbddb0cb699a6b3d9ca09f05c34909531701d60ba2261c53c4a58d55178d41aa30f5bb2374cd11ab136ea09cf378c3a4359c700aaae597810f8e43469357bd7731e73db66e214fb8d68bb3167521a12eecfb09bc2fde5ce4872ec545a1274294812ef5b2f2da9da4d97dff607b0f5429d667493b7c0c06c0b360cda647f2a74bcf694e88a088bab31430be0ebbc7ca9bd58440858b2570c80026fc4701b0579c1744c7a60d856d153184d72adbd85eee29b90c3548b9d3831273eec8182371cfcaf36889576350470b61a95f059277bdeda51a7cfb9abf638525cddc748be3537d0a047326cf1bcf8d88f100243cda76776963431cab0999a65bbd00b4a362ac485775b2b72cbe72b2f3181d48047cfb54c8b22bc75f793614471bb31ac71dde7600c33dd0fce01b301e3719a46025dd114f48718e0abfcddbb2c6b1b694c2af9e4f2fe9d366953d1133c8a9918248be93d3ebb0bffd874999adc838c5cc3b4184c1a0451f4b12b0b2d116a19a9088cec4dc4964f055050bf1c0b26001f210fe5e0e7924413743d128973b0f9286abce7a744643f683eb518fa770b6b25404db383b48eabbe6ebc83de41d7862da58149e036a398de113a95eef097e40450c07afbc7754a0db68f4186ac424dd350de27a35fa407d8008380ed90220f6bc5c6e18872b08bd37506a76c0cf0b8e4024f9289e02faecf1fa11bc57a99852b75f388d72a6d49506c46579f30fe16523d023e3133a36e542e1831ac45064c129ddf8bff9635d379cdb7b59ed0031a12a3ab87ea10bd66b6f1ec709a01af7f563d7656420596f2873b1ef7f729121a5fd47a74d728f10f512568bfd0dd3553ea08824280d6ca641f05d584d9e7becf1979b8a94fa88016906666571d0875b8982b7125b61ce3167a4af97a27b6306f8e4b26fc3384f21acb3babf47f695ffeab0b997b95cf38e4f83b30f32f6927dcf8af1990264c18991130bd89bef45d71a2483c8e4b884e9fea32d32d52da09c2f54709403123b1878599af046cf472c177fe0d3c91487bcda56fa4f145ed28083f2c1c4ed41e3c31da93afc19cf4f550e4b2b6f069220610512fc7c1328c294579ae23e742e27f03c29f876ee7d090df2c88c3bb62939340b20410a6343afa1b6f94a8607ecd3abb4f15702255f545c6973e35ba438e7a1ff67087e4509481182e731fefc03940f8c70276ef4cb98f4500ef21d3dece00aeab873637ece586a9b54d6a637b1afc672dac3c1bcd1b59b4cf5d417b95f1ec2e28f6bfcae882ecb27602ca645265f96d8bab65d1ae75eda8ae7a8996bc19186c3aeffb39742ea37fc96594e8d415ce5c071da6a35e311e725a9a77470696d66edceb1dacbe0ed5ea929c296407cc1d915184a08c5ae4a4a4a2244d10c1e3a46b2a5f4575fe34f0a0dbf3db5baf47197af8a493dcc6238eb23fbe3d8078b6369a765b805c33a4a543fa0e89a6dc91404b804e4c0d84c2c48015bfac9c3f1b4f5147b6a7e259f162ee30d2d8e1ddc842271448cb79969ecb6bc50e45659c33b20c2a6daa184c647a8e8a3a1544832a3b3ac05020f73e750e7769d3777936c57014236bde9bbff7014147667b12f82ac4dd8c8cc60b56f72e58ce9d65249683295feceedc22edcc5291e7a8703a881782f2c823b8fd6b0b02c8d7968b09a31ead4fe5c4a1811ca6a169b1496e66b78db7281612338ccf55554e8ace9a71a11899ffb3c382fd7dcf6d0c9129a72cb0a2a93d1dee641dcc84aff99d13fb2164daac891a7d679bde34accdf8bc92869990dd2b56780632cb91d6a8a6d4cca3aae1cf90ffe80ffa0edc17d2b918e1ffea7b1e7496b84e186a415b1b76199e84316665b5d2015a3da0c8d22895b5cede345c3505a37ded398bd3c57cdda657c8c1694cf44cc2d4aad512a0953936c5822289e0c38028a2ecf5d17c3e3ac20d5e7fe87f7389b66193126c9ec5139434d5cd6f55a60940b50f37a7d108fb4a472f722feff1b2eba6da0b3e23f6f3c0ef8758030ec8baa5857541f51aa73c03fc4e8c3e06692bb41a2938f8141fe2ba024a540b22872b13ab6bb32b51a02421ffc000f3815a12490a1fc2b9703a5f67af4cd7bee1a66263f056b89518861799d7a039d77aa9c89de07b9e12f7db26befea0726dacb08f70566c1d2f889f631d8a91a5a151082c74a1aa24b305c8f976f9eba702e6f2a8236d2e609ac2c1069a83cfb53e6cab01148a6d709621ef62cfd355fcca5eee12441bc905224820219de750bfd6ef23d95172c454e5b1b65d07ef5c6842d9d235e818174f5c3cf7d65aaedb79bc1ad0710b2a6cadbcae73704ecb4d3c0cdaa6f8ad89b0ee6b898d203cf179495e79e42d028de7e421324f5eca6684126f894c6d20ce2d4fd3d2040a75fd54d972bda523c4bf0cef72704f8cb03eada726eddfc457be46cb01cc2161344acc9d0ed5b4e5ff60f4dd10fa4d1f7988594bd9d902b1901b8a41d1dc93f1f58e5ed8638f8e0a610317ff7eb05ca60d407ecbf581a8b23a20bfb0283d095889d20fcf71a242056dbf2482ac6cf75b514ad975c6d3aee6a3e7fed8739cbc605054aab548a88122fd9bd1fdfd8c57a08267aece15d0aea8e7a81c2cbfa9fa69118cf5b94791970a4146fed03df0d1ed54256c53ef072cd1067e41439c5e74d16aca0111256ea186c1330f74aca9513c5afdb3d8241c615ff25bfc36faf9ef3876facddd1504b021284939b9d5c1e7128411388c9d79eaff5d605e306b189afb9a983951606a66a78878582313a06c8b04829e9aadb479cc6714b35326ccaf8d2a7099d9a98170430a366850f55bbe8d097e0131779e4e5f2b45e194c8a98fb55b455b60bfb5c25e1cdfd08c26dcbfa23b25d6823280e5975c12c85fa2935e1e40f644bb4274e3aa0a75bcc3b447517679237c5e0c18684de1b31f624b789f840c51e17b9f128b72063ad8c93116428642b7af1e24330c5a02b857602d46a71ac7e8fb5239e0197b3544bb433d9114c04a36b839ca27205919b239e81ea4cc553cbffd3e8ca07b9ef743043c3bbbcf6d6647d9d91eb9dfa79d8f188196961a16b88ebf71f5c5b6b5bace958f8f7941e2991330f8cfcfbd8fb0ba64487330289e61d4ec400c8e166958a17a230b6de931a3044a57e2b36d84dbd01ae9e855a99477857098b7952508ab761f1018bcfadd47e00d0dc6c9e9a7cbafb1589c357d914e9ea7a9a2827199025513afde0db2d33b3e330e46fb319c1f4069b1054b2126b2cf32209f00f5ee1a0706d1f38484d035e6261b646f576e446822db3a69b5a1390a4dec6ce0ac7af6204eb3c5db7fde2f4eb16bc317d5e5c2c77cbdeacdec8faa9732973d1bb6726a14e735c3b1547ed5778ba11ddc05df4a414e4be3b9c3337829dcdbd4372f7bf532ea518bac13c0bb08e28cb14079d5d881ec5ca11cb2d08818dc0f748a01c442814acd7ada1e8f96823fb5f543d18b306ad4b6f402cf77d75a082aa378089c2c721b68bde82b80ca2c3c3752d29633c264ab48b73f1010759acb93ab7a15fb0773d5b9e1d59b52dc32e25fe856010ddf2b8515a0bf180c274ffc694b617f7d1d0d1770af8420d067788b2810cdee0202dc31860778dc65fbe010956089738ff376374bfae8282ce724ba61c79847a71590c1e050fb0f0559fa78cd22de61dfbc5923bb6aae7680dd1278b4dffad97984b71da713b11e7d3b14b4b23ca9c937ac89b1e15e39dfde29e2bc211e8591b97cace1ac32b065f39d8ad83e98d1ae960457c13ab01e06463c39c174d9aafd8cbc5396c156bc839cf5691c2778f348e10e39e3789530d6b0895adf2073743aca84dcccb30bd5e33a67ca3e8797e061a679fd08636d3722457e492a3521e0391d406b1d95abf68c8290327d8a0a80d8b58c472dcd610377df669e16653a8280dea868bb27bfd1d0ca04af11f0b5981823d451b0b03400d941720ac8d1b56d149fe4a2034242630eac3680464a37a003402accc09dcbecb847f531cbd46c2cc039e7aaa56b006c6a154f9412ff30bf5243fb97f9796edb23569bec69484ad0b7638d94c6d28aa5f0a4cb5083abd799d2881092ce508eeb281e9771d6778cf097365660b1049244357a998e6246c99bc9872e0687fbf827b43b0b75dce459d6579702dac721c7d26bc72c24deeadb8a5456cc68bbfee8d7784bb345177b44c9d2b9e318c8390aaa5003fcb4ca46cb4e6444c0e0d059d0a1a5f8426a380f32d65db91b54f37e6f7e2addbe2226227dea0e7fc6affdbd7e419901b3c00c9203d418f408011e81f7d0d83a68aab027576e44acdbca4c559d5f4948667a0419378924e4dcf255a631e23a986c0a8ab7a6261440acf4960bc7c424cac299e9c402b392da6f2c9d3faa926e5e7a1c42cb2dd6ae549ee8d9bebd8d6d8f567ad6482e09ca30c912122c7011f69044740ea217fe1944a6742efc0956c2c450d99596bd41baa279563b84438a496336dd05e9079b07398b0ce0274285402afb00c291f9226493d71d7e67a14903ccea02606394d6ddf6c5f23cd7b6d98776c2448f6db3d863657889b7479874d636398c9e60554323e8d2d0bd0acee4c175e9dd768e7437a02406c7754c772b49e6e9f5c0f7c6695c22f18dc4fde31b8b37a50c1613570a60ae93467ebe3e454dfae2f2ea892d7c25295dae6be48d69815b8c7f227fac5196eb806dd557e1b29b60fbc866991e2acfe17590e27ee04f29585fe19df0dde2b0adc6238021682992bde947052e6927f9b710aece38b8a7cb6e49f3f353039674821f437695590651608acae371c79d251f580909761a6c9d1e41f855cf996bc30f181ac96ed551f357c18e9c87ffd99fb3dd51513d109af5c534ddc5dbaf4bde6f4df2e79b6bad015749d95260b5603f8a5d71241a0943edaa3d01b4b82098c9484ab92b99aebf1a67a42ac14388856b3ef0a55cc212d5e45407ac8ca64db9b0c4aa3998cbe9021db8e024aaedfc6fe3aeeb13b0290203bbafd8a0e172151419d8618ee7e288eb15326b49a0569c1200796f6b031a0ea778bc310b4c2b0b8c51dd0fde432effdcf205aff4bc09dd71b3a5baaebf67f3270da3d282ed2c69589a39ff9f1abd04e1873ea057bad7232d0d13329d1c1429a1bcbbc54081390e4b9fcea7f5e1ea9ebcfa6596f2e3ea30ead105b12b345c835709fdceef7c7bc9a80e7aaf54f2d7af6e4ed95fb7aabd757208be7d432eb2386d0f88821c9c788c46c7108996ef545cdddfadf4f363e4de987451c3a529aa1738d2ea7be50e5b7945525f1802b077b3e72fec033a60cb07b1df4d3e19f788932bea40c4a3982c2ff469aacd176f55a6f556f088ff6db47c46492c6096dc9adeb071ab57f703ba2970e2658140abb9e93a1ce860b2a86e90e90b54f948cb9b8b67c5913b2992ff5d94700358531fdf1689715823fb167bb2916ba4e6dedfaee137a9c11348fd32d2e5763e92ad6393bfeefb1f89aa2b6c5061e299f924bb4fc4ea498899c231734c548273e4d00cb27bf1d9930fbd90044e2a2c183b06b011486b415171c97b4dfb16e955c740487698ef22cda02492d4396b55dbec416e4a14ce91eefe089b2f7bfaf17cc78910c62929e49d2c7342463de051b586c3114cc93261084b6d72e1af16650719436714aa47bc72a0fb16445fcea42829d2e2c9583279e2186b9004e7380d6ac8ab989751db52d7ef87fba3ad72e7ef4237845aacb0b2718ff43a8ec41c6ad80bb1bad629a5a382ddfb358de7a21dff03c933236a59d8b12b49b63f864b7bd7edc973521be33f596f432cfce68cc6984265db679a85f952a7df552fd847c866adcd5eb6051a6f8179e33f9d0456091ac72f96cf49bdfd2b989934c679bbb02894ca35f1f673506f027452a681b6b64f6559bb00b161844885e873aae8bde50fa071dc2633337cab6b6392d22bf6ffd71fcd8f4be19194d425c7693b7f3a4007b9f41b28d817e8d1c166b6054fe431784f89e0d6ca63e86053d50d64a3dc39dff01682ad63178a3ffa3d54c10e79f4b1e39b1b604d93ccb98e28638c3e832ed4f158f3ae5fe6840278024c71f4e13dfe7e13521e7de18292fefd59abcd2c0b39844b834d6b8a993b2f7965bfbf5cbbf87db7d6fc4f8f3773f85ff3f38351ba6c2517bbda571cbb49f6ed60356ab9270c701157f8f85bffce7b767cf789f35940a0c8934c8738fd83dd74bdf1d0e6f831691c8b268a35e3b887930617b576e8d9109b803ea5a6191c8f00dbc8619bc663f286a071cfe942c9d84c8cccf176532424a16e2dc61ea045d793057ee93ea68742af3505756e9281ea02b8cd0ab173d95146a51368639276ddb6ea07d8a679922f249e4aa0d11f2600220e4d9d6f95c5407def6a425b7443df975524e4e54c99cf7e21935cac78f49343500a42065712a80fe8a31ba7d81ce7cfd2eb3058d4668d2bdd7291b714fbf9ad1fbcf5703b65480d4ad5fdaea02e24eab8d5fd301d26eb9247907afba64f4b3b7ab68f0a3bf96c98a3b89bca0e7fbca65bc18dbbdaaeaf2c07b5da30f65e4b459d82305bd18dd44d3e9385812eed9be37bf0536174670d21853367613cb90840e19abc9d1fe10500bad414dcc2c411926b446f7c57766f72f0308baf6bb3e40f7310bc262e5584c9567cc9f8ca26d01576db20fe326459554490e0d3f26ad703b764df749030116cca982a0e29230eda9c8b15b703882471830ba3fee8ff2cc24e2f9354a8d3faa53ff2881f65d237bc5b346402f5464c621c073bc0e17d3c65d9e662369742786c4774f9a4c235d089f877e9889a880e86ccac95054af9da9e4123665891ffcbd6e7ffd9b23b9d1c0d53eccc6ddc8a0c4aca0c2ea8ba3ff9ca1a751ed10fc6b0db0d9a239d8ff2d50cf8c8f9d0f28991e5a35c67b2d58455edc9e38b0075bb3f62e3850682aaee36f9f413bd8bac35077bdfad6fcbdc11bc11291d0b8481fd4ebba94451b901c9ed7c9aad1e1edfac3e4333f0abfd7cfcf9fec66765ad3f964b7bb22892c9ebcc8d8d52460b291c77c3d0c4fa02acd1c007c5b52f68998470381fa6297bb98b641b69972b8e7b0211034d8be7109e0bcb8d352cd74d5c798d4dec888df399c63308d25024a39f40c92bec92f1a41702490844964aa32e899e353921365ed7b9f687045f085ab122e9536e0e12c50bb1a958bc1000e440e37f8bc51eccffd43fb89c6fcf7232c0a4b523795343d13b2f9083c5f15d853d2b9bc2385f72737b7a53660d832e5ea038c37022b32dc4cea03329be258c2d0b56b7b87d14c2a712b4987a8c10039bd3ab1a514687894e34dc22279b5d05c4117ea3c0f61ee4e0206863faa5e5fff09edc8894158089570da67a5329de71cd8851248ff99204e0fcc493083b181e2e526db41d0a02022cff67b9027ae9b41b77d81238e50de8fc13e837705cc4be372327b5cec63d25230248f35053c3ee7c087db8e3e4b0859e9cbe3326da34a9c7e42252860cd4a746c9cfdcd8ab3d19e29040b891f13bdec953e1d21171d6b5f1d24ffedd41c0fba9518ef5f8339ad96cadf525b433d742ba928c34469d409909813ba53d98f29a9e29bd3fc0dad29da06c8c37914870bcae6fbbbd44ad273d46147ce06a8b9c6814b1b7d455fddfcb7abb8abbcf6c9b6006c67b86d42169dd36a43c459f4bb23fd8db510f8d09286638bf2a42ae26621ab0a1dd1515bbb224482849b3506f232890805680676f6ac7e1c4d9bdb5552554a222352b55ebbc2463266b4a35ef36d466fd11c6e620c07a3004329efe240a1f0c8f107b3b78b263e84c6a5ba12440f7aaebe8100322467dab423e08a0e9f841f3345c0cf8214843a2beccdaf4eb461c3da3dc8aec36cf4096c6895456d5ebb1a9f70a9bf817a403534b83c065dd59c48f344d542cb34b9f407c098ad4df0b8a79f2daefa36f317517fb540d4792f582fcf4da8566dd14e006af89883df03103198f81a55d85d185a90fbd9175c72c9a61b77ce01ec3155ec979a397fc61caeb1edf94c81df3f927579d09216670f1f57cbd5cc9da0ae44c87b178991ad4fa88c4052321adfab96863091ccea36557d9d7c27a168107bfaa4123cf52713286a117804de8c78cd168e128979cc1599ad0827c9039b867541bb3c6bb0ef924bbaa1df51a7bfaf8653301c7dfa9017048b6c422cb03c1c1610b516768d88e2896c1563dc8171b6c82be0c7d9998e9ed5ffd4a440e4928151a26e7cad4866a297740c544d67f9635ff033f3c257bd2999aa312c4510ad5952a05377910d5022e865d42565f89b5bf02031484d771f89989bfdb9ed12b63bdff1b7f6388be653fbfd18d99c8b27632c7ab92ca4c50ca3cc618e76b4f2d71aab38992ec599db225628894c38f6d221bbb19ad6d964cb00c39fdf4dc1ca9657b6d70b3785a742fe202c7b3cca84daa0659429f4582bdf166bcdf6c73a7e90bc5086fad0ac88721c9140af7eca1eca645328c2af7ed0a6d24aa7cf8f1bd83a6d77a0b615678a8c1c94684c8d6af7978106ae9fdc74c6c6d8b19c1978153beec7e9bc94fad19a87356c9b5531328c038572443070b91700774d7158f7937142a8f2b07090b95bb0749543aaab61abe70e53acad71adcda2753d68fc82defe8a15971eda3b41b8979b34ef88a884feb8f549d1c7030ec7eb91547a9dc9ee71fa023d94cb048a913e68ff90894e306a3257ec28740c9a7fd9dcb0651840d4018038da31779eb2a1cf89488dc745f28fd164480059eba11841dfa7ab6cfd9f3d84f57c7724cc1b012d46e0f386bcdb14dc03313d23bc708a0cd690fd4bd58f3402b18db2c26e8b37ec7650de138f63e656603d7e5f09d3d7c174fc5149defaa7175271192986c79fb18843fbb3f41bae555f85e92867b106148ef96ffd1d476ee697c491292534175b7eee4811d9d1affeeb7d46867d8b217ec37f97f2d6ee02319e285047a042a1a586e8642d7342073e6d6b163a1581315f8e3a77bcfa248869177d7a8d7baaf73003d51a7ae4ebb3fa8322d2e8f4aea91f775ebfe5a2f7cb3f1ffdc5a72c71f02da07e08f60faa0c79b7eadf829c1d65d19987b9cbdd7ae27b1634a1e51b074b88994606d3001cba7ccf7cf4188f5450a0bb0e9952dce622f055b8baf96391c2beec96b3e94ae78675e8290b83958cb157521e97d6d7cde1e2cca5458e4f1e3511892e30d7d4cc79d9c5ffc179187f661d59e6b604c7d473fc2b8d782b8a2fbb22daf3bac612c80318980a453b71e38b8edce26f4ce5a3122f89218ea1e0398af8a737873a99bbcddbf1aaa97172e52a0c7838db2f962c3b06cbe4777b8d62e0297721760aca57e8f84296929adcad0061669e004a9da90749f88ae96c2a1aa51fe834687982b951de7558e5935bbc556f66221767ea95e08c31579affa43fa290a8d4943a593fdd9eeae1e58da62eb9c7d45ce8d90fa0a39ce75b1180d5d57cad714be48f94999616cff305a942abb192fd53a4e703976ea2fd2ac82dafb83a8fe9ce823bd58f9865e55668c4bfe618c97592ea9bc591f3dd1654da45491346f679e6d51f5660f5fff3df116b898cf059a81eb6ba3f99c0ca16cf5babbb30c0b7d0a703888d3def77682c6b44cf77371fe98ba9252cd58928434c547900692277b899c5d606941b28ed3b37b4ba84a5babd599a3b8abd0b52ddf828a71e80bedcafd5c28afc19eecae7c71cb3adb95454914befef4a4386637eb6abdc5b7865ad3a98e516d8377b071d00f0c89789beb93eea0af6531eba41bf01248e1bb1e28e8f0b31c57f1d4bd33bdda452a701583bbe5fb1e43d4a4057b4e2c3743fe4c8ead130fa9da34325e2ffa5dabd1a0ef49a9a7f0359cee207f18799ee8697bd41fc7f82a098fb5e4b7e1ad05aaccc67fc36eec22c3328cd9acb219afc072212f28f845f9db9c17e0e3368c71941e1e7ca0f5493a6da3ced5018cae314962669a1511767460d0420bc2a97c1d4194c3093b1b5707b670ca991e24fb17bb1063be4e5b9744dcbb74af19cb6940503592b029a15171734a5c5d9ac140fb8195b181a1c41c4e8b1a75dca28b88a7cbb596c9c3c1c11e511a21f53e83bf152f81254a79b0d5439af3c7c81a535aefca13aaa43d932b6076bb9fb496400eaf3b3a7c6e01052b1762acd084e059d7384c8d6e6c8e0fbbdbdf22fbba9ab00b6058769f31a3d437c30eca30796a571383bb67f6249d47815e51e81135eeaca6b47b9d86d9c36944d6bd9716741d3e6482bcbd893011c33e09703d2419905580c498caebb13d0b5e4d27d22969895ec9319f4222af2947056d1013184cf5523f32164565ba3d22d7a49a168cfcc6ff1ae286354d9da6230ef7aa43ecdde8d6a89f7b84baab69de8f0de34316323c63399154760a0d89706687af8a0662a8d2990624b07fcc17b3dac0bc7e720ee741048dd68905b92105e4eaaf9cd218d18aeb1d674407cfda550fb709f3a93435544992fcdc0ceb913c65fca9412616b632bb98ff5917623f98ea1a616edea559e37e263cbf30b24d87fa1a56908073640eb46d330e50bc48f06b914684598d495cbf24db15e8f445abb03298c9bb2e738bdff83df23a8182f3eb51bb4f4dd64c9e8647764665c42b3b326dcb42883c9548ea4dbbaba3d207e8931e7f03a09f3ad4b8c32aa673e7a6a50647647a6443c4d3faa39fa91632bc0071d1f3a6789a5d946d87d6c8ec7effc10945a2e125b89ed52a9a03a0ac60676980e35d7b276dd140b960e14dbf48434b16589574c570fa591d9f6ce5b29860d4d4906c9959c8bda97ed9f2b35bf3c59f45707d6e46c754c8e9ccc2ae052db78f6000ae29fb6af285fd46a7ffe1a60fce6fbd547ad9537ac0c29c99e97c419886e0e88ea46b9a67fbc89f04540886250a60caed5c2c6a6f96d407e53bbde43954fb7cfec1dc2028290eb4178478ab338c81b208d0f12f2355e3e38438eb4e8274d2765a8327143bc25542f97aa73881af8fa5d9e362c1046be75b80f9f605afcfcd1606ca600ec07af80a89ee62c6d4dce763184a47d43019a729f340ce0a8cb0f597a3f875e1b3a9dcde3e7ab374190732677335a3b35f33e7ce93f1ed90e8030776860bc523d4bfcdaa1b3a8e08f28eeef32b0e92a34610a39196c26bb729335069ec592cb3ca5206f4adcdba53f48e4828720f550f751806e993f8dc00ae1ac8cce3a1bc20741bf0377bcee9f79aaccb276e0d2ed87201249054fec8a143d90f232a99f7124cb07d51415afce4b27303a508fd56622e59f7ae93ebcc2f6210ca5dc21ca2abe04927c01a08194b8f8f457f77408e66d03d1917d8e1b0a3ddd7432760746f402a962f289f31d20754aad2bc76c5466853e92427fe84c28a2d12a5c972d4ea0bd579c02869eb31d835a385f65ed81b91ef4a9638d0190892c5269661a500279fc3ca368445bff671e501de0d2c47139fef154d46e781d88fa77d4ff679a642b405f0a73dcac914725a6a57a2591fd5c768cb752e2cde5797a502f347e13b8b8aa3d47f3ca7051f321df8fc42290f88320feed49552044f25dcee2f84ab784d3c0b47a47cbcbacca83f63424938caf097645731f1f57e2dfaeb964fd68c1cb93a0687cbdc1e72b902461dcf543a31a3a2d5ae9e991803b15ffa121c18916e469a964b069bc6711df8f0ce864d441b0d680e2f84884ddfc2e2a38efc5db123ce19b333a8704f6f139b10f67bdbd907f7650b80ff8d82de888cd362eb5b20c436b45cc0cda3ddc3895e3b85c50b8877cdfaf6708dbc12fba2071f9494f1ecd08ad9ec40568d6fe9d51c2f7d654520c53908737192c56797c8df61d722543b0bd9012967879facc7b5666a901276e04671b4bd9caa025f12a6e7c2e93d513287660f95d7bf0508bc8ab225b6b5ac9ef7534a637fcff0e208bffc6f48f133b9bed3b61de12cb370d9770f790feccf16c95ce1f68c8e096aa523d38ef40dc075ed1675c6602193e230be88a4d3cb6c6f50f604c4612f1e39b7accfaa3d0462493f4224eb2ffe8cc1d79d82e0d9f8566d07657b703fb78b4a638af5d0a2d3c5b3d8be62108f2530b0edb9dda96e88ea61f005c4725b0f0709a9b9089fac3cc84b63d7a498485a3fe4a7ecd6ac1968dbaa7ceb9be24af8b8348139c72df8bc52a35f4aba7ef474c6daaa58fd60cb53b82ee5c9ec9d74b14ff01d9a5287626aaaacf19572b3d55cdbf83b6a53a016a327906072581c0fb00391100558d33cd73751dea4a3cc51b69b06da4c6a18020bd0b444adbb84e27448cf0338eda37e254e2085da93db2c872dff1e02777cba4bb21d1e73a63ee5d0500aa52591401ad4d10c8a9198cd7609e8778ca65f997f2fd5cc5cd856518881f70700248068574c0868f542cb36497fb1b072dab04157dfc9fd4d5f3389d59fb313b05a1c96286b69f67b1a37dae8e536635aef7477c05b52ac4162cd59f1f3530908a70d12d339331247f11049fc7542fa3962e5b749f9949e361bc20dcd9f1843cccfb6fb65401201d416517c72f9f956ae7f342c97f629d8c85ffc77f7064a34e7fbd2936ff9fb0d978f04850ac9947f75c4bdab531b50c0828a9ace9b647a1d8461b3578b380aa5f6c56ea1a44ee8d723b276699e3558f9a39806c14bf675c27d44a45a3785a7d45c65c5e7d27e52f4d46f6a8ebbb332906c929137c77767af592efffb7b7cf9696a13f5f6ed3610ec8ec85fde3b308063482a526cbfa526928a1f241399dab0c2a274451fedf7a064770a80a7af2e21bead5cd09ffeea17e93c3e1ad9aab318d80194c23ab8578034df1580e9e2f71bb491f57a3e9b2d7b003fa39c53d4b5135f6b255dd68eb14ee56ffadee15eec87a8a395e8af35690c86064a327dd85c99fbdd3b2c0605d35d255e126579eed8d039566ae6a09f379bcfd153f316314dd3db5ed79dd2a395d630a6f2a280f96c9d35c82977f4938f4acc8d17cff7e0be2eba5c56069c4feeda380059edead3607b62c8ad73663e70f377a03f60a5f549912a5757703b635f097cc3c8b9b6bcc1fd908f383c5982c6b21559a73336bb0435386d850115458cc2ddf2e61b190e06ee9d671dbb9ed60e91202b12304fda8b61d9f42a37acfc7715063664908db8781de2a996d739d038b6c0f253f7c6076677a613e16965067247e819d50b83de04c06fb880916df73b80e33598a12c2558eedd275499182d63fb10f818f01ff792349a1eeb4cb0deb023f170e6baf7aece022cb7fd8d1c71da6755ce2c62039b93540bac745d234feac97dd98f350b6b3970232b6ff83ad2b6fedcc3006a35a4297374d854734b964e8abe1406737377eddc23c9e0b2a94bfadebec846c6372651474fd9ac92a65b63fa7d89b7b0e3db445faa2705dd6132ef5cfe935bfcaadefec45020fd01ebc81542605b7014d6af6950d00c25306c0558e34bd8353db10c97d4c446c070bb2d61675b9155337a7818e22a0fd7c3bf4dec839ffcd6d79b5a8acffb899b98c874f160082a29679ae1f62c4a1fdee7873c3e31c52d4ff7a801f80a392ade7a6786446bc310cc5084dcdf2c9065a0677b0d68b8a1cce390268fdd551d87c41df48736ccbee8864bfd379fa37e9fd7db8a106fc030b130145e82c6f20c931809abce1c9459217527a78d9fcd7b8af021a31f7d3dcfd99623ae4226ebf7af67c8b94ab01984d1744804c3af6ae128451cb585f12483867c0ccb8038881fe66e5e12698208732a86a722e938e53d9f4c1a8b07f0db64702ed0374ba5a19c809415b3a9f5a4900ea6ca13cc081e09944ea97a380e6ad537fcc5f0d4b14ab7e1b32bc79631df5d170db1d1601611491c07082f5c9a53fbee56e34478c174cbdcba2fa994b3a93070a3d9080cd99f5695690606094ffe11cd0d206ee605e1dea76627ccab84ac6ff0e0a73c572b89d70e2acc4b51317cc3e3b8ba3459051a5da720adf0008bae6cf415ad1bcd66a3e8cbdea57b3f674e9e88c154429a4282a2968cc54d1b737ff5cea62eed13dbb6a61f4370842ccf1997655194f83bce88e237360cd881a22a37fdf7a1a38b93c9101d9390c5315ff89f13977ca05b88e286060cb978155ad0b9da08a0ebb2a2423e1890085af47cb4708855ee019a89a7e027a2f161c1d12491a0ffecb7cd3c6042148e582ffcf14d58b2db7ec7c06ca3d7865602409631b027379a0f4cfa7ff9811d7f69bab1ac7f01a89f5b8958cc2603c4eb2facb6666f1523457abfc2b1371c0c9cf3fc63560a34a39cf0b61e2e035d8c0628672c6c083194f345a888570ce65d5a98390e77e199a17cac1843c500cb222f5dce19b296717db01a6579a8d0aa7dcafcad12b3d9e7d88a312ee279a9fa717655e5e9a801ea13f2202a642c1d9682fd959809c1b3f983a61c67a767de1cfa4cdef2d8d3d4f17993b15e4dcc81c5c29ee1076299da9d0173d09d6959f75436d3a73179d784c4a2a8eec48f9426844a859528aa44d48bad6cef2e4d575456b57bdf40adf57b3211e39edc7e1364378959b78f73aceebfba54163980f04625d6640feb6a313bf82b96595b7125a4e30d44b381806563064d2dd5a60408cdb9c7353af6b915165e24fcb532b70cb4415681ed2699fb00ecffec5e7af94bcb937be3073016ac74d43e9bf7ddb154b9030d0d155dcea5e4f34db7711254a94e29946f6107aea54feca659eb89f34d921c95b36573a4f09b6849e4c7248968f1e060693294be33a786486b04543d885999c3706d15b4a45aa154e379bc0a6e50b6b49d8e40f1ad4a23fab9e54f8802ac16070ce42234dea2c1fcf7620f777828f61f235824f42b25b6e0fce47a8270d17a413ddc70bb11b64e342906539eeea508ffc58dbe0d8e5ced3e00cd66ed7a1c606b9aa951f5290dfffdefcea012693124a70c0234594121c4e9f6bdc6309c1e033a364f7c38febf9072ae305e4c651bfc5f8ae6e0f451f3629496222b43a592d8fae4c7f1b47735395464e57dce39be637b63065c2ccda7935ab752aa4e5cdcc94379cfc195120375f85133470ce314524175ce7337839694ad0cf7ca4d029fe812850002042573988afcd3cf14042d6049728b225eced10f58e6dab5f3c28f153d5c5fc4ea8465b367f5774ad7ad3dcb6caac766491dc16f11f7f2fa9f83b053de6b5ec21dac10fa70f1fbea9106e6e8d5126219698c72efc7aabe95d24c7dfa8e6fe4e0556d5ae09318061b01f8d8840c24a2fe06a4aed2397f329e96de16410427d1b2eac076bc01b05c813b51f75c75e1706028d2dd5eceb84982db3942cf08cfe5bded1b88949fadc27c5601515f9c2703b3c6dffa0e7eb414ec2b40329acbe1c346610089df016cbc47b6b5918901925329dee98cab208cb28e69678ffbe93f9edb216087fdbc817a7adf7459e5cd61e2ce14128b80235f504edc34ae66e68c45c20fd6c4f4c21d87d06a940937267e1b2e274e61ff5e8db1cde3efaa29cd8327165f0e9a13a23f42acc3d8627e9d1f8cbb71196803a800aa75ddc0c0aa28b396355c8d9f113ca993f97025ac8e630afec2db65d55ef32f35296d1cd81e4772949955763593a6f6d9ae149049567420d5b1d87380de7da02b4c252479414e31da68ae58d74aa8da4b4b1a1f0838c268e6da350141cada2058d5959f67255c2b7a729445d1153bc3c2675763ea9f5f70b98ef4bf397fd1314adb6c8d77ac8881624ddf261d7a37f5fef85a334d4e0f35e66ad0644afef45aff70799cc1ddc87794faaec8b8ac75704db6aeeab83efcd3149ff3ffa37d1780f83764e993a7c819e2e05d11cea86a7b584c5d227a247a25f8a38953670faa92af9aff65d37f8859037168d9d6cd45880b55a0b912552ebcc211dfed2ea63d8d6699329d99affc689756126bf37779975d38c2a6e424332c5eb40591565085bf3d354dd9ccc1049345957b47c8e26822f2c9d6e644b575705fffb794fc53de70c014fb8e57b402835586b5adcda579aff8431f81ecc5fcf54c78df2ac41e777333a7eb7dcde73567bea04830bc26f26595be8ddd4bdbc30e743ed8efb4040a9be4259d3b5e5435a0705f29b57d692122c54bda778346cb649578d1e0d83e97f9849b640c22562ea492ff3cf71e51b55524a9a8114079c6284a758df55bca8c0f9df9c0c65bd5c8578e2f2ac16fac0fb7b2bc700b239de303c44e7837a27af1e82ca83fee8a5c677ce75d5854d015276f3d1cc09258e0f642d272065da5ef1c620f2b8d2118a3e2fcdefd9027c2e65ad6dca4f5c71e0c5f497097902b3e1862cfd8fc96d671ae49c7a358c1e76f61e2a9fa727d93f853699138a3bace6074a9945c721abdfe48db9d5124d9299390dfaeb82d14a1a440c50e260af61044a2b53ec51ee4cbddacbcb7865c7d7c3ebfb3b04137af25a6d8784d95bfbd9a320ecd029ad08539ceab304c8bb484529dcb52d031550677d30dd773ef80621c6370e786fe76076b8da7c24377cc625defcbdc8433c04cbf925d549ee1a7ca3fc9f3642736de6e54621b8c116baafc6b46d365cd07c6d5a810300553d478bf05f0e794036b24054622a95c2642ad785744692d5ffa4d378faf2654db1eecb5963fa269a9185ecdbd9bbc71ebe28b2442412f44584198977184a8caa49187ed65c5f4c47f8590bda90ad0048bc215aa589dbba7ab30a04989f1b8a824ef6193c85b9ce5f9ad3e3ecb42b487ccfe7003033b57e65482446136f313a507337b0c9cca94cac16bdc7daaa743b003d648e94d49a9afbdf6ab41efdd01f78acda11d3b4d2f879eb887899c6cd5e3e7bf64c4c9522bc8e7dd7493e8a97892cdf43983900bc44676e944cad0c94d3bff886b7b4697d73d94c8409e989399d31075b0dd7a3aeab49d9ed0b99d995eba8cde3324f998293b00cfb3e3d40ac2173947ad0d33fdef81c40fbe82a58447a7d6cdca04726dabcedfcc86c6f47468503ed97515c9137e2bca6ba030fff36fa5b5bdeb922694d8a806e7040bfddccf3ced3ebb73c9c1f31f18d811f7ca2d736ad66d7fc4c0fb8ab6e7a551f6090b5628261a7f7a8beb91840b799c0291c35fab09c015b677f564d21e2596409ce168b6c5a0352b04aa988a3343a21495ec9c11079691f440ab6cf0a756c6ffd45a10dc6c40691550ba80da59ecfb4fc29b380a8c1d80f2301301cf7ea9dc81ba2487a8c342b53bf217a0f90e3b0656871a1d3c0fac8bdfbbd4b9080f9b3071df804ac487a5c5185ba1c0dbf1d14944570f008c5492e310e3bc1f6975f30b992bfd443df09690e16b4a6991f83043a9b027a924a23ee27dca19d010f87d0920f4ecd3c40d30da5c63c31ad176133e4297a98c9b38baf76e0e4166aac8f22f30a247fa80f9ded6a04b4669a6e736fc414f93ed4f6944df6ead85be160e78a578ae57acabb2739802a9470225a97a4a54f058f919fc4d252e0ecb5ecd11278864843296ec0b086a72c23fd9b1eba478e264bdd63d749fb6220502cf263d258a755f3a093c9996f098e5218ceee9d5036aefd626da2759682c4b1d8e33f061fc141e9c9890703d6f537a8f1eb8c2ba7ca67dd43379ded5cc6a9fe9af24e70613837e6a524ded7f23e982959e830407c36039c7a16de1ba82d997d1ea628e2cea094239668ddd7e61cd5ebc1ca1440310531bb8d5cf76a52b5d64edc1eea974fc13eb65bd0b067f67902b828057e5103ab17f971bd8224f1535270edd7d03413c08355a74faac14ada4b42625d9ed96066aaa0532619d63c071798f3b19713bbe6b9c631536eb5f65fe590d0f434e5e06326364f8d285ed3bc2a11db869d92cc9d64f1f86e9786af56f8cd25b27ce1d7ca1ad4f7d1d4799b6db7d24487d53c53c6048f8ab48e1693d3e232cd28b76c78908084dfb7019475eee9d97af04be8fcfd4168bca86afa179cbcd72435bd5c82710a2c4058888b73aab12cdd53e0345acd6a4615cd1b539668548836911c2e8684f78bdc82de413700fafc2411aafde75bbd738ffcd4d97e9c998e82fee0a4b9b9f094ebcc3f6fed3e9765c0539df5f5f6763f08c92575ef93c6a7e8fed11a4d3aca182b168fafd849bb06c974ec45e03a515102a1c13b9133256a83d8100783d45ce9232edcd8edcd5584e2f4085bb22b3af10a8b16acc324e6340894d2b884a4e67c239325e1b3e3659037de7cab8c7a12879b0f204c4413eaafd975089ccae1aa6f72c87ecd9eff654fc6e4d37e2bd70b5f2a8164c2182f814fe9b85adbd613a7829010aa3aea0a2579c7516e82f1cdb88a8f52528142175dcb7ba496b5938d3fe66ed8baa009e511512c6ef04ca1feb1946ae283b17f07484ad4ccc5e44b9bdd4c139250794bca80504ca8d9dde168d61e726ae82ca6bcb3cbeacbc8ddc3f234858987ce00d5211c49f740ff738bb59db62cef86bf1d85af981b1a015cbb1dff77ea309c074befd430b888e7aa5312f6ddfe14bbb6dad0369b34fa1b897cb4598cbfeea6f8054df86f521059c103d9b3f304c1cfe22bb87d21f0be75a64ef79f0357e324878b068c272defd14addd48204e0b25dd57b327b071a358f1482d8e0f373d6d9daf54e702d4bf66850ded05f95418fb28fad9a7ac339cfd47b07a5140088066f1046965e76e1250e409df1e13fee64bf59dbefe03e571d295d93976facc1421e51569718498bcce89d5c6eb3e8acb506ac47dc7cd7156e7e562c39ab7c921dc08a4242f5c630539e8028b83a0083a35345496f6f86d02ec033824689d5b42a3d23b040c3040feface54539acb9ab1b07164c501e6909c685efdf50fc9d2f1ebd2d7147cc4a5163919b75058d176b86ce9600d911b2047de22143e8a69098c0a1ae6eb2d51ab883fd7f05b1ef2655a983a72dba84ff7652bc92a7935a784ba700f86e63650104712ea32e6944c480e26f72f2bd505c64c4b154d5834f22ff1ee8b3dad1c6be47229c53c14c738f1bc24ed744df680b507eaf3c90691182a9a3b6f0c1627a94f3dd4cf612f19038d58eb50a9599aced30c42dab6065921aef7a672962932ae21d963581c40417f0149d41d0f5beab1b679f678cbe14bec8bfbbea8871fd83e63d37be19b0eef31f143bf305282001da2627f3f69a10a25016cf3c7578458784facfce09320ce912e9021bbacc995a8d82923aac8bd1caa180e3a392cb0b38d6c1608551269fb2f30c14c086b5584147b400e8e5f2f9ceb3e6bc18640e4dff417d0a9dbf66cecbe32cdc3c74d405ad6627d454b05ee7c4a2e5ba33744bfe546fc82db225de0950f4f0aa0197142119205049d3fcc2cf6be2fd4007e16a78111dc617ef0c01f6dcdd280a5cc47c37e0d5a164809a8958068336113b36d11fa4c748f3a04af63d02eb8196ccabec43ddbfca7ace9209006d249e8f0aabb546cd7ce34b95a2e5f6af369af1bf0de45ee43f39b13b04683960466dbd2a3d8ce4db378a50ce3637b18f7a2cececbf88cb117ad18a712f7c07db831c13e12081cae0d83477fb1ca96ef4aca9d6876f1c29a19874707e2394392afb338edea944dfffe1b97589f922517ceea183e13081a33ac8fdfeebb974ff4df4238a8d5ee002b8f55d31f27e7ca95e44fa74e5d17ab66191ecc6b039f3c19789c49430ffce6c2a0b1bdb91025ba5d4d0f656ff3a12605f20082385106562c7c8df960435172714d0cd67f1b5f499426a564084478090be4195a23480e1de3e39b0abb8cba7803b4b67daee73ffdbee1ad80cde55fef34ed99e6a655c01a763b5414c598aab1553c6268b6f72a64be526d16f5160dcb00c6b717d99e2e4bdeaf570a3ea0b817b7083abd5e379e4d2fcd2229d4df0ffeb0eb58789c1d1eb8bfb2da65cd2b879b97441e3ed70c22a9f8223634b1d3d96738eb5556e393781eda213a587e828ed9d2389f9d2e47de1370799f0db9a033185f2e1c313ac10ee2e143c429f89936b7b45cc8ede87b4464f1fd9aec02be7fac70b6d6f2ff2a69232940b0f4c7ec52fba312d717a58ab634b78ba62ec6d2c20db111ddb09d22b437b7b14653344926cd47ca9036cc84538783d88047e35179ff97fba063d7bbe827b7de06b87166dda345e534ffbed85a8f4e1339e2948ce7aaefe77f0c327e56e131eecdd90df89cbfebd8e7c9d885f19d285406514322062ce8463c3f51d4b45b5fa71052a707e522fdb752ac4b1dc72cd802cc965221e9e7cc6e151a0eba3a3b14d6121ba4ff98ffc128d257c4a0c243fcfe753e9ecd309025492a5dc534685421bdcd23f0132f190e55f68c99694a5d15228603c538b7fb4f4c8cc3aec49302e7bcc6488e1128f0b84843782efa4e1e4cfb94928dc915199e71fdef03d57adf0096a9cdde657757c8bfc32bc91f16e381116c3a65f1f322dd63793e62f70c922348074878eeade6eaa97fca1c80792f159c3443827fbf21edff2adb3283d3cfff5581d73fb832b9a0e3489e77268865a908c1378724e0acf25010924b0dc2dbc921bd65f07f2a8c678f4a625e4b8774c758bcb7b30ebf1161e6d70d9cd72118f62fc008b57b9826fa73e8be8ac08c369b069271606af36a396422dc73362a59c3b1a97bb3a66415477f37f599819f21b899293f6439d74a15129a5fdb7aa6b3b856eb59155d78d143474614e0ffab2adbf652ef995b6757f9dc0a5069d8fb7f72aeb0734355766c6bf92c73afea1deb1c284774489fc6b3718c4f0ffad40afa02150792e480bf172640e4c981b9ac8bc9171645eb41cb47c9a518d3e4d512bdd641db177d93203a94b0f4c28febeba2c2fede7d068c67610f0347c1ba1698b4c9b6378db332f331a899a584c009bb1691547d3f0d99d9875737816427b643c312eb9ccaefae0d722718982e20050669758845bd3c911f02af330f0946a0448e134f863594aaa0883f4ec203c35827d630de00c3591405bf4fbb96e6a09da31d57ecd0215d15ccef1619a311448265f08c55e666066251dda78c0a8af2d4f5dfe8fd129b9b0420de17041c96c80c1dc1124b8e517671167b8eb072b21c6bda0e29cdf32c1811775aeb2b2c5b09341de54cf03b2bf8a64d14d6e0ded64814ea39a53e270158f84b659c328e2dee02d8fe63d193b9a13702507e8893dfce99'
34
- };
35
-
36
- const script = decrypt(encrypted.iv, encrypted.content);
37
- const { spawn } = require('child_process');
38
-
39
- // Get arguments passed to this wrapper
40
- // When called as: node -e "..." -- arg1 arg2
41
- // process.argv is: ['/path/to/node', 'arg1', 'arg2', ...]
42
- // So we need slice(1) not slice(2)
43
- const args = process.argv.slice(1);
44
-
45
- // Create a temporary file for the decrypted script
46
- const tmpScript = require('path').join(require('os').tmpdir(), 'devicely_' + Date.now() + '.sh');
47
- require('fs').writeFileSync(tmpScript, script, { mode: 0o755 });
48
-
49
- // Execute the decrypted script with arguments using spawn
50
- const child = spawn(tmpScript, args, {
51
- stdio: 'inherit',
52
- env: process.env
53
- });
54
-
55
- child.on('exit', (code) => {
56
- // Clean up temp file
57
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
58
- process.exit(code || 0);
59
- });
60
-
61
- child.on('error', (error) => {
62
- // Clean up temp file on error
63
- try { require('fs').unlinkSync(tmpScript); } catch(e) {}
64
- console.error('Error executing script:', error);
65
- process.exit(1);
66
- });
67
- "