hiddifypanel 10.20.3__py3-none-any.whl → 10.30.0__py3-none-any.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 (84) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/base.py +22 -12
  4. hiddifypanel/cache.py +2 -51
  5. hiddifypanel/drivers/wireguard_api.py +24 -5
  6. hiddifypanel/hutils/convert.py +1 -1
  7. hiddifypanel/hutils/flask.py +28 -2
  8. hiddifypanel/hutils/importer/xui.py +6 -7
  9. hiddifypanel/hutils/network/__init__.py +1 -0
  10. hiddifypanel/hutils/network/cf_api.py +84 -0
  11. hiddifypanel/hutils/network/net.py +26 -49
  12. hiddifypanel/hutils/node/child.py +25 -7
  13. hiddifypanel/hutils/node/parent.py +7 -7
  14. hiddifypanel/hutils/node/shared.py +19 -6
  15. hiddifypanel/hutils/proxy/clash.py +1 -1
  16. hiddifypanel/hutils/proxy/shared.py +1 -1
  17. hiddifypanel/hutils/proxy/singbox.py +2 -3
  18. hiddifypanel/hutils/proxy/xray.py +12 -10
  19. hiddifypanel/hutils/proxy/xrayjson.py +26 -49
  20. hiddifypanel/hutils/utils.py +47 -3
  21. hiddifypanel/models/__init__.py +1 -1
  22. hiddifypanel/models/admin.py +9 -2
  23. hiddifypanel/models/base_account.py +3 -1
  24. hiddifypanel/models/config.py +10 -19
  25. hiddifypanel/models/config_enum.py +18 -6
  26. hiddifypanel/models/domain.py +82 -118
  27. hiddifypanel/models/user.py +44 -24
  28. hiddifypanel/panel/admin/Actions.py +6 -11
  29. hiddifypanel/panel/admin/AdminstratorAdmin.py +3 -9
  30. hiddifypanel/panel/admin/Backup.py +5 -8
  31. hiddifypanel/panel/admin/Dashboard.py +3 -4
  32. hiddifypanel/panel/admin/DomainAdmin.py +20 -15
  33. hiddifypanel/panel/admin/ProxyAdmin.py +3 -10
  34. hiddifypanel/panel/admin/QuickSetup.py +1 -1
  35. hiddifypanel/panel/admin/SettingAdmin.py +7 -5
  36. hiddifypanel/panel/admin/Terminal.py +0 -1
  37. hiddifypanel/panel/admin/UserAdmin.py +4 -3
  38. hiddifypanel/panel/admin/templates/model/proxydetail_list.html +6 -0
  39. hiddifypanel/panel/cli.py +36 -23
  40. hiddifypanel/panel/commercial/ProxyDetailsAdmin.py +15 -5
  41. hiddifypanel/panel/commercial/restapi/v1/tgbot.py +7 -4
  42. hiddifypanel/panel/commercial/restapi/v2/admin/__init__.py +17 -13
  43. hiddifypanel/panel/commercial/restapi/v2/admin/admin_info_api.py +4 -3
  44. hiddifypanel/panel/commercial/restapi/v2/admin/admin_user_api.py +28 -10
  45. hiddifypanel/panel/commercial/restapi/v2/admin/admin_users_api.py +2 -19
  46. hiddifypanel/panel/commercial/restapi/v2/admin/schema.py +27 -4
  47. hiddifypanel/panel/commercial/restapi/v2/admin/user_api.py +28 -9
  48. hiddifypanel/panel/commercial/restapi/v2/admin/users_api.py +1 -21
  49. hiddifypanel/panel/commercial/restapi/v2/parent/register_api.py +1 -1
  50. hiddifypanel/panel/commercial/restapi/v2/parent/schema.py +8 -4
  51. hiddifypanel/panel/commercial/restapi/v2/parent/sync_api.py +19 -3
  52. hiddifypanel/panel/commercial/restapi/v2/user/configs_api.py +48 -42
  53. hiddifypanel/panel/commercial/telegrambot/Usage.py +1 -1
  54. hiddifypanel/panel/commercial/telegrambot/admin.py +1 -1
  55. hiddifypanel/panel/commercial/telegrambot/information.py +1 -1
  56. hiddifypanel/panel/common.py +5 -11
  57. hiddifypanel/panel/hiddify.py +9 -20
  58. hiddifypanel/panel/init_db.py +41 -24
  59. hiddifypanel/panel/usage.py +38 -9
  60. hiddifypanel/panel/user/user.py +52 -32
  61. hiddifypanel/templates/admin-layout.html +2 -2
  62. hiddifypanel/templates/fake.html +316 -0
  63. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  64. hiddifypanel/translations/en/LC_MESSAGES/messages.po +107 -45
  65. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  66. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +102 -36
  67. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  68. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +64 -7
  69. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  70. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +161 -78
  71. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  72. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +63 -6
  73. hiddifypanel/translations.i18n/en.json +83 -42
  74. hiddifypanel/translations.i18n/fa.json +73 -32
  75. hiddifypanel/translations.i18n/pt.json +45 -4
  76. hiddifypanel/translations.i18n/ru.json +113 -72
  77. hiddifypanel/translations.i18n/zh.json +44 -3
  78. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/METADATA +2 -1
  79. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/RECORD +83 -82
  80. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/WHEEL +1 -1
  81. hiddifypanel/panel/cf_api.py +0 -37
  82. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/LICENSE.md +0 -0
  83. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/entry_points.txt +0 -0
  84. {hiddifypanel-10.20.3.dist-info → hiddifypanel-10.30.0.dist-info}/top_level.txt +0 -0
