hiddifypanel 3.0.0.dev63__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev65__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 (72) 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/templates/config.html +1 -1
  32. hiddifypanel/panel/admin/templates/proxy.html +2 -2
  33. hiddifypanel/panel/admin/websocket.py +9 -3
  34. hiddifypanel/panel/admin_2.py +33 -3
  35. hiddifypanel/panel/asset.py +17 -3
  36. hiddifypanel/panel/cf_api.py +35 -4
  37. hiddifypanel/panel/clean_ip.py +125 -3
  38. hiddifypanel/panel/cli.py +172 -3
  39. hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
  40. hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
  41. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
  42. hiddifypanel/panel/commercial/__init__.py +50 -4
  43. hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
  44. hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
  45. hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
  46. hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
  47. hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
  48. hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
  49. hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
  50. hiddifypanel/panel/common.py +98 -3
  51. hiddifypanel/panel/custom_widgets.py +71 -4
  52. hiddifypanel/panel/database.py +18 -3
  53. hiddifypanel/panel/hiddify.py +655 -4
  54. hiddifypanel/panel/hiddify_api.py +70 -3
  55. hiddifypanel/panel/init_db.py +393 -3
  56. hiddifypanel/panel/usage.py +85 -3
  57. hiddifypanel/panel/user/__init__.py +25 -4
  58. hiddifypanel/panel/user/link_maker.py +416 -3
  59. hiddifypanel/panel/user/templates/home/multi.html +1 -1
  60. hiddifypanel/panel/user/user.py +233 -3
  61. hiddifypanel/static/css/custom.css +11 -0
  62. hiddifypanel/templates/500.html +1 -1
  63. hiddifypanel/xray_api.py +109 -3
  64. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/METADATA +1 -1
  65. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/RECORD +69 -71
  66. hiddifypanel-3.0.0.dev65.dist-info/top_level.txt +1 -0
  67. hiddifypanel-3.0.0.dev63.dist-info/top_level.txt +0 -2
  68. pyarmor_runtime_000000/__init__.py +0 -4
  69. pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
  70. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/LICENSE +0 -0
  71. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/WHEEL +0 -0
  72. {hiddifypanel-3.0.0.dev63.dist-info → hiddifypanel-3.0.0.dev65.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,418 @@
1
- # 2023-04-08T15:11:13.944201
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\xfa1\x00\x00\x12\t\x04\x00\\\xba\xd3\xc0BN"\xe7\xe9\xc2\xed\xf5\xab\xcc[I\x00\x00\x00\x00\x00\x00\x00\x00\xd3\xb1<:\xf8\x90:\xc8kG\xce\xbet}\xd0\x8d\xb1e]\x16ip\x01NE\xe97\xa6\xf9\x89G\xbb\x0e\xaa\xb3\xbc\x14i\xd9\xceTe\x82\x1a5\x9fQt\xad%\xf8\x0c?F\xdd~\xe3\x8d5\xc6c(]\xc6\xe0,\xac\x04\xed\xfb\xe9\xf3G\\\xeb\xa1Y\xc4s\xb2\x1fs\x80\xd8\xb8\xf6\xf2D\xabN\x84\x05\xea\xad\xb4\xfa\xcaA%\x16\r#\x15t\xf9\xd8X\x0f<\x92\xf7\xff\x1d\xb7k(p\xb7\x9e\xa2\xb4\x19\xe8\xf9a\xbe\x88\xbbk\xaaN\x90&V\xdf\xfb|\x8f^dT4y\xc2\xe9H\xae\x89\x94\xd7\x08\xcd\x93X\x08\x87+9\xef\t\xf5\xcb\xeeE\x08<\xf2LxL\xa7\xbe\xce\xbe\xe5\x9f\x1e\xbd\xc8\xa5\x9b\x1a\xfa\x04\x9f\xfd\xe3\x86#i\xd1\x90\xed\xb9\xbb&T\xf9K\x90\xc8\xa7\xe8s\xad\xd0\xd6E\x0e\xfb\xde\xf4\xe4\xb1Oj2\xad\x92!s$\xa6\xdc\xe7\xac\xc0*wK\xcex\xff\xd02\xca\x1b\x7f\xf0\xa2R\xe3@\xde\x03B\x84\xeb6\x81\x16\x99H\xec\x02\xa9g|\x10\xf3\x96\xfa\xd5\xd0!o\x93\xcdQ-\xa6o\xec\x9d\x0c,\xef\xedR\x1f8\xae\xf5\x11\x9d\xbb\xf4\x1b?F\xa5I1\x92<+\xe1\x0c{\xceh\xbc\x91L\xbf\xc0?\x11\xa7T\xfay\xa9\xf9T/\xc2\xca\x9cG\xb1\t\x13\x1a\x13\x04\xf8\'p$o\xc6&\xb4\x17\x11\xb8_\xba\xfb\x02\x0c\xe1\xf5=\xffEP\x08\xa7\x8eiPd\xcc\x17\xa2wY\xd5\x94\x08\xd1I\xa3M,\xe7\xf6\x1e\t\x15\x89\x05\xed\xdeN\x1f\x8av{\xd8\x1d\x90\xaeMk\xad\x83\x82\xd0\xd2%\x18\x1e\xca\x7f\xacX\x93Q\x90c\xb3i\x901Hy\x18T\t}w\x83\xfck\xbb\xff\t\xe6\x0e\xf3q[n6\xbd\xd6\x1aV\xf9s\x00\x81\x0bM^\x1e%#\xd1>\xde\x9c\xcc>\x13\xcd\x80x\xcc\xccB\xe1\xa3\x9fU"\xf9e\x9c\xa4\xc9k>\xd0\x83+\xb3\xd0\x9c=\x11F\xdf\xe5=\xd6\t\x9c\x02?!\x87`p\xafT\x12\xfe\xa8\x0e\x90\xb7\xab\xd7[\xe3\xfe%\x15\xbc\xbd\x15\xe2g\xc6\xed\xcfnDm\xcaw\xa8=\xff:\x8c\xbc\x06\xbf\xb3\xc7\x14\xbd&\xf19R\xe5m.\x88#b\x05Zd\xca\xefk?v\x13V\xc3U\nt\xa9;\x90\x1b\xcfl\xc8/\x19g\xc7\x8a\xee\x8a\xc9\xa8\xfd\xfe\x8aT\xb1\xf7\x0e\xaa\xef\xb5\x808\xa7\x04g\xa2\x17\x92\xd9\x85\xf5\xb3\xea\x06l|\x8eox\xe3\xe3dp\xc0?\xf6U\xd8\xd3Q\x08\x8f\x88`\xb3\xc9\t\x8e7\xc8\xba\r\x94O`l\x8e\x1d_\x04\xc6\xb3\xe2\xe2=Y\xd0\xf6j\xabr\xa2l\x11n$"\xab\x1dVD\xf0\xc6\xd0\xb1\xc5\x08q^\xf2C\xc0\\g\x0c\x0f\xf2\x1c&q\x9f\x16e\xcd}.zr~\xffW\xf0 \xc5\x0eP\x01\xdb\x80\xde7Z\xb7\x0b\x15\xd0\x92\'<e[\x84\xe0\'hV=i\xb7\x8c\xf5Zg+g\xe7/\xbd\x92\x1e\x19`Wv\xc7\x88m\x08\x0fL3\x8e\xf2\xb7\r\xcf\x9ev|\xf5O\xdb\x90"\x1b\xa6\xfc\xb2E><\xac\xc7v\x97\xf5\xef\x17P\xd6\xf1\'\x13\x9f\x1f%#]\xad\x92\xa7^4\x1bq<\xfc\x08\x8a\xa8\xec")`3ux\x97\xf8\x80M\xe9\x8fc~\xb5y\x9a\x0f\xfc\x10\\\x80\xfa\xee\xb3\xfa\xe9+W\x11\xd5\xa7U\xca~\x8d\xb3\'\xb0l\x9aE\xbb\xb6s\xd2>ng7n\xd0,`vY\xd2\xf4O\x11\xc3;p\xc8\xd7\x14\xf4\xa1\x05\x86F\xcf\x08s\x99\x084\x17~@\xed\xb7\x87\xd7\x0e{<\x15\xde\x0b4\xcd!\xe4\ti\x88\x9a\x85\x9b\x04{\xb36\xf1Tos%\xae9\x17\x12Y\x88(\xf0p\xc4\xb5\xfb`d\xa3\xffi\xf4\x9f\xedbp\xfc\x9eG\x89\xe8\xb1\rw2\xf7k\xfb\xc3\x03}\x07\xfc\xb0~\xa3\x87\xe9M\x8c\xe7\xfack\xe7\xc2\xdb\xc3\r\xd3FK\x8b\x01\xd6\xdb\xb6P\x97\x86\x92\x8b{\x983O)|\x1c\xc8mMO\xf0\x87$a%\xf8\xfca\xf9\x899\x01h\x10\x1c8}\xa2\x10C/kS{\x11\xa8P\xe2\xa7\x85\x16\xd8t\xa7\xf3\xc1\xcb\xbd\xd7\x92\x13\xcfH\xb9+\x1e\xac\x17rM\xcbS\'K\xbc*\xc16\xe3\xdc|\x90\xeaj\x9b\x8d\x89\xcc\x9c*\x06"\xf5\xdd6T@CJX\x87\xd4\x8eU,\xf5\xec\xaf\tKt!\xcc\x8f\xc2\\\xbf8;\xb1\xd4\xa0^\x92\xba\xa5\r\xef3\xd1i\xa5\xdd\x91\xa5_\xb4#In\n\xe6\xf5\xf4\x1dM\xe9U\'?\x17\xdb\x01\nV\xd9\x7f1Vr).Q\xfd\x93\xadi\x82h#=\x02b\xb8\x0c\x8e\x01\x02V\x8e\x84i\xdcjK\xb2)+"qR)a\x9d^\x16q\x03\xc2\xc8^4\xf8\xfcs\x1d\x83"\xa1Y\xbe\xcdf\x18\x8bP\x0bU\xf0\xa6f\xfb\xcd\x94\xc5\xeb]\xbf\x9e\x8c\x95\\\xf7G\xb1\xeb\x1d0\xe5\xe5\xfa\xbc\x8a@\x9e(f\xf5\n\x81\x14\x96\xc3w\xc8+\x003\xadi\t\x015\x15,R\xf9{\xab\xafI,\xbfr\x13\x12\x91\xb7n\x0c\x90=r\x88\x80hLq\xce\'E`\x0b\xcfG\xef\x04/k\xef \xc7\x14y\xe0\xe1\xca@\xf8h\xed \xb8\x16kE\xa4\x80$\xacyg\xa9\xdc\xde!\x04\xac\x1b\xfa\xe3\xb8]\x9d\x0f*x\xc2Ux\xeaU\xe3\x12\xf0`\xbc\x95\xa1\x84T\xa2a\xa8\x97O\xdaO\xc6\xae\xd8\x1a\xc2\x9c\xf9\xec6\xd2\xc6\xef\xe3\xa8\x86\x0e\xed\xeb\xc0\xb6];\xb5\x93r\x07\xbc\xa0\x07\xfe\x19\xd5\xdaX\xf3{\x12N\xcb\xa5\xa13G$K\xec\xb5ay<\xede\xc4(<E\xa1\x1eI\x82w;IB\x05\x0f\x9c|\xe5\xbe(0cv\xfd\xbc\n\x89/f\xa2\xceYh!\xc0qqB\xc9\xd0)\'\xb4,\x1d\xca\xa8\x91$H|Y\x0f|\xa0K\n\xa7l\x9d\xc1\xd4\xde\xc6\xa8\xdaaP+\xf1\xf3\t\xa08k\xfb\xa8\xab^\x9c\xf2\x19WB&\xbe\xcc\xeba\x03\xa6\xdew\x1bkr\xa8\x82\x0cCxY\x96\x02\x86\x03S\xf7i\x05\xd6\x1fhO\xc0E\x1e.<\xd4\xb9VY\x13\xac\xad)7\xb0\x84y]\x17\x12<\x04D\xe1\x7f\xbb#\xa5\xff\xe7\x8cj\x95N\x01\x162\xc9\x8d\xf6zA\xc3\xb9\xa7R\xe5\xdet\xddu\xe5\x93\xc1J\xc7\xac\x1fu}\xeb\x995\xa1\x05\xddb\x14\x9aXH>\xf1\xa8\xea\x8f\x91\x98f\x17\x9e%18\x1a0\xaaz\x10\x95d\x169\x10N\x1c\xab\xb4-\xcb *k\xfb\xf6\xe1Ai{\xac\xfa1+\xbbs\x8a\xe1s\x83\xce\xc3\x9b\x0e\xc0\x97\xe7\xdd3\x85U\xa1\x13\xa5H*CT\x86\xd8\x03\xd9Y;\xda\xb1\x85\xcd\x15\x12\xa9\x15\xaf\xa2+\x04\x92\xda\xd9^\\OeLq\xa0[;\xb3\x88T2\x11KV\xac\x8f\xbaX]\x82\x17\xc4yc\xec<v\xf8Btsj\x822/2H\xa7\x82\xdc\xff\xdc\xa3\xa1\x84\xc9\xf2\xcb\xe8g\x0f\xcc\xa7\x1c\xca\xa8]\xcb\xda\xa7\xe4\xeb\x15\xda\x05\xbb\xd6\x0b\xee;&\x87\xf6\xe2\xc9\xdb\x04 \xa7\x1d65\x01s\xfc\xd9\xd7"\xc7\xb3\xf2\xd0\x92\x113\x01\xe3t\x80(\xb2\xcf\x13\x0f\x8b\xac\nW\xd0\xf42\xb3\xd0\xfe,~n\xb7\xe2\x00X\xfe\xfd\x93>X\xa9\x1d=3;\x98c\x1a\xf3"\x17u\x7f\xd0\x9a@\x11\'\xb6\x04\xc50@\t\x95\x16Z\x8e#\x89\xb2&d\\\xcc\xbd\xe9w\x12\'\xb6\xd8h\x8e*&\xe7)\x16\xbb\xcd\x94\x1d\xc2EP\xa9vIJ\xa1\xbe\xf3\xc4\x9f\xfd\xc7C\xfck\x04\xf3@F\xdc\xf5\x88r\x89\xe1\xbd\xa7\xd1\xb2z\x8a\xc6\xa8n)6R&\xd4|\xa5Sg&m\xeeR\xd2\xb3\x9a\x10\xba\x97P\xdf\xd8\xd6\xcd\x00%V\xab\xaa\x8f\xa5\xbcN\x99O\xf7\xb9\xce\xb3v\xb4\xd9x\xaed\x1c\xf1\'Q"\x1b\xd0\xd1q\x02HJ\xfe\x0f\x96\xef&\x12\x14\xd8\xd1rT\xe2|EI\x1fN|y\x98\x7f\xc7\xf1\xf9\xc1\xacCo\xba\x90W\xb7\xecD\xf3*>ub\xce*\xf9!\x7f\xb2\x9a\x9c\x80\x8a\xf7\x07\xcb\x03\x11\xb7\x182\xe4\x98\xd1\xa2#=\xf8}vXL\xf1\x9aL\xc7hN\x96/\xebVa(\'\x87[\' \xa8\xe0\x90\x1a\x08\t\x1b\xe9p\xb1\xb7&K\xa4\xfbmS\x05Oi?\x13/l\xb3\xf9:\xf08Z\xbf\xdf\'\x96\xa31\xdbC\xbc\xa1)i\x02\x03\xd1\x98\x90\x00\xceO|\xff\xb6q\x8f\xf2\xf3Q\x1c\x11\xd6\x14#\x1d\xbf\xc3\x9c\x08\xfd@\xe3\xa8\xb9\xb8h\xa2\xfa\x19\x8bj\x1b\xe1\x80\x15Y\xf1,\x142\xe2\xf97\xed\xe7x\xe7\xc5\x15\x1c\x05*\x9a\x0b4\xcbB\x86\x8fd\xfa\r\xe8\xfbT1_\xe9\xcb\xe6h\xb7\xca)<\xa4\xe1\xe7+I!Af_\xa8\x1a\xd50\x82\x80(\xfa\xb8\xbdQ\tU\x19\x11\xb2\xbflQ\xdd\xf3CV7\x81\xe9\x16S\xb9h\xf5d\xe5\xcc\xc6o\xa7\x19&\xfd}\x93i\x19x\xb9\xb1\xda\x93\xd8CY\xe0\xc3i\xe9\xf3\x8b\rc\xde\xec{\x80\xc4\t\xf5\xd8p\x1b\x1f\xe4\x96!\xa6\xacl\xe3\t{/\xe1\x1eO\xce\xf6\x9c\x8d\xea\xf6HFIh\x95\x96@QB\x8f\x9fNf\xe9\xb9\x116\x80\xe6}\xf0U]\xbe9CS\xe1\x87\xb7>\x1e\xbb\xf5x\x1dk\xdf\x93\xc2\xd7\x95k\xf0{68\x83\xc3\xbf\'\xe7?v\xc3\x98\xde\xec\x9e\nJ\x1aG\x13j\x86\xcb\xc0\x84\x92O\xb5\x9cV\xa7\xb4i\xc5N\xb8\xd4\xb7\xea\x8c54\\\x9bIpN\x9f\xc1\x8e\xb8!G\xed\x1e_\xe6\x08\xb8f4O#\xb2\xb6v\xefyj2hL\'U\xca\xa9C\xba!g\x83\xf0\xd8z\xccX\x95 \xc1\xce\xf0\'D\x99\xafA\xcb\xce\r\x86\xd8\x1f\xac\xcc[\xf7\x0c\xc7\x92\x03\'\xb6\xab\xf4\xac\x8erO.\xe2\xa1\xc3\xea\x87q\x1a\x9bh*\xfa\x9f\xbd\r\xb1\xf6\xd8\x99\x0f#Qo|\xee\x07\xd4\xed\x0e\x91\x0f\x10\xe8\x15\xc7kd:\xab\xde|>\x81\xca\xcd)0\xb3\xc8\xc4v\xaa\x03\x90\xeb\xf3\x86\x1c\xae\xc8\xf1a\xc7\x8a\x14W\xeb\x16\x80\x1e\x12\x19\xf9\x0cY\xa9\x06\xb9\xacV?1e\xce\x00\xf7\xc3E\x85&\xeb\xf9c)\xb3\xaeR\xf6\xac\x13[\x0cg\\\xca\xe1\xe6\xc7\x14\x0fr\xf6BC|\xdb\xee\xe3\x1e\xcb!\n\xdd\x14\xafjF\xe5\x0c\xf2Ut\x99\xd2m\\a\x97\xa8]\xd2c\xd9d\x84\x83\x03\xac"\xc2\x00\x7f\x0b\xbd6_\xce\x8c]\xca_Cj\xb6\x08\xd8\xbf\x17a\xf1RyK1B[\xdagW\xaa\xd6\xbb\x16\x0eb\xcf\xf3\xca|\xa0\xf0\x0e4\xcdL\x88\x10\x84\x12v\xcc\x0fNw\x97y\x11y\x11u[\xa7h\xca\x11gg\xde\xffo1\xf4\x81\xf5:\x96\xc5I\x9c$\xc0"3\x8b\x82\xda\x91\xf8\xc3\x14\t\xdc\xe2qM\xd8\x066,\x83B\xa4\xde\xc4\xc1eX\x83\xefI\xe11]\xcb\x02\x7f`\xf7R}-R,\x1e\xbd+\xc5\x9b?!\x08s\x88\x06p\xe7z\xa38\x9d\xe5\x02a\xc8,I\\\xe16=\x89p\x03\xe5u\'\xca\xa5\x19\x17re\xfa\x05\x8e\x91h\xdc\xa8B\xba\xcbQFY\xa0\xe5Jp\xa8\xf4GV\x9a/n\x85\xebx\xb7\xd3\xc9\xf7\xb5\xbc\\\xd1\xcd\x08M\x064\xad\xa6\x0e\xcb\x0e\x1f\x0f\x01.\x9f\xe7\xaef\xfc\xb1\xfb$@p\x8a\xf8\xb9\xb5,\x0cJp\x81\xc2\x03CFqm\xe8\xde`\x8br\x12q\xe4\xf6P\xc6e\x89sm!\r\xc9\xbe\xdf\x019&\xe1>:\xa5\n]\xd7\xc7\xbd-i\xce\xc5\x98P\xe2@\x86\xa7\x8e\xa4\x05D\x1f\xa0O\xd4w6\xa4\xcc\xc8+\x88*\xc5.G\x90\xa3\xca+\xdd\x16\xac%;\x1d\xc9 \xc6m\xea\x002m\xdf\xf5\xe1v\xec\xed\xb0\xda\x98\x89\xba\x9a\x1clT4b\xbd\xf4}\xd7\x94\x16\xda\x8e\x1d\x1a\xd2\xce\xa4\xfcv\x84\x1d\xe1y\xa0\x06\x93:\x19s\xb3\xd8\x12\x1d\xda\x82\xab0\x8af\x8cz#\xcb\xb7\xd3\x81V\x92\x03\xc7$\x81\xb9\'\xfa\x13~\x9a\xc9\x9d\xb6\x9e\xdc[\xff\x03\xc7\xc9\x15p\xd7d\xd7\x1b\x91\xf4\xe0\x15v\x88\x06F%\x932\x1a\xb5\xaa\xec\xb5:\xee\xd0\xfc\x10\xd9\x92$O\xd8\xf3\x83@\xc9\x12E\x89GO\xac\xe3G\xb6\xdd*e\x80d\xe2\x8a\x83\x0c\x89\x86fbo\xe1\xc4F7\xf2\x17g\x8c\xa6"9>\xb4\xb0\r%\x15^\x83@x\xe6\x163(\xd3(\xe9\xc0`\xdb\xd9\x81I?a?Cp,\x12\x9bAI\x9eF^\xa7y\x12I\xf5\xd3\xb1j\x12&2\x96\x0f\x02\x9e]$E\x93\t\x03\x0f\xce\xd2G\xe8\x89\x10\xc9\xa7\x86\xcb_\xaf\xf8?\xa3W\xdd\xb8\x03c\xdf\xact\xceY\x19g\xf0\x92k\xc5\x11]\xd0\xc5\x82]\xce\x0eQ\xcbr\xecN\xd1\x1e{\x88:\x1an\x03\xbeB\x1dT\x96\xe7\x80\xe5y(2iV\xa8A:\xb5\xef3\xa9=\xee\x7f\xacBQ:\xbe\x01\xa0\x06}\xb2"\x05\\\xf2\xe8\x90=\x1c\xb3\xde\x9c\x87!\x15\xceC\xa2\xbe\xb1\x80\xe0A\x93\xe1\xf4\xa5\xe1\x80\xa1\x91gZ!\xb7^\x9f\xa3\xe5\xac\x12\x80\xa7b\x95\xac\xf2\xfa+\x15v\x00/\x16\xb1\x8a\x81\xef\xe2\x85\xf3\x0e\xcb\'\xcb\xcf\x87\x1a\xa6Hsp\x92\x84K\xe0\xb5Ys\x9b\x919\x93\xdd\xa7,\x9bq\xd1\xf7Z\x9f\x055\xdf\x99ye\x93\xb4x\x84nPG\xa0=\xc1m$\xa4\xe6\x11f\x9e\xda\xef\xe5\x8do\xa2\xb0\x9eDn\x87\x8b\xcbd\xd0u\xc03Oi\x89\xb7Yg\xa9\xaf\xf0\xb2\xb4\x01\x18m\xc50\xc0\xccdH\xb8\xf6B\xfd\x99\xfa \x8a\xe1\x9bF\xdf\x17\xe42>H]d[\xf5N\x0c\xa5\x9bs=\x96\xa11\xf7b\xf7\t\xbc)\xfd\xcbX\xa6\xebR\xb6\x99\xaf\xd4\xfan\x1ef_?\xfc\xdaL\x8eG\x8f\xa8\xd9>\xfa\x91bmL\xe7\xe9\x0c\xb7A\xc4$\xf4\xfa\xd5\xf5c\r8\xf23y\x96A\x89^:L\x83w\xac\x8a\xd6\xed*\xc5\x1a\xb2k\xb1\xc4\xa1`+\xcb\x08CeA\x9f6\xc7\xf1re\xb9\xbd\x14,%+\xd1+\xf0\xc3Z\xd4a\xa9#j:\x98b\x0c\xed\xa0I\x7fC\x90\x0b/O;\xb4\x8c\xd4\x070`\xec\xc1\xab\x97\xa2\xb4W?Au\x18{Q\xacCC\x99Et\x1e\x97\xf2\x06m\xbaS:\'\xfc\xea\xb3(f\x0f$\xe0w\xdce\x94\x0e\x1e0\x18\x1dN\xcf\x93\x1fR\xc5~\x1c\x13|L`\xd5\xb3\x966\xd7\x87\x96y\x93\xa1|\xe9\x14\xd9\x0b\xa4hd\x80\xde\xba\x0b\x9f\x00)\xcd\xd2"T\xb4\xb7\xbe\xafFF"\xc4\t\xe9\xb2\xd2\xd6\xbe\xa7:~\xe0\x8d\x1b\xa2MH\x8dGm\xaah\xff\xf3\xcc\xbf\x89\xf2\x89\x9d\x85\xef-\xfan\xaeR\xa3^\xb3[\x90\xae\xb3L\xf0\x0b\x14\xceSDym\xfa\xd2\x1cyy\xb4\xb7\xdd\xe0\x9dc\xca\xc7<\xa3\x1a\xf2-\x91\xbc\xa4\xec\x14\xfd!8\x14\x15N\x06\x01\x88R6\xd6\xb5\xc6\xb4\x83\xc0,\xa4\xe7\xb52\x8f\xd9l\xfe\xe7\x91\xfa\xde\x7f\xf4\x7f\x08n\x15c\xbc\xdeJ\xf1T\x88\xde\x96\xf1<\xf5\x878\xffu\x08\x83\xbc\x82\xd4dmDm \xb8\xa7\xdc2\xf6V\xe0D\xe6\x93\xf0\xc7%cK\xf4\xee\xbcjc\xebM\x9e\xff&*$\x18\xcb\x9a\x90F,,\x87I[\x9a@~\xa8\xab\x01\xf3LR\xaa\x19W\x9c\x9b\xf9\x17a\x17\x18\xc1\xec\x86{\xc1\xa6\xc0\x83\x06[\xeb(\xae\xf3\xc5"\x15\xfb\x08\x979F2\x98.(J\n\xca\xd5\xa1|\xcb\xdeM\x1e\xda6l\xd3$\xd1\x8c\x1d\x1a\xe3\x07\x12\x12\xbb\xd4C\x19\xde\tmx\x9fW\x14\x1e\xa2e\x94*\xa1i\x9eI\xbb:\xbeXT%\xe2\xed\xe4\xadJ\n/h\x0e\x9a\xe9\xa1\xb7i2&H\xdcadk\xbe\xe5\xce\xc7@\xeb\xd5\x19F\xb5\xe1@x\xfe\xca\x97j/\xb1I\xaf\xfc;\xca]\xf8r\'\x04\x02\x19y\xfe\xb9\xab\xfaL\x15\xc1\x9d\xb0\x96AM\x9b7\x84\xfd\x9d \x04S\r\x90\xba-\xd2\xdd5)\xa9\'\x93\x1b\x9e\xb9\x1f<D\xbb\x03\x1b\x9a\xf7|6a{\xfe\x99\xe9\xe6t3\x14\x0fW~G\x82\x9f[v\xc3\xea;[\xf1\xab\xf8\x1d^D\x93\x0es\xc8n\x0cr\xbby\xdf\xd5|\xfb\xb4\x98\xf8\xc5#\xa0\xd1\x92j\x14p\x88@\xf6rp!\xd8\x07\xf2\xdb\x1f\x03K[\xcd#o\x9c\xd9\t\xd9\xae\x15\xaf\x01\xa0\xf5\xd2\x11\x90\x1a$w$\xdb\x00\x03|sza\xc1a=P3.{\xe2\xd4]\xd69\x11v\xcf\xf1\x99\n\x19\xfeQ:R\x07y\xc9\xa6\xd5\x9c\x8eV\xf5\xa2\x18\xd9SL\xdf\x97\xa2.\xfe\xdc\x91\x06\x83*\xd7\x88y\xa1LZ\x08\xcd%CF\xa9\xd7\x0bb\x93\xc9\xd3c\x9cO\x8c\xce\x04\x99j\xeb.G\xb0\xb0\x91b\x00t\xdc\x9cy\x9d\xcc4(\xe6\xe3K\x10\xcc\x8c\xabw\xea\xfe\x86\xf4\x1b!\xac%\x8c\xbcMX<\t~\xa2\xef\x18\x87\x18\xbb\xe1$O\xeaE<\xd9\xe0\xd8\x9e\x845\xe6\x0e\x7f\x8a;,p&\xe8\x1b\xfa\xa4\xb7\xed\xe7u\x9c\xa4\'B\xf2\x9a\xff|:*-\x19(\xac\x98\x06\xf7z\xe7\x00\\j\xdf\xc3;MI\xc0<"6\xba\xe9h\xf1Twj\x98\t\x055\xdc\'fh\x8a\xc3\xe8\xa5)\x89\x7fal\xccA`\xf5p\x0ex,\xf4\x1d\xffa&J\x1dm\xc0\xef\xe6\x0f"B\x8fu|\xfd\x94\xa8P~>\x7fq\x05\x85@W\xb52u\x0fN\xee\xdeZ\xe2\xd7&)>\xa6\x96gU\x10{i\xf8\xfc\xabh\xe8ws\xf35\x11\xb8\xb7tP\x1c\x8b%\xa2\x80g\xc4U\xf9\xf5D\xc3\xf0\xec\x17\xf2\x01\x97N"O\x11\\f\x1a\xd9\xd2l\xaf\x88\x18\xaa9;\x90zNB\xe3\x82\xd7\xa6\x1ds`\x87\x81[\xbc\xe5\x1d\xdc03\x1b\x9c\xc8\xcd\xd0\x8d\xe6\xe8\x1b\xbd\x7f\xf3\xad\x08v!\xa2\xf1,\x97d;[\x84\x8aq\x14\x97\xc6\xfc\xa0{v\xf1\rM|\x83\xa0\xed\xe8\xac%\xe9LA@&\x99*\xab\xf9\xc7\xac\x89\xd8\xfc\xcaKF\xc8\xac\'\x11J\xdb\x0f1\xa6\x8at\xfb\x86\xb9D\xdf4\x82\xa4\x7f\\V\xca$\xcf\x8f\x9bl\x19\x1f<\x13\x98s\xb0\xc5\x93e\x8c\x8a\xbd6\x08\xd9\xd1\x08P\x07:\x06\x81\xa4\x00<\x91|\x97\x11\xcb\x12\xbf\xb2\x7fo87F6\xc46\xda&B\x97\x19\xda.(x\x8a\xa9z\xb224\xb0\xd8y\x8ehB\xb8\xa8\x94\x87hO\x1d\t\xd4~u2\xda\xac\x8d/\xc0#s\x03\xbc\x1c\xda\xf5\xab\xad\x81\x13\x99?\x83}r\x96\xa0\x1f\xdd\xb0[Cq*\x067.\x88\x01"o\x19\xc4\xf8\xba.rw\xbf\xf9\xe1\xea\xd1\xa0\xb1HI\xa4?\xee\xbcV\x91\xeaG\x88\x8a\xe3E\xb3\xa0\xb9"9\xe7\x99\x00\xc3W\x06\xdb\x8e{\x10_-\xaa\x18\t\xfb\x96m\xfb\x0b\x15\xe7\xf8\xcd\x98\xb4\x8f\x13rEE\xb7\'\xb9\x9f\x1a\xc2\t\x1eUdD\xfe\xd4ID}\xe7\x01\xbf\xb1\xff9.\x07\x9d$\x10\x14:\xe7\x9d\xd4\\:A@\xfdD\xe6\\\xc4\xdd\xb3&_e\xf8\xd9\xfat\x82j\xb9\x01\xc0\xe4!\xa2y\x11\xa7\xe1>k\xcad\xac\xea\xed(\xfdq\xf69\xe0r\xeac\x11b\xa4\xc5\xd2:\xf48\x9d\x9b\xb2{\xe4\xfcE\x9c49\xfbe\xebi\xe0\x19\xb7 \xb9#\x7f\xcb\x96/\x85\xa8c\xb0\xbb\x1a\xda\x81/\xc9\xe4>c4\xefW\x06,c\xb086\xde\xb64\x94g"\xb8\xe8\xc2\x10\xb6$>\x02e\xc1\xd46D\xac9\x19\xfc\x85\x8a\'\xa1\xe4\x90\xaa\xc6:\x96^\xcc\x02\xfc63\xcfY\xc8J\x0b\x82\xfd\xfe\xc6*\xf9\xd5z\xe2\xf2\xba9J\x1bk/\xedgZy\xd2\x08\x07W\xdck(\x13\xc1\xe9\xfd.:\x1ewWL\xe3\xddOet\xcd8\x87\x8e\x06\xa1\xc2Q\xcfK\xc0\xc6\xa8\x90\xef\xfd\xfd\x9a\x0e\xa5\x01}.]\xc0)\xe0\xb9\xc6\xee:\x8f\xc6\xde\x8d\xb9/\x05\x7fL\xfaY\xe7\xf9s\xca\xfd\xaf\x1eX\xbeR\xb0\xfbcu{T1\x0b/\xd0\xf4>I\xe3 P\rJ6\xe6^\xaf\xf7\xc5\xaa]4E\n\xa8\xc6\xd9\xb8\xdc\xb0\xeb\xf7\x08OS\xad\xd9\xad\xf9\x80\xbd\x18\x0f\xad\xc7\xa1S\xa9\x17\\e\xcc\xf1n\xd1S\x9d\x93\x9c\xb5B\x80\x03%]\xa5\xba\x1a*\x8f\xc9.@\xf9\xbb(\xfd\xeb7\xd4\x1c\xa7\xdd\x94.\xed]\xd8r\x08O\x97\xffV\xac\xfd\xc6\xba\x97\x1cS2\x98\xc7\x92s\x83\xc3%\x14\xec3p\x04\xc6+\x10Y3\xf0\x7f\x1c\xc1\x0cU\x136\xfbZ\xbaL\xa8W\xd1o#.^!\x95\x1a\xffh\x02\xea[&\tl\xdd\xcb\x85O\x91\x1a\xb4\xc8~D\r\xb7>\xc8D2\xec]\xf3\x86\xb4ca\x9c\x96\xf5y\x01G\xc2\xbc<\xc6;\xa9Z\xd4\x9a\xf2\x0bL\xa3+\xc5<\x06\xf2\x9a\xb2\xe8I\xad\\-\x83\x9d;FPu\xb3\xd8\x82\xf7@\xef\xe7\t\xbf0(\xfb\x0c\xd1=\x97\xdb\xb5\x7f\xaf\xd3PT\xbe\xc1J,\xdc\xea$\x87\xcc\x179r\xa9_\xdd\x083\x00\x82gf;\xf9\x12\x96\xc5_|Q\xbam\x81\xb3|n\x0e\xe6Lj\x96m\xbc\x1e\x91I\xa7\x1ch\xe4\xa0,H\xf0\xbf^\xf0\x94\x83\x0e\x18\x19<\x1e\xc6X[ \xc8\xafL\n\xd4\x952\x83Gl\x19[\xc7\x05\xbc\xd7\xb6}\xe2\xf6 \xd5\x8c\xf1\xde\xd6\x88\x8c\x8f{Q\x9c\xb4\xa8*\x8b\xe1\xcb\xe4X\x9f%^#\xa4\x14\x974\x1c\xa7\x1a\x93o\xeei5\xbb\xb9\xb1Q5\xb9\xc1\x9d\xca\xa8R7\xc9v\xa6\xac\xfdg95\x06\xaa\xb8_\x854\xc2z\xef`\xcf\xbc\x91CToJ\xbc\xb8y\x98\xdfS\xdaE\x1e$\xd3\x0157\x0eP\xc3G\xf5\ng|\xc7~}\xadB\x8bh\xeb}\xc2\x10\xd8H\xbe\x8e\x1e\x8a\x13\x9a\xa5"~x\xf8\xda\x9d\xd8\x10\xdd\xc2\xb68D\xe5\x06\xe7\xb8\x85\x95\xdf\x97\xc3\x81L\xce;\x13\xd2|as\xab\xe4\xf2\x05\xb7LU\xcf\xb2\xd9\xfbU:\xb5\xfd\xect\xdbn\xcf\xcfM\xa1\xe7\xbd\x99\xaa\xc5\x0c\xf4\x95\xd3\xcea\xc0\x94\\\xbf\x9d\x19Q\xf0N\xe1wkJ9\x87\xbc\xef\xd8\x19\x87\xe4<\xaf\xfa\'\xd3\x8a\xa1\xe6JC\x19\xa8\xbb!\xcdr\x00\x16\xd9c\xceG\xac\x0f\x06\xdf\n@\x0f\x08<\xd8u\xa6\x95\xd4\x80\x8a\xd3\x1e\'\x07\xe1\xd2\x9f!o\xafs \xa2\x1aES\xe8U\xf7\x877\x01aA\x9cX\r5t\x8d\x1d\x96&\x85|Zx(+J\xfb%i\xb6J;\xd1\x85\xc0v\xd6h\x06\xf5J\xc8\x7f\x99\x12\xf4\xd9\tM\x90\xb24\x16\xbc\xf1.\xbc\x0f]\xd5\xa6\xf3\xc1oG\xa7|\x90\xe3\xdb\xa6\xc7\xf7\xef\xda\xa7\x9f\x9d(\xf5B\xa5\xc8k\x05\xe9.\xb2=\xf4\xba\xf4\xc3K&\x95>v\x8d\xe4\xcfI=)\x15\x18\x81\x7f\xfa\x8a\xe4\xea\xec\x07\xf7n\x9a\x98l(\xa01e\x92\xe6\xfb\xdd\x0b\r\xc6\x1f\xbec\xdd\xcai`\xffX\xea\xa6\xb7\x0e-\\\xb69a\xc76\x83\xc4c\xc3\x03=\xd1\xf6"\xc4\x16\x10\xa9\xb3\x95s\xd3y\x14^45\xf4]\xb1\x1c<\xa9\x9e\xfe\x1b+;\xe9\x06\xec\xf4\n\x7f\xe0nr\x12\xe3=q\x87d\x7f\x85(;b\xfeL\x1b\x1e\xc4\xef\xd3\xef\x83:\xd5p\x03q\xb16\xe6\xe3\x8d\xe4\x06-\xda\xb1Y\xda\xa9\xfb\x08\xe5SN\xc6\xec\x00\xad\\\x19\xffA\xc8\x97\xb9\xe3BM\x81\x13\xd7|\r\x11\xd3\xaa\xb8SC?\x95\x8f\x19\x9f\x01\xafdQ\xa7s\xe4z\x12\xe8\xebe\x95\xca\x08\xcaT3\xc5\xdc]\x92\xc7Duz\x1a\xca\xcc\xc5\x06}\xcf5Y\xd2\xc9r\x14\xe6\xb9\xc7"\x85\xc6\xb7\xdc\x18\xc5Q)\xbcZJW\xe6fu\xf0\x1a`\x90\x82\x00\xa1\xd8\x8b\x04\x05\xb6A|\x06>@\x04E\x0e\x1fnlw\x86\xd1d\xee\xf0[{k\xe0C\xea\xe1\xc2\x85<\xeb@\x11\xa5\x10\xb5\xe9\x15\xc5\x97D\x82&\xe2\x88\x1e[\x14Q\n\x12\x9fp\xf3\x81o\xfb\xad*\x15\xadDp\x10\xc0\x01\xcb\xf9\x89~\xcd\x1f\x0f\x98\x05\xc0\xe3\x84:\\\xbcYq\x81\xe7,X\xcc\xfb\xedBxR8\x18\xf2)\x0c\xaa@b\x92\x9a\xefx\xa9\n.\xa9\xc8\xe3|T\xd6\xe0\xd4\x06\xbfB\x17!\nJ}\xa6\\6\xaa\xbc\xce\xba\xb7|&=4\xe1k\xa6\xd1\xcb\xa5\xa9\x12\xe5,\xf1\xc1e\xfc\xe9\x15\xd3\xcb\x95vd\x8b\xe6\xb4\xc3\xbb\xf4\x11\x187\x9cp\xc0jU\x0f~O\xb0N\x00m7K1=\xdcQ\xec\x83\xe5J\xd9\xef\xc0u\xeam\xd9??F\x91UUa\xb3\x8a\x1dx\x16p\xb2\x1c{\xda\xad\x9d\xe3xo\'\xa5r\x8e\xcb\x11?K\x0f\x15\xba_o\xd9\x87\xa02\xd5\x14b\xabTP\xf2\x97\x1eGA\xba\xdc\x9b\xfdf\x10\xbb\xaaR\xb99W\xc3\xa2\xa8\xe3\xc1\xd44\xc4\x9f\xa0\x1c\xcc\x91\x06\xf6\x16\xfe\xd9\xbei\xe2G\xec\xb3\xf9UI\x07\x0e\xd4/\x95|\x95\xf1\x81bf\xd1\xd4\xb6IiX`\xbds\xcd\x91\xfbdHf\xbe\xab\xf3d\xb4K\xf8\x85\x11\x1f\x0b"\xdd\xce\x8bQn\x17W\xad\x82\x18dCi\x08\xb95\x9e\xb0\tC\xb3\x1a\x12Z\xff\xe9\xf69N\xefI"\xc6\x82\xf6\x99\x04L\x82%\x01\xbe\x1b}\nb\x87\xe6;%\x1ce%Y8\x88\x93\xda\xb4ap\xb6\x0e\n\xaa\x90\x9cO\xe5\xf2\xfd\xdf\xf3\n\xc8\xa3\x98\xf8\x17\xf5\xcdk\'\xef\xf2\xfea\xb56\x9f\x1b\x10`&]h\xd8\xe6\xc0VT\x94\xed\x96oB\x84\xd7\xd5\xe8C\x05\x90C&\xdc{\xa4\x00\x82\x8b\xc3\xbb\x84ffSl?\xdd\t\xfbMz\xceO\xf3q1\xf0WQ\xa7\xa7\x01\x1e\xc3\x90\xb9\x7f$\x18d`T\x9e\x02\xc1>1\x00\x8d\x99\x87O\x0c|t;>\x86\xbdVa\x8bF.\xc1\xa19\xc7\x0b\x99m\x8eaE>Z\xe5T\xc3\'\x85\xbeUV\x8b\xc6/\xb0\x9f-\xfd\xe2$\xfd\xee\x97<m\xdc\x93\x04\x93\xbfT\xba\xe9|\xe4p\x0c\xad\x9eH\x12s\xb7\x94aZ\xd7I\xf8j\x87\xaa\xbc/\xb1h\xda\xe0yj{}\xb4\xac{X)\xe4\xbb\xeb\x16!?)Zg\xbb\xc6\nY\x04\xc3\x17\x19\xc5\xa4]u\x83\x87\x13\x9e\x82\xbf\x7f\xa3\xa4\xd9\xff\xdc(\xb2\xbf\x08\x81u{L\xdeU\xd9,\xe9D\x9c\xfe\xce(?\xc6\x1e\xef6\xb1\xd7E\xbe\x15\x03\xdb\xf1\xa0\x04\xf9\x80\ns\xbe\x91\xdd\xbc\x87\xc3?8\x08~\xaf\x04I\x84\xae\xf5\x91\xbd\x84p\xdf\xc6\xf6\xeaw6z\xc4xB\x8di\xd6U\x19\xfb\xe2a\xc7\xad\xe7$:\x0fa\x10I\x85\xd4\x89\x9f\xd0G\xba\xac2\xca^\xde\x1a"6\x9ei\x86~\xf2]brSA\x7f\x8f$\xb6\xc0\xca\xd1M\xf5kF\xe0{\xed?\xad\xa5\xd1\x8d<\x00\x93$\x9d\xcfuI\x07\xf8\x85)\xb9\xd5H\x10\x98\x82Q\xfb\x92\x858\xb2\xf0\xcc\x98a\xe4\x86\xc9\x9e;CZ\x84s\x1c\xe39?B\xb7\xe5\xb3}\xbb\xbcr\xd4j\x8a\xee\xb2\xad\xef\xea\xb5\x01\xb8\x9d\x15\x14V\xf8\xef\xe2\x9f8\x9d\xd3#\xfb |I\xaco\xc7\x8a\n\x1d\x1c1\xe5\'\x9a\xbbd\xf9\x08\xfc\xae\xda\xb6\xcf\xce}\x96Gc\xbf\xf1\xdc\xbe\x82\x0e\x10\xfbJ\x87x`\x9dSb\x0e\x13\xe9W\x8e\xfe\xd4u\x07W\xc9\xed\xf9L5ZW\xbd\xdb\x9e6\xcd\xe2\x9a\x06#\xb7\xafrE8\xca\xcb\xcc9\x97\xa3B\x0e\xad?%\x12s:\xefq4\xcb\x0f\xe5\x8eS\xd76F\xf5\xe9\x88CNu\x10\xe2\xe5\xf0\xec\xa8@\x94k?\xdbz\x04OZ\xffq\x13\x1e8\xfb\xca\xa6l\xfbn\x7f\xdfo7Mqfx-`\x01\xea5\xff\x0e\xd0\x90!F\x97D#\xae\xcc@\xaa8\xe5\x1f\x82n\xfcT\xf6,\x10xNZ=\x1bcJ\x17}b\xc8\xee\x04N\xaf\xd6W\xff\xfa\xe5\xc0\xef\xd3\xdeHkIH\xae\x85l\x864\x96p\x0bcE9\xef\xd6\xb4\xe9\xe1\x05I\xcfl\x90\xb3 a?\xf5\x14\xb1\xd2A\xfb\x8d\xa3\xa1\x05\xa3\xe8\x0b\xb9\x12!\xf4u\xaf\t4eHv9R\xdfN\nn\x81\x0c:\x10eX\x94902G>"q\x8e}\xe35\x95\xd0\x9b\xba\x13eR\xa7\x1f\x17\xadq\xc4XO\x93\x8c\xe8\x8f\xef\x16\x8a\xab\xd0W~o\xde\x97W\xc7\x1c]\x1e\x86A\x94l]\xc8BL ?\xbec\x06\\\x1d\xa5\xf5\xa9\rC\x11\xe3.\xbc\x9a\x00+\xf7\n%O}\x1c4\xe6\x91^f4B\xa2\x02\xc7i/\xfd\x84\xab3\x10r\x8d\xf3\xb1\xf7\xe4p?`\xfb8\xee\x9d/\x05\xc5\xbf\xc6\x97\xa24\x8cey\xbchi\x9b\xc4\xe7\xd5\xa7\xe7W\x14zqVk\x1eH2\x94\x9aS\x1euE\x9b\xacQ\\Y\xd3bv\x01RJ\xd8\xd3w\xea\xf2\xda\x99\xb2\x11\xaa\x83\xe1c\r#\xd1>\x9bv\xfe\x1aMy\xbc\\\xbf\x89\xa8\xecR\x1eK\x18\xfe \xe2\x16\xc0\x11\xf3)f\xb3\x10\xdf!$\\.\x96S\x01L\x17\xa6:n\x99\xb0X\x1a\xae\xda\xb2^\x02p\xfd^\xdb/\xb5\xc7q0BPU\xa6\xd1R\x06\xcfF\xaa\xef\xdc\xb6\xdd\xa4\x90\xa2T\xb9d\xf9\x11\xc4\x03K\x02F\x19u\rc\xef3\xfbV\xd1\\\xdb\x19\x92\xeb\xa3;d\x02\x10f\xe2\xd9p\x08n\xd8\xdf5\x88U8\xd1\xfaM\xf1$E\xdf\x03\x96\xaf\x80\x80d\x16;\x02l\xd8\xfd\xf6\xaa\xdb\xc5<r\xb1\xa4\x86`.\x9cCDW\xb5!\xb6\xfbym\x16\xe4>\x87\xe9\xd7\x0b9}\xc0\xc8\xe0\xcf\xed\x1e\x15\x92\xcf\xba!a\x13\x0e*\xf6[$\xa3\xdfaL\x99\xa1R\xd5\n\x14+dg\xd0\xbf_}{<\xf5\x9b\x90\xac\x0c\x8a\xa1\x0f\xc7\xa8\xd1\x9b\xe0)\xfbX\x89\xf4\x02b6=(\xed(\xdfs<\xc1m(\x92`]\xae=^\x8e\x06X]x\xae\x04\xc5Ju\xb2e\x8e!7\x81\xbeJ\x81yB\xa94\xbe\xb8\xe9\x13i\xd4h/;*R\xdbH\xd0[\xa71\xff\x90\xf49s\x92+H\xdd\xc8@\'\x94m\xf1x9\x04i2\xe5lwU\x08\xcc\xe4\x00\xb2\xe6\xfdO\x1d3\xb5\xb2O\x1b*B\xb9kWIW\xad\x83\xa3\x85<\x1f\xc8\xaa\x1a\xbf\xadFrw\xd8F43*A\x9e!\x94\xdbX\xbd\x07\x98\xbe\xf3k"ow\x89_\xaa\x06\x16\r5\x1c\xae\x96\xc2\x81\x161\x9fYX\xc4\xd7\xf8\r\xda\x0f\x0f\xe4\xba\xdf\x02\xb7\x81\x03\xcb\x8d\t\xdb\xa6\x804e\xed\xdd\x05\x18\xc1\xa2w\x8ce:\xaah\x1cUuJ\xa0o\x9a\xa7T\xd0\xc3I\x1e\xc3\xc8\xef\x92\x99\x88\x8b\xf3I\xd479\x8c\xba\x9d\xa8\xda\xf2,%?9gT\xf3\xb3\xb3\xea\xd3\xd2\x1c\x16J\x92\xbc\xec(\xf9d/u\xce4\x0cc\'!\x02=f?\xcb-\x06\xae\xc4\xd5Bh\xd9\xdc|\xf3Mr\xac\x01^\xddZ\x88\xcd\xa7\x1d\xaf\x08\xab\x8dx\xc8\xa5\xe3!:+\xc8\xeb\xc4+~t\xb4\xb4\\g\xcf\xa9\x81\x97C!\xaas\xc6Zh\x1b)\xebR2\xd7{\x9aJ-vg\x9a_\xa7Lg\x87\xb42=^\x03%\xdaQ\xe8\'\xeb$\xd1"\xbf\xb3Y5\xa9\t\xf3\xc1O\xfaw\xd27\x0b\xed\r\xf4a\xe9\xa5\x9e;\xc8i\xd3\x9d\xf3\xa4\xb1H\r\xeb\x11\xc4^\xc3\xb9`\xf0\xf9.\x110\xf5\x97\xd1H\r6\xb6\xd8\xca\xe1\xdc3\x8c\x86\xff\xd0sWG\x15ke\xa0J6YD\xe8\xaeEN\x8eMi\xe7\xe8\xb8I),\xb5}G\xf9\xc5\x84\x03\xcb&\x80\x91\x89 \\\xfd;\xd7\xb6K\xd0\x19RL[\xec\x85\x1a\xd1L\xda&^\xcf\x05,y#\xd2`\xcb\xb4{*\xc5h?\x11\x00\xf4pt\xb9Zca\xf7!\x96\xaa\x96A\xf0G\xad\xf1\xf4\x06\x1a\x97m\nK\x7fm\n\x1dh\xb2\x00A\x99p\xae\x85$\x07z\t\xc9\xc1l1\x1b\x8c<\xf8\x147e\x04\xc0(\x18\xe1\xc2n\xd8@S\xc5\xa23\xb1h\xce\x8e\x1f\xd7M\xda\x01\x9f\r\xb8\xbe\xd2\xf65\xf1\xec\xe9\x97D>\xcd[0>\x19y\xfd\xd7u&\x1d\x83\x8b*\xf9Z7\xef\xd2O\x11?\x1b\xebz\xadU\xea\xbed\xc8\xc5\xc8\x97\x10\x06\x05K\xe4\xd0\x82\xea\xbf\xb2b0\x85\xb2|\x16\x8bd\xc8\xb67p\xe1\xadq\xe8\xa8@\xcd\xf0w\xc8V\x7fx\x96\xeb\xeb\n\xa9v\xfdjg\xa6Z(\x93"\xe5\x83_\xe8\xda:\xb1\xe3\xfa\xe5\n\xdf\x12\x99E\xf7\xdb\\&\x87\xf4W\xd5V\x8a\xd4\xc1\xf0<a|\x9dU~\xe5\x80\xa0\xac\xef\x9a\x11\xbe\xb0\x86\xfc\x1f[eV\xf0Y\xbe$f a\xacA\xc8ka\x17{Cl\x99\xe3|_\xbb\xa3u\x81\xed\x84\xf9=`\xaeV\xb0\x04$R\xc2\xdcDQ\xfc\x81]\xfeEx\x01$$\xa4\x0c"\xbb\xb8GP^\x92\xef\xc2!\xf9\x80C\xd9\xd9\xc5\xd3\xe1\x10\x12\xd3\xee\xe6\'\x19k\xee\x8c"@\'\xc2A\x8a5&{.\xc3ppj\x92^\xba\x08^\x9b\xe5\x1e\xf7_x\xab\xbf\xb4k\x8b\x9d!\xdb+\xaa\x15\x14;\xae\xe8_\x9e\xc74\xd85\x0c\xbe\xe0\xea5\xe6\x94\xf5~\xa9\x9f2g!sf\x84\xc3\x96\xa9c\xeb(\xab"\xc5NG\xdb\x8fU\xa0\x9c\xf4`\x95\x9e\x11\x1a\\\xc5r>\xd6\xd23K\x80\xd9h\xec\xb9\xe7\xe9\xa1\xae*U\x90\xb6J:\x12\xb4\x0b\xed}3O\xd6K\xa4\t\xd0\x8f\xa6\xb9kL\x12\x8b\x85\xa6\x18\xbf\xb0<\xc8\xc1m\xd8\xb6\xea\xc3\xec\xbe\x93f!6\xc5\xefXz\x8d=MPc\x0c\xdd\x04\xd4d4\xa4\x16\xd9\x02\xd62\xaf\x14bA\xd8N\xcf\xe8\xd3\xe2n\xce\xe66\x90\xb6I\x15\x9e\xeb\xcf\x03Y8^\xdc\xf0UP\xf4\xb9\xc5\xcaS\x93\x97\x9e\x0c\xa3\x1b\xcd\xe2\x8b>\xacT\xe1\x01E<)\xb2\x16<8:\xac5\xe0\xb1{\x10H\x02\xeb\x1a\xe0?\\\xc4\xa2\x11#\x81@\xfa!,\xf2{\x05\x1f\xf6\xfa\x88\xef\xfas\xcc\xbf\xd1q\x9b{]\xabX\xc1\xdc^\x95\xf3|2\xba\x16\xeca\x82\xd5\xb9\x96\x8d\xa5\x12\x04\x05\x07\xe6}\xfe\x04\xa1\xc5#k\xf4AC;\x0b\x0f\x8b\xeb\xfaRq\xe4\x84h\xd75^TEZ\xcc\xe4\x81.\xa7\x9a\xd6`\x98\xf1\x03\xb9#P7CP\x196J\xaa\xa2\xdc\x17\x99ARN\x86\xd1id)X\xca\xd3 GP&x\xca\x10^n+E\xb3\x16\xc7\xe87\xa3\xa8\xf1t\\\xf2!\x17\xc9vBs\t\x19\xad%\xbf\xbf\x01q\xf8 \t\x04\t=\x18\xce\xd9\x80f\x9ePC\x8f\xcc\xc0\x0c\x17\xe9\x01\'b+\xe9\xc8\xf7o?\x9d[\xb8`Zs\x88\xf7_\x06\x84\x8d\xc3D\x927b`\x05\xea\xe1\xdfV\xd7\xd5h\xd9<@\x00|\x99\x07\x90\xfc\x84X(V\xd7\xc4C\xe7\xc0\x0f\x95\xc6\xf2\x15QF]\xb8\xe8\xff\x08\xea\x91\xf75\x97\xaey,\xfd\xc5\xfe\xab0"Y\xf4\xc1\xd6\x9b\xb7G-|[\xfb~\xaa\xbf\xdd`\x11\xca\xde\xfc\xed\x1d\x03\xf0\xe4\xceaW\x8e\x96\xfd\x0b\x7f\xc9\xfa\x83\xf0R\xb6=\xd0j\xf8#L\xa5\x13\xa5\xa6\x96 M\xfa\x1b\x91\xb0\xe7~7\x1f;\xe4\xc8P\x8e\xf3\xad\xcd=\xbbc\xe6\x19\xc1\x1fR\xa7\xdc\xe5\x18+\xd8\xaf\x13*tbyq\xb4\xbb\xbc\xda\x14I\x1b\xaa*\x87:\x90\x97\x81\x9f\x10\xcd\'|B\x9f\x9a\x94\xbc\xffSR\x98z(zY\xbe!Yl\xe6\xc8@\r\xc9\x80^KX\xa4|\xdb0\xca\x80\x9bEy\xef-d\t\xcdG@\xb9\x8e\xb9e~\x03e8\x96\xcb\x82\x9f\xd5\xe5\x9a\xaf8\x06?\xfdb}G\xdd\xce+\x9c\xad\\\x97\xe0;#1\x90\x85\xe9<\x13 &~\x9bY;H\xc5\xc9\x89\x7f\xe0s\xd0V\x0b\x07J\xbe\x91B\xf7=\xfe\xb8D\xf4\xcdM\xbc\x96_Y\xe60*Ncn\xc3\xc0=\x0f\x8e\'\xa7\xc0I@6io\xd1\x8f\x89\x06\xc9\xa4cP\xe6\n\xcb\x9fl\xa5[l\x98\x92\x06m\xd6\xd4\x10\x02q\xb74H\xc4\xa7\xe51%\xe93\x99\xafw\x16\x01\xf2\x1dp\xbd\xa0\xb5a\x9a0\x1c&]r\xd3\xd4\xb0\x02\x06\xbc\xf5\\$\xf0\xdb\x18fY\x03\xf9P\x81\x0e\x0e\xca\x9a"2=SO\x9bC~\xe4(\xc2\xac(\x06\xd4\x92S&\xb6\x99\x9b\xbaYZ-0\xe8i\xbf6\x9a\x89\xa3nL\r\x89vQj/\x07h\xb0Q\xe1\xe8\xd1\x98>\x9dp\x9d\xa8\xf3.\xe2\x0b\x8a\xa8\xe6\\|\x16\xe4\x8dhj\xb9=\xc5\xd6\xef\xc1\xac\xd2\xee\x9b\x15\x93\xae\xeb5\x17\xde\x92>78L\x16#i\x10\\]Q\xdd!\xf7\x8f\x92\x03#(\xc3\xf4\\#\xdb\x85E6B\x9fc\xc1l\xb2\xc3\x13U\x02\x13\xe7\x1do\x0fO3Oyx\xa8u\x83K~vY\xd6g\t\xeb\x0b\xe94\x91\xa2\xa5\xb0\xa1\xbc\x94\xc7\x9d\xe2\x05\xdf\x91\x1c\xe3z\x8d\x06\r\x8f\x0e=\xb56\xfc\xbad\xc4G\x91\xe3\xdf&sZ\n\x82\xf2yG\xf7.\xabh\x0es\x10\xc6"\x90an:\xac\x92\x11\xb7\x1e\x85U\x80\x87/[\x17FT\x7f\xde\xd6\xe2\x0e\xaa\xbc\x06\xf8\x91t{\xc3\x08E\xe1\xfd\xa0\xa2`\xda\x89\xfd\x89\x9d\x1fT\x85\xba\x90n\x90\xeb\x97\x05\x93\xcam`\xad\xa6\xcf3\xabE&j\xf8\x97\xfb\xf2\xc7Z\x955\xfaI\xc3VF\xa3\xae\xb6\x82\x81\xb3R\x83\xb7\xd1\t\x83%r,\xa6\xb2\xf8\xa8\r\xca\xb9\x95[ \xe1\xd3\xaf\xf34\xd964e\x02\x81\xad\x07\x16u\t\xfe\x02ON\xd5\xbe93\x98\xa7l\x88\xa3GCC\xb7Z1\x11$\x8a\xc6!\xe36\xe8\x9e\x95LF\x8c\x94H+L\xd5\xd9\x13\x15Cq\xb9\xf4\xda?\x87\xa4\xb7\xc8\xdf\xac8i\xb9\xfem\x10x\xb1\xf5\x83\x16\xc7\xde.h\xf434\xdc}\x12\xcbS_\xfcL\x1d\xa7\xa5\xf74\x0e\xd8\xe1(Q\x9e\x80\x97\xc7\xc5\xc0\x8c\xc9j`\xa9\xd4P\xa9\xaf\xa9\xee\xe4\xb7\xe0?x\x9f\xf6\xe0\xd0\xf0\xa2\x8el\xc9\xc2Ma\x07\xab\xc4\xf1\x1c\xfcX\x87\x8c03\x8a\xeb\xc1\'\xe7\xd8\xe4{\x9c\xccg\xa6\xba\x1d\xbd\x11\xc0/\x1d\x0f\xdbW\x0b=g\x1ev\xc3\x08\x13T\x17\xff\xa7\xae\x07\x08\xd35\xfc\x15n5\xcc\x14\xe2\xcd\xb5\x17R\xb6\x17?\xbc\x82\xc5\xb7k\xd3\xec\x9bB\xd0\xce\xd0\x1e\\I\xe9\x1b\xb5-\x05f\xe2\xdf\xae\xb9\x11\xbe\x06\n\xff\x8764Q\xf2]U\xeaU\xb9\x8a]\x02\xda\x0bsr\xcd\xf1Y\x9cb\xab\xae\x9d\xfe\xbe\x90\x1bv\xd1#\xf5\xd8&\x0ez\xf9\x0b\xebM\x8f\xa5\x1b\x9a\xcd\xa4]\xcf\x98\t#\xddm wN\xdfG[f\x89\x19-\xdf\x07\x1f(8\x8aO\x1b\xec\xc5\xfa\x97\xbc\xcb\xb9\xd1\xbek\xf8?\x9a\xf1\x99\xd9\xcc\xae\x02\x9e\xeeL\xa4\xcd\x90\xa0T\xf9\x8b\xe3\xa1\x87 \xac\x80F\xab\xbd\xa6\xa2O\xfe\xac)j\xb7\x0c\xd5\xdf\x93wIRu\xf5\xbe\xf6\x89\xb6\xcb\x8c~e^\xacSB]\xd52F+\x82\x97\x908\xe0\xf3\xc6w\xa2\x8b8\xe6rwv\x19\x94z<2\xd1\x1c\xda\xfc\x03:%\x9f\xd6rb\x97\x92\x89E@\xb8\xefq\xe9\x81\xe2\xfc\x1bQ\xdfU\xe7d\xd2J\xf9\xa2f\x83\xe8;\x12\x08\xb1IT#\xe5\x9e\x94\xea=)\xce\x93\xd7\xf6;\x08\xa8\xb3*\xc2*.\xb8\xee\xd6\'\xd6\xd9\xcb\xa3z\xfcf Z\x88\xcd\xad5\xe6\xdb\xd5w\xcf\x10<!\x00\ry\xb4)\xf0\xb3;8j\x06\xfc\xff\xe0\x90)\xed1O\x1fk \xa49`\xdd+\x87r+y\x98M\x1eu\x96?\xa4\x14\xd18\x1b\xd3\xb3\xcb\xcbjq\xc2\xf1>\xae\xc5^4=\xa8\x1ef!\xbb\x08\x1a\xeb\xb3\xf0\xb5\x9d\\\x95p\xf5A7\xafL\xf3\x04\xa7\xa0\xe6$\xff\x8d\xd2\xe6\xb6\xbe\xe8\xb4\x8ad\xf5\x9d\xc0\x8b(\xac.#\xec\xc3\xbfz\xc1\x16,N,6\x9e6pKr\x8c\xf2\x84\xc4%A\x0bq\xd7RC\xfe}\x99\xf1\xe0\xf2\xc2\xf4\x8a\x1e\xd08\x13 \xab\x8a\xfbMh+\xd9\x1d\xe3\x0bd\xe9\x11p\xa8!F\x19+\xd4\x19\xf5\x98=z\x91\x13d\x03\x18\x8e\xf3\xda.J@{\x07\xbd\xc4\x9f]\xed\xd0g\xec\xbd+\xeba\x98\xcfoX\x8c\x9b\x1c\x99\xd8\xd3\xe2\xd6Z\x11h\xcb\xc4\xd6\xb5\n\x02\xac\xfd\xea\xc3\x04\xc6 \x81\n\x07\x9b\x8d\xf1\xde\xa5\x07\x92\xda\xd0\xbb\x80U8\x82\xd5\xa1Zr\x04\x9d\xd8FQ\xa15\xeb\xbam\x18\xfa\xa4R\n\xe2\x84\x1e8\xb7\xd1n\xa9"\xac\xf4!\x91\x93_\xb1\xcf\xaa\x08\x7fmK\xca\xa2\xf0\x10-\xc9\xd2*\xf1\xe7.e\x96E\xde\xac\xc33zp\x0f2\xecw\xa0g\r@fV\x12\xe2\xe2\x1b\xa7\xea\x167:e"\xb7\x1f@\x1b\x86O\xad~A\xbe^\x15\xd1\xe1\xe0\x88\x8aZ\\\xe7\x877\x85FSEF/\xb7\x97\x9b\xe6I+ \xe3L\x0f\x0b\x80C\xc4:,\x12\x9e\x9c@@\xd5\x94LoZ\x87&\x15\x03\tp\x96Z\x1f\xf6s\xbf\xc3\xa9\xf1\x89}\xd5pQ\xe7\xcd\xf8\x04\xf0\xb38ig\xd2O\xca\x7f\xd4D~:5\x19\xafy\tA\xa8\x7f\x8c\x93\xe8\xec\xb7 \x1d*\x18p\x18\x97\x0f\xec\xff\xaa\xc5\xa2,\xae\xba\xcb\x06\x92\x8cE\x17a+\xec\xc0\x9b\xf8&\xbc\xb0\xfd`\xc1\x8d\xbb\x8c*\x1a\x87E\xb9v\xec\xfb\xe8\x95\xa8W\xbaP\xa51\xb95\x0b\xfc\x13\xa1H.\x94\xf45\x1c\xa0\x0c$x\xb8 \x9e\x9e\xb4P\x02\xbe1\xe5\xf9!m{sZ\x1b\xc2]\xf9=\x9a\xa2$\xcd\xe3\x8d\x02I\x9b5\x14\x00b\xd5h\xe3\xe9\xce\x95\x82\xaf\xe3m\xc1>\x04p\xd7\x91\x08\xc2\xd9"\x96\xa6\xcc\x05Z|\xc1\xb5\x9e\x0e\x9ey\xab6\x13\xdc\x03\xb5 \xdb\xdd\xef>\x1ewe\xf6\xf0\xe9[B\x90\xe8\xa4y\xd3t\xe2-U\xe2\x9d\xf9{\x99\xe6D\x8e\xc5/\xbd\xa3\xf6\x86\xafR|\xa0@\x18c1m>\x7f\xda\xa8\xdb\x1c"\xe1\x1c\x99\xd2GF\xdd\n\xa4r\xa1\xe1\xf4J\x8d<\xd32\x9bp\xf6\xbe\xf6\xeb\xc7@ \x9d(\xf0\xb6RCQ\xb8#j\xf6;@*gC\x07FjlFG\xcang\x13\xd1\x80G\xfa\xac\xb0\xbf\x9a\x82\xb3\xfb\xccc\xf1\xa3\x19\xb7\x9f\n\xfb\xfb\xa2\x16qG\xd3\x88R\xdb\x84\xfd\x02\xf0\xe3\x8b\xc2\'\xf6\x9a\x1f\x98z\xcc\xeb\x19\x17\x81~\xfe\xf3*\xa6\xb3b1\xb0}B\x9f\x8d\x1b\xa6\xec\xdb\xbd\xc0\xc2(\'\x9e\x8b#\x7f{4\xd6~o\x0b\xc3\x16\x11\xaf}a\xe6\x12\xeb\x15\xd9\xc2\x1eb\x11\xd7\x81JqU\x98\xa9\xe9\xef\x11\x9b\xf7\xeb\x95/i\xc3\xda\n\xf3+\xbd\xf2\xd7n\xbd\xe4\xc0G\x95\x0f\x1a\xfd*0\xdb\xf1]QLl\x8ed\x93\x9dqhj\xe8x\xf1\x0f\xfcZ3\x96\x0e(\x7f~GhR\xd3%\x8f\xf2\xf8\x85\x93\xa2V\x89\xfb\'8%\x1c\xa2-Q\xac`7\x81:!\xeb\x8e\xc7\x00_\xa1\xa4\xbf\x92?.A,\x1b\x8a\x9df\xdd\xb6\xcfg!u\xeb\x02M\xfc\t,\x14\x82g\xfcn=\xb6\x02_\xb4kt!\xae\xed9\xd6\x15%\xd9\xc6Kv/\xde\xf9\xcb\x0e\x02\x93\x03@\x04\x01\xb9\x1e\r\xcb>\xf5\xc6\x8c?\x83\xa8k6y/K\x7fYwLT\xb7\xd9\x15\x84\xf2I\\Z;r\x1d\xd5#\xc0gb )\x01\x96k\x99x\x10/0\xfd\xe5\xc4\xc1\x11\xdcj\xd2\x13\xd4Gf\x02\xe0\xe4}j\x11Dv\x7f[\xf7\xb2%\xed\xa4UH\xa6\xee\x87\xc3\x08\xd7B\xc7EI$;\t\xd3[\xc2\xe7C\x8f\x00\xea\x9fa\xf34\xf4H\xb98\x9dI\x7f\x97\x8bb\x12\x16\x9b\xe1:\x0e\r<\xa2\\J\x1d\xa17\xd2VrW\x14\xf4\x19\xc7%c\xe8 6m\xe4\x90\x8b\xef\x99\x17\xdb\xfe0\xcf\xe8y<u\xd8z\x96{3[\xc3\xb4l\x0c^\xd1\xc6\xdfA\xc4Q\xdf\xc6\xeeOTD\xf7(\xa1\xb8\xc1\x8b\xc3,\xd9\x91\x82\x15U\xeaa\x8d\xb5\xe9H\x9a\x15\xce\xd8\xeb/\xb4\xdeu\x83\x8e\xa4\x1a\xef\xe1\xf4\xab \xc1\xcfP\xa9\xb3r7|)\xa7\xc7<\x9d\xbb\xbc\xb0\xc7\xf1\xfcb\xd4\xc4\xb4\xd0j\n\xe5\xe4\x1c\x7f=3\x95i\xa9\x86g\x9fa\xc4\x9a\xc2\x15I\xca\x1d\xab\x9b\x92`\x14\xfa4N~\xef\xe1\x13\xdc\x8c\xf2L6.p\xc2\xf5\xae\x99Z\xea\xc6E\x11\xc3\xee~Z\x8fI\xbb)\xcd{\x9d\xaa#J\xc2\xb2!\xf8\xf70#Y,G\x98`\x80\x88\x0e\xd6I\xda\x14\x9a\xab\xb2\xbe\x92\x8d\x1d4\xed\xed\x92\x1e\xc7\xbf\x8d\x14\x1f\xe5\x0e\x0b\x7fc r\x80"-\xe9\xc5\xa8\xd0\x0c\xb5S\xc1\xa5\xd0\xc7\x99\xbe\xac\x86p\xfdj\xf7+ae\r\'X\xbb\xa1\x81\x0e\xd3<\xdc\xe2\xec\xad0\'\xc4\xe1\xde\xd4\xf9<\xbb\x9a\xa7We\xc9U\x16\x9b\'Fil\xb8x\xd8\xf68f\x9c~\x81\x1fL\xab\xba@\xe4\x00\xb5\xfc\xdf!F\x82\xfbnlh\xb7RKy\xfdf\xae\r6\xf0\x8c\xfdKT\x01\xc2\xd1\xa3,\xa6\x190\xf2?W\xaa\xa2\xd3\xf8\x93N\x9c\xdf\x1aa\xa3\x1d\x87o\x04md\xa8\xb8\x18\xb0S8v\xde/\xc1\x0c\xc1\x03?\xd9o\xbds\xac\x08\x89%r\xb0\x96\xe8\xbf"n\xf1\xe4\xf6]\x8e\x89t\xd6\x1aw<!\xa0\xcb\xc1c\xabsO0\xca*\x9b\xc0\\\x0c]\x16\x1f\x89"\xd1i}t\x90\x99i\xe0S\xb8\x02\x14\x15x\x89\xe3BC\x87c\x0c\x04\x1c%\xc5eiuV\xa9D\x98\x96,\x06\x91uQ\x08\x18\x04\xc3\x88\x18\xdf\x95T\xaf\xd2\xad\x81\xf8\xb6$\x8c\x97im\xd1<1y\x04\xde`{\xfc\xfc9\xf8\x01\x05\x06~j\xdd3\xd4\xce\xf4|\xc2ga*T\x04\x99\xec\xc6fS\x87W@?\xce8\xb8\xd8\xef\xa4\xfe\xd8\x10\xa8\x12p\x0bhc\xd9@FW)H\xd2P\xbc|S\x0e\x8b6\xe3Bj\xc1\x81\x96|\x9e\xa2 h\xbc\xb2V\xa3\xb6\x8f.\x8b\xa2\xa7\x05W\x02 B\x97.\xfa\x1a\x01&\x9b\xeb\xbc\x827X\x92[\x9f3\xa6Y\x84\xbbC\xba\xc0v\xa0]\x8e\xf2\x15\xab\xce\x80\xc5\x13\xef\xab\xbe\xd0\x1f\xf9\x98\r,\xc2\xad\xf0\xe5?O\r\x08\x9b@\xde\xb7\xc0a\x18\xd5E@\xde\xcb\x06A\xe7?\x17\xcfx\xed\x92s\xcb\xf9\x01\x80Q\x1d\x19\x9dg\x02[\x8c\x8c\x87\x02\xd4j\xd7\x1b\xbaX\xa7\x84\xf9\xb2\xb1Q\xa2XQ\xcf\xabWJ\xcc\x00L#\x9f\x1c\xb0\x0e\x9b\x16H#P\x08U\xc5b\x15o\xd7\x8b\xde\xcb\xec\xc4\xaf?j\x0c\x07-\x1f,k\xac\xee\xe0\x80\xda\xc6\x97\xc5\r\x9f\x86_T\xcc\x97\xad\xb7\xeb\xf0%\x83\xc7\x89\xdb\xca,yB\xc8\x8d\x86\xed7\xdf\xd1\n\x93\xa34\xc40Y3\x16\xc3rdD\xea\n\x13\xaf\x148\xcb/JZ,{\xe2\xf9C\xa3\xc1\x1d&5\x05Kc[\xfe\x06w\xcd\xff\x9d\x81\t8\x8fx\xe9\xb9\x7f\x02Fq\xf7.\x84\xa0o\\\xb5\xff\x18\xa3\xc3A\xca\xa8e\x8a\x86!6\xecD\xb0\xa8\xe1\xc2\xe9\xd86|\xd9m\x12\x89"z\x8a\x81\xd6\xb3S\x1e@\xf1\x19\x9d\xc3w)\x05\'\xcfm\xc8n\xf6\xd8(\xf5_^\xf7\x9f/\x11d$\xe9\xcbrtf\x18\x1f\xd8\xc2\xfe\x1c\xb1\xdd\x8bq\x17\xda\x8f\xda\x83O\x06\x0bx`\x16\xc6b7\xf8\x91w\xa0\x85po\xcfF:/\xceAA\x86\x8e\xa5\x99\xaf\x83\t\xecF\x1d;\xd4\xd0\xfew\x92q[h\xf3!fa\xd5Fb^f\x96rw|>\xd4\xa0@&?\xfdw\t\xde\x1e\xc5)w\xff\xd4\xc7P\xbb\x7f\x80\xebO\x81\xf0\xdfLv\xa0kg=g\xea\x1a\x17-S\xda\x1c\x90\xca\x9aT4\xba\xa4\x1e\x95`\xef\x9c\x02\x83\xfa\xaa\xf9IA\xdd\x10r"\xad\x96R\xcc\xb3\x80\x91\xf3\xc7{\x0ci\xd6\xc1\xce\xef\xee\x1e\xa7\xa6G\x9a\x9b\x0f\xa4\x1d \x07~\xaf\xfda\xbex\xc0\x85%\xba\xdd\x83X\x18f\xb8\x17\xfa@\xbc\xf8\x80M\xc9{9\xaa\x04\xf8Bi\x05\xbb\x11\x0b?\xfa1p\xfe\xf7\xfba\x97\xba\xd9\xafAQ\xbd\xca\xabe\xc9\x057\xb9\xca\xd0\x10\x97\xb3\xb8\xeb\xb1{\xf1\xbf\x91S^\xaaj\xfaWox\r\xc0\xe6\x83\xad9\xd5\xdc2\xeb\xc06vlI\xe4\xfb)\x1b(\xdc\xcf)\x037_\\\x0f\xb7,`\xc1\xca\xda\xd5?\xb6ZL\x92$\x91I\xef\xc0\x90i \xa4z .l2\x14\x08\xa0\x91\xa4\xb1c\xbf\xf5OS\xf3m\xa3\n?\xf3\xbb\x8f\x828\xba^yS\xa5\xc2N.\x84q"\x1e%\xaf\x1f\xb5\x89dhs\xdc\x88UL\xce\x9dO\x80\xbdp&A\xfd\xd9\xb5\x0f\xe1gb_\xecE\xde)\xa2$8\x9b\xd0x\xcf7}\xd8)\x0c\x1dwz\xae\x03\xd9r\xebj\xd1P\x93R\x9c\r\xb4\n\x94sP\xd0\x11B\xf4\x85\x85\xd4\xf90\x15N\xe4\xbd\x0ccF\xb1\xca\xa7\x13\xb6#\x18B\x1a\xa82^\x1f\xa8\xba\x1c!\xcd\xd1;B)\xb8"\xf3z\xf7\xd5G\x96]\xa0x\x7f\x842\xae\xa6\x96\x9ct\xd9\xe8\x99\xc8\xea\xcc\xef\xb9,\xe30\xbbq\x9b\xb5\x17\xce&\xe9\xd3"s\xd5\xcb\x90\xe6s\xd8\xa7\xd7\xe6vn\xdee{D\xfbD\xeb]\\\xb2\x7f\xc7\x17=\xcd\x95D|N0\xfeT\xd1\xcd\x84\x19\x1a\x18d$\xb8\xb6\xdb\xe5\xdf\xd7\x86\xfa\xda\xb6\x99\xf3Fx\xee\xd1\x1e\xac\x98\x00JysW\xf1\x96O\'\x0c<\xc4\x9e{r6\xc8\xe0\x1e\xce\xefGe\xcf&\\\x14:\xeb\xa8\x88\x85"P\x94\x074\x14\xe6p~\xd8!\x80\xf1\xae\xaae\xf8\xa5\x15:\x8a\xa7Q\xefM+n\xa8\xfc\xbf.i(NI\xce3\x9a[\xbe\x916B9\xb0\x90\x82 ?\x8e\xdb\x14\xd4\x8b\xae\x9b\xdeKV\x1f\xe7\x02\x81N\xe5\xac\xa5\xd8u\x00o\x99\xa4\xa3U\xb6;\xdd?\xa0j\xa4\t\x80\xd5d\xf6\x07\xea\xc5\x0b7\xe1\x87\n\x90\xccU\xd405\xfd\xfaB\xd0\xdc\x04\xb4\xfa\xdf\x0c\xcf\x08\xb9T\x01\xb5\xe3T\xce\xf3H0\xb3\xa6_K\xfd\xb9\x12\xd5\xcb\xb7{O<\x13\x07.\xa6\xe8\x1f\ru\x116\xb2{W)}z\x13a\xed\x05\xe7\xead\xfd\xd1\x1dg\x03Gu\x9c2\xecG\x01\xff\xd5n(\xc6\xa5\xf1\xf1yr\xdfc\x06U\xfa\xe6\xa0-\x85\x94;;\xb2L\xeb\xa0\x8d\xd2\x105\x9f\x1d\xda,\x96+\x83\x8bd\xf8\x03\xf3\xa0\x19\xbf\x06|\x1b{I\xe882l/\xa8\x02Q\x08\x9a\x8e\xe2\xbd\x1c\x19\x94LrV\x8fz\x98\xdc\x8fh\xfc\xb6\x11\xc3\xe80\xb8\xe28\xa0\x087t\xf7\xe7%\xc6\xcc\xa0\x1f\x9f8\xa1\x08\xee\x937S\xc9\xcd\x1e\x11)i\x00\xb3-\xd3K\xe3,\xd1\x83a\xafmPT\x94\x14b\xc9\x8a\xcb9\r\xc1\xf7L\x0fc;K\xe8\xf8\xe2\xc4\xd7\xe2\xff\t\x83Wl,\x90\x06\x95pw\x07"0\xa481z\xf77\x02z\xfeC\x86\xec\x1c\\\x02\x06\x90\x06\x99/\xe6\x86\x82Y\xc8z\xe6P\xa5\xaa\xc1\x06\xf9\xf8\\\xc1K\xc5)\xca\xc0\xe6V\xea\x7f-\xfb\xf3p\xd3\x95;\x0c\x1f\xdb\x87ix\x85\xa4<3;\xb8\xa33\xd8\xb9\xc4\xfe\xa2k\x85\xe9\xc0\xe2\xf1\x89o{tW\x0e\xd0\xc4\xcb\x7f\xbd@k\x11\xa5\x82\xe5\xfa\x9e@\xd6\xe1\x9c8\xe3[\x96\x04\x93\x1c\xcd\x8b^\xa2V\xa3\x1dd\x1e@;\xeaA\xbe\x0f\x1b$\xfe\x1f\xd0\xb0\xc4M\xa3o\x81\xe6\x0e\x8d,\'\\\x88\xe8p\xbf\x12\x9f\xed\x10\x89\x8a\x1f\x9b\t\xc7o\xd3s)o\xaf\xf9\xd0e\x80XU?\xd5\x9e\x9f\x13\xd0\x11\xfa\xfe+\r\x15\x83\x93\x92wxF}\xcdO(]|u\xcfC\x05\xcc\xaf-\xcaj\xa8.R\xb7}>\x15m\xed\x9e\x03X\x99\xa2\x19\xffw\xcd\xb9k\xac\x88\x10\xfd\xc3\xaaaR\xffZ|\x07\xf6\x0e\xad\x86D\x00\xd7\xa1t\xeb2\x85x$\xa6m[\xe1\x05\xc8\x80#\x05\xe1\r/\xc8?\xb8i\x8boo\x07\xd9:\x8bB\x04Zo\x00\x1b\xfaT\x1b\xeb\xa19\x13\x90\x8f\xee\xd4=\xde\x0b\xadE\x1bV \x0b\x857\xcbQ\x0bJ\xb4I\x8aY\x89_|\xf7\x00\xd8}\x9c%\xc96\xd53\xff}/;\xb3\xebR\xed\x80\x14\xff\x96\xc2*\x04~\xfe\xf2\xdbbt\xf5Y\x9bC?7\xd2zh\xaa\xb2\xe3\xa7#\xf7}\xbe\xbb\x17Uu\xa7\xb8`N7\x81\x8eWW\xcc\xbd\x19\xf6\xb1}z\xbb\x84\xe9\xca\x141\xa7m\x17\xf6i\xfbY\xc6\xaa\x85\xe8S\x1d|4U\xc7\xf1\xbb\x94\x0fr\x98\xeb\x8fS\x12L\x0ew\xdcx\xa6Zo\xb3\x8f\x95\xd0\xe9\xbeFN\x1dj\xb2%\xea\x19\x89\xe1\xa4T\xdd\xc5W\x16G;\x87v\xc9{\xd8\xa9F\xfb\x99+\xf5\xac\x8c+')
1
+ from flask import g,request
2
+ import enum
3
+ from hiddifypanel.models import *
4
+ import yaml
5
+ import json
6
+ from hiddifypanel.panel import hiddify
7
+
8
+
9
+ def all_proxies(child_id=0):
10
+ all_proxies = hiddify.get_available_proxies(child_id)
11
+ all_proxies = [p for p in all_proxies if p.enable]
12
+ # all_cfg=Proxy.query.filter(Proxy.enable==True).all()
13
+ # if not hconfig(ConfigEnum.domain_fronting_domain):
14
+ # all_cfg=[c for c in all_cfg if 'Fake' not in c.cdn]
15
+ # if not g.is_cdn:
16
+ # all_cfg=[c for c in all_cfg if 'CDN' not in c.cdn]
17
+ # if not hconfig(ConfigEnum.ssfaketls_enable):
18
+ # all_cfg=[c for c in all_cfg if 'faketls' not in c.transport and 'v2ray' not in c.proto]
19
+ # if not hconfig(ConfigEnum.vmess_enable):
20
+ # all_cfg=[c for c in all_cfg if 'vmess' not in c.proto]
21
+
22
+ return all_proxies
23
+
24
+
25
+ def proxy_info(name, mode="tls"):
26
+ return "error"
27
+
28
+
29
+ def pbase64(full_str):
30
+ return full_str
31
+ str = full_str.split("vmess://")[1]
32
+ import base64
33
+ resp = base64.b64encode(f'{str}'.encode("utf-8"))
34
+ return "vmess://"+resp.decode()
35
+
36
+
37
+ def make_proxy(proxy, domain_db, phttp=80, ptls=443):
38
+ if type(phttp) == str:
39
+ phttp = int(phttp) if phttp != "None" else None
40
+ if type(ptls) == str:
41
+ ptls = int(ptls) if ptls != "None" else None
42
+ l3 = proxy.l3
43
+
44
+ domain = domain_db.domain
45
+
46
+ child_id = domain_db.child_id
47
+ hconfigs = get_hconfigs(child_id)
48
+ port = 0
49
+
50
+ if l3 in [ProxyL3.tls, ProxyL3.tls_h2, ProxyL3.tls_h2_h1]:
51
+ port = ptls
52
+ elif l3 == "http":
53
+ port = phttp
54
+ elif l3 == "kcp":
55
+ port = hconfigs[ConfigEnum.kcp_ports].split(",")[0]
56
+ elif l3 == "tuic":
57
+ port = hconfigs[ConfigEnum.tuic_port].split(",")[0]
58
+
59
+ name = proxy.name
60
+ if not port:
61
+ return {'name': name, 'msg': "port not defined",'type':'error', 'proto': proxy.proto}
62
+
63
+ is_cdn = ProxyCDN.CDN in proxy.cdn
64
+ if is_cdn and domain_db.mode not in [DomainType.cdn,DomainType.auto_cdn_ip]:
65
+ # print("cdn proxy not in cdn domain", domain, name)
66
+ return {'name': name, 'msg': "cdn proxy not in cdn domain",'type':'debug', 'proto': proxy.proto}
67
+ if not is_cdn and domain_db.mode in [DomainType.cdn,DomainType.auto_cdn_ip]:
68
+ # print("not cdn proxy in cdn domain", domain, name, proxy.cdn)
69
+ return {'name': name, 'msg': "not cdn proxy in cdn domain",'type':'debug', 'proto': proxy.proto}
70
+
71
+ cdn_forced_host = domain_db.cdn_ip or domain_db.domain
72
+
73
+ base = {
74
+ 'name': name.replace(" ", "_"),
75
+ 'cdn': is_cdn,
76
+ 'mode': "CDN" if is_cdn else "direct",
77
+ 'l3': l3,
78
+ 'host': domain,
79
+ 'port': port,
80
+ 'server': cdn_forced_host,
81
+ 'sni': domain,
82
+ 'uuid': str(g.user_uuid),
83
+ 'proto': proxy.proto,
84
+ 'transport': proxy.transport,
85
+ 'proxy_path': hconfigs[ConfigEnum.proxy_path],
86
+ 'alpn': "h2" if proxy.l3 == 'tls_h2' else 'h2,http/1.1' if proxy.l3 == 'tls_h2_h1' else "http/1.1",
87
+ 'extra_info': f'{domain_db.alias or domain}',
88
+ 'fingerprint': hconfigs[ConfigEnum.utls],
89
+ 'allow_insecure': domain_db.mode == DomainType.fake or "Fake" in proxy.cdn,
90
+ 'dbe':proxy,
91
+ 'dbdomain':domain_db
92
+ }
93
+
94
+ if base["proto"] == "trojan" and "tls" not in l3:
95
+ return {'name': name, 'msg': "trojan but not tls",'type':'warning', 'proto': proxy.proto}
96
+
97
+ if l3 == "http" and "XTLS" in proxy.transport:
98
+ return {'name': name, 'msg': "http and xtls???",'type':'warning', 'proto': proxy.proto}
99
+ if l3 == "http" and base["proto"] in ["ss", "ssr"]:
100
+ return {'name': name, 'msg': "http and ss or ssr???",'type':'warning', 'proto': proxy.proto}
101
+ if proxy.proto in ProxyProto.vmess:
102
+ base['cipher']="chacha20-poly1305"
103
+ if "Fake" in proxy.cdn:
104
+ if not hconfigs[ConfigEnum.domain_fronting_domain]:
105
+ return {'name': name, 'msg': "no domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
106
+ if l3 == "http" and not hconfigs[ConfigEnum.domain_fronting_http_enable]:
107
+ return {'name': name, 'msg': "no http in domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
108
+ if l3 == "tls" and not hconfigs[ConfigEnum.domain_fronting_tls_enable]:
109
+ return {'name': name, 'msg': "no tls in domain_fronting_domain",'type':'debug', 'proto': proxy.proto}
110
+ base['server'] = hconfigs[ConfigEnum.domain_fronting_domain]
111
+ base['sni'] = hconfigs[ConfigEnum.domain_fronting_domain]
112
+ # base["host"]=domain
113
+ base['mode'] = 'Fake'
114
+
115
+ elif l3 == "http" and not hconfigs[ConfigEnum.http_proxy_enable]:
116
+ return {'name': name, 'msg': "http but http is disabled ",'type':'debug', 'proto': proxy.proto}
117
+ path = {
118
+ 'vless': f'{hconfigs[ConfigEnum.path_vless]}',
119
+ 'trojan': f'{hconfigs[ConfigEnum.path_trojan]}',
120
+ 'vmess': f'{hconfigs[ConfigEnum.path_vmess]}',
121
+ 'ss': f'{hconfigs[ConfigEnum.path_ss]}',
122
+ 'v2ray': f'{hconfigs[ConfigEnum.path_ss]}'
123
+ }
124
+
125
+ if base["proto"] in ['v2ray', 'ss', 'ssr']:
126
+ base['cipher'] = 'chacha20-ietf-poly1305'
127
+ if "shadowtls" not in proxy.transport:
128
+ base['uuid'] = f'{hconfigs[ConfigEnum.shared_secret]}'
129
+
130
+ if base["proto"] == "ssr":
131
+ base["ssr-obfs"] = "tls1.2_ticket_auth"
132
+ base["ssr-protocol"] = "auth_sha1_v4"
133
+ base["fakedomain"] = hconfigs[ConfigEnum.ssr_fakedomain]
134
+ base["mode"] = "FakeTLS"
135
+ return base
136
+ elif "faketls" in proxy.transport:
137
+ base['fakedomain'] = hconfigs[ConfigEnum.ssfaketls_fakedomain]
138
+ base['mode'] = 'FakeTLS'
139
+ return base
140
+ elif "shadowtls" in proxy.transport:
141
+
142
+ base['fakedomain'] = hconfigs[ConfigEnum.shadowtls_fakedomain]
143
+ base['mode'] = 'ShadowTLS'
144
+ return base
145
+
146
+ if "XTLS" in proxy.transport:
147
+ base['flow'] = 'xtls-rprx-vision'
148
+ return {**base, 'transport': 'tcp', 'l3': 'xtls'}
149
+ if "tcp" in proxy.transport:
150
+ base['transport'] = 'tcp'
151
+ base['path'] = f'/{path[base["proto"]]}{hconfigs[ConfigEnum.path_tcp]}'
152
+ return base
153
+ if proxy.transport in ["ws", "WS"]:
154
+ base['transport'] = 'ws'
155
+ base['path'] = f'/{path[base["proto"]]}{hconfigs[ConfigEnum.path_ws]}'
156
+ base["host"] = domain
157
+ return base
158
+
159
+ if proxy.transport == "grpc":
160
+ base['transport'] = 'grpc'
161
+ base['grpc_mode'] = "multi"
162
+ base['grpc_service_name'] = f'{path[base["proto"]]}{hconfigs[ConfigEnum.path_grpc]}'
163
+ base['path'] = base['grpc_service_name']
164
+ return base
165
+
166
+ if "h1" in proxy.transport:
167
+ base['transport'] = 'tcp'
168
+ base['alpn'] = 'http/1.1'
169
+ return base
170
+ return {'name': name, 'msg': 'not valid','type':'error', 'proto': proxy.proto}
171
+
172
+
173
+ def to_link(proxy):
174
+ if 'error' in proxy:
175
+ return proxy
176
+
177
+ name_link = proxy["name"]+"_"+proxy['extra_info']
178
+ if proxy['proto'] == 'vmess':
179
+ # print(proxy)
180
+ vmess_type = None
181
+ if proxy["transport"] == 'tcp':
182
+ vmess_type = 'http'
183
+ if 'grpc_mode' in proxy:
184
+ vmess_type = proxy['grpc_mode']
185
+ vmess_data = {"v": "2",
186
+ "ps": name_link,
187
+ "add": proxy['server'],
188
+ "port": proxy['port'],
189
+ "id": proxy["uuid"],
190
+ "aid": "0",
191
+ "scy": proxy['cipher'],
192
+ "net": proxy["transport"],
193
+ "type": vmess_type or "none",
194
+ "host": proxy.get("host", ""),
195
+ "alpn": proxy.get("alpn", "h2,http/1.1"),
196
+ "path": proxy["path"] if "path" in proxy else "",
197
+ "tls": "tls" if "tls" in proxy["l3"] else "",
198
+ "sni": proxy["sni"],
199
+ "fp": proxy["fingerprint"]
200
+ }
201
+
202
+ return pbase64(f'vmess://{json.dumps(vmess_data)}')
203
+ if proxy['proto'] == "ssr":
204
+ baseurl = f'ssr://proxy["encryption"]:{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
205
+ return baseurl
206
+ if proxy['proto'] in ['ss', 'v2ray']:
207
+ baseurl = f'ss://proxy["encryption"]:{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
208
+ if proxy['mode'] == 'faketls':
209
+ return f'{baseurl}?plugin=obfs-local%3Bobfs%3Dtls%3Bobfs-host%3D{proxy["fakedomain"]}&amp;udp-over-tcp=true#{name_link}'
210
+ if proxy['mode'] == 'shadowtls':
211
+ return f'{baseurl}?plugin=shadow-tls%3Bpassword%3D{proxy["proxy_path"]}%3Bhost%3D{proxy["fakedomain"]}&amp;udp-over-tcp=true#{name_link}'
212
+ if proxy['proto'] == 'v2ray':
213
+ return f'{baseurl}?plugin=v2ray-plugin%3Bmode%3Dwebsocket%3Bpath%3D{proxy["path"]}%3Bhost%3D{proxy["host"]}%3Btls&amp;udp-over-tcp=true#{name_link}'
214
+
215
+ infos = f'&sni={proxy["sni"]}&type={proxy["transport"]}'
216
+
217
+ infos += f"&alpn={proxy['alpn']}"
218
+
219
+ # infos+=f'&alpn={proxy["alpn"]}'
220
+ infos += f'&path={proxy["path"]}' if "path" in proxy else ""
221
+ infos += f'&host={proxy["host"]}' if "host" in proxy else ""
222
+ if "grpc" == proxy["transport"]:
223
+ infos += f'&serviceName={proxy["grpc_service_name"]}&mode={proxy["grpc_mode"]}'
224
+ if 'vless' == proxy['proto']:
225
+ infos += "&encryption=none"
226
+ if proxy.get('fingerprint','none')!='none':
227
+ infos += "&fp="+proxy['fingerprint']
228
+ if proxy['l3'] != 'quic':
229
+ infos += '&headerType=None' # if not quic
230
+ if proxy['mode'] == 'Fake' or proxy['allow_insecure']:
231
+ infos += "&allowInsecure=true"
232
+
233
+ infos += f'#{name_link}'
234
+ baseurl = f'{proxy["proto"]}://{proxy["uuid"]}@{proxy["server"]}:{proxy["port"]}'
235
+ if 'xtls' == proxy['l3']:
236
+ return f'{baseurl}?flow={proxy["flow"]}&security=tls&type=tcp{infos}'
237
+ if proxy['l3'] == 'http':
238
+ return f'{baseurl}?security=none{infos}'
239
+ if 'tls' in proxy['l3']:
240
+ return f'{baseurl}?security=tls{infos}'
241
+ return proxy
242
+
243
+ def to_clash_yml(proxy):
244
+ return yaml.dump(to_clash(proxy))
245
+
246
+
247
+ def to_clash(proxy, meta_or_normal):
248
+ name=proxy['name']
249
+ if proxy['l3'] == "kcp":
250
+ return {'name': name, 'msg': "clash not support kcp",'type':'debug'}
251
+ if proxy.get('flow', '') == "xtls-rprx-vision":
252
+ return {'name': name, 'msg': "vision not supported",'type':'debug'}
253
+ if meta_or_normal == "normal":
254
+ if proxy['proto'] == "vless":
255
+ return {'name': name, 'msg': "vless not supported in clash",'type':'debug'}
256
+ if proxy['l3'] == "xtls":
257
+ return {'name': name, 'msg': "xtls not supported in clash",'type':'debug'}
258
+ if proxy['transport'] == "shadowtls":
259
+ return {'name': name, 'msg': "shadowtls not supported in clash",'type':'debug'}
260
+ if proxy['l3']==ProxyL3.tls_h2 and proxy['proto'] in [ProxyProto.vmess,ProxyProto.vless] and proxy['dbe'].cdn==ProxyCDN.direct:
261
+ return {'name': name, 'msg': "bug tls_h2 vmess and vless in clash meta",'type':'warning'}
262
+ base = {}
263
+ # vmess ws
264
+ base["name"] = f"""{proxy["name"]} {proxy['extra_info']} {proxy['port']} {proxy["dbdomain"].id}"""
265
+ base["type"] = str(proxy["proto"])
266
+ base["server"] = proxy["server"]
267
+ base["port"] = proxy["port"]
268
+ base['alpn'] = proxy['alpn'].split(',')
269
+ if proxy["proto"] == "ssr":
270
+ base["cipher"] = proxy["cipher"]
271
+ base["password"] = proxy["uuid"]
272
+ base["udp"] = True
273
+ base["obfs"] = proxy["ssr-obfs"]
274
+ base["protocol"] = proxy["ssr-protocol"]
275
+ base["obfs-param"] = proxy["fakedomain"]
276
+ return base
277
+ elif proxy["proto"] in ["ss", "v2ray"]:
278
+ base["cipher"] = proxy["cipher"]
279
+ base["password"] = proxy["uuid"]
280
+ base["udp_over_tcp"] = True
281
+ if proxy["transport"] == "faketls":
282
+ base["plugin"] = "obfs"
283
+ base["plugin-opts"] = {
284
+ "mode": 'tls',
285
+ "host": proxy["fakedomain"]
286
+ }
287
+ elif proxy["transport"] == "shadowtls":
288
+ base["plugin"] = "shadow-tls"
289
+ base["plugin-opts"] = {
290
+ "host": proxy["fakedomain"],
291
+ "password": proxy["proxy_path"]
292
+ }
293
+
294
+ elif proxy["proto"] == "v2ray":
295
+ base["plugin"] = "v2ray-plugin"
296
+ base["type"] = "ss"
297
+ base["plugin-opts"] = {
298
+ "mode": "websocket",
299
+ "tls": "tls" in proxy["l3"] ,
300
+ "skip-cert-verify": proxy["mode"] == "Fake" or proxy['allow_insecure'],
301
+ "host": proxy['sni'],
302
+ "path": proxy["path"]
303
+ }
304
+ return base
305
+ elif proxy["proto"] == "trojan":
306
+ base["password"] = proxy["uuid"]
307
+ base["sni"] = proxy["sni"]
308
+
309
+ else:
310
+ base["uuid"] = proxy["uuid"]
311
+ base["servername"] = proxy["sni"]
312
+ base["tls"] = "tls" in proxy["l3"]
313
+ # if meta_or_normal == "meta":
314
+ # base['client-fingerprint'] = proxy['fingerprint']
315
+ if "xtls" == proxy['l3']:
316
+ base["flow"] = proxy['flow']
317
+ base["flow-show"] = True
318
+
319
+ if proxy["proto"] == "vmess":
320
+ base["alterId"] = 0
321
+ base["cipher"] = proxy["cipher"]
322
+ base["udp"] = True
323
+
324
+ base["skip-cert-verify"] = proxy["mode"] == "Fake"
325
+
326
+ base["network"] = proxy["transport"]
327
+
328
+ if base["network"] == "ws":
329
+ base["ws-opts"] = {
330
+ "path": proxy["path"]
331
+ }
332
+ if "host" in proxy:
333
+ base["ws-opts"]["headers"] = {"Host": proxy["host"]}
334
+
335
+ if base["network"] == "tcp" and proxy['alpn'] != 'h2':
336
+ # if proxy['proto']=='vless':
337
+ base["network"] = "http"
338
+
339
+ if "path" in proxy:
340
+ base["http-opts"] = {
341
+ "path": [proxy["path"]]
342
+ }
343
+ if 'host' in proxy:
344
+ base["http-opts"]["host"] = [proxy["host"]]
345
+ if base["network"] == "tcp" and proxy['alpn'] == 'h2':
346
+ base["network"] = "h2"
347
+
348
+ if "path" in proxy:
349
+ base["h2-opts"] = {
350
+ "path": proxy["path"]
351
+ }
352
+ if 'host' in proxy:
353
+ base["h2-opts"]["host"] = [proxy["host"]]
354
+ if base["network"] == "grpc":
355
+ base["grpc-opts"] = {
356
+ "grpc-service-name": proxy["grpc_service_name"]
357
+ }
358
+
359
+ return base
360
+
361
+
362
+
363
+ def get_clash_config_names(meta_or_normal, domains):
364
+ allphttp=[p for p in request.args.get("phttp","").split(',') if p]
365
+ allptls=[p for p in request.args.get("ptls","").split(',') if p]
366
+
367
+ allp = []
368
+ for d in domains:
369
+ hconfigs = get_hconfigs(d.child_id)
370
+ for t in (['http', 'tls'] if hconfigs[ConfigEnum.http_proxy_enable] else ['tls']):
371
+
372
+ for port in hconfigs[ConfigEnum.http_ports if t == 'http' else ConfigEnum.tls_ports].split(','):
373
+
374
+ phttp = port if t == 'http' else None
375
+ ptls = port if t == 'tls' else None
376
+ if phttp and len(allphttp) and phttp not in allphttp:
377
+ continue
378
+ if ptls and len(allptls) and ptls not in allptls:
379
+ continue
380
+
381
+ for type in all_proxies(d.child_id):
382
+ pinfo = make_proxy(type, d, phttp=phttp, ptls=ptls)
383
+ if 'msg' not in pinfo:
384
+ clash = to_clash(pinfo, meta_or_normal)
385
+ if 'msg' not in clash:
386
+ allp.append(clash['name'])
387
+
388
+ return yaml.dump(allp, sort_keys=False)
389
+
390
+
391
+ def get_all_clash_configs(meta_or_normal, domains):
392
+ allphttp=[p for p in request.args.get("phttp","").split(',') if p]
393
+ allptls=[p for p in request.args.get("ptls","").split(',') if p]
394
+
395
+ allp = []
396
+ for d in domains:
397
+ hconfigs = get_hconfigs(d.child_id)
398
+ for t in (['http', 'tls'] if hconfigs[ConfigEnum.http_proxy_enable] else ['tls']):
399
+
400
+ for port in hconfigs[ConfigEnum.http_ports if t == 'http' else ConfigEnum.tls_ports].split(','):
401
+
402
+ phttp = port if t == 'http' else None
403
+ ptls = port if t == 'tls' else None
404
+ if phttp and len(allphttp) and phttp not in allphttp:
405
+ continue
406
+ if ptls and len(allptls) and ptls not in allptls:
407
+ continue
408
+
409
+ for type in all_proxies(d.child_id):
410
+ pinfo = make_proxy(type, d, phttp=phttp, ptls=ptls)
411
+ if 'msg' not in pinfo:
412
+ clash = to_clash(pinfo, meta_or_normal)
413
+ if 'msg' not in clash:
414
+ allp.append(clash)
415
+
416
+ return yaml.dump({"proxies": allp}, sort_keys=False)
4
417
  #واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
5
418
  #Email hiddify@gmail.com for free permium version. Do not crack this cheap product
@@ -393,7 +393,7 @@ responsive: {
393
393
  %endif
394
394
  </script>
395
395
 
396
- %if country.lower()!=hconfig(ConfigEnum.country) and has_auto_cdn
396
+ %if has_auto_cdn and hconfig(ConfigEnum.country)!="other" and country.lower()!=hconfig(ConfigEnum.country)
397
397
  {% macro reload() -%}
398
398
  <button onclick='document.location.reload()' class='btn btn-primary'>
399
399
  {{_("Check again")}}