hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev66__cp38-cp38-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,124 @@
1
- # 2023-04-08T16:23:20.553320
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xba\x16\x00\x00\x12\t\x04\x00\xc7j\x87\xab\xc1\x1a~\xa6\x15\x99\xa6\x1e\xca\xa8M\xce\x00\x00\x00\x00\x00\x00\x00\x00\xf5QG$d-\x08R\xb9\x01\xb8\xbbM\x95\xb1\xe8\x90\x01\x88\x9b9\xb6\t\x99\xe0\xfb\x06\xc73\x91MV\x05s\xd0\xf5I\x0fX4\xd3c\xd2\xb8\x91j\xb2\x870\xeb\xfa\xd5\xdd2\xe6\xd6\xe3\xd21\x9a\x87AX\xff\xb3\x9c\xab\xf0\xa9\x9c\x16\x95\x97\xe8\xb0|~9\x1a\xd8\xc4\xe1i v\xf3)b4\xc7\x1c\x1e\xaa\xaf\xe8\xf4\xb2\x8f\x98+\x8b\x921\xe5?\xce\xe7\x07d\xb7{\x1b\x91H\xe0\x86\x04|\xadz\x80><\x9f\xf3\x16\x8cDS\x1aY\xba\x1al\x9a-j\xa4g\x8bF\x15`_\xb5\xb9[=X\xee\xbf1\xcdo\xea\xf1\xad\xd3\x85;\xa6\xe6\xb4\xc4\xadX}\x1e\xe5\xd3\xf6\x182 \xd2)F\xcfL,^1\x07\xc9\xbfit\xe1\xe9\x12\x89F\xb0FU\x97s\x8f\xc2\xa8I\xd19y{\xa0\x0f\x16\x10n)\x1c\x15O\xa7\xefg\xcc]\xa6\x8a\xe5C\xa2\xcd\x9f[\xb5\xe7\xd2\xafJ\xd6\xe7\x0eD(E\xa7\xa0fr\xf2\xacDP\x9fVel\xfb\x8e\x93\x99O\x97\x1d\x00\x12s6\xe8"\xaeQ~\x7f\x92\xa6:\x00\xd7/\xfaM+\x99O\x0f\xcfU\x03*\x1f[\x89\x91P\xe3\x86@b\xc6\x10\xa6R\x82%D\xb4\xe5\x8aV_\x97l`\xe8O\x00\xd9{\xb6\x98ua\x994\x05)\x00\xab\xf8\x90}T\x93\x12X\xf8\x19FW`\xcbA\x92\x86Y\x87\xd8@Gr\x88\x11\xbf_\xf9\x9e\xef\xadmts\xc0z\\\xda\xff\x18PL\xa6\x1eO\x81)\xd7\x16m\xc4\xc4\xfd\xa5F\x82r\x1eW\xf8\xd1\x94\xa4\x8ab\xc7}\xeb\x17\xc1\xba^Q\x9cb\xf1M8\xc3\x82\x05\xcd-:\xab\xcbF\xb81\x7f\xb9\xf5=\xf8\x14\xef\xb2\xde\x857u\xafU\x98\xcb\xba[\xa3\x8f\x81\xbc\xdf\x05\x84y\x7f\x88\xc0\x12\xd5\xfa\x0f\xb1J\xdf/Y5\xa8\x0c\xaa\xaa\xc1\xf8;\xb3\xad\xb0z\xd1"\xfe$l\x03\xcc\xea_\xad\xb9\xc8\xc8p\xd2|D:Q\xf4\xba\x19\xefq*qjz5\xc7\xdc\xff,>\x95\xbb\x12\xf3\xadM\x0eJ\x15\xd6|\xe9^Rj\xa1\xcdIC07*uX\x83c\x19\x86\xc8\x82X\x00\xedn3\x04\xdb\x8e\x8b\x84Y\xc5\xcd\xc8iw\xffM\x7f\x10J]I\x80Q\xb0F=B\x14\x95\xa8\\\xf7\xf8x\x7f\xa9\xceXd8\xd8\xe6\xb1\xfayh6\xd2\x8d\xc5\xc8\xfb_\x9f\xb6;\x8b\xde\x02\x87\xb6o\xcf\xe7\xad\xec\x02\x8a\xc9\xf2Z\x10\xc0\xf0\x86\x08\xf0\x17y\xac\x94\xa2\xea\x93\xaaHwc24\xe2\xd66\xad\x05`\xfe\xf1\xa40a\x95\xcc\x9el\x10W\xfbX\xe4\r\xca\xe3\xd4a\xaa\xeb\x90\xd6B[\x12\x194\x8a\x0f\x19J\xb7!\x8a\x12M\xfc\xd8h\x1f\x07\x92Y\x02\x16\xf9\x91\xd24\xd2v\x14\xa0\xe6\xb8\xd2l4a\xa1>\xce\x93\xaf\x1b\xa1\x9d\xcd\xb6&\xd1>\x9d\x99O\xa2\xf2}\xb1\xae\xc0\x90#@a\x8a9`@D\xbe\xed+6O\x1dZ$;g\xce\x14,l\x10\xf2`v\xc0\xef\x0f9U\xe2)\xac\xc3L\x9e\xcf(8K@_\x83.\xfe\x8b\xd1\xfb\x90xj\xb1I\xbc\xa7C\x12d\xe6\xa2\x96;k/\xbb\\L|\x98\x9e\xdfT\xb9\xc6G\xe1\xd22WH\xee\x02]\x15\xd8\xe6eY[\x01\x99\xf3bz$<\xf5\x8b\xf6\x96n\x1dN\x94\x1c\xaav@\xfe\x15A\xd1S\x10\x1d\xc6\x14[\xeb:\x1d}i\x17H~A_T\xcce&\xe5s\xc2;\x9dX#\x9e\xeb\xef\xe8x;\xfd!\x899\xe9\xa3\xb2\xd7\x984\xf1\x99\x15\xe6Lt\r\xb4\xf0\xfc\x82\xa0\x83\x1e\xde\xa3-|\x00\xd8\xf2$\xb3\xb7%\'<<O,\x85\xd4&\xee]\r\x85\xbdmE\xd7\xaf\x99E\x06\xbf;H\x0b\x83w\xe4}?dy\xf8%\n\xf6N\xc2\xb9\xda\xe7\x9a\x9e\xf2\xd0L\xf58\xcc[\x80\x0b -\xf2\x04\xcf\xb4gu\x86\x1a\x10\xbeY_(w\xff\xd5\x7f\xa3H\x9a#\xe1r\xf7\xd8\xac\xed>\xfa\xfd\xdd\x16\x07\xfb1s\xa6\xde%\xd3\x8e\xc9E\xeab\xcdA\x14\x96H\x8a\x97p\xb8K\xc6x\x8d\xec\xe6\xba\xed\x8e\xf7K\xe1W\x14\xdb\x1f\xbez\xa3_\xddx\x86B\xafM\xa4(Vk:O\xb8D\x80\xba\xd2\xfd5\x10\x02i_)\xe9\xe0\x8aR\xa0\x10\x90\x1e\xd9"\x85VX\x83\x0f=zG@[\xea\x84|\x95\x11\x12=\xcb\x9a\xaa\xb3%\xb6\xd4\xddT\xbfH\xa6bN-\xfe\xc7\xc1\xa8\xa8\x97=C\xc1\xd2\x9a\xf1=\xed\x05\xf8\x8d\xd5\xef\xbe\x19(\x89oW\x05%\xe6\r\xdf\xfet\xff\xe0it\xdf\xee><|\xd5RA\x95P\x85\x1d\x95\x8fit\xd6>\x1e\xfb\x08N\xba}@1>\xd9\xe2\x85/\x0e\xa1(`\xe0\xc4\xa6\x15\x86B\xef\xfd\x1a\x10@\xed\xd82\xe2k\x85\x8f\x15\xc0\xdf\x8b8\xb7@q\xb5P\xea\xc1\t\xc9\x05\x83\xe5-\x9c\xaf\xf0\xda\x93Z\xe3\x80\xaf\x07\xae--\x0b\\\x06\x1aS\x1by\xd6jF\xe3\xf8\x82\xee\xbfqu7s/\x1a\xff\xff\xc2H\xafp\x0eu\xe0\x99\x1e\x92p\xc4\xb1\xd9\t\x90\xc8FA\xa5\xa6\xa1&\xbaH\xf9i\x0e\xe7XO|\n\xd2Y\xc5\x07dk\\LP\xc2 \xc6V\xa0\xe9\xf1H\xe7:e\xcd\xdb\x05\xb14\xfd\xd9#3\xa1GY\xb9\xdeK\x1a\x9e\xf5\x8aV]t\xad\xeai v\x00\x92\xe9\x9eih\xfeR\xf5\x8d \xee\x12\xed\x85a=\xb8\xb1HM\xa7\xcf\x14W\x1b\xdbw\x0e\xf9\xbf\xb5\x98\xaf\xac\xd0E\xa8\x83_!\xa3\x88\x1e\xbf\xe1Sb\xafB\xa12.\xae$\xd3\xa5\x9eg\x91\x1b\xc4&\xd6\xb6\x9a\xfe\xd8\x11\xc6\xa3\xa2.\xd4\x14\x06\x9e+\xfd\xbd\x07Qx\xc3\x8b\tG\x8eP\x8a\x8c\xb9R\x08U\xecjw\xae\xae\xc7\xd1v)\xdc\xb7\x19\xaac\xd1\x15\xae\xac\x10m\x104Ly++\xaeF\x8cj\xa0\xd8\xd3\xff\xdfM\x18\x86\x83Fr\xe8\x01\x1d\xb4\xb2\xd5sU!\xff\x9c\xff{\x80\xba\xbfz\x96\x89\x9c\xa2\x0c\x03\xb4\xbcr\x93&5@\x98\xab\x91\xf0i?\xad\xd6a\x9b\x1e\xe4\xe8\xff\xa9\x92\xbb\xa5\xb8(\xf8\xea\xc7?\x18lv\x9f\x13-\xca\x89\x1e7\xf6X72\xc9a\xf6\x91\xbf\xaf\x82;$\x88{)<\x88y\x01\x82Y\xbb\xf5\xa0\xd0\xea.\xc6f\xb1&\xab\xac\xb6\xab;\xc6\xb4\x1ci\xd2y\x9af\x9a\xfc^\xde\x86\x08?=\xaa\x81\x82\xa8J\xe2\xb4\xe4\x16m*\xd1\x0f-\x9e\xd5\xa9\n\x1a\xf5\x96\xad\xce\xd6\xb5\x0f\xaat\xd0\xb3\xf6\x02\xe3\x031}\xb9K\xf9f\x00MM\xcb\xe9\x03o\x11)O\t|\x1b\x93\x95\n\xd5^\x9c1\xe2\xbd\x1e&\x83\\\x82\'\x01\xbc\xf0\x81\x04\xfa\x8a\xbe\x7fF\xa7;+\x08\x15H\xee)\x1bbi+\xd1\x9ai\xb8\xd8\xa1\xa1\xeal\x19O\xb4c\xe9B\xf4\xfd\xcc`\x8b\x8d\nE\x9a\x01\xac/\xf0\xdeD\\\x02\xb4W\xbds\xd1B\xd8R\xf2\xf0\xc3\xfa\x83E\xc7f\xa9-\xa9A\xa8x\xf3W\r\x10,]\xc8\xad?\xdb1\x02\x81PQ\xd1 \xe95v\xd3\xb6\x08)\xdd\x93\x03f\x7f\x8b\x93\x0ct[\xba\xa1-\x08a\xcf\xbc$\x14\xf2\xaa\x94B@\xb9c$Y\xc6[\xca\x1b\x9d\t\x15\xb3\xaf51\xea\x16\xc4@\x96|F\xb1\x1e\xd5\xa7\xce\x82\x1e:\xc6\x01\x11<\xb5\xba\xfa!/f\xa53>B\xe5\x87\xd0\x1b\x00E\xef1\x0b0\x04\xc0\xa4Y\x0f\x08\xb0\x91n\x97\xaf\x15\x8b|\xf6L2k\x82\x00\xf8\xe6\xdby\xaa{\xf5\xb9.\xa3\xf0\xb4}7\xef{\xba\xf3\x00@\xcfa\\S\xdf(\xcaC\x17\x82\xa0\xe1\x0f\x15\xe4\x7f\x821\x8cL\x06\xe2\x83\x89\xc4\xce\x82\xeere\x98\x8fQ\xdad\xc3C\xba\xe5\xce\xdc(\xf2\x82\xca\xf3\x18\xffz*E\xafb\x07\x00\xca\x0e\x89\x1b\t\x93g\xe0e\xffB\x01@(\xf1mJW@\xa6t\x17\xc6\x97\x1b\xdfxQ\x00\xec\x8e\xc8\x7f|\x85"R\xf3\xb6\xa4\x02*V\xc40KwuC\x0c\xcb7\x89\x8c\r\xa3zy>\xcd\xb86\xc5\xad\xde\x8d\x14\xba,\xbePa.\xf3\x16\x02@\xb9\x7f\xb3Q\xa1\x00-\x943V\xfa\xf3Gq\xc0\x9d\xb1>G\xe1?b\x93\xf2\xb5R\xbe\xc0\xc2\xfb\x81\x830\x8d\xf2\xd2\x1eL\x91&\x92\xd2\x1f\xf8\xc3\xc0\x96\xe2\n\xd9\xaa~A\xb4{\xe2AR\x1a{\xa2\xda*z\xa1<\x87l\x11\x1d\x87\xb7\x91\x0f\xfa\xbe\xf4\xe8\xbe\xd8\x9a\x1c7\xb8\xa8\xe3\xc77F\xcd\x83E\xc1\x9d\xe53V\x19\xc8\xbc\xd0\xc3\x9bY\xb0:\xb5\x85\xa0\xcf\xd7\x16\xa6WRDE\xd2\xaa\xe2q\x1a\x08\xdeP\xa0\xef\x11@3\xfc\x90\xb3\x07\xdf\xcc\xc7FY7\x93\xb5\xech\xd2s\xb1v\r\xd4]\x00\xa7\xb1\xa9^\xb3Vk\xf0c\xefj\xec\x01\xc2\x8f\xdc\x01\x8a-\xf3\xc6&\xf8\xfe\x89\xf8\x00\xd5^6\t\xa2S\xbeT\x01\xec6\x18M{\xa5\x1b\xe7\xf0YMGI\x8cH}\xac\xf7\xe3\xe1\xee\xae\xad\x18@(sz9\xa2S\xd4\xd4>\x94\x9a\x98C\x92\x0e\xb8\xfc\xad\xfa\xa9M\xbd\x03D\x8a\x93f\xeb!\x8d\x9f\x14\x19F\x1b\xf2u\n\x82\xe0\xd6\x9f\xbf\x17.g\xe6\xc7\xec\x1f+\x9c\x0b\xde\xaf\xd5\xea\xf2\x1d\x08\x9d\xc6&5[p\xcc=\xf2\xf30O\xee\xa9\xc7\xc5>\xf0\x0b\xa0 \xa6\xf6P\x11\xb8\xac\xb3\xe5\r4\xa3.\x81?h\xf6\xc6\xe9#\x9f&n\xbfHL\xab\x1e_\x14\x14\x05*\x8a.4\'\xbc\x9cR\x99i\x89\x9b6\xed\x17@T\xca\xf81\xd1\xf8\xef\x97\xe7y\x7f\x0c\xc9\xa6\x8e\x97F.\xccdL!\xee\xd6\xed\xf3\xddgM|T\x00_4\xe0\x80+M\xeb\xc7\'\x13\x82\xbcR\xe2\x92\xd4pk\x17\xa5\xd8%\xd3;<\x1e\xe3\xfees\x19\xe8x$\xd8\x13)\xfb\xeb,\xba>\xa4\xc7<\xa8R\x97\xfd\xe7\xa1\xf9\xc7H\x19\'\x12\xde\xddp\xe8Z\xa3\x1dL\x90\x07]vY,\xda\xf6\x17(F\xfc\x98&f\xf9X*\xd8L\xd5\x10(\x89\x1eri\x99\xcb\xed)\x98\xaee\xb3\x0el\x93\xcfJL\xf9{N\x1d\xf6\x8c\x8d T\xa05\xdd()\x00\x83\xae\x96\nK\xb6\xce\'\x8dR\x8e\x01rE\x11\x04fP\xbb\xec1~z\x96(\xde\x91\x9c\xe4\xe2\x1d\xd5\xf7)\x10_sL$\x8cp{Dy\x0cg\x85\xbd\x84c\\\xdf\xe7\xd3Z\xf4?\'\x84Lh5?\xe3\x97\xb0\xc1\xe2\xc8\x7f\xa8r\x96\x89\x95~\xc95\x9b\xe1::\xb6\xdeZ\\\xffE\xdf\xef\xc0J\xa7\x14D\x1c\xe896\xb0\xa9B{G\x16\xfcE^th\x98vu\xe1\x15\xfc\x07R2\x15\xb8f+\xd4e\xf8z\xb9\x01i\xec\xd9[\'G]\xd4\xaf\xfcfU\x8bm-\t\xd6\x82\xa5V\x15aH\xd5\xa2f\xe8\xe6\x92\x13\xa7#\xf1\xb6\xb2!\xf1\xd1\xae\x1f\xb8\x8d\xac\xbc`"S\'\x08\xaa\xa2\xe9\x8d\x14E\xe1s\xe1\xe1\xd0\\g\xe41,\xa5L\xd2\x15\xca}\x18O{\xca\xd2\xaa3\xbe\xe1=\xe9\xbd\x02]0\xdc\xb7\xaa\xb1\x8c\n\x02B*\xb6\x92\xaba2T\x83\xd3\xc3\x82\xdc\xb64\x0ez*\xeer\xd98WR*\x07\xe8\x12(\x02\xf5\xf8g\xa4\x9f\xe76nbn<\xa0\x82\xd0\x8c\xb0\xa1\xeag^K!\x9f\xd2\xf7\x1aE\xd6\xb9P\xbe\xcaj\xbd\xd6\x92\xa5\xc2\xb6\xa2@\xb1R\x8b\xd6>\xa8AD\xf2\xc6)\x11\xaa\xc8\x9aet;A\x1d7\xb2\x1f.cEe\xddi\xae\xdcU\xd9\xe0\xaa\xf5Z\x1eU\xa1\xdcM\x8bH}\xb9\xb5\xde\xe1\xebL\xe7\x08\x88\x1c\x86\x99\rp\x15% x\xd2\xec\xe4\xb8:\x91\x9a\xe3\xf6\xf0\xdfR\xeftf[M\xde\xa0\xe3J~\xa7\x00c\xee\ni\xea\xd3p\xa1\x90\xa4a(\xcb~\xbb\xc3w\xc9y\x80/u\x13\x8e\xf7\xbe\xcf\xa8q\xa3\x15\xe4ywI\x1a\xe5\xfaK&D\xbcQ+\x14\xe9;k\x02\x17\xa6\x03\xfcJ\xd1{w0\xce\xc7\x88L\x11\xf9\xa3^~\xfd\xd2\x97\xc7JQ\x83\x04\xbe\xd38V\x99>\x93\x8d"H\xa1m\x13\xc4z\xbcc\xf9w\xdfb\xe6\xe6D\x0c<\x02\xd7\x13"\x12\xb6\xec\xf5\xde\xf61?lAp@x\x86\x88\x01o\xa1b\xa81\x00\\\x00\xc0\x07\xf9\xffG_\xdd\x0bW\xd7\xd6\x8c\xbfD\xa3\xd4\\\xf0\xb8\xe8\xc2\x9d\xc1!\xde.#\xe2\xb3\x03\xc2j&\x1a\xf4~\\\xf9\xae\xd8Tam7\x1d\x07\xe4\xda\xb9\x80\x99\xc8;\xac\x9d\xcfM\xc1M\xddq\xd7\x15\x02\xa0o\xfc\xa7\xd0\xc6\x85C9\xf3\xc5\xd2y:\x95kaH\xf7LF\xa9\x82W8k\x15\xf3\xfdQA7\xfe\x064\xff!\x1e\xd1D\x93^\'m\xcc\xe6\xa2$\xb0|\x8bpi\xae\xef\xea\xa2\x8dv%I+\xf3\xa7-\xbf\xcb\xa0\x98\xcd#\\=\x8e\xee\xeb"|\xc8\x89+\xdbu\x94h/\xb3\x1e_r\xb4E\xfa\xb2\xe4\xa8\x9cE\x82\x91\xf8\xa8-3\x15\x91\x9a?\x9cz\xc0\x97\xda\x9d\xbe\xaci\xcb\x86\x91\xf7\xbeeQ\x96\x12\r\x8c\xb9DH\x80G6\xf4\xc6K\xd8W\x92\xf9\x1a\xe4\xf3\xea\xdc1%z}\x87\x1f\xd4\xd1\xd0\xfb;\xdc\xf9G`,\xdd\xc52\xd4\x1cBkw1\xe4\xe1\xc7\xa1\x9b\x8fa\xc9Urg%\xe2r"M\xc5\xe8\x10\x06\nS\x9f;\xe1\xe9\x85\xb0\xdf\x93\xa2\xbd\x9dx|\xd2\xb5\x1b\xfe\n\x97\xb6L\x15\xea\x89g\xf5\xee<S\xb7A\x1f\x10\xb7\x83U\xab\\\x12\xf3\xecy\xe1\xe8\xd4\xcf>\x8dk\x0f)\xf3m\xf7\xc8\x15\x9aN\xb8"\x9e\xc7VU\xe1\x97\x9cS\x84(\xb6\xdf\x98n\x89\x17\xaf\xb5\x12qkI\x90\xf2\xb8\xfa\x19\xd7/\xc9\xd7\xdd\xb9\x1dZ({\x87K\xb0\tC\xbdB\xac\x9fn9\xac\x05\'\\LDD\xb90\x0fA\'\xf9y\xe50\xc2\x18\xda\xb4\n\xb39\xf07C\x12e\xb1\xcd?8\xa3\x87R\xcf\x80\xe1N7!lX\xe8\x0b\xee\x87\xaf^s\xd3\xe7\xa9\xec\xef9\xca\x14\xd9\x04|\x1bl\xce\xae1\x9a4\xe3\x08 \x7f\x90\xdcH\x04u\x89\x80\xbcd\x9c\x16s\xeez\xfa\x89\xfe\x8c\xe1a\xc5\xda\x1d\xd6\x97\xf8\xacR\xfd\xf9\x1d\xd0\xd4\x0b\xaax\xdb\x96/\xda\x87\xcbQ\x85j=F\xe6<ET\'h\xcav\x8d\xc9>aOC\xb6\xe0\x9c\xf2q.\x88t\xc7\xdaU\x98\xc8\xb4\x13\xfa\xd4\xa5\x1a>\xc9\xdd^\x1a\xef7\x15\x1b)\xcd\x1e\xfb(\x13L\xf7\x9f\x10xg\x80\xbfiT\xa0p\x03\x9c\xe0\x1b\xff\x8e\xc1\xca\x98\x8e2\xe9\x8c\\p!\xf9.\xfdc\xc16\x1d\xb3\n\x85\xb1\x13\x11?@x\xc6|\xb5\xdf\xb0\xa1b\x88\xde\xb6\x96D\x9f\xdaDB\x12g\xde{\xc4t$\xe95\xe1\xff\x7f\r\x8d\xb0\xd0J<\xcb\xbf\xfa9\x9a\x0e\xf3\xff!\xb2\x1aZ^o\x1b1\xccn`\xe5lsNUS\xe3l\x02]\xa1>\x87\x843;6\xf1\x07\xad\xc2H \xea\xb4t\x8a\x87`\x08<\xc2ZVZ\xd4\xb0\'e\x1aF+\xaf\xb5\xcc\xf5\xecT\xecs\xa1)\xbcM\x19DV\x1e\xf1\xefo@\x97\xcc\x19\xca?<Q\x11\x18\xaa\\}8i@\x19\xa7zrf\xf1S\xdf\x01"\x8f\x08\xca\xf5\x13\x98\x1c\xa0\x0c\xff~ko\x1f\xebK\x11=\x0f\xd7\xd9\x1e\xe4\xa4\x0b\x84{\x9e\x8e\x98Bs|\xb5\xa7\xd8\x92"\xf53\x86\xbb\x87R\xa9\xff\xca\xc4OD\x90\xca\xe6\x9e\xfc\xdd\\\xc7\xb5\xb5\x02\xd6\xee8.\x0448[\xefgq\xceR\xded\x0f\xea\xecQ\xe6\xae\x9e|Mt\x81\x04Or\xf1\x9c]\xcd\x05\xb1\xe6"I\xd7\x85\xb6#$\xe3N\x9b\xf4\xc5\x9d\xe5D\x97G%ht,\x10\xaa14\xc9\x92\xed\x97"\xff\x9a\xd3P\xb8s%s\x1d\xa9%\xf2\xaa\xd9\xdc\xfd4a]\xf6\x0c $\xae^_\x9dY\x0b7\xe5Tq\x8e\xe8\xf4\x9d]\xfe3mlj\xbc>\x9d\xf3o1j\xd2\xd2j\x87\\tA\x91\'\xec\x07n\x03\x7f\xdam\x81Y\xc3\x87\x16\x1aR\xaao\xd9\xab\x85\xfea}\xd7 F\xb6\xd0\x8c3\xa5\xdc\xe7\xa5\x08\xc6\t\x14\xfd\xa6\xd9oG\xc6\xc8OaSx0\xc7x\xcd\xc4\x0b8\xd0?7Y`\x9b!\xbe\xbb\x9f&9T\xf3\xda\xafJ\x181\xf53\xf2V\xd5\xe3\t\xe6)9\xacZ\xb54\xf9=[\xd5\xfc\'\x89\xb7SY\xe8\xda\xc9\xee\x10\x10(E\xf23D\xa0j\xc0\xef\x1e\xf0IVG4\x05\xf7.\xfe\xf6\rW\x04> \xc6\xe0\xcfQ\x05\x12\xed\xb8\x0e\xf5O\xda\xcb\xa2\r\xbe\xe9\nY\x96O\x1f?\x95`Z8\x16\x9a\xad\x81P\x83\xbe;\x95\xbd<N\xce\tV\x16\x11\x10\x8aw\x98\xb9\x03\xad\x86\x12/Xu\x05\xae\x87LQ\x93<)V\xbd\xc2\xc4\xde\x13\xec\x1cK-o\xc3I\xea8\xb5\xbf\xe5L@E\xe1.\xe8?]\x8d\x89c\xf9#\x0e\x0e&!\x01\xca\t\xeb\x17\xb2\x0f<\xda\x1d)\x82\x15-ot\x84\xe0K\xd0\xe6v\xea5\x8b\ny\xfeOc%\x11\x19\xee4\x0c\xd5\x9dYn\xa95\xf7\xc8S\xaf$l\xc0F\xcf\xdb\xb0M\xa3\x06\x93\x9b#\xce\x88\xb27w\x15\x17{\xe6>\x89\xe81a^\x10\xd6T\xc1;\x04$\xdb\xe8\xd8\x1b^oM\x9a\xcfd#\xd8\xd6\xcb\xba9\xb9\x06\xc6O\xb2\xed=i\xf7\x96\xa3\x81\x0b\xf8qn\xfd\xfc\x04\x94\xd1\xf7<\x8es\xb0\xaf[qH"~\xf68x7\xec\x04\xb2\xd0\x96\xbd\xf2\xcd\xf5\xba\x1f\xec\x92\x14\x1b2\xc1T\xd6!f\xfb\xb8\x1b|e\x15q\xbeda\x97\xa1?\n\xa8s\x03$\xef.\x89\xdd\xfa._1\xed\x02\x15\xc4\x16\xf5\xfa\xd4br^\xf4\xd7;\xee.\xf4\x02\xdc\xb7J\xe1Q\x1f\x07\xb6\xae/@\xe9\x80\xde\xec\x89\x7fuw][\xc4\x87\xf6o\xb9\x9a\x81&\xcf\xc79\xbd\xbbY\x00\xe5\x99p<\xf3i\xc8 ,\x1fA09H\x17Q\n\xcc=\x0b\xe0\x8d\x08\xd9\xea\x87\xe83\xce\xaa-6vu\xa2`\x9b\xc6m\xfb[\x87\x1b\x11!h\x07\xc2\xa9_&\x02T!\xe1\x9e\xdb\xce\xf3,\r\x17i\x0f\xb3\xa8\x82\x9d\x7f\xe5\xaeq\xc4\x96\xe1 \xa5BO\xddu\x18\x0e\x91\xe7\xb9\x1a&\x8b\xaa\x9b\xca\xe9,\xc2\x01\xeeK\xba\x8c>({\xbe\xea!e\xf8/\xb9V\xb9\x8b2\xbc8\n\\\xbdW"\xad\xc8/\xd6\x06\x1e\x19\xb9:\x06W\xac=f\xd3\x1e\xc56m\'\x99v/\xfa?\x8b\xa0\x8b\xe5/\\\xa2\xf1\xa0Z\x8c\x9f\xc8\x05s\x95\x8e\x1f\xbf\xd3\xaf\xb9\x87\xd9\x1e\x98\xc9\x91<\x04\xe6\x88>e\x86p \xb0f\xccX\xd5\xeb\xf9\xb7~\xa7\xd5\xfb\xe4\x12w\xea\x1b\xfa\x1bz\xaao\x10\r\xa1fy\xf5\xa0\xd5x?\xa2\'0Rv\xc3\xb0\xdf\x0e\xec\xffR\r#\x94\xad\x9d)\x14j)\xe4\xac\x83\xc75(r\xb3:nh\t$\xd9*\x1b\xbb\x0e\x0f\x0b.\x03\xbe\xa2\x81\t\xa16\xbe\x9f\\\x11\xe2\x05P\xce\x95\x0c\x1d(\xa5\xdb\r\xeb\x9f\x06\xedK\xb8\xb2\x82\xfb\x83\x00q\ng\xb5\xdf\x16P$\x106\xdaJ\xd9>\xbb\xfb\xd2"\x8f\xd2\x08&\x03\xadyP\x8b1\xdb\x15K\xf7\x9a\xf7\xc0C\xa1\xd1\x18+\xf7\xcb\xbf\x0f\x1du\x05\x14\xf8\xbb\xca\xe9_ci3\xcf\x14(\xfa\x93` \xaa\xc6\x080bl$u\x91\xed\xd9+\xce\x1c\x07(\xa6\xfd\xc0\xafI\x1f\xb4\xe0\xd0C\xcc\xb9\xb2\xecp=\x08`\x9aC3\xd0\xeb+\xbd\xf0O\xeey\xf15B\xce2Xt\x12\xdeP\x7f<\x11\xdc/\xf6s}\x7f\x905\xde\xfde\xcaF\xbe\x8d\xd6\n\r\x85\x9bT\xab;\xea`s\xc0\x8ao\xf6\xa4\x13\xdf\xb8\xdf\xbb\x99\x8d6\xe1p\x8d\xda\x19J\xbc\xd0\xf0@\xd4p!\xca\x1bn\x0b\xbf\xd4l:\xe5\x8a\x03\xdd\xfe\xbd\x14\x92\xe9\x0e1\x0b`\xca\xe8\xa9\xe0\xbdjA\xc8\x7fm:\x9d6\xcf\xf7Fwc\xb9>NN\xb0T[6\xe0\n\xfdli\xc4lR\xd0Ik\x99\x10y\x8b.\xe5v\x82\x8aU\x87A6\x90r\x05 y;\xba$\x98"\x1f{\xc8\xd4\x1c\xb6\n>u\x04\x18\xd7l\x92\x97:\xa0\xdb\xb6\xc0{\x00lF\xaaR\xa0\xecnN;D\xec\x8f\xe0\xcf\x7f\xee\xe2C\x05\xc8,\x1c\xee\x88\x08\x18\xb3\xbb\xea\x91,\xff\xdc*\xb4\xbd\x0cI?\x83\xff\xe0\x11\xdb\x0b\xa5v\xdb"\xd3\xc8DQ\x99\xe3}]\x956x\x94\x16b\xb7Xge\x1b\xccT\xcbI\xe6\xb0\x1c$Y\xb1\xff\xf7\xd5\xc2|B\xf4W\x99C\x99\xffb,\xa5\xa6~m\xbe\xf6\xfal\xa6\x11v5\x069:\xd5i\x15\x13*\xc8J\x93\xe55\x0c\xa9\xb8b!\x08\x06\x99o\n\xd5ad\xcc\xd3\xe7:A\xba\x85\xef\x01\xa6R\x94i\xc5|xO\xe3\xf8\xda\xd1\xc7<hRJc\x92\x81\x97k\xdb\xcb\x19H\x0f\xfcK\xd5u\xe8_\x0e\\\x98\x7fU*\x80\x8a\xe3\xa5\x12a\xa8\x0f\xcab\x0b\xc7\xcb\xcaz\t\xae\xadM"\x1cZ\x01{b91-&\xbf\x01h\x947Z#\xdbl\xeaIr\xeeT\xec\xf14\xf0^u\xecm\xc1\x023\n\xf2\xb30XY\x11\xcf8#\xd8\x926]\xac\xf3\xc7@\x8845;\x0f\x8a[\xd4)\xf7C\xc9~/\xc5\x08|\x85^S\xf0\x1e\xc4M\xdd\x95\xda3\xaf\xa1\xa8\xf1.\x8c\xc8\xbd6\x9a\xa0\xd7\x1a\xfa\xbe%\xeeX\x1e\xcem\xb8\xe4\xd4\xbe(M/6\xcfzN\xfb\xcac\xf1P\xed\xad2\xc2\xd4\xd5uaBK\xe4\x0f\xc1\x8e\xb36=\xdf\x16\xdc\x06\x81Cg\xaa\xdaxO\xbb\xe8\xc9\x1d\xaf\xee\xec\x80#\xd3\x8bm\xed\x19YUQ[L.MP\xb6|\xb2^\xe0At\x8a~\xc1\xbfO\x13\xb9\x01i2wM\xf5\x87\xe18\x161\xf7\xc87\xbe\xa5\xca\xb2H\x14\xfe\xc3\x97/Y\x91\x99(L\x9cN\xb5Yr\xab\x8b,\xe8,f\x9d\x8b\x9d\x93\xff.1a\x01\xa3Y\x86*3\xb7[\x02\x87!\xf4\xde\xd9\xd2]\xdc\xf5\xf54\x96&\xdd\xc3\xe9]\x13\xef>O\xec\xdd\xb4\xe1\xb9\xd4\x81\xcc\xf48\xb4\x12\xfc\x1c?]^\x02\xd9\x1d\x1b \n\xb1\x0e\x15\xb7=\x93B\x9b\xe6\x06_\x9b"\xe40V\xd0_\xce!\x96\xee\x96:\xc8/\xf6\xd6\xf6\x15bDS\x9f\xfd\xda\x8a\x18\xac\x03\x0f!\xaf,\xd9In;\xc4\xcb\x08\xa52\'\xc6\xac\x05\xf7\xd9\xb9\x13r+\x99m_\x17\xd3\x15o\xee\xe8SpNe\x89\x8c\xa4e\xc3\x92\x98!\xea2\xd5\xedZ\x1b\xe4?`\x84}\xc1\x92\x8f\xfd/(\xe0\xad\x7f\x7f\x06\x81O\x85\x95\xff\'\x9d(\x8a\xf6\xc1t8\xa5\xe6>\xc4\xa7\x912\xe199z\xd5*X\x16\xe9\xee\x17k^\xbf\xe2s8Y\xa9\'{\xd5\xef\x86\xee\xc6\xba\x1a\xd5i\x80`\xdc\xb8\x1f\xceP=+\x0f\x14\x0e\x00\x18+UmQ\xcc\xb9\xcc5/\xcdb\x1d%(x\xa5\x06\t\xae>\xe1"\xd2\xe9pI~}\x0bp\xc1:U-\xdb&\x06\nM\xe1p\xb8.\xf8o\x02b\x953~\xd1\x1c\xc1l\xe0\xfe\x18"\xe4:\xbd\x98~\xf2\xab\\/\xf2S\xe3t\xe99m\x1a\xea\x00J\xbc\xf6\x95\xaa\xc7\xc4g\xd2\xf3V\x9b*\x7f\xfb\xfa\xadBe\x00\x01j\x9c\x1f\xb7ot\x84\x9e\x1f\x7f\xf0\xc1i\xf8\xd5\xf5\xdbzks\xf2\xf53r\xf1\xe9\xc3y7\xb1\xe5\xcf\xa5%\x9d?B\xa8\xab\xfac@\x88Z\xfb?\x9f\xa7\x08(\xbd\xe68nU\x17_\x00)\x82\x9d\x91\xe3Q\xd0c\x1f\xff\xc2\x1b\xe1\x90\xf0;v\xb4\xfc\x8a\xc0\xe7\xd7;\xa8Os\x1a\x12&\x17\xd4\x9b\xd7a\xa8\x0fT="\r^"w\xf8\xdd\xbc~\xebP=\x8f\xa9\xd0\xcf\x18S\xb5UD+\x97F\xce>\xc8\xb0\x8f+\x8a\xa7\xba}\xdb\xa9/e\xaa}\xf2\xb1\xaaLtT\x12o#\xab\r\x86z\x06\xbdg\xbeZJoa?n\x16\x8f\xdf\x04')
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify
10
+ from flask import Markup
11
+ from flask import Flask
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class ChildAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+
32
+ column_descriptions = dict(
33
+ domain=_("domain.description"),
34
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.')
35
+ # current_usage_GB="in GB"
36
+ )
37
+
38
+ # create_modal = True
39
+ can_export = False
40
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
41
+ form_args = {
42
+
43
+ 'domain': {
44
+ 'validators': [Regexp(r'^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
45
+ },
46
+
47
+ }
48
+ column_list = ["domain","show_domains_list"]
49
+ # column_editable_list=["domain"]
50
+ # column_filters=["domain","mode"]
51
+ # form_excluded_columns=['work_with']
52
+ column_searchable_list = ["domain"]
53
+ column_labels = {
54
+ "domain": _("domain.domain"),
55
+ # "mode": _("domain.mode"),
56
+
57
+ 'show_domains':_('Show Domains'),
58
+ 'show_domains_list':_('Show Domains')
59
+ }
60
+
61
+ form_columns=['domain','show_domains']
62
+
63
+ def _domain_admin_link(view, context, model, name):
64
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
65
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
66
+
67
+ def _domain_ip(view, context, model, name):
68
+ dip = hiddify.get_domain_ip(model.domain)
69
+ myip = hiddify.get_ip(4)
70
+ if myip == dip and model.mode == DomainType.direct:
71
+ badge_type = ''
72
+ elif dip and model.mode != DomainType.direct and myip != dip:
73
+ badge_type = 'warning'
74
+ else:
75
+ badge_type = 'danger'
76
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
77
+ def _show_domains(view, context, model, name):
78
+ # return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
79
+ res=""
80
+ for d in model.show_domains:
81
+ res+=f'<span class="badge">{d.domain}</span>'
82
+ return Markup(res)
83
+
84
+ column_formatters = {
85
+ # 'domain_ip': _domain_ip,
86
+ 'domain': _domain_admin_link,
87
+ 'show_domains_list': _show_domains
88
+ }
89
+
90
+ def search_placeholder(self):
91
+ return f"{_('search')} {_('domain.domain')}"
92
+
93
+ # def on_form_prefill(self, form, id):
94
+ # Get the Domain object being edited
95
+ # domain = self.session.query(Domain).get(id)
96
+
97
+ # Pre-select the related domains in the checkbox list
98
+ # form.show_domains = [d.id for d in Domain.query.all()]
99
+
100
+
101
+ def on_model_change(self, form, model, is_created):
102
+ model.domain = model.domain.lower()
103
+
104
+
105
+ dip = hiddify.get_domain_ip(model.domain)
106
+ if dip == None:
107
+ raise ValidationError(
108
+ _("Domain can not be resolved! there is a problem in your domain"))
109
+ if not hiddify.check_connection_for_domain(model.domain):
110
+ raise ValidationError(
111
+ _("Domain is not correctly mapped to this server!"))
112
+ print(model.show_domains)
113
+ if len(model.show_domains)==Domain.query.count():
114
+ model.show_domains=[]
115
+
116
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
117
+
118
+
119
+ def on_model_delete(self, model):
120
+ if len(ParentDomain.query.all()) <= 1:
121
+ raise ValidationError(f"at least one domain should exist")
122
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
4
123
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
124
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,55 @@
1
- # 2023-04-08T16:23:20.450861
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xca\n\x00\x00\x12\t\x04\x00\xcc<\x845\xe4MrT*vb\x1d\x9b\\\x12v\x00\x00\x00\x00\x00\x00\x00\x00\xa3\xe3jV\xc9\x1e\x9d\xf6<Sr\x8a8E\x1c\xad \x8eY\xa5\x80)\xac*\x8cH\x016]\xfd-\xffF\xa8\xcc\x87\x05\xbf\xe3\xb1\xa0\x06\t\xa1d\xf2\xce\xb1\x88\xa9j_\xcfR&m\xf0\xd5\xa6S0\xa2\xed^\x88\xd1\xb3\xa9m\x1a\x9dH\xef\xfb\xc1\xe4\xe0\nu\xda\x83,\x15\x81\x05\xac\x15\xfb\xc2\x02\x8c\xc8?\xb2IC1\x8d\xeb1b(|\xa2\xd0\xc1\x97A\xe85\xd5\xdc\x86\xa3!\xe2\x9dk\xa4As.<6\x90\xc2V\x1e\xd7\'v\xbf};e\x93\x8b&\xdd2\xd9\xb1}cTB\x1f\n}\t\xe0\xee2}\x81\xa8\xf5\xcd\xda\t\xfa\xa2,\x9f\x1c-\xbe\xb1\x7f\x11g\x02\xb2\x16\xb5\x99\xe2\xd0\xc8\x84m]\xf9e\x80n\xdc\xae?|\x89\xb1\xea+\x15\xc4\xd5\\\xc8\xa0\xf6\x0f\x1b\xe4 Ci\x84n\x8a\x8f\x1c\xa9\x91\xd9\x1a\xe3J\xd7\x05\x8fU(- \xc5B|\xb3\x9c2h\xad\xe7\x87\x97-\xcdK1\x12\x11v\x9a\xd5\xe4\x1e[]\x9b\xd6QSd\xcd\xf8\x93\xbe\x0b\xfcg=jH&4&\x8b7\x15vR\x86\xdcC\x83\xd6\t\xa3{t#\x8b\xf6G\x8a\xec\x1a9\xb2%4\xe8}\x16n~\x1c\x10\x06\xbc\x9dv^i\xd9\xa7Q=\xd1\x85\xd7[\xa4\xc5\xed\xb8\x82\xe3\xe3f\x8c\x95\x84f\xed\xa5`\x8eC\xc5\x00\x93\xb5\xf5\x84O\xacU\x05\xbe\x7f\xdd\n-_\xae\xf2W\x01\xc2skJ\xf9\x82\xdaI\x1e-\xddX\x0f\xadr\xa87?\xdd\xbb,\x9e+c\x93\x99\xb0t\xf9\x04\xb1\x06\xc6\xb6\xbe\x90\xb4\xab\xa2\xda\xb4\x9b\xc8\x11\xb5\xafn\xd1@/\x1a\x97Y\x81\x07Y\x1d\x03OuX\xf3Ju\x115z\x17M\xdeD\xd4\x14\xe4\xae\x10V\xa9h\x975E\x82\x13Lr`\xeeR\xf9Z\x95\xde\xc7\x8d\x80S\xfc~\x96\xab6=1K\x05\x0c\xca\x00Da\xd3g1\xc3\x8b\xbe\xcc4O\t\x9d\x9f\x89\x0f\ndd\xcdP\x95\xd7\xe2\x06\xe48`\x80\xb1\xd6\x1a\xb9(1\x9e\x84?\xe1\x17&\no\xef\xce\x15SO\xbc\xd9=\xda\xe0\xf01\xfa\x1e\xee\xad\x98\x0eh<\xb3.xV.\x12(\x90\x1b\x84\r \xb8\xa2r\xee!\xeb\xa7Q{"\xe4\xf1+6\xe5\xe4\xed\xe8N&\x8d\xb2\x99\x9aT\x1dd{\xee\xdc\x00S\xf6\xc5\xb1\x86\xd8\x9d\xb6\x08\x93\x07\x8b\x7f\xc3\xde\xdb\x81\x99`\xdaS\xfb\xca\xb7\x11\xc7!\x12FI4f\x18\x0cXB2\xd5\x11=U\xfd\x05\xad\x19\xe3\xa9\x8dD\x8aw\x0c2\xe8\x14\xb0\xbeZ\x91\x98\x9da{\xab\x8d\xd1\x9eT\x83\xd3\xb9\x1c\x8f\x8c0\r\xcf\xe0\xc8\xda%\x14Q\x8e\xd7Lg\x13\xf3Ux\x85\xfd\xeeE\xb5(5[!Wu\xbd\x17@\xcf^\x16\x02[~\xf9\xcc\xf2\xf6h\\\t\xb2\x12t\x95\xb2\xfc\xb3h\x96\xdb\xb3\xe5L\x04\x86lB\x8d\x02 \xcc\xe7>g\xe1)\x80GN\xd0\xc6tq<\xae\xe5gL\xd5S\xd1\xef|Q\xd9~\xb3\xd2\x95:\xbb\x92\xa5\xa0\x17\xf8\x0e\x02u\x0b\x14\xf3\xe4\t\xe9\x8a\x9b\xf0\x10U\x9c\x87\xd9\xe3\xc9\xb0\x10`\xae\xea\x87\xa5\xc9\x11\x01\x89\x07\x80\xd8J\x81\xeel5\xe4{\xe4\xdd\xceu nZ\xf5\xe4\xc1o\x1d)S\xcb\xa0\xea\xda\x84\xa7\xeb\xa9\xb4\xc1\xbb\x88\xa9<\xc5;\xea\x0e\xbb\xb4-\x88zB\xe7G\xb3\x03|5\xfb\xd4\xe5\xb6pSR\xc2\xc5\xf6\xca\x80S\xdd\x03m\x9c\xdaz\xdf\xd7\x9d\x83\xef-\x13\x91\x0c\x150\xca#\xf6\x8a^\xcfL\xa8\xd1\xc6R\x1a\xdb\xe0\x86\xca\x0b\x8f\xdf\x997\xdc\x80d|~\xb4\x8e#\xd2+Kt\x13\x9c\x1d\x8dy`F\xf7\x02\xbd\xd5\xbd\xe0\xa3l\x8d\xe0\xfc\tL\xfb\xc3\xb5\xdfD9\xe3\xd1\xa0mL\x1a\x94i\x93\xddq\xd6\x17Wj\x11\xf4\x04d\x97\x0f2S\xb3\xf3\x1a@\xf6!\x1e\xd7\xeb\x1e\xd4\xe36\x16j\xca\xfe\x9d5\xbb=\x9c\xa5t\xb1S\xee#c\xcf\xd82\xd7w\n4\x94\x15\xef\x8d[\x92\xd5H}\x840\x9b\xc4SR\xb1%\x17\x16\xbc\xdaa\x8c\x98\xa3*\x8f\xd0\xcf\x13\x02\xa0\x12\x8e\xa4@\xfcoS>\x11\x0e\x15\xcfC\xe0\xd9s\xb9I\xc1\x9f\x1aSf\x8d]\xf1\xa2\x88g\xc4\x01\x97W\x08\xc1\xf8b}\x19Q\xf1\xa0\xdfn\xf9\xf6u9\xa8\xc6T\xfb\xa0\xb8\xe8\xf1\xd2E\x830\xf9\xc0\x96\xbc\xfc\x18B\xf0\x8b*kLO\x96\x82\x03~\xa0\x98\xc3\xec\xfc\x84\x0e}\x9a\xe1\xd2\x1a\xa72\xea>\xf7\xcd\x08\x08\xe8!\x02\x85E\xf4\xfd\xd6\xa4\xb3Y\xe9\xb8Kz~7Mt\xcc1\x84\xda\x85\x19\x9bo\x19p}\xb0\xb0\x11Q:\xf2G5\x95\xa0\xc17\xf0\x8a\x03\xf3\x89\xc8\n\x1a\xb4\xa9;\xf9? \x03Y\xc73\x03@\xe1\xbbE]\xe4\xef\x0b\xd0m\xe7\x8d]\x04\xf8\x91\x9e\x0c\xf6\xa7\x12\x10y\xe7S\xe0_\xffb\x9e\xfas\x16\xc0A\xbd\xabJ\x87\xa5\xc2\xc6\x87\xa0cAI\xd8OV\xeb^\xdd\xd0\xe1\x18\x129\x19\xf0\xef\xa0\xe1\xde{Q3#\xcd\x8d\xd3R\xfe*/\xa0\xfe4\xcdR\xd6w\x90\xb1\x9a\x88kX\x83\xb5\xab\x9e\xa5x\xb3\xf23O\\L3\xd4?\x87&M\xe0\x04\x0cX\xfbQm\r\xa4\x1b\xad\x91\x94\x9d\xfe\x94\x980\xfac\xaes?|?\xc5\xb8L\xee\xcc\xbc@bz@P^\xa1l\xcf;\x97\xdb\xc0\xf7N\xa0\xa3W\x1f\x93\xd1A\\m<N\xc6I\x0f\xac:\x15\x03\xc3\xb5\x07Hm3\x7f\xa0\xb5\x07\xbb\x0b\x02\x0bm?F\x12\x84\xe7m\x8a\x93v\x1c"\xee0dr>\xaak\xe0\xf4\x8a\xdf\xf2\x87n\x82J\xa0jU\xde\xc0\xcd\x97\xe0\xdc\x02\x8e\xc5\x8c\xf744\xfa\xe8\xcb\xe4\t\x17\x02\xe9\x8c!\x9c\x8e-3~\xc0\x19\xd7@\xcb\xce*\xba\xa4c\xb8\x1c\xbd_\x9c\xf8\x07*\x8eg:\x1a\xd8\x9a\xc1:\x0cT\xe8\x9d\xd9\x86H\xb6v\x82\x1b\x95\xa6\xd95\xd43\xeb\xc4\n\xcdT-\xdd\xf2\xd6\xd0\'\xbf\xf8\xc6\x97%r]#\x02\xceS\xe5\x8d\x06\xd5\xa9\x8aQ\\\x08\xd2\x96\x00\x0f\xfe\x18\xe6\xb6\xcc&\x97POn\xef\x1f\xef\xb5\x81\xfe\xc1\x91\xd93\x85\n\xb7\xa8\xcb\x00\x02~)\xc8\xd3\xbcYv\xe8\xa9\n\xad\x0e\x9b\xb2\x16\xc8o\xd7\xd2\x11\xed*`\xe9C\x81\xe9X\n\xa3\x8d\n=\xee.\xf5Y3\x8d*\x0c\xe7\x8c\xf2*W\xad\x80\x82\x00}^\xed!]+H\xee\xf4\xdd\xb8\xb1h\x9b\xa4\x04\xd1\x86\x9d;I\xe4\x11\xe7~\x9d\x85\xb0\xa8\x82\x9d!\r\x9e\xba\x8b\t%\xf2n\xab~#\xcfv\xd4\xb1~+\xfd\x95[\xe2=\xc9f\x00\xb3\x92\xec\xa8\xb8\xd2\xb4\x9aDd\xeaG>\x87\x17\xb8c\x8f\x9ag;\t\xfb\xae\xa5\xfa\x13\xfb\xad\xedI\xad~\xfe\xd1\xd5(\xb0\xe6\x81\xb7\xbf\x12s\xab\xfc\x8d\xf3o$\x03\xd8\x00W2\xcd\xe7\x934\xa9\xb4\xb2\x8b\x04\x8d\x05C\xc9\xae\x04t\xa3\x93\xe2h\x81\xd4\x87 \xc9\\\xa1\xb0\x8b\xb3%\x93e\xe3\xa0\xefK\x19\x19h4y\xc9\t\xe0#\xe8\xd3\x95\x8214v4\xa2\xea\xff\xedI\xb7\x81$\xefNYG\xc2\xe2a\xb6V\xe4\rj\x07\\\x0f(\xdc\xba\xa4\x03\x05\x14A\x112\xf9=\x96\\\x97\xfa\xa8\xb6\xf2\x0e\x1a&\x13\xd98G,f\xec\xa7&>\xee\xe3xTjt{\xed\x85U\xe5v\xfbH\xc6\xf9a3\xee\xf4\xdc\x85A\x87~\xb6%\xdb\n"\x00\xaa2c(\xd8\x1f\x8cT\xfd\x1c\x05\xf7\xcf\xd2*}\xabrB\xfe\xd1F\x17]\xd1[R\xb7\x12\xab\xc5\xe3\x9f69L\xe3\tF$9`\xfc\x8a*x\xcb\x17_\x89\xc1\x9a~O\xf5\x86+\x02\xc6\x15\xecKG\xe9@\xb66\x1b@G\xc2|\x15\xfb\xbd\r\x9f\x11B\xf0\xf9e\x8a[\xf5\xe7\x8c\tt\xb1\xba\xc0\x90\x13\xf8l\xa4JVf\xa9MB\x98\x1d\x95\x081\xb9W\xf4@\x90[\x8d\xb1\xf1W\xc7-\x1eC]}\x1e\x06\\\x83\xa71\x9c_\xc3\x00\xa6\x1e)Bc\'\xb1\xbb\xe8$\x8f\x1a;s\x00E\x04"q\xd8\xe80\x00\xfa\x13\x03_(\xc9\xa5\xbaR\xf6Xp\xe7\x7f3\x17\x80gU.R+?\xea\x17\x85|\n\x18,\xc7\x92\xb4\x03!\x05\x01\xf8\x1e0\xa8z\x82\xa8\xe3\x08\x80d{c\x18\xd9\xe3U\xb6q\xe0ql\xf5\xae\xd1\xd5y\xa5\x0bB]\xb7}9\xe5\xe3Wybd\xc3>\xe3\xec\xd5\xe1CD\xa1\xe5\xcafn\x0bS\x17\x84\xae\x9dI\xf8\xfeW\xe7|\xbc\x00#\xfd+\x19lB\xf7\xda\xe9\xc9y\x07d>\xa3\xadp\x16\xa4G\x80\x18yH\x84\nd\x19K\x13\xc8T\xe3AxVt\xf31@\xe5\xf2S:t]\x0c\x12\xb0\x17\nW\xa3"\xca\xd6h\x95\xfaj\x1d\xdf\x88\xb5%\xa2\xa2\x1a\xc8\xf94_\xde5\x18mW\x99\xf1\x89\xfe0\x9a\x84\xe2\x8e\x86(\xcd[\x91\xe9s \xce\x95\xb0?\xf0F\x9d\xf4\x06\xcf\xc1Z\\\x16\x19"8\x00\x95`\xfaC\xc5`\xcf\xa3$oem\xf7\x13\x9b\x17\x02\xf2\xee\xb2\xd0\x9a\xdfQ\x0f#\xdc\xa4\x13\xa6\x92\x8bd^\xcb\xea\xb8\x15e|\x1c\xd9@g\x97 |\x06T\x04H3F\xaf\x0eI\xf7\xd0w9\xe4\xf0(\xf7\x97\xfe\xd7v\xaa\xa5\x8bd\x1fH\xfc\xd3\xe5.\x90\xee*$A\xbenh\x8b \xdf \x98\x0e\x04\xd4I\xfa\x17\x1d\x9f\xe6o\x9d\x87\xc1\x8c\xe6:\xe6\xd4\xc6\xdc\xf1\xbe8\xf2 \xb2\xf5\x02U5\xc9\xfd\x93\xb7l\xb7\xdb\xf4N\xf0>\x8b\x06\x08{*"Q,\x94\xd4\xff\xc2d\xb8U*l\xa0T\x00\xa3\x93\xcd^\xa3d\xb5gTm\xe2(x\x15\x8cX\xcd\x8e%\x80\x02\xef\xec\xc6s\x11\xc9\x1c\xbc\x03\x18\t\xe5\x99+\xde\x08\x05\xc1\x02R\x96\xb2\xff\xff\\\x0eZ\xeb\xd6\xab\xbe\xa8\xf6$\xa8;\xf7?\xa6\x1c$_\x1e\xbc\xe2\x82\x93\xa6\t\x1b\xf2\x06\x13R\x97\xe9\xb8\x82\xf3=\x8e\xed)\x89;\xfc}\x95\x92\xdf&8p\xeb^\xc2\xaf\n\xa0\x9a<\xe6\x0eg\xf3\x93\xe4Y?\xe1\xa0z\xb1J \xc9\x99\xa7=\xedZ\x0eHR\x10\x82\xa3\x0c\x83\x1ed$\xb3u\xc3\xa23\xb5\xe5\x82\x8c\x9a\x97\xb3\xedF\xae\xe9?\x08\x15_\x100\x9fm$\xe7"W\xab~\xc5\xbf\xf2\xe3Z\xab\xc4<\xea\x00\x80\xdc:9\x9c\xb7\xb6\x1b\x0c>]Y@a0l\xa4.;\xd1\xde"\x90\xc2\x88I\x1bu\x96\xa3+qd\xcd\xe8\r\x03X_\x14\xd4\x8a\xdf/\x13\xf4\xe7=\xbb\xc7\xe5\xba\xbc\xd1\xc486\x94T2\xf6{\x8d\xc3\xde\xb6\xa2"\x00\x08_@\x1e\xaa\xc5\xa7\r\x8b\xce\xaf\xa3Cj\x92\x04\xef\xac\xc16eL>Hv\x06`\xc0\xd9\x19\x82\xbaD5\xe6\xfbY8\xadB\xbe\x1aq;\x86|\x1f\rk\xcd\xaa\x8a\xd6"\xcd\x02|\xe5\xf9\xa3\xb4\x84\x0b\xf1\xa9\xac\x85\xd4\xf0\xb6\xa9[\xc1\x8b\xc7C\x7f\x9c4\xe4\xa8NA\xac\xa3m\x8ba?\x81qg\xca\xd0\x87g\xf9\xae\x91\xa2\xb8\\\xf5\x11\x9e\xe6N\xfco\xf6\x9cG\xab\xf9`W\x82p\xdc\x8c\xc12)\x12\x81\x91\t\xa7\xed\xfd\x84K\xee\xaf\xb4=\x9d\x87\x16hm5 \xeeC\x03\xba]0<di#\xf9\xa0\xdbj[^\xaa\xe6 y5\xba\xc7\xd6\xebQb=\x8a\xa13\xaf\xf5&\x19,\x1c\x97\xf7\xf1~')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from hiddifypanel.models import ConfigEnum
4
+ from wtforms.validators import Regexp,ValidationError
5
+ import re
6
+ import uuid
7
+ from .adminlte import AdminLTEModelView
8
+ class ConfigAdmin(AdminLTEModelView):
9
+ can_export = True
10
+ column_default_sort=('category',False)
11
+ column_display_pk = True
12
+ can_delete = False
13
+ can_create = False
14
+ column_editable_list=["value"]
15
+ column_searchable_list=["key","value"]
16
+ form_widget_args = {
17
+ 'description': {
18
+ 'readonly': True
19
+ },
20
+ }
21
+ def on_model_change(self, form, model, is_created):
22
+ if model.key==ConfigEnum.db_version:
23
+ raise ValidationError('DB version can not be changed')
24
+ # if model.key==ConfigEnum.decoy_domain:
25
+ # if not re.match("http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?", model.value):
26
+ # raise ValidationError('Invalid address: e.g., https://www.wikipedia.org/')
27
+ if model.key in [ConfigEnum.admin_secret,ConfigEnum.ssfaketls_secret]:
28
+ if not re.match("^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$", model.value):
29
+ raise ValidationError('Invalid UUID e.g.,'+ str(uuid.uuid4()))
30
+
31
+ if model.key in [ConfigEnum.telegram_secret]:
32
+ if not re.match("^[0-9a-fA-F]{32}$", model.value):
33
+ raise ValidationError('Invalid UUID e.g.,'+ uuid.uuid4().hex)
34
+
35
+ if model.key==ConfigEnum.proxy_path:
36
+ if not re.match("^[a-zA-Z0-9]*$", model.value):
37
+ raise ValidationError('Invalid path. should be asci string')
38
+
39
+ if model.key in [ConfigEnum.tls_ports,ConfigEnum.kcp_ports,ConfigEnum.http_ports]:
40
+ if not re.match("^(\d,?)*$", model.value):
41
+ raise ValidationError('Invalid path. should be comma seperated integer e.g., 80,81')
42
+
43
+ if model.key==ConfigEnum.http_ports:
44
+ if "80" not in model.value.split(","):
45
+ raise ValidationError('Port 80 should always be presented')
46
+ if model.key==ConfigEnum.tls_ports:
47
+ if "443" not in model.value.split(","):
48
+ raise ValidationError('Port 443 should always be presented')
49
+
50
+ if "domain" in model.key:
51
+ if not re.match("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$", model.value):
52
+ raise ValidationError('Invalid domain: e.g., www.google.com')
53
+ if len(Domain.query.filter(Domain.domain==model.value).all())>0:
54
+ raise ValidationError(f"Domain model.value is exist in domains section. Use a fake domain")#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
55
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,71 @@
1
- # 2023-04-08T16:23:20.537228
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x98\x11\x00\x00\x12\t\x04\x00&\xb0\xadq\xe6[D\xafc\xd7H\xbd\xf5r\xad\x05\x00\x00\x00\x00\x00\x00\x00\x00\x9a=\x90\x94\xf9D\xf6(Zv\xaf%\x0e3$\xdbxS\xf5\xb8\x85x\x15\xf5=zG\\\x1f\xe5Z\xde\x96\xbf\xe3\xcfT\x05\xdf\xce\xad\t\xac\x07\xff\xca\x19\xdffV)V\xe5\xb3\x81}\xde"~Z\x13\t0O@\x15\xb2\x90r\x9d\x9f.0\xa7\x8c\xe4\xf2\xf9\x07I\xb9\xdfx\x08\xe5W\xd5\xf8\x8c\x99\x007M_ \x7f6\xd9\x90"/k\x94\xf2\xe3H\x90\x99\n\xb3X5\x9a\x98\x1a\xa0r|\xfa\x94\xd9C\xe6\xd7Y\rV\xe5&\xdd\x1a\x91\xdeG\xb0\xc7G\x07)\xc87\x16\t\xf4\xdf\xda\x14^\xf3\xf1\x0e^\xc9}\xbd\xa4n\x18\xdcq\xc6\xdc\xa3\x05\x9c\x98 \x91\xb2\xb7i\x05\xbd\xf4S\xea\xff\x1d\xaf\x91\xdb\x01\x15g\xb5[\xd8z=\x99\xda\xc4&\x05\xd7\xad\xae\xb1\xe8\xb5X_\xf1\xbd\xd6\x94\x13z\xacC\x9e\x14r\x88B\x84\xde\xf7/I&e\xe9\x9a\xf2#M\x1a\xb2\xf9`\x98\x90.\xe5V\xdc|\xb6h\xca,Q\x05sL\xdd\xf5\xc5\x82h\t\xb2\x83L\x87\'[\xb1\x7f\xb4t4\xfe\xcbgE\xda\x01\xb1\x8f/!/\xdf\xb6j\x8d\x84\xe1\xf5.)e^\x8eI\xd2\xc9e\x82\x9c\x99\xdbt\xc2\xde*(.\x98\xd2\xa8\xdd\xcd\xd2\xbf\xd5\xdf\xc5\xc2.\t\xa1\xde\x00\xf33\x8a\x087\xfa\xd8g,\xd0\x927"\x1a\xa4\xbc\x9aR\xc7S\xa0 \x9f\x9f\x12>\\7\xf7\xbey\xf2\xab\x9b[l\x8e\x94\x10\xa2j\xab\xb0\xac[\x9f}\xd0\x88W7\xb4\x95\xa1o\x10P\x8a\xa6\xcb\x90iL\xb6\x80])U\xf2\x13\xdep\xe1 \x95\xc0\xdd\xf5O\xaeM^vDZ\xc4=\xc5M\x8c\xff}\xc1\xf9\xfdV\xdd\x86\x02\x11\x84=\xdb\r{\xd1\rt\xb1\x11\x1allR\x0c\x80&\xa5\xed\x0b\xa9hD\x8e\ta\'\x82\x9b\xea\x1c-I\x127\x16\xbd-\xaeX\x9bC\xa2g",\x93\x11\xea\xdee\xc6\x08\x04wm\t\x98\x06.\x92!3\x18\xf9w\xef\x15y\x96(!a\xc4\xf4\n\x84\xd0\x8a\x15I\xb4\xd8\xe2AA\xe7\xac-\x9cc$\xe1f\x86\xb2\xca\xa8\x9d\xb1\xa0%\x15\x94\xa3\xe6u\x9f\x91\xce\xf2#\x0c\x1e\xd8bv\xd9\x89\xd1\xa7(\rI\x80\xe8\x1c\xcdn\xcf\'\xc8\xe60e\x0c\xadw\x16p\xabkq\x8f\x92\xb4\xeb\x93\x85\x1c\xe3\x19\xe4\xc9\xcb\x99\xdc\xf2\xae\xaf\x99\x1eU\xa9oP\xe1\xb9i+R\x96\x98.h\xf6f\xb7\x8e\x9b\x8d\x0c\x93\xf9\xea\xeb`\xf2\x14\x01\xa1\xef\xa2[*0\xaax\x0b\xe3\x8dG\x91\x90\xb1\x19\xf8\x04t\xc5E\xfd\x80\xec\x0b\xd3\xb5|\x166\xb3;\r\xa6\x1al\xf1\x9f\xab\xfe\xb9T\xc6\x1c\xf2\x7f;\xf0\r~84\xd8\x97d\x18\xf5\xeb|\x1a\xcbL\xfdw\xe5\xea\x91 I\x1f\x90S]\x98a\xb0:%\xfa\x9c\x98\xb3\x1c\\;\x97\x7f\x19\x16\xe6\xbf]w`\xb9\x08\x88]VUi;\xd2\x17\x02\xdd\x16\xe9\xd5n!;\xb7\xa0\x0c\xb0\xc5FR\xfd5PI\xee\x9b\xa4\x19Ci0\xdfEh1E2e\x85@\x87\xce\xa4\xf1\xe5$YR\x04D\x0f\xa5\xd4\xb4\r\xb3\x85\xc2X\x15}\x84\x89\x83-n\x17$_V\xbf\x8b\xe9\xe7\xb5KQr\xeb\xf6T\n\x9e\x05vl\xc1\xffI\xff~\xe9"\x00\xf4\xbe$6\x13)\x06G\x0e!\xe7\xbe\x8b{\xe9\x98\x1b2\xe3\x1d\x97?P\xa4\xe0\xc0n\xa3\xf5+\xc3\xadQ\xf0\xe9\xf4\x99\xd5\x85\xa4oy\xbc\x9d\xe9\xfbz\x93xy\x87\x13\x8dr\xd4u\xd5\x88\xa3\x04Vm7PJ\xe9\xcf\x1c\x12zmJ>\x1c"\xcc\r\xb6\x08\x0c\x01\xe9D\x17rbyP\x1a:\xc9\xc5\x195\x97\xc8+\x08`0\xe2\x8a\x92}\xaf\x0cd@} r\xfa\xd0V\xf3\x1f\x14 \xbf\xe5\xb9^7\x94\x05,\xd0\x1c\x96\xaf\x1aU_\xb3\xc5\xf8\x04\xc5\x8dJ\xff\xc9\xec.\xa5!\x92\xc3\xa9\x8b\xbbFjt\xf6\x18\x0f\xbf\xcb\xd6e\xc9\xc8\xc7\t\xdfO\xb8K\xa4\xe9\xfc\xe4\xcap1D\xa5\x87s\xb7\xafr\xbcf\xbf k\xc6\x88\x1a\xe3\xd8W\xe8\x94\x9d\x81\xaf\xcfM$:\x07\xdd1\xda\xb0\xff\xf7UN\x1b\xad\xaf\x15DKW\xa9|\'\x12\xf8\x83\x0e\x86\xb7\xad3\xf3+\xc6\xa7\xb3\xfd\xa3\xd9o\xfe\xa9\x9c\xcd#\xd7\xad)\xb3\xf4\x97\x9d\xe8S\x02\x86\x06\xd6\x1b-z`\t\x82\x0f2g]\xc5\xa8\t\x00\xb3\xdf(\x84\xb8\xc0\x91?\x00\xea\x038\x1a\x8f\xc4\x155\x82\x84\xbb\xc2\xd5(\xb0\xe4Z:\xeb\xcbLo\xc6*\xe2{\x9a\xed\x83CY>\xbf7\xe9\xef\xdf0\x1ciC\xfa\xd9\x820\x103\xe1\xf4:dD;AB\xe5fR\x1c\xda\x0e\xcc\xbc\xd4\xc1\xd4\r\xe4\xc3\x83\x08\xca\x81\x18<\x12}F\xf2\xab\xc3\x19\x8dL\xbe\x15\x8b5\xb2E\x84_\x95\x7fF:\xae\xcc\xdcB\xc3\xb1a\xafa\xfdRpa\xaa\xf1\x8b\x10\x1f\xb6\xf8T\xa1\xd5\xf8\x0f\xf6\xd3\x80`f\xb4+\xc8\xa7H]\x04$K\x03\xf6\xe6\x9b\xe8\xda\x9f\x9b\xdc\xbb\x9cN\xbb\xb9h\xe6\x91\xd4?\xb3\xc2\xcb+\x9c^\x90\x03b\xe7.\xa1$\xab\xde+]\x02\xec(\xb8\xe8Y\x06\x82u5\xd2D\xe5\t\x0e\x19x{\xdf\xceIoW\x88$\x93\xbf\xc9\n\x8d\xa2#B\x08N\xd4M\x84`\x15\xbfk\x15\xf9\xe4\x8b\xbf\x7f3\xc0\xc4\x8c\x98\xe82gC\xf8s\xe6KE\xd1<\xeaW\xdf\x94D\xd7\x83\xf6\xb2\xc7\x14\xc81@`SC-\x94G\xd2}\xc4J\x08b2\xfa3\xd5\x88\x94\xd4U\xb3\x8d.\xaeR\x99\xd4\xa3\xab\xc8\xf6LC\x86^3\'\xa2\xed\xd5\xa1\xbb&S$\xd3\r\x8e\x08\x95\x90Jw_\xba\xd9\xe6\xda\x82\x9e\xd9\xa6\xb4?\xdb/w*m2\x913(*j->|\xae\x04i\x9d\xf2\x925\x03\x1d\x8e\xc0\xac\xf1\xcc\xfd\x16\x7f<\xa0x\xb0\xd51r\x1bsFAO\x81\xb04\xa1\xd7\xab\xf4\x0f\xf47\x1cK_t\xd3\x04\x9c\xd8\xf7\x87\xa8!\xbe\xb9R"I\x95?\xe1~\t\xee\x8en\x87\x08\xfd79yn\xd9\xd5\xb3\xca\xd9PG\xc3z\xd7"\x9eI\x9d6\xd4\x83\xd7\xb9D\xce\x1bG\xa2\xbe\xd3m\x14\xba\xb8{\xf8\xea)\xca\x9c\xf1\xbf\x9d\x0e\xc7@\x18\x9d\xe1\xf8&\xf2\xaf}\xe0\xa9H\x1e\xc8}M\xa3\x0e\x99\xa4\xe3\x16\xe7\x87\xec\xa6\xb1a\x1a\xa8\x8e\x9e>\xef2\xac\xbdC2\x08,\x19\xfcXq\x82\x1c\x87G\xe7\x17\t^\xa7\tr_\xba\xc0\xba\xc3\xce\xa7^.\x91\xe7$\xf6\x8a~\xdb\tX9\xbf\x02\xc9\xff\xff\xb8Rd\xf0\x1b\x10\xf0\xbah{\xa9\x97\xa9z\xaf\xaf\x18\x86\xa1J\xe4 \x93\xb9\xa9m\xa1e\x1b\xed\x01.\x12&Y\xe3\x16\xac\xaf\xbcr\xc4\x1dc\nH\r\xfa-Q\xf3\x91\x1e\xd9`x\x19\x9c\xb8\xb6\xd9\xf1\xc3e\x9f\x92\x89\xedd\x85\x8d\x1f\x92\xb7\x8c\xce\x06\xdb\x82n\xa8~\xa4p\x1bm\x8b7\x1cR\\)\xab\x8fO\x1f\x0e\xcbx\xad\x00\xe8\x07nU\x15\xf0w\x07\xa7vO?\xcef8d\xf2\x97/\xc9\xd9\x0e\xed(e\x9e\xfb\x98\x8aY<\xd7\r\xf85FJ\xfa\x02\x06\xd7?\xd6\xb1O\x0e\xae2#3^\x9e)\x01\x17\x1dd\x15{\x0c\xa4\xe1\\\x9f\x91\xa9\xd3\xa1N+]~\x1f\x0f\xe6,\x8f\x178\xafr\x15\x84a\xac7\xad>\xd1j\xf2#=\xedl\x0b\n\xd0\xb2\xd8\x8e\x15\xe439\x0b?\xd4\x93uifk\x9f\xcc9^\x1d\x10[!\xec\x92=\xdf\t\x1cL\x08\x15m\x84\x8d\x7f\xb2\xa2\xd1\xf0\x10\xcfF\x88\xa8\x0e\x82$\xea\x0e\xd7\xfd\x8e\x9c\xb0z\xfcs\x95\x0b\x9a\xca\xa3;\x82\xa0(\t\xacV\x00PY$\xc0\xc9\xf0/\xa4\xcc\xcb3\x9044\x19hk(\xc4\xac$\x94Zc\xd2\xd9S\xb03\xc9\rp\x80\xf1%\xb2\xd1\x92\xe1\xcb\xda\xe3D\x00\x80\xcbd\x03\xd2\xb0I\x9cb\x9f\xb2\x05~\x1dA\'}\xf3\xccf\xaem\xd4l\x83\x909\xc4D)1\xd0\x16m\x08\x0c>\xcd(8\x11~\xb8^p!\xa3\x17_\xb1\x1b\x8e\xf4\x89J\nOq\x16\x1f\xf2#\x00X\x0eK\xcd\x01\xed\xb53\xcb\xf1E\xb5\x9c\xda\x11a\xb0X\xb2\xb7\x94\x98\xd5f\x00\x9as1\xab\xa5\xeac\x1eAqj\xeawk8\x82\xf9\xf1\xf1\xf5)\x87\xc7 zx2o\r\xbb*\xcdX\xf8oC\x15\x19\x10\xe6\xd7\xa1\xd7\xad\xc4\x96\xf7N\xce\x92\x89\xe7\x8aW^z\xc5wy\x81#\xac\xf2r\xe7 \x962z\xf8\xecst\x82A\nZ\xfd\x19+\xb8\xba\x17\x80k\x16\xd3\xa3\xcbQ\x84f\xb5\x81\xc81\xcf\xd5H\xcb=x\xdc\xd1\xb1\x82\x018z\xf6\xd6\x8c]\xec\xc4\xf0\xde\xb7"\xb6\xca-\xb9\xd8\xfc\x08TI\x98O\xc2\x1e\xeb#/\xbd\xd0\n\x8e\xdf\xcd\xbdO\x13\x88\x91\xcb\xbd\xba\xa3z\x84UC\x18\x03\xdfVy\xc0\xbe:SH\x84~\x8f\x9c$&\xad\x7f"\xe82\xf7"\x14\x0e\xfb\xad\x19\xc6!\xfeF\x90\xf3\xe9`\x90Oc8\xe0?\x18\x13o\xbdc6\xf4\x8a\x903Y\xe7)\xa1\xaft?\tB\xd6<\xf4F\x91\xb0)\x89\x8b;\xc2\xec\xd6Z\x11\xd0\xeei\x8b3\x9e\x97\xa1\xd2\x01h}\x99\xb8{\x05\x9b7\x1b\x00\x81\xc8-\xedW\xc2\x12\x06\xd7\x8a\x1b\x8b\xc2f\xbb\xd06\x97\x88\xef:Yz\xbb\x08\x1eA\xa8#`\x9b\xef\xbf?\xa3\xe9\xe9\xf6\x9aZc\xd1\x97r\xd7W\xeeqv\xd5\xb48RBF\xf8~Q\xdd\x0fv\xdd\t\xafS8\xe3\xb9\xd2W]\xf4L\xd9\x8d\x1e\x17\xdd2\x9a\xb0\xdb\x8fv\x87\xf9\x89IN\xf7\x16\xb8\x96\x1dr\xd6\x1anI\xf8wF\xe8\x0e\xe5\x08\xf4\x0c8\x93\x05cs5\xe1,\x13\xbfl\xa2>\x87@_\xb7r\xf9\x9a\x8b\xdc\x9d\xaa\x90,\\Bi\xeb\x16\xda\xe5\x07s\xd0\x8e\xa0~-\xc0u\xd1\xb2\x00\xd4\x8c\xda\t\x1b\x12\x8f\xfd-]\xe9x\x80\xf3\x95Q\x04\x1e\xbb\xc8}\xda\xb2lU\x91<\xd2\x18\xa8a\x05\x9b+\xbdYr@\xe4\xf7\xdfT\x82\x01\xfb\x92\x9b\x19\xabD\xb48\xf7\x9b\x90\xba\xb5r\xc11\xed\x16\xb1\xef\x9b\x83\x94\xd7\xc2\xd3d\xe1\x96\xda\xcd{0]v\xf0\xf1A\xa9\x17K\xe1\xf1\xb6m\x03!\x0b\x19C\\,\xef\xb8f~\x8d6F\x1b\xe1\xec\x03G\xdaz\x99\x0b\xcc\xcdw\xba] \x8e\x10Zx\x18WJ\xbe\x9dCYY\x81\x0cUp\x8c\x14%\xa8\xf5a\t\x93TT;\x0f\xf8N\xe4\xed\xac%sv\xae"E\xc7\xdbM?\x84\xcf|yE+\x19\xafx~6\xfc\x9bwtPn\xdf\x92U\r\n\x86\xaf\xd6\xb5#W\xd1\x98\x7f{\x9f\x86\xcc\x80\xd0\xe8\x88\xe3S\xe3R\xf8\t\xe1\xcb\xe2n\xc8\x85G\xcc\xf7\x1d\xc5W\x04\x80!xUD\r~M\x1a\xa1\x1aI\xaa\xa5aR\x9b\'\xbe\xb5B\x1e +s>Y\x7fs\x86#\xa0J\x158\xc2\x8dJ\xc1Qz\x9a\x82\x03\xd6Q\xee\xb1\xaf\x12M\xaa\x91\xf0\xca\x17D\xb8\xffOT.\x89\xab\x0e\xa7\x16\x99\xb0\x1b\xd2\x87\xa7\xb1\x89\xd6d\xaf\xa5@z\xce\xdf9\xf26\xa9\xda\xfb\xd4\x8f\xd2\xe9\xdf\xbahD\xb1\\\x04#mH]*\x86\xe1j\xd9\xdd\xdd\x92?\x89a\x82\x91\x97qD\xb9\x10\xae\x19\xe7\xd3\xb9\xe5\xefj@\xb1(e\xf7\xb3\xd0\xbd0\x12\x1b\x95\xe5\x1c\xf1\x8eJ\xa9\'\x92\xa3;!.\xd2\xc6)u\xaa@Bss\xb4\x9d4S\x93*\xe8\x9e\x15\x98<^\xe4\x1e\t8\x1f\xb4(so[\xcco\xc7\xe6K\xcc\x03\xee\xe5\x07+\xea\xdb0\x19w\x18\x1d\x87\xad\x9eQ\xaf\xa3>c\x03\xb9r$}\xe1\x1a\xca?\x91\xd5L\xc8\xc1\xbe\x0c\xce\x9eU\xbb\x83\x16T\x9f\xdc\xe6?\xe3\xc8\x13M\xd0\xa7B\xfe5\x98\xc3\xe2\xe9\xc6\x80\x88\x9e\\\xbf\xa3&qdm\xe6]\x88?K\xe7\x07\x98\xc2\xf0\xf2\x89\xcc\x9b\xaf\x90T\xbb8\x14\x96\xca\x92_\xc6X\xaf\xaf\xd5-B\xd4\x1a\x9aHq\xf5`\xb6\xf5\x00G=|\x00#\xa7Ae\xd1\xcf\xd8*\x83\x1e5E\xa7\xb6\xc6\x9f\r\xb1\xd8\x0c\xd3\x04\xfa\x0c~\x97\x07KBx\x0f\xe4,:\xe0\xe8\xcce\x86[\x81\xc1\xcbxs\xda\x8b\xa8{\xfdG4=\xfa\xb7 \x87\xb6r\x12\x9cZ\x1aR\x175\x9ek\xe4\xd5s\x90Bh\xbf\nZ\xeb\xbf\xd2y~K\xfe\xa4\xdb\xb4!\xe16,\xd8w\xb4\xb2Z\x02\x10F\x91D\x81\x8f\xceS[c\x9d.E0\x912=\x1e\xefd\x9b\x1c\x99\xaeW\x10\x00w\xc3\xad\xb6\x0e5\x9b\x1e\xcb\xf4DQ<m t>\xb1\x1a\xfc\xfc\\\x04\xb7R\x96R<\xf1@\xf3\xae"<"\xdf\rbI\x03%6!\rk\xec\xc5k\xc4\xe3\xef\xe0Z\xec\x847\xde\x8e\xc5\x8e\x16\xd0\x84d\xd1\x98\xddg\xc46%\\\xcaX\xab\xf6+\xc6\x12z\x91\xf8\xd2\xe6\xa3\r\x05d\xb7\x9a,}\xd6\x03\xa4\xba\xf24\xb4\xdf\xb6BL{2\x93\x0cp\x81\x8e\x88/m\xc8\x0c\x90\xf3z\xff.\x9a\xf3\xbew\x0cv\xe9UW\x11\x15\xc5\xf4\xae\xe0Z[&\x858\xc2-\xa2\xbb\x8c:j\x07L\xb5\x0f:\x8f{!\xc2\x1f\xb1\xd7\xc5\xac\x06\x1c\xec\xa0\xf75\x0fT|4\xf2\x0f9\x9e\xd2i\xa9\xe1m\x08l"M\x8d\x06K\xd0\xc1\x07\xe8\xe23w\x9c,\xfd\xb5\xf6\x86\xd4\xcc\xc9\xf7\xf0\xe1\x17?\xc8\x00x\xfb\xb5p\xb0\xdc1\xbf\x03\xa4\xe1\xcb\xdfF|{Z\xb3\xef\xe1\x86Om\xa12\x051N\xf9{\xdfc\xbcj\xb5=Y\xfd\xd4\xd2nk\xf6f\xb2\xa56\x9c7\xff\x97.\xca\xefo\xe9\xe1T\xc1\xf0"\x92[\xa8\xb7t\x96\xfeDWh\xff\xf8w\x1eH\xd6\x802\x93\x058pEW\x8b9\xc5\x1c\xe2N%NJ\x1ft\xc0\x96D\xbd\xf7\xce\x99XD\x90\xcfjy\x94\xc9\xdaZ\xa3\xe8\x9e\xcb\xa4\x89\xa0\xa60SF\xa9!sGe\x18\xcf\x12t\x11A\xe7\x94\xcd$\x81\x9aiS\xd6R\xbf\xc1./\xd7\xf7Efc\x82;N\xdb\x90:\xea\xcd\xb0\xb9\xf4_\x82\xa5zjq\xdf\xb2C\x87\xa1\x8fK\x83]G\x1bM\x81;\xff\x1e\xde\xb2\xda\xdf\x13r\xac\xe6\x1d\xaa\x0f\x97\x88\xc5\r\xb5\xcb\x02\xbe\xba\xce\x8e2\x17u\xe7wH\xb6hX`B\xdcH\xd1\xea,\xb3\xce\xe1\xf6\xf50\xc6Vkua\x06\xd0\xd8M\x15ps+\x9f@U\xa0\xc1k\xb7U\tG\x9c\xc5\xc7\xc3\xc4\x0ed\xc1X\xff\x19\rL\xe1\x0fH\xeaDC\xa5\x8d\xee\x85\x02\x882\xcc!\xce\\u\xa3\xbe\x8c\x12\x1c\xc6s\xbe\x959\'\xd3@\x99\x01\xcd4\xfd#\xd2p}%o]\xc8f\xcd\x98A\nh\'\x8b\x03\xae\xfc6d\x89\x07u\x1a1T\x9eT\x1c\xe5T\xa4\xa0\xad\xa0\x88\x02\xdf\xbd\x00\xf8\xf06\xa6\x12\x96\x06\x1b\x90\xa0$K\xabq\x1c\xf1jy\xce\xad\xc0x\x17\x8f\xc0[\x91]\xfc\xec]\x8b\x04\xa1\xc1\x1fW|]\x83\x98^\x82:\xbdc\xb03\x88\xb7\x8e\xb1\xfa\xcb\xc4u\xad\x8a\xf5f\xe1]~\x89m\xfb\xcf\xae\xaf\xe1\xda\x8a:\x8a?\xc8\x88\xa8Y(c\x94\xd5\xb4\x08\x15\x93\x00F\xc4\x81J\xe1\xefD5\xdc\xa6v\xd1\xba\x1b>\xd96\xc2\xdf\x10#\xc4]H\r\x1dh\x84V\x7f\xb9x\xd2\xaa 9\x11\xb5\x8a\xe4V\xc1\x0fg.\xdf\xae\xf9\x08\xce\xa1\x1c\xf2\x94\x9cj\x17\xd8R?\x9e\xa3Kh.\x90Q\x16\xb8\x02x\x8f%\x93s\x94\xa1\xf1\xef\xf9\xf3\x0eC\xc9\xa0\x8b\x0e4\x0b\xb7\xb8\xcc\x7fG\xfd\x96\\\x05\xcfj\x9c\xc0\xef\xf0\xff\xb7\x068Af,\xdf\xa1\x1c\xea\xe2X\xaf\x85\x0f\xa8A\x81\xbf\x1a\x8b=\xe9\x8f\x89#\x14\x17\xdbz\x93\x07\xcez_B3{qw\x0b5\xad\x83\xfb\x9a\xe4\xd2\x01\xbc)0!\xe3\x04\xb4[B\x9f,_\x1a?\x99\xb6\x1b\x07\x9b\x1b\x02\x98\xf0"\xf1\xfb\xcbjb\x0c_q\x04\xc7U\tQ\xf7\x1e\xff\xf1\xea\x91r\xa4$Q~\x94^.%\xd2\x93X\x08\xdb\\\x12\x05"\xce\t\xdc41\x88\x17\xff\x81o8\xf3{P\xc4)\xc4c\x04\x11\xac~\xd4\x89@\x80\xf9\xc1\x12\xa2]\xd8\x10\x0c\xa6\xcc\xe8\xff\xb2!\x1b\'o\xfc)\xd7Jr\x93\x0b\x81w\x04\xc8\xe7U\xdc\xbe\xc9H<\xcd<\xe8P\xc7\xff0\x05ms\xec\x9a\xaal\xf7F\x92\x94\x83\x03|j\x96.\xa9,\xffNII\x1aQd\xc5qg\xa2p\x08\x05\x1f\xd6\x12]\xe2\xef\x84zu\xad~\x9a\xc2\xa5\xcb$\x99\xb3\x1b\x08 ;W\xb1\xb6S\x0c\'\xe1\xa3\x04\x91\x8660`\xdd\xb9\xc8\xd3\xcb\x9bDp\xe0\x9d8:\x8f\xac\xaa6m\xbc\xcb\xb2\x06\x91\xf9>\xf9\x12\xaco#\xea\x1b\x97\xdd\xae\x8e\x18\xb0\xcd\nc\'v\x91>\x84\xa80\xfaK\xa6\xee\x1fxY@\xbfP\xfa\x14\xa6\x19Xk%\x07\'\\?f\x83\x1c/\xcaP\xdb\xa03o4\xbe\xd8I\xc4\xbe\x8f\xfc\xd0R\xa9\x95m\x9f\xd5p\xd6\xb5\x13\xdbO\x08\xd6hkj\xd9\xbdDr&\xd4\xe3\xd3\xcdR\xaa\x9feS\xb4\xf9_\x97"\xe6\xbc#\xb8\xe8\xd2\xb0Tj\x90\x85c\xd2\xb3\x87!5\x96\xdc\'\x9b2\xf0=\xf1\xeby5cz\xf9.\xaayX\x89\xdb\x9c\x94\x13\xf2,\xe3\x89^\xc5\xae\x93\xc71\x9eF\xeaB^\xd0\xf1\xb9AL\xa5T\xb3\x00_0\xa4?\xa7\x7fJ\x1dr\xc5\xfbF\xa8\xd2\xf2\x98\xf2\xac\xd2\x1c\\\xe4\x86\x012\x86J\x84\x85\xa9\xb6S)M\x85\xe1R\xfc\xb3\xb2\x1ff\xbf\x90\x0fD~O\xc4Z2\xbf\x84W\xd4x\xe6\xd1x\x1c[\xad.Rb\xa8i!\xd0\x85\x85\xa7\x91u\x8a3\xd4\x13)\x03ye\x04\x0fj6f=;6\xee\xdds\x115\xe9\xe5\x8f\x18\xd8/\xd5k\x13s\xb0\xeb\xe5\x98\xfd\xc7\x90\xd4H\xd3o@\x0br\x00\xea\\^\xaf\xc6\x11\x03\x8c\x91k\xa3\'\xd3\xfe"\x9b\xbeK\x12\xc0\xc7&\xed\xe6AH\x8du\x95\n\xed\xa6(/O\xd2\xa6y\x05TIf\x8f\xda#t\x12\x03\x10\x85r\xbd\x96q\x9d\x1d\xfa\x1f\xb0\xee-\x7f\x9d\xcf\x12q\x17\xc5n\xb8\xbe\x10\x0e-m\xe5\xa78\'\x05\xcc/\x08\xed^R\xf6\x98;?W\xc3\xe0D\xf7\x19\xbf\x12\xee\xc3\xd9\x83G4~x\xb0Lri\x05\xbd\xfc\xac\xa4\xe7\xb4\xf4\xa1o\xfe\xa1U?\x13\x8d\x98\x06\x0bW\xd6*<\x13\xc4(J\xb9AN(X\xadq\t\xa1\x84E\xa53')
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,jsonify
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 Dashboard(FlaskView):
12
+ def get_data(self):
13
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
14
+ return jsonify(dict(
15
+ onlines=User.query.filter(User.last_online>h24).count(),
16
+ total_users=User.query.count(),
17
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()},
18
+ usage_history=get_daily_usage_stats()
19
+ ))
20
+
21
+ def index(self):
22
+
23
+ bot=None
24
+ # if hconfig(ConfigEnum.license):
25
+ from hiddifypanel.panel.commercial.telegrambot import bot
26
+
27
+ if hconfig(ConfigEnum.is_parent):
28
+ childs=Child.query.filter(Child.id!=0).all()
29
+ for c in childs:
30
+ c.is_active=False
31
+ for d in c.domains:
32
+ if d.mode==DomainType.fake:continue
33
+ remote=f"https://{d.domain}/{hconfig(ConfigEnum.proxy_path,c.id)}/{hconfig(ConfigEnum.admin_secret,c.id)}"
34
+ d.is_active= hiddify.check_connection_to_remote(remote)
35
+ if d.is_active:
36
+ c.is_active=True
37
+
38
+ return render_template('parent_dash.html',childs=childs,bot=bot)
39
+ # try:
40
+ def_user=None if len(User.query.all())>1 else User.query.filter(User.name=='default').first()
41
+ domains=get_panel_domains()
42
+ sslip_domains=[d.domain for d in domains if "sslip.io" in d.domain]
43
+
44
+ if def_user and sslip_domains:
45
+ quick_setup=url_for("admin.QuickSetup:index")
46
+ 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')
47
+ elif len(sslip_domains):
48
+ flash((_('It seems that you are using default domain (%(domain)s) which is not recommended.',domain=sslip_domains[0])),'warning')
49
+ elif def_user:
50
+ d=domains[0]
51
+ u=def_user.uuid
52
+ 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')
53
+
54
+ # except:
55
+ # flash((_('Error!!!')),'info')
56
+ h24=datetime.datetime.now()-datetime.timedelta(days=1)
57
+ onlines=User.query.filter(User.last_online>h24).count()
58
+ total=User.query.count()
59
+
60
+ stats={'system':hiddify.system_stats(), 'top5':hiddify.top_processes()}
61
+ return render_template('index.html',onlines=onlines,total_users=total,bot=bot,stats=stats,usage_history=get_daily_usage_stats())
62
+
63
+ @route('remove_child', methods=['POST'])
64
+ def remove_child(self):
65
+ child_id=request.form['child_id']
66
+ child=Child.query.filter(Child.id==child_id).first()
67
+ db.session.delete(child)
68
+ db.session.commit()
69
+ flash(_("child has been removed!"), "success")
70
+ return self.index()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
71
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -1,5 +1,196 @@
1
- # 2023-04-08T16:23:20.524589
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x82\x1f\x00\x00\x12\t\x04\x00:N\x8d\x82\xae*\xb0\x0e\xdf\x99\x8d\xf4c\xf6\xf9\x8a\x00\x00\x00\x00\x00\x00\x00\x00^\xa4c\xc2t\xd2\xbf\xc9#\x13\xae\xcc3\xeag%\x1ch\xe0\xa9\x01*\x14\x87\xef\x83\x12\xc6L\xd6[\xe1Q\xc8\x8a7e\xd6\x1e\xa4\x03Lu\xedf\x18\x9eST\xe8\xf0\xf4\xe0\x16\x9a\xd9\xff\xa0\x8c\xc1\x0fJ9\xeaD\xd7:\xb2<[`\xa0i\x04y\xa1#\xedx>L\xff\xe3\x10\xf3\xb9\x16\x08\xf1\xd6z2N\xb9\xfb\\1<\xa2\xaem\xaf,!\xc4\x9e\xb8\x93\x1e\xe2M\x9a\x0e\xbf\x99\xd8\xec\x87c\xb2\x0c\xd6\xc6l\x1a\xa4Y\xc3@\xac\x83\x9d\x9cf\xe3\xc8\xc5\xd3;\x18\x16\xc3\xfa~\xc9\xfe\xd1\xe4\xc5\xc4)\x9e\xc1\xb9M\xce\xc0\r\xe5o\x19\xc9\x9a\xc8\x8a\xcd\xf6\xbe\xde"\x12\xa95\xee\xbc\x9a\xaf\xba\xd4\xf33nQ\x18#s-\xff\xccw\xbb1\x18\'\x1d\xa6\xc3\xc9I\x8db\xb1\xee+\x1f4\xb2\x1b\x94/\x9a\xec\xff3J\x00\x1f\xd0\x18W\x1f\xc8%M\xa2~\xf7\xdct\xd7\x8f[\xb1\x97\xf4\xdc\xd4\xad\x19_`\xd3Y\xa8\x86H\x84\xaf\x87\x99L\xaevUlN\xce8JH\xeb\x12\xeekK\xd1\xfe\xe9\r\xf7\x11\x99\xa0\xe2\xce\xc7\xe1\x8d\x90\xf5\x15_\x1e\xcf\xf8\x0e\x84\x9c\x1b\xfe\x9f\xf0\x8a\x98\xea`\x93<\xcdR\xd5\x17\xf6\xc3\xda\x8fT\x93do\xc78\xdaOS\x92\x81C\xeeh<\x95\xe7\x0c\xebt\x9b\xcc~\x7f\x1b\x94{\xd4\xa7Z\xc2\xbb\x84`\xea\x1e\x88\xb9\xcb\x1d\x86`\x06\xfa\xc1x\x8c\xb7\xef\xaeu\xce\xce\x82\xdb\xad\xa2p}\xf0*\xb6\xb4s#s\xf3(\xce\xe3\xd5\xb1\xf8t\xf7\x1c0\xea\x9f\xee\xac\x0c4.\x8d\xa6\x90[\x83"\xb1M\xe45(\x9f\xd6S\x84\x111\x85R\xffw\xb3\xe0\x9b\x86f:\x8fy\x98\x8d\xc7\x04\xe2\x8a\x12H\x96b\x9dK\x01j\xe7\x12\xad\x1eDDgC*%mDX\xe1\x0e\xf1\xe4\x94\n\xc7\xaf\xb7\xf2\x97Px\xd92\xe0^\x16\xca\x94E\xad\xc85\xbb\x02\x9dG\x96\xca\xd4lP\xf3\xc1TZ\t\xc28\xceR&\xa5\xc3\x8c\xaa\x04"\xc1\xb3\xe0\xcb\x05\xbc}DoZ\xd2.\x05\x01\x84\xa8\x12s&\x0f\x91V\x0f\xba\x1c\xf5\x93}b]N(N\x92w\x81\x86\xb6\x89\x10_\x01%.\x8bo%s\xe7\x198;FNQ#\x8c\x7f?\x87<\xcb\xe8\xd5\x1e\x1d\x1f\xe1\x03d\xd7ut\x8aw\x17\xf2\x15\x85\xac\xf3\xf1U8A-H37\xe0J\xacHm\xc7\x01wbX\xf4\x1b`]\'/G3\xce\xc2\x89\xd2{W\x07Wr|\xa678\x87FZ;\xd8\x8f\xaf\x87\x1eW\xe5\r\xa2\x8c-\xa5T\x9e\xa5\xf1\x84$\x96\x8ec\xce\xb4|\xfa\x05\x82\xac\x8da\x1f\x06\xd3u\xa1\x9d\xd9\x8a\x14\x18Dn\xf8\x9e\xa9\xf6\xffN\x02G6\\\xbe\xccp3\xb9\x9ay\\\xbeA7\xa2\xcdRFl)(\xd4\x14C\xf4\xa3\xb4\x01:\x97\xd3B9\x18\xf3\xbd\n\x88\xd25C\x87\x99-%x\xda\xdc\xc3\xcd\xb6\xa6\xe4\xff\xde\x94\x15\x7fh\xb3\xb3A{\xa3\xa8\xbc\x13\x02\x85\x95C\xe3\xe5\xf0&\x07\xbe\x05\xc0\x04\xbf\xd6\x85p>&\x99\x9f\x1fp[\xe9\x163\xbe,\x05B\x17\xf2\x1b\x1e\xcc\x0b\xf6l&OG:0\x06\xb1{t\xd8o\x1a\xd7@~q\xd0R\xdcV\xecr\xd6\x06\xac\x90\xde ^@\xf2\xaa\n6\x9e\x8a{5\x81\x9c\xb18p\x0bV\xf3\x0e\x9d\x85\xcc\x93p\x92*Fd\xbc\x08\x1d\x7f:\xb4\xed\xecF\xca\x04]_\'mR\xadG\'\xc1\xf5_Cl\xb9\xa2\xd1\xf0\xc0A\xfd\x12\x11\xec\xc2\xd3a\xf1\x7f\xb1\x008\xe9\x7f\x9a\xe5\xbf\n\xdfs`\xaa\xd5\xf8g\xb3o\xd5?=\xbdF\xa6\xcf\x05\xe2\x17\x87\xb7t\x8dz\x8a\x91\x9e\xf1[\xb5\xfd8\xd6u\xbe\xfd\xc5\xd1#\x833\x8b.IR\x12\x1f\xd0\xa5\xd7GS\x85o\x0b|\xaf$\xadFf\xd5\xf8m\x88\xc7\x1a\x92\x92\x95,\t\xb0\x10X\xbc\x86:\'\x83\xb0\xb60\x0f?^\x96\x0e4\xda\xa8\xf1\xb6=^(\x90\xec\xffE\t\xcef\xe2\x86\xd6\x99J\xbe\x8a{E\xe1\xf4Xy\xf38(kmj\xb3\x19`\xe5\x8c\xe2\x98!h\x11\x7f}w\xcb\x87(y\x16\xceJ\xaa\xbd:\xa2\xa7\xf8\xb2\x85|;\xc4\xbba\xeb\xa5`\xae6\x83\xfa\t|\xe1K\xee\x8c\xab2!\xf3\xeb\x9a\x11\xf2zZ\xc6\xf1pj\x12=\xd4\xb2\xe1_\xdc\xd1\xe1q\xb7\xfc\xd9\xd1\xb7\'0\x83E8\x8c\xc2\x97\xd1&\xa3=\\\xb0\xef\xf9\xed\xcf\x86\xea>\x9bE\xa6|7\xb1\x81\x8es\xe5_d\x8f\xf8^\xbf\xa3\x82J\xca?\xf2\xa2`"\xa7\xb6\x80~\x8b-\x12\x06\xc9]8\x16Y\x18\xcd\xf3\x8fp\xf3\x90h\xd4\x07\x94s\x81\\\xd7z$~\x88\xfc\xec\xe3\xe3\xc6F\xd1\xafG\np\xa9?N\x05\xb9qF\xebP\x0c\x13\xaf\x9e\xcaq\x8f\x1dS\x17;1|\xd1U\xea\x04be\xa2\x8d\x8f\xadH\xf1\xdb\xfeD\xdadC\x7f\x1d\xechF\x89\xb1b\xb6\x85_+\x80\xe3,$\xa8\xe0-\x84v\xfd\x03\xf1\xdf\xd6\xb2\x0eb\x8b\x1fi\xafm\xa4ix\xa6q\xe4\x8fEwR\x10\xd6E\x06\x98\x0c\xff\x80\xdf\xf5\x83\x8cQ\x8b\xa9`\xdf5\xbe\xbe\xc1/S48\xd2\xe8\xe4\xe1y\x11+\x9d\xce\xb1\xe6\xbc\xf1\xb8\xbav\xe8i\xf4\xda\xcf\x07\xf4\xce\xd5\xbb\xf8\xdf\xdb\xd6\xb3t\xa4\xc2\x7f\xe9d\xee=Z\x9dP!p\xe9%\x93\x8d\x0b\xeb\x8e#\x89k\x93\x00\xac\x89o\xa8\x00\xfb\xbe\xd0+=\x81k\xdc\x07V\x06\xb9\xcb\xca\xefJ\x17\xff\xbb\xd1\tOw\xaaw\xa6\x8e\x12\\@V\xb9\xcb\xda\xf8\x0f\xd7\xd2be\xc6\xa4x\xaa2\x1e!\xc0\x9f\x8f\x89\x8c\xf3$\x10\x008\x1f2\xe4\xe1\xdb?\xe3\xef\xc2\x0b\x12\x83\xfa\xc8\xd1\xb1<\x05=G\xae8d:\x8d\xe5!\x1f\xdc\xa6\xd9P\x0f\x8f\xa6H?\xe5H\x08C\x8d\x82u\xe6\xf1\x0b\x9c\xf8c\xab\x01\xafA\xdf\xc2o\x85k\x1dhd\xed\x97\x15\xd7\n\xcf \x1a\x93\x0b\x87\xb37#\xc2g\xafZ\xf4\xe3r)\x9c!:\x00\xb1s*\xbde\xbf\xc3\x1c\xb3\xf0\xae\r|a5\x13\xa9\xd3\xfbT\x13\xc92\x8f/\xday\xad8\xc7>\xe0\xcag}*\xca_\x9d`\xee_\x8b\xa7\xe0\x9a4kR`\xf9\x8d\x0fR\x0c*+r>\xbcQt\xde\xad\xd6\x16d\xc9]\xa6*(\x15z(\xa2\x05<g~\x9f\xcc=\x1aQ\x1a>\xf6\xa9\xc0\x90\x118\xa2~\xdfZ\xe5S\x15\xcd\xb1S\xc3\x1a\xce\x00>\x0b\x8b\t\xee)-d\xd1\x8dMx\x1a\x14\xf0\xc5\xdd\x08\xf7\x96\xec\xaa9\xcf5\xacD\x93=i\xeb\xf1S\\\xd7l\xbb\xa12\xbalS\xb6\xcd\xea\x9f\x8ft\xc5\xfbQ\x8d\xde\x02\x98\xf1\xf3sgd\x15f\x8c\t\xb5\xacWV f\xd1\x9d\xa1+\xfcE?\xfe\xd9\xf8e\xe6\x16f\x99]\x05~K\xd4\xac\xfdb\x06\xe7^\xbd\xd6\x90\xc6\xf5\xa4\xf3\t8\xaa\n\xe8\x02\x8dg\x102=\x8c\\z\xbe\xb3\x88\x9c+\x83\xe6\x8a\xa9\x0cNn\xd3IM]\x01Z\xabf\x05\xf3\x88\xdf\x17\xfa\xcc\x0c\x91\x0e\xd4\x84\xbbo5\xf1\xa8Ri\x00P\xf4\xfb\x8a\x02!\xe9\xb8\xc6\x17\xa8\x99\x05;\x8d\xcdj\x03\x8f\x0e\xec\x8b\xc9\x91\x10\xae\x7f|y\xda\xac$?\x01\xa4\x84<\xf7\x07/\xca\xe1N\xdf\x8a\x04\xef\xae\xa0<\xb8\xeb\xdf\xf9\n\xbb\xb2\x8c\xd4\x11IZs~\\\xe7X\x0f\xa6".\x97\x17p\r\x82\n*\xc2\x82u\x9e\x96\xe4\x13\xc9\xb9L\x07xR\xd9\xed\xbd\xfdi\x95p\xaf\x19\xbd\xfe\xc0\xa8\x1b3\xdb\x1b,_\x96\x93\xfa\xf2\xef\xe8\xe0\x07c\x89*n\x8f\x10\xcf\xb1Y\x1e^c\x98Zk\xfe5\x8b\x1a\x04~\xede\xf998\x1d\xa7O\xd3{q\xadjKJ^\x97\xce\xc5\x0b\xe6\x8b\n\xcc\x07\xa4:/\xf7{O\x99r\x8f\x1c\xf9\x0c\xdb1\xdb\xbcP\xd7\xa1BXd]?\x86Og\x88\xc7s\xe1y+\xba\x1fN&\xcc+ \x81\x866\x8f\r\xe5|g\xea\\\xaf\x08\x88\xb9\xf8\xde\xb0\x1c\x02\xc8YuK\xb8\xb9\x16\xe8\xfbn@DG\xe4\xa1\x90U\x07nL\xa9\x14n\xc9p\xb4\xaf\x98\xeb\xb5V\xb6\x16\xd5\x97\x0f\x8e\'\x16\x84\xb9\xbd\x0f\xf0)\x802\xdb2Pw?\xb8m\xb0)G:\xf7\xeaD(\x0b\xf6\xbc\x85IX\xec\xadS\x99D\n\x13I\xb5\xea\x88\xdczP\xae\x00\xff\xb1\xf9\xc2[@\x94*\x16\xfbpX\xa4\x12\xcd\xf9\x86\x0c\xac\xe35\xe6\x13@z\xce\xff\x1a\r\n\xc8\xb8\x10\n_\xa2\x19\xc0\x8ai\xc0\xbck\x013H\xf0\x91\xeb\x8b\xdf\xe3\xf3\x1e\xc1X<)\x8e;\x11JB\xed4\xf7\xd0uy\x160:4/\x17-!\x90\xce-\xf45J\x18\xdc\xa1\x0c\xc6o\x9b\xc8\xec}\xf5\x1a\xd1wl3W\xf1(h\xae:\xd3\x99!/\xc1)\xf5V\xdc\xc2\x01\x99\xdb\xb8\xd4\x06=\xc9\\\xa0\x8d6~OW\x82\xa5\xf7\xe3P9\xf8\xfa_+\xee\x90\xf8,+O\xb0\xad\x8c\xdd\x9dr\xc6;F1\xa9\xf6c\x18\x07\xa1%(\xf0sS\xf8\xd0{\xc0\x95\xcc\x7fy\x13\x88mv\xe7\x1f\x15\xb4N\xd6\x95dvG\xec(\x01j\xf9R\xb3\xd6\x83\x98\xcd\xa4\xe5\x07$0Y\xa0\x8d\xc7\x8eYg3\ni\x9e9d\xdc@Ps\xcf\x9c\xc1\xe4\xc9\x89[Us\xe4\x8a\xdb/\xfeQ\xf0|\xbe<\xe9\x80\xacy\xd5x\xdeN.;\xa7\xaf\xc1_t\xfbV\xe1\x00\xbb^\xc8\x88\x9d^\xfb\xad>N\x01\xccp\x7f\xadY\xac\x04\'\x89S\xd0\';\xe2\x8f\xbd|\xa2\xb2\\\xbf\x07s\xd3\x02\xf7\xa5\x83\x14\xce\x8a\xe1\x02\xd6\xecm\xce[b\xa8\x93\xfc\xa035\xc6\x95*i\xee\xc99\xf5\xeet\xf8Y\x9c\x1f\\\xb5\x8e\xb8DK\x16@K6\xe9\r\x1a\x10\xd5*\xf2a\xa1N\x03K\x91E\xe0U\xb3\xcd\x04P4\x9by\xc1hH\xba\x85\xc6\xc4L\x03\xebltC\xa6@5{hVY`\x874\x17e\x8f\xd5\x0b\x19\xcc\xf3\xd7U\x8c\x03\x011\xd7%\xacP\xc4\xc9a\xfe,\x7f\xb5\xf4\x96E\xd7o\xd8\x9d\xfb\x02\xc3\x9a\x96\xa8\xae?\x1cm\xad\xe7i[\x998o\xb5\x02\xfb\x8b\x0c\x9eB^\xed.z7sB\xc9\x80\x87\x9e#\xab~\xea\xa3\x8c\x03\xeb\x1e\xdak]m\xb4j$#\x08\x87\xe0N;\x9a;\x7f\xc7aL\x86\xc9\x90\xbdN\xf4CU\x9d\xdfU\xcaH<\xe3\xfe?\xba\xc1q\xda_\xea\x02\xab\xef\x07\x91[yK\x1e-\x85\x04\x94\x08\x81\xde,\xbd\x1c\x91\xe0\x05q\xf6\xc4y\xa4\xe0\xb4%m!F\xc8\xd4\x8bTr\x1b\xab\xed\x8c\xedD\xb4\x93d\x12\xd3N:\x1a\x0fwYG\xf4\x04\x00\x0e\x06\xf9\xe3J\xf5\xd4v\xddAa\xc8p\xbb\xf2\xd71\xde\xde\xef\x089\xe1.\n\x96\xb8\x1b\x01\x06\x8cmYi\xbd\xb6Sb\xe4\xd0\x12\xa8\xc6\x1a\x90`\t&\xc3\x1e\r\x8a2\xc0v4\x11\xa7\xef\xe4\x97?\xf7\x83\xf8\x81\xe1\x13:kb\xe6\xba\x95l\x8f\xf0X\xc4\x83?\x84x\xd7\x1dXc\xa7\xb4\xecu\xe1D:\xca\xda\xb7d\x15\xc1\xac\xa0=X\xe8\x9e\rK6\x1c\x83\x8e]\xb39\xb6\x98\xad\xf7\xc6v\xc7\x98\xe3\xed\x08]\x94D\xcc\x9e\x7f\x16\xf9\xd4y\x04\xde\xf3e\xbe\xf0\x8ffNJ~\xf9\xeb\rO=\x90\xf0\x01~\xf1f\xbf\x90\x1b\xd3\r\xad\xbayy-\xdf\x9cP,\xf2jz\x05\xfe\x9f\x84\xeb(\xd0\x84\xdf_q\xcdz\xcdN\xc1\xea.\x92\x87\x8f/\x90\xd7s4z\xf11\xab\x9d\xed\xaaO\xdd\xa3\xe4\xd8;\x90_\x90\xec\xf02\x8e,\xd3\xa8\xbc\xfc\x8e\xc4\xf2\x00\xa7\xad\xd1:\xe7\'\\S\xf3\x15\x14c\xce\xde\xab\xb9\xd4\x826\x1c\x1d\xb4\xd4\x1a\xadi\xa5\xb5\xad\xbdi\x14\xa2\xe23a\x84\xc5\xe2\x16s\xc7\xc8\x03\xc9w:\xd9|\x05\x9f\xef\xa2\xf2,38~%\x92\x92[\xee7,Z7\xb9%\xa4\\eF\xf6\xf2\xaa\xdb\xde\x0f5\xe4\xac\xf1\xe3\xb2WB\xa3\xa0k\xf4Z6\x99\x03m1\xa9\xffU\xfd\n\x05\xfd\xce\x86\x8e\xed\x12\xb2\xcd\xd3\x01-]u.\x07]\xf0v\x07xX\xa1\xd2\x1c5\xa1\x9f\x02\x8bu\xfd\xb4\xbf\xd4\xef3\xc5\x94\x14=\xb6y\xa1`\x0b=X\xc6j\xd7\x01\x15\xca\xda\xe3{\x9b\x14\x84\xb8\x1d\x84d\xd7\xcehPj\xf1\xa8)\x83`\xc7dq06\xc2\xca`\xad\xe5\']="i\x1d>$\x00\x9c\x83,fl\xd5m\xf2\x01\xbc\xc4}\xf7We\x9f\xc3\x90\xe6\x9f\xc4\xf8uE\x86&\x1e\'\xaa\xdc \x00\x85\x7f\x93\x1e\xdc\x93$\xd3\xee\xf6\xcd\xee{\xc8\x97\x04\xad\xea8\xda\x8cW\xf2\x0f\xf4@\xba\xf4X\xdf\x9f:r\xa9\x99\tG`\xe9\xcd\t\xea__\xc0|,"\xd1\xc9\tO\xeb!-\x91\x17\x84A\x19\x068\xab\xd7\x97\xca#\xca\x0c\x8b\xc9d\xaas\xc8\x85\xe3\xc5\x83\xd2Q\t\x19\xbfl\xac\x9e\xd5\x90V\x93lD\xbf\x98{\xe3)\x97\x8bw\xfe\x8f\xf2\xf3\x9f\x16;s\xac\xc0%\x91\xd5\xf1\x05=\xb4\xc8\x1e\x8c\x97\xf0b\xf1;\xa8\xa6\x08\x87^I\x7f\xd5\x9d\x8c\x10\xef\x19\xd2:\xfc]$3\x80^\xcbn\x0f\x1a\x1c<\\?z\xbd\x11o\x13\xf3K\x16\xa6\x88#<\x1f\x9a{\x9b\xfb\xfd\xbf\x04\xdf\x95-^@\xfc\xe0f\x04]2\xe2\xdc\xae`\xdb\xc6\x07:T]~\x995p\x86S\x8d\x80\x9d\x0e\x8f\x187\xcf.~\x13\x01{I\x91\xf3\x84\xd2\x86i\x80\x9e\xb5/\x8a`\x8cY\xda"r\xe4\x169o\xa4\x81\x1f\xea3\xa9\xd5V\x94uK\x827\xe1\xd9\x91\x17\xa3\xbb\xa8\xf7\x90\x92\x16\x08\x08`\x8d\nh\xce\xca&pU5^\xa7\xc9\x8d\\\xf2j\xef\xb6\x06\x9e\x05\xd9\xd4\xe2\xc5r\xb3r\xaa\xbe\x11\xe1\xd43\xbeL\xb6\xb5\x8f\xacp\x91\x86M\xfb\xbc\x12*\x86<<\xc4\xedj\xb6\xe2\xf8\xc0\x7f\xd0\xabD\xbc\x90\xde\xa3\xcd\xc2\xa6!=,*\xfe\xf69S\xae\xa2\xe2\x15\x04\xa7\xdfj\x85;\x9f,\xccN\x0b\xce\xa9\x82\xe0,\xb4\xfc\x1e\xe3\x12\xa9\x1b4\xa1\x91\xc7\xa2\x14~\x1cwb\xa5\x13\xf8\xfe0\x86Fp`\x0e\x81\x8c\xf0\xbd\r\x10\x93\x0f\x0e5\n\x02mj\xb8\xdb\xb7\xa1}y\x9b\xbb\xccA\xd33`h~\xb7\x9fr\xd9\xf8\xc6Jg\x03\xf5/;\xa69"\xbeB\xbf\xc1\x0c\xd0\x81\x05\xb0\x0e\x12OP\x0c\x1d\x11\xd00{\xac1\xc3~ R;\x93\xff\xfd\x9f&\xd4\xcc\xb6\x0e\xe4\xec\xef\xb6\x7f\xfd\xee\x8f\xee\x80\x11\xcc\xb4\x92g\xc0O\xa3^y\xf7c\xd9\xdb\x83\xac\xf4\xe2\xa8\xef\xb5c\xa7\xf7\xf4)W\x88\tY\xcf\x81lc\xa6\xd2\xe4\x12\xf5\x04\x89z\n\x80\xafd\x9b\xd0\xc9\xe0\xf3\x95\xc0\xccuz\xa8\xf0\x18\xfc\xb6\x15\xc5\x8cp::?M\xa3\x0b\xdag\x97\xd7h/\x8at\xf7\x8a\xa8\xf0u\x8f\x0f\x81N\xa4\xf54\xa2\x89)j\xb1\x8c\xebn>d\x83,\x92\xd8:\xbe\x002\xb5\xe3\x9f!\xf2\xc1.S}\xe7k\x83DgE\xce\xa5\xa8\xe5\xb3I\xee\x1fl\xdd\x076\xc8\x10\xfd\xc4\xfc\xdc\x0b\x1d\xdfy\xb9\x90\x13]\x0epJ\x9c\xa9\xcd\xcf\x04\xd9d\xe3b,\xb2\xbf\x94\x88\x0b\xaeE\x80\xc0\xa4\xf6ZR\x95+\xc8#<\xe1A\x18`r\xff\xc1\xa1gYQh\x1cx]r\xab\x00\x10\xa3}\t\xc5j*\x85M\xe4Z\xfa\xb4-\x9d\xbbh\xcb\x9a\xfd\xfa8\x13\xad\xcc<\xdc\x974\xfd\x13\xcf&O)\xbf\x00\x8e\xf3\x92\xcc\x819\xb0/\x0f\x16\xee\x81,Z\x82B\xb6\xcbY\xb7\xfax\x8d\x06\xc35mu\x1e\x14\xe4\'\xdcZ\x8d\xfbr\xe5\xd3\xde\xba\x83\xfa\xec\x91f\x14(r"\x8aGf\xb8\x85+2\xd9\xd9m\xe5hR^>\xff9\xbf\xee\x94W\xe0\x95\xc7\xd1\xa3{\xd9\x02\x90]n>\x0bI\xa6\xea\x91\xe5\xd2I\x10\x06\x10l6\x9e\x10\xe4=\x94\xaf!U\x1e\xba\xa2\x95~\xaat\x82\x8d\xedY,W\xed\x17\x9c\xb7\xa3\xe5W>\xf2\xf6Zz3c\xb2\xf3K\xf6j\x1a\xaf\x93WQ\xfe\x1f\'\'kv\xc2XqQ\xf1Ef\x13y\x14\x80\xbdC\x9c\xd88w\xd6\x8c\xfe}\xe4<*71\x9e|\xae\xa8\xfe(P\xfb\x87O!-\x13\xb5u\x125\xe8\xff\xb2:\x9a+T+\x14J\x93\xe4\xeb\xca\xdd\xe0\'L\xd7\x83\\\xde&\\\x06\xcfQ\x83*(\xe71\xd0@\xd84\xad\xbbBK\x9c\x9a\x19\x18;5\xf4/p\xe1\x0cX\xdeF\xc6\xf8G\xcdz\xbc\x16\x06\x96\xec\xe3\x0e>\xc8b\xa1\xc8a\xeb\x93\xd3\x99\x8b\x85\x12\xbb\x87"\x9b{-\xf0HF\x86\x03\n\x92\xcc\xf8}\x1a{\xa1\xaf8\xe7\x91\x88\xb8\xa6k\xbb\xb2`\xd9\xd6\x02\x19*c\xc2\xba\'D\xaa\x91\x08\x11x5\xc0\xe15Q\x80[[\xb5&0\xe4\xb4\xc3\xe7Oi\x10\x86G\xd7\xa8\x04D\x93\xf7-HS1\xc6\xee\xf1\x88\xca\xfe\x82\xa3M\x95\x98d\xab\xaeO\xeb(\xf2q\xd9\xc6v\x01\x8a\x9e\x0b\x08|\x86\xba\xda\x82\x06\xa4u\xacw\x06\xbel2\x05\x05\x13\xb4\xf0\x89\x07A\xef\xcc\xd8\x86\xb8\xd7^3L\xa84\xa0L\x04_\xc8\xa9\x87x2\xdc\xe6!\x8eAx\x18\xc3|\x0cm\xaek`\x1d\xdb\xa7\xdd\x87}\xcf)\xe7yWN\x03ED\x8c^\tL\x84\xae\x1e,\x99j_\x8b\x94\xa0Zn\xb7\x96\xb4\x0e\r\xba\x9c\xa82B%Z\xeb\xdd\xee\xe1`o\xf8R\xd7\xddE\x08%\xfb\x1f[\xf1|\xd4;F\xfd\xd2\xc0\xc8\x15xp\x04\xe9?.\xae\x00[\xdd\xf9K\xd0\xfe\x95\xfe\xd3y\x11\xdaPv\xf5z\xe4\xeb@Q\xca\x0b\xfb\x83\x8a\xc8\x9e\x93\xcb\xea\xe0.\\\xf88\\\xbb\xa6\xe2\xba\x8e\x10\xfdTtZ\xb1 V\xd8\xa2\xfd\xba!\x80\x81\\\xb4h\x1f\x83\xe5\xe5\xe8\xd7^F\ty4\xb8\xe9}\xe7\xcfkG\xa2LkoZ\x86a\x17\xd3\x12@\xe5+E\xa9\xba)jV]}0]\xfe\x94A\x06\xa7Q\x19\x99\xffQ\x07\xa7\xa1bJ\xcb\xd4\x03\xb2\xe3\xba\xa4C\xf8E\xf2u\xdeA3\xa87\xa6\xa6\x7fO\x0c\xfe\xef\xb8\x80\xa2t\x07\xa9\xbf\xf1\x9c\xe6\xc2\x9d\xb9B\xf2\xd5b\x96\x08\xce\x11\x1aA\xf3\xf8\xd7\x93V\xca3\xaf\xaf\xe9\x8f\xa0\xe4\xfa\x96Y\xa0\xb8\xdd\x19\x8f\x96\x10\xeb?\x9f\x1b\xb8^\x94\x81W3}\x1d\x17\xc5{\xe27\x0b\xbe\xfc\x02\xe4\xa8\x9f\xdf\x97\xd8\x7f\xcd\xfbbK(|\xd2\xbd\x1a\x91\xb1\x04\xc4\xb8k\xc2\xa2\xd4-Yb\xfd\xde\xa1\xfc\xc6\xe5\xdd\xba\xc0\x1f\x15m\x87=*\xf5\xd9;~\xcd\x1f\xfdx\x8eVr\x1d\xef{xX\x8b\x99\xdaLUv\xca\xf4K\xf2\xbe@\xba\x98"\x19\xc92\xfaIp#\xac\xbfyY\xaf\'\x16BHw\x13\xc9 \x16\xda.P\xe6\x85\xac\xf0R\xe2\xa6\xc4~\xffx\xe5\xd0<F\xc3\xfc\x85\xf3\xd7\xa1\xe0d\xeeE\xaa\x07eF\x1b\xf6\xe1\xfe\x85\x95Q\x84$iM\xf9\xd5\x11\x8f\x12\xb6\xdd\x0e\x8d\xc2*\xc2L_\x02( \xcb\x81u\x0e+\xab\xd6V\xfc\x949%\xe9`\xd4\x05859\x90\xbepfZ&kR*d\x15\xd0^(\x19\xa7\xe0\x99\x9a\x89:\xf8\x8b\xc9\xf7b4\x90\x9a\xe6k\x9c\xae\xc5{\xcdg\xd7A\x1fL\xe48\xab\xf9\x14\x8c\xd2\x1e\xd2!\x9f`hB\'\xeb\xdc3\xae2\x8c\x85n\xbf;_%\xc5\x9c\xa7N\x8apKW\xcay\xbf\xac\xe3\x9e\xba\xc8\xba\xf8\xfd\xd1/\xd4qlP\x1c\xfar\xee\xe7\xce\xa4\x14\x06\xf6\xdfi\xf4\xfd\xf4\xb6=\x1a\xa1\xa3\xd0\xd2\xed\x086\xcd\x12\xa4\xb76*\x01\xf3\x82\xfd\x82\x1dg\x90\x82\xdd\xad\xcc\x8diE\xd7o\xf7\x82\xa4\x8b\xdd\x8a\xa7b\xe0\x9bq\xba\xbd*t\xf7\xe4\x0e\x82\xe6\x8b\xcd2\xcej\xf8?E\xbdz\xcfZ\x9dh\xf0\x8b\xd5C\x9a\xd6\xf3\xd5m\x0c\xbcLL\xbc\xb1Dt\xf18X\xdf\xcb1l\xb2w\x1bmXW\xff\xae\\\xc6eI\xfb\xdf\x16zi\xc8\xf1\xcf\xc7\x17\xed\\y\xb9To\xe5\xdc.\x0c\x04\xa1\x07W\xb7\xef#j#\xedCUa\xb2\x84q\xc8\xb91\xce\xa7\x83\x91\xb5\xd8\xea\xd6:a\xc1!\xf0\xfb\xbc\'m]\xe6\xc0 @\xe2FSa\x9cZ\n\xeef\xb4\xce\xbeJC\x91\xdf\xdelf\x03\xe60"U*\xd2\x13\xfd?N\x8c\x9eS^\xbd\xa5\xeb\xc9P\x89\x053\xb8\x18\xaa\rT\t\x8e\xcfG\xb6\xb7\x87\xdd(<\xb2q]\xce\xed\x02\xdc\xbah(g\x97\xb9q\xdbt\x98\x8b\x134\x11\xca\xb0\xcan\xe4(\xe9aJ\x19\xd8\xed\xcbuC\xe7\x1a\xbb\xdf.\xc8\x1b\xb3"(l`\x070\xa8Q:\x9e\xae\xe9\xba3\xd2\xb2WK\xba\xba\xb0\xa1\x8e\xb8W\xbf\xad\xd1\x951\x1dC\xf4n\n/\xe9\xdbR\x8b\xd4\xdc\xb4&\xe4\xd2\xe2\xdc"\xcd\xf5f\xae\xf1xc2\xd8\xee\xf2~\x9e\xf3pfi%>\xe3CL\xd3\xc6\x06\xb3\x98\x86_\xf0\xdeh\x80\x82P\x83J*\xc0\xd8ou\xb10\x88S\xe5\x87q\xe0\xa3\xea\x94\xab/M\xa2l:u:x\x83\xde U\x82y|!4\xae\x9aL\x80\xd8\xb7\xf0\x97\r\xd4\x94\xb0,b\xbb\x82P\x83\x84\xa9h\x10\xa2\xc2\xf1\x02\x10a\xd9\x80\x8b\xf3J\x9b\xb7g\xf6\xa0\xe3\xefz\x18\xaa\xd4QB,\xaa\x98\x99l\xc5u.\xea\x05\xe4J{\xdfgmd\xeco\xd2\xd3\xcc\x7f\xaf\xb8\xf0\xd0\xfa\x9f\xa2\x89\xca\x9fA\x0c\xa0*\xa1\x0cP!s\xb0c\xb0rk,S43\xf7`R)\x10\x8d\xae\x9cR\x1a\x07\xf3\x05\x0b\xa0\xe7\xfa\x89V,\x9cA\x92\x17\x02\xa5\x15T\xfe\xbb\xac}M\x8c\xdbL\x13\x89\xf9W\x1e\x8eY|E-IB"Q\xba\x9b8\xbdu(;\xd4c\xc7U\xb6A\xbe_\x01\xa8\xb1!W\xa46\xd0\xec\xee\xde,z\xb46s\xed\xf4\x1a\xb0\x8d_\xb6?\xad\x94\xbc\x00(=\x87\xa6\xb2\n\x89\xa64Jx\x00Rb\r(\xb48z"~\xbf\xae\xd6\x8b\xcd\xf0a\x91\xff4\xd2j88NV\x82\xf2\xc2o\xcc\x1e\xb8\xf9\x87\x99 Q\x05wK\xb8a\xcf\xab\xd0\xdc\xe1\xcc\x7f\x92u\x10)B9;`E\xde(\x91\x01\x80\xb4\xaa\xbb\x039\xe1\xb9\xae5,o6\xeaC\x9e\xcd\xb0\xba\x0c?\xa2W\xdfg\x02\xfbQ\n\x0e>\xe8? \xe99q\x02\xf5\'\x90\xa4\x18\xb1\xd4\xb2\x9c\x94\xb5?\x08g0zxx\xa3\x84\x8b\x02#\xf9\x07\x91\xc4\xdc\xa7\xc89_\xe2\x04\xe2P \x06\x9fv\xe5\xf9\xb1\xa5\xa5x\xbd_U\xf7\x19)V\xf5\x1fZ\'\xbb\xd9\xa9{\xef\x970\xc4L\xd4\xfa\xc3\'\xdbv\x1a\x10\x1a\x9f9\x0ef\xf2\xd4A\xe8\xb8M\x9a\xef\x8e\xf4\x82\x91\xc1\x1c4\x91\xbb\x14\xd0\x10\x95rk2z\xaeQ\x0c\x16>\xfa\xf1\xde\xb5 )\x8cw\xefT\xa4\xd0\xcf\xef\xa1\xc3\x95\x13Qi\xceF\xf1\x91x\x8a\xe2m\xb2\x8fK\xbe4\x9d\xd6\x1ez\xca,\x84\x84\xb7\xc2\x97\xd1J@\x884"\xa2\xc8\xe71\xae\xe2\x88\xaa\xf4\xe4\xf2\xd9\xc8"\x94\xc9C\x11\xb6\x07G\xed\x0cm/\x9ar3\x04\xb2\x93X\xa7s\xc4S"}b\xc8\xa5\xdc\x96\x17\x9aX\x8e\xcbv^\x06\xaa-\x01\xfd\x17\xba\xb1b\xf8\xeeg)8\'\xb15\xc9\xd3\xb1\x0c\x8b\xbfK\xbb\xc7qo\xaf~\x10A\xb7\r\x8c\xfb\xf8n\xeb\x02\x1a\xddN\x95\x8aQ\x1f\x17l"\xa0}\xe86\x14\xa5}\x16\x86\x89p?\xf2\x82\xed\x89\xfa\x98\x9b\xd2\xed\xf5\x0c\x19\xc9\xd0\xca*\xc9\x17\xd9y\xe8:\xa7T"G^\xb4~\xe7\xac\x10\x0f^\xae\xbf[\x13\x83T~B\t\x03I:\xb7\x92O\xa16\x85a\xfdi\xa0\xd7\x06N\xe8\xffK\x07\xc9\xcd\xd9D\xac\xc4i\x7f\xf1T\x0f\xc4%}\xd9\xaa\xa7\x19\xdde\x0f\x93"J\xfef\x99\xfb\x0e\x89!=\xf9K\x0b3Q\xa0h4\x9c\x99}x}\xd6\xc1Z\xf8\xab\x99\xc3\xe8J\x8c\t\xddl\xf9\xba\x1e\x9c_\xee\xd2c(\xb17\xe6\x00\x1f\xa3\xa5&\x00\xd7`\xb2\xa4\xf2\xf4\x8d\xcbM>\xe74|\x8a\xbax\xb2\xee\'7\xe7\xf7Ng\xd8q\xe9\xea\xf8\xdf\x9cg\xc6\xf7\x8c=\xdfK\xd8M\x07\x01iS\x9b\x1c\xa4\x1b\x07&\xd6\x1c\x8fOO\x93\xa3\xa5\xd0f\xaeI\x84v\\\xae$\x0e\x01\x0f\xd9\xe6\x1c\xe7\x07\x9e,\x08[-\x06\x1d\xff>\xc4\xe7X\xa8p\xfe\x8d]\x9f\x9cvb\x07\xbb4\xb1.\xa6\x0c[\xf4\xc8\x9d\xb9\xe6\xc6\xc2\xa9\xdbZ\xa4\x8f\x15;rL.\xe6\x91\x8f\x89<8\xa0H@\xe0\x97\xff\n\xc0^\x11U\x8c\xef\x8e\xecS\xf4\xb7\xab\xa4k\xd3\x90\nU\xc8C\xa4B\xd9]T\xda\r\x88\x0f\x98\x02`\x9e%,}Bs\x9c\x9e\xdd\x14\x9e@\x0478~5\xb1\xecZAI\nGjj#\xc7\x1e\xe9\xc7\xf2\xe3c{\xa4\xb2\xdb\xa9XR\xbe\xf1\xc6\xe0lV\x18\xc5 p\xc1\xb7\\\xa7\x8e8\x1eyFW\x9fP\xca,Vafz2\xfcP\xbc\xca\x83\xb1`3\x08\xa3Y\xc7\xb8\xbf\xfd6\x12`\xc4_%\t\xc7\xb7\xc86`\x12\xa8uq\xd1\xb2\xaf\xd5\xb8G\xc5\x15\x95\xa3Y\x85\x1a~\xc4\xb4\'\xb4J\x8cp\x06/\x93\x83\xbd\xf7\xd2\x87\xf0\x94\xd5]2\xea\xb6\xee\xf3\xbbS7K\x96R\x1a\xe3_q\xd8\xb3\x14\xaa\x04\xa3\xe6?h\x16>\xd0J|\x02]\xd9\xfa;\xd5\x9ei\x1fK\x1d3\x9a\x03^\x9b\xcf\xd8\xc8n\x00\xdd\xf8\x84R\x95\x909(\xa9w&4\xa4\x04\xddM\xd8\x08~b\x19#\xcf\x00:\xee\x8d\xcc\x9aO\x8d\xfaO\x9f\xd8]C\x7f\xae\xdd\xed\xe6\xae\xf4\xbeOL\x81\x9dlo\xaaq\xbaR\x9a\xd2\x89\x97M\\\xbd\xed\x8f\xd5\xa0)\xd9l\xfa\xbf^\xeeeR\xec4\xc8\xd9?|\x9e\xbb\xcfyL\xa9\xc8\x18\x83\x9fU\x86\xda\xdb\x0e*\x97\xcc\xb2\xc5p(\xab\xd6\nl\xdd\x1e\x91_\xbd3\xb0J?+\xd2\x9eXiAE\x16\xf3\xa3\xf3\xabU\x06K\x8d\xd5u\xdd\x1dXeY\xa6\x9c\xf1\xeez\xac\xff]+\x00\xac\xdfv\xb7\xd4\xd0;\xb02\x96c\x88\xf9Z8\xdd^$\r\x1f\xd0\xf2\x14\xad\xa3\xa8\x9c\xd3\xfe\xb0\xea\x7f\xa9Hy1\xd8\xea\xf9`\xc9\xe5dq\x9c\xd7\xc3\x00\xa1\xe0\xf3\x93\x0e\xeb\r\xdf\x99?\xbc\xdcu\x8c\x99\x9e\xebks\x06n\x9cY\xce\x9f|7EGp6\xa3\x03\xa3?L\x1c\xb1\xda\rx\xae\x7f\x12\x87QdP\x0f\xa0X\xda\x01\x8f\x96*r\x1cFPV\xf7\xcfI\x93P\x8fP\x82\xdc`xz\xa1L\x14\x07\xb0@M\x8b\x92\xac0\x9b\x1e\xb6\xfeE\xab\xc4\x06\xf2*bJV\xd5\n\x93G\xdcG#\xaf\xdbI\xac\x11\x18X\xf1\x0c\xed\x98\xb1\\G"\xa7.\xa9{\x8f\xdcub\x0c\x92\xad\xa1\xd4#U\r\xb1I\xebYO\xa4\x9aH\x97\x0bj\xdf\x8b3U\x81\x0b\xb1+\xe3\x03p?R"\x89F3\x9c8\x0f\xe4\xf6\xa8K-\xe0\xf0\xf0\xd1\x1f\xb8B\xecQ\xc3\x1ea\xbf\xaa\x05-\tQ\x1f\xeem\x7f%Z\x99\xcd$/\xce\xc9\xc8/q7Q,=5\xa4\xcfUr\x9a\xa7\x9a\x11\xf12\x87\x1d/\x96\xb8\x84\xd4\xf4\xd0\xc8\x9d\xea\xb6[c\x90\x1f,+\xfcgP\\\xce\xa7a\x03\x15\xb0Lt\x97\xff\xaf\xa2\xfaM\xa7\xd6\x9e\xe3\xb9G\x9f\xfa\x99\xbb\x9e\xefV}\xbc\xacx|\xf2\x00\x85\xea\xfe3?~\xdd\xf9q\xfaQ](\xd71-\xd5c$\x85%\xc5\xda*\x99\r\x91\xd7\xb6P1\xf4p\xff\x8c\x9a3in\x96\x02>\x84\xf2\x08\xbfal/+Gom\x06\xdf\xfcq\x8c\xc8G\xe4\xcb\xd6r\xbe*\x1c\x9f\x94\xcc\xeb\x10\x05\xd7\xad\x12 \xaf\x92`\xe8\x06\x8d\xd1\x15\xa8\x12\x08\xdb\'}\x97\x93\xd2\x07\x80\xaa\xb6y\xda\x05\x0b\xb5D\xcd\x92X\xd3F\x11\xa2\xa0<\x8ez+Q\x9bN{\xdd\xf6\xf6\xfa\xd8eO\xd3\xca\xa0\xa6\x9d\xcd\x97\xa2)\x08\xbec\xf04\xe0\x87U\xf2\xdfM\x14r\xa2A8%\xc1_\x9b5\x9b`\x81>E"\xba\xf1f\x9a\xc0cRP\xc8FEr}r4u>\xcb|Rfh\xc7T\x136\x06\xdcD-\x9d\xf4\x19\xc6\x80\x8bv\xad\x02\xc1U\x08\xcd\xf5\xa0\xb4\xcf\x03\xffj\xe5\x8a\x074\xa6\xcb\x08[Q\xc4z\xe1\xc1fx\t\t\x1f0\xc4\x06\x0b\xfd\x7f\xe6Qn\xa0\xd1P\x11;\x9a\x13#3\x10\x9e\x98L\xfaU%\x8e\x83\xae%f\x99\x0e\xff\x98\xbf|yB\xf64Dx\x90\x04\'\xf1\xcb\xdd\x1c\x06\xfb\xa3ax\xa3g\x12\xe0eS\xc8\x86\xec\xfbA8\xcb\x0fj\xc3\x9b6*\xc4\x00\xc7\xd3\x89\xf5\xfa`\xba\xcc\xe4\x19\x06\xfb\xf4\x16\x10F\xbc\xfc\xad\x8a\xd4\xe5\xe9\xa8\xadu\x1b9$\xf7\xcf\xba]\x84\'be2zK\xe9\x86dy\x18K"b\xbd\x83A>\xfe\x0f\xc2\xf0\xdc-\xb5n\xde\x17zW\x06\xc5\x1f,\xb85\xf18\xd0-\x90\x95\x13\xc7b\xb7\x0b\xb5p\xf6\x13\x85~\x81f.\xc46\xf93\xab\xa5?LlT\x9b\x8f\xed\xb8\xe5\x0b\xd7A\xfdG\x8b(\x97\x99/~\x8e\xbd\x02h\xb1\xf1\xe7\xfe\xb3%\x11\xaf\xbb\xd7R\xb9\x01\x1b\x0c\x98,\xdb&\xb3s4\xff\x14\xc5l<7\xc7\x84\xb8\xb8;\xa1\xf0\x84\x85\xc3\xa1@\xcd\x89\xdc\xb6\xee\xf8\xc8Aua\xd6\x8f\xe8F\x8b\xe4#\xdcuO\x87\xc3vA\xa3\xb6z\xef\xcd\x1fcSZ\x11\xb3\xa9\xc15?\xb6\xd9\x86\xe4\x9f\xd2l\xa7M\xcc\xd7\x821\\\xa3\xd8>%\x88\xc54\xdd\x99\xa9\xaa\x1c\x15\x845\xebp\x99\xc8\xc1\x1a\xc9{P&\xc0%\x9evmy\xb0Y\xe7%\xd9\xeb\x9f<\xe0\xc9\x1a`\xe0\xdc\x82\xaa\x05\xa7-\x0b\x86:\xb6\xff25\xa1\xf3\xe3\xb3\xfc\xc9\x96\x8a\xd0)\xb2\xfc\x8f$\xe7\xab\xcf?Ts,e\x0eX\xe1(5\x8d\xfe\xc4\xfb\x92<\x18\x9e\xe3\x18]%\x07}\xe6\x00\xfe\x12E\xff\x0b\xdao\xecS\'J\xab\rP\xbc\xa8\x0e$_\xf2\x1e\xb4\xd7\x82\xfa\xe3t\x05\x08\xee:\x1b\'\xf2\x04\xb1\x12\xaa\x1fZBa\x89!\xd7L5\x0f\x08O\xf3\x00\xad\xb3\xb6\x07\xf1\xa0?-]\x92\xce\xe8\xa2[6MQ\xe2\xec\xe5\x86g]b&[}\xd1l\xf9\xcd\xf4;\x05\xae\xd0{\xb8\x8a|\x0cS\x97\xc1\xd0{\xff\x8e%\x86\xae\xb2\x0fx\x9d\xee\nF\xb0\xb5h\x95Z\rv\xaf\xbe-\xfa\x81\xe3\xa7[\xf8\xc1\xc3>)\xbb\xe6\xa5\xb3-\xca\xa76\x8aj\x17\xcf\xb6\xbf\xbd\xb3\x9df\xf7\xb9\xc5\x8b\x88\xb8\xae+\xe8\x9c\r\xf1U~\x1aG\xcfq\xda|\xfe\xca\x90\x85\x04\xed3\x8b/\xd0\xf2\xb7d\xb1\xa3\xe5*5\xa6\xb6\xd0\x91\xfc*\xb3\x0c\xd8\xba\xa8\x025\x95\xd6o\xe2\xd0\x1c\xc2Q\xfe\xb0\xdd\x8f\xcckS3\xa8J\x86r\x1a\xda\xf8\xe0F\xaa~\xb5)\x14\xbc\x05v\xa2$\xc3\xc4duZx\r9O&\x15k\x08\xc6\xbaN\x10\xfc\xd5\xb5\xa7J\xc5\x8bT/\x1d\xc6H\x04\xef\x92(~\xb5\xbfbDu3\x1a\x02\xa0+\xbc\x96\xf3\x05\xc2\xf0o\x06\xd9\x96\xc6i\xfc\xe6b\xb1\x16\x01\xd8S\xde\x89\x91\x8ap[x\xfew\xffF\\\xbf4\xef\x89\xdb\x91)7\x9a\xd6\xbb\xc8;\x8e\xce\\\x00,\xffg*\x16\xd6G\xc6\xff\x17\x96\xa7\xd1M\xbe\xa9\x11-\xb9\x9a\xb4\x99w2\xee\xd1\x93\xae\x90\xcb\xadhOm\xec\xc0\x98\xa3gu)\x98E*3\xc4\xea\xd5\x93Gf.\xc8\xa9\x1fT\xb3Q\x01a\x00g\xb3?\x15\xe2\x8eI\x01\xe5\xd2\xc0a\xcc\xb4\x9fY\xc5=\xf9\xf5L\xc8\xf2s\x02\xe3{C\xc9\xd7\xe1Bt\xfa\xf5-Y\x84\xf2\xcagXx\xc3W\xba\x93M/\x8dh:\x01\xe9\xd7rmVe\x9a\x9emh\xa7\x86\xd5\xf2\xfb\xbf\x98\x1bd\x00\x93\xcb7\xbd0\xdc\x8a\xf3\xe6\rD\x1d8x\x80\xa9\x0f\x03TO\xe6\xaa\xa7\x9a\x96\xa9C|\x19a\xf6\x8df\xad\xfe\xfa\xa85\xae\x0f|\xedK\xbe\xec\xfc\xd7"t\x0e\xad\xc7\xc9\x14\x99\xb5\xd2n^@\xba\x81\xaa\x03\x12^W\x03\x1e\xdeL!;\x9f\xb9B\x84\x97\xe8\x85\x87\xe4N\xd0\x9de{t\xc2\xc7\xe8\x15\xe4\xd3\xe4\xb7hz#\xc4)Q\xfc\x11;9\xcb\xc3A?\x7f\xf7E~ZL\x9b\xdb\xcc\xf1\x03h\xce\xc8\xb0\xacEf\x05\xcb-\x8c\x8b\xc5\xc6\xef\x9e4\x9f\x10iyC\xa3\xda\xa9\xb1\xc0\xdc\x86\x8f\x86P\x98\xdd\x86\xb6\x1f\x98i\xf7\xb4\xcd0\xc6\x93[\x0bt\xfe\xed\xcf\x08/\xb2\xf8\x9b\xe2%\x0c\xaeinCV\xd7#0\x02\x92S\xa9.L\x82?\x80\xf8\xdf><(\xa2\xde\xd9\xde\xaf\xe0\x8b\\\x06\x92}YD\xd1v\x16d\xdb\x8fDVEP\x8d\x13\xcc\xbb\x8d\xe8\x9a\x0e\x16s~X\x1e\xe9\xacg\xa3\xe2_\xb7s\xbcP\xdbe\xc2\x89\x14!/\x1e\xfc\x13\x8a8\x81\xd1\x03\x03E\nd\xca\x86\xc2\x89\xc7G\xc9\xcb\xf3\x1d\xa2\xef%\xa8\xb9\xffbZ\xb8\xc1\xdd\x88\x90\xd8')
4
- #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
1
+ from flask_admin.contrib import sqla
2
+ from hiddifypanel.panel.database import db
3
+ from wtforms.validators import Regexp
4
+ from hiddifypanel.models import *
5
+ from wtforms.validators import Regexp, ValidationError
6
+ from .adminlte import AdminLTEModelView
7
+ from flask_babelex import gettext as __
8
+ from flask_babelex import lazy_gettext as _
9
+ from hiddifypanel.panel import hiddify,hiddify_api,cf_api
10
+ from flask import Markup
11
+ from flask import Flask,g
12
+ from flask_sqlalchemy import SQLAlchemy
13
+ from flask_admin import Admin
14
+ from flask_admin.contrib.sqla import ModelView
15
+ from wtforms import SelectMultipleField
16
+
17
+
18
+ from wtforms.widgets import ListWidget, CheckboxInput
19
+ from sqlalchemy.orm import backref
20
+ # Define a custom field type for the related domains
21
+ from flask_admin.form.fields import Select2TagsField,Select2Field
22
+
23
+
24
+
25
+ class DomainAdmin(AdminLTEModelView):
26
+ column_hide_backrefs = False
27
+
28
+ list_template = 'model/domain_list.html'
29
+ # edit_modal = True
30
+ # form_overrides = {'work_with': Select2Field}
31
+ form_widget_args = {
32
+ 'description': {
33
+ 'rows': 100,
34
+ 'style': 'font-family: monospace; direction:ltr'
35
+ }
36
+ }
37
+ column_descriptions = dict(
38
+ domain=_("domain.description"),
39
+ mode=_("Direct mode means you want to use your server directly (for usual use), CDN means that you use your server on behind of a CDN provider."),
40
+ cdn_ip=_("config.cdn_forced_host.description"),
41
+ show_domains=_('You can select the configs with which domains show be shown in the user area. If you select all, automatically, all the new domains will be added for each users.'),
42
+ alias=_('The name shown in the configs for this domain.')
43
+ )
44
+
45
+ # create_modal = True
46
+ can_export = False
47
+ form_widget_args={'show_domains':{'class':'form-control ltr'}}
48
+ form_args = {
49
+
50
+ 'domain': {
51
+ 'validators': [Regexp(r'^(\*\.)?([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$', message=__("Should be a valid domain"))]
52
+ },
53
+ "cdn_ip": {
54
+ 'validators': [Regexp(r"(((((25[0-5]|(2[0-4]|1\d|[1-9]|)\d).){3}(25[0-5]|(2[0-4]|1\d|[1-9]|)\d))|^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,}))[ \t\n,;]*\w{3}[ \t\n,;]*)*", message=__("Invalid IP or domain"))]
55
+ }
56
+ }
57
+ column_list = ["domain", "mode","alias", "domain_ip", "cdn_ip"]
58
+ # column_editable_list=["domain"]
59
+ # column_filters=["domain","mode"]
60
+ # form_excluded_columns=['work_with']
61
+ column_searchable_list = ["domain", "mode"]
62
+ column_labels = {
63
+ "domain": _("domain.domain"),
64
+ "mode": _("domain.mode"),
65
+ "cdn_ip": _("config.cdn_forced_host.label"),
66
+ 'domain_ip': _('domain.ip'),
67
+ 'show_domains':_('Show Domains'),
68
+ 'alias':_('Alias')
69
+ }
70
+
71
+ form_columns=['domain','alias','mode','cdn_ip','show_domains']
72
+
73
+ def _domain_admin_link(view, context, model, name):
74
+ if model.mode==DomainType.fake:
75
+ return Markup(f"<span class='badge'>{model.domain}</span>")
76
+ admin_link = f'https://{model.domain}{hiddify.get_admin_path()}'
77
+ return Markup(f'<div class="btn-group"><a href="{admin_link}" class="btn btn-xs btn-secondary">'+_("admin link")+f'</a><a href="{admin_link}" class="btn btn-xs btn-info ltr" target="_blank">{model.domain}</a></div>')
78
+
79
+ def _domain_ip(view, context, model, name):
80
+ dip = hiddify.get_domain_ip(model.domain)
81
+ myip = hiddify.get_ip(4)
82
+ if myip == dip and model.mode == DomainType.direct:
83
+ badge_type = ''
84
+ elif dip and model.mode != DomainType.direct and myip != dip:
85
+ badge_type = 'warning'
86
+ else:
87
+ badge_type = 'danger'
88
+ return Markup(f'<span class="badge badge-{badge_type}">{dip}</span>')
89
+ column_formatters = {
90
+ 'domain_ip': _domain_ip,
91
+ 'domain': _domain_admin_link
92
+ }
93
+
94
+ def search_placeholder(self):
95
+ return f"{_('search')} {_('domain.domain')} {_('domain.mode')}"
96
+
97
+ # def on_form_prefill(self, form, id):
98
+ # Get the Domain object being edited
99
+ # domain = self.session.query(Domain).get(id)
100
+
101
+ # Pre-select the related domains in the checkbox list
102
+ # form.show_domains = [d.id for d in Domain.query.all()]
103
+
104
+
105
+ def on_model_change(self, form, model, is_created):
106
+ model.domain = model.domain.lower()
107
+ configs = get_hconfigs()
108
+ for c in configs:
109
+ if "domain" in c and ConfigEnum.decoy_domain != c:
110
+ if model.domain == configs[c]:
111
+ raise ValidationError(
112
+ _("You have used this domain in: ")+_(f"config.{c}.label"))
113
+ myip = hiddify.get_ip(4)
114
+
115
+ if "*" in model.domain and model.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
116
+ raise ValidationError(
117
+ _("Domain can not be resolved! there is a problem in your domain"))
118
+
119
+
120
+ skip_check="*" in model.domain
121
+ if hconfig(ConfigEnum.cloudflare):
122
+ try:
123
+ if model.mode==DomainType.direct:
124
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=False)
125
+ elif model.mode==DomainType.cdn or model.mode==DomainType.auto_cdn_ip:
126
+ cf_api.add_or_update_domain(model.domain, myip,"A",proxied=True)
127
+ skip_check=True
128
+ except Exception as e:
129
+ raise e
130
+ raise ValidationError(_("Can not connect to Cloudflare.")+f' {e}')
131
+ # elif model.mode==DomainType.auto_cdn_ip:
132
+
133
+ # raise ValidationError(_("You have to add your cloudflare api key to use this feature: "))
134
+
135
+
136
+
137
+
138
+ dip = hiddify.get_domain_ip(model.domain)
139
+ if not skip_check:
140
+ if dip == None :
141
+ raise ValidationError(
142
+ _("Domain can not be resolved! there is a problem in your domain"))
143
+
144
+
145
+ if model.mode == DomainType.direct and (myip != dip and dip != hiddify.get_ip(6)):
146
+ raise ValidationError(
147
+ _("Domain IP=%(domain_ip)s is not matched with your ip=%(server_ip)s which is required in direct mode", server_ip=myip, domain_ip=dip))
148
+
149
+ if dip == myip and model.mode in [DomainType.cdn, DomainType.relay, DomainType.fake,DomainType.auto_cdn_ip]:
150
+ raise ValidationError(
151
+ _("In CDN mode, Domain IP=%(domain_ip)s should be different to your ip=%(server_ip)s", server_ip=myip, domain_ip=dip))
152
+
153
+ # if model.mode in [DomainType.ss_faketls, DomainType.telegram_faketls]:
154
+ # if len(Domain.query.filter(Domain.mode==model.mode and Domain.id!=model.id).all())>0:
155
+ # ValidationError(f"another {model.mode} is exist")
156
+ model.domain = model.domain.lower()
157
+ if model.mode == DomainType.direct and model.cdn_ip:
158
+ raise ValidationError(
159
+ f"Specifying CDN IP is only valid for CDN mode")
160
+
161
+
162
+
163
+ if model.mode == DomainType.fake and not model.cdn_ip:
164
+ model.cdn_ip = myip
165
+
166
+ # if model.mode==DomainType.fake and model.cdn_ip!=myip:
167
+ # raise ValidationError(f"Specifying CDN IP is only valid for CDN mode")
168
+
169
+ # work_with_ids = form.work_with.data
170
+ # print(work_with_ids)
171
+ # # Update the many-to-many relationship
172
+ if len(model.show_domains)==Domain.query.count():
173
+ model.show_domains=[]
174
+ # if model.alias and not g.is_commercial:
175
+ # model.alias= "@hiddify "+model.alias
176
+ # model.work_with = self.session.query(Domain).filter(
177
+ # Domain.id.in_(work_with_ids)).all()
178
+ if is_created or not get_domain(model.domain) :
179
+ # return hiddify.reinstall_action(complete_install=False, domain_changed=True)
180
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
181
+
182
+ # def after_model_change(self,form, model, is_created):
183
+ # if model.show_domains.count==0:
184
+ # db.session.bulk_save_objects(ShowDomain(model.id,model.id))
185
+
186
+ def on_model_delete(self, model):
187
+ if len(Domain.query.all()) <= 1:
188
+ raise ValidationError(f"at least one domain should exist")
189
+ hiddify.flash_config_success(restart_mode='apply', domain_changed=True)
190
+ def after_model_delete(self, model):
191
+ if hconfig(ConfigEnum.parent_panel):
192
+ hiddify_api.sync_child_to_parent()
193
+ def after_model_change(self, form, model, is_created):
194
+ if hconfig(ConfigEnum.parent_panel):
195
+ hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
196
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product