@@ -18,45 +18,43 @@ from hiddifypanel import hutils
18
18
 
19
19
  class UserView(FlaskView):
20
20
 
21
- @route('/useragent/')
22
- @login_required(roles={Role.user})
23
- def test(self):
24
- ua = request.user_agent.string
25
- print(ua)
26
- return ua
27
-
28
21
  def index(self):
29
22
  return self.auto_sub()
30
23
 
31
24
  def auto_sub(self):
32
25
  if g.user_agent['is_browser']:
33
26
  return self.new()
34
- return self.get_proper_config() or self.all_configs(base64=True)
27
+ return self.get_proper_config() or self.links_imp(base64=True)
35
28
 
36
29
  # former /sub/ or /sub (it was auto actually but we named it as /sub/)
37
30
  @route('/auto/')
38
31
  @route('/auto')
39
32
  @login_required(roles={Role.user})
40
33
  def force_sub(self):
41
- return self.get_proper_config() or self.all_configs(base64=False)
34
+ return self.get_proper_config() or self.links_imp(base64=False)
42
35
 
43
36
  # region new endpoints
44
37
  @route("/sub/")
45
38
  @route("/sub")
46
39
  @login_required(roles={Role.user})
47
40
  def sub(self):
48
- return self.all_configs(base64=False)
41
+ '''Returns proxy links (not base64 encoded)'''
42
+ return self.links_imp(base64=False)
49
43
 
50
44
  @route("/sub64/")
51
45
  @route("/sub64")
52
46
  @login_required(roles={Role.user})
53
47
  def sub64(self):
54
- return self.all_configs(base64=True)
48
+ '''Returns proxy links (base64 encoded)'''
49
+ return self.links_imp(base64=True)
55
50
 
56
51
  @route("/xray/")
57
52
  @route("/xray")
58
53
  @login_required(roles={Role.user})
59
54
  def xray(self):
55
+ '''Returns Xray JSON proxy config'''
56
+ # if not hconfig(ConfigEnum.sub_full_xray_json_enable):
57
+ # return 'The Full Xray subscription is disabled'
60
58
  c = get_common_data(g.account.uuid, mode="new")
61
59
  configs = hutils.proxy.xrayjson.configs_as_json(c['domains'], c['user'], c['expire_days'], c['profile_title'])
62
60
  return add_headers(configs, c, 'application/json')
@@ -65,25 +63,29 @@ class UserView(FlaskView):
65
63
  @route("/singbox")
66
64
  @login_required(roles={Role.user})
67
65
  def singbox_full(self):
68
- return self.full_singbox()
66
+ '''Returns singbox client JSON config'''
67
+ return self.full_singbox_imp()
69
68
 
70
69
  @route("/singbox-ssh/")
71
70
  @route("/singbox-ssh")
72
71
  @login_required(roles={Role.user})
73
72
  def singbox_ssh(self):
74
- return self.singbox()
73
+ '''Returns singbox client JSON config (ssh)'''
74
+ return self.singbox_ssh_imp()
75
75
 
76
76
  @route("/clash/")
77
77
  @route("/clash")
78
78
  @login_required(roles={Role.user})
79
79
  def clash(self):
80
- return self.clash_config(meta_or_normal="normal")
80
+ '''Returns clash client config'''
81
+ return self.clash_config_imp(meta_or_normal="normal")
81
82
 
82
83
  @route("/clashmeta/")
83
84
  @route("/clashmeta")
