hiddifypanel 3.0.0.dev64__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev66__cp39-cp39-manylinux2014_x86_64.whl

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 (77) hide show
  1. hiddifypanel/Events.py +27 -4
  2. hiddifypanel/VERSION +1 -1
  3. hiddifypanel/VERSION.py +1 -3
  4. hiddifypanel/__init__.py +7 -3
  5. hiddifypanel/__main__.py +13 -3
  6. hiddifypanel/base.py +88 -3
  7. hiddifypanel/base2.py +40 -3
  8. hiddifypanel/models/__init__.py +10 -3
  9. hiddifypanel/models/child.py +26 -4
  10. hiddifypanel/models/config.py +105 -4
  11. hiddifypanel/models/config_enum.py +207 -4
  12. hiddifypanel/models/domain.py +106 -4
  13. hiddifypanel/models/proxy.py +55 -3
  14. hiddifypanel/models/usage.py +58 -3
  15. hiddifypanel/models/user.py +171 -3
  16. hiddifypanel/panel/__init__.py +7 -4
  17. hiddifypanel/panel/admin/Actions.py +170 -3
  18. hiddifypanel/panel/admin/Backup.py +80 -4
  19. hiddifypanel/panel/admin/ChildAdmin.py +122 -3
  20. hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
  21. hiddifypanel/panel/admin/Dashboard.py +70 -4
  22. hiddifypanel/panel/admin/DomainAdmin.py +195 -4
  23. hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
  24. hiddifypanel/panel/admin/QuickSetup.py +127 -4
  25. hiddifypanel/panel/admin/SettingAdmin.py +224 -3
  26. hiddifypanel/panel/admin/Terminal.py +51 -4
  27. hiddifypanel/panel/admin/UserAdmin.py +277 -4
  28. hiddifypanel/panel/admin/__init__.py +82 -4
  29. hiddifypanel/panel/admin/adminlte.py +13 -4
  30. hiddifypanel/panel/admin/commercial_info.py +23 -3
  31. hiddifypanel/panel/admin/websocket.py +9 -3
  32. hiddifypanel/panel/admin_2.py +33 -3
  33. hiddifypanel/panel/asset.py +17 -3
  34. hiddifypanel/panel/cf_api.py +35 -4
  35. hiddifypanel/panel/clean_ip.py +125 -3
  36. hiddifypanel/panel/cli.py +172 -3
  37. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  38. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  39. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  40. hiddifypanel/panel/commercial/__init__.py +50 -4
  41. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  42. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  43. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  44. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  45. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  46. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  47. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  48. hiddifypanel/panel/common.py +98 -3
  49. hiddifypanel/panel/custom_widgets.py +71 -4
  50. hiddifypanel/panel/database.py +18 -3
  51. hiddifypanel/panel/hiddify.py +655 -4
  52. hiddifypanel/panel/hiddify_api.py +70 -3
  53. hiddifypanel/panel/init_db.py +393 -3
  54. hiddifypanel/panel/usage.py +85 -3
  55. hiddifypanel/panel/user/__init__.py +25 -4
  56. hiddifypanel/panel/user/link_maker.py +416 -3
  57. hiddifypanel/panel/user/templates/clash_config.yml +1 -0
  58. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  59. hiddifypanel/panel/user/user.py +233 -3
  60. hiddifypanel/static/css/custom.css +6 -0
  61. hiddifypanel/templates/500.html +1 -1
  62. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
  64. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
  66. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  67. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
  68. hiddifypanel/xray_api.py +109 -3
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
  71. hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
  72. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  73. pyarmor_runtime_000000/__init__.py +0 -4
  74. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  75. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
  76. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
  77. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,36 @@
