hiddifypanel 3.0.0.dev63__cp39-cp39-manylinux2014_x86_64.whl → 3.0.0.dev65__cp39-cp39-manylinux2014_x86_64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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:20.973542
2
- from pyarmor_runtime_000000 import __pyarmor__
3
- __pyarmor__(__name__, __file__, b'PY000000\x00\x03\t\x00a\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\xc43\x00\x00\x12\t\x04\x00\xb3\x80x;\xd2\xf8\x8eX=6\xdby2r\xfar\x00\x00\x00\x00\x00\x00\x00\x00MQ\xd5\xe6/h\xee\xfb\x00\xa8lK\x97\xa9\x90\xb6|\x11(7U?\x1d\xd1\x875e\xdf5\x8c9z\t\xd05\xbbW\x8bO\xc86\xc3\xe5\xe0\xcbw\x9b!\\\x1aB\xbc\x8aZ\xef_\xfaG\xa9\xe6k\xe5?\xecu\x11\x00\x1c\x07\x82/\x8d\x8aE*(\x9d\xb7\x0e\rS\x9fj\x913@\xa6~\xca|\x1a\xab\x87\x15,\xce\xb2\x9fG(\xba/\x86\x17t\xbe\xbc\x10\x02\x87\x89\x07\x0e\x13^#\xb1\xfe\xd7\x13\xfe\xb6\xcc\x02\x0b\xa9\xea)\x83\x11y\xee\xa7\x0b\xa8\x83\xe2t\x02\xdc\x02\x00h)_\x1e<N\xab\xe6@\x99W\x907\xfa\xad\x9a4\x05>\x16\xc0\xb2\xa5\xa1I\xf3O\xe1A\xf1\xb5:p\xbf\x06\xf4\x9a\x9d!`l2O\x08*\x1e"\xd9j\xa9"\xfe\xad\x9cW\xe3=.\x88\xc3xK\x8bxz~\xf5q\xf4KbD\xa9\xce;\xee\x91\x17\x18\xc2\xc2\xaaz*+\xb4\t\x86\xb8\xd52)\x89\xbb\xc8-\x1eU\xbc<7\xbe\x0e\xea\\\x84\x84\'\xfd7\xb8\xba\xcc 7t\nFr\xe7\x18\x19\xb4\xef\xd9B=\xff\xe4\xbe\xe8Z\x1b\xb7\xc8\xa8\x1dB\xa2"$\x00lK\xab\xc3j\xb2r\xc2\x82V\x88\xf7\xd6z\xf5\xd9\xbf*\x88\xd8\x01_\x91\x820\xa4\xba\x93\x93\xca}\xb4\xf0\x88\xc9\x89\xd1\xec\xa9\xf0\x9bP\x98\xfc,H\xa3\xd8#x|Ql<*\x0cvk\xd2\xfa\x8d(\xael4\xb6\xd4\xe8\x93z\xe8?\xbe\xae\x9e\xbc\x97\x13\xafr@\x19ze\x80+\xfc\t[C\t\\\xf6%C\xabqd;\x8e\xca\xf9"iLJ \xfb\nG\xe9\xa7N\xeei\xeb\x99 =\xeb\x98\xf2\xb6\x0b2\x82L?!\x05\xa4\x02\xf0\xcd\x0f\x05\xda\xffH\xa6*/\x1d\x99\x97\x8b\xa2\x0cV\x97\x07\'\x9e/\xe2\xba\xf4\xa7\x082\xd0\xacb=ALF\x13>q\xf6\x08\xc6M\xf3*\x90?\xca\t\x03\xc6~\xbaQ\xda\x00\x86\x05\x82\xecd<??\x06\x04\x86x\xb9\xd5\xcb\xa2T\xf8L\x8d\x18N\xe0%\r\xfb\x1e+\x11\xdcS:\xdf\xd4\x8e\x8f\xdf\x0eR\xb9v\x96\xc0P5\xa0y~\xf7&\r\xf7\xa0\x98\xe2\xac\xb7\xa6t\xbb\x81\xab;"<\xef.\xa8<\xc5\xac;&)Y\xd5\xf1K[\x87\xe9L\xc4@`\xaa\xed\x05\xc8\xa3d08\x19\x85\x0eS{3I\xab}\x8b\xea\xb6bP\x1f\x1c\xf4\xbc\x86fNy\\\xf8\x82F\x8d\xe5\xed)\xf4\xc0;\xaa_\x08$s\xbe`2[\xccY\xe0,\xb93\xea\xc8c\\\xde\x8a\xc3\xd2x\xe6\xc9\xf8\xafN\x12\xde\x1c\xb9Za^^\xfcx\x00\xf5B\xc9\x03\xb2\xc5\x12\xcc\x1aY\t\xa7\x92\x7f\r%\xce\xd3\xb2\xcaH\xf3\xcd\\\xdcC\xfb\' (e\x9e\xb8\xcd\xfb\xa2iv\x01\xd7$\xd3\x0e\xa7\x07\xa7\xeb\xe2\xc9\x0f\\i+\xbah\xf8u7m\r?\xb2\x01qU\xf6J\xd7\x8f\x16\x17\xfdm\xb3\xaf\xa6RF\xcd:M\x88\x91\xbb\xd0O3\xf8\xe5\xc0\xa0\xfeA$\xc3)K\x80\xcd\x1e\xda\xba6@OL\x8a\xa6\x7f\xdb6]\xd2\xb5\xbc\xdb\x94\x06Z\xa2r\xb4\xd4\x1a\xe7\x82\xba\x1c\nCN\x91\xab\xa2@\xc9\xb6\x07$\xb6w\x1d}4\xb5\xda\xa7\xf9\x0eNz\xa8d\\/\x1c\x9d\xec\x0f\x19\x91\xe3\x0b\xc4\x88F\xad\x88\xbf\xb6D`\x03\x1c~Jo\xd3\xbb\xed\xd3\xc0\n\xaa\x80<\xb1U_\xb2\xb9\x02/9,\xa4\x1b\x97\x9d(\xef\xa1V(\x83\xb7g\x18\x0c\xf9\r\xcc\x85\xfdF\x92\xb4\xe2\x0flh/\xbf0\x84\x9f\xce2\xcdz\xfe\rR\xf9\xb8\xa8>\x9d\xcf\xe2\xec\x8e\x15\x11\xad\xcf]x\t\x1f\x12E\xd5\x10\xed\xff\xe2[\xe3o\xc3\xb4\xbb\xbc7M\x98\xe2\xfdG\x9b\x12[\xf5\xb8\xa2$\x97\xbe\xed.f\xe7k\x89\xad\xdf\x99\xe936\xfa\xcb\x04\xc9\xe7\r\xb3\xaf\xc6LC\xe1\xc5&)\x11\xbe\xbc\xd6\x90\xe6\xcd\x8a\xcb\x03\xb4\xedZDN\x97\x8a$\xc6H]\xe2c%\xf4\xe01yG\x01r\x9f\xf6\xa3%\xe8+g\xc6\xf9\x0f\xd16\x07\'\t\x88\xceU\x08\x00\x13\x80\x12Z\x98\xea\x83\x08\xd4\xc2\xa0\xb2q\xf6\xc3\xc8A\x83@\xb4\xc2\x82Dn\x90\xd4?\x1e\x8f\xd1\x92\xaa\x9bi\xa2\xa6Qn\x8b\xf1\xae\xef.\x15\xa4\xac@\xbc\xc6\xa2\x1a\x93\x13\x01\xb6\x03\xf3\xdb\x1cV\xc0\xc8\xef\xfc\xfd\xa7VP\xa4\xf5\x02qye\xfb5F;\x10\xb1\x03zt\xd9\x85\xa3\xb1\xff#\\\xc4U\xf1B\xc0\x19\xca\xec\xf7_\xbc\xe3\xe0\xe6=\x97O\xea\xf1\x82\xb8\xb8F\x1b,"\x82\x1aO\xbbT\xe9A\x7ft\xda\x01V\x9d\xbe\xc8dN,\xb1xN\xaf\xd8+\xf7\x96\'\xa7\xf2\x0fj\x96&Hc\t\xf8\xb7\xc4U\xe3\xc8e\x112\x1c\x0b\x9f\x8dn\x82"\xda~\x13\xf6\xb5\xfeW\xc7\xfd\xad\xa6\xd6\xe9%2}:\xe2 G\xfdN\xe4v\xc9\xf4p\xa6\x850\x8b\xcf\xac\x07n\x8a\n\x06\xc5,\x99\xb1\xcb\xbf\xd4\x16\xfd\x05\xa4\x15\xf4\x07\x08Z\xcf\xbfq\x95\x0b\x9f\xcd\xd4:\xba\x06\xde\xec\xa9\n\r\xf3\xa0\x7f\xf5\x02\x96\x18\x0ee\xe8H$\xef(z\x04\x1e\x14*\x1bsyV=\x98\x9a(f\x0f~o\xde"\n\n<\xf9\x8c\xc8\xfa\xa6\xd2\x98\x9ay\xfb\xe6\xd0t\xc0\x81\rLM]{\x01\xc5\xde\xa6o\xcc\x92\x10\x0f\x97\x1e\xff{6\xcb\xff2D\xb8\x1c\x04>?T\xd6\x96R\x84\x1c\xb1{\x1a\xd4\xe5ss\xe1\xeeP\xa7\xda\xdf\x8f\xf1\xd3\x91\x82!\xac\x9a\xf7\xc3~\xae%Jx6\xeaq4\x17)#\x9e\x13\xc2&5\x00KE\xb8\x89\\\xa8\x17\xde\xa9\xa7\xc4\xde\xa6\x07\x15\xc57N\xc6uHxz$\xc4mr\xa6\x90Lz\'\xa1Q\xed\x88O\xa3\x9c1{p\xe9\xd0\xd27\x86\nL\xd7\xa9\xfdxV.\x9e\xbcj\x1e\xb9@<\xa9\xc8\x8d\xcd+wH l\x0c/\r\xc8E\xfe\xfa\xbb\xdb\xdb\x92T\xb2am\x0e\xc0\xd0x\xc9\x80E]\x10\\\xf0v\xd3=\x0bPC\xb2le\xd14H[:T\xf2Q\x08\x05\xdfjc(\xc0\x10\x14a_\xb2\x83?\xa0\x93\x10\x98b`\xba\xa8-\x900\x8fC\x0e,\xd7\x10\xd6#\xf4N\xc7\xbe\xe8\xb86\xd6\x1f\x95\x8a\x0c\xd3I\xee\xba\x0c\x98\xa9Z_uXfa)S\xc9]+\x83\xd3mtow\xc5\n\xf6[\xa5#\xa2,\x7f\xca\xf4\x17\x93Z\xbf\x80S\xbf\xcb\x8f]\xdb\xe5\x8b\xaa\xb3\x02I\x1d\x81Y\x80\xa2\x04\xa7\xaf\xe0\xb0\x93\xd6\xb7\x8f?\x85O\x00\xb9\xe2\x8f\xc1\xe6\xbf\x8e\xb1\xdc\x1d\xb6\xd6\xc7\x12\x84\x96\xe1\x13f\x8b\x02\xa1e\xf7<\x87\xf7n\x7fG\x1f\xafw\xa9<3@\xd5g[2\x116\x83\x03z\xbat\x84\x02\x15\xaa\xa8sU\x1f@\xed\x80\x83\x94\x8c\xae+\x99\xdf\xaf\x1d\xefJRO4\x85\'\x801?d\xdc\x95;\xe0E\xf6:d,\xf7\xdaE\xd8\xe1&\xdc\xe8\xc3&\x7fB\x821\x02\xe9\x13\x9c\xe8?\xd8\xdaE\xba@\xacl[r\x99\xdd\xb3[\t\xa23\xfc!\x94f\xa0T\xbci\xb8\xcc\x8f1\x95A\xc7\x83XC\xc2\x95"\xbbR\x18\x9f\xddtA\xac\x01Rk\xe4\xbb\xc3I\xb9\xca^\x18D]G\xce\xde_%:l>\x83L\xb1Gs\x8a/\xf1~\xec\xddwh_~Y\xacab\xf9\xfb9\xb4\xb9\xcd5)\xd6\x9d\x06-S\n@\xa1\xfc~2\xce\xc7\x00\x00\xacJ\xa5\x16\xe6\xa6\x92lP\xc1%\xf09\x85\x15\xdeMw*\xe2\xe5\xb1\xa9&i\xfa\xe6\x8eP\xf6\x17\x92\x97W\xeb\xe1\xb8\xb5\r+\xda\xaf\xa1\xbc-qd~@O\xdc\x0f\xb6\x0b\x921\x9dj\x12Za\xf8\xcf\x97\x97\x14\x9b\xe80\t,\x13\xb8m\xfd\xba\x108\xe9h\xd9"\xec\xd0\xfd\x95i\x9f\xbb\xf3@7\xe6\x19<\x16|\x9es\xfcB"TU\xee`\xcfaQW\xe6\'\x9c\xc7\x93d\x1f\xeb\x11\xfd\xfb\xe9\xc3\x1c+\x99A\x08\xc5\x15\xe72\x19\\\xceps^s\xae\xdc?\r3\xcc\xd0\x93\xa3\xed\x92\xf9\xd6\xfeW|u\xb4~B\x10\xf21\xcd\x89\xc7\xc8#(;\x01\xbf&_L\xed\xcfD\xbeF.\xbd\xa9\x9dG_jl\xb7\xf6\x10\xc4\x16\xad\x12\x8e\x997\xd6\xbf\x14\xb0>j\xa0\xf9\xac\xce\x98\xc6\xbfA\x86~\xf7\xf2\x0cm\x8f\x94\x1f\x13\xa4;\x14\xf2\xec\x7fs\xb0T\x91\xd8\xcf\x8a\xbb;?\n\x82\xcb\xfc\x9bnZ\x14\xe0\x98\xc8gv\x97\xf6\x15Z\x8d\x9f\x05\xbfO\x03\x82\x9f\xe4\x1b\x95]\x12\x90\x93),s\x1aT\xb8,\xd3s4"\xd4\x14\xca\x03g\xeeY|\x89\x0cm\xe2h.~\xe8#\x9cv,\xb9\x08@\xa6\xa9\x03\xedo\xbe9\n\x93a\xbe\xbb\xc8\xc1\x92\xcfy\x19\xda\x8f\xf2\xef\xb0\xd3#\xebN\xe1\xa5\x9e\x01!\x89\x05\xd4\x8e\x90r\xf0\xe6\xf5\x82\xe3\x80}\xf2\x91\xb8`\xb8\'*\xdb$\xdc\xbe\xa5\xc4h\xca\xf4S\xde\x99\x1a~\x18\x82\xb6\x03j\xae\x98\\\xcf\xa8\xae\x1d\x03\xdd\xeaCF\xa8\xa2~\x89\xec!.\xfc\xd6\xa1\xd8\xc9`$\x9a\xe9a1\x1b\xaf\xc4cM\x90\xb0\x96\x12n\x1d^\xe8\xfc\xfe\x87\x07k\xf0\xbf\xa3\xdd\t\x9f\xf4\x03\xac&!Ty\x1dL\x96\xe9\xaf\xbe\x10\xbaC\\\xd6}\x04\xd9\xcc\xcc\xcf\xe3\xcbV2}\xe3Ek\r6\x7fo\x9b\x89\xc6\x00\xd1\x16\x19\xab*\xac\x0e\x88\xe7I\xf4\xfch\xb2\xbd\xde\x83M\x831_(i\xa0.n\xa1@m\xb3\x9a\xc28\x13xu^\xa5\xbb\xbc[\xe2\x13x\x909\x15m=X\x94\xa0 Q\xec\xc3@\xb5\xa7\xe6%\xd8\x1c\xe1V\xc1N\xf8x\xfar\x02\n\x9f\xd5\xe6\xab\x8a\x10C\xa2\xd7\xad(\xfcH\x1e}\xc9\xc5\x90\xa4\xf9\x89\x85\xf5\xfa\x15U\xe0N\x9f!\xad,\x8d\xa3X\xfe\xae\x9b\xbe\x80B\x9b5\xee\xb9H\xb6\xc9\x18\xad.\xfa\xd6-\xda]t=\x0c.\xde\xd1\x84,\x1d\x12$\x95R\xd0Z\xc3\r\xd0\xf9\xfb\x15\xf81\xc9\x88\xa0\xa1\xe6\xb4\'\x02uB\xfc :<F\xc6\xb7V\x84]\xbf\x85\xe7D\xadE\xbf\x80\xb9\xa1\xf4\xe5e-oo\x95G\xb9\xbcF#\x98\xf5[\xe3\xb7\'\x17\xce9&es\x1a\x0b}\x97\xfc\x96\x85\xe9>\xb9\xeb0\x9d%\xf4\xe7\x9cn3\xea\n\xb0D\xc3t\xd0x\x9d\x99\x93\xc3\x87\x1d\xc6\xd5\x02\x1b\x0b\xec\xb6\x17\x1b\xf9\xcfju\xf7w\xf2\x84\x07Z\xdaQy\x95\x8f\x88\x95E\'\x94\xb8\xc0\x98\xdf\xa6\xf8J\x0f\xd3Z\xa6\xfd\xba\xbfDG\xe3\xd7\xf0%T\x19eU/\xa7\xfe\x1epK\xd6\xbf\xae\\\x87\x1d\xe3\x860\x08\x1f\x99\x15\xa3\x84\n\th\xf4\xfem\x16F\x1c5)Ca\xa9x\xa7\x1b\xe0\xc3\x7f\xb7\xdf}\xddm\xe9Ib\xd2\x1f\x92Ks\xf9\x8fh\xf68\x85\xc81\x99\xa0#\xa3\xf4DE\xf6\x04x|\xfb\xd6:\x0c\x01j\xf7\x91\xd4\xca?\x07\x96v\x0e{N)\x050O\x8c\xd3\xc1\x00v\xe8\xf8\xd56\xa3\x9b\xce:J7W)\xb1m\x92:\xdb\xfaK\x1a\xe4\x1e\xbf\xd4\xd1j\xa1\x00\x96\xbbR\xd4\xf5\xa9o\xae\x16\xc9>\xd0Y\x81#\t\xae\xc5\xd5\x18\xb3\x1f\xf1\x01R\'\xde-%\x98J\xac\x11}\xf9\xb5=86\x031\xc0\xf0d\x11\xa1\xe2\xab,\xd8N\xceD\xc1x\xcbR\xc9\x94n\xe6\xeb\xf9\xa5\xeb\x15\xf0\xaa\xb4=\xe2\xc9aZ\x1f\xe5FhUO\x02S\xe2\x94\xc9UP\xaa\xe1\x8e\x1d\x1c\xaa6\xb7<\xffl"R\xad\xd2\x0e\xb0#y\xcc\xb5\xccc@v\x94g\xc4\xa4\xe4,t\x1a\xe7\xd8;:4\x91@rz@Q\xc0\xf8;\xdd\xbfD\xbfIw\r"\xcb\xc0\x95(\xbbL\x12\x060\xfb\xd2\x13\xa5\x02?\xe8\xda\xdb:(\xae\'aa\x82\xec\xeb\x8dx\xd1\xa0\xb7\x14\x90U\xd0\x11\xe9\x99\x91\xd6)\xd4Jq\x18\xf4\xd2\xe3\x0b8\x01\xe3\x1e\xd0oB\xed\xb91\n\xa1\x90O\xe7\xa1\x94\xb571\x06\xd0\xea\xff\xad\x84)\xa4F\x0c\xe4Y\x83\xa3\x05\xf90Ch\xfc\x8cAv\x0fUi"\xbd\x8bP\xf5\x7fT\xaa\x05\x96\x84>\x8b\xe91S%\x914*\xc1\xa7\xfcw\xc3\x0b\rF\x9czs\xe6\x80\xa0\xf6\xff\x9f\xb9\xcc\x06\xfd%k\xc0\xaa:\x81_ \xfa\xff\x05\xc9\xfa\xb9(\xdey\xda\xaf\x06n6\x9b\x17\xc5;\xa7\x08\xe0\x8f\xdb\x87\xcc\xfb\xf5\x80m*\xda\xc9i2\x11d\x10\x01\xaa?.\xa8\xf1\x1b6h\x965\x1d\x1af\xfa\x8b \x93\x1a\xbd\xc9AO\x91\xf4[\xc7\xc9\x921?\xa9\x08D\x8f\xcc\x9f\xd006%T\xf7\xb5\x8e\t\xcf\xf2zp\x13!~\x81\x91\x00\xd0C\xb7p\xf53\xbec\xca\xb9\t\x05\xe6\xa6I\x96\xbc\xfeh\xee\xab\x9d\x8d\xca\\\xbb\xad\x05\x1b\x15A\x8d\x95\xea$\x06\xbb}$\xbcm\xe3\x84\x9a\xc4h\xabZ0W\x03\xe8w+`\x17$\x11&|\xd3\xbc\x96\x85(h\x83\xfcpV\x08\x0c\xb6\x9c\xda?\x9b\xd4\x17\xc4*__\xc569\xb9&b!\xe6dBN\xa6\x0b-\xcb\xa4\xc7\xe3\xeaZ\x86\x8c\x90G\x88\xe8\xbeq\x1a\xfe#\xc6\xa7\x07\x8d\xf6T\xf8\x06\xd1\xc8\xbd\xb6\xa4\xdb\xedL8ZT\x81+\xdbj.\xcd\x8b\x16\xd4\xd4%!\xe8\x9cb>\xabv\xfc\x0e\xf2\xe1\xd3b\xb1}+\x988\x8f\xd6\xc0\xec\x03P\xa6\x86|X\xc1\x80:d\x86!\x12jyZY\xe9S\t\xca\x1a\n\x95Z\xc5\xfb\xd9\xd3\xb8\xc2\t\xc6\xd6\xa9\xe2\xeb[\xa0\xf8g\x9e\xae\xb7\xbe#@&\xb2\xb9\xc7\xb9\x07r/7\x03\xe9\xedQ\xa9\xceF\x9ad\xff\xb5\xb3s\xdb\' %V62\x8bb\xa9].\xe3\xfe\xdbV`H\xab\xd0O8\xd7\xe0\x8e\xe8U\x8b?\xe1\xae\xaa\x9d{\x92\xd8.\xbf\xca\x06\x00\xb9\xbb\xae\x9e\xdf\xf7bM\xb1\x1f\xd3\xd2\xdd\x85\xe0\xd9\xee\x06\xc3\x0b\xaf\x07lqV"~\x08\x88\x06\x18\xce\x9d\xe0\xa7\xb91|\xb5:\x99\xd5\xba\x1e\xb2[3\xd5MmW\xb9\xc9W\xca\x9d\xfeq\x88\xa2\x84\xc75dM\x95\xf5\xfd$\xec\x94R^4\xcam\x88\xe0\x06\xe0\xb0\x81\xfdVA\x8e\xb7\x1fY5\xed"\'g\xe3Y\x7ff\xe3j\xadM\x8a\xd0\n\x8ad\xf6b\\\xae\x7f\xf4\x12\x9cy\xfc\x9b\xd3y^ E7\xa1\xe6k>\xa1Cn%\xcbw\x9f\xb0\x05f\xd6<\xb6\xd7"`U\\x9\x86\xf7\xa6\x1b.J\x15{0s\xf8\x04\x01\x974{a\x88\xe2\x98d\xfb\r\x17\x9f\xf0\xd1\xa4\x98\xd5\x986|\xeeeh\xf2\xdat\xe2Ci\x91\xfe:<\xbbn7\xd7o\x02T\xbc?\x97\x0f\xdb\x0e\x0b\xf8~Q\xb3 \x1ci\x03\xee\xa2*LT\xe3\xba\xd1\xab\xb9@\xe3\x0eJ\xc2,!\xe9\xd4j)\xed\xebTq\xa9\x8c\xc6\x00\x1f\x1fA\xd4\xcb\x83\xff\xe4\xb2\np\xb3\xbd\xf5\xa7M\xab+w{A~\xcds\xf9\xe0\xa6\xb9\xe6\x8d\xb2\xcf7\x81D\xbcB\xbfq\x1dz\xe1\xd2\xf1\x11.X\xa0Pi\x83\x833iN+\xc8x\xa6\xcd\xdfake\xdeYZ\xaf\x9f\xa22\x8fE\x89\xc0de"\x8f*\xc8\x86\xed\x07^\x94%_\x95\x13\x1cJ\xccF2\x0cg4\xa4\x88Ri\xc3z\xcf\xb6\x1cI\x1b\x9e\x8c\xc6\xffUr\x19\x11\xa9\xd1\x01w\xa8X\xff\x90\x10]I\x0b\'\xc8\xc8.\x93\xbd\'Q\x97\xd4\xa4&6\x8f\xdf\x1c\xc1\xb33\x8ao\x8aT\x7f]\xdcn\x115\xa9\x97Bh\x1b.R\x11!\xb6\xcd,\xae\xd3\x97f\xc7(7\x0f\xed\xc0\xe2\xfd0\xd3RK[\xa0`\xd9\x13K\x1eC\x9d\xc0vV\x84\x0bk\x14\xafi\r\xddLQ\x0b%Y?\xefC\xab\x9f7\xdd\x1a\x08F\xbc\xae(\x89p\x9a\xad\x03SD\x0b/\xc4\xdbH\xf4S\xe2\x8e#\x91\xbd\xf4>o9h\x0b\x90Q\xde\x963\x12\x1d\x88\xf6\x0c\xa1\x94 B\xfe\x84\xb11fK8\x00D{\xd6.\x14\x9e\xf9Th\xc7>A\x89\x1dZ\xcb{\xd7\xd9M\xc6\xc5\xf8\'V\x04\x0c\x17\x95\xe0^\xe4\x92\xcf;jt\x86%leNO\x16-\xd9\x0b\xba:\xc3.\xa6m\xd4\xba\xe0q\x0c\x9b\xf0\x11\xfdZ\xc1\x92\x7f\xd5\xb4\x12c\xfa"\t\xf7\xdb\xfeL\xf1\x8a}9\xce\xa5\xfd\n5\x04\xcb;h4F\x07\xa8\xc9f\xb2L\xa3OY\x10\xa2\x86l\xd0\xbba\xdd\x87\xd4\x96}\xa1U/V\x06\xd3v?\xd7\x13\x95\xcb\xd3\xee\xa7\x1fD\x17\x81\x14\x80Z\xca\xd6\x84\xd3+\n\xca\xe4/\xc6\xb7y:9#\xfc\xc7\xc4\x06\x9b\xb2\xd8\xc2Vg\x91&\x86\xec\xc16\x15\x8df|\xd8\x1dV\x8a\xa08o%\x1f:p\xc47U\x10\xee2\xc3\xf8\x92\xd2\x88\xc2k\xf4*\x96\xa3\xdc\'\x96\xa1\x0c\x12|\x1f[P*\x18PS\xc8\xb7\xd5+\xaeV\'\xddG\xa4\xdd\xe7A\xa4Y\xa5a\xf78\xca\xfb\xa9\xec\xbfAi\x16\xf9\xd17QW\x05$\x88gm3in#\x8a\x960\x9f2\x84\xb5llTw\x18\x81\xcb\xb6\x06\x16H\x8e\xce\xe2\xef\xac\x94\x89\xd4a\xff\x1c\xfc\xb4#\x17\xd6E\x90\r\xee\xbd{\xa0\x15`\xcd\x92\xb5\xad}\xa1\xdc\x9cn\xe5\xb5\x1d\r~&\x13f\t="$,+y\x05\xd4\xd3W\x8c\xb1E\x9bK\x94\x17\xd2R\x8ci\xcb\x8a\xe8\xd2\xcecz\xc8\x1b\xe7\xc2\xb4\'\x07w,\xdb\xcf\xe8P5\xbc`\xff\x9aK\x11Vi\x1a0(\x1a\x14\xd8R\xd7\xf2\x94\n\x96\nj\xa2>\xa6\xe4\x92R\xa0\xf3q<\xef\x84\xcd\xdb\xe1\xfe\xae\xbe\x8b\xb6L\x8f\xfb}\'\x1f-\x98\xdb\xbaE\x10K\x1a\x8fxy\xcc\x9e\x1b<\xf2\x7f31a\xe9\x86\x13\x8b\x84\x01\x97\r\xd9Bd\x8d\xf7w$\xed\xc9\xfd\x91\x8eR"\\\x8d\x82\xfc6K^La\xef\x8f\x82\xac\xf2\xe6npg\xf4Kyj\x19\x01\x17\xd2\xce\xde\xa2\xf7i\x1e\x01\xb1\xe2K\xdc> )O)\xf4\xdd\xac\xa4\x87\x8e\x80X\xe7:@\xd0\xfd\x19\xe6\xa1j},\x14W\xe2\x08\xc1\x90\x0f\xe0O\x16tS\xd3\xc1\xb8[0\x90m\x9e\x06b\xc5\xa1\x0b\xd5ZP\xcdrs\x07\x12\xe5\xeb\x03ZH\xbc<u\x01[\xf2\xaeo(\x01Of\x19\xfd\x80pN\xb3\x9d\xee\xb0\x0c6\xf2\xde\x93\xaf{"5-\xd3\xc8]ry\x99\xee\xf5\xd73\xc2\xdb\x87\xed\r\xf6e \xd8Rw\x83\xe8f\xf3=qh\xdb\x1e1\xdf.i\xd4\xb7\x1c\x803\xf8\xd0\x7f\xe0\x05\xc2\r\xe4U\nIT*\x1d\xb7\xda\x03\x1e\xebo\x11\x03>\x1d\xbc\x90\x0b\x97\x8e\x0e\x0b)2\xc9\xfd\xc4\x0ba\x7fpX\xd2\xd44\xd3Y\x9a[\xd8\xa8\x1b\x98\x97$L\xeb@\'\xbe\x07\xa8p\xd3\xee\x196\xdc\xf2\xb5\x0c\xa2\r\x92 \x8b_\x801\xf7`\xc0\xa5g\x19Q\xe4\xd9\x07!\xe2\x89\xd5\xdd\x05\x1dq\xd8\x06b\xc8\xceAD~~\xc6&\xc2\xcf\x1b]R\xe2%\xf9\x84\x92\xe2\xef{\x8c\xf1\xbdr\n>\xe1\x14n\xdbto:\x12Q\x7f\xbbD\x92$\xd3"\xbb\xbc\x0e\x9f*\x0b\x7f\xc7u\\\xf2\xad\xbb\xb2\xcb\x93.\xc0\xfe9\xd0mh\x8d@\xe22\\\x7f\xf6\x17\xc2\x02\'\x8a\xa8{7\xd3\xe4\xd2\xfc\xdef\xdej\xb0\x89AA\xfe\xc9\xe7j\xa4I\x8c\x1fT\xda\xe6\x9a-\x0cQ\xef\xcd\xe5r\x10\xab\xe0\xf0\x91\xc8\x8aYF\xcam\x93\x1d\xb9u\xf6F,U>\x03h\xb0\x13\x99\x0b1=l\xbb\x87\x92GS+\n j\xc1;\x13\xd1\x8b\x08+\xaf\xdf\x15\x19\xb0D\xef8\xa6\xc6x\x97\xba"e\xf0!\x9e\xc4\x11\x8bkqgU\\6\xc2H\xd4\xebr\x9br0\xca\xfaB\xe5\x83\xc8\xe9\x81\xc4\x0e\xd4\xbc\xe1\xe4\xd83\'\xc2U\x17\xf7\xa6\xdd\xace\x85\xf0\x990=\xa0\xda\xb2i.\xfai-^wQ\xcc\xc4\x95\x18\x19\xcc\xb3\xd0\x1fW\x08j*\x937J3g\xbe\xe1~\xea\x14\xd6r\xaeNB7m\xcc\xf6Z\xbfi\xaf\xffp$\xff\xe6\xc7l\xf4ip\xd0\xf5\xf3\x93\t\x9e\x910\xe8\x9c\xcb\xa1\xae$\x83w9\xd5\x05=b\xcd\xb8\xf54%\x02%\x8f\xcb=v.\xca\x1e\nP\xf77\x8e\xd7\x83\xb6]78\xc6L\x82[\x8e\xc5{\xbe\xaf}\xe6\x1a\xce\xef\xcaC\xea\xcew\x98\xbap\xa1n\xde\xc2\xd6\x84\xe1M\xd01\xea/|\xbbA\x94\x0c\xc7[\x8e\x95R\xc3\xe3\xf0\x96\x896n\xf9\x08u\xac\xabW4\xa1-\x18[s\x9c\x8f\x02\xfeA\xec\x92\x94\x92\x18\xea\xfb\xfa\x0e\xfd\xe9\xf6\xf3\xbb\x9d1\xe4q\xef\x8f\xe3\xe2\x84*\x19DFC\xf9\x0fH_&4\x91\xfaEn\x7f\x12wt1\xa4j\x9cfX\xceB\x1f\x9fV\xa7\xc7\x19\xd7~\x0eY\\\x8d\xbe\xb9&\x13\x11\xd6s%/\xc7H\x8a\xdc\x8e\x11\x9c_\xf8&\xca\xedJ\xd9\xa2\x07\x9aR_\x85.\x99\xea\xf5\xc6\xecr;\xbf\xec\x8c>\x05\x1e\x8f\x07\xb8\xa3\x89f?*\x87\x8d\x80P\x9e\xb8\x1b\xd2\xb7\xb6\r=b_QK\xc1\x17\x14\xb2\xed\xf3\x87 \x97\xbe\xa1\x9b\xd9G\x11\x9f|\xc2\xb8\x15\xd3o\xb2\xedG\x8a\x86\x89\xb0-h\x0c\x0ev\x0f\xb8\xa0\xbd\xf6\x97I\xf2\x97L\xfcLH\xe2\xd7\xed2\xd2sLn\xd0\x15O\xa39C]g\xc8CA\x8a\xc8F@\x9a\x08\xee#E\xac\x8f"M\x96Z\x0bx\x18\xa7\x06E\xb7\x86\rp\xc4?\xaf\xd7\xb8\x00\xe2z^\xb3\xb0z\x9d\xe3\x84\x02\xf1\x1bi<\x1b\x1e~\xda\xb4\xfc?(z\x8a\x94\xf2\x1ep\x7f\x9c\xf7yr\xf3\xf7\xaaW*\xe0\x08\x1e3p}\xdf\xb5N\x90\xd0[\x04=\x17\x98;\xcb\x87\xf6\x18\xf8\x030C\xa7f\x94\xa5j\xd8\xe8"\xae\xbecQj_\x87\xab\x1d\xc1{\x9e\x81 \x9aT\xc9\x1f\xbc\x9e\xa2\xaf\x88\xe9\xbb\xe1\xf7\xa6\xd90\x8c\x91\xdbz\xd8,\x9d\n|\xec\xb4\xc2\xff\xfc\xe0q\xac\xd1<\xca\x7fTT\xa3"\xa8\xe4\xd9\x86\xae\x16\xf3<x\x1a\'#-\x0fz\xa5\xadXz(8\xdd\'\x10\xa4\x17\xf0\xe3\x91\xa2H\xcfpl\xef`\xa4\x0c\x81\x80\x13.\xe8\xcaS\xeagt\xed\'y#\xcc\x1d\x9f#\x03\x1bl\xae\xfev\xe2\xcc\x17a\xd0+\xc3N\xfe]\xc6\xcc4\xec\x05\xf6]0\x9a";\x86\xba:\x14\xae\xffW\xd7\xc7\x9c\xa4\xe2\xd7\xbf\x98\xe9{\xde\xaa\xc3\xa7E\xe6\x01\xd0T\x8f\xd1K\n\x8e\xda\xe6\x83\xd2zk\x8c\xb9\xc9\xbb\xb4\x95\x8cM\xb6$3F)\xc2\xcc\xd47U\x8a6\x9f\xd7<\xb3H\x9b\xbd\xa37\xfb\xe6\xc1\xa8r\x87g\x16H\x13\xfa\xb3\xd4\xf6\x9f\xf1\xbf\xeb`3\x04g\xe0\xf0\xba\xef\xcc`7(\xf4I\x15\xf8Y\x17\r\xd3\xf6*\xb3m\xd4\xa7\x1c\x9fu\x04\x02\xc6Q\xeb\x1cC\xe5\xbf\xa4\x8er\x81\xe8;\x01d\x90\x05E\xf8\x1d\x06 c\xd16\xed\x87\xa7\xfaYAy\xcbo52F6\xe7j!BmWWf!\xe4\xbf\x90\x99n\x02\xadSX\xe2b\x11\\\x011\x8cE\xa09\xa9\x1c\xa9\xc4\xa3\xef\x8e\xa9>\x05\xab\xad\xcc\x88Mjbl\x12\xb3\x01\xeb\xddqwQ (\xef\x8b-\xed\x9bE\xed\xb9\xc4\xa1SI\xf6\xd2p?\x87$Ik\xef\x1cC\x85\xb3\xca/\x0f\x8aK\xbe\x1f\x8ep@f3\xb2v\xb9s\xa5\x9e\x9c\xde\x9e\x05\xed\xcb\x87\xee6l\xdcsk\xbf\x1e6\x97uG\xfc\x12F\xfc\x16~\xb9;\xa1G\xb8\x8f\x13\xc0\x97g\xdc\x08\x89\xb1\x19)\xd7\x98\x8dX\xdf6\xe1\xb6\x91\xc7\x10U&"A+\xb3\xa0>\xe99E\xc43\x18N\xa3`\xe6M^\xb6\xaf\x8e&:\x0c\xdb\x19\x7f\xe72\xa9{\xcc\xe0)\x1f\x8b\x03\xf8CT\x05\xe1h1\xb4`\x15\x92M\xa0H\x91\xbf&\xe9(l\n\xb3(\x13\x13\x173\x19\x99\xdfUzR\xcf+\xa0\x81V\xf5r(@\\eI=\xe0\x1c\xd8UPgk\x8e\x84\x15\x82\x04\xc8\xe2aN\xaa\x17\xd2f\xfa\x80%\xabX\xa8\xd3k.\x86\x1e\xb0\x95\xe2\x9c\xa7p(Y\x02\x8d,\xe4;\xef\x1a>G\xe5\x9d}\xff\xdcp\x8c\x89\xf3\x08\xfc\xf3\xb3\x9e\xf3\xb0\xc7\x06\xab\x03\xbf\xa7J\x1c\xd7B\xca\x80.\xb2\xbb\x81\xdb\xc8F\xc9g)\xf5R\x87\xee\x84\x14\xfb\xdf\xd9\x97\xdd\x90\x96\xe0\x11q\xbe\xce\xd1\x1f\xff\xaa\x134\xb1L&\x9e\'\xdbpM_\xcbY\xcf")\xe4@\x16\xd7!\x93\x87Mz\x89\xe76\x9f.\x88\xf8k\xa7-Z\xc8\xa5R\x08\t5\xe8w\xe3jJB\xd9\x03\xaezO\xe3\x02\xde\xebKug\xa3\r\xba8X\xec\xad\xd4|g\xb6\xa1\xf6lN\xba \xc6\x8c\x97\x01*E;\x85\xa1u\xb8(.\x8d$\x96\xe9\x9dE\xf4\x14\xf8gS<\x88\xf2\xbf;\xa45-\xc0\xe4&\xd3o\x0eTQ\x96\x15\x8f\x89\xbe\xd8\xb5\x14\x03\x8fTQz\xda-TE^T1\x9c\xdb\x80\xc12q\x12\xb8\xf0F\x00Qu\xff\xf9\xcd!\xe2\xd0C\xf9\xa9-\xbe*\x95X\x82\x12\x18\xfc\xd2h\xa8\x86dp\xa5\xfe\xf0b\xa54\x83K:k\x8ev\xd7)j\x13\x9f\xb7\xed\xb7\x16<\xb1\x96\x96\x1e\xee\xe6"\xd6Bf\xc8\xf1\x8f\xb5\xc7\xdf\xde\x9c\x8d\xeb\xb2\x02\xb8\xb7\xa3,\xa3\x18\xc5\xd4\xa7\x172G\x05\xee\x8d\xd7\x8a\x14\x99\x98}7Tr\x06\x86\xdf1\xf0\xb1\x9ex\x15\x8f\x85\xe5\x82\xe8.\xa8\xe9@l\x1b\x16\xef$\xf0X\x92\x82$\x8bX\xec\xe8\x90\xe1\xf4\x1a[%\xd8-\x03\x80x]D\xa2*`\x0e2<3[x\xb68\x92\x05\xf7<\xa0\xa8w\x86\x15H\x03\x01r\xa8\xe5\x1d\x90jp3>>k\xf9U\xaf-\xa4\xda\xf5\xdd\xf7I\x9bB_LU\xe8\xb8\xaei\xf5\xdc\x0b:F\xd3W\xd3\xe5.\xfdYL\x95\x8c\xde\xa3X\x12;\xa0\xfe\xc9\x05\xa16\xe6\x87\x07\xd4\xff\x99\xc2o$\xbaVNW~\x1er|3b\xaf\t{c\x92\x95\x89\xb0\xafd\xa6?7\xb8\xfe^\x17?\xff\x8d;\x0ct7\xf8H\xbe~d\x0b\r{?\x98\xa3\xac$_\xc3t\xac\x1c\x86\xc7\xfd\xf1fI#t\t\xaf+\xadu?\x8e\xde\x97\xe2\x9deT\x98\xd2\x8anA\x89D\xcd\x9f\xd2a\xfca\xc2\xb4T|\xc9\xdd\xd5\x91\xf48g~\n}\xfa\x94>T]E\xa2\x89`\x84g\xc3\xab\xaamv\x1b\xbd|\xc4A\xef\xcc\xfa\xe7\x19}k\xde\xf3u\xb1^\xb2L?\xea25\r\xc9`\xd45\x7f\xbc\xfd\xa3z\x02\xa9\x94\xcc\xec\xact\xee~\xd9d\x02\x02\xd3\xa8W{h\xee\xcfN\xf1%\xf6\xedM0\xd5D\x1d\x8f\xb4\xdc`\xeb\x1a\xda\x93A0\x85\x9a\x0cW\xd2\xce\xd1g5\nb\xf6\x84\xebj\xb5\xb8O\xb9\xc3\x14D\xd8\x9d1\x9b\xca8\xb5\x11\x99C\r\x81/]\xa7\x83\xa6\x86\x82\x1c;r\xd4;\xcd\x1ber\x81\x806\xa9\xadK\xa1\xf0_S\xad\x1d\xcaH\xcd*\x00\xdeMp}\xf1\']\xd3\x8f\x99I{#.\xb1\xe9\xea\xed\x89\x12\\R;\xdf\xb7\x1d\x0b\xb1\xaa\x06\x83\xc5Kg\x97hbM\x1d\xc8<\x12fW\\\xfe\xd6\xbd\xd4\x84\xa6P\x16\xae\xd7\xdfPhi\x81\t-.\xa1\x02w\x1d:\x8d\xe9gC\x90p\xcb\xa2r\xb8\x8f\x91\xf9\xf2#\xc1\x97\xe4\x00\x97T\xd2\x8c\xa3.\xc0[\xf44\x96\x94|\xa1\x9dW\xc2e2\xf2`\xa9\n\xf1\x8d\xb9\x0f-q\x15\xb5x\xab\x8f\x92Or\xb2L\x05\xee\x10\x11J>\xc8T\x06h\x86L\x1f[\x00J\xad\t\xeazV\xb3\xae\xd8\x1cU)[!\xa3=$=\x8as^\x1fr\xa2\x03\x18J\xe0\xdb\xd3\xa7\x8c\xf82\xcf\xeak\xfa\x1c\xaf\x9a\xaf\xec<\x0e\xd8\x05Q[\x94\x81]*lD\xfd5vb\x07\xa2\xd2\xd6`\xa8t\x0el8\x9a[\xc4\xa3v\xd3\xa9\xc5\xa4\r\x13\xbb1\xe9\x96\xe3g\xc4\xa0\xd4\x9c\x96\x82\x90/\x17\xb8^\x19\xb8\x8fy\x08wW\x90FX6l\xe6\xae\xcce-\xe2\xd0\xa5\xaaDA l\xa6\xa2\xf4T;XbE:\x81\xf9\xc6j\x9b\xad\xc1\x15\xb9{\x03U#\xd8?\xb0\xd0n\xda\xfb\xe1\x0e\xc3\xbd\xd7y\xcf\x17\xa4\xca\xb8\x00l.\x83\xd4\x06\x1bl\x97\xea\xfb\x10\xed\xf5\xd4dbN\xc6=U\x00\xce\x9b\xfa\x0b\xb2\x93q\t\xa1\x03_#\xfa\x8e"0\x8a-\x9e\xc4C\xe6t\xc7\x9fM\'\xaf\xf8\x0fM\xfdvEa\xd1\xd9E\x8e#\'\x8a\x10\xd9\x1f\x03\x07R\x951?\xb9\x16\x9a\x86r\x93\x8a\x9e\x9b\x87\xfa\x10\xccK\x9e\xe0\xdc\x1a\xc8\xd0\xfb9\x067\xb4Q3\xc6\x9b\x00\xb6-\xcevjX\x1fd\xb5\xd4l\xf24\x99\x96\xd3\xf8\x07\nD\xf7\xc7\xb0<\x8b\xe6]\xdc\xc4@\xf9~H[\xe9B\xa41\xd3\xc6\x83Vk\xc3V\x13\xa6\x16\xfb\x8b\xbd\xb2\x127\x8d_;\xe2\xc9`\x05x\x80\xcd4\x81m\x1f\xfb\xe7\xea\xb5O\x9f\xec\xb7\xce\xa6\x8ab\t7!0\x8bB`\x06w\xcd\x16\xcd\x02}$\xb9\xd4u\xdf\xb1g^\xb8\xee\x88\xdb\xb8\xa5G6\x8b=\x1a\xef\x9000\x00B\xe1:\xfa\xa9\xaej\xc1-_\xeb\xf6\xac\xe7C\xfa\xfe\xb0\x1cb0-\xc7>t\xe5\x1eMk\xa7V*W\x91\x92%\xef\\(\x91\x0f\xc6\x07)E\xe1\x9a$F\x96oT\xf9\x8f]\x00\xa9\xb0Sq\xba\xaf\xe2\xb5\x1f\xc7\xcc`tr-E\xb4\xea\x1e\x96\xdb\x1fNq\xa2\xb6\x7f\r\xea)\xdao\xf8>\x9c\xf8lk{kG\x0cL_8\xefh/\xad\x8b\xd8\xe2\xb4\xdd\x12\xdf\x83\x9d|ym\x05n\xa3\x01b\xff\xf9VP\xcf\xab\xfd\xc2\xe6\x0e\xca\xe8\x9a\x95\x8e\xca\x8f\x1e\x8fv\x83P\xd4\xac\xcc\xba/G\xcd^}\xfb\x9b\x8e\x8a\x88c\xad\x95dU![\xd8\xf8\x07\xdc\xaa{\xdezV\xa3\xed\xc3\xe4 \x14\x1c\x8dZaN\xd8\x0cu\xa5\xfb\x15\xce\x90\xcd\xb1\x1e\x9c\x04\x03S\xb9\xc3P\xf9\xeb4\xe7\x94\xfd\x1c"\xc4\x9cX\xa8Y[s\xb7\x90\xecj\xd5\xc5\x01\xbfyo\x7f\xa9/\xdc\x91\xd4\x05H\xd58\xc4G\xc0\xfb\xfca\xee \xc1CY\xeb*m\xad\x1f\x01D\xe7EI\xb2FO\x86 \x98\x7f\x00Zp\x80p\xd9\xfb\xf8\xf7R+\xac\xa8\x11\x8d\\\xd5\xa6\xcf>\x1fo\x9d\xc9\x07\xb4\xca\x05\xbe\x00\x91\xf8\x89K\xa8\x1c\x96\xf4N\xe4\xd1p\x0f\x86\x0cA\xa9\xd3\xb0\xff\xf9\\\xc1U\r\x07\xbb\x84j\x8bLX(\xa5)\x10\xe4]BJ\xa1l|~\x17B\xfa\xad#A\x8a\xc4\x17\xe0\xc41(\x8b\xecY\xf6\x1b3\x06\xae\xc4\xe9G\x10\xc4\xae\x8c\xb8{\x90\xcco\x01>\xa8\xd4\xa8Y\x9a6\xcc\x01\x9c|\xb8\x00\xf0\xd8\x94K\x97\xd53\x83\\\xfa\x04N\x17\xfd(\xf0\x00+\x90&\x1e\xff\x0f,\x98\xcdf\x11\xb4\x11tD\x83\xc4\xd8\xd0\x0c\xc3\xfb6\xb5\xba\xadkv*\xb0]\xdc\xad\\\xc0\xe1\x99\xdc\xaa\xe0.\xb6\x8b\xa2\x8f\x92_gb\xf7\xcd!_WT\xfbiO\x12\xaa\x9e0\x97\x83n\xa3\xd8\x94\xdbr\xdc\x1diu\xfd\xbb\xea\xa5\xea\x9b;@\x17{\x82e\xb44\xe6J:M\xfb\xf4\xdaQ\xdbW\xda+\x7fg\x00S\x93\xa4\x06>&\x99\xcb\xa9,h\xb1\x0c\xfa\xf4\x04\x01\xee\x98\x15\xb2\x16\xd1\xab\xd0U\x0e\xf6e\r\xb7\xf0J]\\\x15\x9b/\x94\xc6\xaetE9\x88a\xca\xb4B\xe8\x07w\xb2-\x89H\x00Vw\xfb\x16\x8d\r\x99a\xe4\xe1Z\xfa\x90^\x1aG9\x15;\x04k\xc2\xc8\x95WnD\xcc\xa4\xc4\x96\xcf\x06\x18\x12\x87+l\xe2\x92\x1b\x0f\xd7\xeb\x87\xc1\xb0\xc3\xef\xdc\x11\x98\nh\x1d\xb3\xad\x8cUv\x8e\xfa\xa1\x89\xf9&\xf0\xbb\x93L\x87\x87\x97\xcaDs#\xbc]7_\x19\xc1A\xb3-\xf3@\x16\x97\xf4\x99\x13h\x10\x93N\x86QpI \xad6\x07\xec\xbe\x86\xbb\xc6\xb4{q\x98\xc5\xb7\x84\xdb\xf4+\x8ePF\xbf\x0c\xc3\xe5\x1b\x91\x8e\x9f\x0e\xf9\x02\x1cu&\x88w\xd3\xda\x86\x1f\x19E\xd1\xd2X\x9a)\x83\xf6\xae\xbby\xd8\xdd$V\x9d.5Q|\x9a\x08\x0cp\xfaa;\xcaB\xae\x11\xe0bH\xb9&\x1a\xfc\xb7\xe8\xfd\xc1=\x1b\xac\x89\xc1\x00\xd5\x9cF\x9b\xc6V\x11z \x030\x91\xc3\x81\'\xfb@\xd0\xd1\xfd\xb9\xd2i\x0b\x99\x7f;bsAo\xa3\xb7|\x01V\x87\x9e\xc8\xdc\xaf\xbbS\xcc\xc49\xb7Y\xfcb\x1e\x83\x8e\x9e\xb5+CC-\x8c\xa1S\xbb\x9e1\x19\xb3X\x0c\xa9\xce-0Q\x06\xbep\xe6\x8dh\x8a=N\xa3x\x8d\x02\x16\x14\xc6i\xfd\xd2$\xae\x8c\xf6xa\x03J8\x84.\x95D\xc2U+6\x89\x7f\xcc\x00Z\xb2f\xc4c+\xbf\xf3\x05a\xe7\xb2~sR3\xc8\xcd\xd2J\xb9>\'\xc8\x8f\xad\x12\n\x81\xf3z~N\xfb\x8c\xbf\x827$l\xf2\x14\x04X\x06i\x1d\xf0\xa3\xa5\x8d\xb7\xd2\xc1\xfe\x9dPy\x89\xb9l&\xc5\xc7\xbdr\xaa\x1c\xb0\xdf6\x97\x9d\xd7\xdb\xdb\xc1\xd1l\xed8\x19c\xdb/\xaf\xea\x8d\xad\xf5\xb7:\xf8q^\xed\xf8\xd0\xe6\x8b9\xd9\x1d(g`a\x88\xb8\x1bJ\x9f\xb4\x1f\x80\x88\xbd<\x1ck\\3B\xcf\x8bbs\xcd\x95)\x96R\xe8\xd2e\xaa\xff\xcf\x86m\\\xf0p\xa3\xe1\xb8\xd3\xb3\xf2\x1d6\x84\xaf\xbd][\xf5\xe5dk\xedy\xe9\n\xbfxK\xae$\xe17\x1a\xd8%V\xe36C\xa0\xc8$\\\xb3z\xa5\x15\xb2\xf6A\xf0\xe9kG:\xe1\xf4\xbc\xb5\xe1p\xf7\x84*d\x8a\x816v\x1d\xba\x87\xe2\t\xa7\xd4\xb8\xe4h\x14\xc8\x87\xfe\xbb\x86\xbf\x11<C\xd9mG\xb95\xfd\t\xcf-<\xec\xde\\\x86m\x87F\x19\xc9\x99QP\xe7\xa4\xbc\xef\xd9+W@\xfda\xf1i5^n\x1a\xa0\xf4\xab\x19LQ\xb55,I2\xab\x1a\x0f\x13uk\xcak\x84\x95\\\xa5{Sj\x82\x1d\xa6+\xe4^4;"<\x89ul\tqs\xb1T\xa6<\x0f\x06\x8b&b\x9a)\x02\xc7O\xd1\xdb\xf6\xe1\xfb\x9e\xbc\x03X\xd6\x8f\x1f+1\xe8\xe9c\x8a-\x8b\xd3\xd3\xcee\xbb\xae;\x16\xa3\x1e{fL\xf2x\xcc2R\xfb\xf9\xc4\x10M\xc1\xb7\xcb2x\x92!\x9d\xb5\x94\x19\'\xb3v\xd7\xd0\x16Z\x91\xf1\x89\xcd.x\x88\r\x05\xdeix9U\x07\x0e\xaf\xbf\xba\xc8\xb4\xb4\xc1\\{0\xbc\x83q\xa1\xf5aL*y{\xcc\xd4-\x08?J\xaaQ\xc7<\x8e\xf4\x0c;\'\xe9\x93\xdd\x81v\xfa`\x87\x08a\xa5{v7\xb2\x8fv5\x88[\x1b\xf9A\xd9\xed%\xb7]\xcc\xcf\xb4\xc8\xc1\xd8\xdd\x8e=X]\x17\xde\x94\xa0\xca:~\x97\xe2\xe8\x1d\xbe\xbe\xa8\xf0\xeb\x13\x80\xcb-\x05.\x11\xc1\xa2n\xee/1\x05\xfd,S\xab\x91s\xc9\xc0(\x0bM\xd0I\'\xde$\xaf\xd3\x0f\xb6Tk\xc0q\xa0\x8ab\x87hN\xc7\x03\x15\xb2\xc98Tf\x1ald\xe3~\x03U\xd0\xa1X\x7f\xe6$0\x1d\xa6\xfd9\x05\x9f\xe1E\x03\xee\xad\x9a\xf4\xb2\xde\x8a_\xe0\xca\x9a\x1e\xf5\xc5\xb9\x84c}F\x0cdn`\x16\x99\xce\xc3E\xc1\xc3\x0f\xf5\x834\xf9\x06\xe7\xa49O\n\xc5$qu3R\x96\xde\xb5\xe3\x94\xea\xea\x03\x0e\xa4\xfe\xa8\xc3W\xaa\x16:hr?\x89c(g\x07B\xba=\xe2\xd3b\x93\'.\xc5\xbe6\x08V\xbf\xc8\'\x90\x0e\xcf\x03}\xb3\xf3\x810"@\xee\xc8)\xa3\xfdk=AH\x01\x91l\xdf#l{\x9c\xab$\xc9jr\xc0\xd9\xd2x\xe8\x01\x1dv\xb7R\xe0.\xe0\x16/$\xa1;\xe7q}O\x9f\x1a\xcc\x16\xb2\xd7V\xd4\xc8\xd5\x1d=T\x99\xf6\x95\x8b\x933\xef\x81F\x97\xb6\xf7"\xb3\xf6L\xe7\x9f. \xd7\x8938\xb7\xc0\x10f\x05{\xfc\xf6\xfb"\x85\xca\xe8\xbbg?\xbf\xc4\xac\xd1\xdf\x15v\xb7u\xfe>\xde#\r\xa4\xd2\x9f.\x15ew\x81\x9a#\xc6o\x14\xe0D\x96\x96\x05\x14\x0e\xfa,\xa1\xae\x13\xc6\xc6\xd7\xe2\xf3cX\xf2\xfbI\x84Yu\x13\xbe\xc8V?w\x8a\xd8)\xe6K\xf1Fy_\xa4AUP.\xbeX\xcc\x186\x7f\x14\x84\x14\x01\xf4~`\xd2w E\xc9\x1f\x97\xdc\xf3S\x8b\xfb\xc2\xaa\x8c+\x816S1z\xa2\x1e\xf6\x80\x94pl\xad\xbb\x08\x80F\xd7J\xa6\xdfsO0\x18\\\xeb\xd2\x83\xe1\xba\x82l\xcb\xa5\x1c\x9bQAe\xd3\x14\xcc\xa3\xbb\x9aJu\x91\xda\x04\x06V4[\xfbh\xee\x06\xd4yI\x1d\x0c\x955\xba\t\x0cb\xd0\xa6V\x9d\x04\x8d\x9d\xc0\xef\xde\x1f\xb3\xf1z\x18E\xa4\x1b$8n\xef+\x18\xa3q\xe5\\\r\xd2\x0b7\x1b\xb4B\x9d5&\t\xf5\x92/*`\xa2\xfc\x13\x93\x81\xdb\x16\xcc\xcf\xb5\xf2\x07\xc9\x08\r#R\xcb\xaa\xaa\xf8,\xc1\xf1\xee\xfa;\xa5\x19tL(\xb2\xecl\x8a1Q/\xd4\x87B\xacOd0x|\xc7tq\xfbN\x02\x8c\x82\x99`\xe9\xf8\xda>\'\x9d\x88\x983\x87\xaf,\xec:\xa4C+\xaa\xb6D\xb1\xa0/K\xfb\xdc<\x88(\x84B\xa2\xe0!\xe9*\xc638\xd3\x86\xdea\xcd\xbc\x16P\x84\xd5\xfc\x07\xee\xa80\xffBy\xae+@\x8a5\ra=\xf0\x8c\xee\xa5\xbb\x13J\xfc\x90H0?\xac\xff#\xfdZ\xc0\xe5\xdb\x80\xbe\xf6\x0f\xf5\x1b\xb4(\x02\xcaD\xf6%\x8c`\x87d0[\xe4\xb1\x88\xe8\n^}F\xd0\xce;\x002\xcc\x94\xf5\x17=\x89\x85\x83\x81\xe6\x9c\xe4\xccS\x90|\x1c\xa1\xb5M\x0f\x1c\x850\xf1\x1e\xe8c\xc3y\x17m\xc1\xa8\xd0\xa3\xdf\x99\xd2\xd9\x82\xdb\xd7\xdbq\xe4\x82 \x9fjC}\xed\xa1k\xed\x84\xdb\xb23H\r_\xc5\xd1%\x11^K\xedI\xac~\x04\x1b!\xf9\xfc\xb3\x8c\x1a\xc0/!f\xc2\x15\xcd\x92EB\x01\xf8\x0c\x8e\xee\x01\x9eV\x19\x1e[\x8a\xf41\x86o\xef\x81\xf33f\x81C\\n\xfc\x07\xde\xf9c\x9fT\xfd\x95\x99\n\x89\xed\x070\xb4c\xe1u\xf9\x08\xf67|7v\x9f\xfd\xdd\xc6\x15\xc7f\xd9"\xd3\xbc\xd7~\xc5{\xea\x06\xf62E\xb9Z\xcf!\x07{c4XhU\x93\xdc`\t\xda\xf4x\xbee\x88\x07\xd0Y+1k\x17 \xbf\xa7\xf4\x81O\x16E\x14\x90\xfe#|\xae\xfd&\xb77\x1f\xd3\x9e1\x88M\xb6K@?\xe4\x8faLX6\x83xf\r`\xd7y6\xc1u\xcf\x18\xd6Q\xea`IF\x91M\xe2\xaeR\xec\xe3\x11\xf2CE\xc4\x1a\xe5\xb0.\xbe\xedZ\x7f\xb6\xdf\xa7\xfdHN\x11\xdb\xab+!\x88I\x1d\xf0\xe6\x020Ct]y\xb4r\xf8\x05<u\xc4S\xf4\x87$y\x90\xfb\xe4V\x9f\xae\x9e\nJ\x8fqVJ\xce\x1fO\xf6\xf1z\xedT\xd0\x8e\x99H\xb6M\xf9g\xdc\xc4\xa7\xd8-\t\xe8\x8f\xf8\xf8\x10\\\x99\x8b\x16\x1dGZ\xa9\xad\r\xb9r%\xea\xc0t\xa0\xe6\xdeO\xa2s\xc1dp\xb9\x87\xf1\x82\x92uL\xf8_\xfbU{\xa4\xfe-\xc9\xf8\x8f\x02T\nf\x07\xd9\xd7\xeaI\x81db\xae\xdf{\x13N$\xcek9N\xe6\x91\xfbH(\xba\xe8)\xe4\xae.\x9f\xec\xfd\xfb\xaf\x10\xd0&\x9cE\x15\x14_\x92\xf8\xb8\x89)`\xf5\x8d\xad\x96r\xf1"\x89\xf86I\xd6)=w*\x91\xce\x13\x19\xab\x12Q\xb9|\xdePB\xa8\x9cm\xc1m\xd6\xa4\t\xb1Sn\x9e2\xc2\xe7\xf7\xf0(\xa6\x918\xfcc{\xfa--e\xa0\xfb%\x98\xe7;\x0ev\xb7\x980\xd3\x8d,\xa6\x9c$s\xcavb\xc0m\x8cq\xec\xd8\xe6l\xa1\xb6\xb9 B]\xda\x8a\xdf<l\x14.!,\x1eds\\\xfe\x83G\xf0\x1c\xe5,\xdb\xf4\x0f\x1c\x045\x90\xd4\x15\xd5y\x02.\x13vr\n\xf6\x06-\xbb\x10F\\$\xa9\x14_\xe5\x1b5\x01\x14~^\xd0\xf0\xcc=\xff\x1c\x16Wh\xa74\x07\x1f\xdb\xa0\xae\xc3c\x7fB\x88\x89g\x84\xa86\x83h\xa1\x8f:\x8b\xd4\x13\x98\xd3/h\x1a\x7f\x03\xc6B\x15z\xe3\x8e"-l\xc7\x81\xbe\x90\x15>\xce\x94\xff\x82B\xe5S\xef\x9c;\x80\x85\xbbk\xa6\xca^\xf2K\x074?\x9b\xd4\x98l\x9fHj\x99\xe1B\x86X\xa2-\x1e\x0e\xb78\xf9~\x01;\xaa\xc5\x05\x9c{(5\xdc\xb5:\x1f-\xe3\xd8\x89\'"qQE\xb2\xce\x93U\x8d\xbar^J~d\xc4\x8c\xa1\x90\xb5\xf1\xffI\xc2\xae\xcf1\xbd\xdf\xd3n-\xbb\xdf\xf5<\xf8\x001\x8f\xc7\xdfq\xcd\xd8\x88\x95\t\x18\xe1\xf5O\x06tZT\x8b\xf43A\xf5f\x1f\xa2\x14}\x15!F"\x90G\x86\x80|\x0b\xd0\xb8\xc0[,a*\xceyyO\x88\xc8^\x13\nwZ\x1e\t\xc0Z\xe1$\xe0\xb8\xfa\x99\x86\x9d\xe1\x86\xe7\xbd\x19\xe6\xb41`\xd2\xdb\x8e/de\x96\x01vB\xab$\xf8\xfc\xecB\xed\x0e7\x88\xf9\xc8\x0b\x1e\xb4\xdc\xf5C\xe5\xf2h\xb12\x81`\xbc\xa3\xed\x96\xda\xd1xCf>M\x9e.]\xb8^\xd5l\x91?\xbe^\xbch\x1fI|X%\xd93\xf5\x01\xfb\x9a\xfa\xdf\xaa,g`\x84\xb8\xea&\xbeu\xaf\x03\x0eM\xe1o:\x1f\x80\xc9\x99\x80]\xfc\xce\x8b\xaa\x00\x0b\xe2\x96*\xdf\x8b\x88J\xe0\x1d\x1a:>xH\x01\x86\xdeH)\'v5s\x9a\x883\xe0\xd6\xfe\xb7\xb97)\x1f"NVJ\xceu\x97\x98j\xa6Uv\'\xf2\xea\xd9\x9d\xedv\x1b\x87DLh\xca\xa9\x8d\x9c!\xba\xccP\x1c\xb70\x7f\x98\x1c\xbb\xa8l\xcbub\xb6;6\xf0%\xa2\xd5\x81N,\r\x16\xb4\x8b\xf4\x06\xa1o\x96*\xb5;\xb5\xc7\xc2\xd9\xbf\x0fW\x93;s/\xb7D\xf2[\x18\xa1j\x9e\x90W\x88i9lB\xb8&\x06L\xe6y!\xc6\xf4\xe5\x08$\x19&B\x18\xe7\xa0\x00\xd3\x18\x82\xea\xe2\xadnFe2\x95\'%\xd4\x81\xe6u\x83h\tu\xb7F4BC_\x06\x93[\xe4a\xac\x93\xb5!\xd8\xa0\xb4Kd\xfe\r\x03\x8d\xd0gK\x0f\x95\xcbs^4\x10\xe9\xb4_)c\xbc\xccR\x83\xba\xc3\xf6D\x8fk\xcc\xa4\x0c\x86\x03\xfa\xa1\xd1\x88\xf7\x08<6\xeb\xae\xa2\x16\x15\xa5?\tX\xca\xdd\xca\x84\xa2\xc2\xe1\xf0\xc44\xe7\x15\x9c\x86a\xa9\xc8*e\x13\xe5\xff\x94\xc56\xf0fs9\xc8T\xa6*V\xdd\x1c\x94\x9a\x06\xea\x9c\xe7\xdb\xab\x11{\x08\xa1\x978\x9e.\xe5Yn \xf9,\xb0\xaa\x9f\xf0\x15#\x84@\xd9`\xd7\xa3\xc2\xc2\x08\xceW\x0c\x8d\xa8Y\xe5.-\x84\r\x1fr\x00z\x00\xf7\x14\xe4\xe3\x88\xd5\xca\x04L\x9e\x0b\xc4\xb3$\xd3\x8cI\x14!vd\x14\xd9[c\x1d\x11\x04\x00\xf1\x97\xfd\xae\xe6\x17\xbd\xd74K\xd2\xcfX\x1a\x90\xb3\n\x00\xd8\x89\xd9]P\x1cd\xe5^\x1a6\x88\xb3\xcc\x9cm\xa4m\xe9m\xe47\x89\xb4w\x83\xc3\xf1>\x9d\x8b\xc1\xba<n3\xcd(\x8a\xc5\xed\xde\x04\x04\xa9j6\xbf \xa3\\\xd5\x16\xf6\x9a\xad|\xc9\xef\xf87\xa6\xe9\xd8B\xc9X,\x95\x07\x99\xb7\xc3f7&\xe8\xdf\xc4\xe0\xefp1\xe5\x81\xeb\x10B6\xdd\xa2c!pj\xa8\xb1\xc1O\xfd\x93\xc9\x07\xc5\x9f\x193c\xf5`\x92\xd3wT\xb1\xa9u\xf6<\x10\xab\x99\xacJ\xab:\xe79[h\x1ak\xd8\x94\xa2\xff\xc1\xfa\x80H\xb0\xdf!Qf\x86\x9ej\x9a9;\xae\xfd\x11\xb1H\x0f\xf5\xe7\x90\xd3\x8au\xd8s\xcd:\x98\x10)\x01\x0e\xe9\xfe{fu\x1b\xc85%\\\x16b\xd4c\xa4bU\xbcz\xe2G9Y\xccM\x85\xef\xc3\x1dq\xcf_\xafq\x1d\xf2t\xdf\xa0\xa1\xad\x00\x95\xf7\xd8\x9e\xaf\x02\xfe;!\x14\xb4\x97\t\xf2\xd8\xc6D\n\xd1,\x96G\xca\xc6\xc8P\x1a\xc1X\xa5\x13\xb50\n\xfc\xa5\x16\x1e\xd15\xc4\xedHn0\xca/^\xb3\x17\x1b/\xe5#J7\x9f\xda\xea\x8e\x99\xdc\xc0T\xa3o\xf5\xec)\xb8\xa3\x9f\xf6\xc7\x9e;\xef\x07\xdeX\x05\rp.\x8f\xa5hWy\x01\xbd\x98\x9dX\xce\xa9 \x12JsA\xbab4d)\'\xe6\xd0PB\xba\xa9\xfc<\xf254d5\x17\xa1\xf9(\x0cy\x89L\x10\xe6,<O\xd7(\x14\xab\xaf\xd3\xd8\x1d\x038/\xae\xe9\x11`\x99{\xc8#\xae:\x06"\xd2\xa1\xf6P\xbf\xbe\xef\xbdHOr(\r,"w\xed\x9d0lNR\xf8A\xa3\xbf\x19\xf2h\xb73\xb5\xb1\x9a}\xcd\xbeZ\xf1{HO\x9dn\xb8#`u\x8a\x8es\xe6o\xc2\xd62\t\xad\xd42\x7f\x00\xae\xbe<U\xc5Dh\'\xf3\xef\xb33@\xbdL\n\x91\xd7P\xf77\xed]\x16\xd9\xcaB\x7f\x05]\xe7\x9fp~\xf6\xc8\xaf\xaf*\xd1\xb6b\x7f\x17>\xf9\x18_Q>M\xa6<\x87\x13Em\xbc\xf0\xea\xb1\xdb[\x86\xec\xee\xa7\xe7\xd3}5\xa3&\xe1\xb6L\xb7\xa5\xec\x8c+P\xa4\xcao\x91lq\x92\x02\xc1E\xd3\xcf;\xc6\xea\xd8\x84\xd2\x86"G\xd9@R\xf7>\xb9\xc5.bK\x9d\x15\xc5\xc2Y\x1c\xff\xbc\xee!]\x0f\x1c\x7f\x03\xcf\xb6\x83\xfc\x88\xfc\xa9 C\xd3\xed@\xc5\xcaWc\x10cN\x98\x07\xfe\xcc\xda\x00&\x13#\x17\xdc\xfa\xaa\xab\xec\xa2\xfe\xca\x80\xech\xacH\xc0\x02h\x9f\xc1\xb4\xcc\xc6\xab\xbfR\x9d\x1b\x8db?\x02\x97\xe2Si\xb9\xf7\x00\xe2\xcc\x85\xc1R\xbf7\xe1LQ\xfc\xce\xa0\x83t\xf3\xa0%\xf8\x01S\x1bg\xde\x8b,\x90\xfe\xae\x97\xa9\x9c|\x85\x95\x18\xb4W\x8aA;&,\xbe\xc1q*>0\xb52E\x90\x94\xc5\xc7\xe0p\xab\x8c\x83\xb9Q\xe1\n\x16\x11?\x98q\xb4R\x9c\xd4\xbcbi\x92\xc5\xc8y\xc1\xe3\xb4]\x00\x17Lx\xcc\x16\r\x05L\xfa\x87\xba9`a\xa5t\xd9/#2\xb86\xbeC\xb5\x85i5_y\xb6\t^\xcb\xfd\x08\x08\xdf\x1a$\x07\x0c\x83\xe1\xb9\xa4\xe5\xf4U\xfd\x13K\x00\xd9\xc9\x02\xa4\xe0p\xe2\xf5\xc6\xda/\xab\x1eN\xd6\x98\xa5\x10_\xa4\x8bS\x11\x07\x99Z\xb8X\x8cq\x83\x14!\x89\x15\x8e\xdbo\\yq\xf2\' \xcc\xeb\xf8Y?8\x9f,_~\xf5(\xd2h\x16\xb2/o\xc2\xd6\xc2\x19\xb8\xb9|\x83\xcb\xf7\x0b^R\x0e\xc1\x8f37\xef\x0e\x98\xbf7[\xaa\xe5V0>,\xef\xe8\x92\x88)\x04F~9\xeb\x00\xdf]\x07Q\x91\xe1\x1e\x0bC\xed\xf5\'r\x19\x17\xe4Y\x823\xa7\n\t\x7f\x1cOsyHYU\xa9\x8b\xd9\x99y=\xe2E\xd5N\xd9\x13}\xdd(\xf5G_\xda\xb9\xe3Ikv\xe3b\x05B\x08\xd8m\xe7j\xa6\x93y\xcbb-\xdd\xdb\x82\xbfYo\xd1O\rE\xcf\xc5\xc5R\xad\xfb\x8c*\x8c~&5\xf9\x8e\xd5\xfc\x95=\xa7k\xc6\x03\xd3\xba\x19\xc3\xd5\xc4.`\xaa>\xa1\xd8\xc7o\xf3\x16\xa4\xa4\xb5\x19\xd0I\xac\xa7u\xf8\x8b.(\xe0#\xa4\x014\x16t\xfe\xabK\x1b\xc4.e\x07\xf1\xa5\xfa;\xda\x85\xc6\xfe`\x93\x01\x11\xfe\xdayQI\x8cPo\\*6\xa3\x92P\x8d\x13\x83Z=\xda\xcdk\xa8\xeb+?\xd7\xbe\x0c\xb9\xc0\xa6\xc6d\x1e\xb5z\xab\x1e\x07\xc6\xc9y\x05\xa5\xdc\x81\xbc\xa1\x9cj\xac\xffYs\xbeL\x9a\x8e\x8bwOw\x9c\xbfAP\xfd\x84c\x188Y\xf7)VX\xcfV&,\xcd/{\xef\xfd\xf5\xd8e\x18`^\xadw\xe69\xfd1\x92\xe5\xdc\x8fx\x11E73\x87=\xd8\x8c{j\x01F\xa9\xc3\x80\x9e\xc0r\x8c\x83\xe4\t{qhE\x80m\x8d\x17\xa3\x87n\xeb\xf8\xd6(J\xfc\xc9\xd1\x1d\xca\xa7K\x7fm\xbe3\xe9O\xb0\x83\x16b\xac\xcbQI\xd1H`\xf6\x9dsr\xaat\x19\x9d\xde\x14\xcd\xdc\xcb\x95\x9a\xe1Y\xa7\xb0\xdf?\xc6\xdb\x12S\x9e\xcf\xeb\xb8(t`\'\xc6\x8b\xc2\x8d\x87\x8d\xba}\xf1\xcc\xf3\xba\xf6\x90\xb7\xcc\xceu\x8d\xe8\x00\x95m=b\xf1\x8e\xee\x9e>3\x00\xa5\xc1@?)\x94\x02H\x90\xf7Tl\x88L\xb2\x9c\xf0\x9dG\xb2\x18\x08\xa0\x87\xb0\x89\xfe\xcb\xf0h%\x8f\x1b\xa3r^#EfCJ\xb4\xf2r\xc9m\xd7\xec\xf3\xbc\xf7\x82\xc5!\xb1\xce\xdf\xcf\x94\xdc\x9c[\xd0\x91W\xe9\x06\xef\t.q!\x8b\x92\x19ql\xb7\x10OqP\xa5d\xab\x0cI\x16\xeeq+\xf3\xdfv\xeb=8\x9d\x9f\xf3\x91\x1fO/\xf4Y\xc3\xfb\\\xd60\xbd\xf9\x14\x02\xed\xc6^Uz\xa1\xe8\x9a\xd7\x03Wno\x12\x97-TX3F\x01V\x0c\x1b\x19\xd0\xa2\xd0\xa0\x00o\'\t\xaclg\x9a\xda\xb2W\x02k%Z\xcd\xbd\xd2\x82\xd9v!6j\xe3b}\x94\x7f\x04^\xf8\xe7\xa6\xed\xd3I\x1fx\x80\x17\x84\xd0\xee\xdcS\x99\x89\xa6\x8evo\xb7xo\xc5\xc9\xed\x9e\xa9\x86\xaap\x18\x9c\xack\xfa\x0e\x17\xeb\xf8\xbc\x9d\xec\xf7\xa7\x8b\xcb\xa5\xa0\xaa,\x96!I#\xd7\x18I\x1e\xbe\x19\x16\xb1\xbe\xfb&\x00xO\xbd\xff1\xd1{\x9b\x88\x95\x8f\x84\xc2\x8f\xc3\x91\xd2\x15]\x89\xc6\x87\xd8\x879\xfa@v\x95\x07\xb5\ri\x1f\xb3\xf6\xb71\xad2\xba\x0e\xd9~Z\xea\xe2\xb9^\x9c^\xeew\xd7HB\x94\xeb\xec<\xe8c\xf2J\xb4\x9b\x8eX/@B#\x89QK\x05z\x7f\t\xb3\x0f*\x8b\x85a\xe6dM\xfa\x9e\x87Vti\xde.\xaf\xe2\xd3\xcb%\xe0\xf8j\x18o\x15ew]\xa7\t\xd3:Kb)\xf7sRd\xcd\x10\xf5i\xd9Zr\x17\xcf\x12\xd0\x19\xc41\x7f\x08\x7f\xdeH\x02-x\x00\x90\xd8\x891p\xa9\x9c\xca\xbd\xb5\x97\xd3L\xf8\xca6\xf98S\xf8(\x01\xadX\xe3\xb2\x16\xb3\x17\xf0\xf9\x1b\xafw\x9a\x9fE\xae\x93\xf3\xfa\x0e{\x81\x00Y\r56}\xf7n4&\xdf\xaf>E\xc9\xb5\x81\xbe`<\xe9\xba.\x07\xa71\xe79\t_Ei\x93\xc0\x02T\xd4\xfc\xfby\x93`\x97\xadN\x8f\xee\x92\r\x82\x86\xba\xa5\x99\x92\xa1\xf9\xd6\t\xfe}\x9d\x0c\xa4\x82:_\xd5\xf60\xb5E\xaa(79\xceL\x05=\x1cN\xf5J\x1b\xc2\xf49\xf4(\x81\xf2\x95\x1e\xe1 \xf9\x80\x94\x08$\xe1\x86\x1a\x95Q\x0fx%\x8b\xd7\xfeMq\x06\xe74\xa6\x9f\x9b$\xf8\xabp\xaeJ\x11"\x05\x04)<\xa4\x11\xa5\x99\xeap\xd1\x1c_o&=t\xfd\xaepi\xe1\xde\xda\x93\xc7\x1b-Q\x15\x7f\xb3\xe0\x8b\x0e\xeeM\xcel\xeb\xf5\x18!\xc8\xd3\x8c\x8b\xe9\xe1\x97\xbfxw(\xc3\xb5\x02\xd1\xebw\n\xb2\x99\\\xb1\xad\x83\x1b\xeb\xbc\xc0\xa1\xac\xfb\x04Q*\xcf@\x03t\x847\xb2\x9ct\xc2\xd0\xd5K~d\xd2\xa5[\xd3>\xaf\xea\x82j?\nY\xa3\x84\x01\xf0\x86\xd4"\xbf,\xfb\x83\xdd4?\x8aq\xe3\xb4\x8f\x1bRq\x99M\xa9\xf1z\x8c^\xea\x8c{\xcf\xf9YLy\xf6\xe8\xcdb\x1e\xa8\x1d\x89\x9b\xc1f&>5W\xfek\x94>\xdag\x87u\x96\xd8\xc1N\x18!\xec\xb4\xe5\xe9`\xb7\xe1t}\x83Dz?\xaf\xd5{\xa5\x1e\r\xe3\xc3c\xecO3\x90\xed\x90\xdd\xeb\xb3\xf3\xb9\\z\x9a\xed\x84\xb7\xdb[\xdf\xacm\x99\x0cg0\xc9\xf4X)\xccdhh\xc8\xc9\x85\xe7M\xdd\xb9\xcd\xa1?=Y\x99\x18\x87\xd3\xf9Ir\xff\xe3\x08\x19o\xb7\xdb/~\x10m\xd5\xddv\xe4qoe\x996\xa9\xe8\xaf\x93\x13GB\x07A\x0b\x11\x1b\x04\xcf\x123jwh\xe8\x9e\xd61="\x98\xe1\xb6\xb4\xeeC\xab\x8bJ\xeb\xc7\x8a\xd6\xf5\x1a\x0c[?d\xfeT\xc5\x88%"\xb6\xb0\xfd\x94\xc9\xe5\x83X+8\x99\x92S\x85\x13BZB\x98\xbe\x93QlC:\x93\xd74\xa8q\xd58\x04jH\xb3BW\x0f\x83\xed\x96B\x08~\xff\xbb)\xe4\x96;-$\x1c\xbbX\xcf\xf8\xe3C\xa8T\x14\xebc\x87\x1d\xadpD\xfb`f\xea\x86%\x99\xf0/\x03\xc5\xac\xba\xf8\xd1\x86\xbd\x06\x92\x03\xf6\xd5\xc5\xf5\x04\x16\xd4#\xb2\xe4u+\xcd\xb6\xec\x1e\xf1aS\xdfT\tu}\x18\xb0\xfbm[\xaf:\xe7\xae\xf4Qv\x85\x02c\xab\xeb\xa3\xa8\xc5\xe9\x07W\xbf,\x9e\x17\xf4L\xd4\xa4\xda\xe8\\\xa1o\xa9\xb0{\xc9\x0f\xde\x1e\xea\xe0h\xcf\xadS\xfe@\xb7-?\xfb\xdb\xa1\x13\xb9\n \x9d\xaf8\xe6*\x92\x85w\xa8\xa8\xa6\xb0\xf2~[z\x83x2\x1b%t\xff\xd0M\x17\xca\x91,\xb6\n\x8a\xd2\xb6\xc5t\xd8\x83\x0b\x911n\x8b\xe7\xd5\x0c*\xddv\xefO\xfd\x13f`s>\xce\x1e\xddL\x1f\xdb\xa4,D`\xd9\x00A\x17I\xfct\x99\xde\xdf\x00\x8c\x9e\x17zu\x9an\xed\rq\xf7\x19\xf8\xb4\xdf\x84\x89\xb5\x8f\x12\xfc\xeb\x9a\xf1\x86\xdc1\x81\xe82\xc6\x07\xf5\x84\x99lK\x13B\x94\xd0\x8a;\x97\xf0\xbe\x988iB\xcc\xb1\xc3\xd5W\x87hB\xbf\xb4-\xe95\xe3,\xe8\xed@\xc8x\xc9\xe1\xd49\xf7\x03\xc3@M\xc3\x9f\x9ew\xf1\x02\x92\x16h\x12M\xb4\xac\xe3>\xfat\xda\xc40\x8e\xfb\xf1H\xd5v,\x80\x8b\xd5"L\xdcUi\xb6\xb9#\x07\x82N^\x17\xed\x83u\xe3\xac\x8a:m\xf2o7v>\x1c\x9d,\xf8\xeb\x9fk\xa4\xda\xf69\x17\x9eb\\=\x8f\xef\x9ak\xe4\xb9\xea\x1b\xb9:\x1b\x03\x04q\xedZ\x0cz\xb5\x94S)\xa6\'?O\xcc\xe9\x1eX\xfe\xc8:)\xa4\xa9\xb1X\x8c\'\x1b<y\x8f,\xdd\xd6u:\x99\x1cR\xe9\xe1\xe6\x8c*\x86\xc5\x97\x11]\xf3\xecF)SU\x97N\x8b\x12\\@\xfa\x9c\xdd@\x17\xe6\xa9\x0b\xc8\x0c~\xf31\x8b\x1e\xfc\xd9Z\xbew\xf5\x8e\xad\xd4?\x97I+do1I\x02E\xfe\xc5\x1d+\x94\xfb\x9f\xa02\x81F8\x9c\xe3\xb0\xa4\xbb\x17\xd2\xc9\xbe\xea\xf2\xd3\xa7\xfe\x95>C\xc9~\x04\x10\xd5P\x1b`\xa7u\xf4\xda\x89K[\x06\x1c\xf0\x81\xecE.\xf9\xfc\x00\x8f\xe4\x89<\xef\x18\xdf\x8bIeu\xda\t\x9e\x90lf\x01\xc6\x05^\xda\xb8P\x15j\xeam\x84v\x94\x1c\xdd&\xcf8^\x8eC\xceM\xe5\x18\xadO\xd8\xf5(D\xdf\xe0r\xd7\xdf^\xaa\xe0\xcfUxs\x19Y\x14\x8f\xffc\xcaI\x14*r\x0e\xfc\xc8\x80\xb0Iz\xe2\xdf\x14\x9a-\xd0eh\xb9yJ\xd8z\xa8\xfa\x8c\x84\xcc)zR\xf2T\x9f\x9c,\xb1\xfc\x8d&\xf0FC\xae1\x8dY\x89\x95[\x9e\xf1\\\xb7\x18e\xeej#\xa1~*[f\xf7,\xfe]\x02\xc1\x14\x91\x04[E@\xcf\xc3\x16Q\xe2\xce\xdad\x7f+\xeeYB\xe3\xba9\xf2\xc9\x8fW\xa27p\x1d\xc1\xa1c>\xdf1\xce\xa3\x0e\xfb\x08\xee\xb5\x8e\xa2\x0b9\x08k\xe8\'\x95l\x00\x88\'\xab\x91\x9b')
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")}}