84
85
  @login_required(roles={Role.user})
85
86
  def clashmeta(self):
86
- return self.clash_config(meta_or_normal="meta")
87
+ '''Returns clash meta client config'''
88
+ return self.clash_config_imp(meta_or_normal="meta")
87
89
  # endregion
88
90
 
89
91
  @ route('/new/')
@@ -100,26 +102,28 @@ class UserView(FlaskView):
100
102
  return render_template('new.html', **c, ua=user_agent)
101
103
 
102
104
  def get_proper_config(self):
105
+ '''Returns proper config based on user agent'''
103
106
  if g.user_agent['is_browser']:
104
107
  return None
108
+
105
109
  ua = request.user_agent.string
106
110
  if g.user_agent['is_singbox'] or re.match('^(HiddifyNext|Dart|SFI|SFA)', ua, re.IGNORECASE):
107
- return self.full_singbox()
111
+ return self.full_singbox_imp()
108
112
 
109
113
  if re.match('^(Clash-verge|Clash-?Meta|Stash|NekoBox|NekoRay|Pharos|hiddify-desktop)', ua, re.IGNORECASE):
110
- return self.clash_config(meta_or_normal="meta")
114
+ return self.clash_config_imp(meta_or_normal="meta")
111
115
  if re.match('^(Clash|Stash)', ua, re.IGNORECASE):
112
- return self.clash_config(meta_or_normal="normal")
116
+ return self.clash_config_imp(meta_or_normal="normal")
113
117
 
114
- if g.user_agent.get('is_v2rayng'):
115
- return self.xray()
118
+ if hconfig(ConfigEnum.sub_full_xray_json_enable):
119
+ # return the old "Subscription link b64" sub if the "Full Xray" sub is disabled (wanted by user)
120
+ if g.user_agent.get('is_v2rayng') and hutils.flask.is_client_version(hutils.flask.ClientVersion.v2ryang, 1, 8, 17):
121
+ return self.xray()
122
+ elif g.user_agent.get('is_streisand'):
123
+ return self.xray()
116
124
 
117
- # if 'HiddifyNext' in ua or 'Dart' in ua:
118
- # return self.clash_config(meta_or_normal="meta")
119
-
120
- # if any([p in ua for p in ['FoXray', 'HiddifyNG','Fair%20VPN' ,'v2rayNG', 'SagerNet']]):
121
- if re.match('^(Hiddify|FoXray|Fair|v2rayNG|SagerNet|Shadowrocket|V2Box|Loon|Liberty)', ua, re.IGNORECASE):
122
- return self.all_configs(base64=True)
125
+ if re.match('^(Hiddify|FoXray|Fair|v2rayNG|SagerNet|Shadowrocket|V2Box|Loon|Liberty|Streisand)', ua, re.IGNORECASE):
126
+ return self.links_imp(base64=True)
123
127
 
124
128
  @route('/clash/<meta_or_normal>/proxies.yml')
125
129
  @route('/clash/proxies.yml')
@@ -176,8 +180,12 @@ class UserView(FlaskView):
176
180
  @ route('/clash/<typ>.yml', methods=["GET", "HEAD"])
177
181
  @ route('/clash/<meta_or_normal>/<typ>.yml', methods=["GET", "HEAD"])
178
182
  @login_required(roles={Role.user})
179
- def clash_config(self, meta_or_normal="normal", typ="all.yml"):
183
+ def clash_config_imp(self, meta_or_normal="normal", typ="all.yml"):
180
184
  mode = request.args.get("mode")
185
+ if meta_or_normal == 'meta' and not hconfig(ConfigEnum.sub_full_clash_meta_enable):
186
+ return 'The Clash meta subscription is disabled'
187
+ elif meta_or_normal == 'normal' and not hconfig(ConfigEnum.sub_full_clash_enable):
188
+ return 'The Clash subscription is disabled'
181
189
 
182
190
  c = get_common_data(g.account.uuid, mode)
183
191
 
@@ -192,7 +200,10 @@ class UserView(FlaskView):
192
200
 
193
201
  @ route('/full-singbox.json', methods=["GET", "HEAD"])
194
202
  @login_required(roles={Role.user})
195
- def full_singbox(self):
203
+ def full_singbox_imp(self):
204
+ # if not hconfig(ConfigEnum.sub_full_singbox_enable):
205
+ # return 'The Full Singbox subscription is disabled'
206
+
196
207
  mode = "new" # request.args.get("mode")
197
208
  c = get_common_data(g.account.uuid, mode)
