hiddifypanel 3.0.0.dev64__cp310-cp310-manylinux2014_x86_64.whl → 3.0.0.dev65__cp310-cp310-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 (70) 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/home/multi.html +1 -1
  58. hiddifypanel/panel/user/user.py +233 -3
  59. hiddifypanel/static/css/custom.css +6 -0
  60. hiddifypanel/templates/500.html +1 -1
  61. hiddifypanel/xray_api.py +109 -3
  62. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  63. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +67 -69
  64. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  65. hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
  66. pyarmor_runtime_000000/__init__.py +0 -4
  67. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  68. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  69. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  70. {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,173 @@
1
- # 2023-04-08T16:23:31.365716
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xd3\x1d\x00\x00\x12\t\x04\x005\xeb\x8b\xe8S}]\xf7\xa7\xe4F\xa2\xf6\x83\xec\x15\x00\x00\x00\x00\x00\x00\x00\x00/\xe6\x07\xd5\xb5\xc8\x91E&y\x0f\xac\x03\xf5\x96>?R\xca\x94\x80m\xc1\x91\x06\xc3\x11b\x8a\'\xe3.\xe7\xd8\x89\xab\x0cW}C\xe6\xbf\x01Br\x06\xe3~K(ZR\xac\nd\xf7\xfe\x9f\xec\xf1\x93\x16c\xe0h\x12\x96\xb2d\xb8=\x9d\xe1\x17\xdf\x1d\t\r\xcd\x18\xe6l\x19\xb7\xe3\xa5bo\xb1\xa5\xf1\xb1\x1f\xe4\xf3\xfe5\xec\x89\xda\x88/\xbc\x83\x98\xe7\x0e\x0c\xa8\xac\xa4\xb8\xcaMd\x1c"\xe0\xc2_\x10\xceA6F]o:@\xff\xd7\xf1\x86\x08\x9a\xdd\x11\xaeb\x85\x1a\xe5X\xe99?\x1fFCU"\xbe\xfd\xca\x90=\xfd]d\t/T;\x17\x8f\xee\x1e\xe3\x98\xa7i{\x88\xb6(n}\xf2W\xa0\xe4^e\xad\xd6\'\xb7\xa2S?\xce\x15K\xd3D\xec\x1f\xff\xd5\xb2\xbc\x88\x186\xea\xa7\xf9JM\xd4\x05\xa1\x9b\xfa\xb8bI\x08[\xb4\x9e\xf6!\xe1<\x18\xc7\xe6 q\xacL\xc1\r\xf9%\nq[\x1d\x10\x81\xba\x8d\x91\xdf\xb7d\xe6\x7f\xd9\x99\xb5\xa9\x91\n=\x9f\x9fRHE\xe5>\xbfcJ\xbb\xc1\xc6\xc0\x8dk\x96&\xd3\x86\xc8-l\x80\x0e\xc1\xc5\xeb\xa6\x16\xed\x02G-\x02\x95\xb2\x18\x1f\xde\x1cu\x98@)\x9b\xae\x0b\x89\xf7\x0eg:\xf6\xbc\xd7z\xc5\xd3z\x89\x98\x9a}\x0c\x9c\x83\x18<\xf6\xac\xe8\xd3\x9c\xe18\x0c\xf0\xbb>\x00\x1d\x87 \x7f\xee{x[\x8f\xee1k\x8d\xf4>\xa8\xaeP(\xaa\xa5\x88y\x98\n\xe73:\xa75I\xe3i\xe3\xa9\x1dS]E\xb0O\xb3\xafY\n5\xd3V\xc5\xbc\x1fXe4\xf7\x8f\x8aJ\xc5\xae\xf9\xda\xd4\xb5e\x83\x87\xd5\xa9\xa4\x13\xa5DE\xec\x84Z\x928\x16\xb9\xae\x07\xd0\xe0\xf9\xb4\x11\x02\xefR*\x9a\xe3\x89fnr\x19\xfcmS\xed\xb1\x01\xb2\x87qR\xc2\x1b\x95\xe8TV\xcb5\xee\x01\xcf\x86\x95\xee\x7f\xa1\xa6\xc0~\x89\xeeK\xc2)\x0fS\xb7\xb1\'\xd7\xefHnl\xfe\xa5:tay\xe7\xdc#\xf6\x8c\xff2\xa8\x16\xc7*\xeb{\xf8\x81!$\xed\xf7]F[X\xaeP\xa9y.\xd7\xf0t\'\xb8\xf9\x03\x1f\xa3\xc6\x8fh\x8e\x8e\x04\xadL\x85\r\n\xfb\x9a\xc3\xde\xaaw\xa6_\xdf\xdf\x97\x0b\x15T\xd4\xb67\xb1\x9b\x97t \xf4VY\xec&d\xcb\xd9\x83\xd6-\xb8%}|9\x1f\xfaQzIX\xa5\x84#\xbb^G\xb3\xb2T\x02\xdf\xa5_\'6\xb2\x94\xbbGm\x91s\xf3O\xda|X0\xdc\xf4Ry\xebTU\x17\xee\x18\x97\x88\x86y\xfcE,\xa2\x19\xa0\xf6\xd6\x03\xa4br\xe3b(q\x88\x97E\xc3\xcf\xc5\xfbQ%<\xc7\xc1x\xc7^iaQ\xdc\x83\xfc\x95\xc6\x0e\x9d`\x9d\x8a\xcd\xa1\xda\x06\xae\x98\xce\xc1+\x04G\x93d[\x02\xe8Hm\xad\xf0\x8br\xcef\x89P@\x90\xa3\x00\x9e\x81\x0c\\\xe0\xd7$F\xb7\xcb\x9e\xd3j\xc8\x8c\xde\xd5<\xe1y\xcaK\x16\xd9\xfa\xf2GsX#\xbc\xba\xe1\x92\x1eOc\xbbw\x18\x8e\xad\xf5\x8a\x89\xe2\x13\xb0\xa2\x15\x8d\x1b\xf7\xe6m\xeb\xe8\xb50Q\x02\xde\xcc\xc2eb\xfb\x03\xc0\x88\xac\x8fb\xcb\xe3\xf6{$\xfc\xceEO\x82\xb5\xea\xed\xda\x92\xb0\xd3\xe6\\\xf7\xdf\xc9\xe2\xf8\xf3Hh,\xe0\x1fT\'oh)\x95{z;\x05\xa3\xb8\'\xee\x11\xa7\xe6\xb9\xa0\xf8\x8d\x87\xb3\x1ds1\rD\xc3\x1e=\x86U\xf3\x00a\xcc\x11\x7fJ\x8e\x16\xf0\x18\x1cw\xe4vwK\xe3\xab\xe6_c\x91\xb2\x13\xbfl\xa2.\xa6\xb5\x84pU\xa6\xec3\xc19\x97a\x113m\xf7\xd0\'w3\xd3\xb6\xbe#,\\\x11\xff\xcc\xdf\x04)\xd4Y#\x95\xee+~{\rcj#\xc2\xe9\x9f\x19\xef\tR`\xfa\x94\xb9\xb6L\xefF%f\xf1Le\xee\\2\xba\xea\xa9\x94\x9dCt\xa7vlPw\xbb\x14\xf8\xbc\xd4\x00\x19\xb2\xc6\xf3\xee\x00\x84t\x18m\x85}\x08\xc5ykw|\xca\x9c\x1f\xe8\xee\x87r\x05\xb4=\xcfSxs\xa5\xa4\x11k\xdd\xce\x9e,\xbc\x04\x8c=\xc6\x84k\xda\r?e\xdd\xe8\xfe\xfdPl+\x97\xac\xacge\x1d\x83\x96\t?\x04\x8b0 /\x1d\xab\xf5\x01\xf6\x803\x94~\xec\x1eX\x9b\xff\xcb\xf7\x8a\xb9s5\n\x87\x95\x1a\x9d\xb6\xdc\xd0\xc8@\xf1\xfbq\x12\xbb\x97\xd1\x02\xa91\x17\xda\xc9;O\xe7\x05\xe5M.aX:t\xb4i\xddh]\xc7\x86%\x8f\xc62\xd6Y\x10\xceX0Z\xea\xa4f=e\x8dO\x18\xca\xd9\xe3\xf0\x9d\x96\xe3H\xe0\x12\xdf\x17\xcf\xc1\x83:\x14M%T\xa0\xb7|\x84\xc7N\xdd\x80K[\xa0q\xca5Y\x8e@M\x9f\x80j\xe9\x1c\xb4\xc8\x98\x11\x9f\\\xa7\xd9\'k\xa0?\x82?\x9b\x17\xed\xb1\x01\x9b\x9b&\x1f\xb0\xeb\xd7\x19\x0f+\xb2\xbe\xd8J\x8e\x0fo\xbb\xe6\xcd\xe5\xdb\xa5\xfc"\xde7z,\xb4\xfa\x1fjs:\xab\xd9\r\xf8\n[(8Xsn"([\xe5\xda\x7fq\x8bmM\xab\x90\xc3R\xa0{X\xeb)b\x86\xd9,\xc4?\xfe \x8f+\x99+T$\r]\xc8\xd6K\xcb\xd6;\x15\x92\xe0\xabn\xbb\xb8\xd0\x171\x1a\xf8\x8d]\x14D=\x06\xde\x90Mzu4\x01D\x03\xb01\xfb\t\t8&\xea\xb4\xd6\x85\xad\xf33\x10\xdd\x05A\x01GJ\xb6f\xe4M\xeb\x92s\x13\x8b:eB\x8c\x1f\x99J;\xbf\xc8\xd3\xbcsP{\xffLe\xd2)\xb9\xae<\xd9k\x91\x11\xe8\xa3\x9c\x9f\xed\xc1\xa1T\xb1z\xe0\x90\\\xbe.\'W\xbe\xde\xd6\xdbPJ\xca/|\x19~~\x04\xa9\x83\x9df\xa0\x88\xddS\xa8\x80\xad&TM$\x96\x88\x8f$\xee1|%\x9dE \x0b\xe7\x16\xe2$\x06\xbcC\xaa\xbd\x0e\xf1\xb9\xac\x00\x91\x94s=Z>\xf2\xf8\x1f\xb6\xf0\xe4\xa2t\xea\xaf_\x00\xe0+Q.\xd6t\xb2\x96 \xff\x01M\x1a\x8d(\x0bU\x91\x8a\xff\x0f\xca\x98\xfd\x1c\x12\x89\x8a/e\xe3C7q\xb6\xb4\x9d\x1fn\xde\xba\x99\x9d\xbc\xba\t\x1b#Y\x0cx\x08\xd6M\xdf\xdes=\xe0I\xdd\xdby;l\x82\xd4\xf3s\x9e\xe8\xe2\x03\xc2\xdf\x8d\x93"=\xb5C\x0b\xdb\xcb\xed\xe4\xdf\xf1Z\xc5\x1c\x99o\x831\x8c\xb9\x89\xb4\xe5\x98\x8a$\xec\xc1\x9f\r\x94\x97f\x99\xac\x1d\xfbv"\xa3:\xb8\xe5v\xd3\x13j\xbf\xd2z\xc6<\xc1\xb9p5\t\xbfURe\x06\x1d\xaf#\xcd\xae\xdc\x9bo73\x83\x04\x84\xedv!L\xceAt\xebd\x96\xb4\x1d3\x1f\x15\xdd\xd0\xa2P\x84\xd0\xe5o\x9b\xf3\n\xa7$\xafI\xd8\xc8\xf3\xd6]\x15\xedf"\xe2J\xdc\x07?\xcc/\xff\x95\x13\x929\x98\xde\x86Ru\xef\xe1\xa3\x85D\xe7\x7f\x8ceu0\x86M\x91-\x0b\xf5p\x0b6\xcd\xf2\xa79\x1d2\xd1S\x10\xfa\xfd\x00C\x19\xc5\x15$\xf8_\xd1\xce>\x11\x8d\x1d8\x93\xb74\x00\\V\xbd\xed\x8e\xd8(\x95w\x8eE \xdc\xaa\xfd\xa70"\x08g6\xb4\xb9\x9f\xeb\xbc\x9eB\x8agb\xf1\xa3\xb9\xb3YfDl\x97\xcd\x07\x99\x8f\x8dqE4\x15 \xcc\xbdy \x90-Had\xfc\xd0\x82\x84#I\xda\x1aSNZ\x1e\x07\x03\xa0]c\x04\xb4\x0b\xf2\xd5B\xa7b\xcc\xabe]p\xb1\x03\x84\xc3I#\x11\x86\x83\xbeb\xdf\x05\xcb\x8ba{\xcc\xdb\xc7*q\x8e\xa1\xa0\xccn\xcd\xab\x8b\xe6\xb1\x12\x95\x96D,\x99m\xe5\x19\x88\xc9l\xb3VB\t\x89\x1cC\xdfhC\x16\x9d,<\xad\x1erd\x07\r\xd2\xe4p\xcc \xb6~\x05\x90\xcb\xd3)\x99\xb1\xe6\xd51$\xe8o\x1a\x17`E+\xf7{\xc3\xa3H\xf6\xcb\xbf \xe3\xd1\xeb\x9d\x03\xb6\xc5\x9au\x7fE\xfa\xe9E\xa4\xc0~\xecY\xedn\xee)\xa5|l\x03\xae=\x87\x0e\x93\xde\xd6\xdc\x1d\xdd\xd1\xcf\x88\xbf\xd1\xf4*\xf3\x14!\xc8H\xe7\x91v\xe7\xe7$\rS\x98\'w\xfd\xc8\xb69\xec~4Y\xf8\xca\x99\xf6\xf55KQ\xf4}\xe2v(\x9e\x99+\x1b\xd4\xea"\xd3\x0e\xe0\x9a}kO\r4\xa2\xb5\xefx\xbf\x89\xc7\xce\xc0`A\xa8\xe2\xb0\\\x86c\x8e3\xed\xf6\xc3\xb4\x80\xfe\xcekuh\xc0\x1cC\xdc\x9am{\xa0\xe3\\0[\x02Yu6\xf4\xf0g\x93\xac\xde \x00z\x89\xbd@5\x1e\xd8\x8f\x033D\xfd\xaf\xf0t\x1e\x95\xa4]N\xaf\x97\xc5\xd1\x99\\\xff\xff\x1aA>\xaf\xe7\xe6*\x0bF\x97\xc4\xae\x12N\xd1\xf3\x01\x9f\x81s\xe1e\x9c\xa5W\xcdi\x96P\x10\x1d!\x1f\x00\xd1s\x15\xa7\xceDUT\x93L\x82\xe7R\x02\x11h\xd7ZF\x9d\xa4\x85\xb8gE\x92R\x80\x07\x15\xf9\xc3\xef#\xbd\xfd\xf6\xd8\xb6o\x05\xd2\xf1\x86\xe4\xe3\xd5\xb5{@\x84\xda\xb5F|\xf3\xc9:\xf3\x8b\xcd\x04\xb59\x12F\x00\x99c\x88\x88\x82.gk\x92\x85lU\xe3\x8a9\xc9|\xa4 \xbe\xd9d\xeeZ\xabB\xb9\xb9\xb3H*\x95\xd9\xea\x19(\xad\x8c\x0e\x81[q\t\xf8\xf7QM\xd7\xb3LeX\xbd.\xfa~]\xba\xb2\x18\x7fN0\x06]\xc2\x04\xf1\x11\x93MlG\x0f`\x11]\x0e\x96\x94l3{\x1a"\xd9\x18\xe18P\x1cN\xc8:\xce\x94]~$@\xf90\xd5\x96Q\xe4\x89\xebTh8\xa0/\x81a\x94\xab<\xa7\xd5\xf9\xa1\xe1\r\x12\xf4\x83D\x1dDbp\x9f\x0eU\x85\xd8~\xd1\xaa\x8d\xeco\xb4r\xe9\xc0\x03\xa9\x146\x9f\xf5\xcb\xf2\xb0!\x94\xa2\\F\xb9\xe0\xe1\x97\xa2\xc4"\x12\xafh\xa4\x90\xac\xac\x10\xce\xb3w\xb6[t\x91\no\x06Gm\x06\xacx\xa8g\xce\xe4]\xa0\x05n\xe3\xf8[\xe1\x08\xc1\x98\x9a \xd3\x9c.N\xa8)\xef\x943\r0y\xb7A}\xbd\xd804\xcb\xc8\xb1\x06=*Z\xba\xc7\xd2\x85A\xe6r|\xd4\x92&G\x1aK \xbb\x11|\x81\n=\x81#\x8b\xf6/lFU\xe0\xfc*;J)0\x8f8*s\xdf<\x17(O\xf0$\x11\x9a\x04\x81\xd3T\xb2\xb4\x03?\x84[@\x0f\x95\x04D\x01\xb3\xe0[r\xe6\x17\x93+qb} \xb3\xfe=\x8ba\xcb)RcO\xec$6<Kc\xdb\x8cy\xd5\xe4\xf6#h$\x1e\xc1\x89\xd3\xc5\xe5\xb1\xafB"\x12\x9d-\xb7\xdf\x01\x96\xbe\x15u!\x817\xb2\x94k>\xc4o\xb0\x7fmE\x15\x05\x93A\x9d\xbaw\x99bk\xfe\xe5\x892\xe4/\x98\xef"y\x12eu4\xcc\x81\xf1\xdf&+\x03\xbc\x9f\x13\x8e\x9dH\xf7\xe9\\\xc3\xeb\xa0(\xee\xd8\xe3\xe7\xc6\x13\xf02\x03\xc6 \x00\xfc\x05\xa6\xdd\xd1\xbag\x95:\xf2[T0_|2\x94\x8e\xc2}\xc0\xd8=~X\x05\xbd\x0cf:Y\x11tuR\xf3J@\xb0\xdb\xf2\xa2\xa7\xc5\xc7\xef\xea\xe4\xb0\x13\xad\xe0\r\xf2^2\xd5\x91\xe9a\x92\x8f\x17\xd1\xb8\xb4\xfd\xf3\x98\xc9\xcd\xb3C\x80\x9a\xba\x13~7\x0bX\x08"I1\x8b)*n\x95\x06\xf2*\xb8b\x9f[\xa8A\xf5\xae\xfd\xdb\xf2\x8c\xa6GL\xbd\x8a\x94\x89\xef\xad\xcb\xce\x9fS\xfd\n\xda\xabd\xe4\x97\xda\x01\xe2?\x0e\xba\xe4Iz0\x9a\x7f\x11o\xb8\xb2\x90\x113\xd4~$\x83\x97\x93\xc6\xa8A>rqR\xca\x83\xa5jC\xc1x)*\xcf\x9cj\xa9\xd3!\xf7\x10\x7f\x85\x1e5 J\xaeQ\xf1\x9b\xa7\x93\xa05"\xea$\xd6kbe\xef\xc8\xed\xb8\xf3[8\xf7v\x9a\x08\x03\'\xffww\x14\xb1\xac\xfcf\x87o\x19T]P\x97\xa9\xb6\xd4\xdeY_\xe1\xb4RS\xf3\xe7\xfc\x19\x1ct\xbd&p-\x86\x9b\xbaZ/]\x03\x9d\xe8\xb2\xd7\xd1\xe9\x94\x8e\x9f\r\xf4\x03\x07(\xdd|\x17(\x9c\x8f\xb2B\x87\x93\x03\xd6\xf4\xe1\x97I=\xa8\xaa\xf2\xc4\x9f]\xb6\x83\x8fX\xd9\x07\x10+\xdd6\xf5[C\xf4\x8fh\x038EkD\x80tEe\xed)\x064\x9a8\x9e\xd0\x9a\xba\xa0\x99\x90A\x11\xcd\xbfOm\xd6d\x02q\x01x\x11\x04\xfb\x1b\xfd\x14\xc8\xfb2\xf2\x13\xe4\xc3{\x94\xa9>\x89\x94\x94\x07/\x0b\xc2\xc8\xf73E\xb3\x0e5\\$\xb4\x7f\x1b\x1c\x89\x7f\x04r\x0c\xd8s\xc4Z2\xf3\x8a\x05F-\xdbnE\xe3\xe9\x96\x06\xcc\xc3\x9ef\'\xc5\x96^j\x08{f\r\x87\xe1X\xda\x86\xc4\xac\xa2:\xbeV@\xfc\xc5\x15IY1\xe7\xbe\xd1\xe4r+\xdc\x85\xba\x86\xb6\xfe\x0b\xe9\xe5\xed\xa7\x9b\xaa\x88\xd5%\t\xd8\xba\xc8?\xaf\xa4[\xe7\xe1\xc47*T\x97\xca\xffw\x8dw\xc5\x11_\x92/\xbd\xc5\xfc\x9ef\xb8\x84j\xc6{\x92\x03\xd2\xe0n\xee\xb4P\x93Z\x92\xda\xff\x813ok\xc3\xb2\xf3\xaa\xccB\x9f]H\xbc\x96\x90f\x9d\xb8I\xa2\xd6\x95\x18\xf7:\xac\xa7\x1a\x03<>6\xdf\x00\xdb\xd1\xef7d\xdd\xe2\xcbN\xf7\xbb\xe22\x8a\xb27v~\x17\xa6i\x98\xfa\xffh\x96_\x02\xbb\x01W\'A\xe3\xed6D;w\x9cL\xdc\x9cL\xd2\xcb\xc1\xd4\x95\xb8\x1bh\xb7f\x8a\xec\xaf:\xff\x81\\\xa5\x94\xf9KM?4\x98\xf4\xcf\xf1\xed\xcf\xbc\xba\xc2\x1e\xfe\xb4i\xb0\xe7\xddSXH\xd0\x0e3F\x821D\xcf\x8c,?E\xa60\x9dS_u\x9e\x0c\xdc(z\xdd\xd7\xf4\xc0.\xba\xf6\xce+\xf1x\xc0\x1c\x9e\xd61t\xf1\x85\x96\xe0\xce\x93\xb7\xf1\xf6\xec\xb1p\x84.D[\xbb\xa5y0\x80\xc3H\xba\x01\x15m\x00]\xcdh\xdcZF\x16r\xb1\xa1\x14-\xf9"\x9a\xee\xf0\xcb\x03f\x8a2(n\xb0\xcd\xdf\xd1u\xba\x96,\xd4/f\xf5\xaf\xb02\xdc\xb5\xd9\xd8H\x0f\x86\xbdh\xed\xf9\xe8\x97\x9d\x95B&\xbb\xd6\x906\x1f\xaa\'\xf2\x85\xf4ig|L;\xee\x842S\x0cw\xfb\xe7c\x8f\x8cS\x84t\x03\xde\xb1\xcf\xa9\xac\xc4\xdf\xcb\xe9\x8a`\xd8\xb1x\x92\x81!\xdaf\xe5\xdf\x978\x99\x0b\x04\xc1VR\xc3\x00H\xb9\xec}a]\x1f\t\xb1jY\x893O\x85s\xae\xfa\xb5-xd\x8fwAo5\xca\xfd\xb1@+\x85\x19H]\xd6>P\x1bUV\xfc\xe8\x1f9\xb0)\x03K\x12\x80b\xa5\x80\xeb\x0f\xdd\xc5\x08JS\xb7R\x0c\xf91wW\xe7\x1b\xb2*O|\xdbi\xb9B=A\x87\xb1\x83\xea\xbbS\xc2\xed\x92\xb3z\xb2\xad\xd4\x88\\\x80\x88l\x03U\xb3-\xbd\xcf\x8a\x9f#\xe3:\xe8/k\x15\xbd\xb7\x99\xd6\xb9\x8e\xa2\xa0\xe6\xe5\x97\xff6\x12.\x85%3<\xec\xda-\x1c|w\xc9\x9e\xdb:3|\x9e\x0c\xb9Y\'\xa86m\xb4)\xe0\x0eq\x02ZI\x84\xceaHw\xbf\t\xf1d\t\xb8\xf8\xc8\xeb\x9a\x83X\x8a\xfc\xfd\xf8n\xe3U\xdb\x84.\xb0\x81\x8b\x17\xdf[BZ\x94\x91\x057*\xedc\xf5\x80\x81\xcc\xe5\x05=\x1d\x86\xc8Fzc\x16u\x0fIt\xb1\x98\x93A\x9a\xdbi\x187\x04\xaa\xb9\xb4R\x0b\xe9\xbaP\x07\x94\x16\xe1wY5\xa5\x9f\xeb\xb3\xe0.\xd6\x91\x17q5C3V\xde\x85\xbc\xc2\x06\xcf\x1d\x01\xed\xe5\xea+\xf6\x99\xab*\xe1\x9c\xb5T)\xc1\x15\xa9\xc4\xd3Z\n\xbfb\x0cnb\x1b:\xd5\xd0p3\xe7<\xd48\x0bT\xdd\x04\x05\xd9\xf0\x9b\xe3\x01\xf7\x05\xdb]\x0c\x8f\xc6\xad\x8c>\xabZB\xa1w0l\xe2\xcf\xa0\xb7N3\x85\x93#\x83\xfaF\xc0\xb8\xd5 m\x8aK\xae5\x8e\x01\xdd\x14z\xf60\x1eN\xb7\x8a\xee[Xx>\xbd(\x8caj\xd3\xef\x9c\xf0\x0f\xd7\x1f\xc6\n\x05\xbb\xc0%\xce\x18\x98\x1f5 \xf3\xfeXA\xfa\xba\xf6n\x9f\xba x>\'\xe95\xf07\xf6?\x98\xa1z+\x1c_\xe1\x9a_\xe5\xad4\xb0<\xf4A0\xd2\xfd\xd9R[\xd45\x07Z\xacD\x13\xf2\xa3\xc5;\xcc\x888\xd0\xa8++-\x1a+\xf3\x8c\x0cx\x08\x8e\xb0$\x8b\xc7\xa5\xabS3@\xdf<i\x8d\xecC\xf3\xc7\xed\\h]\x17P\x87A\xe2\x11\x86rk\x1f\x15\xebzo\xa5\x93\xe1\xdc\xda\xa2a\xcc\xce\xfc^\xe5\x08\x0f&\xc0\x16\x12\xc8\x8f\x99m\xf4\x8b\xbe\xc1 \xde\x11\x7fK-1\xf5[\xc1\x96\xd4\x8d<\x9f,\xb8\xb8\xf9p\xf4\x1a\xfe\xa9\xe9\xf7JPxt\xb6\x82q\x02\x91\xb0\x8d\xb5\xa6{\x8d\xddI4\x98\xdf\x99\x99\xf0\x0e\x8f\xe5\xe6<|\x11*\xad2\x04\x89Q+ \xc6+W\x9c\xf2\t.!\xb52 \xfeW\xa1\xcb2\xbe\xf7y\xb9jSw\xceH\xd4\xb1YX=\x1c\x07\x8dy\x0f\xf1\xee\xb9\x02\xf7Hnd\nn\xd6\xa7*\xf6+V5\t\xd4v\xb1UR\x82\xf6\x9e\x1c\x97/\x17\x0e7\xdbY\x94a\xcaw\xeb\x17*\x1d-\xab\xb57\xad\xda\x9ed\xdc^\xbbIn\xaf\x07\xc3*\xcf\x1c\xbeEur\x96\x156\xdaOPt\x00\x10\x11G\x02\x8d\xc8`J\x06\xf1f\x94\xe26\x10wc\xfe@f\xce\xfa>\xf1r\x9c]_\x04E\xe0\x82A#^A\x7f :\x88x]\xcb\xb3w\x04k\x9b\xb1~\xa3t\xbb\xcf\x02B\xb5\xf6yZc\xa9\xd7e\x9ad\x9ef\xf8\x1d\xf7O!\xf3\xba\xe3\xda.\xe6\x85\x1a\xba\x14\xf0\x03\xb0\xca_\x1d\r9\x13}\xd7\x82g\xd5\xba\x8a\xfa\xb6\xa7\xe7\xc6$\x1b~~\x1d3\x0f\xbe\x913\x87\x94\xed\xf7iU\t}\xa5\x9f\xeff\xad\x12\r\xd1\xeaM@\x16I4wh\xbcS\x8f\xad\x08\xc6\xcb\xc1\xab\xda\xd1\x8c\xee\xe1c\xde\xc5\xdal\x84\x1e\xe24i0)y\x94P\xacH\x16\xd1\x85>\xa0w@\x84\xf8\xa9\xf2\xf1g|JfI\xb2\xf0w\xcd\\\x1c-\xb0\xcd\xa4u\x0c\x81\xd9=\x12\x0cn\x8b\xf9\x93sI\xdbB\xb9B\xbdf\x8b\x8e\x13s\x01\xf6\x04\x91\n\xddN\n\xde\x8c\x001\xa7>7\xf2\xba\xead\xe8\xba\xec\xcfx\xcc\x13\x8d\x8e\xe1m?X\x86#U]\'\'\xdd\xb9[\x1e\xd1?\xa0s+\x16\xc6\x83\xc8\xf0\xf7\x93\x8ef\xc6\xac<\x94e\xe1\r\xc9\x9c\xee\xd6@\xaa\r\x9e\xef0\xc3\xf4\xb3\xe4T3\xca\x17\x0e!\xed\xad\xe6\x1b\xfb\x84\xc0\xae\xdd\xbb\xaaH\x9b\x91N\x06\xcc\x13\xd8\x15JB\x7f\x9b\xa5\xc3P\xe4\x94\rg\xa2ol\xe7?\xcd\x15\r\x94$\x8a\xef\x8c\xdc\x97=\xbc\xf9vdZ\xba9\x1a\x88m\x8e\x89\x88G\xe8g\xa1x\xc0[\x81\xcb\xee\x14H8\xe6e\xdbe)\xcf#"\xac\x8cU\xb6e\x19\x91\xf4R@J\xcd\xa4\xfc\xe7\xe96}\xb1\xe8\x7f\xaf\xaf\xc0\xeaT\x10\x8f\xbf\xf2\xd4\xce\xec@\xb7\x8f\x9c\xbbX8\x12\x1ad\x8a\xa5\xce\x8e\xd96P\xc8\xc7\xf2\x88\xed\x1bX\xa9@\xb4FN\xde\xd7"Z,\x17\xc3\xf4\xf5\xfbW\x18\xca\x19\xa8\xed6Z;\xe9\xed\xfeJ\xa7\xd1\x0b%\x8d\x12\x87\x0c\xe4\x91\x19[Y\x98\xb7\xd5\xa7\xdb\xdaMQ"\x88\xac\xc6\x01S+\x0b\x12%\xd4\t\xdc\xe9gb\xach]t\xdc\xba,\x1e\xfc\xe7\xf7\xbf\x04e\xad\x8e\x00\xbd\x88\x0f\xcbFw\x9f\xe8^\x9cD\x81\xcf\xa1\xeab\xb5gV\xae:W+\x01\xf3\xff\'\xb0\x1c\xc0)D\xe0:\xf5u\xac\n\x9b\xa5\xd1\xc7\xa7\xe6E4P\x89C\xbc\ra#\xd3\x18W\x1d\xbdA\tm\x85\x15\x17\xfc\xcb>\xdc`B\x1c^r\xf1\x17\xf6\xae\x83*\x00\xd3Vv<;\xe0G*\xc3\xc0\x11\x05r\x11\x1a6\xe0\xcdi\xa7<a0\xd9\x0b\xdaR8h\x8di<(\x1d;\x81\xebc\xb8\xe6Y\xecR;\xbc\x8a\xfb\xcb\xd3\xad|\xe7\xca\x15\xd5\x9e\x15\xff\xc0l\x88\xe5$\x94(\x04\xf9\xf57.\xe7\x0c\x17\xfcL\xd1`\xb1\xd9\xc0\x06CF\xfa6\xbb,\'\xceNo\x06\t\xd1y\xcf\x053\x1c\x118T\x99c\x17\xe1\xb2gO\xb3L\x07P\xcc"H%\t\xf2\r\x1d&\xe3\x1c\x150\x00\xab\xa6\xed\xa2\xa6\xe2"\x08\xda$\x94\xa7W\xf1\xc1\x01\x96\x18jC\xb4\xe2\xbd\x88\xda\x7f\xcd\x01\x05\xba\x1e\x95\x8b\xea\x96t\xa9oa9\x9f\xd0\xa62\xf3\x9d\xc0u\xf3\\\xc9\x8b\xb1\xa2&*O|\xc9(\xbb\x12\x90\xc3\xe7\xb4\xc7\xb5\xcd\xfb\x80\x91 [\x1a\x85\xf6\t1\xa3\x8b[u\x99w\x0b\xecvuw\xeb\xf7g\xc6\xea1\xf0\xef\xfb\xf9\xf3\xa9d\x9c\xca\xae\xe1\xe4\x1e\xc7\x1e\xc0K\x0f\x9ey\xd4f\xc5A\x97\x03axPY\xb3!i{T\r\xb7vV\xf0\xc0uv\xe0\xdeF\xcb\xa7]D\xd5\xe2\x8f\x9eD_\x13\xbe\xc2\xd8\xc7\xfc\xa5\xf6\x9a\xb3\x8c@\x97M\xa4\xf2\x98b48\xce4\xe7\x80\t\x1aZd\x8bCe!`\x1e\xcc\'\x14z\xfcr~3\xcc\x95T\t\xa3\xfa\x90\n\x0bW\xafp\xdc\xc3RJ\xf2\xe7\xfc\xf7\xaf\xd0<\xc5\xa9\xb7\x1e@x\x83\xd9\x8d\x94A\xa4\xa4\x9c`b\x02\xeeP\xcer\xbfC\xa4\x9d\x115\x8b\xe1}\x90u\xf7a\xbc\xfa\xab\xd5\xf3\x90\x0f6\xdb\xa8\xa4\xc0\x17kb\xe9_P\x94\xe9\xa0\x99D\xfc\x83\xad\t\x12H\x9c6\x87\xb4\x1a\xbb\xa5\x16\x0c\xc0\xb5\xf1\xe6P\xbb\x9e8\x14\xeb\x83K\x03\x0b]\xa8\xad\xcac5\x92n\xb2\xa5\xa3\xed\xc5\xe3J\xd3\t\xad\xd7\tB\x08\x8a\x1a\xaa\\\x8b6j\xde\x17Y\xb3\xb3\xf9\xc3\x05gY\x85\xa4~\x02\xca {Z\'\xde\x8e\x117aXaLJ\xec\xba\xc9)\x86\xa7\xdb\xa0\x9e\xa7\xeb\x8dG\xbex}\xf8MP\xa7\xbd\xdc\x80\xde\xb2C\xd2\xb9\xbd\xf7[\xb3\xe2\\\xbb\xf8\xfe%L\x97\x05J@\xe4TA\x9b\x0b^a\xd6\xb1(\xa9K8\x9e\'\xde\x9b\xe0\xe0\x19\xfao\xf6\xb9}\xb1i\xb1\xe6\x93u(\xc8\xa3S7\x83\xb92\xef.\xda\x1a\'\x99\xb8D\xc9I\xd0\t\xc6^gu\xb5\xf6\x0c\xc4\x9c\xca\x1b\x9e\xce\xa6+$H\xa4A\xcc\x18X\xa7\xadW\x9b\n\xca\x03*\x88\xc6\x0e\x98d-\xcb\x14o"SX\xb4\xbeK\xa577Xr\x04\xbcZM\xa7\xb9M\x91\x0b\xfc\xd1]\xb8\xe8\xf6\xd3jS\xa5U9\xda[[\xcavS\x94\xf52\xc4\x06H\x8cX\x95U\xc1\xfe\x0e\x9aqs\xb4\xff\xb9.\x89\xf9\x94\xd3\xb9yr_\xc5\xdb\xde\xe9\x1eH\xb9\xe8e\xa9\x89\xf1\xcf\xedl0\x0f\xc2.\x99\xca<\xab\x86\x92c^\x146\xa4\xa7\x1aR{\xa1>\x15b\xa9\xdf\xc1\x02\xf3\xcd\xc1_\xd1=\x90\xd7/\xec\x00\x89x\xc44\xc6\xbe\x823\\$\x123\x84\xdf\x17\xe5\x12\x87T`S\xab\xb9\xbd\x8a)\xf1\xd7\x07\xb6\xc7\xce\xb9\x90\x10\xdd\xce\x93\xe1\x1c\x01\x87\xc7\xd9\xbe,\x12\x89\xff\xf7\x18B\xfe\x19\xab\x1d\xfa\xf0\xb2\x9c\x92\xc3\x066K\xb2\\\x04\x13\xf9\xf3t\xd7\x80gvLW1\xb9\x1dw\xaf\x88\xc5\xc5\tH:\xe6(\x15tq<$\xf8\xf87\xc7\x83\xe2\xea\x8c\x07\xdc\x11X\xd2\xd2\xb8iGd\\\xcd\x98\x90\x13\xf1\xdc.\xae\xa1\x9d\xe25\x93\xe9\x1a\xe6\x1a!4s\xf4\xa7\'\x01\xa0\x9c\xe0H\x9a\xbe\x0e\xb8\xb3\n\xff\x08B\x084$\xc4\x9a\x1f\x03\xf8\xfb\x1e\xe4P:o\xb7[\xf2\xeaC\x1a\xd1\xea\x89\x04\xd7\xb7\xc7\x92\xa7\x15\xff\xb1\x18\xe5\x8d#\x8am@1\x93\x03\x8c\x99\xadE\x99\xe0EYCKTNW\xf4nQ\xaa\xdd\xa2B\xf9\x86X\x87\xd4A"\xf4\xfd\x0bb/\xd8O\xfe\xb5L7\xc9\xda\xb1\xe7\x8e\x8a\xfe\x82L\x7f \xb3L\xfc\x9d\x08\xc8\xd8\xb0\x15\xa1\xc0\xfb{\x10\xa7U\x150\xbaf\xe0\x99y\x08\xc3\xf5f-\xec\xa8\xa6\xec\x19\xe8\xfb\xd7\x91\x13\xe3\xee\x8a\tk<UM\xcf\x17\xd8\xaf\x98yW\xd1$\x84 \xf7\xe7\xfa\xd9MN\xc7\xe4\xcb\x00\x05\xc7\x00YG\x91\x88E]\xfc\x88\xd8\xf0\xd9\xb8\xef~\xc1\xe0\x16\xb4\xbf\x97S\x0c\xa5\x086\x0f\xeb#\x03Z\x85\x8c\xa4Q\x81\xe7\x0e\xa1\x8a\x03\x0f\x0e\xc4\xb1\x9e\xf3`\x1etz\x12\x05\xd6\xc8\xd0,\xbb_\xc5\xdc\x8b\xab\xc4(\x03\xae\xa3\xffo\xee\x18y\xda\xf6F\xd2N\xed11\xf7\xbcV)A\xafX\rZ\n\xad\x0c\xb5\x0e{y\xb1T\xdc\xa8\xa4\x1dJ\xeay\x81-@\xeb\xc9i\x84\xccd\xb4\xcfe9\x17\x9a\n>_FF3T\xff\xfb\xa2\xaf\xbe\x93\x03\xbf{\x13\xbc\xe4\xc4{\xe7\xe3\xf5\xe3yx\tl\x12\x8e\x1d\xf5\x87\x9f\xcar\xb7\x01\xd2L6\xe5y\xf3X\xc7\xf5\xcf.\xd1\r\x99t\x13w!\x08\'\xc3>\xc04Cq[\xc5Z\xfe\x8b\xdf\xf8{\x16\xa0\xa0#\xf4\xc9\xd8/~\xb4\xd5J_\x8bV\xc7\xbc\x9c\x05\xbb`1\xb2\xa5\xb3\x1bAS\xbd6\xef5\x8c\xeb@5\x15WrCN\xabKm[\xd9\xe4Z8\x1a\x81\x01\xea\xf0\xb3\xb7\xd7\xc2\xac\x02\xd1\x03\xf1FV\xfa\x02\xe9\xb4\x06\x92ts\x88x\xc0-*\x96\x8d\xe7W\xbb\xd8\xd0\xf1\xe8\xa3\xfcu\xf7qZ\xc9\xd4\xcd\xa0\xf032\x96T\x9a\x10;\xb3\xd800\xae\x1f\xc0\xb0\x1a\x05%\x88\x97\xcccG\xde\r=\x8eeE,\xd6\xdc;\xde\xb4\xb2\x10FzSZ\x808\x0b\xcf\x01I\xb5\xa7\xf0\xa4S["\xdd\r)\x15\n\xec\xa2\x1f>baa\x0c\xca\x9061\xce\xd0\xd3\x9d\xa7"h\x04\xf1#\xbb65\x1e\xcf"\x8b\x19\t\x98\xfc\x9f\xe0C$At\x81\xfa\xe4\xbb)[\xfc\xd8-_<p\x04\xad\xcf\xe9\xf7\x93Q\xacA\xf5V\x8b\x01\x94r\x92\x04\xf4\x9dCW|\x05}\xce\xd0\xed\xd9\xfd\xe4\x00\xb5\xeb\xdfSE:\xc28=\x0c\xfd\xc6\x93"s\xad]j\xf6\x99\xc4\x13\x04|\xc2\xfe\xe2\x1bi|\xd0\x8e\xac:\xa5Q\xdd\xa3h:1.\x96\x85;\x04,\xc8\x982A\x99\xa9g\xd0\x02\xb9u*\x11\x07\xb8\x15\xd7K\xa5.5l\xcbP9\x1a\x8e\xbdn\xb1e)\x1eiW\x16\xdf8Q\xf8\x07&\x1a)\x0e\xce\xb9\x08\xb0\xd8\x1f\xff\xb3\xf8u\xf4\x96a\xd3\xc8\x9e\xd0\x12q0\x8b\xde\x19\xa2\x1c\x88\t\xbfQ{y\xdd\xfc\xd7l\xc1\xd8G\xda\xdc&\x07\xa7\x81\x06(\x10wtlP\xa4\x82|\x95f\xbf\xde\x80\tx\x0f\xd1\xd4l+\x94"$\x9c\x98\x86\x15B\x00g,R\xae \x8f\xbf\x13\x1b\x1c\x1d\x02-\xc7i\xe4\xe6.\xb5.\x83G\x9e7\x97\xfd&\x92b\xb58<\xe6\xe0\x15FA\xcf\xc8}\xb6B)\x07i\xc1\xb4\xeb-\x963\x9f\x06\x83+\xc1\x93\xfe\xca\xfe\x11Z\xf6\x80\x02B\xf8\xeb\xed\x1f_\x04#^\xa6\xa0SB\xe5\xf1H\xb5\x06Y\x02\xbe\xe5\x1c\xce\x93n\x95\xa7\xa9\xe0\x84?K\xfav\xce\x9fH\xb5\xb60\xaaA\xfcX/\xce\xb4\x99W!\x9f)\xa8\xbc\xfd6\xf6\xcd\xd9s\xd6\x8c\x1a*\xc0\x8f\xf9\x96\xb1\xcf\x11\xf1\xf7\xe1\xf3\x08Q\'\xe2t\x15l\xc4\x99\xd2;\xc7\xcc\xa9\t\x91\xe5\xedX\xa7d\xa6\xed}\xfe\x90\xd0\xca\xbe\xae"\x1a\'qB\x85\xead\xc1u\xb5k\xa9\xa1i1j\xaa\xd1\x05\x06V\x14\xb8 >\xa2Z\x80\xd7\x1d\xc9\xc8\xbd\xca\x8d[\x91\xf0\x03b\xf0p\xa1R\xeaI\xa1@F8\xd2#kh\xea\tw\xaf\xd7\xfdx\xe0j-\xa8\xc5\xf4\xf1k"\xb5.\xf3\xbb0\x94\x9d{\xd9\x9c\xa1\x13#\xca\xed\x06\xa9\xf4c\x0c\xb7\x85\xd0x\x82\x93\xa5\xa8\xbf\xb3(P?3o\xfd\xa01F\xe0A\x90\xfd\x99\xcb\x95\xf6di\xb0\xfc\x1b\x91\x9e-;\xdfi\xb1\x9d\xd70\xc5\xc4gY\xdbFZk\xea<\x02\x05W\xb0*"\\\xa3\xf6^]\x9e\xcd\xc2\xe3\xba\xab\xa5l\x99OE9\xe8\xcd\x85\xbep>W\xb7~M\x9bT\x0e\xe2uX\x910\xab<\xfc\x03D\xab\xa6\x0b\xe1\x1f\xf0\xc9\xe6\x1c\xa4\xfe\x08\x9c\x12h\x9f#\xee/\x85\x07\x8d*\xc1\xd3\xef\x86m\xf0\xba\xd8;\xccH\xc3\xee\x89\x8f\xbf\xa0\x1d\xaf\xe7|u\xe9\x97\xa9\xe4\xd8\x9e\x12\xcdNh\xdd_\x16uI\x9f\xe9\xfd\'\x01XS\x97\xa6\xd9\xf7Q\x8d\xda6\x02\x03\n\xd6\x1984\x86v=\xc5IS\x8e\xa5T\xba\xecs\xab\xb6\xf3\x101\xbd\\P\x01\xd5\x87ue\x02\x11\x89"E_\xf3\xdbu\xa0\xceiy|\x1c\x8b\xc0:\x87\x8c0\x9d\x9c\x07\xd6\xc3c\xb2\xee\xb3\xc5\x8c\xb7f\xb7v\x8b#\xf2$\xaf\xeeW\xa8\xb3\xb53\xfek\xf9\x03\x06\xb6\x9c\xe0)\xd2$\xebcV\xcf\x9d\xbe\x035\xafB>\x15\xc2\n\xa8\\`\xe5\xf5\xca\xe8\xb3\x14\xb8\xe3(\xff(\x03=q<\xdd\x1b\rl\xd6V\xe6\xa1\x180&\xee\x97\xd2\xa4\xdc\x7f\xa9\x1c\xf6\xf3\xa6\xa5\xbf?rz.\x9f\x9f\xdbR\xe34]\xc96s\xe7\x1f\x18\x07\xa6\xf7\xa3g\xeb\xc9\x96CTn\xce~\xad\x12H\x17\x99\xbcqH|\xb2I-\xad\xe4\xbf\xa02\xc7W\xc30\xc5RMR\x0c\xfeX\xe1\xcc7\xed\x07\x1b\x99@\x1a\x93!W\xbc\x83;\xa8\x1a\x8a8=\xfc_14\x7fNRK2\xf9\xbd\xcd\x19\xc8\x14\xf2X\xf4\x82\xe7\x06N\x84gz\x9aT]\x06\x97n\x87d$Z\xe4\xf3\xd8\xe7\x11I\x81#MHQ\x8a\xd6:\xde\xe3s\xbaw~z7\ni\xf5\x83\'a\xbb\xf6:\x8e\xa3\xa8\xf0\xc0\xbd\xe8\xb3&\x1f\x94y\xda\xc24\x87\xc6\xaf\x99q\x19\xe1\xeaj\xb8\xafJ\xfbf\x89\x85\xdf\x9f\x8b\x85\x9a\n\x84\xb8^-9\x14\xe6p\xce\xff\xea\xa3\x19N\xfb\xb4\xad\xbeq_\x8f\xad\x88\x92\xd7D\x81\xa8\xc7\xf2\xa2\xf3Q\xf2\xe9\x87\xb8\xcc\x84x\x13\xfa\xd0nK\x18I\xbf\x9al\x10\x9c\x7fM2:\x14tQI08G\xed)\x91S\xd4_\xd8#\xd0*\x11\x12\x92\x7fo}\xdc\xee\xbap\xb1\xf3\x0b0\x15clW^\xf4\x1b\xae\xdes\xe9xXO\x1b!\x06\xb2B\xc5\xe3$\x1dYL}\xf0\xb8\xe4OM\xb4\x17t\xa2\x0e\xbcy\xa0&\xde\xa8=\x11\xa3.\xcf\xe1\xb0H#\xb8%D\xd8bZ\xf1e\xdf\xfcU\x1c3\x97\xac\xa0-\x99\xf8\xc7\x95\xfe\xfb\xc5\x84Am\xa2/\xef\xf2]\xc4f\x9f\x03\xe5$*\x1a;@-\x8f\xd0\x8c5\xc6P[\x15\x8d\xfe\'\x8c>(\xb1\x15?y\xb2\xe2C\xaa\x10F\x99\x8d\x8a[=\xd8\xf9\x10\x19XN\xe2<ER\xbe\xf1_R\x8c\xc2N\xbaO\xb3\x0f\x8a\xb4gLT&-">\xad\xbb\xcf\xd8/R#\xcd\xd5\x1d\x81\xde\xf4\xa4\xa3O\xba\xc3\x97\xa4\x0e\xa7\x01]\r\x07g\xf8O\xa3\xee\xca#\x81k\xb2s\xa3\x109\xb6y$:Al\x1f\xd6\xcb6\xb4\x8b\x9c\xa8\xbdI?79\xfe\x06U\xc0~5g1\xf2\rQ?T(\xf9=\xd4I\xab\xd3\xb4\x10\x86~.\xac\xa4\xc5k\x83\xe2\xeb\xcf*\xcf\x9e\xb8\xa2\xe5H\xa4\xa9\xb6\xbe\x99\x8bO}\x8a\x8a\xf7\xc3\xb25| \xdf\xe4\x85h\xc2\xd1\xa7\xac\x1f\x81\x13,\x15\x7f8!!J\xb8jmG\xaa\xa1\xb2]\x89\xe6\x98\xf3\xa8\xd3\xc17z<\x93\xa5\x94\x8b>8\xf9C*\xf6\xe5j\xb5\xf5o\x92\xd6b\xd3\xa1m\xf0\x00\xf5F\xd4\x86\xb1U\xc3\x99T\x9d\xa0\xba\xd6@\x1d\x17W\x8aGd.\xe7"\xca\x9f\n8\xbc\x95\tJ\xe4p\x0f46\x15P\xab\x11\xcb\xaa#A8Y\xda\xd0y\xcdj\xdba\n\xdc\x05\x91\xa1\xbes\xccx\xcd\xe7\x87\x95\x86\xbd\xbf\xb6\r\xcd\xd7?\xff\x1c\xcdW\xeaf\xc8!?rt\xa1\xc1\xaeZ\xe2\xb9\x0cTy\xf1\x9e\\\xdaD\x9f\x98-S\x84 \x0eS\xd4\x13\xffiw)\x84\xfc\x8c\xb5\x83+\xa9\x9a\xd5\xf5\x00\x8a\xb3\xd6\x94u^\xe8\x8b\x15\x12\x84\x98\xcb\xef0')
1
+ import datetime
2
+ import uuid as uuid_mod
3
+
4
+ from sqlalchemy_serializer import SerializerMixin
5
+ from dateutil import relativedelta
6
+ from hiddifypanel.panel.database import db
7
+ from enum import auto
8
+ from strenum import StrEnum
9
+
10
+
11
+ class UserMode(StrEnum):
12
+ """
13
+ The "UserMode" class is an enumeration that defines five possible modes: "no_reset", "monthly", "weekly",
14
+ "daily", and "disable". These modes represent different settings that can be applied to a user account,
15
+ such as the frequency at which data is reset or whether the account is currently disabled. The class is
16
+ implemented using the "StrEnum" base class and the "auto()" function to generate unique values for each mode.
17
+ """
18
+ no_reset = auto()
19
+ monthly = auto()
20
+ weekly = auto()
21
+ daily = auto()
22
+ disable = auto()
23
+
24
+
25
+ class User(db.Model, SerializerMixin):
26
+ """
27
+ This is a model class for a user in a database that includes columns for their ID, UUID, name, online status,
28
+ account expiration date, usage limit, package days, mode, start date, current usage, last reset time, and comment.
29
+ """
30
+ id = db.Column(db.Integer, primary_key=True, autoincrement=True)
31
+ uuid = db.Column(db.String(36), default=lambda: str(uuid_mod.uuid4()), nullable=False, unique=True)
32
+ name = db.Column(db.String(512), nullable=False)
33
+ last_online = db.Column(db.DateTime, nullable=False, default=datetime.datetime.min)
34
+ #removed
35
+ expiry_time = db.Column(db.Date, default=datetime.date.today() + relativedelta.relativedelta(months=6))
36
+ usage_limit_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=1000, nullable=False)
37
+ package_days = db.Column(db.Integer, default=90,nullable=False)
38
+ mode = db.Column(db.Enum(UserMode), default=UserMode.no_reset,nullable=False)
39
+ monthly = db.Column(db.Boolean, default=False)#removed
40
+ start_date = db.Column(db.Date, nullable=True)
41
+ current_usage_GB = db.Column(db.Numeric(6, 9, asdecimal=False), default=0, nullable=False)
42
+ last_reset_time = db.Column(db.Date, default=datetime.date.today())
43
+ comment = db.Column(db.String(512))
44
+ @property
45
+ def remaining_days(self):
46
+ return remaining_days(self)
47
+ @property
48
+ def is_active(self):
49
+ return is_user_active(self)
50
+
51
+ def is_user_active(u):
52
+ """
53
+ The "is_user_active" function checks if the input user object "u" is active by verifying if their mode is not
54
+ "disable", if their usage limit hasn't been exceeded, and if there are remaining days on their account. The
55
+ function returns a boolean value indicating whether the user is active or not.
56
+ """
57
+ is_active=True
58
+ if u.mode == UserMode.disable:
59
+ is_active= False
60
+ elif u.usage_limit_GB < u.current_usage_GB:
61
+ is_active= False
62
+ elif remaining_days(u) < 0:
63
+ is_active= False
64
+ return is_active
65
+
66
+
67
+ def remaining_days(u):
68
+ """
69
+ The "remaining_days" function calculates the number of days remaining for a user's account package based on the
70
+ current date and the user's start date. The function returns the remaining days as an integer value. If the start
71
+ date is not available, the function returns the total package days.
72
+ """
73
+ res=-1
74
+ if u.package_days is None:
75
+ res= -1
76
+ elif u.start_date:
77
+ # print(datetime.date.today(), u.start_date,u.package_days, u.package_days - (datetime.date.today() - u.start_date).days)
78
+ res=u.package_days - (datetime.date.today() - u.start_date).days
79
+ else:
80
+ # print("else",u.package_days )
81
+ res=u.package_days
82
+ return min(res,10000)
83
+
84
+
85
+ package_mode_dic = {
86
+ UserMode.daily: 1,
87
+ UserMode.weekly: 7,
88
+ UserMode.monthly: 30
89
+ }
90
+
91
+
92
+ def days_to_reset(user):
93
+ """
94
+ The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
95
+ user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
96
+ date is not available, the function returns the total days for the user's mode.
97
+ """
98
+ # print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
99
+ # if user.mode==UserMode.daily:
100
+ # return 0
101
+ if user.start_date:
102
+ days=package_mode_dic.get(user.mode,10000)-(datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000)
103
+ else:
104
+ days= package_mode_dic.get(user.mode,10000)
105
+ return max(-100000,min(days,100000))
106
+
107
+
108
+ def user_should_reset(user):
109
+ """
110
+ The "days_to_reset" function calculates the number of days until the user's data usage is reset, based on the
111
+ user's start date and mode of usage. The function returns the remaining days as an integer value. If the start
112
+ date is not available, the function returns the total days for the user's mode.
113
+ """
114
+ # print("start_date",user.start_date, "pack",package_mode_dic.get(user.mode,10000), "total",(datetime.date.today()-user.start_date).days)
115
+ # if user.mode==UserMode.daily:
116
+ # return 0
117
+ res=True
118
+ if not user.last_reset_time:
119
+ res=True
120
+ elif not user.start_date or (datetime.date.today()-user.last_reset_time).days==0:
121
+ res=False
122
+ else:
123
+ res=((datetime.date.today()-user.start_date).days % package_mode_dic.get(user.mode,10000))==0
124
+
125
+ return res
126
+
127
+
128
+ def user_by_uuid(uuid):
129
+ return User.query.filter(User.uuid==uuid).first()
130
+
131
+ def user_by_id(id):
132
+ return User.query.filter(User.id==id).first()
133
+
134
+
135
+
136
+ def add_or_update_user(commit=True,**user):
137
+ # if not is_valid():return
138
+ dbuser = User.query.filter(User.uuid == user['uuid']).first()
139
+
140
+ if not dbuser:
141
+ dbuser = User()
142
+ dbuser.uuid = user['uuid']
143
+ # if not is_valid():
144
+ # return
145
+ db.session.add(dbuser)
146
+
147
+ if user.get('expiry_time',''):
148
+ if user.get('last_reset_time',''):
149
+ last_reset_time = datetime.datetime.strptime(user['last_reset_time'], '%Y-%m-%d')
150
+ else:
151
+ last_reset_time = datetime.date.today()
152
+
153
+ expiry_time = datetime.datetime.strptime(user['expiry_time'], '%Y-%m-%d')
154
+ dbuser.start_date= last_reset_time
155
+ dbuser.package_days=(expiry_time-last_reset_time).days
156
+
157
+ elif 'package_days' in user:
158
+ dbuser.package_days=user['package_days']
159
+ if user.get('start_date',''):
160
+ dbuser.start_date=datetime.datetime.strptime(user['start_date'], '%Y-%m-%d')
161
+ else:
162
+ dbuser.start_date=None
163
+ dbuser.current_usage_GB = user['current_usage_GB']
164
+
165
+ dbuser.usage_limit_GB = user['usage_limit_GB']
166
+ dbuser.name = user['name']
167
+ dbuser.comment = user.get('comment', '')
168
+ dbuser.mode = user.get('mode', user.get('monthly', 'false') == 'true')
169
+ # dbuser.last_online=user.get('last_online','')
170
+ if commit:
171
+ db.session.commit()
4
172
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
173
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,8 @@
1
- # 2023-04-08T16:23:31.494150
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xfd\x01\x00\x00\x12\t\x04\x00G\xaf\x1b\xd8\x04XOcH\xe0\x96w;^i\xcc\x00\x00\x00\x00\x00\x00\x00\x00n\xbc\x01\x87\xb7\x8c\x00Dtd\xabPkT\xac%P\xe1\xa0\xf1\xd4\xc00\x19\x81f\x8d\x07\xc5\x7f\xfcJ\xc0:<E\x81\xec\xd3\x0c\xbb\x00;\xd6\x8fc\x83(X\xa1AE\x12\x98\xda\xa1\xf8O*"\xfa\'\xbaQa\xa0\xb7P\x85\xb6\xb7\xf2<\x16\xff$\xf8\x16\xe6\x01\xc9Wt\x00\x87.dI\xae\xf9Sd\x063\xe1q\xac\x0e\xc3\xce\x86\x13\xb2/Z\xb0b\x033\x005/\xa6\xe3qW\xef(\xde\xdc\xa8:-\x8d\x07q\t\xf1T\x04E0\xca[\x11\xa9n(Sc\xb5\x1ea\xc9\xb9\x8e\xb0\xd4\xba\xa33\x0c\x05\xff\x0cU&\xe4\xaa\xc9j\xe6\xc9\xd9o\xef\x12\xcc{.h\x13e\xa1\\\xc31\xedBKH]S\xaa\xfd\xcb\xd1\x04\x1e\x8eo\xfa;\xfb\'\xe5\xf2\xfb9N\x12\x81j\xcf\x0eH\x07`P\xa4\t{W?\xe7\xc0\x8b\xce2+=>8t\xce\xbf\xe6\x95\xea\xbe5X@ag`\xb6\xac\xa8\xbe \x99D\xd7\x15m\xd6\xf0J\x07\xb8-(Z\xff\x83\x8b,k\xea\x7f?\xc9\xec\xa26\xfd\x1fv\xab_\x8e\xc2Z\xb7\x7f\xea\xda\xaa\x84\xdb\xbbG\xba\xa4\xf1CE\xfb\xe1_\xd6p\t\xf4\x1aQ\xc1O\xda\x9b\x17$7\xaf\xaf\x14\xfb\x0e\xaf\xa2\x1e\x881\xd9\xce\xa0\xa5\x95\xe8\xc7/rD+l\x1cC|\x9d\xff\xcc\xb9\x1b\xb7x\xb2\xe7\x18*&#\xd0\x10\xcd\x1b\x8b?\x85\xed\x02\x94\xb0\x1b\x8c\xe6=C\xe4\xd2}\x1dA-\x9a\xb0I\xb8\xabI\xeeaa\x13\xa9o\r\xbb\x9b\x05.\x92%\x9f\x85\xac:\xbe\xb2\xf4\xdaK\xfcy\x9d\xb0wB\xc0\x95\x89x\x1d\xd5\x13\xce\x1f\x99\xce\x9d\xb2\xf3\\b`O)\xf1<K\xc2\x91\xb0\x90C\xb2O6$\x1a\xb1X\xb7\x05\xb3^\x8a\n\x94\x92\x0c@\xf8,0P\xc7\x08.!\xdb\xce\xc3\xda\x0fJc\xa52+.\x08\x10Z+jR\\~\xa6n2\x14\x8eT\x88\xaa\x16\xbb\x06\x10\x9ex3f\xac\xc5\n\xf7p\xb7\xdc\xa8n\x1f\xba6\x84\xe2\xc9L\xee( M\xd2\x13\x8c<')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from . import user
2
+ from . import admin
3
+
4
+ from . import cli
5
+ from . import database
6
+ from . import common
7
+ from . import commercial#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
8
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,172 @@
1
- # 2023-04-08T16:23:32.040124
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x93 \x00\x00\x12\t\x04\x00[\x82\xe2q\x9fR\x03\xef\x9d2[\xc7\x93-\xd4\x9c\x00\x00\x00\x00\x00\x00\x00\x00U\x8d\xd8\xa4\x0f\x18|U\'\x17I\xff\xceC~Ji\x05\x0c\xd2\xad\xe9s\xf0\x9c[Ld\xe9?\x05\x04\xefV\xd4I\xfd:\xa6\x81\x0b~"\x8d\xe6Lb\xd8u.\x16\xebG\xee\xd5G\x86\xcfD\xb2N\x93\xbe"\xb13\xb6\xe9\xc9=\xea\x90\x16\xee\xd8q\xe0\xe6P\xab\xb98W/G\x04\x11,6\xa2iz\xd7\x83\xf6\xd1\x13\xf6\xef\x88\xc04_\x198Q\'\xfa\x0e\x97Y\xf5H\t&,5\x0fr.h\xa3\xce9as\x11\x02\xd2k\x8d\x07\x8a\x9e\xa1\xdb\x08\x1bS\x17\xd2p%\xf0\xc3\xc7\x98\xfe?:1\xa7Vx\xa2d\xefI\xe2\xbe\x85m{5m\xb7s\x8fQ\x0e\xb8\xd0*\x8f\xed\xe3\xf0\x94\xf3\xf1\x93\x8f\xf8\x1b\xc8\xd9\xf8SID\xc6\xb5\x83\xc0\x8a3:\xed~(\xb1P\xc6`\x9aM(\xf7vX\x96\xa7!x\xea\xf4\xe5\xeam\xfb\xb4A\xf7\xc5\x05\x1c\xd2\xfd\x82fH\xbb\x02\x94^\xe6\xde\xf7\xb1d\xb7\xe5\xbb\xf4Ph\xf8\xce\xfd\xfc\xd1\x8bS\xe9\xd1O\xef\x9a\xe8\xde\x9a\x93\x85\xd3o\x8e"\xb8\x9d\x9d\x8c9f\xc3\xa5\xb0\x1cz\x17\xfag<>\xa0\x9d5\xe2K_\xd4\xc8\xf0K\xe4\xddO\'NG\xe1*\xde\xa18\xb3\xe4\x1e\x92|#\x06\xa6g]\x06<!\x16\xf31\x85\x97\xc0\xbd\xc7\x80P\x9agh$c\x8f\xc2\xe6g\xe1\xcd\x1f\x92V\xb8y\xd9/PP\xcb\xa8\xa9\x81\xbasL\xd8>\xc8\x06\xc8\x93g\x15\n\x8cX\x88Q\xf4\xa6)\xffQ\xeb\x96Z\x8b\x1e0!\xfb\x91\xb3\xec\xcb\xc0\x9a\x0f\x98\xf3\xb3\xd1\xed\xc9X+\xc81\xeaqx\xed[\xe2\x8a\xa6\x19t5\xb3\xc7\x9c\x95\x1d\x82\xef\xc4*\xf4f`\x99\xdc\x91Y\x0c\\\xf2\xa2\xe3\xc0d\x88\xed\xb6\xc5V\xe3\x8es\x90\x19\x85k\xc2\xfd\x06\xe5\xd2\x06\n\x83+\x0e\xd9\xf3\x13\x13\x03f\xd9\xd3\x88vv\x14\xbc)c\x19Pg\xfc\xab\xa9T\xcc\xaf\x03\xa9\xf3\xb4!\xb1\t\x8b\xc4\xc6}\x81Q\xfb\x97\x03\xb1*\xae\x98\xec\x8d\xde\xd1\xb1\xeak\x0e\x95\x9dC\xa9\x90o<B2\t\x89\xde\x02\xc1\xbe8\x87\x11\x12a<4\xcf\xe96Jf&4\x043uT\x83\x04\x90\x8aS\xa17\xd2\xfc\xce\x82+\xc8\xfd \xef\x02\x99\x03\x84f\x00\x06\xddG\x81/\x18n\xff\x08\xa2\x83\t\xbb\x06\xb4\xe1?\xedP\xeev\xc0\xae\xbe\x0b\xec\x1e\x80\xcbI|w\x07\xc5Y\x1a\xc0=\xd0m\x92\xa5T\xe4%\x02\x12"\x1df.r\\+3\xe5GXJ\x9f/\xa0\x14\xa8\x9b\xa3\x12\xde\xbe\x12\x05W\x8b\xe4\xee\xe6\xd1\x1ape\xec\xe8\xcb\\ xokD\x90\x91Q\xf5\x85-\xac$\x08\xdb\x12,\x17q\xcda\xdf\x03&\xc1\xbf-i]Nvnd\xd6=\x95Ph\xac\x97K\x87a\x98i\x0c\x83\x85\xa4\xb8\xa2\x81q\x00\x16\xfcX\xfd\x81\xf7\xadG\xedc@8r\x8a@\x0e\r\xe2\xb7\x02\xb4\xa4\xe1\x85\xd8\r\x9eG\x8c9\x9f\x85\x93m\xf2S9\xcd\x8b\xa4\xb1K\x00x<\xa5W\xba\xa9\xbe\xe2\xc9#\x05\xd9Z\xfb\x14\xd7\xc8!m-\x1f\xf0\xda3\x90\x02\xda\xc4\xd7Y\xac"\r\xb6\x9b\xc0\xdeLM8\xb3\x88\x82\x1a\xd8\x18\x81@\xe8\xba\xcc\x0e \xc4H\xce;:S"\xff\xc1Fr\x03\xbfZ\x17\xc0lnQ\x0e\xeb5\xa2$\xa1\x87\xf1m?\xcd\xa0E?\xf0+ND+\x01\x907R\x02a\xd27\x89\x8eC\xcf`\xa6\x1f\xcf\x04\xf4\x8e\x11B\xb6h\xcd\xc2\xffl\x9b\x0c\x91\xfc\x81\xa3\xa0\x8b\xa9a\xec^\x0b&\x99\xdc\xfa<!\xa4\xbf\xcf<`\xcc:<Z\x81\x95o\xf0\t\xfe\x80RBO\xc7\x1e\xaa5\x94?mD\xc3\xd4O\xf0#\x0e7\xac+\xa8GO\x86\xf57U}\xd7Pdc\xfa\xf5r\x89\xa6\xd7\xa6aJ\xd8\xb9\xdc\xe5\xa6\xeb\xef\xd0uO\r\x9ah\x99{\xa5V7W\r@\xf7nw\xa79\x10\x92\xbd\xa4\xf66\xdd\xf2G.\x00\xd3\x0f%\xae\xca\xbej)Y\xf5\xf0\x11\x8ee\xce\xeb-\xaa\xc8\x8d-J\xf3*\xa5\xae\x9b\x14\x17IKn\xaav\xc4`\xa7\x9b).\xad\xdf\x85;\x809\x03\xdf\xef\x19\xaf\x1b\xfe\xed\x12>\xec/\x85-.\x19\xe9\xc7\xf1K\x85\x17\xe2k\x93\x07\xc5\x06\x9d{-\xa6c\x9a\x10\r\xb7\xeb\x9d8tm\xa95oLFym\xde\xe8\xcb\xcaj\xa7\x08GG\x95\xdc\xb6\x1e\xf1!\x8b/v\xb7<)\xaa\x92 \x14\xeb\xc7\t\x9c\x9b\xb4\xa1\x19\xc0\x17D\xbdRq=\xb8\xa6g\xbe\x02\xd7,g\xf2;{\xbe\x0b\xd4\x12D\xd4V\xe4<,\x84\xf1#\xdc\x9cF\xb6\xbd\xbf\xd6*\xa1\x15\x13\xffz\x8cGr\x9a\x9b\x00\tR\xa1x\x15\xfe\x1f\xd9\xe9\xf0\x16\xfc\\\x80\xb3K\xaf\x0c\xf5c\xa4\x05Y\xf8\xab\xc0\xc6|\xde\xc2\x87\x7f\x93\xa1@\xd5\xedK\x9aN\x81&\xa2idx\x81\xbbV\x0e%bA\x15\xf4\x08\xb6\xa0\x13|\xe3\xe8\x19nn\xbfVi\xb6\x8e\x8cu\x91(\xdb;\x9f\xf9 XLz\xfc\t\xf4OK\t\xb4\x89\xcb?7\x97\xb0\xaa+\xd5\xa9\x18fod\xb9\xf6\xbc\x07\xf8\r\x99.\xd2\xc9\x9fQ\x88(\x89nd\xd7\x04\x9b\x86P\xa3\x86\x11\xef\x7f\xcf\x9as\xcb\x1a\x80v\tr\x1c\xd8V\xab\x15`\xa4\xb5\xd7\x12\xddx\x05\xf4I(\x0e\xbf*9\xfbgb\x96_z\x04\xae\x9dg1j\xcd|`\'\xd5E\x06\x1eY\xb3\xc5\x81\xd8\xb4\xadH\x84\x0c(\x1fLW\x8a#\x8d\x03\xfa\x94\xafOyY\x86\x91[C?\xc3\xc4x\xcb\xb0w7\x00\x02\xab@Zn\x086Gv7\xd8h\xc9}]\xf4\x818\xbdE\xf9f\x91\xb5\xc2][|\xb2D]\xef\xd6r=\xb5\xf4\xe6\xdf\x1d\x83pk\x12\x1d\xe2+\x8d\x8c\n\x9f\xb0\x96!B\xd1\xae\x8c\xad\xb9}*cJ\xca\xfdh\xd4&6\x19\xe6H\xfb\x86r_\xa8\xbe-\xa8\xa5\x98x\xd6%\x9dM~\xc6\x1e\xeci~\xe31\xfe\xe8Q\xde\x0c\xfd\xdf\xf9\x0c\xa4\x97\x04\xbbs\xc4$\xff\xf7t\xce9\x86\xa4$5\x06:zX\xe1\xed\x98B\xf0\xdc\xaeQ\xc9\x93\xf4\xf50?s\x13\xf9\xe6\x17\x138k\x9d\x17\xdfU\xc3\xbb\x1du\x96\x1d\xbc\x94S\x86g\xf2\xa9\x16\x96]g\x06\x14@P3+2\xe9Q\x03\x1bJ\x90\xd0\x8e~\xb4\xc6\xa1d\xed\x9f5\xfe?\x7f,\'.\xf7\xc9\x0b\xdf\x878[\xc6g\xfd\x0cye\x10\xdfvz$\xbf\xfa\x1c\xebK\xf3\xd3\xdd\xfc+Uc\x1b\xa4\x19\x18!\'\x83\xc6\x85\xec\xad\x13B\xaf\x8ea\xc7\xc8N\xaf\xb9\'\x10\x8f\xd8\xe6\xb6\x15\xff+\xb5\ny\x0eP&]T\xf2\x15g\xdaJ\xa0\x8f\xe7\xfcR\xdd\xe3\xed>\x93(l\x9f~\x07\x8c\xca\x8eb\xce\xd3\xca_\xfaI$\x99\xfd\x07g5\xb8\x91\xbe\xef[\xc6\x91\xe4\x13xJI\xf2\xc0\x83\xb5\x8e4>\x95a\x9e\xae\xd8ZzM;;\x08z\xe5\x13\xcf\xcax\x9f\xd2\xad\xd9A-\x1c\x81\xb3R\x14\x08\x8d\x05z\xf1\x9e\xd0\x12\xa3\x02\xd1\xfb8\x0eE<\xb1Z\xa4\x97\x0c\x80\x87\x01\xd3J\x1cB\x9f\x8d%\xfe\xfa\xef/\xb07z\xa5\xe2u9a\\%\x142\x0b\x07Q$\xc8\x1316{\x8b09k\x92\x82\x94\xcc\nU\xbcp\xe9~\x14)\x87\x8aEY\x023A\xafno\x82\xc2\x95\xb92\xa0V\x1c&rds\xb8\x1amh\xf1\xd5L)\x0c:6\xaf\xb5\xf71\x06r\xeb<\x0e\x18\xf9\x7f\xcdu\x1ah\x81\x01W\xf5\xa4\x94v\xb9!\xfd\xf9\xa12\xa3\x1dU7\xb6Z\xe7!\x85\xf1\xef{a\x15\x0b\xd4&\x81\x98#\x11\x91\x1f\x05w\x15C\xb4\x1e\xf2\x03j\n\xe7\xc9,[\nT\xc4Pk\r\x18\xe0Y0\x0c\xcc\x91\xbdQ\x8f\xd2R\x97\x04\xacXv\xd7i\xe8\x00\x9e\xe2\xc2\x83\x0c\x81\xc5.\xb1\x93\xe1\r\xf1\x9cX\x00\x92Y\xad|\xc6E\x8a0Yd\'\xde\x99\x98\'\'V\x8f9\x8a8;2\xd1\x93u0\xf3\xec\x02;[V\x9a\x8b9b\xf2\x80\xd6\xee\x03\xfd5\x98\xa3B\xc7\xc3?\x89\x8by\x97\x99!\x02eoE\x8deh1\xd5\x8c\rSMj\xd2=z\xaa\xe9\xeb\xfe\xaf\xc8q\x1e(\xf16\xee\xf2\xb7z\xf9R.P\xc9\x14\x13\xe9\x0e\x81\x02\x0c\xce\xd6\xe9\x98\xe6G\xce;\xdf\xc5\xd9:{X\xe6\x15\xdc\xdb\x94\xcf\xf5\xc5\x8c[\'\x83&\x89`\xf8\xfd;O\xa0\x96\xaba\xd0\x8aCK\xe6`4K\xba\xec2\x8d\xd9"\xa0r\x18\xa45\xd2\x90\x18\xb9\x8d\xac\xa1X`y\x179\x1b\xae\xc1\xf8\x8f\xc5E\xefjM\xe4\x7f\x1e\'\x88\xad\xdbP\xbc\xd4Cq\xf9\xa6\x8e\\\x8ak\xe7\\n9J\xf5\x1a{`\x8f\xd5\x97\xb0\xfc\x93\xa9\xde5|\x95gO!c\x19\xae\x14\x19\x91\x92i\xaa3C\xc7\xe8\xf5\x08\xe9]\x87\xe7\xa9V\xd1\xcf~-b\xbd$q,\xea"\x01\xad\xe7Q\x9c\xba\xf0\x97jv\xc4KjZK+\xe1\x95\xb6\x04\xdb.;\x8b\xe9sv\x12&\x0b\xb5\x0e\xc2,\x89JtD\xc06i\xe8\x03\xfb\'\xa16\x81\xfc\xa2\xec\x02mD\xa8\xe5\x91\xcco\x14\xb9W\xa4\xe3i!\x91\xc3g\xbd\x0f\xca\x13!\xe8$4\xca\x1b\x16\xab\x80\x92L\xa7\x1c\xfc\\/\x1d\x9dyi\xa3#\xc5\xc4\xed\x02\xcc\xb8\xe5\x19\xa7\x88H.\x13\x02\xa4\xb2\x19u\x83\xbe#\x86\xf5\xe1\x0f\xb9\xae\x11[\xfd\xb1\xe1\x90\xd3F\xff\xf7\xd3\xfd-Zf\xf4:\xa2E\x8c_\x82D\x9e\x88F\xf1\xadN_:M\xe45\x9e&cE*\xa3B\xc2\xa6\xb2\xfc\x1f\xaek\xeb\x96\x98\x963\x86\xca}\xe9\xeb]\x10&\xd6])\xeb\xa9[\xbb\x0e\x8eG2\x9f\xb0\xf1s\x94?(\x08msS\x0eE\xad \xe7\xef\xacSaX\xb8k\xa3\re\x08M;Hw7\x80+\x95\xf3\xa6n\x95Xpv\xe6>\xb3C\xf0?\xbct\x13\x8b)0\x8cl+\x94b\x81\x98/\xcd\xae\xce3\xbfwp\xa0J\xaf\xc0\x9c5\xed\xc9\xc3\x13q\xdc\x81b\xd4M`\xb4\x9c\xce\x9cA%D;>]k\x95"\xb5\x95\xf0!,\x8d\xf0\xf62\x80-g\xb1/\x07^\x07=\xaf\x8e\x0f\xd3\x8b\xc1{\x1ez\x8f\x1f&\xc0\xe6pA\x86G\x98\xb39\xb9y\xf4Oj\xe9\x9f\xc5\xd3\\\\J\xf9\x8du\xfb\xc8\xb0n\xf8\xd0\n(&X.m^ y\xc7lJ\x04\xa9,\x95\xf0\xf6\xd4\x113w\xe4\xd0\xd5P\xfb\nm\xf9)\xd3\x93\x92i_JK\xb5\xa5\x95\xcf1\xf1\r\x8b\xa7F\xc9\xc5{\xaf]N\xd5\xa7\x1b$\xf7_Hn\xf0Vx\x80\x06\x06\xb5\x0e%+\xf9\xfe\xc3\x84\xb1\x1b\xd4!\x83H%N]\x8dv)\x16D\xbe3\x84\xc5G\x93\x90\xbc\xc3/\x01\xe9g\n\xc4\xa4\xbd\x8bf \xd6\xfd@m\xaa9\x89\xab\xf3\xbd\x04\x9e\x10\x86\xdb,]\n\xcb\xb6#\xf3\x8c8 \xb3\xe5\xb8\xd3\xc8\x14\x05\xf0\xf2\x8b\xdd\x91\xfa\xf0\xddq\xef\xbdg\x16\xb5\xaa\x95\xfb$\x14\x009\xaa\xd5\t\xd0\xdas\x9b\rW"\xdb\x04\xc71\xbfP`\x9cD5\x1c\xb6Fn\xac;\xf79\x8b\x01\x9b>g\xbb\xe7?\xd9~v\x06?\x88\xc0r6\xc5\x16\x03[\xfd\xa0\x11\x1a^\xa6\xb2\xe7\xa6C\xe6\xd2\xd8\x9e*\x18k\x1e\x8ba\x19h]g\xf1\xe3\xdbz\xb2\x157\x05]\xc7Y\x05\xbcT"4\x9c\x9dN4M\x89\xe1\x8f\xc8\xf0U\x1e\xae6\xac\xba,L\x8b\xaaP\x17C\nd\xa8\xcd\x80\xa3:g\xd3\xb9\xa0Z~\xac\xfb\xfd\x93\x1a3\xbc\xf1\xff\x1d\x9dT0\x97\xca@\x7f\xcdW20\xca\x12_\x12\x1d\x0c9\x1a\xf0u`\xa5\x92\xf8<\\\xa9xFR_\xfa6\xf6\xb1\xd3\x95\x06w\xea\x83f\xb3\xbc\xe2\x1d{]~q7u\x0e\x00\xd4\xa5.\x95V!\x14\x9d\xc56\x9e\xf2p\x90QQCP\x08\x1d\x96\x97C\x028\xb3\x1e\x02\xd8\xdd\xed[[\xe0\xe5s\x9ab\x17\xa1\xd0s^,\x94\xff\xe1\xb5J\xbb;%\xb4.f\xd5\xa0\x17\xdb\xd8\xdb\xfe\xca\x93`\xb5\x8b\xbch\x89\xd8I\xa9\x86\x83\x91\xe9i\x81tp\xaek\\:pT[5 \xe9\x0f\xe60\x92J\x97&R%B(~Ey\xe2\xaf\x0e\xbc\xd9\xd1\x06\x96\x9a\xb5\xe5?QL\xe0\xf8\xc4\x03\x19 \xcf/\xa4\x10\x9d\xfb\xa4\xb2F_c%&\x12\x17\x8b\xe4\xa3i/Z&\x87\xb6\x19\xe2yg\x0b\xb1\xafU(\xbd_\xaeD\xa5\xd6\xec@=&\x8b\x04N\xac-\xa5V9\x91\x12\x895\x92\x811}\x16}\xcey\xa5\xc9z\xf1#`0\xdf&\x97\xed\xc7$\xe9\xb57\xba\xb29?(\xcb\xe2\xb7\xaa*\xaa\x8e\x92\x98\xff\x8f \xdb:\'\xa8\xf2R\xbau\x8d\xbbv\x8f\xa8\x8f\xd9\xbe\x9e%\xa6\x90)\xa0\x89n\xd1eA\xe4X[\x82\xb8_\xba7\xb1)\x0e\x99\xc4)\xa5\x0c\'5\xc3\xe8;\xd6\xee\xa0\x7fl\xf8\xac\xad\x989/\x07%\x9d\xfa4\xb4\x12\x1c\xa5=\xd2\xb5:\xa5\x08\x83jE\x9e\xb0\x89@\xe3.\xdd|,d\x81P"\xd2/eXw\txu/\'\x8c;)\xd3\xfep]\xc5\x9f\xc1\xd7;ul\xb8O|\x15\x808E\x90\xe3\xac\xd17\x03w\x145\x8c\xdc\xed\x8f\xe8V\x8d\xec\xfeiN\xcf\xdf\xed\x9e\xac}\xe5\x1f6{\x80\x94~Vr1\xccN\xb8\x14\xc7\xb6\xd3\xf6\xd1^\xfb\xbbub\x90\xb4\x14\xf9JD\x0c$`\xd7\xb37\xf4"\x8f5\x8c\x10Q\x95\xad\xaat\xb4\x9f6\xb7\x8a1\t\xf64\x91\xe0\x92\x82\x90\x0f&\xa5w\xb7\xbcM\xf6!.\xfaR\x80\xd5\xa8\xe6\xc5\xaa]\xa3[\x9e\xac\xbd?\xe8?K\x96o\xe2H+\x8a\x85\x17\xe6:R:\x95\xd9\xed\x18\xd1\xd9\n\x8d\xc3~h=!\xe5gF]1\xb40\x8a@\xcd\xeb\xbcSTcs8Zj\x0c\xf3\xa3\xc9\x7f\xfa\xc2\x04\t\x0f\xa4\xdf\x191@\\\xde\xe8?!\x04\r\xfa\xffVP\xe1\x0f\x8fcS\xff\x13\xc0\xa9\x98Q~2\x11\xe0\xb7*\x80A\xfbcXN?\x9e\xcc\xdf\xff\x01\x8d;Sv\x06\x87\x17\x9a\xa4\x85\xc9\x0e\x9b\x8c\xbb\x99\x83\x84\x9a\xae_\x13\x8c\x8d\xe8K\x91(\t>\xb6\x949\xa2d\xc7Vx\xc6\xfa\xd1\xa4g\xe3\x81\xf6X22\x18}\xb0%\x90\xd1\x0b`\x87\xd54}\xf1dh\x95\xe5\xeb\x04m\xddi\xe7\xdc\x95\xa0l\xa1N\xa8@\x0f\xc4\xfc\xc2\xbd\x87\x17\xd8\xb4\x95\xde\x81\xfe\xef\xf3\xc9~o\x88<\x9cQ\xf7\x1e\x92\xd5\xe2=\xb6\xaa\x9f4P\x92,\x9b\xe0\xcf\xede-\x1d\x14\x8a\n\x1c\xc7>\xcd6|\x81\xddsJb\x9fj\x81\xc2.\xfbx\xafT\xf7\x02\xd7\x1e\xc2 \xba\xe8W)\xee\x05 \x8dK$\xb1\xd7\x8d8\xdaspB\xf64\x92\x9f\x01\xe4r\x01\x98e\xbeYl\xb20{\x19\xed*\\\xa4\x8cg\x0fA\x93\xf2\x9b\xe7\x9e\xcd*\x87/\xb6\xe7\x0c\xd1\xb1\x85\x03r\xa5\xf3\x068\xea\x83\xc0\xc0\xd2\r4\xa1\xa4\xda\xedU(\xed\xd2\x94-\x03\xe2\x8a\x81\xe8\r\xa4\xc4\xf8.\xe8\xc0G\xf8c\x95\xdc\xa9V0\xd1M\x05A-\xdfa\x1c\xe3\x98nB#[\x0f\xc2\n\x94\xe1\xd2\x1b\xb8[M\x8f-\xeb\xb7\x94.\x14\xb7\x8d\xe0-`P^\x82z9YE4\x89\xbbZN\x90\x1f\x841M4>\x8c]X\x1dx\x15\xac\xb7\xa2z\x00\x86\x0e<\xeec#\r\xeflg\x15\xed{\xa3\x91T8\x00\x1e\xbd\xd5}\xd4(\x04\xf1,@\xb5n\xf8\xfd$\xabM\xec\xf3\xe4\xde$\xfc\x03\x88t\xaa\xee\xc4E\xf0\xdd\xe2\x994_1\x83(\x13B\xc4\x1b\xc9V`\x06\x83S\xc5\xaf/\xd9\\\x1e\x81dZa`\xd3\xdaq\xb3\xccH\xa5\xed\xa5\xe8\x86m,\x13\xe6\xe5Y\xbc\x92zY\x84\x9d\x07Z\xcf\xb8\x87L\xb7\x82]d\xd0\xb2\xe0=$*g\xe2\x7f!I\x98\x16l\xfa\xc0Ql\x89&Geb\x04\xf5\xec\xce%\x038\x04\xfa\x8a\x8aK\xae\x16\x10\xad\xa7\xab;\xc6\xde\x08\xbb\xf1\x8aa^E\xd1\xe0wki\x8b\xa1\x97A\x8ez\x88\xdd\xcd\xed\x89\x8a\x88*\x87\x00\xecW\xdc\xbc\xec\x94\x81LP\xa0\xc56\x97M\x0cX%\xfb;<\xa0 \x0e\xf7Y\xd6Ny\x86\x00\x06\x01\xd1\xa7=\xc89\x06\x05\xc4^o\x7fp5i]\x98\x80\n\x0f\xa2H\x86\xb1F\xad\xd6\xfe\x82\xb4\x12\xa8\x88\x7f\x13\r62\xe4\xaf\x05tK\xdc\x05\xed\x19\xe7\xcf|\x14\x81\x87\xc1ZW\x8c"J\xfar\xc9\x0e;\xfc\xee\xd2\xbd\xc2\xf9\x8fn\xef[\xe7\xa4\xb9\xddUm\xaa|\x18\x19\x0e\x8ajj\xae3|\xbbO\xf4\xde\x03\x00O"\xd1\xd0\x10\xa1\xf5\xe7S\x8a\x8b\x88\xba\xd2\xf8\xe3\x93\x82\xf7\xa0@ac\xa1\xfd\x03\x05\x80\xce\x9cG\xd2\x92\x96\n\xbaT\xb4]\x17-\xdf\xc3\xa2r\x8a4\xd9\xa6U\xb3\x15\x8e\x8b\xd8\x12\x84\n\x89r\xcax\xe5\xd9\xe4\xcd\x0e=_\xb9N\xba@\xe9\xe7\x87y\xb70\xcc\xea]\x82S\xd6\xfb\xa7t\xb2\x96\x80\xb6\xc5^\x96\x8c\xe5\x03\xe3\xd7\x06\xa7\xaa\xd1\x17{\xf2\xa2\xd7Sg\x00\x1e\xab\xdb`m\x1bg\x1d\x16/\xf1"\x1e\xc1\xb1\x05\x1b\xf7\xcf\x94\xafk\x93\xbeq\x9b\xd2h\xa8\x8a\'\xe7m\x83<&I\x03\xf6W\xcfk\x9a\x0e\xd7\xd4l\xf0\xc3\xc7;\xe2rZ*&\xcb>\x84\xf7\x06\xc8N\xa7\x00\xed\xa8=\x13\x84\xe9\xf2>\x97\xef\xf2X\x1bX5\xa8\\E\xad\xb2D\xc6\xe7\x8c\x9a\xe6\xab\x01f\xa7,KJ@\xf3*\x0f<\x18X?\x96{\xc7\xc3]\xa2\xe2 L\xa5P\xbb8\x01\x91\x08\xeb\xd8\r\x99\x92\x80i\x01Z%4\xabI1\xe8\xf8\x00\xa4\xd5\xee\xe4\xf0a3k\x84E\xf8\x02\xe1\xd8 *\xf4k+\x986\xc3\xab\xb7\x81.Z5\x0e\xb6\xeah\x16{-\xdc\xba\xf3<V\xf3)\x91\xce\x8f\xc4R\xed>\x9b\xf1\x85\xf0R\x9ed\xf2\xb1\xcee\x90\xce`v\x0c\xdc\n\x07A\xe6\x82\x90\xa7+!\xfe\x9c\x9f\xca\x00|\x15\x0b\xf1\xdc)\xac\xcc(E\x1a\xd4\xeb4\x81\xf7\xa9\x90a\xe5\x1a\xa2<\x83\x08\xbas\x042\x1a\xcf\xacO\xd6R\xaf\x91\xd4\x8e\xf3\xacn\xcd\xd1\xaa\xe6yh\xf7Q\xbc\x8b\xfa\xd8\x16\xc4\xd7\x15\x0es|\xa8)U\xa8e_3\xa3:5\x90\x0f\x8a\x1dk:\xfe\x87\x92$(\xa9\xcb\x16m\xa9L\xfa3\xdc\xf9\xa2\xa7\xff}\x85\x8eg\x9b\xbcP\x9d\x82\x86\x99\xd57\x84\xfc/T\xcd\x00\xba\xf2h\x1d\x86.\xa7\xa6\x88\x08\x83w\xad\x012\xebO\xae,T~\xcd\xd2=\xed\xd0\xf1\x1d\x80\x18O\xa5\xd5\x96L\xca\xde\x0b\x9ci9\xeb\xf8\x99u\xabZN\xb9`\xc3\xbby\xfe\xb9\xf9\x05"\xac\xbcY\n\xc1"\nbF\xed6\xb3\x07aj\xb5\x87U,htV`K\xe5\x0b#\xf9\xc1\x1e\x84\xfcE\xe8\xa4\xdc\xc5\x1fh\xe3\x85\x06\xc4c`>\xec0\x9f\xedt\xa1\xd1\xa0\xeb,\xda\x16\xd3\x1a\x87N\x0e~\xef\xfb\x82\xb5b_\xf9\x06\xa6\xc25\xe3?\xbe\x9a6M\xc6\xe7\x7fC\x8e\xc8\x96\x16\xba\xbc\xce\x9b\xc9\xecW\xa0\xcf\xfc\x0b?\xc0\xe4\x90x\x1f\xd0\xe9\xfbE\xd0&\x91-w6\xed\xb5\xc7\x96\x13\x81\xe3\xfb\x85:\xc1\x1e/\xab\xfa\xe7\xb998fE0\xc1i\xda\xe2\xac\xbb\xb1\xcfv\x8d\x81\x84\xcc\xf2\xac\x8e\xe6\x17p>\xd00Bn\xc8p\xe8\xa1\x82\\\xd4\xad5t\xa4\xd6\x18Q\xb4\x0f\xdf\xb15\xdc\x90.L\x914M\x15m\x12\x14A\x95\x0f\xeb\xa2\xfaH\x99\x1c%\x10\x90\xf0M\x8a\x9e\xab\x8e\x9d(\xe1x\x9c\xf7i\xd6\xd0\xce\xdd\xcc\xc3\xa1\xaf\nD!g\xe3\x07+\xe8\xd7\x90\xe9D\x11\xc1\x007\x88F\xc7\xea\x16\x03\x93\xb4\x1a\x0c\xd3\x1c\x88\x0b\x97~\x10\x015O\xf6YB\xab\xcc\x85\x1d\x89\x08\xa0\xfbU*`\xe3\xee\xc9\xb1\xa9y\xe6\xbf\x92\xd2\x1f\xac9v\x00\xe5\xbc\xaf\xf5!gf\x06\xed\xbe\x9c@\x86\xba\xec30\xa9\xc5\xbd\xb6\xd2k9\xb0A\xefL\xec_\xbe\xb4\xc3\x01\x1f\xc5Uy\xd3\xb6\x05D:\xd5\xe9\xbdCdH\xdbZ)$\xd0\xa4\xdf.\xc1\xdc\x08u\xc8Y\xa0?\x98\xd1\xf4\xf7\x16\xcf\x8eaA.8\x1eN\xd0\xa3\x08\x83\xa3\xc2\xedM\xee\x88\xb1i\x80\x98\xc6\x19\xf30;\x81\xdf\xfd\xdb%\xb9\xf4DSw\xbe\x8c7\x8aL\x1as\x92\xe51\xf2\x11m,=0\xf47z,o\xd1x\x01\xe0\xa4\xf2\x0e\x8cx\n\xeb\xdf\xa9\x94\xe0\x03\xf290X{\xa0\xf4/Km\xfaq\xe0\xdb\xd2\x9e\xac\xa1MJj\xb7\x0b\x03yT\xc0d\xc4\xc8-\xbd\x0e\x9e\x89\xb3\xb5\x15\x0eY"\x06\xca\\4\xe1o\xdeS4\x94k\xd0RK\x9c\x01\x90\x8e\x9d\xab\x13\xda\xf4BJ\x8d\xfd\xd8x\x84e\xf2l\\\x14]\x14\x83L\x88\xb9\xfe(\xd7t\xef\xd1\xb5\xef\x00UU\xc87\x10\xa9\x15\x81\xde\xc60\t\xb5\xec\x16^{\x98\xab(7K\xff\xbc\x12\t\x11\x98\x05X\xb2\\\xd3\x9a3\xd7\x80v\xc0|\x0f@g\xc2\x06\xfe\xf8\xaa\xc3\xb4\xdc\xcdX(\xdbyw\x06\xaf\x15\xf9\x95\x1b\xaeg\x88\xd7N\xe1\x11+b\x98L\x15\xba\xd9q\xbe\x06?}=:\xe1\xecl\xd2\xbd:/G\xb2M\x84\x97\xb8c\x8cc\xa3t\x9b\xa0\xfc\x12z"\xfaC\x008\xa2\x8fj\x14*\x8f;\r\xe0p\xd7\xa2\x81(y\x0btH\xb1\xdce\x04\xafD\x97\xd6\xdb\x99fo\x04k\xaf\xc4\x1as[\x03\xec/\xa9\xc2\xefU/\xcf\xc7\x9f\xfe\\\xc4\xa2\xb0\xe4\xd4e\x0c\xf2&\x10Q\x86w\xec\xfd[\xd4IN\xf6\xadg\x93\x19:~\xdc\x1e\xa7\x17J\x9d\xd1"\xb2]w\x91\x16\x19`\xdc\xbc*\xb2\x1ajI\xa2\xec\xdb\xe4_\xf0=N\xa1\xbb\xf3\x8b\xcf\xda\x94B}\xa0\xd6\xe2D\x04\xa1\xd0\xdcL\xbd\xd5\x04\xbfWO*\xfc\xf7W\xf5\xa9C\xe9\xda\xeez\x90\xde\x85a\xf2\x8e\xd8\xe4D\x9ax\x9f\xa0|*\xad}\x8a\x00,#!-{~\xb1P\x94\xb1\x1f\x8e\x95\x99\xfc\x1ct\x9aO\xd2LP\xaft\xaf\xc4\xf3s\x9eL\xab\n\xf1xy\x08\x97\xa3\xcc\x0e\xb5\x87\xc9Z\xd4O\xd1b\xf0\xc0\xfe\xc4\xf4\xb2\x13\x1f\x9aK\xe9z8\x1f>\x0c\x11\x18\xef\x92\xccH\xa7\xfb\x03\x18_h\xe76rV\x9e\xbaAF\xb6\xc2\x94\x90\xb7H\xe6\xa9\x99\xcd)\x0f\xc7\x00\xc1+]\xe2\xde\xc9f\xd5\xfd\xbf\xcd\x81Ue\x90}\x86\x8fe\x96y\xe1\xda\xb0CIY\xe5`\x90\xf1\xbe\x18\xa0r:\x16"\x84`\xfc}\xf6a\xb6\x15\xd5}\xc50\xc7\x9c5~\x86\xee\xb65\x1d\x8b\x86ZE;\xbd\x874\xec\xca"fK\xdb\x8a\xac/\x8eB\xd364n{\xebBi\xb1b\x83\x82BVo\x99g\x9f\x86\xc9\xbe@\x19U\xe0$\x9eH\x15\xa6w\x12\xf2\x95\x86\xf0\x82\xc9\x1e\xe9A\xc3\x9c*\xc8-\x1c7\xdd\x84OD\xc7s\x08b\x85\xc3\xca\x0b\xb8\\\x94)\x12~\xad\xd4\x82\x9d\t\xe1\xb4\x1cF\xa3z=\x0c\x17?*\x89\xc8\xb6\xfb\xde\xa9\xb7\xe3\xef\xf5W\xf0t\xd1M\x17\xb2\xadr\xd9\x97!\x03\x80\xc8\xbf\xb3\x00H\xb0E\x11\xe8\x94\xa1=Tn\x19\xb6\xa0\x8d\xee\x99\xdd\x0e,\xfb\x8eHwL\xe5\xbb\x1c\x08\xbfMAq\xe8\x06\xd70\x81\xbf\xa0\xe9A\xd7\x7f=,\xbfq\xfeS\x19r\xec\xba\xd5\xaa^b\xcc\xd5\x92\xd9\xfe$Yf\xf1\xd1d5\xc0dV\xd2\x89\xe4\xc6!\xa2\xa3\xb2\xbe\xf3\xbb\xaf\xf8?\xc2\xadU\xab\xe3\x0fA~N\x19\x13\xf3H\xc1\x17o\xb2\xc2\xc1\x08\t\x1d\x9d\x7f\xc5\xcc\xd7\x10P-\xf0\x12\x00\xa4\x7f"\xbeiW\x18x\xa5\xe9\xe9\x18Z\x17\xd7\nIW\xc4\xd4J\x10Ux|e\xe0m\xb7Y}\x1b\xa5;\x9a\xdf_aa/\xaeyAq\xcdu\xf1b\x97\x93\xc2\x9e\xee?V\x8b\xb5\xdfW$\x1c\x1d\'lz\xd9\xaa\xf1\xf4- \xb1\xf7WiH)\xe7C9^U\xc0\xe3\xa2\xb1tN\xe9~\x1b\xf8UZ\\\x1bT\xfb<\x03a\xf5e\xd5I\xddh\x1a\x13\xaeZ\xba}\x92\xf5\xbb\xda\x98K[9\x92b\xb7\x19\xfa\xc2.\x00\xfa\x86J3\xae=\xc2Q\x0e\x95Y\xda\xefY\r\x80\x13\x9f\x8aRK%5 \xccgn\x0b\x0f\x84\x15o\xe5\x86)\xc7\xe8\xaa\xa5\xcd\xcd[~&&\x06\n\xc0CJ\xae\x14H\x04\xab:\xc6\xd0\xf8\xab\xa5\xb1r\x99\xea\xb3\x1f4\x87l\xe7o\x04H\xe3O\xefj\xf1\x91}{\xb9(\x92\xc40$\x15\xbe\x9f\xe2&L\xac\x12\x82F\xabr\x13\x08\x8fh\xcf\xc6\x9b8)S5\x14\x03\n\xdf\x8f\xee\xab\xcf\xd8\xd5W(}2\x1c\xe4\xd1/~\xc6]\xf5\xdc3F\xb0\x13{a5=[\xb3\xb7n\xb2\xe3`\xee\x86\x81.\xe6\x0e\xcab\xe1&O\xff\xca\x14\x9f\xdd}\xe3\x12\xa0P\xad\xec\xd97\xe3\xbe\'\x11\x14\xae\xf8\xfa\x91\xe4\x9f\xa0\xd0\xbaR\x0e\x06\xce\xe4\xde\xa9e\xcb)\r\x13\xdc\xc3\xa6\xcc7\xe7\xbf\xc7\xec\xc8\\0\xb3\xdcS\xb4\x8el]\xb2\xe7\x9c\xf5a$Yp\x8a\x8b\x8b\x8a$lg\xf6J\xd2\xe3D@%C\x1bng\x99U\xb9j\xc2J\xc1\x8d}\x96\xf3\xbe<\xaf\xe5\xad#\xa2\xf9\r\x07\xbbT\x94\x13l9ah6\x1c\x9d\x10}+\xc9\xeaP\x12_\xb2\xb4\xd2\x89\x8d\xa9\'\x82\n_\x86\xa1\rZ[\xae\xa9\x1ck[X\x12ns\xa2\xfb\x14d\xaf\'Y\x10\xb6\xe9#l\x1b\xa6\x99\x080\x05\xd0\xa6T\x94.\x1c\x85F9B\xaf\x80\xa2\xa7\x82\xa4\x0b0$\xbd\xe8\xc1g\x88\xca!\x97\xc9>X~\xa1\xbbh{\xb8>\\\x9aR4\x03\xb9\xc3n\xbb\'\xce\xaa\xf0P\x1d4(\xa6\x81\x08v\x87a\xb2\xe0\x81\x03\xab\x96#\x9d\xfd\xb6G\xc2\x8d\xf8m\x99\xa8\x83\xa6\xd2\x92i\xe9\xca\xa5\n/o\xde\x94\xbcb1\xbd\xff0\x82\xcf$$\xaf8\xf1\xa8\x8d\xb5\xfc\xda\xce-l`&\xce\xf9\x8c\x96\xbd\x01\x89\x8b\r\xa8\x8d\xbb\x06\x81Q\x80\\\xd4v\xe9\xb1fV\xd1|Z-\xf6A\x85\x80\x0fu#\x84~U0:\xe1\x13w\xae\x82\xf4\x9e \xcb\xd4M\x90\x90\xfdDtp\x0c\x12\xcf\x81\xa8\xc3~\xa4\x12\x1c_6x\xfc\xf8\xf6\x96\x9e1\x98b\x0b\xc0\xfb\x83]\x89\x8dG\x1d\xbd\xdd\xa1\x84\xd4\xf7\xb5\x8f\xba\xb3%\x08!\xd2\xfdq\xa8\x96s\x95\xc3\xe6\x1f\xa0\r\xd8e1\x90\x8a\xb7;m\x87\xa4\xaf\xfd,lj\x00\xf3\x1a\x97\xcf\x94\xe5U\x884\x89\x7f\x97\xafF+@\xc0>\xae=/\xed#\x16v"\xe2a\xa3\xc1\xc4\xc8R\x08\x8e\xeb\xf6S\xc4\xe4\n]@8n\x84}\x8d=77CR\x15\xa7\xd3\xd5\xb6\x1c~\x1e\xf3\xddn\xc0\x9a\x1b\x95lQ\xac/X\xd1\t\x9f\x08)\xd6\xd1t\x8c!-uG\xf7y|p\xad\xf1-\x18\xef\xa2\xba\xb8\x0cG\xdf5\xc3x\xaa\xb9|\x95\xf3\x1eC\xf4\x191\xc0\x1b\x02\xd9\xa3\xf5\xd6\xe5V\'\x97\x83\xb7\xdd\xcb\xb0m\xc8\xc9\xbf\xf5\xa0\x9d\xdf\xef\xd9z\xf6\x9f1\x8f\xabe\xb4\xef~\xbb\x84\x15@XZ;\xec\x08r\xad\x7f5\x9f\xe5xn\xe1\xe3^)\xde\x94\x0f\xb6)\xaa\x8b\x90\x07\xf0AG\xf1\xa3\x1f\x00(9U\xb7"8\xa3\x06b\x14\x95\x9e}\xd7;\xb4L\x19\xdctW/W\xd4\xfa~0s\xdc\x8c\xf2iS\xc0=\xd1D\xf1\xbdPs"\xc8\x15\xc6\xb0\xf0\x1ej\xa6=\x88,f\xfd.}v*]`g\xe1U#\xf9\xb5\xfb\xec\xd2a\xe3>\x8f6\xe4Opx\x9f\x1a\xdc\xc0\x03\xebjd\xd3\xc7\xbdz7\xcf\xd3\x93%\x18\xfb\xca\xd4#\x14.e4)\xf2vME0\xf8\xc6\x86\xfd\xa0=>^\xfe|\xb7\x12b\xcc\xbd\xa3\xbfq\xb1\x12l\xb7\x92\xf1c\x85*@<\xb2\xb4<\xf5\xf0)\xd4f\xaeB\xa5%\x17r9\x08AU\x85\xee\xa8\x02\xc1\xab\x11\xa6\xb9\xcf\xea\xd7\x12\x93 \xbd@\xd6\x87\x0f\xd61o\xd5\xef\xf62Q]\x81\x96{\xc3\xce\x81yb$\xd3\x87Z`0\xed\xdfw\x18Kflc\x16\xc6\xa6\x0e\x83ze\'\xc0v\xa7t\xfa\xb6G\x16\x00C^\x03k\xd8\x0b\x80\xdc\xbcq H\x1c\x86X=\xf4\x17"v\xcb)\x02\xe34BG\x02\x13\xff\x9e\x83\x9d\xbb\x94\x04b\x03\xeag\xa0\x0f\x11?c\x97B\xdbX\xc6\xcc,[\xc8hm\xe7\\!\xcc[\x1an\x88\xae\xe3\x06\xd1\x8d\x94`\xa0n\xd4g\x83Z^<+A\x00=\xfa\xeb\xb3f:;i\x10}\x1b\x7fU\xd2Q\x02\xfa\xd9\xae\xdc2\x7f\xe9\xa1Z\xd8/S\xd3\xd7\xfa\xe9v|\xcb\xe6v\xd6\x03\xa8\xd37wm\xbb\xf1\xa98Wz\xaf\xddl\x13\x8a\xb4\xf0a_\x80\x9d\x0e\xc8\r-Oe\xf9\x07\xcbK^\x06^\xb3+\xeeSI@\xcd\xaa\xff\xa1\'\xf7V^\xd7\x88\xa2\xf3\x94(\xe6\x1e\xde\xb1\xd3<\xbcR\xf8\xf2\xedZ\xb78/k\x96V\x91\x97\n} z\xe5\xfd(\xc9\x19\x90F\xbf\xb8\xecr>?ft\x87\xf7m\xa38\xa1C\x7f\x1a\xc7\xc2-\xfb\xd1fA\'\x91\xb8o\x01\xbf}9\x9f\xa7\xe5b\xd8f\xf1\xf4\xe8\xc8W\xe5\xca(\xe9\xd1\x9f\x17\xb8\x82\x87\x91*\xd1{\x1e\xd5\xdf\x01\'/\xfc/\xc4DeV\xf3Vk\x8d\xa9\xa8\xd0&\x19\x17\xfa>\xef\xf7L+S\xefI\xd52\x1d9\x0b\x02\x11\xfe\x84\xa7\x01s\xc5\xcd\xfal\x81\xaf\xda\x14\x14\xf7\xc8\x92\xf3\x15\xb4\r\'b\x8b\xfc\xbd\xdf\xbe\xad\x0be\xba\xbf\x12%nY\xb4\x88z\xc5qe\x05\x96c\xdaC\xcd\x86]6j7/c\x85#N\x9c\xc3r\xa7\x89u\xbd\x06e\x87\x94I\r)&_\xde\x0e\x97J^\x1em\xf2\xd9\x10+[\x1f\r\xab\xfds\xe9\xe5G\xeeW\x9f\x98\x18\x13\xf1\xf7\x0bm\xf6\x9a#D?\xd2\x88\xb5lh\xc3]7\x00}7\xe3\x81E\\\xad\x17%\x87\x12\x0c}\x15p\x04\xdc\x10?\xac\xd1\xbd\x05RI\xaa\xc7)-\xfe\xfb\xa4\x1b\xb7!\xd7B\xde\xd8k\xaf\xf5\xd4\\\x9d\xf7\xb2m\xb3p\xc6\xcf]\xc6A\xce\x02MHY\xcb\xa7\xeaLF\x03\xaf\xbd\xb9lS\xb2WXg\xa2`\x08\x14(\x1a\xb86\xcc\x17z\xa5$\xc4b\x94\x83\xdaOG\xdePtk\xb1\xcc\xdf\xec\x91\xcf\xc1\xda\xd6G\xe8;i\x93p`\x05m\xdb\x8d3\xfed\r7\xac\xc6}\xf2-{C\xc81\r\xc6K\x9f_1\x0c\xdfp\xea\xcd\x96\x0e\xf0\xc5\xe1l:\xb9\xcb\x854\'i\xd4\x10\x88\xec\xcf\xb9\x7fa%\xe0sS\xc6V\x048\xbf}\xf9\xd1c*\x8b\x05u(\xd7[\x07\xca\xa82.KV\xc2f\x8bDz\x97\xae\\\xb2\x14\xf4\xf4L\xc9C\x97\xa6\x1a\x12\xcde\xe3e\x16L\x11g\xc8\xce\xfa8\xe5\xbc\xd2y\x13\x81\xa0\xea\xa6]6!F\xc6\xfe\xde\xf5\xb4\x8b\x90\\G/\xeeM)Y\x01\xb0\x9f\xb6z\xf3,n\xd3\x18).\xb8#\x0f\xe9\xef\x89\xc6\xac\xb5\xca\xb1<\x95\x8e\xfaUU\xb3\xc3\xa9<\xb6\xe3\x12\x8c@7P\xdb\x92\x0bH7\xb2\xf0j\xb9\x13\xb4\x8a\xb4Z\x8b\xc2\x8dBK\x81\xbf\xd3\xc9\x14~ORJ\x8ah\xdc\xe7S\xbc\x9f\xec\x1a\t^\xe0\x0cl;\xac>\x95M\x89uw\x84\x84pv\xbaAg\xe4\xea\xa1\xf1\xb2\xaf\xa3\xba\x8c\xe5@\x8a\x048\x99\x9d\x03hoY\xa3\x98\x1e\xa0\xe9\x0e\xdc\xf8\xa1\xad\x86\xb5n\x0b\x01\x92\x88\xb3\x93\n=<7h\x1dmG\x9b\x8ex\x17\xf9\x94E#\xfdP\x81o\xebD\xa1\x94\xd0I\xec9XR\xfaW\xb8X\x06\xfb\x17W%{p\x023\xf0\x0c]\x9dmeg\xdb\xce\xeb=\xaaP\xab\xccA\xe7\xdd\x82\xc9\x17m\x1e\t.\xc663\x01\xfc\xe8\xd8\xfb)w\xb4\x89\xb9h>\xff\xab\xab\xd1G\xe54\x00U\xfb\x0f\x94_R\xc6C\xeb,\x04\x06+\x86y\xee\x16\xeb\x00\xd6gD\xb07\x84\x8a5\x90>*\xa6\x13lj\xa4\xd9\xdeL\x9cE\xcf\xbd\xc0\xbeJ\x90\xe2%\r\xe0A\xd4\xa2e^:\x07\xa0\xf7\x96\x1a\xbd\x14\xbf\x18\x0b\x7f\xf6\xe7\x12\xbe\xde\xa2=\xfa2}\xf1\xed\xa9\xfc\xd8]\x7f17\x01\xab0\'\xa8\xb1\xfd\xf8\xc1\xaa\xfd4\xc8d\xe6\xf2\x94\x18\xc3&\x95\xbb8M\xc1\x0edhS,f\x88\xfb\x19b\xa0\x1cI\xc9\xd5\x12,\xad\x0b"\x87\x14N\x8e\x9dJ\xab\xa7w\x84 \x88\xb93\xc1\x1a%\xcb Dd\xfc\x94\x8b_\x0cO\xe4\'\xba\x86R\xdf\xea1~\x1b-\xa2\x10\xf6\xf4\xc6q)e\xf6\x07\xb4\x9e\x86py\xe2\xc9\xa0\r\xdd\xd8N\xd5\xd4A\x9aU\x8a\xa9*\x85\xff\xa2V\x1eg\x0e\x93q\x8e\x8f\xa0P\x83S\'/\x7f\r\x9a\xda\xf0A\x9c\xef\x13\x99$&\x92\xd54T\x9b\x99f\xfepF\xb5IYAim\x02UJHa\x953\xe4\xa2\xc7\x9f\xcf\xe4\xe6o\x9f\x1d^N\xce\xe9V\xb5\xfd\xb9\x11\xff\x8f\xa4T\x0c\xda\xdd\x17\xb0\x03\x0e\xe0\x08\xcc\xfd#\x9a\x931D\xb56\xa0q\x93P\xb1h\x16\xef\x86u7\x80d\nN\xa2\x89\xb0n\x93\xa1b\xbe\xf8cl\xbd\xef\xb8\xc2d\x88!6\xe2b\xfe\x86D\x00\xa6"\r1\xd6\xae\r`\x02\xa8(\x17\xf2\xc0\xb6\x90y\x16\xd9Y\xf3\x14b\xaa\x8b\xee\xc7\x9d\xc9\x90y\xb6\x1e\x81\xce\x83\xb6\x92nOI\x97\x9aa\x16 +v\xe9PN?\x9b\xde\x1d\xd8\xc9\x97\x9d7\x88\x1fdv\rmY\x0f-\xf2\xcfQL\x86\x12\xbd\x0b\xa3\x9a\x99s/\x02|\xe4\xa3y\xbf\x911\x1d\xe5\xde\xeb#~\xf2|\xfa\xeb~\x00\x1a8Y[\xe01\x87Sp\xc6\x9e\xfe\xdd^.\x1e\xae\xf2\xac9;\xbf\x1bm,G\xa5%0g|\xe1$\x12}\xa6&\x90\xa4I\xadE\xdf\xbaW\x0f\x15 O\x0c\x17K\xb4\xce\xe3\xd1S\x9bD\x1e\x19gM\x85\x18\xe6\x92\xa1\xb3\x9d\xc6\xe0)\xd8OrW\x989\xa6(#{V\x8c\xf0\x84;\xea\x86Fm\x0f\x8ef\xc3X\xb1.\xa1\xad22d\xc8\xb0\t\xea\xfd5v9\x13Sx\xcf\xc9\xac\xf3\r\xbbW\xe2')
1
+ #!/usr/bin/env python3
2
+ import pprint
3
+ from flask_babelex import gettext as _
4
+ import pathlib
5
+ from hiddifypanel.models import *
6
+
7
+ from datetime import datetime,timedelta,date
8
+ import os,sys
9
+ import json
10
+ import urllib.request
11
+ import subprocess
12
+ import re
13
+ from hiddifypanel.panel import hiddify,usage
14
+ from hiddifypanel.panel import hiddify_api
15
+ from flask import current_app,render_template,request,Response,Markup,url_for
16
+ from hiddifypanel.panel.hiddify import flash
17
+
18
+ from flask_classful import FlaskView,route
19
+
20
+ class Actions(FlaskView):
21
+
22
+ def index(self):
23
+ return render_template('index.html')
24
+
25
+ def reverselog(self,logfile):
26
+ if logfile==None:return self.viewlogs()
27
+ config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
28
+
29
+ with open(f'{config_dir}/log/system/{logfile}') as f:
30
+ lines=[line for line in f]
31
+ logs="".join(lines[::-1])
32
+ # resp= Response()
33
+ # resp.mimetype="text/plain"
34
+ out=f'<pre style="background-color:black; color:white;padding:10px">{logs}</pre>'
35
+ if len(lines)>5 and "----Finished!---" in "".join(lines[-min(10,len(lines)):]):
36
+ out=f"<a href='#' target='_blank'><div style='background-color:#b1eab1; padding: 10px;border: solid;'>Finished! For scrolling the log click here.</div></a>{out}"
37
+
38
+
39
+
40
+ return out
41
+
42
+
43
+
44
+
45
+ def viewlogs(self):
46
+ config_dir=current_app.config['HIDDIFY_CONFIG_PATH']
47
+ res=[]
48
+ for filename in sorted(os.listdir(f'{config_dir}/log/system/')):
49
+ res.append(f"<a href='{url_for('admin.Actions:reverselog',logfile=filename)}'>{filename}</a>")
50
+ return Markup("<br>".join(res))
51
+
52
+ @route('apply_configs', methods=['POST'])
53
+ def apply_configs(self):
54
+ return self.reinstall(False)
55
+
56
+ @route('reset', methods=['POST'])
57
+ def reset(self):
58
+ status=self.status()
59
+ flash(_("rebooting system may takes time please wait"),'info')
60
+ subprocess.Popen(f"reboot",start_new_session=True)
61
+ return status
62
+
63
+ @route('reinstall', methods=['POST'])
64
+ def reinstall(self,complete_install=True,domain_changed=False):
65
+ if int(hconfig(ConfigEnum.db_version))<9:
66
+ return ("Please update your panel before this action.")
67
+ if hconfig(ConfigEnum.parent_panel):
68
+ try:
69
+ hiddify_api.sync_child_to_parent()
70
+ except e as Exception:
71
+ flash (_('can not sync child with parent panel')+" "+e)
72
+
73
+
74
+ domain_changed=request.args.get("domain_changed",str(domain_changed)).lower()=="true"
75
+ complete_install=request.args.get("complete_install",str(complete_install)).lower()=="true"
76
+ if domain_changed:
77
+ flash((_('Your domains changed. Please do not forget to copy admin links, otherwise you can not access to the panel anymore.')),'info')
78
+ # flash(f'complete_install={complete_install} domain_changed={domain_changed} ', 'info')
79
+ # return render_template("result.html")
80
+ config=current_app.config
81
+ hiddify.add_temporary_access()
82
+ file="install.sh" if complete_install else "apply_configs.sh"
83
+ try:
84
+ server_ip=urllib.request.urlopen('https://v4.ident.me/').read().decode('utf8')
85
+ except:
86
+ server_ip="server_ip"
87
+
88
+ # subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
89
+ # os.system(f'cd {config_dir};{env} ./install.sh &')
90
+ # rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
91
+
92
+ admin_secret=hconfig(ConfigEnum.admin_secret)
93
+ proxy_path=hconfig(ConfigEnum.proxy_path)
94
+ admin_links=f"<h5 >{_('Admin Links')}</h5><ul>"
95
+ admin_links+=f"<li><span class='badge badge-danger'>{_('Not Secure')}</span>: <a class='badge ltr share-link' href='http://{server_ip}/{proxy_path}/{admin_secret}/admin/'>http://{server_ip}/{proxy_path}/{admin_secret}/admin/</a></li>"
96
+ domains=get_panel_domains()
97
+ # domains=[*domains,f'{server_ip}.sslip.io']
98
+ for d in domains:
99
+ link=f'https://{d}/{proxy_path}/{admin_secret}/admin/'
100
+ admin_links+=f"<li><a target='_blank' class='badge ltr' href='{link}'>{link}</a></li>"
101
+
102
+ resp= render_template("result.html",
103
+ out_type="info",
104
+ out_msg=_("Success! Please wait around 4 minutes to make sure everything is updated. During this time, please save your proxy links which are:")+
105
+ admin_links,
106
+ log_path=(f"https://{domains[0]}" if domain_changed else "")+f"/{proxy_path}/{admin_secret}/admin/actions/reverselog/0-install.log/"
107
+
108
+ )
109
+
110
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/{file}",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
111
+ import time
112
+ time.sleep(1)
113
+ return resp
114
+
115
+
116
+
117
+ def status(self):
118
+ # hiddify.add_temporary_access()
119
+ config=current_app.config
120
+ # configs=read_configs()
121
+ # subprocess.Popen(f"{config_dir}/update.sh",env=my_env,cwd=f"{config_dir}")
122
+ # os.system(f'cd {config_dir};{env} ./install.sh &')
123
+ # rc = subprocess.call(f"cd {config_dir};./{file} & disown",shell=True)
124
+ from urllib.parse import urlparse
125
+ admin_secret=hconfig(ConfigEnum.admin_secret)
126
+ o = urlparse(request.base_url)
127
+ domain=o.hostname
128
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/status.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
129
+
130
+ return render_template("result.html",
131
+ out_type="info",
132
+ out_msg=_("see the log in the bellow screen"),
133
+ log_path=url_for("admin.Actions:reverselog",logfile=f"status.log")
134
+ )
135
+
136
+
137
+
138
+ @route('update', methods=['POST'])
139
+ def update(self):
140
+ hiddify.add_temporary_access()
141
+ config=current_app.config
142
+ cwd = os.getcwd()
143
+
144
+ # os.chdir(config_dir)
145
+ # rc = subprocess.call(f"./install.sh &",shell=True)
146
+ # rc = subprocess.call(f"cd {config_dir};./update.sh & disown",shell=True)
147
+ # os.system(f'cd {config_dir};./update.sh &')
148
+
149
+
150
+ subprocess.Popen(f"{config['HIDDIFY_CONFIG_PATH']}/update.sh",cwd=f"{config['HIDDIFY_CONFIG_PATH']}",start_new_session=True)
151
+ return render_template("result.html",
152
+ out_type="success",
153
+ out_msg=_("Success! Please wait around 5 minutes to make sure everything is updated."),
154
+ log_path=url_for("admin.Actions:reverselog",logfile=f"update.log")
155
+ )
156
+
157
+
158
+
159
+
160
+
161
+ def update_usage(self):
162
+
163
+
164
+ import json
165
+
166
+ return render_template("result.html",
167
+ out_type="info",
168
+ out_msg=f'<pre class="ltr">{json.dumps(usage.update_local_usage(),indent=2)}</pre>',
169
+ log_path=None
170
+ )
4
171
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
172
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,81 @@
1
- # 2023-04-08T16:23:32.003641
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00i\x12\x00\x00\x12\t\x04\x00\xc4\x83E\xfe#\x1bQ\xaci{\x8d\xc8\xcc\xe1\xa4\xbb\x00\x00\x00\x00\x00\x00\x00\x00\xe4\xdd\xa3\x938z\x04\xfd\x7f\xd2\x83\xd6J5N\xae\xd8\xa9)\xe8R ul\xb7\xa5\x0e\xa3/l\xf2\'\xc1\xe9\xd9\x9b\x8d&\xc6\xf3D\x8f\xc0\x8fw\xba%Mj<1\xaa\x16@)F\xd9\xf1\xddy\'\xa8\x02\xc8\xb9Ct(\xee\xfe};\x16|;\x01\xc9Z\x84-\xc0:\xd1\xd5hh\x1b\xa0\xa4}\xd5<\xf21\x96\xfb\xacM|\xd4~\xdeF\xf05~!_\xda\xd4\x9b\xdc\t\xe6x\x02|\xcd\x8a\xa3\xa44\x02jL\x87\t\x97\x9f\x10\x1c\x1cc\x1e7\x91\x9f\x12\xf7mj\xd8\x8e\xaf=\xa8S\xad\x0e$\x8f\x0cZ\x1cg\xfaqH\xebc\xf8\x13\x95mk/{SM\x12\x0eSe\xe1\x9a\xc4\xea\xf7\x1fc\x06\x8a\x88wgqr\x10\xe7\x8f\xb9\xd8xu\xe1\xe3\x98N\xea\x15\x87m\xb1\x85\xaeB\xfb\x83\xe1\xe0\xed\x8d-\xbdN(=U\tIc\xba(N\x82w\x88\xbdZQ\xf5a\x18>\xc8\xd7\xc7o\x9f!\xa7\xc3\xf9\xe1x\r+o\xc9tx\xff\xb1\x9e|\xc4\xc8P\xeeG\xd0\x03@\xce\xd5\xb4\x11]\xb0\xc7)\xb2O\xdf\xcc{\xde\x83)|\xfb\x1f#@\x84c_\xaae\x17%s\x15\xb3x\xf3\xe7^\xd2\x11,\x16O\x9e ]G`\xadEx4 }\xbf%\x8bH\xf2\nF\xfb\xfe\x94P\xc0\x9aA\xfc\xec\x13\x1d\xe9\x87\xcd\xf9\x95\xccIx\xe5\x98M\x9ar\xa95\x8cp\xb9F\x17\x04q\xa8H;\xe7\xaa\x08\xe6$\xfc\xac\x84\x97\x06P\x10\xfdK\xe64\xdcIGT\x8a\x19Q\x81\xcaG\xfa\xcbX&`hh\xe2\x81\xb9\x08\r!\xfd\xca\xffg\x15\x83\x18\xbe\x8c\xae\x9d\xc8\xc4@"\xb5a.e\xd1g\xbai=fXK\tf5\xfe\xe7|s%\x19^@7\x9d\xe8\xa7\x91\x81pn\xeed\xec\x99{O\xb1_\xc9(\x8e\xa3\xe3P\x85\xc2V\x80W\x02\xc6\x9c\xef\xb0\x12\x90\xe8\xf0\x15\x93\x1f\xcc\xbe\x81\x0b\x0f\xb2F$\xd0\xa2L\xa3X\xb2=)\xe7\xa9\xfc\x97U\xe6\xdcB\xb9\x9cCw\xdf\xbdI\x16 n\x0b[\x82\x8d\xa4v\x92@\xca\x81BQbX\xe2\xe9\ry\xc5^7\xa9)\x19\xac0!l\x137\xc1Xw6i\x8a\xba\xb7\xb9w}\x14\xd3\xef\xa7\xcf\x14\x05\xd4w(\xfa\xb3\x8a\x1f\xbb\x16\x97\x01\xdf\x8d\xa8\xdc}\xe8\xe6\xf8\x99A\xe9\xb8\xda\r\xba\xf3]\x8fS\xea\x82\xe6\x8b\xf0\xf7h\xb6\xdb\xd8\xea\xc5\xfd\xb6>\xe3^\x88\x0f=i\x1c\x9aQ\xbf\x96\x81\xc0Xf\xa7\x05$\x9e\x08\x9c\xe1\x18\xfbi\xd2AR\xfd\x03\x88c\xfbF\xac\x98\x89\x12\x16\xfa|9\xecz\x8c\x9d\x8d7j\x07\xa5\xa5\xf2\x87\xf5\x83\xd7\x8c\xb3[\x03\x8d\xb9\xf87\xa9\t\xc5\x8d\xb2\xcc\x12\xde4U\x87e\xfc\xb0\xfb\xf1\x8ezvi?e\xce.dl\xa7B\xa1\x17u\x82}\x17\x9fR\xd41\xf9t\xf1n\t6\x10\xa2_C\x91\x02\t\xaa*\xd7\xa5j6DT\xea\x99gS\xf5F,\x80I\x1d\xa0T=\xd7\x9a\xa9\xab\x9d\xcb\xf2\x9d\xbdet\x06\x8c\xd0\xdd\xf6V\xf5\x85\xa3\xcb]\xec\xeb\x84(\xdd3\x9f\xef\xcf!\xadj\x87\x86\xaa1\x08\xd2c\xc4\x92\x80D\xfb\x00e\xde4CW\xab0\xee\x8f:\xf3\xee\x1d\x91\t~\xef\x86[\xb6\x0c@\xae\xb4\xf5\xb3\xb7\xed]\x88\xc9Ive\x82[[6\t\xab\x02\x17`/\x97\xce8\xa2\x98\x11\x9d\x9b\x17wU\x04\x9dwV\x82\x89\x9a\x8a,\xfci\x85\x01\xd8{\x88k\x88j\x9fy@\x82\x8e\x80\x8a\x8aW\x958F\x9e{\xb20?\xdbJ\tP~~\xaa\xc5\xb3\xafy6b\x96|6W\x81w\xb5\x9c\x1bO\x86\xc0\x1c\xa2\x89\xd1\xa3\xbc\\\xe2\xb2<\xc3\x15\xbc\xf7\xd3\r\xc2\xf6\x9d\xb7y\xd9"\xf4\xfb\xba\xe0\xbc\xc2Ii\xc7\x89\xcdUs\x9b\xbb\xb14\x1e[\xe1\xe2=\xa3\x95\xe7P\xf8\x82\xf2\xa5\x0cq\x8e\x063H\x9d\x12\x10\x04\xadM\xc3\xab\x06\xaeP\xbf\xa23\x0f\xd7\xaa\xb8:[7=\x0b\x93[\xef\xf5\xcb\x8b\xdc\'\xad\xbd\xe0\xe8\xcc\xc2\xbc\x94\x86\xc6\xf5\xdc&\xbd\xa0?\xeft\xc2\xd1n\xfe\xbc\x9b\x90\xa6\xed\xa63R\x15\xb6\x14>\x94\x9cg\x89\xe5\xc6~\xbb\x87\xbd\xcf\xc1\\\x8b\xcb\x1c\x84\xfe\n_\x10\x9fJ\x08\xcew \x83\xb92\x9f\x9f>\xc9\xa2\xcc\xd5\xe9E\xb1\xbc%d\xce\x9b\x8458;\xbd\xebXqjz\xf0\xfani\xbeb\xc7\xdf\xdb\xa8\x04\x1e\xd5b\xd5\x82\x90i\xb9\xc0\x9eWA\xe1\xdedZ\x19L\x9az\xa9%\xf7\xb2\xca@kR\xf5\xa8P\x9fZ\xf0\x96\xac\xd3F%\xd9_\xd7r\xfe\x1c\x9a\xf6\x87\xd7K)\x99\xff\x84\xa0]\x11o\xa5!b\xb2\x80\xbb;\xda\xf6\x9c\xb6H\xc0!L\xaef\xe6\xffuGT\x1c\xbb\xc97V\x13\xe3\x98\xfe\xab\xd7AI\xf4S\x9f\xa7\x94<\xd5\xd3L\x81<\xda\xf5\x8b\xc8a\xa0g\x99phG`\xfb-\xa9:\xf5\xf4f\xcf\xca\xa9\xbbx\x82;\xd5\x11Q\xe2\x95\xed\xb2\xb9\x05[}E|\x85\x88\x9b\xf4I\x84vB\x1eU\xcd@l\x7f\xc5\x97\xbe<\x84\x89\xdd\xae\xb2\xb9\xe8\xca \x13Z=<c\xfa\xd3\x9c\xf5Z\xcf\xcbl\x97\xf0\x1c\x17_\x93\x92\xce=\xc6\xd2\x82\x02\xf5\x88\xcf\x84\x02\x00\x18Q\xd2G(\x97"\n\x94\x89\x0b\xb2\x8a\xae]\xbc\x81\x17\xf0\xfb\xa1\xa3%\xa9\xad\xb1,\xb4cEH;\x10\x9b\x05\xd4cC\xd4)}\x0b\xb7\xa1\x7f\xfb\xbc\xb8<\xe4\xf9\xb9T&\x1e\xa2\xe5\xab\xe1\xd6\x08\x92T\xd5\x05\xf9\xe9\x9e\x8b\x93z&Wi\xd6\x17\xe9\x07\xf7\xaeQ\x89V\xb1\x9c"\xd04,\xfe\xc0\x9dj\xc0K\x0e>\x0fy\xea>\xeaF\xd3\xffO3\x17\x11\xaf\xf4r.~\xb5\xd5u\xd3\xd4\xa49\xd9\xa32\xae\xd0\x9c\xc6\xe2\xe2gpOES\xd7Budo\xc1|\x9f\xe5\x9b1\x8e\xf6=\xc5+\x82\x9aTzg\xc8\xb4;\x99\xce-\xd6P\xfc\x96\x99\x0b\xdb=2\xfd\xa0\xeb\xdd\xa2\xe8\x9bz6\xb1\xf5\xf3~\xf4\x9a\x8c|s\xe6\xabWU\xc4+\x0e}f\xf2\xf7\x12\xf0\x85P\'\xc06\x8ftO\x02\xfd\xf2h\xad\xd4\x86O\x86y\xd6"\x1d0\xe0\x90\xd1\xe4\xfe\x18\x81sh\x898\x8e\x04\xb2\xa7{\x93B\xeek\x88q\x16\xbc\x92\r\x83\xfaA\xbc\xc3w\x06\xb1\xab\xcc\x00\xcc%Pm\xe8?v\xbb\xd5\xd6\x88\xae4\xfb\xce\xed\xac\nEE\x14G\xb3^\xf7x\x15\x86\x14^\xc3=`\x9c\x9eE#\x10\xd7\x07\'\xc9\x97\xb6\xd0w\xb1\x14\xb4\xd4q\xdd\xa1t\x0bKa\x97\x05\x95\x9bm\x9a\xe9\xf2\x90i\xac\xc1\xc8\xc4\x7f9\x99]R\xa1\xf8\t\xc1\xb9\xc7B\x8b\xf4\xb8f\xc0i=\xdf\xcc\xad\x00z\xff(\x0eu\x1f#\xbd\xe1\xfa\xc1\x90 \x11`\xd6\xe1:\xe5\x9bZ~\xd7\x8ftY\xd5@n\x97e\xa7Y\x0e\x16P\xc8\x1a\xa3\x92\x0367\xea\x1b\x18\xbc\x0f*\x9f\xb2\xcc\xff\xe6\x9b$\xc2\xa2i\x98\xdd\x02\xca\x9ey\xb7\x02t\xd4\xd2\x8c&L\xac\xbbn\x13/o\xf6\xd4I\x1a`n\xdc\x89\xd1,\xad\x9a.\xb5^\x94\x0c\x03\x04\x81\x9e\xe5\x82\xd4\xd3\xb8\xeb\xfd\xc5z\x9eU3\x87\xbe\n>!>\x95?rr\xfb\xde\xa0s\xf2\x91\xee\x11\xca\xf8\xa5\r4\x8e\xf1\xe1j\xf9i\x8e-2\x05_\xb4~-\xd315\xc93\x11\xd15\xe2\\&4\xe6q\x87\x10\xa9Ti\x02L\xf0B\xfb\xb7\xa7\xa6\x89g\x9d\x1aha\xc1\xb4\xa51\xff%C#\xce\x10\xcf\xeb>\xa9\xbe\xb3pT\x0fm\xa8Y%\x93\xe9\xa4l\xf0\x0fT]\xf3A\x18\x04\x9aD\xba\xfc\x95\xda\x89\xca\xf9d\x81\x91\xb2Y\x83\x92t\xa0!\xdaU#\xe8\x1a\x1c\xda\xbce+\x1c\xcb~1b\x13\x92\x18\xcb\xf3\xe4\x89\xbf\xfe\x93\x13\xae3\xb6\xda\xc6\xf4\x10\x1cC\xadRR\xd2\xe2\x82>\xbc*ZQ/\xc6\\M\x8d\xf5 \x10kU\x1a\xee\x19N\t\xa6Q\xf1r\xb1hvz\x80L7[\x06G3\xebA\x1e\x96\xed\x02%\xfd/V\x0f\x95\x95\xf5\x93\xbd\x1b\xc6\x16\xbex\xc5\x01\xde\xd7diO\xeal\x06\xc5\x93\xc5\x89\x07v\xd8T\xbbR \xd7\xf0\xe5\xf3&@\xb6ALE\xb9\x82d\xa7*H!\xcb2M\xa2:T\xf9\x108\xf7`\xa7<\x88U\x1f\x8b\xa5\t\xe2U\xb1\xb7Q0\xd0i\x01\t\x0cj\x13IN\xb6%h\x10\xffw}\x9f\xa5}\n\xf6\x04\xdf\x1e-\xc6\xebl\xa9\xb3I\x03\xc6\x02\x8e\x1eR,\x13\x8b=~QZ)\xe1K\'\xb9\x07\xad\xf4\x87\xd4\xc5\xbb\xe3GU7\xdc\xe4yW?\xaa\xb1wt\x8c\x8a\x84\x17\x9c\xf4"\x1f\xb6\x8f\'\x1b\\\x15\xc5\xbd\x12\'\xa5\x7f\'\xbc#\x02d6\xc6\x1ab\xcd\xd4V\xedS\xc4b\x0cO\xac\x02\xf9\xcblu\x98\xf4\x06-Z"\x06k\xda\x17\x7f\xa0\xd8\xb1\xec\x8a\xe5]\xc4\xf3\xd0\x98\x05\xca\xa0(>\xb9\x9e,\xd0a\xa1\x08=\x0bA\xbct\xf0\xfbh|h\x8btH\xe6\xbf\xc7\x0f\xa4\xb2\x90{\xc3%\xfc\x93w2\x88F\xb5\xb3M\x80(h\x1f\xfc\x1b.\x8f\x84\r\xeb"\x9cp)\xd4\xbb"\xbcRM\x1fv\x88v\xab\xbc\x07\x14\x0e1\x90\t\xa1\xc9*\xe2\x03\xa1f\xcbqs\xe8\xe0\xa2*sJ\xb2\x94l\x97^c\x02\xbc\x99\xd5\x834\x19\xbdon\xd4\xbb\xfb\xe1N\xd1J\x12\x15\xf1\xb9\xe7\xf1\xfc\xf9\xa1\x8a\xd7\xcbY\xf0T\x15\xd5\xaf%\xe8n\x1a\xf2\x05^\xa57\x853\xc7\xaa\x07\x00\x14\x9d\xd6"\x16{\x8b\xb9\xa5p\x1e~\xe7\xbd\x10K\xe0\xf8;\xd3tN\x99\xefB?\xaf\xcc\xfc\xee\xa8\xdf\x9b\xe8\xb9\xd6\xb97\x03\xff\xb7\x1b/x\x86\xbfc\x99\xb8Y\x082]\xae\xed\x95q\xa97\xb5\x02\x0b\xd1}\xb5\x85]\x18\x95I\xaf.">\xe3\x1d"2\xac\x1a\x84\xe0\xf1\xf8\xb8)r>\x85\xd8\x13B\xb3@\x15\x86\x8eE\x86\x80\xe8L\xa8?L?\xa6,I83\xdeS\xfe\xab\xea\xe3H\x84\x92\x922\xca\x89\x8en \xec8\xd0\xad\xb4\x8b\xdb\xe9b\xcb\xc9\xff\x91\x8e\'\xf9\xcbp\xf2\xec\x92\xe2\xc1\xd64ji\xcf\'q\xb2\x05\x7fF:\x13;\xd5W&-P\xbd\xaf\xad\x04\x11\x9f\xfa\xec\x0f\x81\x0f)w\x10I\xda\x8a\x14N\xb3>\x0c\x80\xa9\xccZ\x85,f\x8b\x92\xb7\x84\xb6v\x91\xd4\xdc\xee\x0e<F\xc9\xaf\xa4O\x1a\xba\xc2\x87\xa3.\xb2\x80\xe5\x80\x05.\x90B\xbe\x8c\xe7\x0e\x16\xed%{\xbc\xc2\xd8%\x15\xc8d_a\xc2<\x8f\x0c\xf2l(uB\x01R"!\x04\xf4\xdc\xe7\xd2H\xd70\xc4\xc2\xdab\xf0\x99X\x93`\x98E\xc5\x0b\xb1_\xeb5\xd4\xa6G\xb0\xe8\x88\x92Y=,\x9f\xf4q(\x95W\x8a\x88\x15\x85\xa3\xed\x05\x9c\xc5=B\x17\\;\xe6oc\x99C\xd8\xb1\x9c\x7f\xb0V,\xc6\r\x18\xde\xcf\x1e\x1e\xc0\xf9H\xa0s\x9b\n\xa4\xbd\xb0e\x80\x9f\xc0\x8c\xe8\x7f\xe8\x19\xd4=\xba\x9c~\xcbdQ\xb9\xfc\xc0\xd4\x15\xa7\x98\xe1\x16\xd3nX|_<5Y,\xc1\xb8\x0bB02\xea\xe8~yYD@&TU\xd69\x0fW\x91\xda\x8d\xfc\x07S\xfb\xb9\x16\x11\x83\x04\xa3\xf9\xe36\x10\x92\x82~\xd1`d\x9b]\xbe\xa3X[\xc7\xdamd\x1ac\x98x\xba1K>7?\xa0\xcd\xd3\x80\xe5\x9d=/\xb8\xdbp}\x91\xd6[s\xa0\xf6\x03}\xf3\x95\x12FE\xc3v\xef)R\xfa\xd0\x8b\xfd\x9f\xd9\xd9l\xcbI\xa72\xa4\xd2\xf8\xf6\xe6]\xf5A\xa7t"\xbc_+\xf8l\x10\'1\n\xdb\xa5\xb4C\xf4\xce\x9c\xb5{\xe9 Y6_\xe4\x04\xf9A@\x84q\x07\xdfk\x94L\xc86W\xc5\x8a\xb7\xc5\xc0\xb8BR\x8cQ\x90\x9f\x8c\xeb\x12,\x08\xc1Ih\xaf\xa1\x1f\xd9,\x912\n^2\xe4\xd0\x90\xe2\xba\x0c\xd9T\x00\x16\xc99\xa8\x84"\x1dmr\x99\xf6"\x81\xb0\xf1\xa5\xfb\x12?\x9f5`x\xf0(F\xad\xf9\xd8\xea\xf8\x06\xb5v\xc8\xc8\xefd\xde\xfd{\x91I1\xd7\xa5\xe2\xf1\xa5\xc1\xc0\xddD4\tt\x9d\x9b\x1b\x8fg\xec%\x8f~\xf6\x14\x88\xfe,8EU10\x16\x0f\x85]\x8dU\t\xba\xdd\xdc\xe0\xbf\xc0\r\x9cd\xab\x10\xe2l\x8a[f\xb0w\x85b\xbc\xd9\xfa\xbe\xe0\xae&\xec\xf4\x1c\xe6\x7f\x84\x12 \xb2\xacS}\xf2\x15\x7f\xc9\x93\x14\xac/Q\xa5\xecB\xe6 s\x05\xf19\xe7\x12M]\xfe9\x9a\xb8(\xe16\xffoh\x8f\xa9\x069\x91\xd8\xebD\xef15\'A\xbfu\x8f\xef\xfc3(~O\xe6\xb4!\x01\xa1~,S\xb2N2\'\x8b=\x99}i\xe1\xcc\x17l\x18\xea$\x06\xdb\xe0\xc7*7\xf6U#\x9bvK\xbf\xf2\x8a\rSp\xbd\xf9v\xbc\xb9\x16W\tTu\x83\xb6\x93\xf7\xa3\x83\x03\xce\xc19\xdc\xf2\x86\x08\xd9^=+\xaf\x9b\xc4\xb5\xb0\x9c\x00\xcc5\x19Z\x8ek\x9e\xae-\xf2l\xf9\x7f\x05q\xfa \xa6\x04H\n\xc9\xf8\x19\xfe\xd30\xde\x9b\xf8>\x1b\x9d\x96p\x935\x84@;a\xc4\xb2\r\x9cQr\x19\xf9|.|\xf6\xe6\x93S\xe1b\x1bs\x92tw\x1f[E\xd2\x82)\xb1\xba\x07\xee9\xb9\x1b\xae{rp\x06\x82\x92\x85\xd9!j\x1ff\xaf\xbc\x99\x92a;\x05\x88\x87\x1b\xa7\xc7[`\x9b\x8d<d\xa0^\xa0\x94;\xf9\xb6\xe0\x9fv\x93tc1\xad\xd3\x92\xbe\xe7\xe8G\xff\x07\xc4\xf5\x99\xba\x87\x8c\x0cI\xd3\x94!\xb8\x96\x8b\xc8o\xd4\xd8{\x99\xe6\xb5\x04dj\tW\xe5\r]\xf5\xb4\xdb\xb6\xa6\xf5\xef\x03\xa5\xca\xf8\x15i\xa4;9\x9ciq2\x99g\xe4g;7\x11E\x10\xae$*\x12\xdc.\xd7>tg\n\x9dh\xb4\xbf\xff\xa8\xdd\xdcyx\x8e[\xa1\xda\xb6\xf4\xa9\x12)!V\xff\xefZ\xac$\xd5\xb5\x12\xac\x08G\xb7\xc2\xf6\x8b\x90\x07U\xe7\xe5\xf2O\xf8\x01^*\x90}\xe3\x9fYwj\xbf_\xdc\x8f\xcca\xcf\xe8]y\xa8\xd8\x8e\xd7\xc6qh\x16\xb1\xc3\xe2G\xb6e\xf1\x87\x9b\xab\xe3yi\xbb>\x8e\xae\x82\xc1\x8bGpo\xe4\xba{=\xa4\xa6\xe3`kw=mFR{I\xcd\xc9\x15\x13\xd2\x85\xafA\xc2bH\xc6\x19Wo\x91\x9d\x03\xbcpF\xa6\xa6G\xfd\x881\xd0%b\x9c\x05\xa3\xc6\xb6\xb3\xf7k\x17\x03\xef\xfa\x958M\x8a\x88\x90\x92y\xe9.r\xec\x18\x10X\x1f1\tR\xda\xf5f\x9d\xc1\xd6\xb43\xfaF&h/k\xf7\xbf\xaf\r\xfd\xca(*\x04U&Ht\xeeC\x81^\x00\xd3\xfb\xd2\xfd\xcb\x07\x99\x1b\xce\xc4\xd1b\x87\xf4\xa7\xcaG\xa2\xe8\x00\xe0\xc6\x8c|\xa9\x1f\xec\xea.\x01\xc8[s\xdb\x1a\xc9\xb5<\xbaad0\x7f\xbd\xaa\xd70Q\xa5H\x87\x1e\\\x8415m^qq\x1b{qz\xedeZ\x82?\xb2\xa15E\xe3\xa6\x80\xe2^&3b\x11\xb2\xc9F\xdf\xc7Z\x91\x82\x86p\xe3-w\xe6\xd6\x82\x1e\xf3O\x90\x9a\xc9L[\x00\xca\xbdR\x7f(\x82%\xcc\xbdd\xe6\xe1\xc0b\x91\xa6\xad6\xa8\x9dP_q\xd9\x06Z\x81\xc6\x9a\x07\xa5\\\xd60%<Z\x02\xe6\x1e\x0e\r\xc1h4\x9641\xc03\x02\x1av\x9d\xacx\xe7y\x9e6\x9d|\x14\x12\xcc\xa2\xce[\x15\x1a"\x9dbW\x9e\x93\xd9\xac%\x89\xbb\xe9\xc7\xe4\xcc:y;\x01\xdc\xda\xaa\xea\xaf\xd7A\xa5\xef[S-\x1c\xde\x17\xfa\x95\xac\xb3\x081h\x042a\x0cq?\xdc\x81\xfc\xb0\xd7\x01\x1e\x8c\x19>\xf9\xa0!\xb8\x84\x1eS\x7f\xaa\xa1\xce\x03\x9b\xe1\x89CVi\x1d2{9\x80\x0e%\xff\xd3\xc2\xb8\xbb\x19*\x1d\xed\xe3\xbdv\xd4R]\xe3G\xf5\x96\x81\xa0D\xf2k\x8d\x11\xe0\x98\x91\x0e;\x0c<\xd8l\xad\xd5\xe3\xc8\xd4\xcd\xed2T_\x8eu~yky~h!\xc2\xf3q\x10\x84\xdb\xd4\xfc\xa2B\xc7B\xae\x07\xcb\x12\xf4r\xe1\xc4\x97\xdf\xedn\xe6\x18o\xc4!\xc3\x8c\x0b\tF\xe5\xbf\x83\xd8\rQ\xc0\xd0\xec5\xaav\xd5\xd0\x86.\x96\x8d\x02g1my6\xfa\xfd(\xa7\xfc~\xd8\x86\xe5\x7f\x0b(\xcc\xf1\x18\xa7\xefHd\xca\xa7\x00\xaa?\xd3\xcf\x1a\x9c(\xf7\xa1\x1fg1BH\xab,h\x16G\x81\xbf\x1f\x97\nB&@`\xb6\xec\x15\xb3\xb3\xbb\xf2\xdb\xd0\x1a\x08\xbbc\xa4\x88\xc8l\xd6\x8f\xd0|\xd8t~\x12)\xefE\xcd\x89\xfe\x82N^\x02\t\xbe\xf1\xefw\x1e\x00D\xcb7>{%\xa1\xe9\xd5\x08\xf4\xaa\xa6w\x7fV\xf8\xca5\xb6..|!\xb4\xb5\x02~\x89\x95\xecW\x89\x81\xcfn\xe7\x0f\x01#Q\x97\xcd#\x82\x9e\xd7\xffcdr\xb3\x12\x07\t\x90P\xd1\x9c)\xbc\x1a\xe1\x1eP\xe3\x85\xd0\rl\x14\x03V\xd8E\x13{\xe0\xe9\xc2.\xc0\xdcF \x13\x9e\xba8fh\x9e\x0cU\n\xabK\xf8W\x88\xb5\xae\xb0\xf3\xe6:\x15r\xc3\x03\xeas\x97\xd8\xef\xd1&\x9b\xeb><n]\xcd^\xf0!\xcf(\xf9\xd6F\xc2\x1f\xd1\xd4\x92\x1d\xd5 \x12\x90\x08p\xb7\x1c\x9d\xafA\x05M\x1c\xba\x98\xb8\xc3\xb1D\x12K\xcf\x91\xdcq_\xa4\xc3\xec\x8e\xd7\x8c\x86\x88\x18;\xfe\xcb\xe6\x07@w1&G\x85z/O\xda\xb8\xaf-#yK\x8a\xee\xb1{\xc6c\xc7\xb0>7\x95G\xf6\x02?}\xb7Lj\xd6\xb5\xe3\x07N*\x01~\xf29\xd5_I\xba\xe7\xf2\xe1\x05/\x16\xfbu\x96\x18{S\xca\x8e\x08@\xce|\xc8\x1daT\x842\xcbo7\xfc\xb6-\xec\x87]:~\x97;\x0f\xe6\xb8\xa7@\x98F|9\x8dl}\xe0\xdb>KD\xf7\x9c\xd8\\\x98F\x8f\x9e-\x7fe\xb7\x19H~f\x86p^3t\x7f\xd2I)?\xa2\xaa\xa6\xd1\xb32\x87\xa7\x89_xu\xa2\xd5n\x0bU\xc2\xf6\xe7\x95\xde\xdb\xbeg\xe8\xc8\xe7OWn\xc3 \xb9v\x91$\xefi\xc8y\xa7\xbcJ\xc7=\xeb\xb4\x8c/\xc0\x00.\x10\xbd\xe4\x8d\xe2\xdf$8\x0fd\xd6\xec\x9f\x16\xc0}\x00\xe3\xee:{c\x1aH\r1A\x8a\xb5\xde\x8f\xc8K9n\xf6F\xfbp\xe3Y\xeb\xd1\x87\x1a\x8e\x1c_J\xc0\xf02)\x92\xebl\x03~\xd5\x9ai\xf8VH\xd1\xdb\xa5g\xa2N\xfbXyS\xfb\xd9\xa8\xbe\xe5F\x06\x9a\r\xd5\xf2\xcb|\x06#R@\x0c\x15\xf8B\xeb9\x83\xee\xb7]\x11i\x87\xc5/\xd97W\xb2\xa7\xbe\xd5\xaajq\x99^Lf\xc3\x93\x003\xb6[^\xd0\x06@\xc2y\x1c\xb7,o(\xbd\xe5\x89\xbbv0C\xb6`\xe6L\x08t\xec\x16\xde\xfd\x1brb\xcd\xb6\x8e)\x1f\xb1AL\x92{\xc8\xfd\x1b|\xa6_\x91>\x03i&\x91U\x1fT\xd9\x84\x950\x92\xc3\r\x82\xb9\x16\xd4\xf2\xbd\xddIS!$\xc5\x7f\xfa\xa08\x04\x9c7\xef\xf4\xeb\xc0\xa4H\'\x9e\xfeL\xa3\xa1\xc6\x87P[\xf5\xe8\xc8\xaf\xde\x04\x03\xe9\xd83\x0e\x07^\xdf1\xf5l\xe7\xb9X\x15}h\xa7\x04\x1a\x01_\x11\xde\xe2\xe4l /\xdc\xf1\x17S\xc5kI\x0f\x03\xa7\x96\xd9\x08\xfa\\M\x8e\xb3I\x08\xb1\xa0\xd8\xe7q\r?\xc5\x06\x18q]\x12\x81\x8eS2[\x0b\xa7\xe6\xc5\x13\x15\xdc\x15VX\n\xba\xb3\x14LY4\x94uT\x04\x1d=\x80\xc1\xd7\x94q\xd8\xeb(j|,\xa2\x0e\xb3\xe2')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ #!/usr/bin/env python3
2
+ from urllib.parse import urlparse
3
+
4
+ from hiddifypanel.panel.database import db
5
+ import uuid
6
+ from flask_babelex import gettext as _
7
+ from flask_bootstrap import SwitchField
8
+ # from flask_babelex import gettext as _
9
+ import wtforms as wtf
10
+ from flask_wtf import FlaskForm
11
+ import pathlib
12
+ from hiddifypanel.models import *
13
+ from hiddifypanel.panel import hiddify
14
+ from datetime import datetime,timedelta,date
15
+ import os,sys
16
+ import json
17
+ import urllib.request
18
+ import subprocess
19
+ import re
20
+ from hiddifypanel.panel import hiddify
21
+ from flask import current_app,render_template,request,Response,Markup,url_for,jsonify
22
+ from hiddifypanel.panel.hiddify import flash
23
+ from flask_wtf.file import FileField, FileRequired
24
+ import json
25
+
26
+ from flask_classful import FlaskView,route
27
+
28
+ class Backup(FlaskView):
29
+
30
+ def index(self):
31
+ return render_template('backup.html',restore_form=get_restore_form())
32
+
33
+ @route("/backupfile")
34
+ def backupfile(self):
35
+ response= jsonify(
36
+ hiddify.dump_db_to_dict()
37
+ )
38
+ o = urlparse(request.base_url)
39
+ domain=o.hostname
40
+ response.headers.add('Content-disposition', f'attachment; filename=hiddify-{domain}-{datetime.now()}.json');
41
+
42
+ return response
43
+
44
+
45
+ def post(self):
46
+ restore_form=get_restore_form()
47
+
48
+ if restore_form.validate_on_submit():
49
+ file=restore_form.restore_file.data
50
+ json_data=json.load(file)
51
+
52
+ hiddify.set_db_from_json(json_data,
53
+ set_users=restore_form.enable_user_restore.data,
54
+ set_domains=restore_form.enable_domain_restore.data,
55
+ set_settings=restore_form.enable_config_restore.data,
56
+ override_unique_id=False,
57
+ override_child_id=None
58
+ )
59
+
60
+ from flask_babel import refresh; refresh()
61
+ from . import Actions
62
+ action=Actions()
63
+ return action.reinstall(complete_install=True,domain_changed=True)
64
+ # hiddify.flash_config_success(full_install=True)
65
+ else:
66
+ flash(_('Config file is incorrect'))
67
+ return render_template('backup.html',restore_form=restore_form)
68
+
69
+
70
+ def get_restore_form(empty=False):
71
+ class RestoreForm(FlaskForm):
72
+ restore_file=FileField(_("Restore File"),description=_("Restore File Description"),validators=[FileRequired()])
73
+ enable_config_restore=SwitchField(_("Restore Settings"),description=_("Restore Settings description"),default=False)
74
+ enable_user_restore=SwitchField(_("Restore Users"),description=_("Restore Users description"),default=False)
75
+ enable_domain_restore=SwitchField(_("Restore Domain"),description=_("Restore Domain description"),default=False)
76
+ submit=wtf.fields.SubmitField(_('Submit'))
77
+
78
+
79
+
80
+ return RestoreForm(None) if empty else RestoreForm()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
81
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product