hiddifypanel 3.0.0.dev64__cp38-cp38-manylinux2014_x86_64.whl → 3.0.0.dev66__cp38-cp38-manylinux2014_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- hiddifypanel/Events.py +27 -4
- hiddifypanel/VERSION +1 -1
- hiddifypanel/VERSION.py +1 -3
- hiddifypanel/__init__.py +7 -3
- hiddifypanel/__main__.py +13 -3
- hiddifypanel/base.py +88 -3
- hiddifypanel/base2.py +40 -3
- hiddifypanel/models/__init__.py +10 -3
- hiddifypanel/models/child.py +26 -4
- hiddifypanel/models/config.py +105 -4
- hiddifypanel/models/config_enum.py +207 -4
- hiddifypanel/models/domain.py +106 -4
- hiddifypanel/models/proxy.py +55 -3
- hiddifypanel/models/usage.py +58 -3
- hiddifypanel/models/user.py +171 -3
- hiddifypanel/panel/__init__.py +7 -4
- hiddifypanel/panel/admin/Actions.py +170 -3
- hiddifypanel/panel/admin/Backup.py +80 -4
- hiddifypanel/panel/admin/ChildAdmin.py +122 -3
- hiddifypanel/panel/admin/ConfigAdmin.py +54 -4
- hiddifypanel/panel/admin/Dashboard.py +70 -4
- hiddifypanel/panel/admin/DomainAdmin.py +195 -4
- hiddifypanel/panel/admin/ProxyAdmin.py +128 -3
- hiddifypanel/panel/admin/QuickSetup.py +127 -4
- hiddifypanel/panel/admin/SettingAdmin.py +224 -3
- hiddifypanel/panel/admin/Terminal.py +51 -4
- hiddifypanel/panel/admin/UserAdmin.py +277 -4
- hiddifypanel/panel/admin/__init__.py +82 -4
- hiddifypanel/panel/admin/adminlte.py +13 -4
- hiddifypanel/panel/admin/commercial_info.py +23 -3
- hiddifypanel/panel/admin/websocket.py +9 -3
- hiddifypanel/panel/admin_2.py +33 -3
- hiddifypanel/panel/asset.py +17 -3
- hiddifypanel/panel/cf_api.py +35 -4
- hiddifypanel/panel/clean_ip.py +125 -3
- hiddifypanel/panel/cli.py +172 -3
- hiddifypanel/panel/commercial/CommercialDashboard.py +59 -4
- hiddifypanel/panel/commercial/CommercialSettings.py +224 -3
- hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +38 -4
- hiddifypanel/panel/commercial/__init__.py +50 -4
- hiddifypanel/panel/commercial/restapi/__init__.py +14 -3
- hiddifypanel/panel/commercial/restapi/tgbot.py +57 -3
- hiddifypanel/panel/commercial/telegrambot/DefaultResponse.py +11 -3
- hiddifypanel/panel/commercial/telegrambot/Usage.py +71 -3
- hiddifypanel/panel/commercial/telegrambot/__init__.py +6 -4
- hiddifypanel/panel/commercial/telegrambot/admin.py +120 -3
- hiddifypanel/panel/commercial/telegrambot/information.py +123 -3
- hiddifypanel/panel/common.py +98 -3
- hiddifypanel/panel/custom_widgets.py +71 -4
- hiddifypanel/panel/database.py +18 -3
- hiddifypanel/panel/hiddify.py +655 -4
- hiddifypanel/panel/hiddify_api.py +70 -3
- hiddifypanel/panel/init_db.py +393 -3
- hiddifypanel/panel/usage.py +85 -3
- hiddifypanel/panel/user/__init__.py +25 -4
- hiddifypanel/panel/user/link_maker.py +416 -3
- hiddifypanel/panel/user/templates/clash_config.yml +1 -0
- hiddifypanel/panel/user/templates/home/multi.html +1 -1
- hiddifypanel/panel/user/user.py +233 -3
- hiddifypanel/static/css/custom.css +6 -0
- hiddifypanel/templates/500.html +1 -1
- hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/en/LC_MESSAGES/messages.po +194 -190
- hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/fa/LC_MESSAGES/messages.po +123 -120
- hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
- hiddifypanel/translations/zh/LC_MESSAGES/messages.po +123 -121
- hiddifypanel/xray_api.py +109 -3
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/METADATA +1 -1
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/RECORD +74 -76
- hiddifypanel-3.0.0.dev66.dist-info/top_level.txt +1 -0
- hiddifypanel-3.0.0.dev64.dist-info/top_level.txt +0 -2
- pyarmor_runtime_000000/__init__.py +0 -4
- pyarmor_runtime_000000/pyarmor_runtime.so +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/LICENSE +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/WHEEL +0 -0
- {hiddifypanel-3.0.0.dev64.dist-info → hiddifypanel-3.0.0.dev66.dist-info}/entry_points.txt +0 -0
@@ -1,5 +1,226 @@
|
|
1
|
-
|
2
|
-
from
|
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.*\x00\x00\x12\t\x04\x00\x8c\xb29`\xaf\x9fC\xbf\x10\x965\x16\xc8$\xcaW\x00\x00\x00\x00\x00\x00\x00\x00\xc9\xf1\xd7E\x89\xe0\\\xfa\xcd\xc0\x8f\xde\xe1/\xd5\xfdY\xa6\x8er\xdcy\xbc\xda\xf0\x1b\x89\x93\xe1k\x98\xb3\r\xa1\x01\x8b\xc0e\xe9\r\xf4+\xef\xc8\xfa\x90\xd92\'.\x7f\x0b M\xfd$\xd7\\\x18b\xa0\x1b\x19\xfc\x81\xb3\x83\x865\xce\x88\xd7\xc2&.\xaczE\xcd2D_\xb6\xf3\xbd\x9c\xb7\xa9\x9dr\x81\xf3\xda\x92\xc9\xb2\x0b3\x0876\x12y\xa3\xea\x19:\xfa\xb0[\xa7\xf2\xc6m\xfa\xc8\xb27kG0a\x8d\x7f\x02\xf6M\xdc\xe8\xd6E\xac\xc4Y0\x07;/\xa39\xb7\xbe8\xac\x98}\xa9\xce\xdbz\xe9n\x00F\xdbM\x9b\x1d\x83\xc5\xa2>\x1c\xa9m\xfb\xdc%\x104$\xd0\xac~\x1b\x80$\x0e\xec\xc4G\xa8\x82\x9b\x00\xc1\t\xe5,\xdd\xf7\x83\x1cL\xba-\xa0/\x1a\xb1\xce\xfd\x0e=\xda\xbd\xd2\xc7\xb6\xc6\xb0\x17\xe9\x07\x07U\x96F\xc8+9\xebu\x9e\x1f\x82w\xef|\xd6\xe3W_\xc6\xc2Z\xa6\x03~\xfd}J\x9d-\xad+\xc5L\x1a\xd6\x15\x86\xea\xf9\xb4\x18\xa4\x86|\xf9\x04\x04\xb7\xde\x87\xe0pa\xf3R$}\x9e\xda2\xb8+\x9a\x8e\xee\x10\x17\xd3\xda/_\xea\xbe\x01DDE\xdcP\xa4\xf8_\xa1\x7f\x07\xf8t\xc5\xaf9\x1a\x15]\xe4#\x82xO#\xcf\xc4 +\xa95B:\x06xT4\xc5\xbe\xc5\x96\xed\xcf\x90\xf4\x91Y\xc8i\xbf-\xc0\x92\x11a\x1a\xee\xd4S\xa1\xdey\xb7SH\xd1\xfc\xdaV\xf8\xf2\xe1\xff\x91\xa12R\xfd\x07\xd2\x0c\xdc.\x96\x16\xd8-\x91v\x97\xedL0\x80\xca\x01\xaf\xa6\xf8c;\xbb\x01\xac`\xbc\x7f\xbc\xbb[\xc3\xd8\x8a41\xf4&\xfc\xdb\x92\xa6L\xce7\x18P\xe6\x8d5\xb8\xe3Bz\xe5W}\xd1#\xac\xbe\xab/X\xd3p\xd1\xf8:\x14i\xe9\x99\x01g\xc4\x1dJ\xc4:\x99E]\xb4x\x85\x0f\xdd \xaf\xd8\xe2\xd4\x96\x18\x98\x9a\xd2\x8f\x14\xdb\x04\xea\x0e\x9f\x1a\xf0\xd8\xb2!\xd2\x92\x7fz@c#[\xb4\xdf\xccj\xbbz\x86\xaaZ\x98\xd7\r1\xf4\xb6\xd5\x06P\x9fm4I\x90sj\x92\x1e\x97\xf8\x05\xffN\x84\x9aXg\xea\xacS]\x0fY\xf3WVpH}Y\xe8]\x80m\xae\xdc#\x0e\n\xb1E3\x93\x05^\xb6D\xd4\x0cP[\xa5\x00df$\xdeZ\xcdP\x99}?\xd4\x96\x850\x82$@UQ\xa6\x17j\xcaJ{y\x8c]\xcc)Y\xeaax\xa62$\xd7\x06\x92\xa68\xe4\xd8\x96\x8e\xe8A\xe2O||\xc6\x9dv\xb9\xac8\xb7\xcb\x83\xab\xde\xb4\x01\x8bB\xb6\x04\x88\xe1\xf0\x92\x96\xa0\xb7\xd0\xfd\xa3\xf6~\xe0\x852\xcfy\x07\t_\x1cT\xdd:TR\x81J\xdbF\xfb\x93\xb4\x86\x83c\x93\x80\xba\x08\x9a\xe3\xd3\x88\xc8\x03z\xd3\x90\x1dP\xf7}\\\x06o\xbd\x01n\'\x11\xb3C\x01\x9c\xca\xd0\xc4\xa9\x86\x93h\xe0\x08H\xb9&L!\xc0\x85M\xe5;+\xd7\xc1D\xdd\xdd/\x99nZ\xedE\x90\xaa\x94\x06\xb6B\xea.\xdb}{\xee\xe5/\x0e\x1e\xd9\x9a\xa2\x8fvf\xd0Os\xd9B\x8aU\xef\x83%\x84\xc1\x99{f\xed\x92)~\xd7v\xe93\xaeP6gZ\x18ob\x7f\xcb\x83n\xfc\xe3\x1a~8\xd0cL\x8c\x04\xe0\xdc~\xdaU0\xf4\x8e\x95\x148*\xe9\xa2cI6\x9b\xfcJn\x88\xb7\xd44xYy\xe6\x8e\xf1fUzB\x9d\xa6\x91\xed\x8f\xc9H\x04ah\x06+\xe6\x84U\x92$\x0b\xb6\x9b\xb9f\x90\xfb\x90)\x88&dY\xb0\xdb%\x06\x9a\x16y\x803~\x83\xd3\xfb\xa6\xa1_\xba\xbe\x1b\xa5\x16\x12\xe4\x0cO\xd9\xf8d]])Xj\x1a\xecr\x91\xe3/\r\xee\x01\x00N4\x1e\xed\xd43NE=\x16\x117\xac~\xd6"\xcc\xc0\x86.[`\x864\xb0\x82\xf7\xae&\x9f\xf34\xee\x8a\x9f\x04zX\xb1#\x0b\x81\xbd\xe3}"\xba\x12>\x97\xf1\xbbZ\xf4+d\xdd\xca\xaf*|z\x05\xcaK\xff\r)9\xfe\xfa#\xf9\xc9\xbe\x93_a\xcc\xb7H\xa8\x82\xf2\xd6\x9d}\x9e\x9e\xf9\x9d+<\x8e\x7f!\xf9\xb5\xdd\xef\xc6\xd9:\xa8\xa7u\xb2\xed\xfbh\x07\x86+\t*%\x80:\x87*\xc4z\x83\xccm\xb5\xb1\xa7\xb1\xed\xfc\x90\xe0\xdca\x85G\x819\xb3\xfcI\xea\x90\xdc\xd6;N\xf5\x84\x0f\xd2f1>\xf7\xa7\x8e\x1ckcAME^\x19\x9d\x88\xd7\x00(D\xb7\xc7\n\xc7)\xda\xb6\xf5\x0c\xf7E\xea\xfa?\x9a\xfb\xd3\xdd\xdeW\x82\xf8x\xd8b\xbb\xb0\x83\x87\xcb)F\xff\x0c\x94\x15\xc2\x90\xfa\x1d\x8a\xeb\xe5\x10\x15\xb6s_\xae\x10\xf1|\xca\xca\xf2\xac-\xe1Q3 \xf6\xee\x16\x90\xb3\xad\x18j\xee\xf7p`\xb7\xd5\x1a\x11\xbd\xa9\x1c\x1f\x8f#\xe9\xc8<\xcb\xeb,z\x0c\xde)\x0f\xddglD\xc3\xcbu\x92\xc0g\x17)o\xbe\xef\x14_\xf3\xcd\xf5\xf4V0\x85\x96\x12\xe0\xff\xcc\x83\x80k\xfe+J@2\xbb\xc0\x02\xc8!c\x0bz\xddm\xdfO\xa0\x16\xe0<\xb2R\x88\x91\x0e\xb6\x95J\x00f\x02u[\x12\xe7\xdb;\x0b\xbc\x1dH;\xbf\xa1\xc2\xb5\xde\xf5l\x95\x13\xe2:\xfd\xe4\xb2\xfa\x0b{\xca\x15\xee\x117\x11\xadb\xcaI\xbd\xc07\x0eP\xd4H(\xd1\xb4\xbf\xb3\xbfV\x8c%m\x1c;\\C0\xb7\xfd\xd1#\xd0&8p!\xb0\x14A\xf8]\xea.lg\xb0\xc4\xdc\xc6\x1cu(\xcc.\xe4\xe9\xc7_\xc5#\xcf\xb9\x1e\x1a\x9a.\x8a\x9fr\x9f_\xfb\x82\xd4h\xce\x816N\xad\x8b\x07\xc0\x8e\xa1Wm\x03\x8af\x12\x0004Q\xfb\xa3X\xd3\xd5\x85t\x1cg\x82\xb7\x88\xf1Us\xef\xdb\xe8+M\xf2\xf4Z\xd34\xcdc4<\x9a\x91F`\x90\xda\x9b\xe5\x8cPp\x1bO\x84B\x82Y$\xea`\x00^\x91\xa8\xcc\x02\xf70\xb0\x07@\x89\xc7\x1a\xe1\xc0\xeb\xcaWy\xec\x9b\x99\xceAL\x89rW\x8fy\xe3\xae\x1a\xcdH|\x8e\x02\xcc\xe1\xa2?\xdef\xdd\x92\xa2\x86SF\xfb\xb7\xeeb\x89M\xd2\x9e\x9cP\x8e\x7fD3\x98]-\xeb0\xe4_\xd2#\xc3\x05\x1abh\x16be\xad\xed\xb2\xe5\xa0\x17\x91G\xaa=\xac\x99\xb7\x06bC\xd0\xb1\xfc9\xed\xc01\t\x05\xdb6>\xf8\x99\x12\x1d\x00\xc7\x9ebF\xd9sc \xc3\xa6c\xc0w\xddg\xaa$\xea\xe1-q~;\xb6\x94Ui\xdf\xbfo\xd7\x10\xc1)w\x07\xc8\xff~\xb9=\xe3\xa1\xfey\xa9\x8d\x08\xbf7+G\x1d\x8f*\xb2\xcd%No\xd1\x012\x82\xb3\xdcZ\x05\x1b\x08\x92.]hI\x0c\xe7\x14>\xf2\x19K\x14\x81\xc1]\xc1c\xdf}X.\x08I\xf3\x06}\x02\x17\xc4\xa8\xc5\x1d\x9f,\xe0\xb7XR\xe0Q\xa6+\x91\x13\xd0\xbe\xf2&\xa7\x9b\'\x8f\xd7g\x1a\\+\x9c`A,\xd5u$\x90\x95F3\x1c\x98\xed\xecqS}J\xad<\xde\xb3\xf4\xf0\xe8\xb3\xd2\x9b\x898\xfd\xa2\xdd\xab\xee\x03|\x91]\xb4W\xe4)\x8c\xda\xa0>\xd1\xa3[a\x1c\x13\x06\x85\xd9DM\x17\x87\xd5}\xf3\x8d\x1b\xebc\xff\xcd\xf2\xb8\xe9\xb3\xc6\x96\xfe\xa7!\x99\xf3\xfa@\xb2\xb1$\tdE\xf8\xbfD?\xee\x88\x06+\xebL\x88!\x83\x04\xd5\x05\xf2\x8a\xff\xa8\x14Ck\xbb\x94\xdaXa)(RT\x1bF\x99:)\xdaABT\x1d\x11\x9b\x18\xde\xbc>\xe92\x97\x9ed\xea>\xcc^\xbf=\xc8\xd2\x9c\xf1\x9db?kK\xf1\xe0\xb2,\xb8\xe4\xdd\x00\xb5\xae\xa2\xd8\n(h\xdd\x0b\xb1u\xd4\x8b\x89\xe80\xcdG\xd9\xb0\x95=\xa1\xb6\x92u\xbd\xf4\xf3\xb5\xe6~\xea\xb7f\x14\xd7\xff\x80M;\x88N+\xbbPQLL\xb77\xa1)\x86X|-ug\xe7\xee\xfd)pwO\x08{$\x11\'\xf4\x8c\x9c\xc0\x9f\x80\xbc\x88\x1dc\x16\xb3\x88\x87\x1e/\xd3\x11GQ\x1a\xb74G`1\xd8\xca\xca\x92\xa4\xa4\x80rp~\x1a\x1c\x11=\x93q\xf2#\xe8\xa1\x83}\xf9\xd9\x96\xffU\xd1\x8aC\x17nlr\xd7q\x98\x06\xb0L\xda\xb8\xd6@\x91\'\xfdG\x92\xcb"\xb5\xf1\x8a\xff\x89.x\xc1/\xe4o\xa1\xb0\xdfx\x0b\x11\xc7\xfa\x8c\xa4\xee\x95\x13\x8fU\x91\x99%B\x99\xb4\xc7\x99R\x168"L\'\x03\xabj\xf9\x13\xf6k\xc5T\'\x87\xfd8}\xbf\x19\x95\x9d\x85\\u}\xdf\xe8STN\xdfP\\\\\x1c\x89\xb0WX\xd8\x01\x84\xde)\xb8\xd8b\xd735\x93\x02^~\x86k\x0b\xd0\xad/l\xee]~\xa80\xf0\xad\xdaT\x8e\xf7\xbca\x88DVH\xb3\t\x08\x7f<\n\xf0s\xcc\xce\xeeQ.S\x94\x9a\xaa\xab\xef7\xb6\x97H\x0b\xe5\xfc\xcd\xe3\x89c\xed\x89\x84\xb4\xb5o\x9f:@\x82\xd5c\xdc\xc3\x02s\xd2gn\xe9<Zn\xac\xb6\xe1\xe0)/\xec^ \xfe\xfe^#O\x98\'\xc9D\x95_V\x8aU^\xb8\xd2:\x0b\t\xb7\xc8\xf7n0\xec`\x00j]\x02-\x0f\x18"\x06\xf4\x99c\xde\xdd\x85\xfe\xc9 7I\xe37rC\xeeS\xd9A\xb63\xfbD\x8fZ\xa6xOus\x0f\xc5\x0b\'\xf2\xdfD\xa8\x17\x9f\x9c\x88a\xa0\xf9\x1f\x19\x84\xe5:&)\xd4Y\xe5n\xae.\xa9\x87\xb3\x11\xa4\xba\x1f\x04\x8b\xd46\x041\x1fCuYnLN\xca\xe3\xbc\xef\xd0\xeb\x95\x99\x1e\x97\xbe~\xbcP\xea\xb6\xb7\xb5{J;5\xedfy@(\xd0\xdb\xdeu\xf3\xb6t\xed\xe6\x93\xf0\xfb\xde\xb7\x89\x0cm\x89\xa6\x1e>\xdd$1\xd0E\x85S\xf1.\x8e[PAQ(\xb1\xfbE\x00\xd1\xe1\xef\xe9x\xdb\x16]7N\x00\xb5\x1c\xf7Hzk\xa0\xd2\x0e\x0b\x7fi\xed{iBR\xbc\xc43gV\xa6B\x99\xb5.\xac\x85\xc4\x91\x1e\x1b.\xb2\x84\t"\xb3\xcc\xe1\xed\xa1\xfe\xb5m\xf6\xe0\t\xb6\xac\xdf$$4U\x85.\x0fv\x15\xcc\xf3\x1e\x089J\x17\n \x91O\x15\xb1\td\xafy\xf1v\x0e\x0c\x7f\xfa\xccMX\x93\x8c\xdfS\xeb\x18\n7\x02\xab\xa09fJ\x8f9h\xc7\xa4\x8dn\x0c\xc4#\xd9\nDf&&@\x97J\x1fh\x84Tv\xd5\xa7L\x85Y\xad\xb0s{+\nB\xf19\xb95/oL\xd1\x15\xdai\xc8`\xc0\xcb\xcc\x92m\xe3F\xfdD\xc2>\x8c\xc6\xa8I\x1b\x16g\xdd\xb0\xa2\xa4\x14K\x7f\xc3\x03\xf4\xe4[\x911\xabu\xdc\xa0\x85\xac\xd0\x9bw\xfe\xc0\x81\x92\xc2vO\xd6=pjr\xf4\xc2\xe1$\xed\xcd\xaf\x86<x\xd0N\x94\x94\xf9\xa6\xc1{\x0bg\x91\x10\xbc8c\xe0\xa9%*\xc4\x03{\xd9\x05Ys\x02\xfb\xc3\xdc\xea\xa7\x9a\x1bLwF-(;h\x9bk\x12\xae\xf7\x01\xd5n\xd2d\xd5\xe7N\xad\t\x94\x14\xb6R\x8cQ\xc7\xceIW\xf7\x8a\x9dmm\x1a\x94i\xef"\xbc\x9d>E=\x87\x8bD1\xfde\xee\x7f\xe6\xaf\xf5p\x1c\x10\x0f.\xce\x94\xc14c\xf3\x00{\t\x96\xb31\x11\xdc\x88z\x9f\xca\x13\xc8\x96\x7f\xd2\xb6^\xd9Z\xf0x)\xec\xb9\xe2"\x13\x13&\xd2\x15\xf5E\x17\xb4\xbd\xbe\x11\xe0\xab\x14tC\x81\xe0q\xbf\x93\xdcx\x83\x92J\x1c\x1a~\x8b6\xa5k\x00\x08\xb6\x8d\xbc\xb3\xe0N+\xd13\x049\xf0v\xe1\x98F\xda\x83\xc8x\xb6\xa66~\x1b\x98C\x18\xb6R",MM\xc6\xad^\xcf\xcc\xe9d\xcb\x9c\xe6\xd4S\x1a \xed\xb6B\xac]\xac\xed\xc6,\x1e;o\xd21\xb4\xcd\xd3W\x1f\xc6\x00g\x07\x1aQ\x9dxC0P\xa6I\xfe\x11 oI\x91\xdc\xb2v\xb7\x08\x95a&\x9f\xee\xd3D\x8c\xe0\xea?\xa2\x99\x00X\xee\xd5\x81,HM\x8b\xefw\x01c\xe5D\x81\xaa:\xfcZ\x1d\x19\x87\xd0\xdd\xad\xd7\x00F\xef\x00\xb6\x01\x16\xedI\xff\x19QB\xb6\rqq\x95\xc3\x19\xbd5\xf4\xa6=Xl\xb2\xc0\xfcv\xae\xbf"\xa1\x1c\xed>\xbdT\'\xf2\x0cs\x8b*Mh\x0f\x89?\xca\xf6\\\xd7\x88\xf90\xb7\x92\xbf\x1fvKt\x1d\x82\xafFH\xf2\x80t\xc2\xd4\xb7\x8a|\xb6\x07!$g\x7f\xc3\xd8\x19\xa5\x1eJ\xb42\x9c\x1a\x06\xf0\xc2\xbf(u\xce\xcf\x8f\xa1*\x00.\x1dj\xf7|M3;\xb0\x9a\xbd\xd4\t3\xd5\xdb@g\xbfI\x10\x83\x11,\\\xc8=\x81&7`\x0e\xd2R\x8f\xa9\x03\x02\xfe?\x84\x0cZ\xbf\xde;@\xf4GXpw\xaf\xba\xea\xd1\x0bo\xb2\xe8?\xd6\xd9m\x18\x0b\x9f\x9aeO\xd7\xcc\xdf\xb2\xca\xa7\xcfVY7\xd0\xd8\xe3\xfa\xf5|\xaa\xdd\xaf$2\x1a\x83-\x84\xac\xb5\x85\xe8|BY\x9cq\xa6\x9d\xf8\xd0&\xee.&\xc1@\x94\xc8\xb3\xcb_I\xcf\x03\x13*\xc6\xfa\xc4\xb1[\x9a<\xb9=\x15\xf9xu\xd99\x0b\xf4\xe2T\x1a\xda\xae\t\xd2N|J\xd7@l\x8a\x02\xa5\\\xc5\x9b\xfc\x92\xaa\xce\xb5\xec\xc1\xa7\x11\xca\x14\x88\x8bHM\xf8\xf3\x15\x93\xbe\x97U\xf9O\x86\xa10\x9e\'T\x0fj\xb17\x86\xf3@\xf0\xfeFK\xd3\xae\xb2\xa0\xea\rDg\xea\x91\xce\xe3\xa3A\x0c\xa5\xcag\x18\xfd\\\xf9gv\xc9)\x1d9\x9d\xf73\xdfg\x02z\xab\xdaG\xa0cDz"\x7f\xb2\xff\xf6\x82\x9e\x0e\x96\xf2\xa0\xb72\xa3\xf3X\xb0\xde(\xe7^f\x19@\x95P\xb2\n\\\xe9\xf5,\x0c\x03\xae|\xb1\x9e4R\x03Cl~n%UgwJV\x1ff\xb3\xcep,\xc6\xb5\xb0\n*\xc7\xfb\xd3\xc0\x00\xc7TR#S\xda5\xec\xd0,\x0f\xab\xd8;\x12?\x9d\xadH`\x90\x89a\xcaB\xe1]A\xf6\x95\xfevl\xd7\x8f\xaaR\x10\xd2\x03\x8byE\xdexe\x8b\xb2\xe1\xf9\xfa\x8e2\x03b\xd5\xb4A\xb7U3SE\xc4-\x1c\x02r\x12\xea\x9f\x84\xe4\xbfij\x8a\x05`\x9cm\x0f\xe8 \xb24.\xfe\x8c\x10D\xac\xae\xd8L\xeb\x98S:\xc3\xca\x85B\x98\'\\\xb4\x84\xa3\n$\xd0>\xff\xe1\xe0b\x970\xea]\x88\x9c\x95\xdc:\xb4\xc3[\x1bK\xbbY\xc7\n\xb3\xa6y\x87\xbc<\xd6z\x17eAdL\x95\x05\x14^\xb5\xd8\x96\x90G+\xcdl\x95\xf7.\xb3q\x0e(\xd7\xfa\x12\xb2\x9b,\xaa\x8bO\xbf\xc0g\x07\xefY\xab0{\x871\xf7U%Kv\x84\xda6\xe9\xbd\x89\x9a\x17j\xe5J4u\x82`F\x86f\xcd0\xda,D_Vo\xc32X\xa5\x14\xe3\xa4\xfd\xc4\xb2\xd0\xc6\xb1\xac\xa7,\x1c\x1a\x89\xb7\x9f\x93\xa2\xbai\xc0\xf72\x8b}\xdaL\xe1*\xeds\xd7\xfc`\x80\x85m\xc9Xa\xdaF\xd9\xd9\xd3J/\xd5\xd3P\xfb\xf3u>b)\x92\x82y\xdc\xa1(&)\x96\xbcy\x96\x0e\x040\x1e]\xc6\x87~\xaf\x95/`\xa3\xa8;K\x8e\xca\xfa\x03\x1d>\x18\x18@2\x83\x8f\x8d\xa8\xf1\xed7\xc7D\x07\xaa\x8eD\x8a\xa9\xc9"![l\xf4M\xd4\xccZ\xf4J\x87\x18\x15\xaal\xf7\xa2\xb4#\xf00=\x95\x1e\x80\t\xdc#M!\x07\x02\xd0\x82\xfe!\xf7\x04\xe0\xed\xfaR=\xe8\xc1\x9c71\xc2+v\xc3\xa1\x03uv\r\x0f\x1cDv\xcfD\xc3>4Q\xb9\xe9\x87b\xf5\xa0;\x15X\xdd[\xf8\xd7\xeb\xca\xfe\xac\n5\xfe\x95\xff\x14b\x16\xc6\xb1[\x1e\xa7)5\xd5\xacx\xea\xd2\xdb\'\x89\xbf\xd1V\x82\x8c\xb7\x8d)\xf8a\x85\xaa\x8c$\xc5\xebO\x97\xd0\x17Y&\xb37SlI\x0f8\xba\x16\xb6\xf1\xd1fI\x8a\xb3(\xe3\xfe{\xea\xd9\xc2\xd7T\xa1Od\xb2H\xaf>\xfdG\xfa\xfd\n\x8be\xfd\xf4\x9dxjH\xe8\xbao+\x9c\xa1\xf3\xb8o\x85`\x08\x94]\xb4\xb9\x94\x94\xf8\x00\x9c\xa9H\xcb\x048Y\x8d\xf1D\xecB\xf8\xc3\xc5\xb3}\xc0T\xcc\xd8\xf6\x184\xd6\xc7\xc6<\xfc\x08|\xea\xb4\xe4cZ\x0e\x8ei\xea4\xba\xd3\x98\xf4\xc0\xfd\xd4r\xd2\xb3\x87\xad\x02\xab\xe7\x15\xab\xc5T\xe7\x85\x92\xa2\x10\xa7\xfa\xb7+\xf9^\x0f\xb1!\xbe@5vU8`\xa5\x1cZ\xfb\xacPX\xc7\xa8\xd9\xed\x951\x11<\x14\xee\x91\x00\\=\x0e\xa6\xb4\x1b\xfa;3o\xf4)\xbb2\x9csd\xa9;\xeaP\xb0F/\x9cL;T\x85*\xc6\xbd\ng\xdf\x94\xfd\xc3\x16\xda\x14\x86\x90\xd3\xcaB\x16\xd7\x14N\xca\xc1\xfcc\xeb\xe4\xdd\x84Z9W4\x9f\xf4|o\xb1\xc4\x930\x97\xd7\xed\x00fjR\xac\xd7\xf8[fN\x8e\xa8\xf0\x8c\xdd\x1cz\xec\x0b\xda\xd6M6\xa0`C\xd3\xba\x8a\xd9\x97\x88\xf8\xcc\n?\xe2\xd0We\xc3-R\xd0\x95FT\xa4\xfc\xcf\xbe\x0f\xd2\xed\x1e\xcb\x9a\t\'\xca\xe8`\xe9PVl<=zm\xbaU\xba\xec&\xaeNa\xd4]\x9b\xea\x11/u,\xe03\x91jf\x9d\\\x85B\x05x\xc5`\xd3A\xd0P$tY\xa9\xa73B\xfb\xa7m\x00\xc6\xa4\x86\xee,t\xe5\'\x92\xca_\xeb\xac\x8e@\xd4\xb6\x9c\xf3\xc3\xad\xe02\xd4\x8aS\x88\t\xe0\x9c\xbe\x9er\x81\x02(\\\xf3~\x8c\xabV\xa8\xf3\xf4\x00\x0c\xeeHy\\\xcfvOt\xf2\xb7\xb2\xe8\x8f\x02\x1e/8\xb3F\xfa3\xc4\x92\xc61R\xc0\x98y\x96\n\xf6\r\xbf\x0b*\xc1\xc9\xa8\xab\xa1\x9d\xd0.E\xe8\x03\x1b\xdd\xd5\xc3Q\x0b\x18\x05\x052L\x02\xfb\xa9\xe9J\xe0\xb61]3\x8e\x91Js.\xea\xfb\xba$\x8d\xf5\xed\xd4q\x00\xa13\xb66\xd5[/F\x9a\x1e\x9a[\xd4"[\xd03\xa0\xf3]=B\xc9\xee#\x17L\xb9e\x92\x7f\x00t\xb5\xcfDG@jb\xf6\xf2\x93\xd3IK\x0b\x18\xff\xf8-\xa6q\x9f\x04\x97H\xbd\xf7\x9a\xe1;\xa0\xe8k\xacX\xf5^\x91y\x9b[(T\x87[\x8c\x94b\xaf\x14\xe1\xf8\x1a\xecw\xb0\xb1\xef\xfeb\xa8\xc2\xa1 \xa9\xbeK\x91(J\x03/\x14\x13=-5\x05\'\xf9e\x04\x16\x9c\x94\xbc\x80\x8a\x92X\x8c|\xd8\x98\xb4KM\\\xe2W\xf7\xd7"$5Uq\xca\xb9\xbc\xded)\xb9\x82P`\x07\xe9\x89w\xe9\xd8s9Z\xbd.\x99\x8d1\xe3\xc5\xa2+\xf3Z\x8bY\x98\x13\\\xc3\xc7\x10\x98\x9f\xa0\xfe\x07\x85\x93\x06\xa6\xb7\x96\xb8\xa2\x90k\xb3\xc8O\xfb\xeeI\x1d%Z\xa9\xa9\xfa\xb4{\xda\xad>\xf8\x1b\xdd8\xd9\x07\xff\x1b"\x86H\xdc\xfc\x0c?1\xde{\t\x13\x9d\x05P}\x16\xf4\xe3\xd3\x89x@\xde\xc5\x83\xa7\xa9/\x0b\x10\x7f\x0b\xce\xcf q\xf2y\xd9D\x83\x1c\xa6\x82W3\xf99\xfe\xf6\x16l\x95bI\xee\xa5\xff\xa6\x83\xc5\xdcl\xd3\xc2\x10K\xc0\x11\x8e\xbd`\x97\xa2\xe3\x0eb\xaeV\xbc8\xa2(\xce\xf1u\xe3\xf5\xe0\xc7\xf9\x13bKt`S\xb6n\x7f\xfb\xf9\x8f\x99=\xe3\x9d\xcb\xee!\xd6\x10)\tq<\x10\xe9\x9b\xf4\x19\xd6\x0b|\xe3(\r`[R"\xef\xfbx\xe8:\xa8\x11\xc8_g\xfd\xde\xe98\r\xfa\xcc\x83p\x01\xae@\xcbi\'\xbf\x9c\xed\x1c\x08\xf9\xd1\xee\xcc\xf3\xb8\xe0\x14U\xd2\xef\xd2\x83\xbe_\xc1u\x1f\xd7S \x08U\xbb\xdd\xf8*\x121R\t6\xa4\xd5\xf5\xa4\xfc\x86,r4&W\x96F\x8f\xf2s\x91\x8f\xb7d\x03:\xd4\x08\xbc(\xaa\xb5\x88\xca.\xdb\xf7\x1f\xc2\xf8\x8b\x02\xbfV\xf2x\xe9^S\xf8\x93\xeb \xaf\xc4x\xbb}}\x98\x95\x7f\xfc\x8a\x07\xadh2>\xbf\xf6\xa5A\xcb\x1d\x95\t\x10\xdey\x99\xf0EH\xf8\xc1\xd2\xa4\xe0\xf4j\x1aG)\xdc\xfa\xbd\xf30f\xc5WZ\xab\x1cp,\xcb[\xb4\x88wfZ\x82\x93\x8e\xc4\x99l\xd4\x1d\r\x82\xb0a\x95\xaae\xa9\xbd\xba\xf2\xff\xfa\\\xefon\xb2\xb9\xd7\x94l{Ng\xfc\xc6\xf9.\x14\xfe\xb6\xfd\xc4\x16\xc8\x87\xc4\x04D\x08\xa7\n\xfe\xa1\xc2B$"\xf7\xd0#\x02[\xe5\x0b\xb3%\xc7\x07:-\xdbl+\xf4[\xb8v\xd6T\xa6\x1b\xfan~\xa6\xef\x0e\xa8Fw#\xd5\xd0]UzW\n\x13\x02\xf1(\xe2\xaeuw\x8e\xdb\x98V@\x14\xd9I\xebB\x01\x95\xe3\xdc\x8b_\xf1\x12;>\'p}\xa7\x17\xfa\x8f\xac\xe5\n\x07\xb6\xad\xec\xf9#\x06\x9bw|\xf2\xdat\xfb\xf4*[\x89^\xa6J\x98\xe5\n`&\xfe\xd0\xf5\x0e8\x8f2{\xe6\xeb\x84\xb3U*\x10\xcb\xed\'\x11`\x8fy\xa9\xe7\'\xe0\xb8Gj\x88Xe\xe5"\x13Z\xda\xda\x0b@\x19\x96\xf9\x05|\x1e\xaa<_\xbb\xb7\xbb\xafNe\x12\x02\xa0\xb4t\xee\x96\xe1\x800\x16w\xcb\xeeF\x14\xe6\x18\xed,\xf3\x13\xda\xc4[c\xc7wr\xb8{\xc6\x92J\xe6\x13\xda\x022n\xb5h\xdd\x9c0\xadHVw\xae*\x92\x1c\x12\xc7\xb2\xc0\xf8\xa6\x93\x86\xfb\x82\x81\x88+"\x88\xec\xfa\xd0b\xd6>5g\xbf.\xd2YN\x99f\xaa\xdeQ\x1f\x887\x7f\xae\xeb\x8e"\x81\xb0\xc8\x128\x9c[n\xd5\xabk\x8bJ\xad\xd5\x01M\x06-\xe3\xc6\xf9 [J}?\xbcI\x94\xc7\xc9q) N\xd0\xaf/\x9a(\xee\xec\x1f\x06\xca\xe3\xd5\xbb#\xa4|\xe7<\x8f\xa2\x0e\xba\xef\xd9=2\xab\xb1\xf4\x8du\xdc\xabHn8\xdd}\xabu\xf45\xf8\xac\xce3kYU"\xf8\xa4\xa0\x04\x15pj\xfd\xbbR\xe3\x82c\x12\xf2\xaf9\x1d\x89w\xfd\x9c\xa3\xdf\xa2\x1a\xc5\x89G\xcbUZc\x9by\xae\xad\xa6\x1ei\x9c\xc6\xa0\x17\xe7\xf4\x0e\xca\xb5\xb3\xe2\x00\x8b\xbd\xf22TD\xc5j\x91i\x95jz\xd5]\xa9]\xb8\x01\x16\xe7\x88Y\xc1Q\xe3\xaeK\xa8\xb7\xe7\x17\xeaQ\x8b\xa4A&A\xb81+m\xe7L\x1aSV\xbf>e\xd7\x19r\x81\xbc.ZL4\xd4.0?\xbe\x1a,W\xca\xbb\xd6\xbe\xa0!/\x89\xc9 \x85\xf4XWr\xfe\xbe\xfb\xecE\xa3\x00\x92L"\xa5K\x1eG\x00w\xe9\x83Lq,\xef\xfego\xd7.\x84\xd4q\xa6%?>=\x8alBr\xaa\xb2]\x97i\xec\x98\xa2\xbb:\xeb\xed\xbef\x8f\xcf\xcb\x1b&cK\xb3K\x16\xe3m\x00o\xe2\xb0\xa2\x1f\xa4\x83\xa5\x9b\x90aC\xd1\xf8F\x91V\xcaM\xec\xf0\xe0"jB+c\x93\xed^\x1c\x1a\xf7\xf7\x15{n9_\xb6\\\xe6:Ay\xbc\xc3\xb0\xd5\xd2#\xfe\x0c\xdf\xf5u\xd3`\xf0\xdd\xf9\xd0\\?M\\4[\xe9k\x95\x88\xc6\xe0"nyMA\xd3\x97T\xc1\x8cA\xf2\xc0\xf0\x14\xd3\x8b\xb0>\x92\x00VOk\x9a~C\x9a\xb0\x1bi\x12#Od7K\xca\xeb\xa6d-T.\x97\x9d\xaf\x0f\xdc\x00(\xb1)\xcek~\x95\x80\xd8\x8e\xf1\xfb\xd0W\xcf\x83\xe8\xd2\xd2\xeb\xae\xd8\xbd/V\xef{\x15B\xfa\xf4\x03+\x1a\xdf\x8a\xfc\xd1\xcd]\x11\x91r;\x8a\xe36^Z\xa4q\rL\xf8K\x11\xa4\x8f\xae\x18?\xfdORk\xf4t\xb5\xd0OY\xb3\x17C{\xb4\x91Q\xf39\xd9\x9d\x06\xc7\xec\xef3\x9fA\xb2\rN\x1dwi\x92\xeb\xb2\xb5\xbb\x04b$\x8c\xea\x08\xa3\xd4\x15\xef`>\xb1s\xd37\xd8[n\xe8\x00\xc9\xea\x15"O<W\xad\x95\xe4\x01\xc1\xfb\xc1\x1cY\x02\xf7\xb9\x81\xcf-\x0b\x827^\x1a\x01\xf3\xe9^\x89j9\x7f\x9br\xb8\x07\xe1\xa6D>|`\x97\xe82\x1e\xb2\x06d\x0b<l\x8b\xf4\x01\xf2|\x0e\x15@\xc9\xec\xa7\xae\x15\xc6M&@"3*\x91z\xc4\xdf\\\x9e.\xe1f\x9f[\xb8\xa6>\x94\x10<\xb4\x8f\x17\xd3\xd3\xe8\xf9\xbc\xad\t\x91[\x0e{\xe9\xb1\x96up\\\xd0\xbb\xb6\ri\x9a\xf9\xc2QL\xe7\xc9\x0f\x18\x82\x1b\xb0\x9d\x82\xcb\x8b\x8e\r\x8b\xf5\xf2\x08{\xcd\x8e$q?\x11\xfd%\xc0\x8bkl\xf3C"p\x1b\x8f6\x0f\x1e\'P\xec\xdd\xc4k\x0c\xe0\xaf\xbc\x012\xd2\x93\x86\xe9&BSL\x18t\xbbl\x12\xa3\x97|\x172\xc6\xfc0\xf9|\xa2\x13\x97\xca\x8e\xde`\xe8\x7f\x8c\xcbY\xd2\\|j\xc9u\x90\xd6\x9f$\xaaH\xfd\x173a\xb5\x02\xde+,\x9a~\x809\x8f\x0f\x89\xb5X\t1:t\xfb\x89\xf9\xf9If\x17\xf9w\x87=)\xc8K(\xf3\x8b\x1f\xee0\xf3\xd4\x15ujm\x9e_f7\xf0\xf3\xe8\x80\x8fK\x88\x9e##F}\xe9y\xee\x01e\xbe\xe9Q\x84H\x19\x8f\x05\xfczCO\x87\x1f\x7f\x85|m\xcd\xb2\xa7h\x81\x1b\xc5JV8\x1b\x7f\xc3~\x18\x91\x0b\xf2}\xa9\xb1`\xa1.i\xefv\xce\x9b\xcf\xf0\x00\x83\xbb\x8c\xc2\xf1\xe8\xe4\xf8\x80\x1cY\xdc$\r\xc1\x1b\x00qt\xf8\x9do\x12\xb9\x80\xf6\xdak\xf3AXw\xbc\x86Fc\x18:\xa9\x95z\xe4\xa8\x13X\x19s;~\x99\xe9\x1bX\x85\'\xba<\x1c?\xa8\xa8\x9du\xfbfF5/\x81\xa20\x01\xbf\xfc\x18\xa4\t2\xc98_\x8b\xda\xe7\x06\xd3\xe2\x0f\x89\x85D\x18x\xaa\xbf\x84\x92\x01\xfdy\xe0\rk\xbc"~\x7fO}P\r\x1c\xd5\x8e\x91\xda0\xab\x9f\x0f!\xc0\x13\x1f2p\xaa8\xbd\x15*\xc3\x19\xbf:\xc7\xccd=\x95\xf4\x16\xd6\xc7\x91F\xd1p\xd3\xdd1\xec\xf9#\xbd\x16?\xb7\x97\x17\x90\xfd\xear\xd2\\s\x95.6\x9d\xfaf\x9e6\x91J3B\xc3\xbfF\x93\xa7\xd1\\~\x98\xea8d\xa2P\xecJ\xec\x99\xa2\x18\xc8\xa1c\xc2\xbb\x14\x03m\x0b\xea\xf7\xa3f*\x03\xedjV@\x9a\xb6\x9c/\x00\xee\x03N\x9b\r9$\xd9\x11cn#\xe1S(\xe4V\xb1\x82\xb7\xb2\xb1\xbcu\x1d\xd7F\x1c\xaf\xef\xc4\x10\x05\xef\xee\xee\xc9"\x94\xe8\x90\x03\xe8R\x87}\x8f"rv\x0b\x86\x19?N\xa9\xef\xd5\x08{\x0c\x8f\xdbhD\x176\xe6\xd1\x84\xc1\x13\x05\xdbl\xd3\x8b\xc1\x9d\xa9\xb3\x90 l\xc3\xbc5;\nm\xd0\xe4\xd0h\x15\x9fc2E~g\xab\xe9\xa0L\xc54\xdcv\x8ad\x94\xe4\xa2:=/\xfc\xce\x1f$\xdfU\xab|G\xf6L\x0f\x1b\xf62\x118\xcb{\x8e\xf75R\x1c\xe1)\xb0\xf2J:\xf9\x7f\x9e\xdf\xf82\xcav\x92A]M\xa7\xa0zOv\xd5\xc9u5\t\xa2\x15\x96\xab-qy\x06\xab\'\x82\xbe!\xf1\x18\xbe\x08&{Y\xa24\xbf\xa3Ij\\}\xf6F\xbcS\x95D\x96\xa9\x1f\xe3\xfb\x12\xe8Jl\xfd\xb2\x89\xbc\xb8\xb7\x9c\x8fEr\xdd2\xbd\x92X*\x0f\xe4\x0f3\xab\xc7\x1e\xcac\xc0\x92\xa01\x97\xaf\xa2\x8b\xf7e\x0c\xe4\x87\xfd\xe6\x87D^\xed:\x1d\x07\xa1\xb6C\x9c\xe7jtd%j\xf9\x05\xa6\xc6\xfaF$\xe0\r\xf4&d\xd4r\xca\xbe\xa3\x0f@>\x1cT\xd1\xab\x13}\x0fr)\x84\x17\x9c$U\xaa\xdfR\xf5\x04\xdc"4W#|\xaf\xcb\xbb\xcc\xf2\x9bq\xed\x1f4it\x94\xd4\xd8\xdd\x9b\x17RE\x9c\x1a\xe8\x7f\xe0\x88}\xc2JW\xe4\xde%\xbc\xebY]\xa6\xdd5v\xdb?\xa0\x01\x03\x17\xd1\x19:V\xdd)\x06\xec\xb7\xe3\xb8\xf0R\xa0\xc9\xfdY\xf5\x89p\xddWj\xfe\x9a\xd0V\x18G\x81^y\xa3\x15\x11\xf67\xde=n\x8e\xc5\xbb+\x12R?s\x11,!\xa6\xbc\x8a"\xac\xe3:k\xed\x0f{4\xde\xf9\xe5\xbb\xfd\xa2&M\xcc\x904v&\xcc\xde?S\x9f\xe5\xb4[\x11\xb0\x1a\xe2\x13\xf2mme\x00\xba\xda8\xec\x89\xde{6\xf2z\xf9C]\xdb\xfe\xd6yK\xb9\x19dN\x19A\xee\xb7\xaa\x06\xd9\x9ca\x13Y\xd6\xd3\xb9\xedNe\xa5\xf3\xd2\x00\x99ZT8\x11\x0f\xfa\x93:\x1c\x86\xf1~.-D\xe3\xfb*<-_\xae\xdf*\xb6\xfaf\xf3\x8d\xa4\x1a\x16\x89\xedC"\x8a\xb7\xbf"1\x0e\xb763\xf4\xab8\xabc\x97\xc95\x8e\xb1)\xda\x06jC*\x9c\xf5d\xdd=e\xd9\xf9\x14x$\xa5\xffSG\xd8\xf5?\xd8~W{Z\xcft\xb7m\xb5\xa3\xe2\x03k\xe0\xbeL\xac\xc9\xc9\xbfH$\xcbs\xb1t\x10a$\xd7\xfaJ\xb9;\x85\x82^\x0c\xcf\xeaZ\xaf\x92[\xa8\xde\xae$[\xddd\xb2\x89\xf1CQ\xa8\xb2\x07\xdf\t\x98\x7fH\r\xab8\x93\xbd`\x0fWV!\xca\x82J\xc1\x83\xbe\'m\x99{Y\xa2(\x8d\xb4|7\xbd\x1c.\x0e\xc6Z\xef\xb6q\xf2\xd4\xa1\x14\xee1\xea;\xef&+\xead\xba\xe4\xfe\'\x9a\x9fn\xbc\xb3\x14Y\x15\x19\xd0\xbe\x1b\xab\x02j\xaf\x9b\xea\xc0\xf1\x12| "\xa9\t\xa4\x1aye#1\x01%\xdb\xf8\xd1\xb2\xb2C\x12\xe0\xed\xb690,Yq\xb8\x81\x11\xfe\xd4\xae\xb7.\xa3\xbe\xf2\x8b\x17_\\\xfa!*O\x88m\xe5\xbd\x1b\x17%\xb0\xff*NJ\xc0zj3n\xf0\xd8\xf4w\x00xp\x18\x03\xa7b\xea@\xfd$\xc1\xad\xf4\x07\xec\xfb\xc5\xc1\x1aZ\xf4\xc90\xdb\x04\xf4C\x87\xdc\x03F\x12\xee\xb6,\xc2\xa2\xe1+\xea\x9cA_wt\xb8\xe4>\x17[\xb9\xfaq\xbb\xb7\x7f\x8f!\xe8\xe0r\x83\x836\xe8H\xa7\xc5\x99!\x99nE0/\xe7\'\xf4\x1c\x1f\xae2Uk\xd1~W\xcf\x10\x824\x02\xd4\xa4\x9dC\xb6\x1b\xd8\x8co7\x97\x1ah\xb0\xb5o\xa5\xc8k\xb5\xa2\xbfl\x9b\xdc\xd7f\xc5NRnF\x1fw\xba\xbd\xadik\x89\xe0\xef^\xf9\x17.\xc9C\xc9lN\xec9DT\x86;y\xf9\xdb\x93U\x04\x1e:i\t\xc4)\xafL\xda\x15\x86\xf7\x9f\x16\x04\xf6>cD\x8b\x81&\rJ&\xdd\xd4\x13\\\x8e\xb1\xb1\xdcz\xf8\x841kmf\x82\xaa\x88\x8eR\xc0>\xa3@\xa0,\xed\x0f\xe0O\xa7\xe3\x00l\xe7m\xd7\x14r\xc1\xb0\x92\xc6(@\x94A\xe9\x11)G8\x03\xad\xb4\xfb\xd7\xd6:\x8a\x95@S\x11\xeb\x8e?O\xefq\xc9<\xfdb\xa3\xa7]\xeb\xa5X\x174tw\x9e\xc3\xd2\xc9\x16\xa6v\x15\x06\xbb\x1e\x91y\xff\xa2\xa7\xa7\xfb]\xce\xda\xb2R?\xe0\x1f(\x1a\xd77\xe1\x14*\x7f\xe2\xe2Z\x86\x91#\x89a\x9d\xb4\xad\xe2!,\xf7\xbf\xafa\xef\xe4\xa9\xa6\x0e\x87\xe7\x19x\xb6\xf3\x10L_72J\xaa\x19r\xfa\xa0\xa8\xb4\xa1\xbe\xdb\x03\xc9;\xa5m\x1d\x83r\xfd[\xde\xbf<\xa9\xc4\x8f\x87\xc6\x15p\x02\xe7\xfa\x02\xf4\x1d\xba\xb1y\xd1.\xb8\x81["\xda\x90(\xba>\xc4\xfcIi780\xc8\xad\xc7I\x87p\xf5\xed\xd3\xc8U\xd6\xdb\xd8\x87\xa3!\xfcw\xbe\x86\x12\xa5\xf7i\x1aY.MH\xe9\'\nG\x02N\x11;\xc6\xb3\x81\x9d\xa0\xef\x060\x03iC\xb8\x96y\xd5L<\x98\xbf\x0f\xdc$\xf2e~\x86h\xf2B\xe6\xe6oSk\xc0VS\xd0Z\x88\xb7\xc1\xd32\x93\x98}\xc2U)\x9eG\xb1yU\x9e\xed3\xa0\x15M\x1e\x7f\x81J\xea\xeb\n\xa3\xc4\x91\x8a\xa2SG\x12\xe8\xf4\xc5b\x167\x91\xff\x91\x9f1\xd9t\x8ch2\x0f\t_\xe1!v\xa3\x91\xa9F\xdf\xd5M\x15\x9d\x92i\xa5m\x12\xbd\x1a|b\xaa{\xd7\xc7!}\xdf\xa9\x1e\xbf\x17\xee}\xed\xa9v!\xd0_JS\x013\x90\xa4\x0c\xc2\xfb+\xdb\x1d@\xb4\x0f\xc4\xa0d\na\xd4\n\xc2\xb8)H3\xcf\x9f{\x04x/\xe9Wm\xf8K\xf7\xdf\xfd-!W7s,\x84\xe6\xaciJU9\xff+\x1a\x9c\xd8\'H\x1a\x02\x8e\x1f\xebf\x8e\xf0\\\x1b\xb1h\xb11\xb8Y@\x16\xc91\x80\x85\x19\xeb&&bUrn\x86\x15\x81L\xf9\xb5;\xa4\xba*\xd5\x0c\x1a._\x02C*\xef\x93\xf3\xdd\xff\x920\x1c\x91v\xe6\xdeO\xd3\x93\n\x8b\xa3U\xe7\t\xbc#~\xbe\xb9;\x12\xed\xd46\x16_\xeb\xaeT\xf6\xcd#\xf7\x13B\xacsu\xd0\x9cZf\x86td\xc87c>\xc8\xbd\xb5e\x1c\xdbi\xbe\xfbk\xd3\x17\xc8\x00\xe0\x9e\xa5\xd1\x02\xa9\xf8x\x99\xb1~\xa5\x97\x0boB\x1b\xdf\xec\x87\x96\x8e^\xc1\xf0\x89?\xbfp5\xa7\xb3\x0b\xdf^\x96\xd9\x83\xfd\xc0\x02\x90Z\xe9\xea\xd7\x01\xc7\xbe\x16\xffE\xf7\xdaV\xfa\x93\x0b\xd8\xe3\x83\xf4v\xccQT\xc6\x0c\xcd3F\xff3\x1b,\x03:\x94\xdb\xa0z\xd7gb\xaad\x19C\xf6\xc5\x9c\x11e\n\x12\xde\x8a\x05\xb8\xf77\xf7\xac\x864)m\x11\xd5m\x1c\x9fm\x04o}\xac\xf0M\xe1t\x9ez\xd5\xf3\xa7\xd2\xa6\xbbT\xd4\xac\xf4\xce>\x11Tu\x94\xd6\xb74\xa9u\xe3z\xe0\xebg\x05\xc5\xfa\xf6]Z\xd9\xa7Bt\x0b8a\xd1\nb\x90\x0e\x11c\xb0\xb0\xa5[\xa2\xfbb\x93\x14U\xba\xa1\x9e\xed\x04\x0e\xf2\xfb\x04\xc3]\xf7Wr\x85\x83\xb0r\xa9\x16\xee\xa3g.\xb87\xab\xd1\xfeRt\xce\x8b\xe1\x8d\x14\x97>\x10\xd9\x19\x8e\tj\xda\xc9\xf4\x8a\x1a"l\xfa\x89Q\xc1\xb2\xde\xe62\xb2\xfc\xe6\x91\xe9\xaa~q\x04C8\xb2\'O\x9c\xcc\x8a<<\xb6o\\%\xca>\xde@d\x82\x8az\xa4FW\xabp\xd9\x04P."\x0c\x99&\xd2\xf8\xb0]\xd1\x81\x14Xu\xb2\xb8HW1\x88MC7\x85\xcd\xcb\xf5\xd7\xdb\\\x823\xe0\x18c\xbbS\x9e\xca\xc6d;8w\xc9\x83"V\xeaM\xe1\x16UC\x9a\x8a|O&\xda\x15\xee\xeai\xf9\xa58\x95\r[C%\x80_\xa7\xb4V\x0b\x1ce\xba\xce\x9b{P\xccnz\x7f\x8f\xf1\xe6\xec\x8dK\x95\xf8c\x16\xda\xe0\xbd\x15y\xf2\x1b\x8b\\\xe7\x1dO\xba+\xf6%\xb0Q\xa8\x8a\x9c\x00&l.\x19\xaaj\x9c*\x1bX\xb50\xbe\x1a;\xad\xe7\x08^T\x14\xdcm=A\x15\xeb\xc5\x8c\xcc0*m\xd6\xacN\xfe\xb4\xcd\xad$\xe1\x8b\xc6xM\xe5\xd5\xe9\xcd\x05\x06\x91\xf0\x07\xb2Y\x82\x8d\xabh\xdb\x04\xe0\x9fA\xc9\x11+E\xab\xa0\x0e\xd4g\xc6\xac\x03xbvY\x1b\xb0|b\xbe?\xee&\x8b\xc2n\xe9!G\xc5\xdc\xd4\x87G\x97\xe4\x95a\xf5|\xf0\x15\x01d\xdd\x89lYw\xd6>\x18|\x00\xcf\x97\x1f5\xd2\x9f\xba\x8d\xe8\x16\x9d\x935\x16\xa4R\xb7@P9M\xaeh\xdc\x12\x8c\xba\x88\xf3WQ(\x1c=\x8c\xcfYyL\xfc\x88\x04d\xfd\xd1\n\xcbt\x16\xa7r\x85\x8dh\x91\xcc\x07\xc7Y\x12B\xb4\xae\xda\x95\xa2\xc3\x82\xae_v\xd6h&\x01\xfe\x9a\x7f\x1b\x8b\xd6O\x7f\x81\xf0\x084\x1d\xbc\xda\xc7\xe3\xde\xd3\x0f2\x99x\x07)\x079\xa4$\x86\x1e\xa5\xb7\x8d\x844k\xde\x90\x13\xeb\x8e\xef7\xba\xcaB1\x1d\xe7-f\x92 \x08\xbb\xcbG|\xe8u\x15\xffs\x08\xc6\x14\xee\xd1\x08<\xa84\xb6k\xe7fx,\x89\xa7me\xefE+\xa8I\xcb\xf6\x12\xbeL\xca\xfa\xe3\xc7\x85\xb1\x1d\x98H!\xb2\xa5X\xfe\xc10\x00\xb0\x8e$S\xa6\x12B{)\x0cd\xea\xb4\xa1\x8e\n}\x9b\xcc\xf2\x18y+\xbaA\xe3I\xa7\xb1\x1a\x0b\xcb]\x8b-]\x9c\x99\xc9\xa1\xb1e\\\x15r\xb9x\xcf\xc1\x82\xd6\xaa\x81g\x15\x7f\xef\xa3 \xcf\x15\xf7\xad\xb0\x8eY\xf98\xf9s\x13\x9av\x07\xf7g\x82\xe3;W\xf3\x16^\xc5\xa7F\xe2\x04\x95\x10/\xa6M\x88\xbc\xf9\xd9\x99\x82*\xb9\x18\xf9\x16#\x93ZV\xf8\x08\x1b\x05c\xe0\xf9q.\xa5\x86*\xda6l\x9a\x16\x9bfK\xab\xbe\x07\xb0Z\xe5\xde^\xb8\xcb\x1c\x8c\xdb*d\xf8}\x9d\x03L\xc8\xcdk*\xeb\x11S\xf2\x85\x17F`]\xae\xf1Q+x\xed\xbe\xec\xd0\xa0\xd0\x82\xe3\x91\xee\xd1 \xf3\x8b,\xcaA3x\xb1\x05\xe0\xfb\xa1#\x96\x92\x9ax\x88\rtb\xf92\x80\x070\x1b\xff\x11\xaf\x0b\x9f\x12\x10\xca\xfc{\x95\xe1\xa5\x10U\xe0\x91\x009\x918\xbd\xa9\x9b\xbem\t\xea\x8e\x0b\xb1Q\x1d\xdc]\x01R\xbe)\x84\xa6\xd3\xf2c\x8b\x82n\xd8\x93<\xfe0\xac\xc5()P2\x15\xcd\xd9\xd8\xd3D\x01\xd0\xe2JA\x19c)&\t\x02*\x87O`q\xdd\x1f\xef;\xca\xc3*\xb5\xf9G\xaaZ3\xad\xf3\x93N\xca\xf3\xd4\xc4\xef\xdb\xb1&h\x7fV\xb5\xb5\x82\x83\xb9\xcdRdR\x88\x1et\xef\x11\xee\xb1X\x05K\xecb\xf2\xf8\x00\xd0\xdb\xdd\x97\x19\x9fA5QZ\xfcL\xdf\xaaq\x18\x8832\xe4\x03\x9d\xa1\x91\xd4\x84P\x05\xaf\xdb\x81\xc7\x07\x87\xdc\xe9\x04\xceU\x11}\xbd\xbd\xf759nm\x1a\xf2\xf2^G\x0b)0\xcd!\xeeJ+\x9c\xdc\x1e\xce\xdd\xcc\x97C\x17\x99K\x92\xb9Re\x07\xc1\xa1\xe2p\x0b\x068&f\x80\x95\xc3\x94\x00\x8a\xe9J\xff\xb6?<\xca\xf5\x0b=\xa6\x80\xa1\xb4\'Mb\xf4D\xb2\xa7\xe5\xdco\x84-p\xa9\xd9H\xe88\x08\x01\xfb\xef\xc9\xc5\xd5\x15n\x8e\x91C\xc4\xeb\xa2% \x87\xaaFY\x05KX]\x82\xaaQ\x1f\xee#\xc1\xeb\x8b\xcb\xaa\xf1\xbb\xe1G\xe7\x16H\x0b\xd3^\xa59\x8f\x1d\x99\xc1c]I\xde/N@q\xbf\xd1 \xbc\x07Yv%\xc2\x1c\x11\x95\xd7\x83\xe6r\xd7\x00\xca\x0f\x86\x12\xdf\xaa/\xb9\xb2\xb9\xeb`\xc8G\xde.\xa2Q\xadN~\xbe\x08 \x17\xf6\xf8\xf8\xfe(PREg4\xe7\x9f\x04\x1bj\xdd\x9dF09\xc7\xad\x7fE\xdb\xcc0#\xc6\xe7\xfcv\x86;iq-\x89\xff\x98\xe2\xa5\x048\xfb\x0f+[\x19F\xa0\xd3\xa4\x10\xaa\xe1\x11\xdf\x08\x9f\xa7\xbdIO\'\xcf\x07\x91}\xe5\xcc\xd7\xcb\x1c\xe0my\xdcuD8/8H\xe8N\xcf\x8e\xf19V(\x91F\xa5rx\xa35\xbd\xf5\xe7Y\xd4\x8dk\xe0\xbbo\xc5\xc8\x87\xb3B\x80k\xe1G\xb7\xce\x91\xd9\xdaOJ7\xa0\xf4\xc2\xfb\xfc\x05+^\x1c\xd4;\x91\xca\xf1\xad\xae\x1f\xbc)\xc3\x16\xd8\xbd\x915\x15\xfc\x81;\xa3\xd0\xba\xa5\xb2!\xed{\x93\x9eN\x8b\r\x08k_\x82\xdfb\xda>y\xcdq\x0f\x8d\x0b\x922g\x87\xeb?g\xd1[\x01\xa8`\x86\xbf\x9f\xc0\xc6*.~z\xac=\xc7-\xf2h\x04\xd4`\x96*\xf5X\xb5\x8ff\xcb\xff\x9a\xbd\xfa/\xc1b\xac\xcd8b\xc8b.\x8c\xa86\xc8`\x8c\xa4U?r|fmd\t\xb5\xfc\xca\x03O$\xd8\xafb\x95\x04a\\\xfff\xd2\xed\xdd,H\x12+\x08\xedj\x81d\xa6\xdd\x00H\x02oY\x82\xc85\xff\xe8\xc4\xaal\xd0\x18\x87\xb0\x82\xe2f\x9a\xac]\xe5\x9a\x08qk\x7f,m3\xc4Pi\x01LN\xef[HIA+`\xf9;.N\x1b\xae\x95\xca\x14\x92y\x9e\x14dO\xed\xd1\xf2W\xe9)\xca\xcfq1|R\x89\xa7\r\xa7Q&?%\x12\xe9M)\xecS\xden\xa8`,\xc4:\x8f\xe8j:\xfd\xdf\xddQ\xab\x17\xdd;Z\xa4\xd7\xday\xf0+\x9c\xee\x90)\\\xeb\xe5bU\x1a\xc6\x16\xaf\xd4\xa6\x18\x89\xcb\x94\xb3\xa5\x89\xa7\xd6\xac\xd6\'t\x95\xac\xbe\x82\x90v\xa7oU\x99\t\xf2\xf9b\xd8j\xc5\x96\xa1\xfdD\x9cC\xc8Q\xf0\x19\xa5\x8f.\xe524\xb8n\xf7\x17QG5\xcfMA\xb0\xc9\xceXULt\xa2pl0\x82OT\xea\x93\rGn>I\xabb\xbe\x1e0\xf7hvHtIx\x9d\xb9\xdd\x08\xb7\xd1\xd4r{\xa2P[[\xae\xaf\xd0X#\xa3\xa6\xeb\r$X\xced#\xa3\x9fnP\x12\xee\x9b\xf0\xbb\xf6\\7\xbb\xe9\x93\x9d\xea\xb3\xbf\x06\x04\xbb\xb7\xe8\xcda"\x81\x1b\x82-o\xc5\x01\x1eo\xeaO\xca\xc4\xb4\xe9;\x0e\xc9\xdaR\x8dhL\x17\xcde\x06\xa3\x0e/\x7f\x14]4\tB\xa3\xc3\x91\x16p\xc7\xdf#=\xebWM\x9bx\x98\xe9Q\xd8\x85\xfd\x00I$a\xde\x90\xdd\xa4\x13\xdc[\xda\xb68\x08\x97\xb9!\xa3\x84\xbb\x1eGdt\xab\xd5\x12\x0f\xd2\xd4\xebn\xc0\x98N\x15e\xcc"-\xbf\xca\x13\x08\r\x97\xc8$zr\x1b\xde\xab\x19\x1e;\xaffg\x92\xe1\xa0I\\TF\xd7T\xd9<\xa3\xc8&\xce\x04\xf9:g\xaa\xdf\xbbc\xa9\xa0\x12\xfc\x15\xf2\r2Q\xfe\x0f\xca\xa5\xea\xcbq\xafi\xe2\xb4\xbarH\xbf\xaeD#I\rh+\xf73!\xecE\xb9\x1dNg\xc8D\x81\xec\xd1Ka\xea\xa5&S\xb2z\xa5\'\xf2f$\xc2\x82\x97g|\xf2\x1b\xb7\xaf\xc2\x8d<\xff\xe4\xb2\x84JFf\x9b\xd9\x19}\xb6\xbb`d\xae\xb2d\xa1\x98\xc7\x10%\x1f\x9de\xaf\xa4\xa5\x8b\xc8\r\xd0`\xb0\x88!\xf9X\xcfa\xd0E\xadTm*d\xa4qP3\xfe\x98p^\x0cv\xa17\xf1\x8e\x19+\xfe\x11rc\xc7\x81\xa4\xbal\xa3\x9e\xf4F\x01\n(\xca\x11<z\x9b\x97\x18\x9b\xdc$G`\xce\xe1\xd9n\x81\xd4RvXG\xcd\x8f\xb3\xf9\xfe\xf01\xd8\xb1\x08\x1f\xd4\x95\x88\xff\xe9*\x10\x9a\xe7\xb7rT\xd6H\xb2\x0b\x85\xae\xe2\x97\x9c\xcb\x9c\xcd\xaf\xff\x97\x97\x8d\xe3\x80\xc17\x16[=\n\x96\x9d\xbfB?z\xe2o\xfeRb*A\x0b\x95o@3\x11\x1d\xc5Q\xbe\x1c?\x8e^y\x86\xc2\xd5\xb4\xc4^\xb5\x970\x98v\xfaYO\xafNR\xd6[T\xd8\x8d\xf0\xea\x11X\x9a\xafVL\xaf\x9a\x8ejN\xe8(\x9d\xfa\xab\x8a\xab\xf4.\xb22\xf9f\xb4%4\x82\xe0~b\xf9 3\x15\x9f\x13\xcb\x00\x17\xea\xa6I\xf0\xca\x88\xaf\x11\xf2\xf0OcV8\x16 \x95\xc3\xa3&\x02\xca\x94A\xfc2\x12O\xfb\x0b\'\xbb8\x87V\xc8\x10\xcf\xeb\x18\r&,\xba\x81k\xe1\xfd\xe9\xc6\x0f\xf05\xd7V\x99\x92\xc3\x00\xe7\xc41"\x0e\xbb\xad1\xb1\xca{\xc9\xcc\r<\x04\x8fW\x15\xab\x88\\%\xd0q\x82\x96$O[\xcfbx\x81}\xec\x8b\xfc\x8d\xa2\xbb\xcc-\xdbMKI~#\x90\xde\xb2y\x9f\xcc\xed\xb67"\x9a\x19\x0f}\x0c\xb0\xb8\xaf\x9f\x18\xb1\'\xb0upS\xda\xd3\x99G\xb3\x94"i\x80\x94\xa0\x03\xfc\xe7\xa1\xd1\x92\x9d\xf4\xd7tp\xcc\xf7(\x13\x12\xa5\xed\xa8#\n\\\x1a\xb4\x92\x93\x8b\xbf?\xac\xe4\x93\xbd_\x1d\xfew\x81oI\x16(\x03l\xc8\xfdC\xbd\xf0W\xc3\xef\xe9\xb4\x98\x92\x9b\x85_\xda(\xd4\xb0}*v8\x812S\xcb\x15X1eX\xc8\x95Am\xc6,\xe6}s\xad\xc8\xde\xd83\xfc\xb2o\xed\xdf\xcb\xc6d\x11"!\xde\x0c0\xdd\x1b\x9a\x0c=L\x83c%\xef\n5\xe4\x12Q\xee#\xc1\xa3\x9c\xab\xb7\x84M\xac<\x98x\x9e+B\xed`$\xcf\xc5\x9a\x8a\xcae\xf3\xb0\x81\xc3\xd0\xb6\x98%=\r\xe4-\xc7\r\xbfR\x0cW\xde\xe0\xa6\x83u:lr\x18c$\x9c\x14\xdf\x15\x19$\xa8Y\xe3i\x0c\xd3\x1f\xdd\x1f\xa1\x19\x84F\xb4\xb3\x9et\xf4\xcb\xcd\xd7$\x98j2\xa9\xfa$\xff\x98k-Ct!\x810\xd6\x8b\xf8!\xa8\x83\x9a\x80!F\xab\xd1\x87\xa2%s\xabZYj8\xf4\x95\x81:jx\x96J\x9a\xef\xa5\xe1\xb6\x96_;+\x80x\x12\xb5xAi\x14>\\P0\x05\xca\x98\x91.#\x8f\x08\xd7\x8a;\x92\xdf\xed`\xbba<\xd2\xee\x90\x8f\xba\xfat\xfe\xa8\r\x1aY\x1e\xed\xe8]\x9f\xdf\x03r\xfd:-\xb6\xc3q\xea>(T\xae\x9a\xf82\x9a#\xf7OD\xe4(\xf8OJ\x0f\x98\xce+N7\xcd\xa0\x8b\x85\xa7\xac\x84x\xf1\x80\x9c\x8d\xcbi\x1c\x91\xbb#\x11P\xfdyN\th\xec\x98v\xbb\xed\xfbQ\xb7>\x94\x02Z\xea\xfe\xd6\xfa\xa7a\x83u\x10\xbd\xe8\x13\xf8\xea\xbep\x81\xd4\x04\x87\x9a[\'>\xaaz\xcd-#9Q\x87I\xee0/\xbf\x00\xa2\xa6\xe1N- T3k:\x84S\x17\xdbJ\x18~\x18\x01\xd0\x1ab\xb0A\x92\x08u\x10\xf6]\xb6jcS\x87\xb7\x01\xa2No\xae\x10\xb4V\x8a?\x00\x96\xee\x03\xf8\xda\x0buY_\x7fP]\x9e\x0c\x1f\x85\xc7\x1d!\x03D\xb5=\'\x92~{\xaepW\xf00\xc6_&\xb5\xac\xfb\x08rd\xacD\xe2D\xc9\xa4\xd9\xb0\xc0@\xc1 \xeb\xf2\x04\x96"\x9bjIs\xd4\x9e\xd4Z \xefr\xb3\xfb\xdf\xcd\xadP\\\x1fK\xc6\xcdp\x8b\xeaif7"{\xd3A1\xa1\x81+1\x12\xb2\x11\x9d\x19\\\xe2\x8c,h+\xae\xee\x86\x0eI\xee\x86\x87\x93\xc5i\x9c\n\x90\x9f\x15=R\xbb2\xb5\xb6!\x94\xa3\xaeni\xdb\xf6\xec$\x1e`\x1c\xa9\x02\xa0\xdf\xd6\xc7<\xd4_L\xb7\xff\xbc\x93\xec\x17\x93\x1di\xac\x19\xd0\x0c\xaa&\xef\t\xef\x81\x12\xeaZ#*\xc1S\xfaR\xb1\xbe\xe6\xef\x13\xba\xee\tV\xf7&f\xc1\xc7\x11o\x8c\x186V\xdd\xeaqGR\x1a\xc1\xec,\xa3\x08\xf4.<A/!E\xd4_\xbe&\x18\x05\x15\xdb\xca!i\x04\xb6zSK\xb9\x88\xac\x13-r9\xad\xc0\xa3\x0et\n\xc4n}.\x9dT\x89C&\xcf-x@\xc1\xbf\xbaf\xf3\xd8\xa89q\x80\x1a\xd53q')
|
1
|
+
import flask_babel,flask_babelex
|
2
|
+
from hiddifypanel.models import BoolConfig,StrConfig,ConfigEnum,hconfig,ConfigCategory
|
3
|
+
from wtforms.validators import Regexp, ValidationError
|
4
|
+
from flask_babelex import lazy_gettext as _
|
5
|
+
# from flask_babelex import gettext as _
|
6
|
+
import wtforms as wtf
|
7
|
+
from flask_wtf import FlaskForm, CSRFProtect
|
8
|
+
from flask_bootstrap import SwitchField
|
9
|
+
|
10
|
+
from flask_admin.base import expose
|
11
|
+
# from gettext import gettext as _
|
12
|
+
|
13
|
+
|
14
|
+
import re
|
15
|
+
from flask import render_template,current_app, Markup,url_for
|
16
|
+
from hiddifypanel.panel.hiddify import flash
|
17
|
+
from hiddifypanel.models import *
|
18
|
+
from hiddifypanel.panel.database import db
|
19
|
+
from wtforms.fields import *
|
20
|
+
from flask_classful import FlaskView
|
21
|
+
from hiddifypanel.panel import hiddify,hiddify_api,custom_widgets
|
22
|
+
|
23
|
+
class CommercialSettings(FlaskView):
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
def index(self):
|
28
|
+
form=get_config_form()
|
29
|
+
return render_template('config.html',form=form)
|
30
|
+
|
31
|
+
|
32
|
+
def post(self):
|
33
|
+
form=get_config_form()
|
34
|
+
if form.validate_on_submit():
|
35
|
+
|
36
|
+
|
37
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
38
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
39
|
+
old_configs=get_hconfigs()
|
40
|
+
for cat,vs in form.data.items():#[c for c in ConfigEnum]:
|
41
|
+
|
42
|
+
if type(vs) is dict:
|
43
|
+
for k,v in vs.items():
|
44
|
+
|
45
|
+
if k in [c for c in ConfigEnum]:
|
46
|
+
#if not k.commercial():continue
|
47
|
+
if k in bool_types:
|
48
|
+
BoolConfig.query.filter(BoolConfig.key==k,BoolConfig.child_id==0).first().value=v
|
49
|
+
else:
|
50
|
+
if "_domain" in k or k in [ConfigEnum.admin_secret]:
|
51
|
+
v=v.lower()
|
52
|
+
if "port" in k:
|
53
|
+
for p in v.split(","):
|
54
|
+
for k2,v2 in vs.items():
|
55
|
+
if "port" in k2 and k!=k2 and p in v2:
|
56
|
+
flash(_("Port is already used! in")+f" {k2} {k}",'error')
|
57
|
+
return render_template('config.html', form=form)
|
58
|
+
if k == ConfigEnum.parent_panel and v!='':
|
59
|
+
# v=(v+"/").replace("/admin",'')
|
60
|
+
v=re.sub("(/admin/.*)","/",v)
|
61
|
+
|
62
|
+
try:
|
63
|
+
if hiddify_api.sync_child_to_parent(v)['status']!=200:
|
64
|
+
flash(_("Can not connect to parent panel!"),'error')
|
65
|
+
return render_template('config.html', form=form)
|
66
|
+
except:
|
67
|
+
flash(_("Can not connect to parent panel!"),'error')
|
68
|
+
return render_template('config.html', form=form)
|
69
|
+
StrConfig.query.filter(StrConfig.key==k,StrConfig.child_id==0).first().value=v
|
70
|
+
|
71
|
+
# print(cat,vs)
|
72
|
+
|
73
|
+
db.session.commit()
|
74
|
+
flask_babel.refresh()
|
75
|
+
flask_babelex.refresh()
|
76
|
+
|
77
|
+
|
78
|
+
from hiddifypanel.panel.commercial.telegrambot import register_bot
|
79
|
+
register_bot()
|
80
|
+
if hconfig(ConfigEnum.parent_panel):
|
81
|
+
hiddify_api.sync_child_to_parent()
|
82
|
+
reset_action=hiddify.check_need_reset(old_configs)
|
83
|
+
if reset_action:
|
84
|
+
return reset_action
|
85
|
+
|
86
|
+
if old_configs[ConfigEnum.admin_lang]!=hconfig(ConfigEnum.admin_lang):
|
87
|
+
form=get_config_form()
|
88
|
+
return render_template('config.html', form=form)
|
89
|
+
flash(_('config.validation-error'), 'danger')
|
90
|
+
return render_template('config.html', form=form)
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
# form=HelloForm()
|
97
|
+
# # return render('config.html',form=form)
|
98
|
+
# return render_template('config.html',form=HelloForm())
|
99
|
+
form=get_config_form()
|
100
|
+
return render_template('config.html',form=form)
|
101
|
+
|
102
|
+
def get_babel_string(self):
|
103
|
+
res=""
|
104
|
+
strconfigs=StrConfig.query.all()
|
105
|
+
boolconfigs=BoolConfig.query.all()
|
106
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
107
|
+
|
108
|
+
configs=[*boolconfigs,*strconfigs]
|
109
|
+
for cat in ConfigCategory:
|
110
|
+
if cat=='hidden':continue
|
111
|
+
|
112
|
+
cat_configs=[c for c in configs if c.key.category()==cat]
|
113
|
+
|
114
|
+
for c in cat_configs:
|
115
|
+
res+=f'{{{{_("config.{c.key}.label")}}}} {{{{_("config.{c.key}.description")}}}}'
|
116
|
+
|
117
|
+
|
118
|
+
res+=f'{{{{_("config.{cat}.label")}}}}{{{{_("config.{cat}.description")}}}}'
|
119
|
+
for c in ConfigEnum:
|
120
|
+
res+=f'{{{{_("config.{c}.label")}}}} {{{{_("config.{c}.description")}}}}'
|
121
|
+
return res
|
122
|
+
|
123
|
+
|
124
|
+
def get_config_form():
|
125
|
+
|
126
|
+
|
127
|
+
strconfigs=StrConfig.query.filter(StrConfig.child_id==0).all()
|
128
|
+
boolconfigs=BoolConfig.query.filter(BoolConfig.child_id==0).all()
|
129
|
+
bool_types={c.key:'bool' for c in boolconfigs}
|
130
|
+
|
131
|
+
configs=[*boolconfigs,*strconfigs]
|
132
|
+
# categories=sorted([ c for c in {c.key.category():1 for c in configs}])
|
133
|
+
# dict_configs={cat:[c for c in configs if c.category==cat] for cat in categories}
|
134
|
+
class DynamicForm(FlaskForm):
|
135
|
+
pass
|
136
|
+
is_parent=hconfig(ConfigEnum.is_parent)
|
137
|
+
for cat in ConfigCategory:
|
138
|
+
if cat=='hidden':continue
|
139
|
+
|
140
|
+
cat_configs=[c for c in configs if c.key.category()==cat and c.key.commercial() and (not is_parent or c.key.show_in_parent()) ]
|
141
|
+
print(cat,cat_configs)
|
142
|
+
if len(cat_configs)==0:continue
|
143
|
+
|
144
|
+
class CategoryForm(FlaskForm):
|
145
|
+
description_for_fieldset=wtf.fields.TextAreaField("",description=_(f'config.{cat}.description'),render_kw={"class":"d-none"})
|
146
|
+
for c in cat_configs:
|
147
|
+
if c.key in bool_types:
|
148
|
+
field= SwitchField(_(f'config.{c.key}.label'), default=c.value,description=_(f'config.{c.key}.description'))
|
149
|
+
elif c.key==ConfigEnum.lang or c.key==ConfigEnum.admin_lang:
|
150
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("en",_("lang.en")),("fa",_("lang.fa")),("zh",_("lang.zh"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
151
|
+
elif c.key==ConfigEnum.country :
|
152
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("ir",_("Iran")),("zh",_("China"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
153
|
+
elif c.key==ConfigEnum.package_mode:
|
154
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("release",_("Release")),("develop",_("Develop"))],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
155
|
+
elif c.key==ConfigEnum.utls:
|
156
|
+
field=wtf.fields.SelectField(_(f"config.{c.key}.label"),choices=[("none","None"),("chrome","Chrome"),("edge","Edge"),("ios","iOS"),("android","Android"),("safari","Safari"),("firefox","Firefox"),('random','random'),('randomized','randomized')],description=_(f"config.{c.key}.description"),default=hconfig(c.key))
|
157
|
+
elif c.key==ConfigEnum.telegram_lib:
|
158
|
+
# if hconfig(ConfigEnum.telegram_lib)=='python':
|
159
|
+
# continue6
|
160
|
+
libs=[("python",_("lib.telegram.python")),("tgo",_("lib.telegram.go")),("orig",_("lib.telegram.orignal")),("erlang",_("lib.telegram.erlang"))]
|
161
|
+
field=wtf.fields.SelectField(_("config.telegram_lib.label"),choices=libs,description=_("config.telegram_lib.description"),default=hconfig(ConfigEnum.telegram_lib))
|
162
|
+
elif c.key==ConfigEnum.branding_freetext:
|
163
|
+
validators=[wtf.validators.Length(max=2048)]
|
164
|
+
render_kw={'class':"ltr",'maxlength':2048}
|
165
|
+
field= custom_widgets.CKTextAreaField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
166
|
+
else:
|
167
|
+
render_kw={'class':"ltr"}
|
168
|
+
validators=[]
|
169
|
+
if c.key==ConfigEnum.domain_fronting_domain:
|
170
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})|$",re.IGNORECASE,_("config.Invalid domain")))
|
171
|
+
validators.append(hiddify.validate_domain_exist)
|
172
|
+
elif '_domain' in c.key:
|
173
|
+
validators.append(wtf.validators.Regexp("^([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})$",re.IGNORECASE,_("config.Invalid domain")))
|
174
|
+
validators.append(hiddify.validate_domain_exist)
|
175
|
+
|
176
|
+
if c.key!=ConfigEnum.decoy_domain:
|
177
|
+
validators.append(wtf.validators.NoneOf([d.domain.lower() for d in Domain.query.all()],_("config.Domain already used")))
|
178
|
+
validators.append(wtf.validators.NoneOf([cc.value.lower() for cc in StrConfig.query.filter(StrConfig.child_id==0).all() if cc.key!=c.key and "fakedomain" in cc.key and cc.key!=ConfigEnum.decoy_domain],_("config.Domain already used")))
|
179
|
+
render_kw['required']=""
|
180
|
+
|
181
|
+
if c.key ==ConfigEnum.parent_panel:
|
182
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/.*)",re.IGNORECASE,_("Invalid admin link")))
|
183
|
+
if c.key == ConfigEnum.telegram_bot_token:
|
184
|
+
validators.append(wtf.validators.Regexp("()|^([0-9]{8,12}:[a-zA-Z0-9_-]{30,40})|$",re.IGNORECASE,_("config.Invalid telegram bot token")))
|
185
|
+
if c.key==ConfigEnum.branding_site :
|
186
|
+
validators.append(wtf.validators.Regexp("()|(http(s|)://([A-Za-z0-9\-\.]+\.[a-zA-Z]{2,})/?.*)",re.IGNORECASE,_("config.Invalid brand link")))
|
187
|
+
# render_kw['required']=""
|
188
|
+
|
189
|
+
if 'secret' in c.key:
|
190
|
+
validators.append(wtf.validators.Regexp("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",re.IGNORECASE,_('config.invalid uuid')))
|
191
|
+
render_kw['required']=""
|
192
|
+
|
193
|
+
if c.key==ConfigEnum.proxy_path:
|
194
|
+
validators.append(wtf.validators.Regexp("^[a-zA-Z0-9]*$",re.IGNORECASE,_("config.Invalid proxy path")))
|
195
|
+
render_kw['required']=""
|
196
|
+
|
197
|
+
if 'port' in c.key:
|
198
|
+
if c.key in [ConfigEnum.http_ports,ConfigEnum.tls_ports]:
|
199
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.Invalid port")))
|
200
|
+
render_kw['required']=""
|
201
|
+
else:
|
202
|
+
validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$|^$",re.IGNORECASE,_("config.Invalid port")))
|
203
|
+
|
204
|
+
|
205
|
+
# validators.append(wtf.validators.Regexp("^(\d+)(,\d+)*$",re.IGNORECASE,_("config.port is required")))
|
206
|
+
|
207
|
+
for val in validators:
|
208
|
+
if hasattr(val,"regex"):
|
209
|
+
render_kw['pattern']=val.regex.pattern
|
210
|
+
render_kw['title']=val.message
|
211
|
+
field= wtf.fields.StringField(_(f'config.{c.key}.label'), validators, default=c.value, description=_(f'config.{c.key}.description'),render_kw=render_kw)
|
212
|
+
setattr(CategoryForm,c.key , field)
|
213
|
+
|
214
|
+
multifield=wtf.fields.FormField(CategoryForm,Markup('<i class="fa-solid fa-plus"></i> '+_(f'config.{cat}.label')))
|
215
|
+
|
216
|
+
setattr(DynamicForm, cat, multifield)
|
217
|
+
|
218
|
+
setattr(DynamicForm,"submit",wtf.fields.SubmitField(_('Submit')))
|
219
|
+
|
220
|
+
|
221
|
+
return DynamicForm()
|
222
|
+
|
223
|
+
|
224
|
+
|
4
225
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
226
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,39 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from flask_admin.contrib import sqla
|
2
|
+
from hiddifypanel.panel.database import db
|
3
|
+
from wtforms.validators import Regexp
|
4
|
+
from hiddifypanel.models import User, Domain, DomainType, StrConfig, ConfigEnum, get_hconfigs,ShowDomain,hconfig
|
5
|
+
from wtforms.validators import Regexp, ValidationError
|
6
|
+
from hiddifypanel.panel.admin.adminlte import AdminLTEModelView
|
7
|
+
from flask_babelex import gettext as __
|
8
|
+
from flask_babelex import lazy_gettext as _
|
9
|
+
from hiddifypanel.panel import hiddify,hiddify_api
|
10
|
+
from flask import Markup
|
11
|
+
from flask import Flask
|
12
|
+
from flask_sqlalchemy import SQLAlchemy
|
13
|
+
from flask_admin import Admin
|
14
|
+
from flask_admin.contrib.sqla import ModelView
|
15
|
+
from wtforms import SelectMultipleField
|
16
|
+
|
17
|
+
|
18
|
+
from wtforms.widgets import ListWidget, CheckboxInput
|
19
|
+
from sqlalchemy.orm import backref
|
20
|
+
# Define a custom field type for the related domains
|
21
|
+
from flask_admin.form.fields import Select2TagsField,Select2Field
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
class ProxyDetailsAdmin(AdminLTEModelView):
|
26
|
+
column_hide_backrefs = True
|
27
|
+
form_excluded_columns=['child']
|
28
|
+
column_exclude_list =['child']
|
29
|
+
# list_template = 'model/domain_list.html'
|
30
|
+
# edit_modal = True
|
31
|
+
# form_overrides = {'work_with': Select2Field}
|
32
|
+
|
33
|
+
def after_model_change(self, form, model, is_created):
|
34
|
+
if hconfig(ConfigEnum.parent_panel):
|
35
|
+
hiddify_api.sync_child_to_parent()
|
36
|
+
def after_model_delete(self, model):
|
37
|
+
if hconfig(ConfigEnum.parent_panel):
|
38
|
+
hiddify_api.sync_child_to_parent()#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
39
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,51 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
4
|
-
|
1
|
+
from .ProxyDetailsAdmin import ProxyDetailsAdmin
|
2
|
+
from .CommercialSettings import CommercialSettings
|
3
|
+
from hiddifypanel.panel import hiddify
|
4
|
+
from hiddifypanel.models import *
|
5
|
+
from hiddifypanel.panel.database import db
|
6
|
+
from hiddifypanel import Events
|
7
|
+
|
8
|
+
commercial=False
|
9
|
+
def init_app(app):
|
10
|
+
from . import restapi
|
11
|
+
restapi.init_app(app)
|
12
|
+
return
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
def config_changed_event(conf,old_value):
|
18
|
+
|
19
|
+
|
20
|
+
if conf.key==ConfigEnum.is_parent:
|
21
|
+
if conf.value and not is_valid():
|
22
|
+
set_hconfig(ConfigEnum.is_parent,False)
|
23
|
+
if not old_value and conf.value:
|
24
|
+
Domain.query.delete()
|
25
|
+
db.session.commit()
|
26
|
+
db.session.add(ParentDomain(domain=hiddify.get_ip(4)+".sslip.io"))
|
27
|
+
db.session.commit()
|
28
|
+
|
29
|
+
Events.config_changed.subscribe(config_changed_event)
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
# def db_init_event(db_version):
|
34
|
+
# if not is_valid():
|
35
|
+
# db.add(BoolConfig(ConfigEnum.db_version,10,child_id=0))
|
36
|
+
# db.add(BoolConfig(ConfigEnum.db_version,11,child_id=0))
|
37
|
+
# return
|
38
|
+
# # if hconfig(ConfigEnum.is_parent) and ParentDomain.query.count()==0:
|
39
|
+
# # external_ip=hiddify.get_ip(4)
|
40
|
+
# # db.session.add(ParentDomain(domain=f"{external_ip}.sslip.io",show_domains=[]))
|
41
|
+
# Events.db_init_event.subscribe(db_init_event)
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def admin_prehook(flaskadmin,admin_bp):
|
46
|
+
# flaskadmin.add_view(ParentDomainAdmin(ParentDomain, db.session))
|
47
|
+
flaskadmin.add_view(ProxyDetailsAdmin(Proxy, db.session))
|
48
|
+
CommercialSettings.register(admin_bp)
|
49
|
+
|
50
|
+
Events.admin_prehook.subscribe(admin_prehook)#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
51
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,16 @@
|
|
1
|
-
|
2
|
-
from
|
3
|
-
|
1
|
+
from flask import Blueprint
|
2
|
+
from flask_restful import Api
|
3
|
+
from .tgbot import bot,register_bot,TGBotResource
|
4
|
+
|
5
|
+
|
6
|
+
bp = Blueprint("api", __name__, url_prefix="/<proxy_path>/<user_secret>/api/v1")
|
7
|
+
api = Api(bp)
|
8
|
+
|
9
|
+
|
10
|
+
def init_app(app):
|
11
|
+
api.add_resource(TGBotResource, "/tgbot/")
|
12
|
+
with app.app_context():
|
13
|
+
register_bot()
|
14
|
+
app.register_blueprint(bp)
|
4
15
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
16
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,59 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
import time
|
2
|
+
import telebot
|
3
|
+
from flask import abort, request
|
4
|
+
from flask_restful import Resource
|
5
|
+
|
6
|
+
from hiddifypanel.models import *
|
7
|
+
|
8
|
+
logger = telebot.logger
|
9
|
+
|
10
|
+
|
11
|
+
class ExceptionHandler(telebot.ExceptionHandler):
|
12
|
+
def handle(self, exception):
|
13
|
+
logger.error(exception)
|
14
|
+
|
15
|
+
|
16
|
+
bot = telebot.TeleBot("", parse_mode="HTML", threaded=False, exception_handler=ExceptionHandler())
|
17
|
+
bot.username=''
|
18
|
+
|
19
|
+
def register_bot():
|
20
|
+
try:
|
21
|
+
global bot
|
22
|
+
token = hconfig(ConfigEnum.telegram_bot_token)
|
23
|
+
if token:
|
24
|
+
bot.token = hconfig(ConfigEnum.telegram_bot_token)
|
25
|
+
try:
|
26
|
+
bot.username=bot.get_me().username
|
27
|
+
except:
|
28
|
+
pass
|
29
|
+
bot.remove_webhook()
|
30
|
+
time.sleep(0.1)
|
31
|
+
domain = (ParentDomain if hconfig(ConfigEnum.is_parent) else Domain).query.first().domain
|
32
|
+
proxy_path = hconfig(ConfigEnum.proxy_path)
|
33
|
+
user_secret = hconfig(ConfigEnum.admin_secret)
|
34
|
+
bot.set_webhook(url=f"https://{domain}/{proxy_path}/{user_secret}/api/v1/tgbot/")
|
35
|
+
except Exception as e:
|
36
|
+
print(e)
|
37
|
+
import traceback
|
38
|
+
traceback.print_stack()
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
class TGBotResource(Resource):
|
44
|
+
def post(self):
|
45
|
+
try:
|
46
|
+
if request.headers.get('content-type') == 'application/json':
|
47
|
+
json_string = request.get_data().decode('utf-8')
|
48
|
+
update = telebot.types.Update.de_json(json_string)
|
49
|
+
bot.process_new_updates([update])
|
50
|
+
return ''
|
51
|
+
else:
|
52
|
+
abort(403)
|
53
|
+
except Exception as e:
|
54
|
+
print("Error", e)
|
55
|
+
import traceback
|
56
|
+
traceback.print_exc()
|
57
|
+
return "", 500
|
4
58
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
59
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
from . import bot
|
2
|
+
|
3
|
+
|
4
|
+
@bot.message_handler(func=lambda message: True)
|
5
|
+
def not_handled(message):
|
6
|
+
bot.reply_to(message, "We can not understand your request")
|
7
|
+
|
8
|
+
|
9
|
+
@bot.callback_query_handler(func=lambda call: True)
|
10
|
+
def update_usage_callback(call): # <- passes a CallbackQuery type object to your function
|
11
|
+
bot.answer_callback_query(call.id, "Incorrect callback", cache_time=1)
|
4
12
|
#واقعا برای 5 دلار میخوای کرک میکنی؟ حاجی ارزش وقت خودت بیشتره
|
5
13
|
#Email hiddify@gmail.com for free permium version. Do not crack this cheap product
|