198
209
  # response.content_type = 'text/plain';
@@ -205,9 +216,12 @@ class UserView(FlaskView):
205
216
 
206
217
  @ route('/singbox.json', methods=["GET", "HEAD"])
207
218
  @login_required(roles={Role.user})
208
- def singbox(self):
219
+ def singbox_ssh_imp(self):
209
220
  if not hconfig(ConfigEnum.ssh_server_enable):
210
- return "SSH server is disable in settings"
221
+ return "The SSH server is disabled"
222
+ # elif not hconfig(ConfigEnum.sub_singbox_ssh_enable):
223
+ # return "The Singbox: SSH subscription is disabled"
224
+
211
225
  mode = "new" # request.args.get("mode")
212
226
  c = get_common_data(g.account.uuid, mode)
213
227
  # response.content_type = 'text/plain';
@@ -221,9 +235,15 @@ class UserView(FlaskView):
221
235
 
222
236
  @route('/all.txt', methods=["GET", "HEAD"])
223
237
  @login_required(roles={Role.user})
224
- def all_configs(self, base64=False):
238
+ def links_imp(self, base64=False):
239
+ '''Returns subscription links (base64 or not)'''
225
240
  mode = "new" # request.args.get("mode")
226
241
  base64 = base64 or request.args.get("base64", "").lower() == "true"
242
+ # if base64 and not hconfig(ConfigEnum.sub_full_links_b64_enable):
243
+ # return 'The Subscription link b64 is disabled'
244
+ # if not base64 and not hconfig(ConfigEnum.sub_full_links_enable):
245
+ # return 'The Subscription link is disabled'
246
+
227
247
  c = get_common_data(g.account.uuid, mode)
228
248
  # response.content_type = 'text/plain';
229
249
  if request.method == 'HEAD':
@@ -346,7 +366,7 @@ def get_common_data(user_uuid, mode, no_domain=False, filter_domain=None):
346
366
  'expire_rel': hutils.convert.format_timedelta(datetime.timedelta(days=expire_days)),
347
367
  'reset_day': reset_days,
348
368
  'hconfigs': get_hconfigs(),
349
- 'hdomains': get_hdomains(),
369
+ 'hdomains': Domain.modes_and_domains(),
350
370
  'ConfigEnum': ConfigEnum,
351
371
  'link_maker': hutils.proxy,
352
372
  'domains': domains,
@@ -85,13 +85,13 @@
85
85
  {{ render_nav_item('admin.Dashboard:index', icon('solid','house','nav-icon')+(_("Parent Panel") if hutils.node.is_parent() else _('admin.menu.home')),_use_li=True)}}
86
86
 
87
87
  {% if hutils.node.is_child() %}
88
- {{ render_nav_item(hconfig(ConfigEnum.parent_panel)+"/"+g.account.uuid+"/admin/user/",icon('solid','user-secret','nav-icon')+_('admin.menu.user'),_badge=_('in parent panel') ,_use_li=True) }}
88
+ {{ render_nav_item(hconfig(ConfigEnum.parent_panel)+"admin/user/",icon('solid','user-secret','nav-icon')+_('admin.menu.user'),_badge=_('in parent panel') ,_use_li=True) }}
89
89
  {% else %}
90
90
  {{ render_nav_item('flask.user.index_view', icon('solid','user','nav-icon')+_('admin.menu.user'),_use_li=True)}}
91
91
  {% endif %}
92
92
 
93
93
  {% if hutils.node.is_child() %}
94
- {{ render_nav_item(hconfig(ConfigEnum.parent_panel)+"/"+g.account.uuid+"/admin/adminuser/",icon('solid','user-secret','nav-icon')+_('Admins'),_badge=_('in parent panel') ,_use_li=True) }}
94
+ {{ render_nav_item(hconfig(ConfigEnum.parent_panel)+"admin/adminuser/",icon('solid','user-secret','nav-icon')+_('Admins'),_badge=_('in parent panel') ,_use_li=True) }}
95
95
  {% else %}
96
96
  {{ render_nav_item('flask.adminuser.index_view', icon('solid','user-secret','nav-icon')+_('Admins'),_use_li=True) }}
97
97
  {% endif %}