1
- # 2023-04-08T16:23:20.391760
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\t\t\x00\x00\x12\t\x04\x00\xf2\xbd\xb8\xbf\xfcT\x88\xc6\xd8B8\xef\x97\xee\xe5\x04\x00\x00\x00\x00\x00\x00\x00\x00\x94~\xe8U<\x9a\xdb\xdaU\xde\r|jU\x11\xa9\x9d\xc1\xdf\xc4\xb5"\x05\x8d\xf2\xd8d\x80s\x86\xd8CP\xb8\x0f\xb1\xc6\xba\xaf\xc6\xa3?8\xce{w>q\xb2\t"n\xaf\x84\x95Ba\x18\xfe,R\x95\x82z\xb7d!\xcfq\xc6\x86?\xac\x1a\xe7\xd5R6\x1c\xa6\xbc\xfc\xa8D\x11\\7\x80=\xab\xa11\xaf\xd2\x9e(\x86\xad\xf2v\x00\xf1\x07]\xed\xfe\x07\xc7:\xbb\x15\x06\x0b\xea\xc1_*\xea#\xef}E\xc1\xfe,\x15F\xdf\xd1\xc4T\x8a\x8f\xecf.\x8e\xbfu\xfaGr\xa8\xfc$\x0f\xe0\xf8\x14\xcdV\x84\x1eJ$\xe9\x8d\xe9\xa6b5\xa1\xa4\xa7h\xc5\xedK\x8c\x13At\x15\x8b:M\xe2\xddo\x91;/\x80\xb3\xc7\xe1\xebk\xb8\xa3\x81R\x8cf\xd4\x85\x94i&x\xb1B\xe4#q\xa3-\xed\xf8\x06\x97\xee\x13f.\x0fd\xb8\xf3\xf9\xf5]\xe3\xcbV\xbf\xe0|\xdd\x91\xcd\xc8\x8a(\x1b\x9b\x97jB"\xba\xa6|\x87\xc3\\t\x86d\r\x1f\x1f]\xce2\x91R\xf9=z\xc9\xabo\xda\x844]\x07\xfe\xd1c\xc1l\xe0\xb3\xaf\xbf:R\x1e\xdd\x90TS\xbd/\xcd_\xad\xde4\xc3\xad\xb1\xb221\x0bc<\xcbW3\xcbpI\x89u\xb9\xd2\xb9E\x14\tD\xdbcu\x87R6!Y*\xf8V\xe8!\xbc\xdf\xb6\xbfM\xda\xa7\x03^\xb5\xc3\xaaI\x16J\x16\x1c>;\x82\x0f \xed\x97\xf8\x13\x07) \xd3\xf4:}\x82/\x9b,\x04\tK\x1a\xf1q\x05\x029\xa5\xabf\xe7:\xe4e\xb1\x9a\x9fz\xf2\xb7\xc25)\x18\xf889*\x8d\x91\x9e\x1c\xfb\x1bF,\x1a\xa1X\x12\xdby\x95\x18P.\x8c\xe8\x1c\x0f\xfc\xf1\xc3\x1cc\x19e\x80#\xd9X\xe4\x12L\x92YR\x94\x1f\xf6`\xf7<\xcf\x90\xdcw\xf9\x86uB\xb0\x87\x0f\xb2Q\xb1\xfb)\x8a\xb8Z\x08\n\xb21\xcc\x13\x05~T\x93\xe5\n\x19\xd5\xf6 \xdc\x8f\xd1+\x84\xef\\\xc3D\xc3<\xdf\xdf\xe2\xe35\xfc?\x86\xd7c[\x92M4e\xd2E)\x8dz\x96\xf1\xc7<\xbbe\x17\xebVG\xdeXF\x8f\xb4\x87i\x7f\x03\x84>\x8a\xb2\xb2.\x12+\x16\xd9\x87\xb31\xb3\xf6.z\xd8@\xfd\x9e\x0c\x1b9n\xf3w\x12\xaf_\x91R\x881f\xaa\x8e\xc6\x1a\x8e\xd3\xc1\xe6)\xae\xdc\xe8C3eE\xdb\ns\x84QY\xc92\xffW\xebV\xe4e\xac\x11\x0c\xff\x9f\xd1\x88_\xf5\xe7\xac\xdbT\xfa\xa8\xaa\x85sbU\xce(\xd4 \x8d\xee\x05\xc2\xf9\xba\xe3\xd8\xcb\n\xdb\x9d\xb2\xb1\xa4\xbd\xd2D*\xae\xc6\xc2\xa7\x96\x0e\x8cVz\xa5gp\x1b\xf3j\xe9\x8b\xf3\x8f\xdd\xa3\x8eE\x07\x03\xccL;\xd4\xf9\xb31H\x9f\xd5\x19\xe5k4\xdd\xa0\'t$\xd9\xc1\x03@\xa8\x83^\x03\x93\x02\xd1\xed}z\xb0\xac\x999Q\xa76\x7f\x1c%\xe7[\xe9\xa7\xb4\x10\x1f0\xe9\x17P\xbf;\xcfm^0\xbbDE<$F\xe9\xb6\x1eJ\x1e\x1d\xeaN\xda\xcc\x8eE3`\x12\x8dK\xaa\x99/\xb7\x86\'\xf4\xbf9\x89\xaf\x8b\xf8!\xdb\xa8 \xdc\xe7i\x9aC\x16\xc0\xd2]\x9ap\x95\xe0\xf1\xc0U\xd2\x9fv\xa5C\xb6i\xff\xf6\xb0\x1c^\r\x155\x9a\xfer\x0c\xfb\x97\x0elO\xdd\\\xf2\xfc\xc2a\xfa`\x04\xca\xa7\x9b\'\xa5\xa6\x14R\xff\x8c\x03\xb6\xc0\xc4u\xc7I\xef\x95\x03\x01m\xea3\xf5g\x13\xf4\x02f\x98\x88\xfe\x9c\xeb\xda\xcf\x98\x1d:\xc99\x07zH\xb9\xaaa\x00e?\x98\x03\x92\xb8\xaf\xa2\xc8s\x10G,:u%\x12|\xeb\x96{V-\xd7\x8d\x1c\xf2\x88\xfb\xaeX,\xf6\xd9\x03TA\xdc\xad\xad^n(p>\x9a\xb5$\xa6\xe4\xe8\x9c\x97\xdef\xd8^V\x89\xc4\xc2\xf7?\x97\xc4t\xc5\xd2s:\xec|\xe3\xd5\r)\x06d\xd8\x8a\x89J|@\xad\x84\x1eY)\x7f\xea\xba\xda\xcf\xdd\xe7t2!\xd4\x9f\x1d\xa13ss\xa9D\xf1i0<\xb5\xcd}\xd69\xc6\xe0\xe3\x85e\t\xfa\x03\xc1MY\xa3\x8e\x93I\xbc%\xcb\x98\x1d\xabg\xae\xa5F\xd2X~\xe1s^\xd1\x9f\xac@\xed2\xd1\x11\xdd\xbb\x8aN\'\xcc\xc8W\x80\x02z\xff\xdb\xc2\xe9\x9f\xbc\x1c=9~\xd6\x8b\x88\xf1\x1a\xc9\x1a\xb7|\xb5{\x1e\x93\x94\x01\xae\x82\xff\xf2`\xb7dw4\xaf\xbc\x0c\x1c\x1e\xb7\xa0\x9f\xb0vk\xe2\xd2U\xee\x14\x1f\x94|\x85[\xe8\x9bz\xbb\x9bp\xc8\xf2\x8f\xd6O\xfft\xdcWs\ncr@R9\xea\x02\x05\n>\xcdohXd\xc1K\xdb}Eo\x1bL\x8a\x89\xfe\xe14\xa8\xdb\xees\x8e\x838.\xa4\x1b\xed\xf45\x950\r\x98\xbc\xca\xa5\x90\xbf\x97o\x80\xc3\x07\x99\xf7\x04\x03\xe5\xb9;mU\xfa@O\x8c\x9d\x07j\x01\xfe\x8c\xd4o5\xc7w\xea\x9b=J\x94\x95S\xc3\x1f\x14F\xb2Se\xe5\xf8m\x89\xff\x03\xc4\x12\x85Z\xc4\xef\xc2\xb6\x10.\xe7\x91^"R\x8emi3\xbe^:\x9ca\x92\x12\x1dG{\x9er\xc4eT\x8aVto\x9e\x02\xd9\xa2*\x87c\x0c\xb2\x16\x85\x97[U\xa48\x84\xba\x8e\xd4.xro\xb5\xd6\xb4\xdc\xabr\xe7\t;\xba\x12\xd9\x1b!\xb0\xceU\x9eAz\x89\x99\x1d,>\xa6\x90\xea\xf5\xbf\x11\x14\x9e.n\x86\xc5\x88:\xd2\xf9\xde\x96\x14\xfd\xf8\xda\x94\x1er\xa5CH\x03\xd0(I\xdeT\xcbi\xb5X\xdf\xe2\xb4\x19\x8c\xfdQr\xe6,x@k7\xa5\xe9\xb0\xd0@?\x96??\xdd|\xef\xcc\xf4\x029\x99\xbc]#\xa4\xdd\xdd\x0f\x85g\xde\xfb,\x1e\xbfs\xbb\x82L\xfd>\x86C!\xb8\xfa/u\x80\xad\x15\xd9m\xe3\x97(\x12\xd9{\x0b\x96_\x13\x83\xdf\x82\xf6\xceC%\xc8\'\x98\r\xd5\xaf\xcf\xf6U\xf4x\xe6\xf7\xdc\xaa\x8f\xdf\x10\x9c\xba+r\x98\xdd#}\xcbGO\x02\xf4\x19\x85\x8db\xc51q\x1d\xcb\xac`\xac\xb8W\xd2d\xa8\xeb0)\xe7\x1b\x0el\xcb!\x1bj@Y$\xc5Z\xb8\xc2+\xb9Fu?}\xeb{\xa9E$?\xe3S,\xa9F3\x8b\x97\x93M\xc2\xeawwy\xf8\x1eN\x935\xb0\xfe\xf3\xe7u-\xc8\xaa\x8f \x83z\x99\r\x17O=vph#\xaf\xc5;\xa2\x0e\x97\x92\x90B?\n\xe1\xe8\'x(m\x9b\x99ui\xbb\xee\xb3m\x14\x12V\x99b\xd37\xeb\x8fW\x96\xaa\xb2\xd9\xd2\xad\xb2W|Z\xd7\xe6\x07ujW\xdc\xc9\x06\x8b\xa0\xe0\xcf\xbc\xfdj\xcc\x12\x7fS%\x12\x9f\xf5\xdbO\xa1\xca\t\x86\x99X2\x02T\xd6a\xed\xbf\x88\xb9{G\x02\xf07\x8a\x80[X\xc7|\xbb#\xc4y\xca9\xdf\xe6E\xb3\xceX\xd98\xc8\xa1\n\xd8\xf7^\x9e:\x08(\xbb\x03?\x91\xced\xd4\xae\xb5\xcf\xa3\xc2!\xc7\xa93\xeaf%\xa7\xf5<O\x08M\xeb\x8eD\xef\xbe\x84<K\xf8\x05B\x1d\xe4\xe2\xf8\xd7\x94\\p\xb2\xa5\xbe\xb9\xdc\x93<C\xde\xca[HEeC\xb9\xb1\xd1k?\xcd\xa0\x9d\xd4\xf3\xa3\x96\x9e\xad\x1b_o\xdd^se\x15\xd7Z\x83-\x7f\xd0]\x92\xac\x19N\xda\x11\x8e\xbc\xa07\xdcE\x8d\x11\xeb\xce\xffI,\xe2\x9cD\x95\x8e\x97\x8cmF2\x92r\x89\xa4\xdc\xa3N\xd1\x03{\xcf\xa1vU\x99^\x9c\xc4\xc4\xccCsB\xa3\x9dc\xe5B\xf3\xdd\xeb\x11\x8fHUh\xc9\xd8\xd8,\xb2\x15h\x05m:\x14R\x11\xee\xd9\x8a\\\xab\x96\x0c\xe4q\xd0>\x16\xff\x06`k\x0f\xf1\x04\xce\x92E\xcc\x8b\x04BV\xfc\xe4\xe0k\xf3KwX\xfdn%x\xb6\x9a \xa8\x8fK\x03\x7f+Y\xf9\xc5\xbd\x8a`QG\xbf\x7fC"\xfe3F7"i[\xa2$\x86]\x86\xc6\xcaj\xde\xed\x17\x0fr\xa3_\x81\xb1\xc6K\x1e\xe0B\xff\xc6\xf1s4\x94\xe5\xfd#I\xb7\xdb2\xd7<R}ao\xeb\xa1&\xfcJ\xbf=O\xeb\xd2d\x87H}\x01\x9e8\xae\x88h\x1b\xe8\x06\xa5\x18\xdd\xad\xa1\xc1\x89\xf7\xf1\xae#*3\xe8\xc6\x15\x8d\xea1|\x8b\xed\x025\x1e#)\x00\'R\x18\xb6\xe8\x1e\xbd4h\xb9X\xb8\xc3\xc1\x8b>\x95K\x0b\xed\xc4\xe7\x97\x1997\xfb\x18;\x9acMi\x82\xa8T\x1f\xaas\xd6\x96\x85!\xcb\x1c\xcc\x0f\xcc9Tb\xc5\xe2$ 5\xd7 }\x90Kb\x80\x0c!\x05\xb7}\xd4v\xe4u\xf3\xba\xcf\xf9[\xb5\x82\x7fv\x10\x02\xa0\x1as\x049\xae\x1e\x86X\xb0B\xf9\xf6\xb5\xcb\xba\x8d\xd96\xa3$\xad\xff\xb6\xbf\xeeC\xd3\x1209j\xc4\x12\x15R\x10\x81\xc9\xd23\xed\xd2\xedo\xce\xd2\x94n+S\x1b\xcf\xb6?\xfc\xeb\xa9{}\xbfzG\xf6`\x97t\x8f\xfa8kg\x8f\x0c\x83bT\x8ao\xe5\xd6\x8a(\xfc\xecr\xd4\x91\x83\xddB\x80\x1d\x93T\x92\x1c\x0e-\xa9\xda\xf1Xp>\x9e\x0fU_3\x88tX\xde\xeb\x9b5\xcc\x1b?B/\xbf\xb7\xf0\t\xe4\xe1\xd0\x0cZz#9\x94\xda\x9c\xd7\xa1"\xf7f\xadr\xc4\xec\x1fX0\x83N\xdf\x1a\x0f)F`\xba\xe0a~\xeb\x08\xf9\x0e6\xb0f\xc14`\xda\xa7#\xf2\xfd\x12\xbcA\n\x1c\xeb\xb5\xeb\x8b\x8c\xc27\x93\xfft\xef\x8fi\x81\xbbr\xf0+Y\xd1~\xdbJ\x93\xb0\x15\x0bk\x00\xf2\xae\xe5\x01\xd5\xa5\xbf`\xe7\xc3\xf8\xcci\xba\xe8dnh\x9c\xa0\x96V\xe1\xb8\xb0vp\x1a7\x0c\xc5\x95\x95$,1;B\xfa1\xd1\xeaE \x12\x8e\xd1d\xbbG\xa7\xfc\xef\xf4\x1a`')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from hiddifypanel.models import *
2
+ import CloudFlare
3
+
4
+
5
+ def add_or_update_domain(domain,ip,dns_type="A",proxied=True):
6
+ res=False
7
+ if hconfig(ConfigEnum.cloudflare):
8
+ cf=CloudFlare.CloudFlare(token=hconfig(ConfigEnum.cloudflare))
9
+ zone=get_zone(cf, domain)
10
+ if zone:
11
+ dns=get_dns(cf,zone,domain)
12
+ data={'name':domain[:-len(zone['name'])], 'type':dns_type, 'content':ip,'proxied':proxied}
13
+ if dns:
14
+ cf.zones.dns_records.put(zone['id'],dns['id'],data=data)
15
+ else:
16
+ cf.zones.dns_records.post(zone['id'],data=data)
17
+ res= True
18
+ return res
19
+
20
+ def get_zone(cf,domain):
21
+ zones= cf.zones.get();
22
+ res=""
23
+ if zones:
24
+ related_zone=[z for z in zones if z['name'] in domain]
25
+ if len(related_zone):
26
+ res= related_zone[0]
27
+ return res
28
+
29
+ def get_dns(cf,zone,domain):
30
+ dns_rec=cf.zones.dns_records(zone['id'])
31
+ rel_dns=[d for d in dns_rec if d['name']==domain]
32
+ res=""
33
+ if len(rel_dns):
34
+ res=rel_dns[0]
35
+ return res#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
36
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,127 @@
1
- # 2023-04-08T16:23:20.516627
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x80\x15\x00\x00\x12\t\x04\x00\xe0\x01.\xe9\xb8\x18h\x12D\xf2\xf3\xd9\x90!\xe3\xc8\x00\x00\x00\x00\x00\x00\x00\x00\xc1\xb6\xc5\xbbG\x9f\x19\xd6Eg\xf5\xa6,\xea@\xef\xa0#\x80\xa7Y\xb4h@\x15\xfb\xa2\xa8\x95\x9b\xc1\x9e\xff7\xa9x}\x04\xfaK\xb4\xf2$jr|}\x91&\xde+<A\x8d\xef \xe1\xf8\xc6Cv\xa1M\xce\xca\xbf:\xa7\xa2-r\xba\xf7\x86\xfc\xed%N\xf70l\xccV\xec\xe8]V\xeb\x9a-{\xed\x02)#\x06\x93x\x925\x8b\xd8\xca\x16x\xcarN\xe2rtx\r\xa1\x80!\xe3\xc3F\x85O\xf3E\xa7\x18\xafs\x1b\x7fF\xee\xb0\x16\x1c\xcb\xd1\x7f\xb5`\xe5\xd5\xc9r\xdf\xa6R\xcaIZ\xcbu\x83\x90\xde\x05_\xde\xe8+\xd2\x05\xb0-pi\xe2\x82P\x19\xf9YN\xddid\xbb\x89\'X\xa9x\x9a\xf6\x02\x13\xcf\xd1\xe7nC2V\xf5\x9a\xfdP\r|\xae\x9cl\xb6\xd2\x95\xf2{sE\xb2)\xbe\xbb\xe0\xf2\xec\xaf\xd1\x91\x8e:^\xe6\xb7\xbcjY\x05oB\xfa\xc3OB\xc6r\xc7\xf8\x0bV\xe8#\xa2\xe5\xf3/\xafM\xb4\xecy\xa8\x8d\xff\x87\xa6\xc5\xdd\xcf\xd1[Ed\x05L\xc1\x97\x93\xa3H\xd2\xdc\x08S\xa3S\xc3\xad\xe5\xa3\xe0-\xc3E\xb3\x12\xe5\x14\x82yaN\x881\x83\xdb\xc3\x89$\x15\x02\x88\x8f\x1b\xab@8\x9c\xcb*\xcc!\xae!\xc5cy\x87q\x91\xb4\xee\xe9(H\x1d2G9\xa4\xf0\xb7=I.N\xa6\xca\xdf0\x03\x90qE4G\'b;\xca\xef\xc1\x1d\xb6r\xf8E\xca\x813\xd4^\xec\xa2\xf3M\xae\xba\x7f\x18\xdd\x8b\xc9\xff\xe5\x9c\xfa\xdb\xf1\xcd\x1f\xbe3\xc2}\xc7\xe5\xab\xc5\xc5\r\x93\xb0\xa2B\xb37\x0b3\xc5\x0cD\x1e\xff9!\xa2Q\xefk\xa7\xdb\x12\x82j\xd3s\xcd\xe4\xcc\x7f"\xe3\xff.*\x13\xbb\xed\x03\xd7;\xd2]\xd8;\xae%\xc2\xceI\x8c\xb1\xe7\xaa\x86\xe7\x9d\xa7\x1c1z\xcb\x08\x82\xaf\xccR\xee>EF%\x8c\xf9\xb2\xa0\x01^\xf8\x0c\'\x13\xa6\xc8\x1dM\x14\xcb\xeeYSu\xdaD\t)a\x1dBh\xdd6\xe2j%\x01\x08z\xc1\xb4f\xcf\x1f{\xfc\x05\x0e\xaa\xd4\xa2\x0bT7\x81W@\'\xd2\xf97\xfc\xd9\xf2~\xac\x9e\xddT2A\xd6\xe6\x8d\x14\n3\xe9\x1c%\xab\xac\xa6Fd\xd6=K\x1e\xddp~\x8c\xd1\xab\xd0\xe9\x9b\xb1V\x07\xe0\xb7\xb9\xdew\x133}D\x92\x91\xa7\xe8\x9e\x98>\x17\xa0?\x04~\x0f\xf2\x02\xe9;\xb4X|\x08R\x18\xe4,k=i\x97\xcfe\x81Z2\xf8M{.W}\xa7\xc1\n\xcd\xec\x9b.\xd9\xce\x10!\x84p\x19\xf3}\x9d\xf3\xe8n\x85\x0eKO\xbd\x06\x8b\xdb\xfb+B7\x0e\x12\xf6\xbc\xc0\xdf\x8b$\rka\xf6\x7f\x9c\x1e\x06\xf5\x94[\xc7\xdd\xb7Cs\xd2\xd7\xc6\xe4+\xb4\xb1\t\xa1"\x85bkP\n\xc8m\xf6/Eg:i\x87\x89\xfd\xd8\xee \xae\x1f\x80\xe5\xe4%\xc2\xd6\xc6\xa8\xc0\x83\x1c\x8b\x8f\x8c\x96\xff7\x9e\x92\x07\xaa\xbaA\xa3\x90i:K\r\xb7\xa25\xbfM\x84\x16\x13\x01\x84\xdbk\xa5Y\xc6\x1f\xcf\x9f&\xd0d\x7f\xa4QbFOF\xe7*\xc7\xd2\x9a\xdb\xce\x95jVk\xfak\xb0\xc6K\xf7\x8a\xd2d\x0b\xbds\xf8AX\x1c\x7f\xd68\xa6B\xf9\x06\xf8<&\x8f\xc8e\x7fL\xaaJ\xb2K\x18\xbe\x91\xf2\x02\xb4\xde\xe6^\x05\xf2\xb5\x1e\xf0\x01\x0eV\x8d\xb2\x97`1\x80A\xab\x17\xc1\x8c\xc7/&\xa8od\xbc$\x9f\xc4(_V\x1e\xf1\xef\xbc\xb2\xaa\x88c\xeb:\n\xe7D\xf2\xc3N\xcb@\x9b\xb5I\xd1\x83\xef8.z\xfe\xc8(\xe2\xe0\xc0\x06w\xf1\xb6#\x02\x04~\xbas\x9c\xc4\xacQ\xe0\xbb\x0f\xfc\x8e\xda\x1e\x84\xdbI\xaat\x98\xe1\x88w\x8bK\x94\xf3\x8a\xb9\x93\x81\x93\xdc\x90V\xfb\xafN\xd0\x14\x19\x94|/u^\xa8_\xee\xd8\x1b\x92\x95\xab\xe0m\xb20k0\xd5\x96\xf4R#\xe5]Ei\xd0D\x9c\x0cBPB\x8cK\xfc&\xd2\xc21\xdeG\x01\xcf\x86\r\xc5\x86\xde\xff{\xba\x10\xad\x08\xac\x99\xcf\x97\xf1\xd9\x18\xd1\xae\x9cP\xf6M|B\x08\x0f1\x9f\xe7\xd2\x14\xde;\xd2\x1c\xf1\x9b.\xfd\xc4\xd7\xeep\xa0\x84\xc7x\xc5$\x87O\x1f\x80\x85\x82+4;\xef@\xe9\x9b\xf74\x92\xcb\xdej\xbb\x11\x19/\x96L\xc6\xce\xa0\xf7q\x02\x85\x16\xf6\x84\x94\xde\xa0n\xb4=\xf1\xc8\xa2Y\xfd\x16\xed\t\xc31+\xc2\xa8O*N*2{\x01\xaf~\xe3\x1b\x0f\x9f\xb6<l\x0c0\x0b\x91\xa5\x9c`\x11^\x07\x17\x02\xb1\x1ay\x1f\t\x9e\xe5\x145\xf7\xbfU\x8f\x80<O\xdc\xa86\x1d\x93\x86\xa0\x90$\xd1;\x81\x94\xc5\xaa;\xfb\r\x97\x04\xd88\xd4\xb1O\x01\xb3\x7f\x10F\x12\xf3\x1f~\xd3\x8cV>mT\xb2\xd7W\xbaIeV\xc0z\xe9\xad\xb0\xad\xb2\x84\xb0\xb7\xa9\x10oeE{\x81\x9fF\x82\x87\xa2\xe3u\xb5\xa679\x1e\xbe\x15\xc5\x91\xe1?}\x17\x93&r\xd5G\xb3\xbe\xdd\xcc.\xd2\xcc\xd0\xb5\x1fn\xc0\x15\x9cz\xcf\x9dm1\xd1N\xdf\x9eK\xe3\xe7\xf3\xf5\xe37jo\x12\xf2\xa5\xff\xf7r\xc6\x9f\x85\xfau\x06>\xb8`:Qca+\xd4\x8a\xf4\xff\xb4\x16\xfaY\x91<x\xde\xccg\x18\xa9\xd9h3\x94\x0e\x92\x95Xv\x01\n9@Kz\xe9\x97#\x12n\r\xac3\xed\x11V\xbf\xea\x90%\xc30m\xcb\xa9\x99+\xfb\xac\x00d<>ZT\x05\xe1\x05^\x9e\xb8\xcf\xde \x05\x97\xc2\\\x89\x1c[\xf2q\xda\x01\xf8\x9dw\xa4\xed\t\x82\x14\x0chF\x88^Bq\x8d|30\x81\xd9\xa1\x18\x92;ZXX\xac6,y\xc3P=\x93\x8a\xc4TM\xf5rRj\r\xe9\x14C\x9f\xd2M\xe7?Z\x8e\xb3\x8fDV\xb1\xff4j\xc4\xb3\xa2\x1b\xdc\xf1\x00.\'r6UB\xa1/v\x7f\x81O\x1bB"\x12X\xea\xe5\xfc+^\x94\xfd\xc2 \xb4\x83C\xf5J\x04\xf4j\xd0-\xa2\xb7\xfem\xbf\x81\xa9A\x10\xbc\xc0\xfb~\xc7\xf9j\xe0\xed\xcc\x19\xe2n\x86\xb8\x91\xfb\x02\xed\x12\x8e_o\x99N\xbf\xc3f0y3tC8\xa9\xcf\xe9\x8c\xe4Z\xde_\x85\xb9\xd3\x08\xe9\xb5,\x1a\xb0\x1c\x16\x81\x9f\x0bR\x00\xd6\x12.\xae\xa5\xaa\x81\xc9\xfd\x0fBQ\xe2\xd2\xeb"\x01v4UB,J\xf7\xc7y_|\xe2LM\xbcD\xea\x00\x8a\x94-f[\xd64U\x02\xc3\xb1#\xdc\x0ekq\xecn\xb5\x02\xc4\xb0g\xd1\x15\xb7\xb9\x88nZ\xe2_\x15\xe0\xf4\x95\xd8\x9a\xc1\xe61V\xcbo\xf1v\xff\x1d3\x0b\xf6\xd1\x14\xe4\xdf\\K$\x11A\xd2\xd1\xa6\xc0\x9eH\xf3Lr\xccU\x95\x10C%>\x1b8]\x81\\P{I\xe2\x04\xa11z\x0eG\x8en\x91\x10q\xeb\xa8\x03V\xf7P\x86\xe4\x915I\xe9f\xeb\xcd\xaa\xd0s=\xcd\xc0:y\x93\x85\x03!"N"\xc9:\x12+\xdd(u\xcbK\xfa\xc4\xa3t|\xd4\x06k\xc4>O\xb6\x9fW\xa66\xf0hTC\xcf\xa1\xc6\xf5\xfc\xdc\x80\xcf\x1a \xa4\x16\x07\xaf`R\xcb\xbd\xe4\x03\x8b\x16\xb5fq\x98(\x122rlU\xd6l\x9c5\xf3\x85\x9d\xa9\xaezFC\x00TW\tr\x18\xf3\xe5\x83R\xb5\xee\x8c\xf1\n\xb1\xd3\x9d\xef\x8c-ip\xdf\x15\xb0]\x12\x9b\xcd7q9W\x0c\xa3\x16\xd1Y\x94w\x91VGm?)\xda\x96\xa2^\x85\xa1H\xe1\n\xc8 /\x12i=PB\xf1\xa0\x12,\xfb\x8a\xfe\x1cs\xfd(A\x18\xb9\xe5P\xd9AB\xe2\x9d&\x0f#\x8f\xfd\'\x83\x80\x8b.x4v\x15\x81\xe90\xa2\x13T/\xe9\xdc\xfcM\xbb\xd5\x9c~\xa7^\xb8\xa5Ox\xbf\xe4\xfa\x1fe\x9e\xa34\xed\x10\xc6\xb1\x86-\r\x93D\xb5\xc0\x1e\xf2\x8aD\xfcV};\xfd\x88\x0bg\xbd\xd9,*\x90\xf3\xd7\xe3X\xdf\x88p3\xe1\xf1\xdbal\xef\xf1\xa6\x87p\xbc\x86\x81\x12\xf2\xfa\xc0>l|\x93-\xa3\xcf\xc1\xa1\xa5g\xa8\x06X\xff\xa5\x9e\x90Zi\x19X\x02\x0f\x8f\xafx\xef\xc5o\xcb[\x85\x8a\xf3\xf6\xb7\xbeN\x06\x0c\xbb F\x08\x9a\xb5w\xc3h\xbe\xdb\xc3 \x03\x18\xdflP\x00B\xfc{M(i\xeb\x9ey\xae\xce,\xb0p\xf1\x84\x8c\xc0XI\xb5bL\xce \x7f\x0e\xdc\x08s\xa1\xee\xe0\xe2:\xc5m\xe2YR\xd8mS\xa6/*mS\tu\x8esD\x98\x9e\xd1\x9dlzW\r\x04\rD\xb0!\xbd\x89\x07\xe6\\\x14\xcb\xf8\x7f\xcb\x14\n(\xe2y\xe8l\xe14\x91\xadn\xe9c \xf2ZP]b\x08\xfe\x1c\xac:\xd3+H\xe9\xc7\xbc\x17\x96\xce\xd8\xbb\xd6rN\x97\xc1pp\xbc1 \xac\n\x929\xa2q0s\xea_\xb6\xe0#3\xd3\x1aMd\xd9^\xfd\x8b\xb9\xb4\xbe\x81\x15(qX\xb0&\x04\n6)\xa1\x82\x17\xfd\xff\x82\x033\xb7Z\xf8\x1f\xe9\xdd8\xaa\x8f!\xe0YRy\x96z\xf7\xc9F\xb5\xfc\x03\x98\xc0F\xa0\x04;\xe7\xd8\xf6\x92\xbd\x04\x1e\xac\xf1\xcf\x8fu\xd1\x94:\x83\x1d[\xd5\x1d=\xf8\x035\xddf\x98\'\n\xa5\xc4>\x15\xd1\x04\xae\x95n\xbdo\xb8\xb3\x0bE\xad\xec\xd9\xd1]\xe2\xbaW?\xbb\x1a|\xeb>\xd9u\xbe^\xf2\xe9yguqz\x9e\xda\x95\xf5:\xcc\xc6\x9a\x0ef[\xac\xb2\t\x93n\xb6A\xb5\x13#p\x06\xc3\xbe\xb3\xcep\xd1B\xd9\xf7\xcd\xad \xdc\xfa\xbbb\xe9c\xc8\x08*\xce\xa6k\x1d\x7f\xa7*\xe4\xf3\x00\x0c8e\x1e1\x95\xd8\x87\x0b\x19Pd\x96\x9cV:5\xd7\x8e\xe7\x0b\xe7T\xee\x92\x0fp:\x18u\xc3\\\xa9\x0c\xdblI"\x9f\x87\x9d4B\x98\xda\xdcc\x16\x02d`\xcb\xfe\xdf\xee\xd38\xf8\x86\xe6\xd3\xac\xad\xf1\xacl=\xff\xd99\xe5\x811\x90j\x02\xb1\xbe\x15\x1a\x07\xc9_r\x7fVE\xba\x80k\x13\xd1v\xde)5y\xf1\xb6\x1a,e\x95\x94\x12xWt\xf4\x83n\x8e\xd5z}d\xf43\x03\x13\x10\xeb\x9e?\xa1\xda]0\xbe;0\\\xf9s\x9e{E\xdfN\x18\x0b%\x19\xb4\x95\xe1\x06z\xa3s\x06\x18+\xad\x1fq\x03{\xf3\xb8\x17\x0b\xe8,\xca\xa7&\xca\x8a\x0eG\xee\x95a(1\xc2b\xac\x16\xf2\xf2\x19\nP\xa7\xad\xd1\x9d\xf1S|fU\xdd1\x86?\x8c2\x92\xa1\xec\xd9\xce=?\xd5\x8e\x96Tf\xdd\x10\xac\x9d*\xc5Y\xf1\xb3\x92U\x82o*<\x12`\x9bdA\x00\x96e\xce\xb0\xd4\x9a\xba\xc9uS\xa5\xf8A\x1d\xaf:q+!DmZF\xd0\x93\xe6T\xbeF\x8d\xc78\xd9\xf4\xe6\xbbg\xa0\xba\xc2\x01\xb1\x7f*@\xd3\x89M\x80\xcfeW\xc1\xdc\xa8\xca;\xaf\x812Esi{\xf9\x01T\x9bV\xf36\x19Q\xde\xc7\x81i\xdb\x10&oSw\xbb\x82S\xf9{\x03\x1d\xaf\x06e\xb1\x9f\xb5\xe9\xac*\xae\x9e\xb4\x1c\xd5\xdd\xeei\x8d\x0c\x82jBw\xfb\t\x99\xb4U\x1fZ \x04Y\xc6\xae`D\xd5_\x1a\xc7\x00\xe3/\x8aKi\x1d)\x86\xa1c\xeb\xcb\xa40[\x14\xfd\x1b\xdf\x1ax\x81y?\xd9\x92\xb5\xea\xcdi\x8c\xccP\x05\xba\xe1\xc2\xf4p\xb9\xbdV~\x1e$\xa3\xd7\xe3f\x9e\t\xf7&\xecHu\x7f\xd3\x96S\xddRt15\xba`$\x14\x84+bj\x91vrOr\xab\xcd\xb6#\xce-\xdc\xd6\x10\xfeD\xd0O\xbf\xc4!\xc8.u\xc1\x0e:\xebfm\x92\xb1\xf0\xf8\xde\xca\xed\xd5\x98O\xc10\'\x053\xbd\xe4:\xfb\x17D\xe6\xe3\xab\x03\x85\x01\x98<\xd7S\x1c=\x1b\x97.\xc2x\xb9\xefp\xb8.\xe0y2:\x12Q\xd8\xdf\x156F~\xc7\x05\xb6|\xa1n\xbc\xd4\xeb\xcc\x90f\x14\xc0$\xfb\x1a\x8bs\x06\xaf\xe4\xf2G\xabg\x04\x05\xa8RB\xb9a\x9b\x9f.\xc4\xf9gf\xc2\xa4\x0b0\xa5\xa5\x0c\x84\xe2\xd3\x17\xf3\'\x91\x10Anz\xa5\xa5\xd4\x00g\x95X(R\xa2\x11EBS\xc3t\xb8v@\xbb\xde\x04\x11\xbfE\x1d\xca\xc2\xf6\xfb\xb3\x05\x14\xb9\x1ev\xa0V\xd4r\xfb\x93W\xd8c\x06\xf4/>\\\xf6\xa4\x97B\xa8\xc5\xe9&:\xa1B8Sd\xf1\xdeV\xf7\xbdR\xfe\xf1\xf0\xbb\xe5f\xdf\x86P\'\xab\xe4\x1c\xc4:5`>8\xd8\x8a\xe2\xd4\xb34=\xbeX\xc8\x17\xbc`4\xe9D9b\x05\xdf\x04"\x06\xa9L\x8b\xce\xe3\xc1\x8c\xff\xd8iW\x1c\xd2C\xe0\xf8\x8eSg\xf1\xdf\x02\x94U\x93)\t~\x88\x1c\x08\xa8B\x9ee\xf7\xa1\xe6\xa88m\x1d\xde\xa6\xc1G\x17C\xe5z\xe9\xe4z\x8a\x02&\xdcs\x9ce:\x97\x02s\xa1r\x04\x88\xfbkE4=\xe74\x8bNx\x84\xba[9\xb1\x0f\xb3-\xb01\x8e\xbd\x8ad\xc0\xf3\xb65\x1f\xd9\x14$\x9av\x03\x87\xda\x7f\xdcDb\x04\x02\xa9\x0f\xb9\xd2\xa0\xc1v2\xc5\xa8,LQ\x9a\xf9\xa2\x02VO\\6\x05\x7f\xc6J\xb7L\xa2\xdf\xbc\\\x95\x87\xdd\x96?P\x80\xe0\xeexM\xa1W\xcc\x034\rx\xeb(\xfa\xb3tL\xbc\x80\x0c\x8e\xa1D\x0beE\x0f\x96\'\x85\x15\xa7J\xc9\x8855P\xba`>\x11\x92\x08\xd2:j\xcf\xf0yg\x96\xe7Jz\xd6\x10\x17e`^ [\xc3U`\xfcJ\x92G\x92\xfc\xb7~\x1fr\xeb\xe9\xde5\xb9\x15\xea\xf8\x85\xcd\xd1\xe9\x1bC\x93mf\x92\xbd\xab\x1bf\xd4v\xce\xef!\xcfRE\xf9B\xbc4\xa1\xca\xaeR\xe2\xb5c\x172R\x12V3\xd3\xf0\xc9\x1a\x08.\x97\x8fN.?|\xda\x05\xdd\xf1\x7fd\x80B\x0b\xe6\xdfA\xd8\x13\xb7g\xe61c#\xa1\xc5Gh\x8f\x92\x1dd\xc02\xb0\xbd\x90\x8a\x8c%\xe0\xdbo\x03Bp\x02\xe5\x14\x8c\xa7\xbdTj\x9d`fj4\xdf\xb1\x08A\xf1\x1b\x19\xe0\x1c\xef5\xc8\x0f\'\x88Y|$\xf2y\xd8\'`\xe6v\xff\x007=\xc5cz\xd5ZZ\x0f\xc7a\xb7\n\xf06\'\x81\x97\x1dH\x1b\xf5\xab\xf2\xdbn-\x08\x96\x19\x80\x97U\xb0<\x8b\x87\x84\xb5^\xd8\x17\x1b\x8d^.\x1f\xe0/\xe5\xaa\xf3\xf6@\rp\x08\x06]\xc3\x12\x94o\xce,z*\xc4\xee\xcd\x94!\xf0u\xd2\xfbR\xcd\xf1\xb9\xca\xa4\xcaC\xbd6\x02,SFi\x18\xf9um\x12\xac\xf0\xa3\xd6\xbd\xb82\xb5{.\r\x01X\xccD\'/mZ\'\x1eo\xf7\xdc\x82\xf3\x82?\xcc\xe0{\xe2h\xcf\xbdy\xb7\xa6\xee_i\xa5\xebI\xaaA\xd0<3\xe9\x86o\xd4\xf4\x1aY\xd2\x85\xee^\xef\xa0\xaes$\xd2S\x05\x97\x0b\xdf\xb6\x1aKE\xae_\xd0K]\x17\xea\xf3\xb5+"\x84\xf7?\x91#\xd9\x9b\xa0\xf4s\xa0\x90X\xc8\xd8\xb1eOe2|\xd1\x90\xc2+"x>\xef\xc2\x94D\x96;4\xc0Y&\xa5\x81\x80\x03\x97}g\x87\x0b\xd3\x0c\\\xe3\xda"\x8cW\x8f\x9du\x1c\xd9\xe0>\x80m\xad\xd6\xd8\xf0-\\\xca\x9a\x00O\xc3\x9f\x8ef\t\x1a\x99x\x9b\xcb@\x008\x0c\xd9-V\x03\xd9m\x06\xcak\x8cG\x95\xb0g\xe2\xfa\x91\x1b\xda\x04\x9bU\x13S]M\x03\xf4\xda$\xfeV\xa2\x84\xbe\xfa\xf9\xa1\x8a\xa0\xedW\xb5B\x9a\xcdPK\x0e`yK\x12?\xe0\xa1\xb0\x86U\xa2\xdd)\x98\xb6\xab\x80\xfb\xcd\xb4\xd1\xf9\x82_\xc3w\x04\x9ap@pK\xff\xacD\xa4\x0b\xd3i\xf4\xef\xd2>\x92w\x8at\xd5uW\xaa\xea\xac\xd5\xe9\x8d\xaf\x17\xd2\n\x8e\x91\xc7\xe2&W\x1ag\x7f\xa2\x0f)\xa6*\x93\xc4\xc0\x92\x96\xf79&\x0b\xaf\x0c\xb5y\xf4\xcd\xe8\xd6.\rT\xf4b?\x0e=\n\x9b\xfc\xb3\x00\xc9\xf4\'8\xce\x1c\x80\x1b\xdb\x14\x98\x0c\xc2\x91\xeb\xf7O\x02\x80\xfe\xdbQ`\x976m\x98\x1a\xb2\xab\xf9\xfc\x05\n\x83D\x1fP\xc4\x98Lr\x015v\xb4"\xec~\xaf\xd0\xe9\xf7q\xf3\xec\x8c\xb0Ug\x98\xad\xe3F\xb0\xeb\xf8\xa8\x90\xf4@\x8b_\xfe\xa9\x1c\xa8\xa2\x83\x82]\xa7x\x8d\xd8K=\x1bY:\x80\x9f\xc9m1\xde\xc2\xad\xedkFjQ\xf2\x05\xfcc\x00\x8f\xb7\xb4A\xd7\'\xb2i\x89C\xe3\xbb\x9aP\xbf\xf5\x13B\xa4<h\x12\xda$\xc0\xa7\x904\xc2\x90\xe9\x18\xe6@q-[\xf3[s\x84\'\\G\xe2\x87\xa7\xd3p\x06\xd8N\xf8\xe4/n\x15\x06B7\x88\xf3\xd2e\x7f\xabi\xd5\x17\xe6\x91\xd48\xd5:\xb0{\xd3\x95\xb3!v\xd7<\x08=\x9a|\x0f}\xa4E1X\xabJ\x81\x1a\xd4,\xa7\xbc0,K\xc3y"\x9c\xb7>\xb5j\\\xf2\xb8\x93\r&\x05\x91S\x8c\x13\xbc3\xe8\xe3t\xc7+(s\xc8q\xfd\xc2Ut\xcd\xa6\xf0\x1c]\xfc*\xee_X\xd9u1b\x0ca\x94< \x04\x16\xa6a\x04\xf9\xe3\xaf\x822\r\x03oS\xf4\xc5@\xe0T>\xbb\xa0\xe6j\x7f\x8eG\x08`\x8b\xf4\xa8\xc7-\xaf\'\xe8\x04] \x99\x14\xfcH\xd6\xb3\xfd\x84&\xa5d\xf1\x86\xb4{\x83"\x12\xcd\xd7\xd4x*\xa7>\nW\x9a\x0b\xe4\xa7\xf9\xcc\xa8\xb3\xfcN\xc6c\t\xf3\x86Z\xc2\x82 \xf6\xb9\xae\xebC\x1bb|\x14\xed\xb7\xa4\x8dZj\xc2m\x85\n\xbd\x08\x1c.\xf0\x0bV\x01\xa3\xbd\xdb}\x1d\xe3F\xdc<\xe8\xe5\t\xaf\xabPq\xd0\x00\xb5\x06\x19-\x86\xf3\x1e\x1f\x7f\xfar\x00\xa7J\x1b\x94M~\x8d\xabeLr\xe7\xf3\xb2\x8b\xcc\xfbp\xade\xe3\x0bc\xfa9\xd6\xe6ER-\x8d\xad)\x9c\xa3\x95<\xf8}\x01{\xb4d\x95\'#\x93\xf1\xdai\x8fL\x85\xdb\x1bn\xf7er(\xbb\xb2-\xc4lC\xa2\xa6,S\xad\xc0\xd0\xb2$\x8b6\xb9\xd0\xb7z\x97\x1a\x0e\xcfq\xfd{\x85`\xe4\x8b\xab:\xbb\xc9qB<Q\xd2\x8e\xd1\x089\xf8\x9e\x8bd\x0f\xb7D\xc6\xca\xc8%\xbfW\x1c\xd2\xd2\xf8k\x18\xad\x96\xb4uS\x03\x88r%\x00\x8b\xe4\xd9_9\x10\xee\xa3\xc5\xc6\xef\xf1\x94\xf9\xca.\x95\xf1\x15\x8f\xdf\xfc|\xae\x07i\x8e\x89\xf1\xf9\xe4\x10\x82\xe75\xf7c\xc5\xf7\xfa\xf6..\xf1C\x94I=\xc5F.\x98r\x1b\x18p\x1fP\x07a%\xc2\xb6!(\x97\xa1\x7f\xe9!\x16\xd5\x10l_\xe4\xdec\x99A\xf5\xda\x19%\x86p1\xb6X\xc8\x1aB\xee\xd9\x11"\x08\n\x91\x01dt\\\xddu\x06\xd0\x17\x82\xf5\xbbL]\xf6\x18\xfeV\x9c:\xdeP\xf4\x15e\x017#\\\x08|\xf8\x84\x7f\xfdi~G\x10\xb1\xb4\x87\xb4\xebA\xd5oX#k\x05\x19\xd2\xf89\xc9B#\xd7\xb1I\x1f9z\x9f\x19\xffA\xd4\xa4_\x9d\xa8+g\xe97\xf4\x80\xce%vDQw\x99V\xe08FAM\xecYg\xd1\xc6\x81\xee\x84`\xc1A\xb0\xb1\x04aG\xae<\xd4\xaa\x91\'h\xab\xb1`\\\xdc\x11\t\x06\xe3{\x07\x8b\xccWa\x82F\n\xc1\xe6>#z/\x9d6\xdd\xe32\xe9\xd3\x9e\xf8\x12\xb5N\x89<\x10h\xa1\xca;\xc1\x85\xd9:\xac\x13T\x85P2\xca\x0b&\xdd{\xfa\x8fI,\xc1\xe7\xc6>J\xe1\xf4\x08\x96\x8d\xe6h\xd5\xe5\xf0\x1cF\x0bT*St\xc9M\xb4\xa6\xc1\xd3\xf0\xb3?\xae\xc0\xb3\x9f\xa237\xd8z]F\xe4\x82\xbe\x9f\xc0\x9c\x1eB\xa3y\x18\xfc\x17_\x9b(c[/\xa4,\x0cmom\xc2u\xae\x05\x18\x08$.\x82\x9a/1]\x14pj0^(%k\xe5\xc6A|\xfd\xe1\\\xc7\xd9\x8by}\xfb\x1a\x0e(I9\xda\xd4\xb1\xdd>\x91A"\xe7N\xac\xcfzD\x99\xa6S=\x9c\x9b\xcd\xde\x19\x92\xb5 \xce\xe5\x87\x9b\xc4\x07?3\x93t \x10f.\x05\x7f>\x03\xd6\xe9(\xd2\xcdlZ[`/\x14\xba\xa1\xec\xd0\xc1\xe3l,\x84\\\xb8\xc4\x95GU\x811J\x96z\xe7\xd4\xa4\x90>|\xc4i\xa5\x8b\x92\x87_\xce\x1a\xe8\xb4\x18\xaaL\x95\x80]E\xc7\xe3E\xea$\xa9H\xdd\x13\xce\xdfT\xa6" NQ;\xbe[\xa9\x90\xd7\xa9\xd6\xe1\xf6\xf3x$@v\x88\xc7^\xfa\xc4\xf4\xa4\x86\x1e\x01(@q] \x9b\xc6\x82\xf9md\xe5$(,\xad\xcb\x11\xc1\xa1\xa6\xa9t\xb5_\xa0;\xfb\x17\xf2C\xec\xea>\x9dD\x97\xad&\xcb\x86Yv\x9cI\xd9\x17+\xf3\x10\xf7\x9d\xf9\xca]\x8d\x9e&\xa6\xa5\x8c{\x8f\xdd\x97\x8a\xec\xd1\xecq\xc4X!\xe8\xa4r\x9fL\xe32\xca@\xc6\x82\x8c\xf1-z\xf7A\xa28\xf8>\xc6D\xdah,q\x83\xd1t\xf4\xf9\x8do\xab\x0b\x0bA\xf9\xaa\x99\xdb\xfc\xf1]\xcb\x19\xd4\xe1Q\x8d\xa6\xe3\x8a]j\x81\x19\xcb\xb5\x97k\xa6\xa6\xe3\x9eE\xf9\xb9\xfc\x82!\x80\xb4\x0b\xae\xcd\xcb\xc2\x9bz\xd2\x08K\x8b\xbb\xbe\xe6"\xa1LlG\xdd\x9e\x9bT\xc3\x8fA\\\xa7\xd1op\x9f\x85*\xb9j\xfe\x9e\xf64\x10\xce\xc1\xf6q\x1f\xd3<\xd1V\x04\xdfg\xb7G\x1c\xfb\xcc\x90]\r\xa4\x95\xdb\xecH\xae\xa3\x9e\xb5>\xe9J}*\x05\xc3\x04\xbf\x10\xfc\x929\xd2\x1a\xf3\xff\x95\xd2[\xed\x81\xed\xea\xd2\xef\xc1z\xb0\xf5\xd4\xf0\xdei\xb4ykd\xe3\x8f6\xb6v)*X:\xba\xb2\xd6\x91X\x97O\xc3\xef\xa1\xfc2\xeb\xfc\xb7\xe0\xf3\xc0x\x06-!v\x93\xc6\xf1X0\xfd\x00D\x10~\xe2\xaf\xda`\xbf\xb7\xc6&k\xc1\xbe\x9e\x1a"\xe0,\xaf\xf7E\xa3\x13$U=U\xd8\x07\x90\x81s\xe6\xe7h\xb4B\x9b-\x05\x81\xcd\x8a\xf7\x83J\x8aB\x8b\x1d\xf4\xfd\x90\xaf\x15\xa6\xa1d\xb5\xb7$\xe4X\x1cb\x03\xe07*gFk\xaeXWR\xcf\xc1\xd4\x9fR\x93\xed\xd7S\x16\xccL|\xdc\x01\xa1\xd6$\xb9ty\x89\xfd\xf3\xdfT\x94\x1cS\x1b(\xda\x03\xf8\x96\x11\xbf4\xc03\x8c\xfe,.\xec\xf9\xdf\xe1\xab\x0c\x13\xc4\xf1H\xe9\xc4\x8av{\x15\xc7\x7f\\T\x14!\xb7fL\x0b\xa0\xe9l:\xec\xe6\xf4\x05\xe1I\x00[\x91Q\xbfl\x89\t\xc3\xa8\x1a\x04G\xcbE\xf6n_\x0fm\xaa\x1bmu\xa5\x1e\xbc\xda\x9e{\xe8>\x87\xad\x19\xde\x89\xe9%\xd2\x19?\xaa\xe1\x86\xfa\x8d\x16d\x19\x03\xc8:\xbc\xd2:\x0c\x86p\x1e`\x0e\xb0\xc7\xd9\xa6\xe3Jm\x8d\xac)\x08\x96\xf7\xd7\x0f>\x9cv2X\xd0\xe4\x81_]#D\xaa\xae\xe4\xd61\xedfT\xd0\xfcZ\xda\xeb\xe5\x0eN*v\x8d\t\xd9I6\xcf\xe1\xf2\xa8>\xf0:\xed%\xcf\xc6K\xe6<}\x82\x87\x90F\xbc\xf4>\xfc\xf9\xeb\xc9\x90\x07\x9b\xa8\xde\x81@\xac\xc6\xe4\xfb\x11\x88\xceC\xcbS\x83\xfe\x04\xbeI\xc2\xfb?\xc5|o-\x19S_E0@I\xd0\xdd\xeeQ\xae\xa2l\xf2\x05\xf6f\xed\x1b&\xee\xe7\xb1\x1f\xea\xe4&\xf3\xaa\xdf(14\xfe')
1
+ from hiddifypanel.models import *
2
+ from flask_babelex import gettext as _
3
+ default_ips="""
4
+ mcix.ircf.space MCI
5
+ mci.ircf.space MCI
6
+ mtn.ircf.space MTN
7
+ mtnx.ircf.space MTN
8
+ rtl.ircf.space RTL
9
+ mkh.ircf.space MKH
10
+ hwb.ircf.space HWB
11
+ ast.ircf.space AST
12
+ sht.ircf.space SHT
13
+ prs.ircf.space PRS
14
+ mbt.ircf.space MBT
15
+ ask.ircf.space ASK
16
+ rsp.ircf.space RSP
17
+ afn.ircf.space AFN
18
+ ztl.ircf.space ZTL
19
+ psm.ircf.space PSM
20
+ """
21
+ from flask import request,flash
22
+ import maxminddb
23
+ import os
24
+ import re
25
+ import random
26
+
27
+ try:
28
+ ipasn = maxminddb.open_database('GeoLite2-ASN.mmdb') if os.path.exists('GeoLite2-ASN.mmdb') else {}
29
+ ipcountry = maxminddb.open_database('GeoLite2-Country.mmdb') if os.path.exists('GeoLite2-Country.mmdb') else {}
30
+ except Exception as e:
31
+ print("Error can not load maxminddb")
32
+
33
+
34
+ asn_map={
35
+ '58224':'MKH',
36
+ '197207':'MCI',
37
+ '12880':'ITC',
38
+ '44244':'MTN',
39
+ '57218':'RTL',
40
+ '16322':'PRS',
41
+ '56402':'HWB',
42
+ '41689':'AST',
43
+ '43754':'AST',
44
+ '31549':'SHT',
45
+ '205647':'SHT',
46
+ '50810':'MBT',
47
+ '39308':'ASK',
48
+ '205207':'RSP',
49
+ '25184':'AFR',
50
+ '394510':'ZTL',
51
+ '206065':'ZTL',
52
+ '49100':'PSM'
53
+ }
54
+
55
+ def get_asn_short_name(user_ip=None):
56
+ user_ip=user_ip or get_real_user_ip()
57
+ asnres = ipasn.get(user_ip) if ipasn else {'autonomous_system_number':'unknown'}
58
+ asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
59
+ return asn_map.get(asn,"unknown")
60
+ def get_country(user_ip=None):
61
+ user_ip=user_ip or get_real_user_ip()
62
+ return (ipcountry.get(user_ip) or {}).get('country',{}).get('iso_code','unknown')
63
+ def get_real_user_ip_debug(user_ip=None):
64
+ user_ip=user_ip or get_real_user_ip()
65
+ asnres = ipasn.get(user_ip) or {}
66
+ asn = f"{asnres.get('autonomous_system_number','unknown')}" if asnres else "unknown"
67
+ asn_dscr = f"{asnres.get('autonomous_system_organization','unknown')}" if asnres else "unknown"
68
+ asn_short=get_asn_short_name(user_ip)
69
+ country=get_country(user_ip)
70
+ default=get_host_base_on_asn(default_ips,asn_short).replace(".ircf.space","")
71
+ return f'{user_ip} {country} {asn} {asn_short} {"ERROR" if asn_short=="unknown" else ""} fullname={asn_dscr} default:{default}'
72
+
73
+ def get_real_user_ip():
74
+ user_ip=request.remote_addr
75
+ for header in ['CF-Connecting-IP','ar-real-ip','X-Forwarded-For']:
76
+ if header in request.headers:
77
+ user_ip= request.headers.get(header)
78
+ break
79
+
80
+ return user_ip
81
+
82
+ def get_host_base_on_asn(ips,asn_short):
83
+ if type(ips)==str:
84
+ ips=re.split('[ \t\r\n;,]+',ips.strip())
85
+ valid_hosts=[ip for ip in ips if len(ip)>5]
86
+
87
+ if len(ips)%2 !=0 or len(valid_hosts)==0:
88
+ flash(_("Error! auto cdn ip can not be find, please contact admin."))
89
+ if len(valid_hosts)==0:return
90
+
91
+ all_hosts=[]
92
+ for i in range(0,len(ips),2):
93
+ if asn_short == ips[i+1]:
94
+ print("selected ",ips[i],ips[i+1])
95
+ all_hosts.append(ips[i])
96
+
97
+ selected= random.sample(valid_hosts,1)[0]
98
+ if len(all_hosts):
99
+ selected= random.sample(all_hosts, 1)[0]
100
+
101
+ return selected
102
+
103
+ def get_clean_ip(ips,resolve=False,default_asn=None):
104
+ if not ips:
105
+ ips=default_ips
106
+
107
+ ips=re.split('[ \t\r\n;,]+',ips.strip())
108
+ user_ip=get_real_user_ip()
109
+ asn_short = get_asn_short_name(user_ip)
110
+ country=get_country(user_ip)
111
+ print("Real user ip",get_real_user_ip_debug(), user_ip,asn_short,country)
112
+ is_morteza_format=any([format for format in asn_map.values() if format in ips])
113
+ print("IPs",ips)
114
+ if is_morteza_format:
115
+ if country.lower()!=hconfig(ConfigEnum.country) and default_asn:
116
+ asn_short=default_asn
117
+ selected_server=get_host_base_on_asn(ips, asn_short)
118
+ else:
119
+ selected_server=random.sample(ips, 1)[0]
120
+ print("selected_server",selected_server)
121
+ if resolve:
122
+ from hiddifypanel.panel import hiddify
123
+ selected_server=hiddify.get_domain_ip(selected_server) or selected_server
124
+ return selected_server
125
+
4
126
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
127
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
hiddifypanel/panel/cli.py CHANGED
@@ -1,5 +1,174 @@
1
- # 2023-04-08T16:23:20.485071
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xc4"\x00\x00\x12\t\x04\x00\xa28\xee\xb5\xaa+\xa0f\xd0\xa6\x88\x07c\x06w\xf4\x00\x00\x00\x00\x00\x00\x00\x00\xda\xb3}\xe44\xc0\xbc>\x19\r{\xb9\xf4*b\xf7\xd2\x97F\xd2Gy\xe4\xed\x1dWee[F\xca\n\xb6\xee\xe9`\xf1\xad\xda\x99\x9dc5`\xb8\x16\xd3\xaf&X~W.?\x0bxa\xbf\xc5\x1c\xa4\x1f*\x94\x9a<\xd3N\x8d\xe2\x13\x16b_Akt\'\xbdU\xd8\x0f\xa6\xa0(\xe2a\xc5\x1aOjdJ\xaev\x01\x0e\xef\xc1\x97\xc28\xc3\x0fZY\xc4\x83\xaf\x03\xa8b\'\x10VZJ~\xb6\xbb\x9d\xd0\x16\xbc\x91\xc6s\xd5\xac\x13B\x98."Q\xa0b\x14\xf0\x81\xbc\xfa\x08,\xd1t\xf0\xc1H\xe8\xc2\x8eq\xf0Wp*\x97S\xc3-\xa1Q\xc9\x14\xa9\xc6\xdc\x0c\xf7\xab\\\xbf\xbf5\xf5ezU\xbb\xde\x05V\xcb\x1e\x80\xf3\xee\xc6\xc9\x08P\xa3d\x8f\xe3\xdc\x92\xfc\xedUi4\x8a\x97R\xbcuQ`\tP\xea\x9c\xa8\x15cm\xae\xfc{\x90\xc3\xb0\xdf\x82Kk\x8aFW\xcb\xc0\xb8BH\x9f5\x03\xca\x83\ri\x01\xe3\xb7\x04\xaf\xe8\xd2\x80\xafX\x0fVrB\x96\xe7\xe77\x1c\x9c\xf6\xb9\xa4\xdf\xc14\xb0\xa0z\x10P\n\xc2\x99\xaa\x8e\x14\x02\x92_@U\xf2\x17U\x0f\xb7\x157\xe2\xf8Z\xe79\t\x8a\\\xc8g9^\x06bb\xe3\xa5\x97\xe7\xe1i\xf9\xd3\xf58\xc5Dd\xb7\xe1\xd0G\xca\x07\xb6\x18\xf2\x87@v\xf0\x1a\xc3\xab?\xd7\x9a\x91h\xd4z\xa1\xd8\xc7j\x86^^^\xcc\x0e\xaa\x9b\xc8\xd7\x19twu\xd4\x88)\x12\xf3\x94\xae\xf1\xe6\xee\xc4\x1e\x18\xc0\xbf\x0f\xfe\x82jV\x91v|c\x99h\x83U\x0ei\xb23\xec\xe5(a$d\x86\x13?!\xd1D\xb8@\x05\xde\x8b\xd8v\x95\xaf\x90\x17\x80\xc2\xb4\x9c\xe7\x92\xfb\x9b\x99u\xaao\xd1\xbfC"z\x1c}<\xcb#\x9c\x06G\x1ai\xf8\x1c\xc5\x00*\xcef\x19\x92\x9d\xc6\x81\xd8&:\x07\xc18\x1f\x10^\xdf\x026\'AW\xb5\x1c\x17\xd5\x86O\xf9\xa4iaD/\xa6\xaf\x1a\xee\x12\xd1:\xd1\xcb(\x85%m\xf4ygI\xe0\x1a\x990\xbf\x00\xdeJ\x07\xab\x9buz\xbe9nZ=l\x0cGE\xb0\x99>\xfc\xd5R\x0b\xac\xf2yma\x10\xde}BW\xcc\xf4J4\x131\xab\x18g\xcbT\x87\xdf\x86&-\x08w\xb5\x07AX|vc\x87P\xc1\x1a\xf6\xe9a:\xd4\x81h\x19\x96C\x06N!\xdd\x1a\xb9\xeel\x1f\xd7\xf7\x9ajT`\xa8x\xdd@x\x89\xd7\x1bI\x0e\x94\xce\xaa,\x95$LP\x13Z\xe7+\xcb\xe5A\x1f\xa6"\xfd\xe8cF\xe2\x7f[\x85\xdf\xca\\e\xf5p3\xe4\x93\x13\xe8k]\x9e\x9d*\xcc\x81\xbbtS\xb0{u\x89\xb1\xdcG\x01(\xf1O5\xa3N6Uf]\xff5\xe4\x98\x85QK\x13\x1b\xde\\\xda\xc1\xec^\\\x1b\xcf\x01\\\x19{\xfa\xa8W 5\xb1\x9f\xd2\xa2\xc37\xe1\xe3\x04\xea\x87oU\x7f\x02~\xd7A\xd0\xb2,\x8a\\\xb9\xd3#E\xf8\xd9\x04\x92\xf2\xf6\xcf\x16\xa6n\xd0\x97\x1c\xc5{\x87\xdf\xdadi\x9b\xcb\x8c\x1f\xa7O\xfeA\xe3\xb0)Ji\x95\xd2\xc8a&\x04\xfe\xee\xb4V\xa9\xfa\xfcA\xdd\x15\xce\xc3V,Z1\x8b\xfd\t\xc8\xf9D\xfd[\xae\x14.\xcd+\x1a(i\xb8\x80\x16\xc5\xff\x0e>3\xa2\x89\x8fd(\xba.\xb6{\x88\x8b\xe0[e3\xa1\x06@\x92\xbaA\xa2lp}m\x9d\x16\xa9f\xd3\x99\xf5:\x1e\xe4\xefA\x8d&1{\x18\xce\xb9\xdc\xa9i3\x94I#\xe6B\xd8\xf4\xa2\xee\r\xe6\x16\x01\xe7i\x96\xf9\xf5\xdd\x98\xd6E\xf8 \x1f\x95\xee\xdbgqI\x00\x05Vw\xfdm\x1e\xdbYm0;\xd0m\xa7Z\xd9\xf7(rY\xd6\xf9=\x19\x9f\xe6U"\xedo\xda\xf1\x8f\xa15t\xdeN\xa9\xd0\x1b\xe2\x93\xda\x9fCKF\x91\x8e\xdd\xfa\xa1\xbd"d~0w\xa7\xc4^\x07\x05\x16\xd1s7\x82\xffkh\x84*\'\xc8\xff\t\xecN\xe8\xeay0S\xbb\xcf7\x074\xf4R\x12\xb04$D\xe0\xf3I\x81\xf7\x17\x1a\x9d\x1e-\x8a\x1a\xa4\xbbO\xf3^\x91\xab\x82\x16\x1e\xf2<\xbb\xda\xe2\x83\xbe\x87dc\xfa@\x02\xec\x1d\xdd7)\x9a\xa0\xfaJ\xf6<\xbe\x0ee\xee\xd5\xf8S\xcfJ\xc7\xc57Z\xc9Mj\xb2V\xaa\xd0\xe4J`\xc1?_\xfae\x9e\x99\xda\xff?#\xf5\xb7\xd6\xcf\xf8%\x11 \x0c\xfa\xc5Z\x9e|^\x04\xb1\x15\xa9\xca\x8d\xe8\xe9\x8d0\xcc\xa8F\xc1j\x1b\x87\xe9\xb0}5\x86\\x\xd8_\xa1\xe2\xad\xa2t\xf9\xef\x07i\xc8\x8f\xed\x10\x89$\x19\xb1dd\x0c\xferu\xdb|3Zd;\xf9\x13@\xcc\xbf&\xde\x1c\xe1x9=\xb8O\xadg?,\xf3\xc8\xec\xee~\xcdN\xd8\xbb/\xf6G\xb2P\xca\x96\xa0\x1f\x8a"\xc2\xba^VqHQDE0=O\x1c\x93e\xbe\xa6_s\x9el\x0b\xe3\xd95\x8e\x1a\xacq)\xb6\xbaf\xf3\x19\xdb\xd0\x02o\xb1\x86\x03\xc3\x95\xf19\xb4\x16I\xfe\xae\xdfUDjLzq\xa5y\x8fokv\x8e\xa3\xc8eog\n\x13s\xfd\x9d\xb1b`\x91(\xca|\xbf\x06\x08p\xb3CNB\xf6\xeb8T\x89U@v\x9d\xfe\xb0d\xbe\x04\xcf\x8ap8\x1f\xb7\xb4*S7Y\r\x99\xddt\xf6,\xba\xc2\xb7\xf7\xceJU\n\x9a$\x01\xc6\xa4\x0b\xba\xff\xa0\xd8\x8e\xc3C\xb9+\x10\x94\x15\xba\x13Lz\xfeO\xca\xa7=\xd1\xffngP\x8d\x92\xaa\x1e\x1b\x85\xf7t0\x1b\x04\x08\x9a\xb2$(\xcdXOy\xee\x0e2\xa2k\x7f\xb2D\x89[\\_4\x08\x0f\xec\xe3\xc1\xfa\xed\xe1FP\xdd\xdc\x89\xc2+)[3\xcc\xe0L\xf4\x1c\xefU\xe3S&TfHG\x99q8\x8c\xfdl\xea\xe9/\xfe[F\x04\xef\xcc\xf4\xd7\xd0{0\x91\xebC\x93\rw\xeb\x91I\x8e\xe6ti[\xber\xe9\x8e\x94\x07H\x9a*\xa3\xd4va?d 9\xb3\xea\x84\xf4\xc8\xb7\xfc\x84>\xc7\xe7\x9d\x1f\x87\x831\x89\x98\x83\xc9:\xea\xeaJ\xa3\xc3\xa9u\xc9\xe6\x7f6\xa3\xda\xe8\xe4\x14?\x18\xe4Q\x8f\xe1\xb6B\x93\x93\xbb\x171\x82_\x9c\x06V\xb9\x9c\xb8\xdd\xe2k\xc2P\x02\xb9-\xd0\x9f\xc9\xc8\xc2\xec\x0e\xd2\x89\xe3\x90\x13\xec\x03\x97\xc0\xca\xa1\x11<`\xd8)\xc6Q\xad\xf7\xad\xbeSy\xc7\xa9C\xed%\x87\xa8g*\xdf$\x8b\xf5\xf0]kf\xf5\xc9\xf8H?h\xdfSH#\x88\x17\x15\x99\xe7n\xa6\xc0{X"\xe4^\xcf\xbfP\xd1K\xdf\x01\x0fW\xaa\xbft\xc7K<\xfat\xd1Vx8& Pi\xb0\xbb\xb6RS\t\xbe\x1a\x18|\xee`\xe7\xc5=pFUjAsi\x0b\xfe\xe6\xc8\x04\xb3\xc4-C\x8e\xe2\x842xy\xf2\xf5k(\x0f*\x8a$\x8eG\x03Kn\xf5\xceG\x05\x02\xd7\xaa\xb1\xa5y\xf1\x1c\n!\xadU\x14\xb9\\\x9bB\x1bw\xd1j\xba\x06\xff\x94_q\xa7OL\xfd\x81\xfa%\\\x99\xf9\xe8\xf7\x11\xe7\x03uU\xe1Nt\xf7\x86\xa5-\xd7\xb6\xd0o\xa3o\xaef)_R\xb3z:}\x1b\xb1%\xea\xb5\xe7\x10\x1dl\x8fh\xab\xe8bi\x9a\xae*\xd8\xdeT\xbb\xbb\xb3\xb7\xbf\xaci \'\xdc?\x91"\xcbD\x86\x02X\xdau\x11\x08\x87^\x9a\x16\xaek\x9c\xcb\xd1\x82\xf9\\\x89\x17w\xeb\xc6a`\x05\xf1d\x92l\xdfv\x06\x8b\x0c\xe8N+u\x91\xe4l|\xed\xe58\x03\xb8\xf6\xce\xac\x9a\x98\x01AS\xec\x07\x9f\xf2G\xc9\xae7\x93e\xd6\xb5\x96NT\xe6~\xb3\x93\xc0\xd0\\U\xe5\x89\x91s\xab\xf5=\xbe/\x9fd\xdd\xa3H\xfa\xaa\\Mo\xc4"\xea\x82\xc1\xcdP`\xed\xb4\x1cR\xed\xfb\xdf\xd6\xac\xb7\xa9B#\x9b{-?\xe9\xdec!\xa80C.c\x0e\xc9E\x83`\xe4\xb6\xe1\x8f\xa8~>\xc2\xf2\tZ\xc7\xd6Y\x03\x05\x88\x1b\x14\xb7Y\x8aU\xeb\xc7\xe4\x18\xb5\xb8\xa1`\xff0N\xe3|\xcc\xa6\xf5\x1b\xe2yw\x14\x82\xe9\xd6s\xf1\xab\x87\xbcg\x05\xfe\x85\xdd\x16\rz\xc4O\xd5\xa0\x89\xe4\xa2}\x18\xea\xddi\xac\xe7\xc7 \x88hU\xd5m\xb2J\xda\x08\xc2\xfe\'>\x97\\\xb1\xbbR\x97\x95S\xc7\xe4,\xc7\x8b\xba?Cs;H,\xba\xdb\xc8\x13Q\xdfY\x93\r\xc1\xb7FSm\xe4x\xd8\xc8\x94\x1c\xa8^\xfa\x1f\xceh?\xed\xb8\xf6:\x9a\x04\x17\xe2L\xf9\xa0\xc6)\x97\xdaz\xe0\x11\xeb<;3e]\xd5lS\xc2J\x99\xcb\xce\xea\xfa\x88\x8d\x9a\x08\x01(\xe4)\xf7\xcb\xa0\xdd\x16v\x1e8\xdaK\xad\xb7\xc2\x90\x06\xfbC\xf3\xcd\xb8N\xa3\xfb\x8b\xa0p\xc1D\x1f0\xa4\x12) \x9d\xc62\x9c"\xd1\n{\x95\x80\xcb\x00[flJ\xf2\x99iP\xcf23\x82\xb4\xa9\x80\xd3\xa2\x17\x931Z\x82\xee\x06}\n\x7f1`\x86b\x08#\xcc\xd9k\xbf1\xfe,<r\x86\xf5\xf3\n\xe7\xa7\xa6\xa8\x13Hs\xf9\xe8\x10v\xa0\xe7\x0c\xe3\xf6V\xae\x0e\xc2\xa6\x12#o\xb2\x91]E\x82\xb1O\xa5\xa9(\xab\x16\x16\x11\x84\xbdi\x8ff\x8e\xdf\xf1^\x15\x8a\x9f\t\xb4\xca\xfc\x1e./\xe3S\xdd0\x94\xfe|d\x82\x02\xef\x9a\xd2%C\t\xdb\x00-\x99\x15\xffL4[\x9b>\xc4\xff"/\x1f\r\xa5Y\x1czo\x8f\x0b\xe9\x88\x1c\xe5\x9e\x94\x01?\xc5\x0c\xbc\xbd\xd7\xb8~\xc5\xd7\x85\xbb\x8c\x8c\x04\x11\xf7\x86\xc8\xbf\x8d\x8e\x13\xf3\x1b\xa0\x10\xd8\x8f\x05\xa9\xd6f\xdc\xae\xa5\xc0\xc5J|\xc9R\x06Z\xd8\xf1\xb3\xa7\x15\x06\xaa\xfd\x00\x0cf>\xc2\xb1\x97\x7f\x15#\xf0\xd4\xf8>c\xda\x94\xeb\xa9\xd9\xa0\xc6.fPwE1\x1d\xc2\x94&z\xa9\x1c\x0eb5\x90\xad\x85\x9b&\x9d\xdaT{\xfa\x06\xbch1\xdd\xf5XXi\x12>\x03\xaf,\x83\x15\x1d\xa1\xf1Bm\xf7P\xb2\xfc\xc8\xac\x07\xc0?\xbc\x91\xd4\xae\xa7\x04\x8c\xccS\x1b\xceM$\xb1\x0f\xd1\x9aEl\xa5\x18\xbb\x14\xd0\xb9\x90mS\xa2\x03\x91\xa3\xad\xdde\xda\xa3\x19\xf2\xcfF\xa5\xccG\xdf4VV\xae\x12\x893\xe3mz\xb1\xef\xd8\x80\xea\xdf(\x1e\xaa\xd8.)3\rz!\x1a~\xb7\x85\xb0\xa2m\xe1*\xbd\r\xdfmS\x11\x037p\x053:%\xd6z\xf9~WX\x9a-f\xfc\x88x\xe1s\x1e\xd8\xe0}\x8d\xc7}\xdc\x7f\xe1L\x18\xa0f@\xfe\x1a\xa2?\xed\xbb\xb1\xf4\xf3_\x02L?\xb7`\xbb\x85\x08\xeeTE\x08\x88>\x19\xda\x19\xc4\xf7\x0f\x94F\xec\xaf;)&:\xc5\xafc,Z,H?=\xa5\xe3XH_\xcaC\xded\x8dW\xe7\x93\x001\xed\xa6\xec/\xf6\x85\x81l\x80\xb2\xb0\x16\xe6\x99\xde\xcc\xa3\x05QQ\xbb3\xef\x0f\xb9/\x99H\x9f\x92=\xec\xa2<\x18t\xc5D\xcb \xe83\xddS?s6Q\xad\x7f\xe1\x85\x89@\xd0\x99\x8c\x0e\x8b\xa2\x9b\x8c\x8e\x11~\xfa\xd5\n\xb7T\xa2\t\xd9\x8b\x9d\x96e4\x0f\x92\xc6\x1e\x99K\x1cN\x08\x16k\xfbH\xb3cm\xc1\x18\x89\xf3\xa43\xb7\xa8\xb1uc\x8d:|\xa3)\x97\xbc\xe16S\x06r\x99\x0fVc\x12\xee\x91\x02\xe9$\x8e\xcfm*\x04\xd6\xf6\x9f\xce\xc3y@{\xd2\xd9o]\x1f\x06}\xc4\xa9\xd9\xd0\x0c\xfa6\x9e\xa1-H`ig\x84\xf2\xd8Z\xb5\xef\xf1\xe7c\xdd\xd4EO\x91D\xe7\xf2\xc3\xf1\x06\x107,\xc7\xc0\x08pE\xd5\x0c\x04\x9a\xa6\xd82F\xb7\x8f\xc6\x8d\x16\x95\x19\x91j*f\xecI\'\x8eR\xf4P>\xb1"\xa01D\x9fay<~F\xd6\xfe@Z\xf7\xc9_\xe2\x84\x8e3\x84\x10[\xf8Q\xb6\xbd\xefQ\xd2\x92a\x17\xd4$\xfd5p\x05b\xa6\x9eD\x8c\xe6\xb3\'{\x8b\xeaR\x19rE\x83\x13a>Q\xc6\x9cZ\xc9\xa3\rc\x12\x0en-\x96\x80\x9c\xe2\xc5\x08Ot\x93\x8d5\xb9\xaa\xabvaA\x94^\xff\x01\xb2\\\xb7\x17\xcaB,\x03\xe9\x18\x93;\x19V6n[A\x03\x18\r\x0em# \n\x82~&(\xfa\x95\x06\xd5\x9f\xfb\x96bB\xfa\x8a\xdb\xff\xfb~\xfc\xf9*\x95\x99\x94\x07l8\t\x05O\x93\x07Q\xd8\x1e[m\xe7\xfd\x1fj\xaf\xb6\xa2\x8e\x19!Y\x90\xa2\xf8Q;jV\x89\x18L\xf2\xa2\x92\x1f\xaf\xfe\xa7\x8a-W#\x91\xaa5s\xe1\xb8\xf6\xc9\xd0\x95\x13\xf2S\xd2\x8d\x00\x1a\x8e\xb7d\xda\xc4AV\xf90Q\xbb\xa4\xc8\xc5\xeb\xe7\x05y\x17s\x1f\x06\xa8\x9eL\xb5\xd1\x1a\xb6A\x1f\xf1S\xa3\xcf\n2\xbfA\x9b\x08\'i5^\x84\xf1\x87H=7\xa8S\xa5\x01\x0b)\xeeMn\xedM~\xcc\x18\xcc\x11\xd1z\xae\xbfQ\x9c\xef\x01.\x80\x806\xa5|\x96\xc5\xc1\x82\x84=\xfe\x1e\xea\xd5Y\xaa\xf2\xdb\x9f\xe0\x17DNJ\xd9\x9d\xac\xd1f\x8e\xcb\x1am\xe4\x9a\xf3\xa74\x88\xff\x7f\x7f?QIn\xc5=\x18%\x81\x9bw\x16\xc4\xbe\xa1\x88\x1b}\xd9\xf0X!\xb6\xfa\x89j\x0c\xda\xfd!\xfcR\xa0\xb8\xdd`Py\x82te\x85i\xb5u \xcbQ\x97\xec\x87#\xb5\xd5l5\x91\xf0\x96+\xb9\x19\xa6\xe3\x1b\x8b\x0f`S9>\xe0\xe5\x98CMLc\'\x89\x17\xfc+W\xd0\x88I\xf3\x9ed\x91\x1c\x90E\x8dV\x7f6\xd6H\x13G\xb7\xc1\xa1\xfb\xfd\xbd\x8dr>1\x9a\xca@\xf0\xac\xc1\x0f\xbc[\xbf\x07\x9dh\xfa\xa2r\x8c\x18\xb5\xa7\x97\x86Q\xeb\xbb\x81\xf4\xd1\x0e\n\x8e\xb5\xb9u\x01\xab\xb2\xbc\x98\xa4C\xeb:\x03HH\xe8\x9eR\xa5\xe6\xf3\xcd0\xd3h\xf8\xad\xe7#\xc0\x82\xc2\x11"uw\x1e{\x12\xce\xee\xaa\xbe\x89\x04\x0e\x1a\xd3ViY\xca\xb4\x15\xa0\xb8B\x9ax\x1bKcA\x84\xb1(^\x8b#\xc5\xfa\xfeP\xcd+\xc74\xe5\xbe\xdcN@\xe7\xbd\xc2\x98>\x19\x8b\x84q\xbax\xe5\x07\x9f\xb8\x9az\x0fj|\xe2\x05!\x81\x16\xad\xb1n\xd5?\x1e\xd5!Yh\t\xc2\xf9\xed\x10>:\xa2\xbf]\x88\x8aF\xf7v:\xc1_\x00n\x8c@\x9c\x06\xd6\x0c\xd0\xa4\x85r\xden\x14z\xa3\x05\xda"\xec\x8a\xcaA\x1a\x85n\x1e4A6PVR%x\xb0\x81\xfdEH$j\n\xe2\x0cd\x0c\xe1\xa4i\xb6\xbaBG\x1c?\xda\xd4\x07&\xcc]\x12?J\xefI(,\xecU\xc0B}\xf4\xf6\xeb\xcaD\x03\x8d\xfbJ\xd2\x8e\x13\xe8\xbb\\\x03z/G\xf5\xb6\xc0\xb80\xab\xaf\xean\x8cn\xb0\xf2)\xa0s\xfd\xb1\x1c\xd2\x01-\x85\x93\xa5"\n\x06&\xc3`\xe94"\r<{QX\xe7\x89\xf0Fc^3\xcb{\xe3\xefw\x0b\xb82\x96\xa8Un\xd2C:\x11\x16I\xb2\xf7@s\x13\x0b\xe3\xbe\xaf\xcf\x01!\xcd\xf9\xe5\xf6\x85+@j-JN3\x16".\xfe(\xcb\x027\xbe\x0esN\xcd!\xe6\xa6>M3\x9c\xffH\xe5\xcb\x98T\x9aKw\xc2\xe9BP\xcbL\x94\xa5\xe4A\x0b\xfd\xf5\x16\xbe\xdbn\xe3\xee\x1c!\xad\xab@\x88\x87\x9cP\xd7rwAl\xdbX\x0c\x19\xe3xS\xc4\x9dP\x85\xc3\x89\xa2\xd0\xb5\x13\xe9fo\x11Jng\xa4t\x86\xa5\xc7\x1e\xb9\x04\x97\'\x89\xf4e\xe0$d%TVr\xdc\xd6\xdf\x16\x8c\xcf\xd5\xbev\x0e\xf8\xa6\x80\xe1LFB}\xb7\xc3\xaf[Q\xeeG\xdf\t\xf19)\xb6\xa1vZ+\x7f\xd3\xcdy|2\x90\x0c\xd9\xba\x8f\\\x9b+s<:B\xe0\xb5\xa1u\xc7\xb9Y68\x01>\x7f\xbb\x92\xd8\x9f\x1cl\x82\x99Q{\xcc\x90\xd4\xa0\x9a\xfa\xcf\xd4\xbe\xb4\x0f\x8bE?\xed\xab\xa6\xd5nJ\x91\x17\xc3\xb4\xd1\xa4\xe5\xe7\xcc\xac!\xa6\xc9\xf0\xe4\x82D\xf6\xebK\xee\x173k\xf3Q7\xc6\x93e\x18\x9eC`\xa1\x1a\xa4\xdb\xa7\x84M\xd9KN\xdcg5\xba%\xd5\x1f)^\xc7\xdd\xe1\xbc\r}\x10\xd2\x1e\xf38\xfd\xc5\x146<?\xb1\xfb39\x01\xb7\xdcdQ\xa6\x97Q\x0bZ\xf7\xbe1\xbdx\xa9\x046JN\xe8<\x11\xa51`}\xaa\x01\xde\xb7\x82z\xb8\xea\x18ZGGL\x9b;\xb8\x83J\x7f`X\x07\\5\xf6k\x0c\x80Z\xc5\xd7\x91:\xeaf+\xc5\xeb\xb0"\xeb\xfa\x93?F\xf9\x8d\x85\xad\xbd\xcb\x95\x87\xad_pa\x02\xa5\xd9`\x96t\xeb\xae\x9e\x9e\x9d\x11\xc4\t\xc07\xad6c?u\x1aN\xe2;z\xd5\xa9\xedv\xf1\x07\xef\xa4\x84\xad\xefw\xef\xf4%\xe3\xcaO\x0b\x06\x9c\x07\x99o\xf4s"\x92f\x86\x88vS\x06\x80\x13Y\x0f\x1b\xc9\xa8R\xf2N\x9d\xf09\x9e+]\xa8jsxj\x8b\x1d\xd4\x99V1\xd5\xa4s)\xfb\xbe\x93\xeb&\xe9g\x11e\x89\x80\xad\xd1#[nfi\xdf\xab\xf8\xba`\xf6=\xd3\xf8\xf6\xbcq\x15\x8f\xf2\x0b@|\xb7i\x94\x9bj\xf7\xcf\xda\xb5AJLB=Y\x14\x836\x16x\xe4\xba\x043\\\xd8\x8a\xbc\x19pIe\x1a\xc4E\xb6\xc4;\xd7,\x00\x9c\xd2\xda\x99\xd0\x8d.u@J\xca\x07\x8b\x020O>-o!M|\xce\xf1\xc8\x85\x98(\x16\x81\x08\xa8\xc3{\xd78+\x85\xee(\xedH\x1d\xb1\x02Ov\x90\xb6b\x8d]T\xdd\xd7_~\\ \xa5\xc8\xd0%B1\x8f\xa8\'~\x83\x98a1\xfc\x1b\xa71C\xeeQ\xfa)c1y("\xbf\xdci\x96\x03\xd7\x07Q\xb1\x95\x84r\xb2f$\'o\x1c\xfe\x91\'b\'[\xc1\x0b\xa3\x90y\x1cT\xcb\x16\xa1\x94\xdd\x1a\x19\xb2\xdb\xf5\x15\xa0=\x11\x8a\xdc\xd8+\x8c\x94\xa6\xc3\x87/\xd9~\xe6\xd5/S\x9f+\x14\xfdX\xc9\xc0\xce9/\xe8\xde3\x8exH\x1b1\x1d\xed+\xd9\xe1z\xd4b\xbdI\x7f\xf8\'\xb9\x92`\x98C\xbav\xc4Em\x84EU\xce\xd9\x15l\x92\xa7K\xb97\x02\xea\xf1ru\x8b\xae\x88\x81@\xa7\xe9\xabF\\H\xc0#Q\xd2_R\x94M\\^\x134\x06\xb5\xcb<9RW\xd8\x97\xa2\xae\xabM\xf9\xfb^zS\xfd&\xd3\xf3\x90n\x83\xd8K\x00%j\x13\x16\xfab\xba\xb5\xf5\xda\xeb\xec:\xd9$9\xd6\xf2S\x05\xa4\x9f\xd6d\x87\x0f\x16\xd9\xdaG\xa1?\xb7\xeb\xc5\xb8Q\x88\x06X\x181\xc5\xa4H\xd3\xb8\x9b\x94_\x01!\x15\xda\xde\x00,\x10dR\xcd\xf8\x16\xa0\x9d#\xad"\xbd\x0b8\xf8Q"h\x19>\xba\xcd\xf0\xc5>z3|\xfb\x93j\x87\x84!\x04\xf7R\x17\xfc\xd0)\xc3\xaa\xb4\xda\x98\x13(l\\?n\x9bxv\x00\x91X\xf88\x97\xde\x1eoN\x07\rB\xa9|\xfa\xe0vu\x1ao\n\xbb8\xea\x11\x15;\xaeJrX\x83\x99W\xba\x1fX\x15\xce\x8e,\xb2\x7fw9\xbb \x11 \x11+w\t\x05\xe6\x15\xf4M\x868\xc3|\xae|\r\xdf\t\xbaxvC\x1e\tZL8\x04\xbeQe\xe9\x9d\x8e\xae\x07\xfe/\xf9\xd6\x93\xf8\x02v6H#\xd8p\xb3&!\xdc\xddS\xd9\x14\xc9\x16\'\x9b\x07(\'ym\x9a\x14@\x84L\x8d\xbe:}\xf0\x14,\x8a\xe0\x10l\xc6a\xf6\xbd\x1c\xba\xf7\xc2\xf0\xa9\xf3\xe9e\xc8\xf7zp)\x89\xec\xd9TJL\x16 \x8b]\xc3B\x11\xa1u\xe1\xb5\xe90l\xf1\xae\x961x\\\xa8\xadQE\x02\xf1\x96F\xab\x1f\xe7(\xc3@F(\x1eS\xdfpDf\raBP\xa4\xa5\xdf\x14\xabe\x1c\xd0!\x8b \xc1F\xed\xdf^k\xf7\xbe\x13\x8c@\xa0\xdca\xbc\x84w\xa0\x0b\x9e\x93I\x1d\x1d6\x86\x15HbK;\xe0\xa1\x9aF\x0f\x18\x89\xcc9\x7f\xa7\x82\xd3\xb0ct\x96\r\xcd\x1c\x08{\x7f\xbbc\xa0\xd4\xfbU\x143\xafl\x92\x8f\xb9\xa3\xca\xb1\xef9\r\xeaY\x97\x9dr\t\xa4\xde\xffM\x0f\xe3\xf86\xbf\xb9\x1b\xf4,\xa2\xa6\xa1b\xfb\xa9[\x92P\xf9f?1\x05\xbc\xf4\xa8nP>\x1eh\xeb\x96\xb5\xf6p\xdch\xb1\x07X\x13\x8a\t\x838\xeb\x004\x01\xed\xc6-/~\xa3o(\x14\xff\x89\x11\x0c}K\xa0\n\xb4\xbc\xa0\x15\x02l\xeb\x99%\x1fE\xdd Y\x8f\xf5\xb4F\xeeyb\xde\x91\x08=\xcd9\xccR\x96\xd5\xd9\x11\x9f\xcfbp\xa2\xa3w\xfbS#}\xaa[\x8b\xbf\x83\xb9\xe7\x8d5W[\x0c\xe6q\xb9\xfd\xa9[\xa9\xcd^\'\n\xe3\xba\xfdf\xd5\x04\x1e\x8c\x18\x88^\xbe\x94\x1c%\xd6>\xf1)\x146\xd6sP~At\x86\xd9;\x7f\x83>\x0f6\x1d>\x0c\xecSk\xa2\x14~\xf5~>\xa9 \xfc\xf9:\xd2U\x08\xda\xee\x91\xf7\x98\x15\xb0/;Gs\xe3\'\x95\x88<D\xa6\xac\xa0.Q7gkjr%\r\t:\x9a3\xa7\xb5>\xe6\x9a#\xf2\x98\x8b1"\x1e\xed>\xbehs\xa32\xca\xe9\xd4\x055\xc1\xe9\xd2kcqE-\x99\x8f\xc6\x88\xd6\xea({\x1e<\x8d\xe2\xda\xcc\x11b\x82v\xb6\xe7*\xe2=\x89+8\xf0\xac,l\xa1\xeak \x9c\x8c\xda\xc3\xc6l\xae\xd8[\xe7\x13\x8d\xc7\xc7\x1b\xbc!\xf9\xca\x19I\xae\xf9\xef\x97\x8do\x80$\xa7\x85\x199\xaea\x9b\xeb|>+\x8a\x7fD6\x01\x90Y\xbeVU\xa5R{\xb7f|\xd8\xa8\x02Vj9\x0fAb\x03\xd5\xd3\x9c\xa0g\x10\xc1s\x96\xd4:\xb8\x7f\xf2\xb1\xc1\x8bl\xf8\xff\x02\xea\x01\\\xe3\xa1I\'0-=,M\xca\x02XK\xda\xa2\xc4\xcbZ:55\x98g\x1c\xf4\xbf4\x7f#"\xcc\x86\x82\xec|\xbe\xdf\x0c\xad\xd9\xfa\x94\xa1\xc8lD\xab\xa8\x83c\xf5w\xbb\x8c\xa0\x94\xc1\xd2\x18\xad\xf1\xc0\xa2\x10\xee\x12\xa7\x02\xba\xf8\x8c\xa3\xf7a\xfe\xf6% i\x087g\xff\x9b\x9d\x8a6\x10\xb3lJ\xfex\xb9S\x07\x8a\xf6\xbd\xff\xb5\xf5\xd7>\xc8\xa3\xdcnk\xa1\x9a\xf3\xf0[\xea"\xf4\xee\xf9\xc9/\xab\n\x9a]\t\xbfML\xeb\xb3\xa0\xab\xdb\xc4\x04g\xc2j\xdb\x82\x1b\x9c\xc1\xbbA\x01$v\xcf\xdb?\xcb\xc4%\x10B\x05\xe5\xc7\x91\xfb\x96\xcdv0S\xf6V\xe1\xb5K\xdb50:\xa3\x1b\x04{\xdc\xd9\\\x7f`>\xe6Ta\xbbx\xa8Nw\xea\xd2)&\xee\xd2\xbcM\xbf\xb2\x89\xd0\xb0\xff0\xa4-`\x1b\xa9\xc7\xd5y\xbb17\xeb\xd2lD; \xb7\xe0g\xcfp\xfbK\x87\x06\x11\xf8\x85\xf7\x7f\x8f\x1d\x18Z\x0be\x9b\x11XK\x9a\x8f+\xc8\xa0k\xa8"*\x08\xf1ISL\t\x85r\x14\x07\x13\x90\t}0vy\xaep\xbe%\x1d\x99\xc1\t3\xa8\x04\xb1z\xa1=s:\xbf\xd0\xd4\xee\xc8Gmk\x12e6\xbf)\x99\x0c\x91qK\xa8\xed\x08\x9c!\xf0\xcd\xe6GW\x7f\n!\xa7\x9bP\x8c;E\xbb,\xccm\x8a\x86\xdfa\x80\xef\xe7\xd2\xa2.\xa7fJ\r\x08\xa72\x9107R7\x15z@U\xb0\xe7j\xe4\xeaH\xd3$ O\x938)\xbf\x13\xde\x01ZH\xe8\xc2\x03n\xfb<C\xb3n\x1d\x85\xbf\xd5\x9b\xca\x7f|\xb3h^\x8c\x07>.\xec\x93Vc\xfe\x02\xfa\xbbt\x13\xc2\x0fF9\xd1\xea\xc9\xa7\xda!\x13r<\x1cvwN\xa5\xd83\x10\xdf\xd2 -\x83A\xd9\x9ag\xd7q\x04*:\x05\xaag\x0eK\x8f\xf3\x13G*\xaf\xab\xfe\x9b.\x1c\x9d\xdcv\x9b?*L\xe4K\xfd\x80-\x90+iF\xda\xb6\xfcs\x8ak\xdf(\x93A\x93\xea\xdd\x9d\x1a>Q\xf5;\xad\x1c\x0e\x99\xf3\x8c"=\xb2\\6\x8fZ=\xdd\x16C,Fv\x0b\x079cP\x85\xc9\x13\x02\xda\xd8\xaa\xfd\xb2\xf4\xe6H\x80\xb5\x87Z]\xc2e\x86\x1a\xfa\xeb4E\x19K.%eU\xf1\x15\x00\xc6Y\x03\xd7a\xc58\x13AB\xf4H5$6\xed\xa2p\xb0K?\xb9\x17\xcaF\x88h\x87-\x8a\xb6\x19\xeaV\xe1z\xb0\xa2t85\x1a\x9f\xe3\xf2z+\xa9\x18\x899\xc9\xee\x19\xe8\x1e\xa4\x19\xbe\x83\xa5\x15\x00\x1c`6\xa0\xea\xd0\xa25\x0e\x82\xc3NND\xba{\x17|\xb5\x93\x18OP\x89<\x89n\x87E:/\x02\xa2\xcd\x8ao\x07\xc4W\xdb\x04{\xabk\x1b;`<\xbeM\x0fP\xc9\xbc\xce\xd6\xfe\xf2\x1c\xb7qi\x9aP\x92\xc6\xef@\xdeN\xa7\n\xb3\x05\x1a\xe3\xb6\xf2\x1b\x10\xe8\xd3\xf5s\x98B\xf3\xfb\xb9\xfb\xcf|\xf7\x18\xdao\x9em43\x10\x81\xcd\xdd8\xf5\xb5\xf5E\xba\xbdq\x08\xaeY\x1f\x13\xfbE\xb3%iG\x03\x8b\xb5\x87\xb7dl|E\xdb/a\x1a|ZF\xd7\x901\n|\xc9)\xe3\xb8\x08p\xba{\x19\xb67\x0e\xaeo\xf8\x99\x81RA&]b)Z(\xa1\x9f-Tbp\x10\x81`\x10A\xb7\x04yC\xc3\x16n\x92\xfc\xae\xc8\xe2\xd4\x9f\xcc\x11\x7fp\xa1\x0b%[<\xb3\xf8\xc0\xf16\xcc\xed\x8aq\xa6*\xd2\xd5=\xa0\x1b\x8d\x11\x9c\xea\xb7\xf5\xe3\xdetD\xa6\xb4\xefb~\x07\xc0\xfa\xb7\xbfw\x8c\x93\xd8v\x0e(\xd8j\xb5\xf8\xf7\xe3\x8f\x96\x94\\\x9c\x9e;\x9e\xf4V\xebik\x05\xb0547m\xc0v\xb8\xeb\xbb$H\xf4so\xc7\xe2\xbd\x1d\xe28b1Lm\x00\xa3`\xfd\x01\xdc\xe5\xb0\xe7\x8b\xd9j\xf7~\xc5\xa3\xc1\x1f\xc6\x0c\xe7q\xba\xc5\xb4\x14Q@\x11!\xb2\xab\x91\x0c}\xb0!\xbc)\x93\xb1\x02[\x0bwL\xc4 7\xe5\x1e\x10\xa1*\xd4A\xa6;\xa1s\xc8`6^\x82/\x06(\xaa5\xc4\xbf\xf1>\xccbG\x10\xd1\x1c\xa4\xda\xeei \x8dU!\x90S\xbf\xdd\x8e\x96\x89W\'/:\n \x1e\xdc^3\xcaQ\r\x98\xc2\xf4\xf30\xed\x14\x8fxg?\xe4\x7f\r\x92S\xb6\t\xab\xaf\xda\xf2\x96D\x95\xd8\xe7\xd7\xf7\x9a\x9f\xa1\xcc\x1c\xaa7N\xd4\xac6{\xb9[\x13n6\x8f\xe1\xd8\xad?\xfd\x9c\xa3\x02\xd4W\xdbe8\x80\x8ez\xf8\xb0;\x19\xc6\xa5\xe9\xaf\x9f\x1b\xd7\x0e\xd3\xe2:&[\xc5\xcd\xd5Q\\\x8e\x9c\x8de\x94 \x04\xff\x17{)\xd9\xd6Y\xd3\xb9\xc7F\x10F\xaep\x13/\xdd\x9f\x08G\'\xa7\x06\xfb\xcf\'\xa3l\xe3-$4\xc2[\x98K\xc9{\xde\xed2\x19F4=z`fN\x14\x0f\x8a\xe5\xd8\x83\x03\xd1\xf5\xe4\xbes\x96\xa5U~0\xadP\xd6\x01\xeb\x98\xd7n\xd9\xcaNO\xf0t\xaf\xa9w\x98\xa3\x1e\xf8\x19\x0b\x1e\xc6X\xe4\xba\x03i\xd2(\x86\xad\xd6\xa47@\xd7\xb2Y\x0c\xa9\xb1\xe8h\xe6?\xdaK\x1f\xbf\xf4L{\xde\xbd\x11\x9d:\xd96U\xa9\xe7\x1e\xde\x0b\x90G[W2)\xaa\x9c\xaf\n\x00\x85\xa0P\x9b\xb5\xaf~"ak\xa3\x9d+yHT\x05\xdfr\xb6\xc3vgd\x96>_\xc3\xf7\x0c\xae\n\xdf\x1e6\x10<\xebg\x96\x1f\xda\x11h_ \xc5\xf8z\xcf\xdb\x9b\xb8 \xd5&u\x93\xe3\xdeo\xecy\xf7\t\xb46;\x9c\x18\x14\'G\xb5\xe2\x10\xe6\x96-L\x0f\xdc\x88\xb75-\xa5J\xact4gK\xffh\x92\xd6\xbbz\xeeI\x15\x9bh\x00\x06\xae\xdc\xa8\xc7\xba\xa8\xf28\xee\xa8$\xa8\x1a\xa2RP\xe1\xc4\x8e9\xb1\x94\\\x1d.\xe4\xd0B\x1c\x8d\xc1j\xb6\xa6\xa0M\xcf\x87-\xc5\x80X\xc1N\xf4(\xa8\x02\xfdT\xa0Gp\xcc\xa8\xa1.y\xf4\xed\x12\xc0x%\x97\xc2\xc0\x9b\x96\xacH&u=QI\xa6\x08\xeb,|\x1e\xfe\xbb|<\x1a\x18\x9c\x08v\x8a\x14\x98\xf9\x00f\xbd\xaa{E\xe8\xd6URy\xeet8\xab\x03^y\xedg|^E\xc8\xe5\xc0PE\xb3\xee\x00\x1f\x0c\xdcJ\xaa\n\xc1\x14\\V\xa03^\xffm\x1d\xf8\x9fF\x1e\x87\x855xS\xa0\xf3\xe3\xff\x0f\x836\x92\xa8\xa9\xe9W\xa6N\xe5\x1eI\x7f;\xaf \x81\xfc\x91\x03:\t\xcf\xc1\x1d\xf6\x83k\xfb\xd6\x9e\xef\xb1$5\x87\xd4-,7\xa7U\x9a\xf5y>\x99\xc9\xd8\xa7\x1a\x0b_\x93\xca\x81\xed\xf0\x99\xd89\xb3\x8e\xb22\xc8W\x06Z^#\xa8q(\xe8\xbe\x10md\x89\x83\x9b\xf2\xb6%\xa4\xf7\xe5\xc0\x01U-\x1b\xb5LL\xad\x13!\xce\xf3\x8cl\xb9\xf77\x9f\xf2u\xc8\xfe\xa9\xffK\xf9[G\xb3\xc4zQeu\xbf\xad-\x8b\x045\xd3\x8f\xed\xed\xd6\xa414\xc3=\xb2\xe3h\xcf\x06\x80\xae\xbb\xa8\x99\x93Nzu\xb0\x1f\xf3\x04}F\xa5\xafH\xdd%\x93\x04\x17"\xca4\xbe3\xf8d\xc38\'\xa1"P\\KA\x85\xca\x0cx\xfb\x07\xdc?\xbap\x10\xfbD*\xcb\x9f\xa56\xe7\x18\xf0\x9b\x94\xe1#U\xf5\x0b\x8e\x13\x1a\xa2\xab\xb7GG\x0b0\xfdY\x0cY\xa8\x9bg+\xd0\xe7\x1d\x88u\n\xfc\xd3\'m\xdc\xa6\x00\xf0\xefw\x04\xc62\xa4\xba,\x1f\xe2s\xe6}T\xe6SF\xe7\xe2\x07\x9b\x96"\x7fVv\x92\x03\'-~\xf3\x02\x83$&\xd5\xc5/H\xb8\x8f\x9b\x83\xcb\x9f\xdf\x0b4\x9e\xd1R\x1b\xc8\xa0,\xb04\x8dF\xc3Q3;\xd2\xbd\x0c\xf8v\xc8\x81[1\xd7;\xa9\xc9\t+5\xaa\xb4 \xb2$\xd4\x9a\xa83\xc2\x99\x1d\xd1\x1dv\xed\xe5\xccC\x9dh\x0c\xc1a\xb5n\xe8\x1a\xf4\x08\xa1<\xb1\x99V\xd8\x14o\x95\xc6\x85\t\xa8\x8f\xee\xf1AD\xdd\xe5C\x93=\xad\xc2P\xd2\xfe~\x1d\xc2V\x86u\xe5\xc4O\xd9\xaf$\xb0\x98\xa0L\xc4\xe5\x00\x88\xa3\xfc\xcd\'q\xedY\xb4&J\x01\xdaC\xa9\xebbw\x9fc\x12\x85\xe8\xd9\\.X\xc2m[\xb1\xd7@\x88\x9bN\xd5\xc4J\xe0y\x1a\x98\x01\x8a)cU\xc6\x9b\x97\xe9\x87C`\x97\xc4\x13)\xac\x0e\x80|\x9e\xefc\x84\xc3k=\x0b\xdf\xe4\xb7\x07o\x87W]w\xec\xd8\x07\x8e6\xfcF\x194\xf6\x00\xd2\xfa\x90}m\xe3[R]\xd86k\xc8\x07g\xdd&\xea5\xa1\xc3\xc6\x01\xca\x16OJ\x930|E\xf8\x0em\x80\x98j\x97\xdcD]1k\x0eWb:3\xde\xc5\xc3\x870-\x94\xe6\xf4.a\x92\xb7Z\xea\xd3\xa3S`\xe70\xad\tl#\xdb1_\xca\xd4\xd3H/\xd2\'\xdb(@W<\x86\xaa\x1c\xba\xe0l\x07\x83\xc38S\xc7\xd9\xa3(\xf0)\x9bo\x8aS\t\x11mu\xa2\x0f4\x13j!\x96\x80q\xae\xe9Gu\tK\xdc\x89f\x07:\x89\xb5r\x16\xb7w\x9c\xf8\xf4\xf9\xdc\x19D\xca\xd5\x99.\x8b\xee\x9e$\xcb:\x15*\x96\x02\xfbe\xebSAs\x82\xa8\x90\xbd\x98s\xf6\x0em\x06\x0f\x96\x0c\xe1N\x9bv\x13\xe7u\xd0\xba\xbd\x8e\x02BYH\x91vuA\x1d\x8d\xc0\x86\xaf\x8c\xe9\\~\xdb\xa7\xf4\xbb\x95\xf0j\x8e\xe7\x80\xe2\xb5\x0f\xd3\xb2i]\x1ar\x8f\xe6\xe1\xfd\xdb.8\x8d\';AY\xa2BC\xa6a\xfd\x86]\xe9\xcf\x00\x14\x99Q\xfdQ\x8a\x83\xf0"\t\xc6mR\xf3\x893\xfc\xe6\x83\x00;\xeeZG\x91 \x1d\xb6\x1a)\x04\x10Qxz\x01\xba\xb2\x9a\x1e\xe5g3\x01/\xadvme5b\xa8G\x90_I$\xd7\x0e5E\xbfr|\xb4/\xd9\x81\xedG\x00\xa95K\x1ev\xb7\xd0\x08\xc4\x08\x1f\x1a\xf4\x81\xd6A/\x07\xeds\xa2\xdc\x18JQ\x83\xe6\xff\xce\xb2\x83\xd9\xb2>\'w\x8a\x08\x91\x96i\xac\xf4\x1du\xff\xfaW\x1e\xe0\xb1\xee-\xfe\x0e\xca[\xffg\x83\x0bO \xbb\xdcr\xe7!\x96\xf5i\x8a\xe5\x80\xdb\\\x15?e6%\xdb\xd6\xdf\x87s\x97\x90\xfa\xe1\x0f\x0c\x06\xcdF\x92\xb8\xf7j\xd1\xe6\xf2M\xd0\x06y\x0c\xb3\x048N\x94y\x8e\xc74\x0f\xc60\x89\x8d\xb1=\xb2\xfd\x14\n\xed\xd3\xcd\xc1g:[\xcd\x84\xae\xb2\xbf\x1e }\t\xaa?\xb0\rUy\x9b\xce6\x1d\xa9\xc4\x9b\xa7\x96\x126N\x1a\x13^R\xb1\xd6\xa0\x9c(HnMK\x8e\x183\x8a\x92\xbc\xc0i\x16\x12\xe1\t\n\xe3S\xc6b\x15j\x15/s\xa1\x81c\xd3\xdb\xb5\x11\x1a\xce\x1ek\xde\xedL\x0c\xd3\x19\xc7\x8f&\x86-\xa5\xce\x84&\x0e\x11i\xcc\xfb\x9e.\xabmhQ$@,\x08\xde\xb0\x0c>)\x85\xe9/\xa5m\xd8bN]]\xa4{*\xfd\xaew\x80b\x94*E\x1f\x9d\xe3\xe7\xba\xe9\x1f6anj\n\xcf\x8c\x9b\x98\xd0\x7f4O\xfd\xe6\xc0\xc1\x00\x84\x0f"\xcd\x07:\x07\x17\x96oh\x1a\xe39\xf5\xcb\xfd\x12\x8a\xf3\x8c\xc6\xe9 \xc7\x9bfp\xf6\x9c2\t\x03,3F|\x8f\x7f\x17\xf8!l\xad\x13\xb4\xad\xe2/\x1f\x90\xe4\xa1R\x89\x8f\x8a\x825\x86\xc1\xbbjE^\x08\x19\x8ewq\xe0la}v"\xdb\x84\xd8\xb5\xaf\xfb\xbf\xa9\xc6x\xe4r\xd3$\xdf\xa5\x9f\x9b+zu/\xa3 2\x10\x81\xc4\x8azJ5\xc9\xf9 \xfb\x187\xe9~\xa3T$ a\x95Om\x8d\xcb\rH\xee\x8d\xd1\xf6y\xd4\xba\xc3{f\xc3\x16\x08Q{\xbf\t\xa9\x8d\x1e\x97\xf6\xe4\xcbj\x96A!\x9c\x08{\'\x06#A\xea\xcbYm"67upE\xdaV@\xf1q\xbb\x1b\xd7L+\xdb\x17\x7f3y\xca\x9ad\x96\x91\x0c\xd7\xd0\xcd\x7fj\x94\xc5@\xa3\xb7\x86\xe5G4\xae\xd1r\xa0\x0b\xb4\x1e\xb75\xe6e\xe0\'\x83#1\xe3\xfc\xe6\'*&\x8c")i\xbf\xcft\x8f\xd4@4\xb7\xcdK\x97{n;\x87\xb1\xd5\xe5\xc9a\x12M|XL\xe2\x0b}sY]2\xac\xac\xe4O\xb80Z\x89\xd0\xf0\xa4\twr\x07\xaa\xb1X\n\xc6o\xb5\xe3\x11\x05>\x0e\xd6K\xc5\xf04B\x06\xaaRft\x9a\xdc\r\x15\x9e0\xd8*X\xc9\xd4\xc7H\x85m\x9bjx2<9\x94\xd7\xe1\xb4\xc7\xde\x83|OfjbW\xaeL\x03h\x9b\x9e\x82\xf6\xa7\x0f\x9b\x07\n\xec\xc5\xd7\xfb\xf6\xe0!\x82_\x84\xd0\xb8\\\xf8\xf8q\x16\xf1,*\x8dQ\x95\x16\xd8\xd9`,\x1e\xe0\x01`\x806\x01<\xb9\x87\xbc\xf5\xc9<\x15\xff\xe1&\xb1cb\x00~\x01\xe0\xf0\xa4&\xc9\x03+\x0fFR\x9f\xa5\x9eV{\x1e%<\xd7Ut\xe8\x8c\x9a~\x08\xb1$4\xf4\x8f\x06\xb3r;\xf7\xd6\xaa&7a\xd4g)NsK\xe5&\x84\x9e\x07\xd2\x1b\x04\x12\r\x8a\xbb:\xe4*\xfbC\x86\x1a{O\x83\x9b\xf5\x9b\xe1\x05\x9d\x84\xdf\xe3\xaa\x9a\x1a\nP\xd4}V\xc6\xdc\xc8#\x88\xec\x05\x81\xf9k\x902^4^\x8e\x864\xa1\x0e\xf6\x92\x9c\xc7\x84\x04\xc4\xa4\xaaw\x82\xbe\xad\x88\xc1N\xf2\xae`\xb7!\t\x8c\xeaya4n\xb1.\xb4z\x05*nZ\xe9\xa7\x93-\xb1\xb7\x08\xd8\xaf\x81;\xf5\xcd_/oiF\xe6\xb0\x89\x9cEX\x19?B2\x049i\xbd\xbb\x8f\xbc*x\xea\xb9\xa1\x89{\x8d\xec\xca\xb8\x89\xc0,=Pb\x89\x81\x01\x04"$C\x01\x84\xe8[\xa5ti\xf4\x18\x84\x02\x0eh\xd7\\\x82\xc6)\xeb\x12r\xf5z\xa3\xfb\xcf@\xf7\xe0WnD\xfa2\xaau\xad<\xb0x\to\xf1\xaf\x85x\xa8\x86\x02\x8a\xaa\xef\xab\xa9\x02\xeb\r\xff\xd9x}M \xf4D&\xdexQ\xf2r\x98X\xa6\xf4p\x0b\xa7\x88K\xa9zQl\xc2\xddrf^\xb2Nc\xbc\t\xca%\x8a\xb9g\xe7\x18\xe0\x93@(y\x18\xe2\x1f\xda}\xcb\xa3Q\xb4\xaaF]\x1d\xea\x9da{Y\xf3\xadq-\xd2\xaa\x05\x86y]AE\t\xb9fP\xf8\x81\x91\xe4\xb0\xd8H\xd9\x13#\xb2\xad{\x94\x94#\x93\x02\xbd^bX\x10\xb0\\:n\xf8\x0f\x19\x0e\x10\x95\xe2U\xf7\xa3\x10\xca\xf2%\xfcY\x89>7y\x88\xc0\xb7\x92\x08\x08[@SM\xb9\xe7:\xac\xf3I\\\x00A\xc8<#\xa9\xd2\x0b\xb6KDc\x9a;rvy\xf8\xdb\xb3J\xdb\xc2cE\x04\x01\x1b\x8e\x03\x7f\x93Aj\xc0\xdc\x1b\xef\xab\xe5\xf2\xad\xa7G\xf7\x96"\xc2\x1ffP\x89\xf2\xb6H\xaa\xd4q\x04\x85I4\x8fMKh3\x1e\x06\xeeT\x0c\x9b1P\x16u\xbcA\x0b.OT\x00\x1f\xe0\x0f\xae6\xed\xeb\xbb\xd2\xdeW\x7f0p\xb7\x0b\xe1y\x0bi\x96\xf4\xb6\x9f\n\x8d\xe9L\x9d\xc9\x93\xa3_k\n\x7f\xff\x9b\x9a\xa0\x9cMAOyw\xd2\xfa\xf6U\x17\xae\x92\x0c\xcd\xb2)\x8bG\xb9\xd6}\xb1\x95\n\xe0`\xe0\x0e\x89X_@\x18\xa7^k\xd0D,\xe9\xcf\xa7%\x19JS\xf1"\xb72\x8f\'\xa5\x9ef\x03]\x95\xe1\xf1\x14\xd2\xcc\n":\xad)R\xa4\xe9@\x1a\xa3\xfe\x90_\x8dQ\xc0\x90!a\x82\x82y4m=\x93\x1d\xe9\x01\x05\x12S\xf5\x8e+yR\xc6\xfd\t\x81K$\x04\x90"\x96B\xf6]\x83@/M\x87\xd4\xd0\xb3n\xfa\xe2\x9b0\x05\xd0\x0fc\xea\x0c]\x03>\xb5\xd3\xd0\x17r\x1aJP\xe9&\xac2\xef\xec2\xe50e\xf02\x88V\xd5J\xe1r\xfc?\r\xa9\x88\xefZW\xf4\xdc\\v\x04\x18\x03\xa3/j\xc3\xa8\xed\xe6\xa8\xd2\xcb\x91\xc0E')
1
+ import click
2
+
3
+
4
+ from hiddifypanel.panel.database import db
5
+ from hiddifypanel.panel.init_db import init_db
6
+ from hiddifypanel.models import *
7
+
8
+ from hiddifypanel.panel import hiddify,usage
9
+ import random
10
+ import uuid
11
+ import urllib
12
+ import string
13
+ from dateutil import relativedelta
14
+ import datetime
15
+
16
+ def drop_db():
17
+ """Cleans database"""
18
+ db.drop_all()
19
+
20
+
21
+
22
+
23
+ def backup():
24
+ dbdict=hiddify.dump_db_to_dict()
25
+ import json,os
26
+ os.makedirs('backup',exist_ok=True)
27
+ with open(f'backup/{datetime.datetime.now().strftime("%Y_%m_%d__%H_%M_%S")}.json','w') as fp:
28
+ json.dump(dbdict, fp,indent=4, sort_keys=True, default=str)
29
+
30
+
31
+
32
+ def all_configs():
33
+ import json
34
+ valid_users=[u.to_dict() for u in User.query.filter((User.usage_limit_GB>User.current_usage_GB)).all() if is_user_active(u)]
35
+
36
+ configs={
37
+ "users": valid_users,
38
+ "domains": [hiddify.domain_dict(u) for u in Domain.query.all() if "*" not in u.domain],
39
+ # "parent_domains": [hiddify.parent_domain_dict(u) for u in ParentDomain.query.all()],
40
+ "hconfigs": get_hconfigs()
41
+ }
42
+ for d in configs['domains']:
43
+ d['domain']=d['domain'].lower()
44
+ # del d['domain']['show_domains']
45
+
46
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
47
+ domains=Domain.query.all()
48
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
49
+
50
+ configs['hconfigs']['first_setup']=def_user !=None and len(sslip_domains)>0
51
+ # configs
52
+
53
+ print(json.dumps(configs))
54
+
55
+ def update_usage():
56
+ print(usage.update_local_usage())
57
+
58
+ def test():
59
+ print(ConfigEnum("auto_update1"))
60
+
61
+ def admin_links():
62
+ proxy_path=hconfig(ConfigEnum.proxy_path)
63
+ admin_secret=hconfig(ConfigEnum.admin_secret)
64
+ server_ip=hiddify.get_ip(4)
65
+ admin_links=f"Not Secure:\n http://{server_ip}/{proxy_path}/{admin_secret}/admin/\n"
66
+ domains=get_panel_domains()
67
+ admin_links+=f"Secure:\n"
68
+ # domains=[*domains,f'{server_ip}.sslip.io']
69
+ for d in domains:
70
+ admin_links+=f" https://{d.domain}/{proxy_path}/{admin_secret}/admin/\n"
71
+
72
+ print(admin_links)
73
+ def admin_path():
74
+ proxy_path=hconfig(ConfigEnum.proxy_path)
75
+ admin_secret=hconfig(ConfigEnum.admin_secret)
76
+ print(f"/{proxy_path}/{admin_secret}/admin/")
77
+
78
+ def init_app(app):
79
+ # add multiple commands in a bulk
80
+ #print(app.config['SQLALCHEMY_DATABASE_URI'] )
81
+ for command in [init_db, drop_db, all_configs,update_usage,test,admin_links,admin_path,backup]:
82
+ app.cli.add_command(app.cli.command()(command))
83
+
84
+ @app.cli.command()
85
+ @click.option("--domain", "-d")
86
+ def add_domain(domain):
87
+ table= ParentDomain if hconfig(ConfigEnum.is_parent) else Domain
88
+
89
+ if table.query.filter(table.domain==domain).first():
90
+ return "Domain already exist."
91
+ d=table(domain=domain)
92
+ if not hconfig(ConfigEnum.is_parent):
93
+ d.mode=DomainType.direct
94
+ db.session.add(d)
95
+ db.session.commit()
96
+ return "success"
97
+
98
+ @app.cli.command()
99
+ @click.option("--admin_secret", "-a")
100
+ def set_admin_secret(admin_secret):
101
+ StrConfig.query.filter(StrConfig.key == ConfigEnum.admin_secret).update({'value': admin_secret})
102
+ db.session.commit()
103
+ return "success"
104
+
105
+ @app.cli.command()
106
+ @click.option("--key", "-k")
107
+ @click.option("--val", "-v")
108
+ def set_setting(key,val):
109
+ old_hconfigs=get_hconfigs()
110
+ hiddify.add_or_update_config(key=key,value=val)
111
+
112
+ return "success"
113
+
114
+ @app.cli.command()
115
+ @click.option("--config", "-c")
116
+ def import_config(config):
117
+ next10year = datetime.date.today() + relativedelta.relativedelta(years=10)
118
+ data=[]
119
+ if "USER_SECRET" in config:
120
+ secrets=config["USER_SECRET"].split(";")
121
+ for i,s in enumerate(secrets):
122
+ data.append(User(name=f"default {i}",uuid=uuid.UUID(s),usage_limit_GB=9000,package_days=3650))
123
+
124
+ if "MAIN_DOMAIN" in config:
125
+ domains=config["MAIN_DOMAIN"].split(";")
126
+ for i,d in enumerate(domains):
127
+ if not Domain.query.filter(Domain.domain==d).first():
128
+ data.append(Domain(domain=d,mode=DomainType.direct),)
129
+
130
+ strmap={
131
+ "TELEGRAM_FAKE_TLS_DOMAIN": ConfigEnum.telegram_fakedomain,
132
+ "TELEGRAM_SECRET":ConfigEnum.shared_secret,
133
+ "SS_FAKE_TLS_DOMAIN":ConfigEnum.ssfaketls_fakedomain,
134
+ "FAKE_CDN_DOMAIN":ConfigEnum.domain_fronting_domain,
135
+ "BASE_PROXY_PATH":ConfigEnum.proxy_path,
136
+ "ADMIN_SECRET":ConfigEnum.admin_secret,
137
+ "TELEGRAM_AD_TAG":ConfigEnum.telegram_adtag
138
+ }
139
+ boolmap={
140
+ "ENABLE_SS":ConfigEnum.ssfaketls_enable,
141
+ "ENABLE_TELEGRAM":ConfigEnum.telegram_enable,
142
+ "ENABLE_VMESS":ConfigEnum.vmess_enable,
143
+ # "ENABLE_MONITORING":ConfigEnum.ssfaketls_enable,
144
+ "ENABLE_FIREWALL":ConfigEnum.firewall,
145
+ "ENABLE_NETDATA":ConfigEnum.netdata,
146
+ "ENABLE_HTTP_PROXY":ConfigEnum.http_proxy_enable,
147
+ "ALLOW_ALL_SNI_TO_USE_PROXY":ConfigEnum.allow_invalid_sni,
148
+ "ENABLE_AUTO_UPDATE":ConfigEnum.auto_update,
149
+ "ENABLE_SPEED_TEST":ConfigEnum.speed_test,
150
+ "BLOCK_IR_SITES":ConfigEnum.block_iran_sites,
151
+ "ONLY_IPV4":ConfigEnum.only_ipv4
152
+ }
153
+
154
+ for k in config:
155
+ if k in strmap:
156
+ if hconfig(strmap[k]) is None:
157
+ data.append(StrConfig(key=strmap[k],value=config[k]))
158
+ else:
159
+ StrConfig.query.filter(StrConfig.key==strmap[k]).update({
160
+ 'value':config[k]
161
+ })
162
+ if k in boolmap:
163
+ if hconfig(boolmap[k]) is None:
164
+ data.append(BoolConfig(key=boolmap[k],value=config[k]))
165
+ else:
166
+ BoolConfig.query.filter(BoolConfig.key==strmap[k]).update({
167
+ 'value':config[k]
168
+ })
169
+ if len(data):
170
+ db.session.bulk_save_objects(data)
171
+ db.session.commit()
172
+
4
173
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
174
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,60 @@
1
- # 2023-04-08T16:23:20.718777
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x008\x0f\x00\x00\x12\t\x04\x00ps\x04\xfa\x8c\x93\x8d\xb6\xeeSbjT<P`\x00\x00\x00\x00\x00\x00\x00\x00\x89[\xce\xfd\xd4^wc\xe0\xdb\xa3\xaa\xc0\x01\xc3h\t?5.O\xae\xc5\xe4R\xef\xbd\x84\xf7\xe4Z\xdbY>\xae\xab)0\x8c\xfe4\x9f\x90\r^\x01\xc6\xf2\xe8\xb1i)B\x17\xd4\x0c0\x17\x15\xed\xb7[\x0fPH\x1f\x13\xf4\xf3~\xc6\xd9\xfc\x80\xfa\xbc\xbeF\x94\xec/\x9b\x85\x0bwp\xbf\x0f\xffU\xde-\x80K\x9b\x98\x11l_\x16\xba\x02\xab\x05P5i\xf4\x91]e\xd2\x9eF\xd4\x87\x8b\r\xb6y6\x89\xd1s\x10\xf6\x0f\xa4\xa8\x94^E&\xb6\x9a)s\xe64\r\xe4\xf1g\x03\xa6\x98\x91\x81\xbb\xc6\x19(u\xe9\x8cP8[\\\xdcji\xbaS\x04\x1f\x04x\xa0\x13\x16\r\x9b\x1e\x9e\xdb\x8a@\x94\x9eW7\x15W\x9e\x12\xa9{J$\xd3v\x91\xc4\xf8\xcex\xc7qX\x94\xd55\xeb\x075o\x10\xee\xf4\x11\x99\x97\xf1\xdc\xcd\xcd\xa2\xeeC\x1a3\xaa<dO\xee\xbc\xc0u\xec\x0c\xd0\x13h\x08r\xbbz\xce\xb6%\x99\xf6\x0c\xc3\x1a\x03$\x0b\xce\xaaj\x83nV\xf92R#\\F\xaf\xd7n\xd1K\t\xb3\x07.I\n\xf8]>/\xd1?#\xd8\x19\xb2\xc2\xbe\xe9\xa7V\xe2\x08\x94\xb0CQ|\x0e\xfd\xa2\x1bQ\x83\n\xb9{ \xf1%#\x07\xd3&\x01\xde\x85\x84\xb6\x11\x19\xdcj\x81\x9d-\xcb\xa6\x12\x11\x02\r\xd3\x0e\nm\x85L\xddmH\x06\xf1YN\xfa\xef\xb6\xce\xa2\xe5\xe2\x0b\xfb\xb0\xe6j\xb8p4sZ\xb7\x11b\xcd\x89\xc6\xa3\x82\x01\xce\xd5q\xeb\x93\xc9\xdc\x88+57\xca\xd3\t\x8f\xa8\xfeCm\xd0\xa5\x10\xed\xa6fs\xdd\xe9z\xe4\xf5j\xb4\x12Y\x96-4\x9c\xbd\xa7w(\xb5\xf5\xb7\x98n:L\xec6v\xcc\xc4>\xca\\\xf4K\x83\x1dKRDn3k\xbb \xac.\xa63B\x83\xb8N\xe2\xba\x86W\x16\x97\xd4\x05[\x08k\xbb\x90#\xae\x02\x037\x13\x9c\xf8.\xf6\xac\xfdCJ\x96p\x9dM2\xac\xbc\xd2W\xc2\x129C+\x98\xe6\x11\x13\xe2.\x9fMD\x9af&^]\xf7\xa1\xb7\xbc\x96\x95\x0f\x7f]}\xc3D\xf3\xc9\x03|\x7f\x94\xec\xe2\'6In\x91\xe2?(\x84\x88\x11\xd2\xc9\xec\x0c\x15Z\xc14\x89$\xff*I\x9cWs\xe7\xcc\x15\xb9\x89\xc2w\xd2~?d?\x98\xfe\x872\xdd\x17\x12\x9bb%\xe9\xed\x90\x81\xdf9\x8ee\x08\x89k\xcc\xc3\xbf\xe8j\xe6\xe1jt6\xfb\xe2\x98\xef\xe4\x85+}\x8c\xe89\xa0\xc9h%=O\x95\xc5i\xa9Cwua4\xf3\x81\x13>*VA\x8b\x9f\x10\xe0\x0b\xd11\x93]\x1d\x93\x8f\xea\x9bUk\x12\xd73\xaf\xac\x92\xca\x0f&\xaf\x97#\xc3\xa2\xe4\xe0\xbf|\xb7\x81b\x87\x121\x0e\xa9\x8b\xf2;\x94\xa6C\xf4\x7f\x19T\xf5\xacx\xec\r\xa9d\xd3=\xb6\xa9\xfe\xca$\x9f@\x1f\x0fd\x16\x9cu\xa9ol\xd6P\xdc\xd5*{|f\x14\xe2E1\xa9\xfd\x92\xc1\x01\xa8\x97\x122\xa2yD\xf1\x16\xc9\xd8\xd6\xc3U[{\xc1a\x04\xd3l\xfc\xfe)\x99\x80\xdc\x92\xcc\x82\xaa\xf0\xa8\xf8\x91\r^\xf7\xadMtTF\\\n\xf5k-\xa0\x9b:\xd6\x14\xc2)\x17\xfc\xda@+\xbdZ\xcd\xd8\xb5\xadk1J\xe8\x00\x1aT\xba=\xa5$4\xd9\x0ep\xa7\xa5\xf0wXNg\xe0\x0f\x10<\xa5\x8aI\x84\xe8\xc7j\xea\x1a\xf1\x88\xc8\x9b[i\xaa+\xf0\xcb\xbf\xbe;\xac\x05\xbb\xd8aeD\xde\x82&`G\x81j0\nG\xce\x92\xbb\xef)\x81\x1c%\x83/ B=\x16.f\x81\\>\xb3\xee\x06\xc3\xf7]\x11\x1d3\xe3\x7f\xe9\xc7\x9cHC.\xb5\x881\xb04\x17Z\xb4]j$\xabc\xfb\x94\x94:p\xad\xfd\x97-\xcf\x84\xc1fu%(\x88\xf3\xfb\xbbU\xf4&\xaa\x9b\xdcR \xddjsF\x8ap\x8d=g\xe8\xa2\xb0\xee\xc6=\xe1\x8fe(\x96\x91\x96\xb5U\xf4W\t>\x17\x9e\xbe\xac\xed\x87\xdcs\x7f\x98\xf1\xf8V\x17i\xfbw\x0b+\xb9&\xe1\x8a\x11\xc8\xd0Oy\xa1\xe2\r\xa6BM\x85\xa9\xa4T\xf5\x86\x86\xfe\xb9\xf6\xf3[\xba\x1e7\xd1\xcf\xd2\xc7\x8cK7\xc5\x06\xef\x10\xf2\xd3V\xe6\x88\xb82\xb1 _V\xed\xa0\xfe\x9f\xc4<F\xa2\xa7\xab\x1al\xea\xa2Fi\x8b\xdd\xf6+\x00\x1e\xc92\r\xc9cx\xfc\xf5N{7\xb3L\xd3\xe6\x8a\x14\xbb\xcc\x08n\x97\x0f\xe9Ju)\x1b\xc8C\x01\xb1Xu\x1e\xca Z)\xa1\xf3B\xd6O`\xc2a\xf1\xbc\xaa\xb0\x07XE\x8e\xe5\x02\xe8\xabc\xa3\x9feP]\xe7\xc6\x97\x82\xae\xbe|\xdb\\\x88\xd3\xb3\xf5K\x14\xed\x7f \x16\x8cO\xd0QD\xb3\x98\xfc}N\x88\xe6\xd9\x93\tj\xb7\xe6\xb3\x8b\xc7\xc1o7U\xcd\xd0\xb6\xbc|sP\xc7MqE%4\x92fg\xb0\xa9"\xf7t\xfa)\xabb\x10Q\xe7\xd0\xbeUM\x13\xb4T?^\xb4_\x9c\x94\x15o-B\xec\xf3\xf9\x16U\xee\xb1\x19\x14\x96\x17;\xbek\xb7(]K\xe3-\xb7\x0fn!\xfe4\x91b\x10\x9c\xfe\xf7\x84\x9b\xea\xaar:\x9a\x85\xd8.\n@\x12S\xe4\x86+\xb5\xe2\x11b#\x08\xd0Q\x84Bx3\x8c\x95/\x19+\x84\xa7jo3mE0{:\x110G\xeb\xe2\x7f\x8cl\x12 \xd6\x10\xaft"\xf5\x99\\\x0c\xdf\xc9\xefy\xb3\xd6\xcc*\xc3\x86V\x95t;\xf2\xd2O\xa1\x0b$\xbbe\xdb\xe6\x17\xb7\xad\xaeO\xd8\xfc\xf2\xdd\xcd\xfb\x87\xb0s\x80\x95.\xcbW4H\xcb\xbb\xa2\xee\xbe\x8e\xbbns\xde\xa6N\x03\x81\xc5Tj\x82\x9d\x0bS\xe8A\xa4\xcc\xe1-\xb9\xd2\xbb\xbd%\xeb\x9c6\xbaNj\rn\x92Y\x0e\x90KDk\xb5\t\x96\x1e\x93V\xa2\xba:\x17>\x1b\x7f\x8b\xc9\xfb\x87\xd1k\xa4\x82\xba\xd9\xed\n\x9d\xd2\xee0\x9f\xd2\x07\xb8M\xd7\xac\x95\xb8\x02H\x05@F\xc8\xdc-\x10\x04\xfe\t\x12\xb3\x9dIh\x17)\xdf\xd4bf\xa20\x9b@Q\xaf\x0b|\xc7\xc8\x7fi\x13X\x9b\xbd^\xa5\xbf3Z\xe7\xbd\xcdz\xec\xb4)\x00\xa66\xbfj_\x9e\x1e\xab\xc4\x91\xda\xff\x1c\xf7C0\x8d\xb39`\x864c\x15\x95\xc5\x16\xa6\xbf\xe5^\x14X\xc6\x99ly\x1f\xaf7\xfb\xbe\xf0\x82b{\xebd\xba\xda\xc9\x03#\xf1\xa6H\x13\xb6\x13\x07?\x9a\xfd)\x17\x8b\xe6{z\xadM\xb1\xac(\xfe<Ov\xec\xf9BC \xc9\xc4Bl\xdb\xb6\xaf\xa06\x7f\r<\x04\xde\xfbL\x05"\xef\x02\x8fz\xca\xc3O\x80\xc7\xddd0\xd8\xf3Z\x06\x03\xc1\xda\x984&\xfc-%J\xa0\x0c\x92q\xbf\xc3\x81\xb9\xed\x9e\x92}\\\x05\xb6i\x1e\x1f\xb9\xcf\x00L\x02p\xfa\xb1\xf2\xc7"j\xd8\xa3m\xf3\x90\xd7d\x06\x91\x01\xe1\x02[\x86\xe4\x0e\xb0\xa8\xa9yu\xae\xce@j\xdf\xa8cS\xdb\xe4>R\x06@7\xbc\x1c\xe8+\xb1\xf9T^/\xc4\x9c\xc2\xa8\xa4\x9d\xb2\xe2U\x0c\xa1\xf0a.L1\x19\xa6\xedm3<Si\x9a\xb2\xce_\xf5\xaar\x1d\xb0G^(\x0c\xce\x93\xe5\x08\xcc@\x87\x995za\xed\xa8x\x0c\xe9]\x10n^\x80\xff\x11\x1cM\x96V\x91 \x1bS$|\xf2\x91(>T\x1bu&\xefB\xff\x98\xb7@%\xcb/l\x10\x05\xd8\xec;\xafc\xe3\xe5<u\x10\xc48sl\x1b_\xb9\xa6w\xa1g\xec\xb1\x1b\xa6\xa2\xf0"FM\x11\x9a\xb1\xa1D\xe83j\xe0\x18cN:q\xcf\x00\xf5\x91\xda\xf5\xbf\x9f\xe9\xdd\xb0\x9e\xe5\xe9\x06\xe2wB\xe7\xd0\x1b\x13\x88\x0cJ\x8c)Tg\xef\x04)B\xbc(\xc3\x1a\xad`\xcc\x90\xfd\xdf4m\xf3/)\xc4\xfcCM\xd3=\x91\xd2;/k.\x12\x96\xe3\xfb\x9b\xae\xc2 \x86\xd8\xef\x19\x12\xe4\xd8\x7f\xe7\xc9L\xf6\xcb\x87\x8c\\\x11\n\\G:\xd4\x8f\xca\xa2\xc0(\xe9\r\x1c(\x8d)\xf0\x11\xd5\xcb6B\x07\x81\xd8\x1e3\x18\x10M\xf9+V8\xbf\x0f\xe1\xf4p\xda\xc3g\n\xfeoH!\x05\xe4\x11\xd6\xeb\x1d{{\x00])PH\\\x05JG\xdc\x018T\x8f8#l\xa3\x19\xf3\x17\xa6<NN\x14\xe4z\x9a\xb0r|9\x15t\xb2>\x9f\xc2M\xe6\x84\xd4\x03\x83J2vM\xa5\xa2T\xf4\xb7_Utj\x8d\r\xa1\xf9#V\xd7&\xf3\xb8\xe9q\xa6\xb5\xc22\nz\xb1\xd1\x83<\xe9\x96J\xc5\x95s\xbeb\x17\xda\xbdFQ;?\xc0\x91\xb5\x12\x8en\xac\xd8\r\x18\xa2\x8c\xdf\x88J\xc0X\xe0\xbb6\xe1m%\x80,0D~\x90\xc4h\xe1\x8e\xd8\xa36\xa29o\xd5\xd51\xb8\xea,\xb5\xc7\x1c\xc1\xb4j\xceYv\xb2\xe5\x01\xd7\x85$8\xaa\x9d\x9b\xb3\x7fVR\xbfJ\xed\xfe7;\xe2_\xad\x13\xce\xec\xd7:\xf2\xe2\x1ac\x1a\xde\xed\x96\xfd\xe8=\xd5@ v\xcc\xd3+\x088\x1f\xab \x13k@\x95^;U~\x08\xbd\x9aE\xca/\x88\x9cW\xd4y\xea\xcb}\x92[J\xbc\x10\x12\xd7\xd6\n0\xb6HV$\xf1\x9b\xfb\x1d\xbcqM~t\x00\xccR\x1f\\r\xbcKh\x1b\x87(\xaf\xd1\x05\xee\xae\xe9\x07He\xca\x81JX\x06\xb5\x19\xfa\x15N\xb0+\xb3\x06\xed\xa2\xd6\xcb7\x0c\xa0U\x96\xf5\x87`\n/\xf7\xb3\x03\x0bx\xdcR\xd3,\x14 4\xb3\x88\x8cl\xa4\xe1\x08K\x16\xb9oFV\x8a\x9a\xa3\xb0!\x97\xc9\x82\xb2j#{;\xe0.\xc5\xc2)=\xca\n\x96\xdf\xb6\xd2\xad\x19[\x0f=\x8d.Xd\xf1\x02F\xe2\xc3\xa2?\xc6\x05\xd3\xf3\xec\x85\x84\x19\xa6\x80`\xbds\xeb\xf8(\x00\xe0\xbe\xa4\xdd\xaf\xf9\x12\xea\xef\xcaW\x1d0I\x98\xa5\xf8\xec\xa71@^\x91\xa9\x1b\x85\xcb \x7fA\xafw\x92\x02\xcaC\x14\xeb\xf0\x8a=\xf2\xfd\xc3\x01\xd4\x99A\xee\xeb5Z\x98\xf6\xe3\xba\xe4\x03\x08?\x98\xf8\x99\x87\xfd\xf7\xf5M\xe2\x0b^\xc9\xa8\xbdIy\x00\xba\x95\x80\x9e\xa8\xb3\x95\xdfBB\xa9\x11\xbd\xae\xdf\xccf\x9e\xdb\xe6\x8eep\xb0\xfa\xb5\xfd\xbf^)\x89\xe2J\xa0\x00\x06k\xe7\xfecs\x97\x86\x00s\xaf\x85I5\x7f\x93Us|XD\x90\xd1\xf0\xf4O%\xea&\x9e\x04{%Q\x1ft3\xfb\x19m\xae\xc5\x886\xdb8\x97K\xf5\xa5\x93\x07\xf2\xe79\x1b\xa8l\xe2\xc5=\xcbp\x9a\xe5$4\xfe\xb9G\xa7-a\xc1%^\n\xf5e\xe9\x1c\xe8G\xf0\xf6b\xf5\x8d\x07\x8b\x1d\x81\xear\t\x0c\x03\x03\x088\xc3!I\xcc\xb0\x84\xc0\xd4\xff\xa6\xce\x83\xb0\xef\x1c\x16e\x8dw\x10\t&\xd7\x04*\xce\x97\x8f\xcd\x08\x03\x98\xe7\xd1\xa8y\x0eW\xb2\xbcsk\xc5\x87\xa6^\xf1\xb9)as-:\xa3\'\xad\\\x01\xf8\xbf+IeS\x81\xf2\x16\'9\xdb\x8b\x1eC\x9e\xd4\xc8\xf3\xfc>\x84w\xce\x18\xc1\x1bk\xd5\xd8\x8c\x12\xe02XohR\xad\x01\x15BK\xa5B]\xcaHX\xcf\n\x1d\x83\x17s=Hi\x0bVk\x02\x88+L\x8c\xddK\x9b>\x08M8\xee\xf5\xd0S\xe0\xc6\xf5\xf5p\x92\xe6\x9cJ\x04\x90\x9e\xe5\x0c\xc0.\xdd\xb9\xb5\xa3h\xa3\x02\xc4+*\xbc!k\xe8\xba\xb7\xc3\xd0?`\x0b\xe8\x82}\xbf\x83\x9c\x12\x1c\x92\x97\x96\x8c9dXK\x17\xe4\x82Y\xcf@\xe8ZLb\x8bm\xc6\x00.\xb7`\x156Jk\xae\xfa\xe2\xbb\x08\xb0\xf3\x9d?\xa6^\xf4\x8b>2\xa6\x07*\x0bRX\xe50\xe7\xd80\x18\xf8?\xc1X\xab\xb9\xbe%\x9b\x0f\xd2\xf7&c\xa2\xee\x15\x96\\\x0c4N\x08\xf3\xc9t\xfc\xba\xc7\x1d\xaeuo\xccd\x98\x00\x19\xc2y\xbaM\x97\x13D\xa9I:q\xfcn\xe6\x9b\x8c7$\xfe\x86\xce\xe1\xaf2\x98\\Y\xd54g\x80\x97\xdfx\xd4_.\xfb\x97u\xa7\xe3\x94\xc4\xac\x03\x1cu\x8e\x8a$\xb6\xd9,\x02\x99c\xd7\x86\xc6\xb4\xbc\x01\t\x12\xad\x9e\xfd\x0f\'\xc8\xf0\xce\x9d\xa8s\xb7c/+\xa1\x9ag\x8b\xbe\xea7\xc3\xedC5\xd0\x04M\xd78b\xe4\xdd\x9e0\xea*\xaeC\xc8\xe6\x95\xb2\x86\xe0(\x05\x00\x1d0H\x8f+\xfd\xb9\x13\x96\xdbo\x01#y%\xed\x02!\xe4z4\xda,\xc2B\xc27\xd0}\xf2Q\xc0u\x00\xc5\xc89\xe6\x1d\x8a\x9dbL\x16\xd1$sG7\x88\xd6I[KN\x8c\x97h\xfe\'\xd1`T"F\xf0\x9d\xc9,\x97E\x04\x9dj\x83`M\xb5N\x08\xcc\xb3}>c\xf3\x88\xc9\x92Y\x08\xc7\x8e\x95\x98\xe6\x03\xc8\x84\x89\xfat\x89\xc1\xc3\x8dN\x02\xdc\x1c\xcb\xc1\x0c\x8f\r\x10\xdcm\xf3\xff\xdfL\x8b%\xd8\xbaa\xbb$\x90\x1d\\\x86\x1f+\x1d\\\x9c\x14\xa1\xd3\x11,\xa2\xa6\xd4\xc8\xb5\xa8T\xac\x15\xe0\xe5\x8b\xf7\xe7\xb2O\x1d:\xa9\xab\x1cs\x8d\xed+\x83w\x0f\xe39P(>Up;\xc1\x97t\xdb\xf9\xaa\x9c\xba\x11\xb2\x82\x05<\xd3\x8f\xc8V\x8b\xe9\xdc\x0f\xef)Fm\x0eM\xe4!n$9\xb6\xab\xffB\xb0J\xce3\x924\x92#\xac\xa7\x8c\xc5\xb4\xcb\xd9U\x8bu\xa5\xbe\xa3\xeey\xd7\xa9!ud\xc8\xd5\xf5"`R\tw\xf4\xc0\xce\xbc<\xfd@\x8f\x1d\xb9\xf4\x9f\xb5\x06\xe5t\xdfs\x91J\xf7\x94\xa4\xae;=\xed\xb5\xe7\x1f-\xa0D\xfc\x14\x86Zu\n\x1aM\xb8\xa9\xdb\xfc\xd2\xad\xe3q0\xdf\xdbo\x11\x08V\x96y\xc7\r]S\x83\x93\xb0\x85fUA\xe7\xbfwb\xe9\x95\xfc\xd0\xe8\x1d\x0b\x08\xf7k\x1f:M\x1d0\xea \x9c\xccPG\x08\xe3\xe7\xbb)\x1a\x0f\xe5Q\xc2\xd1k\xedh\r\x12\xaa\x99\xcf\xcd\x1b\xcdR\xc7\xa3\x1a\x14\xb1\xb9L\t_\xe1 P\xb6\xdc\xbe\x14@\xbf\xd2\xd0yq\x94\x87,A\x8a\x16\x134\x9a((\xce\xe9\x02\xace\xf6\xa9\xdf\no\x19\xbc$];u4E\xb8\x87(K-Q\x1e\x86\xacQ\x99\x0c\xde^3u\x064\rt\x18a\xed\x05\x06$\x18\xc8\xa9\x1cR+8\xb7\xbc\xacN4\xfc\xe8\x16\x99\xc4\xcb\x18\xbb\xa8\xf7\x98\xee\xf5\x0b\xb3\xbd\xb4\xe0k7}\xbc\xf4\x14\xad\xd9\x95\x04\x1c\x8a8\x96\x99\xe8\xb6f\xda)\xea\xb2\xd1\xb0,\xa5t\xf6\xee\xaf\xab\x88\xc1\xd0H\xea\xfc\xefT\xb2\x8f\xb0\xe9.R\r\xf8\xe3\x13\xe6Fg\xa89\xc5]0\xcb\r\x7f\xe74)\x12_\xc9\x9e\xf5\x9d$E\x88icjo\xd7\xbe[\xba\xed\x03\x1a\x1eA\xefE?9\x1f\x84\xbb\xa1\xe6\xed\xee\xa9\n\xe8;\xb7\xdb\xeb\xe0\xabb!\xebA\xda\x85\x99\x1e \x8c\xd6\xde\x90\x013\xb6w\xceg`\x8a\xea\x99\x9b\\hl\x11\x85\xf8\x16\x97\xafZtRS5\x89UU\xb4\xe1S\x8e\x06\x95Ok\x97\xcbt\xbb\x9d\xe9\xb69\x1c\xe2\xc9ga\x95%\xcd\xe7\x7f.\xf4\x0e\x12\x18\x05\xce\xbd\xe7\xd8\x88\xe4\xeby\xfe\x8ctW\xee\xf5\x10\xc4\xb8\xb5\x83\x85?\xf8\xc9J\xd55;j[\xbe\xf0Lv\x90Wk~\x9b\xa2\r\xbb\xe5.\xe7\xb1\xaa\xc3\x87~\xb9\xd1k\x93\x1d\xf0\xc2\x0c\xdc\x8bp\xf1\xbfnc\x13\x91\xd0\xa0D\x8b\x18\xb7Q"\xabJR\xcc\x1d\xa2\t\x07\xcd\xb7i\x1c\xf9\xed\xe0\x06qP\xf9m<\xe9|\x94\xcd\xe1{\xe8X3\xc4u\xcf\x81"(v#\xb8\x9d&\xf8\x02M\xcb-e\xed\xd1)\x8aW\x97i$\x06\xf8\xb2\xee\xfat\xf6na\xae\xd1\x8c?n\xecV#\x12\xa5\xcc\xfbQ\xe3=\xd2D0\xc7`\x0bs\x13\\\xd0\x14f\xd6\x10\x11E\xc5\xba\x1f\xd3\xbf$\xe7\xc7\x1d\xc7UH\xea\x97\xba\xdd:\x83\xa7\xb4\x91\x15=\xf2\x96\xa7\xf9e\xe5\xba\x1c~9\x9a)\xec\xfd\xb8\xf8\xfd;\xe9\xe46\x8b\x92l\xdb\xe1!\xe9O\xba\xac\x8fi6\x0co\xcd\x0eAd}\x95\xbbw>5\x17\x7f\x16\x05ks\xc8\xa3\x87&\xcdk\x1f\xc5\xf9\\\xbc\t\xa9=?28i}@&-\x12k\x089\xc8\xc3\x10\t\xd2\xe2,\x0f\xd8\xe4\xa5\xec9\xcb<\x04\x86k\x9e\x15\x96\xf5Cy\'\xca\xcb\xb2\xaa\x1d\xee|\xb4\x98\x7f\xb8\xaebU\\\xe7\x80')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.base import AdminIndexView,expose
2
+ from hiddifypanel.panel.hiddify import admin
3
+ from flask import render_template,url_for,Markup,request
4
+ from flask_babelex import lazy_gettext as _
5
+ from hiddifypanel.panel import hiddify
6
+ import datetime
7
+ from flask_classful import FlaskView,route
8
+ from hiddifypanel.models import *
9
+ from hiddifypanel.panel.database import db
10
+ from hiddifypanel.panel.hiddify import flash
11
+ class CommercialDashboard(FlaskView):
12
+ def index(self):
13
+ return ""
14
+ bot=None
15
+ # if hconfig(ConfigEnum.license):
16
+ from hiddifypanel.panel.telegrambot import bot
17
+
18
+ if hconfig(ConfigEnum.is_parent):
19
+ childs=Child.query.filter(Child.id!=0).all()
20
+ for c in childs:
21
+ c.is_active=False
22
+ for d in c.domains:
23
+ if d.mode==DomainType.fake:continue
24
+ remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
25
+ d.is_active= hiddify.check_connection_to_remote(remote)
26
+ if d.is_active:
27
+ c.is_active=True
28
+
29
+ return render_template('parent_dash.html',childs=childs,bot=bot)
30
+ # try:
31
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
32
+ domains=get_panel_domains()
33
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
34
+
35
+ if def_user and sslip_domains:
36
+ quick_setup=url_for("admin.QuickSetup:index")
37
+ flash((_('It seems that you have not setup the system completely. <a class="btn btn-success" href="%(quick_setup)s">Click here</a> to complete setup.',quick_setup=quick_setup)),'warning')
38
+ elif len(sslip_domains):
39
+ flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
40
+ elif def_user:
41
+ d=domains[0]
42
+ u=def_user.uuid
43
+ flash((_('It seems that you have not created any users yet. Default user link: %(default_link)s',default_link=hiddify.get_user_link(u,d))),'secondary')
44
+
45
+ # except:
46
+ # flash((_('Error!!!')),'info')
47
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
48
+ onlines=User.query.filter(User.last_online>h24).count()
49
+ total=User.query.count()
50
+ return render_template('index.html',onlines=onlines,total_users=total,bot=bot)
51
+
52
+ @route('remove_child', methods=['POST'])
53
+ def remove_child(self):
54
+ child_id=request.form['child_id']
55
+ child=Child.query.filter(Child.id==child_id).first()
56
+ db.session.delete(child)
57
+ db.session.commit()
58
+ flash(_("child has been removed!"), "success")
59
+ return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
60
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product