@@ -0,0 +1,316 @@
1
+ {{_("config.dbvalues.label")}}
2
+ {{_("config.dbvalues.description")}}
3
+ {{_("config.create_easysetup_link.label")}}
4
+ {{_("config.create_easysetup_link.description")}}
5
+ {{_("config.wireguard_enable.label")}}
6
+ {{_("config.wireguard_enable.description")}}
7
+ {{_("config.wireguard_port.label")}}
8
+ {{_("config.wireguard_port.description")}}
9
+ {{_("config.wireguard_ipv6.label")}}
10
+ {{_("config.wireguard_ipv6.description")}}
11
+ {{_("config.wireguard_ipv4.label")}}
12
+ {{_("config.wireguard_ipv4.description")}}
13
+ {{_("config.wireguard_private_key.label")}}
14
+ {{_("config.wireguard_private_key.description")}}
15
+ {{_("config.wireguard_public_key.label")}}
16
+ {{_("config.wireguard_public_key.description")}}
17
+ {{_("config.wireguard_noise_trick.label")}}
18
+ {{_("config.wireguard_noise_trick.description")}}
19
+ {{_("config.ssh_server_redis_url.label")}}
20
+ {{_("config.ssh_server_redis_url.description")}}
21
+ {{_("config.ssh_server_port.label")}}
22
+ {{_("config.ssh_server_port.description")}}
23
+ {{_("config.ssh_server_enable.label")}}
24
+ {{_("config.ssh_server_enable.description")}}
25
+ {{_("config.first_setup.label")}}
26
+ {{_("config.first_setup.description")}}
27
+ {{_("config.core_type.label")}}
28
+ {{_("config.core_type.description")}}
29
+ {{_("config.warp_enable.label")}}
30
+ {{_("config.warp_enable.description")}}
31
+ {{_("config.warp_mode.label")}}
32
+ {{_("config.warp_mode.description")}}
33
+ {{_("config.warp_plus_code.label")}}
34
+ {{_("config.warp_plus_code.description")}}
35
+ {{_("config.warp_sites.label")}}
36
+ {{_("config.warp_sites.description")}}
37
+ {{_("config.dns_server.label")}}
38
+ {{_("config.dns_server.description")}}
39
+ {{_("config.reality_fallback_domain.label")}}
40
+ {{_("config.reality_fallback_domain.description")}}
41
+ {{_("config.reality_server_names.label")}}
42
+ {{_("config.reality_server_names.description")}}
43
+ {{_("config.reality_short_ids.label")}}
44
+ {{_("config.reality_short_ids.description")}}
45
+ {{_("config.reality_private_key.label")}}
46
+ {{_("config.reality_private_key.description")}}
47
+ {{_("config.reality_public_key.label")}}
48
+ {{_("config.reality_public_key.description")}}
49
+ {{_("config.reality_port.label")}}
50
+ {{_("config.reality_port.description")}}
51
+ {{_("config.restls1_2_domain.label")}}
52
+ {{_("config.restls1_2_domain.description")}}
53
+ {{_("config.restls1_3_domain.label")}}
54
+ {{_("config.restls1_3_domain.description")}}
55
+ {{_("config.show_usage_in_sublink.label")}}
56
+ {{_("config.show_usage_in_sublink.description")}}
57
+ {{_("config.cloudflare.label")}}
58
+ {{_("config.cloudflare.description")}}
59
+ {{_("config.license.label")}}
60
+ {{_("config.license.description")}}
61
+ {{_("config.country.label")}}
62
+ {{_("config.country.description")}}
63
+ {{_("config.package_mode.label")}}
64
+ {{_("config.package_mode.description")}}
65
+ {{_("config.utls.label")}}
66
+ {{_("config.utls.description")}}
67
+ {{_("config.telegram_bot_token.label")}}
68
+ {{_("config.telegram_bot_token.description")}}
69
+ {{_("config.is_parent.label")}}
70
+ {{_("config.is_parent.description")}}
71
+ {{_("config.parent_panel.label")}}
72
+ {{_("config.parent_panel.description")}}
73
+ {{_("config.parent_domain.label")}}
74
+ {{_("config.parent_domain.description")}}
75
+ {{_("config.parent_admin_proxy_path.label")}}
76
+ {{_("config.parent_admin_proxy_path.description")}}
77
+ {{_("config.panel_mode.label")}}
78
+ {{_("config.panel_mode.description")}}
79
+ {{_("config.log_level.label")}}
80
+ {{_("config.log_level.description")}}
81
+ {{_("config.unique_id.label")}}
82
+ {{_("config.unique_id.description")}}
83
+ {{_("config.last_hash.label")}}
84
+ {{_("config.last_hash.description")}}
85
+ {{_("config.cdn_forced_host.label")}}
86
+ {{_("config.cdn_forced_host.description")}}
87
+ {{_("config.lang.label")}}
88
+ {{_("config.lang.description")}}
89
+ {{_("config.admin_lang.label")}}
90
+ {{_("config.admin_lang.description")}}
91
+ {{_("config.admin_secret.label")}}
92
+ {{_("config.admin_secret.description")}}
93
+ {{_("config.tls_ports.label")}}
94
+ {{_("config.tls_ports.description")}}
95
+ {{_("config.tls_fragment_enable.label")}}
96
+ {{_("config.tls_fragment_enable.description")}}
97
+ {{_("config.tls_fragment_size.label")}}
98
+ {{_("config.tls_fragment_size.description")}}
99
+ {{_("config.tls_fragment_sleep.label")}}
100
+ {{_("config.tls_fragment_sleep.description")}}
101
+ {{_("config.tls_mixed_case.label")}}
102
+ {{_("config.tls_mixed_case.description")}}
103
+ {{_("config.tls_padding_enable.label")}}
104
+ {{_("config.tls_padding_enable.description")}}
105
+ {{_("config.tls_padding_length.label")}}
106
+ {{_("config.tls_padding_length.description")}}
107
+ {{_("config.mux_enable.label")}}
108
+ {{_("config.mux_enable.description")}}
109
+ {{_("config.mux_protocol.label")}}
110
+ {{_("config.mux_protocol.description")}}
111
+ {{_("config.mux_max_connections.label")}}
112
+ {{_("config.mux_max_connections.description")}}
113
+ {{_("config.mux_min_streams.label")}}
114
+ {{_("config.mux_min_streams.description")}}
115
+ {{_("config.mux_max_streams.label")}}
116
+ {{_("config.mux_max_streams.description")}}
117
+ {{_("config.mux_padding_enable.label")}}
118
+ {{_("config.mux_padding_enable.description")}}
119
+ {{_("config.mux_brutal_enable.label")}}
120
+ {{_("config.mux_brutal_enable.description")}}
121
+ {{_("config.mux_brutal_up_mbps.label")}}
122
+ {{_("config.mux_brutal_up_mbps.description")}}
123
+ {{_("config.mux_brutal_down_mbps.label")}}
124
+ {{_("config.mux_brutal_down_mbps.description")}}
125
+ {{_("config.http_ports.label")}}
126
+ {{_("config.http_ports.description")}}
127
+ {{_("config.kcp_ports.label")}}
128
+ {{_("config.kcp_ports.description")}}
129
+ {{_("config.kcp_enable.label")}}
130
+ {{_("config.kcp_enable.description")}}
131
+ {{_("config.decoy_domain.label")}}
132
+ {{_("config.decoy_domain.description")}}
133
+ {{_("config.proxy_path.label")}}
134
+ {{_("config.proxy_path.description")}}
135
+ {{_("config.proxy_path_admin.label")}}
136
+ {{_("config.proxy_path_admin.description")}}
137
+ {{_("config.proxy_path_client.label")}}
138
+ {{_("config.proxy_path_client.description")}}
139
+ {{_("config.firewall.label")}}
140
+ {{_("config.firewall.description")}}
141
+ {{_("config.netdata.label")}}
142
+ {{_("config.netdata.description")}}
143
+ {{_("config.http_proxy_enable.label")}}
144
+ {{_("config.http_proxy_enable.description")}}
145
+ {{_("config.block_iran_sites.label")}}
146
+ {{_("config.block_iran_sites.description")}}
147
+ {{_("config.allow_invalid_sni.label")}}
148
+ {{_("config.allow_invalid_sni.description")}}
149
+ {{_("config.auto_update.label")}}
150
+ {{_("config.auto_update.description")}}
151
+ {{_("config.speed_test.label")}}
152
+ {{_("config.speed_test.description")}}
153
+ {{_("config.only_ipv4.label")}}
154
+ {{_("config.only_ipv4.description")}}
155
+ {{_("config.shared_secret.label")}}
156
+ {{_("config.shared_secret.description")}}
157
+ {{_("config.telegram_enable.label")}}
158
+ {{_("config.telegram_enable.description")}}
159
+ {{_("config.telegram_adtag.label")}}
160
+ {{_("config.telegram_adtag.description")}}
161
+ {{_("config.telegram_lib.label")}}
162
+ {{_("config.telegram_lib.description")}}
163
+ {{_("config.telegram_fakedomain.label")}}
164
+ {{_("config.telegram_fakedomain.description")}}
165
+ {{_("config.v2ray_enable.label")}}
166
+ {{_("config.v2ray_enable.description")}}
167
+ {{_("config.torrent_block.label")}}
168
+ {{_("config.torrent_block.description")}}
169
+ {{_("config.tuic_enable.label")}}
170
+ {{_("config.tuic_enable.description")}}
171
+ {{_("config.tuic_port.label")}}
172
+ {{_("config.tuic_port.description")}}
173
+ {{_("config.hysteria_enable.label")}}
174
+ {{_("config.hysteria_enable.description")}}
175
+ {{_("config.hysteria_port.label")}}
176
+ {{_("config.hysteria_port.description")}}
177
+ {{_("config.hysteria_obfs_enable.label")}}
178
+ {{_("config.hysteria_obfs_enable.description")}}
179
+ {{_("config.hysteria_up_mbps.label")}}
180
+ {{_("config.hysteria_up_mbps.description")}}
181
+ {{_("config.hysteria_down_mbps.label")}}
182
+ {{_("config.hysteria_down_mbps.description")}}
183
+ {{_("config.shadowsocks2022_enable.label")}}
184
+ {{_("config.shadowsocks2022_enable.description")}}
185
+ {{_("config.shadowsocks2022_method.label")}}
186
+ {{_("config.shadowsocks2022_method.description")}}
187
+ {{_("config.shadowsocks2022_port.label")}}
188
+ {{_("config.shadowsocks2022_port.description")}}
189
+ {{_("config.ssfaketls_enable.label")}}
190
+ {{_("config.ssfaketls_enable.description")}}
191
+ {{_("config.ssfaketls_fakedomain.label")}}
192
+ {{_("config.ssfaketls_fakedomain.description")}}
193
+ {{_("config.shadowtls_enable.label")}}
194
+ {{_("config.shadowtls_enable.description")}}
195
+ {{_("config.shadowtls_fakedomain.label")}}
196
+ {{_("config.shadowtls_fakedomain.description")}}
197
+ {{_("config.ssr_enable.label")}}
198
+ {{_("config.ssr_enable.description")}}
199
+ {{_("config.ssr_fakedomain.label")}}
200
+ {{_("config.ssr_fakedomain.description")}}
201
+ {{_("config.vmess_enable.label")}}
202
+ {{_("config.vmess_enable.description")}}
203
+ {{_("config.domain_fronting_domain.label")}}
204
+ {{_("config.domain_fronting_domain.description")}}
205
+ {{_("config.domain_fronting_http_enable.label")}}
206
+ {{_("config.domain_fronting_http_enable.description")}}
207
+ {{_("config.domain_fronting_tls_enable.label")}}
208
+ {{_("config.domain_fronting_tls_enable.description")}}
209
+ {{_("config.ws_enable.label")}}
210
+ {{_("config.ws_enable.description")}}
211
+ {{_("config.grpc_enable.label")}}
212
+ {{_("config.grpc_enable.description")}}
213
+ {{_("config.httpupgrade_enable.label")}}
214
+ {{_("config.httpupgrade_enable.description")}}
215
+ {{_("config.vless_enable.label")}}
216
+ {{_("config.vless_enable.description")}}
217
+ {{_("config.trojan_enable.label")}}
218
+ {{_("config.trojan_enable.description")}}
219
+ {{_("config.reality_enable.label")}}
220
+ {{_("config.reality_enable.description")}}
221
+ {{_("config.tcp_enable.label")}}
222
+ {{_("config.tcp_enable.description")}}
223
+ {{_("config.quic_enable.label")}}
224
+ {{_("config.quic_enable.description")}}
225
+ {{_("config.xtls_enable.label")}}
226
+ {{_("config.xtls_enable.description")}}
227
+ {{_("config.h2_enable.label")}}
228
+ {{_("config.h2_enable.description")}}
229
+ {{_("config.db_version.label")}}
230
+ {{_("config.db_version.description")}}
231
+ {{_("config.last_priodic_usage_check.label")}}
232
+ {{_("config.last_priodic_usage_check.description")}}
233
+ {{_("config.branding_title.label")}}
234
+ {{_("config.branding_title.description")}}
235
+ {{_("config.branding_site.label")}}
236
+ {{_("config.branding_site.description")}}
237
+ {{_("config.branding_freetext.label")}}
238
+ {{_("config.branding_freetext.description")}}
239
+ {{_("config.not_found.label")}}
240
+ {{_("config.not_found.description")}}
241
+ {{_("config.path_vmess.label")}}
242
+ {{_("config.path_vmess.description")}}
243
+ {{_("config.path_vless.label")}}
244
+ {{_("config.path_vless.description")}}
245
+ {{_("config.path_trojan.label")}}
246
+ {{_("config.path_trojan.description")}}
247
+ {{_("config.path_v2ray.label")}}
248
+ {{_("config.path_v2ray.description")}}
249
+ {{_("config.path_ss.label")}}
250
+ {{_("config.path_ss.description")}}
251
+ {{_("config.path_httpupgrade.label")}}
252
+ {{_("config.path_httpupgrade.description")}}
253
+ {{_("config.path_ws.label")}}
254
+ {{_("config.path_ws.description")}}
255
+ {{_("config.path_tcp.label")}}
256
+ {{_("config.path_tcp.description")}}
257
+ {{_("config.path_grpc.label")}}
258
+ {{_("config.path_grpc.description")}}
259
+ {{_("config.sub_full_singbox_enable.label")}}
260
+ {{_("config.sub_full_singbox_enable.description")}}
261
+ {{_("config.sub_singbox_ssh_enable.label")}}
262
+ {{_("config.sub_singbox_ssh_enable.description")}}
263
+ {{_("config.sub_full_xray_json_enable.label")}}
264
+ {{_("config.sub_full_xray_json_enable.description")}}
265
+ {{_("config.sub_full_links_enable.label")}}
266
+ {{_("config.sub_full_links_enable.description")}}
267
+ {{_("config.sub_full_links_b64_enable.label")}}
268
+ {{_("config.sub_full_links_b64_enable.description")}}
269
+ {{_("config.sub_full_clash_enable.label")}}
270
+ {{_("config.sub_full_clash_enable.description")}}
271
+ {{_("config.sub_full_clash_meta_enable.label")}}
272
+ {{_("config.sub_full_clash_meta_enable.description")}}
273
+ {{_("config.hiddifycli_enable.label")}}
274
+ {{_("config.hiddifycli_enable.description")}}
275
+
276
+ {{_("config.admin.label")}}{{_("config.admin.description")}}
277
+ {{_("config.branding.label")}}{{_("config.branding.description")}}
278
+ {{_("config.general.label")}}{{_("config.general.description")}}
279
+ {{_("config.proxies.label")}}{{_("config.proxies.description")}}
280
+ {{_("config.domain_fronting.label")}}{{_("config.domain_fronting.description")}}
281
+ {{_("config.telegram.label")}}{{_("config.telegram.description")}}
282
+ {{_("config.http.label")}}{{_("config.http.description")}}
283
+ {{_("config.tls.label")}}{{_("config.tls.description")}}
284
+ {{_("config.mux.label")}}{{_("config.mux.description")}}
285
+ {{_("config.tls_trick.label")}}{{_("config.tls_trick.description")}}
286
+ {{_("config.ssh.label")}}{{_("config.ssh.description")}}
287
+ {{_("config.ssfaketls.label")}}{{_("config.ssfaketls.description")}}
288
+ {{_("config.shadowtls.label")}}{{_("config.shadowtls.description")}}
289
+ {{_("config.restls.label")}}{{_("config.restls.description")}}
290
+ {{_("config.tuic.label")}}{{_("config.tuic.description")}}
291
+ {{_("config.hysteria.label")}}{{_("config.hysteria.description")}}
292
+ {{_("config.ssr.label")}}{{_("config.ssr.description")}}
293
+ {{_("config.kcp.label")}}{{_("config.kcp.description")}}
294
+ {{_("config.hidden.label")}}{{_("config.hidden.description")}}
295
+ {{_("config.advanced.label")}}{{_("config.advanced.description")}}
296
+ {{_("config.too_advanced.label")}}{{_("config.too_advanced.description")}}
297
+ {{_("config.warp.label")}}{{_("config.warp.description")}}
298
+ {{_("config.reality.label")}}{{_("config.reality.description")}}
299
+ {{_("config.wireguard.label")}}{{_("config.wireguard.description")}}
300
+ {{_("config.shadowsocks.label")}}{{_("config.shadowsocks.description")}}
301
+
302
+ {{_("direct")}}
303
+ {{_("sub_link_only")}}
304
+ {{_("cdn")}}
305
+ {{_("auto_cdn_ip")}}
306
+ {{_("relay")}}
307
+ {{_("reality")}}
308
+ {{_("old_xtls_direct")}}
309
+ {{_("worker")}}
310
+ {{_("fake")}}
311
+
312
+ {{_("no_reset")}}
313
+ {{_("monthly")}}
314
+ {{_("weekly")}}
315
+ {{_("daily")}}
316
+